Merge the Gitea-aligned develop into release/0.1; conflicts resolved to develop's side, keeping release/0.1's RC revision so CI publishes the next RC.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Ordinary chat turns no longer create core tracking jobs, so they stay out
of the Jobs tray and tables and no longer trigger a per-answer "finished"
notification. Crash safety comes from the assistant's own turn table
(leased, heartbeated assistant_turn rows, seq-numbered event replay and the
abandoned-turn sweep), which is unchanged.
Removes AssistantRunTracker, JobTrackingRunTracker, the config accessors and
the tracking id on RunningTurn, with their tests. The panel's Stop
(POST /turns/{id}/cancel) is unchanged and still covered.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A confirmed bulk load still launches a real durable job through
POST /qqq/v1/processes/{p}/jobs. Its tool result now carries jobHref (the
job's /app link) next to jobId and a record ref to the job, and the confirm
response's href points at the job, so the conversation links to it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The notification a task owner asked for (output mode Notification or Both)
now goes through core QAlerts.notify: category Job, the owner as the only
audience, severity by run status and a link to the conversation. It replaces
a reflective call into an older alerts SPI that no longer matched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GET /assistant/config returned the profile's starter prompts as static
text, so a user could be offered examples about tables they cannot see.
profile.starterPrompts (same field and shape) is now built per user:
up to three prompts generated from the tables the user can read through
the assistant that have rows (list_tables, count_records and
describe_table via the UI API with the user's own session), cached five
minutes, stable for the day, bounded and fail-soft. Configured prompts
stay only when tagged with tables the user can read.
Part of KofTwentyTwo/Website-Backend#303
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the attachments package: uploads are read as the signed-in user's own
upload (core UploadRefs plus an owner check) into memory with byte caps;
the type is sniffed from content; executables, archives and unknown binary
data are refused; text and JSON are decoded with charset detection; PDF
page text comes from PDFBox (already on the classpath through core) with
page, character and memory caps and no font scan; CSV and XLSX previews
reuse core's bulk-load parsers; image sizes are read from headers.
Content is framed as an untrusted uploaded_file block with neutralized
delimiters. Limits live in AssistantQBitConfig.attachments.
Part of KofTwentyTwo/Website-Backend#305
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
assistant_conversation is open to every assistant user (assistant.hasAccess
or assistant.admin) through AssistantAccessPermissionChecker; rows stay
locked to their owner, and the Assistant app and other tables stay
admin-only. A conversation customizer limits user edits to title, pinned
and status, refuses deleting a conversation with an answer in progress and
deletes the child rows after a table delete, through the same store code
as DELETE /conversations/{id}.
Adds Archive, Restore and Delete conversations as standard streamed-ETL
record actions on the table, acting only on rows the user can see.
UI API extension assistant 1.6.0: conversation list items have running,
PATCH /conversations/{id} accepts {"read": true}, and GET /config has
conversationsTable when the session may query that table.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The turn engine reads pageContext.attachments through AttachmentService and
inlines the framed content (and images for vision models) into the
question's user message, after both cached system blocks. Unreadable files
become notices; image parts are dropped before a call to a model without
vision. In HIPAA mode attachments count as PHI. The system prompt treats
uploaded_file blocks as data and tells the model to propose writes with
create_record/update_record instead of saying it cannot create records.
GET /config reports features.attachments and the attachment limits.
Adds end-to-end, PHI routing and red-team tests.
Part of KofTwentyTwo/Website-Backend#305
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Decode images within frame and pixel limits before provider use, contain malformed attachments per file, and preserve the host PDFBox font mapper.
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>
Preserve both attachment and notification behavior. Full eight-module verify and 45 focused turn, notification, bulk-load and attachment tests passed.
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>
Preserve field visibility filtering while interpreting the actual API response shape. Verified allowed fields and hidden/password exclusions through the real endpoint.
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>
Cap combined prompts at three and remove cached authorization-sensitive suggestions. Preserve bounded deterministic generation and cover field, row, table, policy and history changes. Thirty focused tests passed.
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>
Preserve current attachment, notification and starter prompt behavior. Encrypt user titles that resemble ciphertext unless they match the same stored record; verify all eight reactor modules.
Co-Authored-By: Codex <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>
Replace copied workflow logic with the strict orb-owned QBit profile.
Preserve publication opt-outs and full Maven verification.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Signed-off-by: James Maes <james@kof22.com>
The probe reports DISABLED, NOT_CONFIGURED, NO_PERMISSION, KILL_SWITCH in that order; GET /config gains an additive message naming what to configure; a user without access on an unconfigured server gets 503 NOT_CONFIGURED instead of 403. Extension 1.7.0.
Fixes#82
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The panel reloads the conversation the moment the stream ends. The
redacted transcript (message parts, pending actions, stored events) was
flushed only after message.end was sent, so that reload read the "[]"
placeholders and showed the newest question and answer as empty bubbles
until the panel was closed and reopened. Persist and flush first, then
emit message.end.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Replace the platform-ci release callers with one caller of
KofTwentyTwo/ci-workflows maven.yaml (qqq-orb port).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Merge the Gitea-aligned develop into release/0.1; conflicts resolved to develop's side, keeping release/0.1's RC revision so CI publishes the next RC.
🤖 Generated with Claude Code
Ordinary chat turns no longer create core tracking jobs, so they stay out of the Jobs tray and tables and no longer trigger a per-answer "finished" notification. Crash safety comes from the assistant's own turn table (leased, heartbeated assistant_turn rows, seq-numbered event replay and the abandoned-turn sweep), which is unchanged. Removes AssistantRunTracker, JobTrackingRunTracker, the config accessors and the tracking id on RunningTurn, with their tests. The panel's Stop (POST /turns/{id}/cancel) is unchanged and still covered. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>A confirmed bulk load still launches a real durable job through POST /qqq/v1/processes/{p}/jobs. Its tool result now carries jobHref (the job's /app link) next to jobId and a record ref to the job, and the confirm response's href points at the job, so the conversation links to it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>assistant_conversation is open to every assistant user (assistant.hasAccess or assistant.admin) through AssistantAccessPermissionChecker; rows stay locked to their owner, and the Assistant app and other tables stay admin-only. A conversation customizer limits user edits to title, pinned and status, refuses deleting a conversation with an answer in progress and deletes the child rows after a table delete, through the same store code as DELETE /conversations/{id}. Adds Archive, Restore and Delete conversations as standard streamed-ETL record actions on the table, acting only on rows the user can see. UI API extension assistant 1.6.0: conversation list items have running, PATCH /conversations/{id} accepts {"read": true}, and GET /config has conversationsTable when the session may query that table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>