Pairs with QRun-IO/qbit-assistant#14 (tools via the /qqq/v1 UI API, with writes that are only proposed) and #15 (profiles and skills).
Confirmation card
A new pending_action render: AssistantPendingActionCard shows the summary and the proposed values, with Confirm (labelled Create / Save / Delete) and Cancel.
Confirm calls POST /assistant/actions/{id}/confirm, and the server runs the write through the UI API with this session. Cancel calls .../reject, and nothing runs.
On mount the card loads GET /assistant/actions/{id}, so a reloaded conversation shows the outcome.
It is code-split, uses theme tokens (works in light and dark), wraps at narrow widths and meets the coarse-pointer minimum.
Persona
/assistant/config → profile: the header and empty state use the display name and greeting, and the starter prompts are buttons that send.
The empty state says the assistant sees and does only what the user can, through the same API as the screens.
Tests
AssistantPendingActionCard.test.tsx: confirm runs once, cancel never confirms, the result link is shown, axe passes.
AssistantPanel.test.tsx: the persona name, the greeting, and a starter prompt that sends.
pnpm typecheck and pnpm lint (0 errors) are green, and the assistant suites pass.
Pairs with QRun-IO/qbit-assistant#14 (tools via the `/qqq/v1` UI API, with writes that are only proposed) and #15 (profiles and skills).
**Confirmation card**
- A new `pending_action` render: `AssistantPendingActionCard` shows the summary and the proposed values, with **Confirm** (labelled Create / Save / Delete) and **Cancel**.
- Confirm calls `POST /assistant/actions/{id}/confirm`, and the server runs the write through the UI API with this session. Cancel calls `.../reject`, and nothing runs.
- On mount the card loads `GET /assistant/actions/{id}`, so a reloaded conversation shows the outcome.
- It is code-split, uses theme tokens (works in light and dark), wraps at narrow widths and meets the coarse-pointer minimum.
**Persona**
- `/assistant/config` → `profile`: the header and empty state use the display name and greeting, and the starter prompts are buttons that send.
- The empty state says the assistant sees and does only what the user can, through the same API as the screens.
**Tests**
- `AssistantPendingActionCard.test.tsx`: confirm runs once, cancel never confirms, the result link is shown, axe passes.
- `AssistantPanel.test.tsx`: the persona name, the greeting, and a starter prompt that sends.
- `pnpm typecheck` and `pnpm lint` (0 errors) are green, and the assistant suites pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.
Pairs with QRun-IO/qbit-assistant#14 (tools via the
/qqq/v1UI API, with writes that are only proposed) and #15 (profiles and skills).Confirmation card
pending_actionrender:AssistantPendingActionCardshows the summary and the proposed values, with Confirm (labelled Create / Save / Delete) and Cancel.POST /assistant/actions/{id}/confirm, and the server runs the write through the UI API with this session. Cancel calls.../reject, and nothing runs.GET /assistant/actions/{id}, so a reloaded conversation shows the outcome.Persona
/assistant/config→profile: the header and empty state use the display name and greeting, and the starter prompts are buttons that send.Tests
AssistantPendingActionCard.test.tsx: confirm runs once, cancel never confirms, the result link is shown, axe passes.AssistantPanel.test.tsx: the persona name, the greeting, and a starter prompt that sends.pnpm typecheckandpnpm lint(0 errors) are green, and the assistant suites pass.🤖 Generated with Claude Code