## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Tasks and Agent Chat show saved requests above the message composer. > - A person can send a separate message while a confirmation is open. > - The old code closed only question forms, after the message save finished. > - A confirmation could stay open or open again after a refresh. > - This change closes the form when sending starts and keeps the request in the feed. > - People can open the request later and make the original decision. ## Linked Issues or Issue Description **What happened?** A confirmation stayed open when a person sent a separate message. **Expected behavior** The form closes immediately. The request stays in the feed. A person can open it later. Sending a message does not record an approval. **Steps to reproduce** 1. Open a task with a pending confirmation. 2. Send a separate message below the form. 3. Observe the form while the message save is pending. 4. Reload the task and open the request from the feed. **Paperclip version or commit** Reproduced ata434edf991. **Deployment mode** Source checkout and isolated Storybook fixtures. ## What Changed - Close the composer request before the message save finishes. - Keep earlier saved requests in history after a newer human message. - Save browser dismissal IDs in one batch after a successful send. - Restore the previous form after a failed send, including a reopened request after an optimistic comment changes automatic selection. - Track deliberate selection changes separately from automatic filtering. Keep a newer request open when an earlier send fails. - Allow a new request to open while an earlier message is being saved. - Add tests for confirmation and checkbox forms in task and Agent Chat modes. - Add Send Instead Of Confirming and Reopen Skipped Confirmation stories. - Update the existing answer-later story to check the current answer receipt. - Update the behavior and Storybook documentation. ## Verification - TDD: Six new cases failed before the main fix. Four more cases reproduced the review finding before the recovery fix. They cover failed sends with an optimistic comment and its rollback in both task and Agent Chat modes. - Component checks: 518 passed, one existing test skipped. Run `pnpm --filter @paperclipai/ui exec vitest run src/components/TaskChatThread.test.tsx src/components/task-chat/TaskChatComposer.test.tsx`. - UI typecheck passed after preparing the local plugin SDK dependency. - Token gates passed. - Catalog structure checks passed. The three catalog test files passed all 30 tests. - Six Playwright cases passed in an owned Storybook server. They cover the initial form, sending, manual reopening, light theme, mobile, and answering later. Play assertions passed. Accessibility reports had zero violations. - The stories use the production thread with simulated saves and decisions. Existing optional fixture endpoints return 404. These do not prevent the selected journeys. - No visual baseline comparison was possible. The baseline manifest has no published snapshots. - `pnpm verify --explain` requested broader CI coverage. [Required CI](https://github.com/paperclipai/paperclip/actions/runs/42253585800) passed onfda44f2648. - Greptile and Paperclip Review both report 5/5 with no findings on the final head. - The remote commit tree matches the tested local tree:7e22201513. ## Risks - Older pending requests now stay in history after a newer human message. People must select the feed entry to open them. - Dismissal changes presentation. Server approval checks and request decisions keep their existing behavior. - Browser fixtures do not prove live provider continuation or staging behavior. ## Model Used OpenAI GPT-6 Codex. The exact backend model identifier and context window were not exposed to this run. Used reasoning, repository inspection, edits, shell tools, component tests, and browser tools. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <[email protected]>
@paperclipai/ui
Published static assets for the Paperclip board UI.
What gets published
The npm package contains the production build under dist/. It does not ship the UI source tree or workspace-only dependencies.
Storybook
Storybook config, stories, and fixtures live under ui/storybook/.
pnpm --filter @paperclipai/ui storybook
pnpm --filter @paperclipai/ui build-storybook
Typical use
Install the package, then serve or copy the built files from node_modules/@paperclipai/ui/dist.
Editor dependency identity
Keep the root and workspace overrides for @codemirror/state,
@codemirror/view, and @lezer/common aligned. CodeMirror requires shared
extension identity, while Lezer parsers and syntax highlighters require shared
NodeProp IDs. Multiple Lezer copies can crash code-block highlighting with
tags is not iterable. src/lib/codemirror-single-instance.test.ts checks the
installed dependency graph and highlights sample code through the editor's real
language dependencies. GitHub Actions owns regeneration of pnpm-lock.yaml.