@pentoshi/clai 3.6.0 → 3.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/dist/agent/compaction-summary.d.ts +17 -0
  2. package/dist/agent/compaction-summary.js +64 -0
  3. package/dist/agent/compaction-summary.js.map +1 -0
  4. package/dist/agent/confirm-port.d.ts +3 -1
  5. package/dist/agent/confirm-port.js +5 -1
  6. package/dist/agent/confirm-port.js.map +1 -1
  7. package/dist/agent/context-manager.js +45 -22
  8. package/dist/agent/context-manager.js.map +1 -1
  9. package/dist/agent/events.d.ts +6 -0
  10. package/dist/agent/evidence-governor.d.ts +37 -0
  11. package/dist/agent/evidence-governor.js +70 -0
  12. package/dist/agent/evidence-governor.js.map +1 -0
  13. package/dist/agent/loop-guard.d.ts +29 -11
  14. package/dist/agent/loop-guard.js +93 -39
  15. package/dist/agent/loop-guard.js.map +1 -1
  16. package/dist/agent/must-continue.d.ts +56 -0
  17. package/dist/agent/must-continue.js +240 -0
  18. package/dist/agent/must-continue.js.map +1 -0
  19. package/dist/agent/outcomes.d.ts +101 -0
  20. package/dist/agent/outcomes.js +359 -0
  21. package/dist/agent/outcomes.js.map +1 -0
  22. package/dist/agent/plan-decision.d.ts +33 -0
  23. package/dist/agent/plan-decision.js +104 -0
  24. package/dist/agent/plan-decision.js.map +1 -0
  25. package/dist/agent/plan-tool.d.ts +12 -0
  26. package/dist/agent/plan-tool.js +309 -104
  27. package/dist/agent/plan-tool.js.map +1 -1
  28. package/dist/agent/project-root.js +3 -0
  29. package/dist/agent/project-root.js.map +1 -1
  30. package/dist/agent/prompt-composer.d.ts +21 -0
  31. package/dist/agent/prompt-composer.js +46 -0
  32. package/dist/agent/prompt-composer.js.map +1 -0
  33. package/dist/agent/runner.d.ts +11 -1
  34. package/dist/agent/runner.js +1115 -965
  35. package/dist/agent/runner.js.map +1 -1
  36. package/dist/agent/scope-context.d.ts +3 -0
  37. package/dist/agent/scope-context.js +24 -0
  38. package/dist/agent/scope-context.js.map +1 -0
  39. package/dist/agent/scratch-write.d.ts +4 -0
  40. package/dist/agent/scratch-write.js +54 -0
  41. package/dist/agent/scratch-write.js.map +1 -0
  42. package/dist/agent/session-policy.d.ts +7 -0
  43. package/dist/agent/session-policy.js +61 -0
  44. package/dist/agent/session-policy.js.map +1 -1
  45. package/dist/agent/session-state.d.ts +41 -0
  46. package/dist/agent/session-state.js +107 -0
  47. package/dist/agent/session-state.js.map +1 -0
  48. package/dist/agent/step-budget.d.ts +14 -0
  49. package/dist/agent/step-budget.js +26 -0
  50. package/dist/agent/step-budget.js.map +1 -0
  51. package/dist/agent/task-analyzer.d.ts +12 -3
  52. package/dist/agent/task-analyzer.js +263 -23
  53. package/dist/agent/task-analyzer.js.map +1 -1
  54. package/dist/agent/task-evidence.d.ts +99 -29
  55. package/dist/agent/task-evidence.js +480 -91
  56. package/dist/agent/task-evidence.js.map +1 -1
  57. package/dist/agent/task-plan.d.ts +57 -0
  58. package/dist/agent/task-plan.js +147 -1
  59. package/dist/agent/task-plan.js.map +1 -1
  60. package/dist/agent/tool-call-parser.d.ts +4 -12
  61. package/dist/agent/tool-call-parser.js +34 -67
  62. package/dist/agent/tool-call-parser.js.map +1 -1
  63. package/dist/agent/tool-history.d.ts +7 -0
  64. package/dist/agent/tool-history.js +50 -0
  65. package/dist/agent/tool-history.js.map +1 -1
  66. package/dist/agent/tool-output-formatting.d.ts +13 -1
  67. package/dist/agent/tool-output-formatting.js +75 -22
  68. package/dist/agent/tool-output-formatting.js.map +1 -1
  69. package/dist/agent/turn-outcome.d.ts +11 -0
  70. package/dist/agent/turn-outcome.js +17 -0
  71. package/dist/agent/turn-outcome.js.map +1 -0
  72. package/dist/agent/turn-state.d.ts +11 -0
  73. package/dist/agent/turn-state.js +28 -0
  74. package/dist/agent/turn-state.js.map +1 -0
  75. package/dist/agent/workspace-orient.d.ts +11 -0
  76. package/dist/agent/workspace-orient.js +103 -12
  77. package/dist/agent/workspace-orient.js.map +1 -1
  78. package/dist/app/adapters/agent-event-adapter.d.ts +2 -13
  79. package/dist/app/adapters/agent-event-adapter.js +63 -25
  80. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  81. package/dist/app/adapters/current-agent-adapter.d.ts +0 -5
  82. package/dist/app/adapters/current-agent-adapter.js +4 -7
  83. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  84. package/dist/app/adapters/current-jobs-adapter.js +1 -0
  85. package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
  86. package/dist/app/adapters/current-terminal-adapter.d.ts +0 -7
  87. package/dist/app/adapters/current-terminal-adapter.js +0 -7
  88. package/dist/app/adapters/current-terminal-adapter.js.map +1 -1
  89. package/dist/app/adapters/current-updates-adapter.d.ts +0 -5
  90. package/dist/app/adapters/current-updates-adapter.js +0 -5
  91. package/dist/app/adapters/current-updates-adapter.js.map +1 -1
  92. package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +0 -5
  93. package/dist/app/adapters/in-memory-clipboard-adapter.js +0 -5
  94. package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -1
  95. package/dist/app/commands/command.d.ts +0 -5
  96. package/dist/app/commands/command.js.map +1 -1
  97. package/dist/app/commands/registry.d.ts +0 -14
  98. package/dist/app/commands/registry.js +0 -20
  99. package/dist/app/commands/registry.js.map +1 -1
  100. package/dist/app/controllers/disposable.d.ts +0 -5
  101. package/dist/app/controllers/disposable.js +0 -5
  102. package/dist/app/controllers/disposable.js.map +1 -1
  103. package/dist/app/controllers/job-controller.d.ts +1 -5
  104. package/dist/app/controllers/job-controller.js +0 -4
  105. package/dist/app/controllers/job-controller.js.map +1 -1
  106. package/dist/app/controllers/plan-controller.d.ts +5 -8
  107. package/dist/app/controllers/plan-controller.js +30 -12
  108. package/dist/app/controllers/plan-controller.js.map +1 -1
  109. package/dist/app/controllers/session-controller.d.ts +17 -32
  110. package/dist/app/controllers/session-controller.js +56 -35
  111. package/dist/app/controllers/session-controller.js.map +1 -1
  112. package/dist/app/controllers/turn-controller.d.ts +2 -6
  113. package/dist/app/controllers/turn-controller.js +8 -8
  114. package/dist/app/controllers/turn-controller.js.map +1 -1
  115. package/dist/app/events/app-event.d.ts +4 -7
  116. package/dist/app/events/app-event.js +0 -6
  117. package/dist/app/events/app-event.js.map +1 -1
  118. package/dist/app/events/event-buffer.d.ts +6 -17
  119. package/dist/app/events/event-buffer.js +27 -24
  120. package/dist/app/events/event-buffer.js.map +1 -1
  121. package/dist/app/events/sequencer.d.ts +0 -9
  122. package/dist/app/events/sequencer.js +0 -4
  123. package/dist/app/events/sequencer.js.map +1 -1
  124. package/dist/app/ports/agent-port.d.ts +13 -3
  125. package/dist/app/ports/clipboard-port.d.ts +0 -5
  126. package/dist/app/ports/confirm-port.d.ts +0 -7
  127. package/dist/app/ports/jobs-port.d.ts +2 -5
  128. package/dist/app/ports/persistence-port.d.ts +0 -4
  129. package/dist/app/ports/secret-port.d.ts +0 -5
  130. package/dist/app/ports/terminal-port.d.ts +0 -6
  131. package/dist/app/ports/updates-port.d.ts +0 -4
  132. package/dist/attachments/service.d.ts +29 -0
  133. package/dist/attachments/service.js +47 -0
  134. package/dist/attachments/service.js.map +1 -0
  135. package/dist/commands/providers.js +0 -3
  136. package/dist/commands/providers.js.map +1 -1
  137. package/dist/commands/search-providers.d.ts +0 -33
  138. package/dist/commands/search-providers.js +0 -33
  139. package/dist/commands/search-providers.js.map +1 -1
  140. package/dist/commands/update.js +1 -9
  141. package/dist/commands/update.js.map +1 -1
  142. package/dist/index.js +22 -42
  143. package/dist/index.js.map +1 -1
  144. package/dist/llm/adapters/ollama-tools.d.ts +0 -4
  145. package/dist/llm/adapters/ollama-tools.js +0 -4
  146. package/dist/llm/adapters/ollama-tools.js.map +1 -1
  147. package/dist/llm/capabilities.d.ts +10 -10
  148. package/dist/llm/capabilities.js +43 -17
  149. package/dist/llm/capabilities.js.map +1 -1
  150. package/dist/llm/groq.js +0 -6
  151. package/dist/llm/groq.js.map +1 -1
  152. package/dist/llm/http.d.ts +0 -17
  153. package/dist/llm/http.js +0 -45
  154. package/dist/llm/http.js.map +1 -1
  155. package/dist/llm/router.d.ts +0 -6
  156. package/dist/llm/router.js +0 -15
  157. package/dist/llm/router.js.map +1 -1
  158. package/dist/llm/tool-protocol.d.ts +0 -6
  159. package/dist/llm/tool-protocol.js +3 -7
  160. package/dist/llm/tool-protocol.js.map +1 -1
  161. package/dist/modes/agent.d.ts +2 -1
  162. package/dist/modes/agent.js +4 -2
  163. package/dist/modes/agent.js.map +1 -1
  164. package/dist/modes/ask.d.ts +0 -18
  165. package/dist/modes/ask.js +0 -49
  166. package/dist/modes/ask.js.map +1 -1
  167. package/dist/os/cwd.d.ts +0 -21
  168. package/dist/os/cwd.js +0 -24
  169. package/dist/os/cwd.js.map +1 -1
  170. package/dist/os/pkgmgr.js +0 -6
  171. package/dist/os/pkgmgr.js.map +1 -1
  172. package/dist/prompts/index.d.ts +6 -18
  173. package/dist/prompts/index.js +67 -293
  174. package/dist/prompts/index.js.map +1 -1
  175. package/dist/prompts/system.agent.md +242 -0
  176. package/dist/prompts/system.ask.md +56 -0
  177. package/dist/repl/prompt-line.js +0 -36
  178. package/dist/repl/prompt-line.js.map +1 -1
  179. package/dist/repl/slash-commands.d.ts +0 -9
  180. package/dist/repl/slash-commands.js +2 -23
  181. package/dist/repl/slash-commands.js.map +1 -1
  182. package/dist/repl.d.ts +5 -0
  183. package/dist/repl.js +169 -55
  184. package/dist/repl.js.map +1 -1
  185. package/dist/safety/classifier.js +17 -9
  186. package/dist/safety/classifier.js.map +1 -1
  187. package/dist/safety/engagement-policy.d.ts +46 -0
  188. package/dist/safety/engagement-policy.js +198 -0
  189. package/dist/safety/engagement-policy.js.map +1 -0
  190. package/dist/store/engagement.d.ts +115 -0
  191. package/dist/store/engagement.js +278 -0
  192. package/dist/store/engagement.js.map +1 -0
  193. package/dist/store/logs.d.ts +5 -0
  194. package/dist/store/logs.js +52 -2
  195. package/dist/store/logs.js.map +1 -1
  196. package/dist/store/plan.d.ts +57 -5
  197. package/dist/store/plan.js +182 -8
  198. package/dist/store/plan.js.map +1 -1
  199. package/dist/store/scope.d.ts +4 -1
  200. package/dist/store/scope.js +2 -2
  201. package/dist/store/scope.js.map +1 -1
  202. package/dist/tools/definitions.js +70 -1
  203. package/dist/tools/definitions.js.map +1 -1
  204. package/dist/tools/elevated-shell.d.ts +60 -0
  205. package/dist/tools/elevated-shell.js +233 -0
  206. package/dist/tools/elevated-shell.js.map +1 -0
  207. package/dist/tools/file-diff.d.ts +125 -0
  208. package/dist/tools/file-diff.js +495 -0
  209. package/dist/tools/file-diff.js.map +1 -0
  210. package/dist/tools/fs.d.ts +11 -13
  211. package/dist/tools/fs.js +269 -78
  212. package/dist/tools/fs.js.map +1 -1
  213. package/dist/tools/http.d.ts +15 -0
  214. package/dist/tools/http.js +202 -61
  215. package/dist/tools/http.js.map +1 -1
  216. package/dist/tools/jobs.d.ts +71 -10
  217. package/dist/tools/jobs.js +403 -124
  218. package/dist/tools/jobs.js.map +1 -1
  219. package/dist/tools/nmap-runner.d.ts +11 -0
  220. package/dist/tools/nmap-runner.js +115 -74
  221. package/dist/tools/nmap-runner.js.map +1 -1
  222. package/dist/tools/pentest-workflows.d.ts +8 -0
  223. package/dist/tools/pentest-workflows.js +71 -0
  224. package/dist/tools/pentest-workflows.js.map +1 -0
  225. package/dist/tools/registry.d.ts +9 -0
  226. package/dist/tools/registry.js +227 -56
  227. package/dist/tools/registry.js.map +1 -1
  228. package/dist/tools/shell.d.ts +3 -0
  229. package/dist/tools/shell.js +35 -13
  230. package/dist/tools/shell.js.map +1 -1
  231. package/dist/tools/tool-types.d.ts +11 -0
  232. package/dist/tui-v2/app/App.js +25 -39
  233. package/dist/tui-v2/app/App.js.map +1 -1
  234. package/dist/tui-v2/app/command-handlers.js +20 -1
  235. package/dist/tui-v2/app/command-handlers.js.map +1 -1
  236. package/dist/tui-v2/app/commands/picker-commands.js +3 -0
  237. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
  238. package/dist/tui-v2/app/commands/session-commands.js +5 -0
  239. package/dist/tui-v2/app/commands/session-commands.js.map +1 -1
  240. package/dist/tui-v2/app/plan-lifecycle.d.ts +25 -3
  241. package/dist/tui-v2/app/plan-lifecycle.js +87 -24
  242. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -1
  243. package/dist/tui-v2/bootstrap/patch-opentui-text.d.ts +6 -0
  244. package/dist/tui-v2/bootstrap/patch-opentui-text.js +53 -0
  245. package/dist/tui-v2/bootstrap/patch-opentui-text.js.map +1 -0
  246. package/dist/tui-v2/bootstrap/start-tui-v2.js +7 -0
  247. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  248. package/dist/tui-v2/components/jobs/jobs-panel.js +23 -14
  249. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
  250. package/dist/tui-v2/components/modal/confirm-modal.d.ts +1 -1
  251. package/dist/tui-v2/components/modal/confirm-modal.js +18 -7
  252. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
  253. package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
  254. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  255. package/dist/tui-v2/components/pager/pager.d.ts +6 -0
  256. package/dist/tui-v2/components/pager/pager.js +313 -67
  257. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  258. package/dist/tui-v2/components/status/status-line.d.ts +9 -0
  259. package/dist/tui-v2/components/status/status-line.js +17 -3
  260. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  261. package/dist/tui-v2/components/transcript/assistant-message.js +1 -1
  262. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
  263. package/dist/tui-v2/components/transcript/compacted-row.js +1 -1
  264. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  265. package/dist/tui-v2/components/transcript/tool-card.d.ts +9 -1
  266. package/dist/tui-v2/components/transcript/tool-card.js +114 -9
  267. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  268. package/dist/tui-v2/components/transcript/transcript-row.js +2 -2
  269. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  270. package/dist/tui-v2/composer/composer-editor.js +16 -0
  271. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  272. package/dist/tui-v2/controllers/overlay-controller.d.ts +16 -2
  273. package/dist/tui-v2/controllers/overlay-controller.js +92 -12
  274. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -1
  275. package/dist/tui-v2/rendering/artifact-pager-source.d.ts +19 -0
  276. package/dist/tui-v2/rendering/artifact-pager-source.js +103 -0
  277. package/dist/tui-v2/rendering/artifact-pager-source.js.map +1 -0
  278. package/dist/tui-v2/rendering/file-diff-view.d.ts +63 -0
  279. package/dist/tui-v2/rendering/file-diff-view.js +263 -0
  280. package/dist/tui-v2/rendering/file-diff-view.js.map +1 -0
  281. package/dist/tui-v2/rendering/open-tool-output.d.ts +9 -1
  282. package/dist/tui-v2/rendering/open-tool-output.js +65 -12
  283. package/dist/tui-v2/rendering/open-tool-output.js.map +1 -1
  284. package/dist/tui-v2/rendering/pager-chrome.d.ts +12 -0
  285. package/dist/tui-v2/rendering/pager-chrome.js +56 -0
  286. package/dist/tui-v2/rendering/pager-chrome.js.map +1 -0
  287. package/dist/tui-v2/rendering/plan-view.js +1 -1
  288. package/dist/tui-v2/rendering/plan-view.js.map +1 -1
  289. package/dist/tui-v2/rendering/syntax-highlight.d.ts +37 -0
  290. package/dist/tui-v2/rendering/syntax-highlight.js +1303 -0
  291. package/dist/tui-v2/rendering/syntax-highlight.js.map +1 -0
  292. package/dist/tui-v2/rendering/theme.d.ts +28 -0
  293. package/dist/tui-v2/rendering/theme.js +28 -0
  294. package/dist/tui-v2/rendering/theme.js.map +1 -1
  295. package/dist/tui-v2/rendering/tool-presenter.d.ts +5 -0
  296. package/dist/tui-v2/rendering/tool-presenter.js +35 -3
  297. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -1
  298. package/dist/tui-v2/state/transcript-hydrate.js +5 -0
  299. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
  300. package/dist/tui-v2/state/transcript-reducer.js +12 -2
  301. package/dist/tui-v2/state/transcript-reducer.js.map +1 -1
  302. package/dist/tui-v2/state/transcript-store.d.ts +7 -0
  303. package/dist/tui-v2/state/transcript-store.js +46 -0
  304. package/dist/tui-v2/state/transcript-store.js.map +1 -1
  305. package/dist/tui-v2/state/transcript-types.d.ts +12 -0
  306. package/dist/tui-v2/state/transcript-types.js +9 -0
  307. package/dist/tui-v2/state/transcript-types.js.map +1 -1
  308. package/dist/types.d.ts +17 -1
  309. package/dist/ui/mentions.d.ts +6 -0
  310. package/dist/ui/mentions.js +50 -12
  311. package/dist/ui/mentions.js.map +1 -1
  312. package/dist/ui/plan-pane.js +1 -1
  313. package/dist/ui/plan-pane.js.map +1 -1
  314. package/package.json +16 -11
@@ -1,9 +1,10 @@
1
1
  /**
2
- * Plan approval/implement/discard orchestration (PLAN-004, F-021/023, V2-070/073).
2
+ * Plan approval/implement/discard/suggest orchestration (PLAN-004, F-021/023, V2-070/073).
3
3
  *
4
4
  * Mirrors the classic TUI's `/implement` path: approve the persisted plan, flip
5
- * the session policy flag the agent gate reads, then run the implement prompt.
6
- * Kept out of `PlanController` (persistence only) and out of components.
5
+ * the session policy flag the agent gate reads, switch to agent mode, then run
6
+ * the implement prompt. Kept out of `PlanController` (persistence only) and out
7
+ * of components.
7
8
  */
8
9
  import type { SessionPlan } from "../../store/plan.js";
9
10
  import type { AppServices } from "../bootstrap/composition-root.js";
@@ -13,10 +14,31 @@ export declare const IMPLEMENT_PROMPT_CODING: string;
13
14
  export declare const IMPLEMENT_PROMPT_PENTEST: string;
14
15
  export declare const IMPLEMENT_PROMPT: string;
15
16
  export declare function buildImplementPrompt(plan: SessionPlan): string;
17
+ /** True when plan-ready UI asked the user to type revision feedback next. */
18
+ export declare function isAwaitingPlanSuggestion(): boolean;
19
+ export declare function clearAwaitingPlanSuggestion(): void;
20
+ export interface PlanSuggestionSubmit {
21
+ /** Full model-facing revision directive (backend only). */
22
+ readonly modelPrompt: string;
23
+ /** Short YOU bubble — the user's raw feedback only. */
24
+ readonly displayPrompt: string;
25
+ }
26
+ /**
27
+ * If the user was prompted to suggest changes, wrap their free-text as a
28
+ * plan-revision request and keep plan mode. Returns submit payloads, or
29
+ * undefined if this was not a suggestion capture.
30
+ */
31
+ export declare function consumePlanSuggestionInput(services: AppServices, text: string): PlanSuggestionSubmit | undefined;
16
32
  export declare function implementPlan(services: AppServices): Promise<void>;
17
33
  export declare function discardPlan(services: AppServices): Promise<void>;
34
+ /**
35
+ * Enter suggestion capture: next composer submit revises the draft plan.
36
+ * Mode stays plan; plan-ready reappears after the revision turn if still draft.
37
+ */
38
+ export declare function beginPlanSuggestion(services: AppServices): void;
18
39
  /**
19
40
  * After a turn ends, if a draft plan is waiting, open the plan-ready confirm.
20
41
  * "P" views full plan detail via the suspended-over-confirm pager path.
42
+ * "S" suggests changes via free-text in the composer.
21
43
  */
22
44
  export declare function promptPlanApprovalIfNeeded(services: AppServices): Promise<void>;
@@ -1,23 +1,22 @@
1
1
  /**
2
- * Plan approval/implement/discard orchestration (PLAN-004, F-021/023, V2-070/073).
2
+ * Plan approval/implement/discard/suggest orchestration (PLAN-004, F-021/023, V2-070/073).
3
3
  *
4
4
  * Mirrors the classic TUI's `/implement` path: approve the persisted plan, flip
5
- * the session policy flag the agent gate reads, then run the implement prompt.
6
- * Kept out of `PlanController` (persistence only) and out of components.
5
+ * the session policy flag the agent gate reads, switch to agent mode, then run
6
+ * the implement prompt. Kept out of `PlanController` (persistence only) and out
7
+ * of components.
7
8
  */
9
+ import { setDefaultMode } from "../../store/config.js";
10
+ import { buildPlanRevisionPrompt } from "../../agent/plan-decision.js";
8
11
  /** Coding / build plans — scaffold + verify. */
9
- export const IMPLEMENT_PROMPT_CODING = "I approve the plan. Execute it now in STRICT ORDER. " +
10
- "Start with the FIRST pending task that still needs work (skip only tasks already marked done). " +
11
- "For each task: call task.update {taskId, state:'in_progress'} do the real work → VERIFY it succeeded → " +
12
- "call task.update {taskId, state:'done'}, then move to the NEXT task. " +
13
- "If a tool call FAILS, mark the task 'failed', fix the problem, and retry. Do NOT mark a task done when it failed. " +
14
- "Do NOT skip ahead to later tasks while earlier ones are still pending. " +
15
- "Build for real with fs.write / fs.writeMany when the plan requires files. " +
16
- "Run real commands when needed — do not claim anything ran without a successful tool call.";
12
+ export const IMPLEMENT_PROMPT_CODING = "Plan approved. Execute it. " +
13
+ "Work through pending tasks in dependency order. For each: mark in_progress → do real work verify mark done (or failed and recover). " +
14
+ "Skip tasks already done. Adapt if reality differs from the plan. " +
15
+ "Do not claim done without tool evidence. Build for real with fs.write / fs.writeMany when needed. " +
16
+ "For local apps: shell.start, leave the server running, report URL + port + job id.";
17
17
  /** Pentest / security plans — no local dev-server assumption. */
18
- export const IMPLEMENT_PROMPT_PENTEST = "I approve the plan. Execute the engagement tasks in STRICT ORDER. " +
19
- "Start with the FIRST pending task; do NOT skip to later tasks while earlier ones are still pending. " +
20
- "For each task: task.update in_progress → do the recon/testing work with tools → task.update done (or failed with a note). " +
18
+ export const IMPLEMENT_PROMPT_PENTEST = "Plan approved. Execute the engagement tasks. " +
19
+ "Work through pending tasks: in_progress recon/testing with tools done (or failed with a note). " +
21
20
  "Prefer tool.batch / dns / http.fetch / net.scan for recon; continue when one lookup fails. " +
22
21
  "Do NOT start a local dev server, npm run dev, bun run, vite, next, or shell.start. " +
23
22
  "Do NOT list or read the clai workspace/package.json as a follow-up. Stay on the remote engagement target/scope. " +
@@ -28,10 +27,12 @@ export const IMPLEMENT_PROMPT = IMPLEMENT_PROMPT_CODING;
28
27
  * confirm must not also run implement/discard (double-queue / double-discard).
29
28
  */
30
29
  let planDecisionHandled = false;
31
- function dismissPlanConfirmIfOpen(services, asYes) {
30
+ /** After user presses `s`, the next free-text submit is a plan revision (not implement). */
31
+ let awaitingPlanSuggestion = false;
32
+ function dismissPlanConfirmIfOpen(services, result) {
32
33
  const state = services.overlay.getState();
33
34
  if (state.kind === "confirm" && state.request.kind === "plan") {
34
- services.overlay.answerConfirm(asYes);
35
+ services.overlay.answerPlanConfirm(result);
35
36
  }
36
37
  }
37
38
  export function buildImplementPrompt(plan) {
@@ -39,6 +40,41 @@ export function buildImplementPrompt(plan) {
39
40
  return IMPLEMENT_PROMPT_PENTEST;
40
41
  return IMPLEMENT_PROMPT_CODING;
41
42
  }
43
+ /** True when plan-ready UI asked the user to type revision feedback next. */
44
+ export function isAwaitingPlanSuggestion() {
45
+ return awaitingPlanSuggestion;
46
+ }
47
+ export function clearAwaitingPlanSuggestion() {
48
+ awaitingPlanSuggestion = false;
49
+ }
50
+ /**
51
+ * If the user was prompted to suggest changes, wrap their free-text as a
52
+ * plan-revision request and keep plan mode. Returns submit payloads, or
53
+ * undefined if this was not a suggestion capture.
54
+ */
55
+ export function consumePlanSuggestionInput(services, text) {
56
+ if (!awaitingPlanSuggestion)
57
+ return undefined;
58
+ awaitingPlanSuggestion = false;
59
+ const feedback = text.trim();
60
+ if (!feedback) {
61
+ services.session.notice("info", "no plan changes entered — draft unchanged");
62
+ return undefined;
63
+ }
64
+ const plan = services.plan.current();
65
+ services.session.notice("info", "revising plan from your feedback…");
66
+ // Stay in plan mode for revision
67
+ if (services.session.getState().mode !== "plan") {
68
+ services.session.setMode("plan");
69
+ setDefaultMode("plan");
70
+ }
71
+ return {
72
+ modelPrompt: buildPlanRevisionPrompt(feedback, {
73
+ planVersion: plan?.version,
74
+ }),
75
+ displayPrompt: feedback,
76
+ };
77
+ }
42
78
  export async function implementPlan(services) {
43
79
  const plan = services.plan.current();
44
80
  if (!plan)
@@ -47,39 +83,63 @@ export async function implementPlan(services) {
47
83
  return;
48
84
  // Pane click wins: mark handled, close chat confirm so Y/N can't re-queue.
49
85
  planDecisionHandled = true;
50
- dismissPlanConfirmIfOpen(services, true);
86
+ awaitingPlanSuggestion = false;
87
+ dismissPlanConfirmIfOpen(services, "implement");
88
+ // Critical: leave gather-only plan mode so shell/fs mutates are allowed.
89
+ services.session.setMode("agent");
90
+ setDefaultMode("agent");
51
91
  await services.plan.approve();
52
92
  services.session.setPlanApproved(true);
93
+ services.session.notice("info", "plan accepted — switching to agent mode to execute");
53
94
  const prompt = buildImplementPrompt(plan);
95
+ // Model gets full implement directive; chat must NOT show it as a YOU bubble.
54
96
  if (services.session.getState().running) {
55
- services.session.enqueue(prompt);
97
+ services.session.enqueue(prompt, { displayPrompt: null });
56
98
  }
57
99
  else {
58
- await services.session.submit(prompt);
100
+ await services.session.submit(prompt, { displayPrompt: null });
59
101
  }
60
102
  }
61
103
  export async function discardPlan(services) {
62
104
  planDecisionHandled = true;
63
- dismissPlanConfirmIfOpen(services, false);
105
+ awaitingPlanSuggestion = false;
106
+ dismissPlanConfirmIfOpen(services, "discard");
64
107
  await services.plan.discard();
65
108
  services.session.setPlanApproved(false);
66
109
  }
110
+ /**
111
+ * Enter suggestion capture: next composer submit revises the draft plan.
112
+ * Mode stays plan; plan-ready reappears after the revision turn if still draft.
113
+ */
114
+ export function beginPlanSuggestion(services) {
115
+ planDecisionHandled = true;
116
+ awaitingPlanSuggestion = true;
117
+ dismissPlanConfirmIfOpen(services, "suggest");
118
+ if (services.session.getState().mode !== "plan") {
119
+ services.session.setMode("plan");
120
+ setDefaultMode("plan");
121
+ }
122
+ services.session.notice("info", "type plan changes in the input and press enter — agent will revise the draft (or ask if unclear)");
123
+ }
67
124
  /**
68
125
  * After a turn ends, if a draft plan is waiting, open the plan-ready confirm.
69
126
  * "P" views full plan detail via the suspended-over-confirm pager path.
127
+ * "S" suggests changes via free-text in the composer.
70
128
  */
71
129
  export async function promptPlanApprovalIfNeeded(services) {
72
130
  if (services.session.isPlanApproved())
73
131
  return;
74
132
  if (services.overlay.isOpen())
75
133
  return;
134
+ if (awaitingPlanSuggestion)
135
+ return;
76
136
  const plan = services.plan.current();
77
137
  if (!plan || plan.status !== "draft" || plan.tasks.length === 0)
78
138
  return;
79
139
  planDecisionHandled = false;
80
- const ok = await services.overlay.openConfirm({
140
+ const decision = await services.overlay.openPlanConfirm({
81
141
  kind: "plan",
82
- prompt: `Implement this plan now? "${plan.goal}" — ${plan.tasks.length} task(s). (Y to implement · N to discard)`,
142
+ prompt: `Implement this plan now? "${plan.goal}" — ${plan.tasks.length} task(s). (Y implement · S suggest · P view · N discard · Esc dismiss)`,
83
143
  }, async () => {
84
144
  const { formatPlanPagerDocument } = await import("../rendering/plan-view.js");
85
145
  services.overlay.openPager(`Plan · ${plan.goal}`, formatPlanPagerDocument(plan));
@@ -87,9 +147,12 @@ export async function promptPlanApprovalIfNeeded(services) {
87
147
  // Plan pane already implemented/discarded while this confirm was open.
88
148
  if (planDecisionHandled)
89
149
  return;
90
- if (ok)
150
+ if (decision === "implement")
91
151
  await implementPlan(services);
92
- else
152
+ else if (decision === "discard")
93
153
  await discardPlan(services);
154
+ else if (decision === "suggest")
155
+ beginPlanSuggestion(services);
156
+ // dismiss: leave draft pending; user can /implement, type feedback, or reopen
94
157
  }
95
158
  //# sourceMappingURL=plan-lifecycle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan-lifecycle.js","sourceRoot":"","sources":["../../../src/tui-v2/app/plan-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-lifecycle.js","sourceRoot":"","sources":["../../../src/tui-v2/app/plan-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * OpenTUI crashes when React sets <text content={null|undefined}>:
3
+ * setStyledText(null) → text.chunks throws. Coerce nullish / invalid values
4
+ * to a single space so transient unmount/update races never take down the TUI.
5
+ */
6
+ export declare function patchOpenTuiTextContent(): void;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * OpenTUI crashes when React sets <text content={null|undefined}>:
3
+ * setStyledText(null) → text.chunks throws. Coerce nullish / invalid values
4
+ * to a single space so transient unmount/update races never take down the TUI.
5
+ */
6
+ import { TextRenderable, stringToStyledText, StyledText } from "@opentui/core";
7
+ let patched = false;
8
+ function isStyledText(value) {
9
+ return (value instanceof StyledText ||
10
+ (typeof value === "object" &&
11
+ value !== null &&
12
+ Array.isArray(value.chunks)));
13
+ }
14
+ export function patchOpenTuiTextContent() {
15
+ if (patched)
16
+ return;
17
+ patched = true;
18
+ const proto = TextRenderable.prototype;
19
+ const desc = Object.getOwnPropertyDescriptor(proto, "content");
20
+ if (!desc?.set || !desc.get)
21
+ return;
22
+ const originalSet = desc.set;
23
+ Object.defineProperty(proto, "content", {
24
+ configurable: true,
25
+ enumerable: desc.enumerable ?? true,
26
+ get: desc.get,
27
+ set(value) {
28
+ if (value == null) {
29
+ originalSet.call(this, " ");
30
+ return;
31
+ }
32
+ if (typeof value === "string") {
33
+ originalSet.call(this, value.length === 0 ? " " : value);
34
+ return;
35
+ }
36
+ if (isStyledText(value)) {
37
+ if (!value.chunks || value.chunks.length === 0) {
38
+ originalSet.call(this, " ");
39
+ return;
40
+ }
41
+ originalSet.call(this, value);
42
+ return;
43
+ }
44
+ try {
45
+ originalSet.call(this, stringToStyledText(String(value)));
46
+ }
47
+ catch {
48
+ originalSet.call(this, " ");
49
+ }
50
+ },
51
+ });
52
+ }
53
+ //# sourceMappingURL=patch-opentui-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-opentui-text.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/patch-opentui-text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE/E,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,KAAK,YAAY,UAAU;QAC3B,CAAC,OAAO,KAAK,KAAK,QAAQ;YACxB,KAAK,KAAK,IAAI;YACd,KAAK,CAAC,OAAO,CAAE,KAA8B,CAAC,MAAM,CAAC,CAAC,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,OAAO;QAAE,OAAO;IACpB,OAAO,GAAG,IAAI,CAAC;IAEf,MAAM,KAAK,GAAG,cAAc,CAAC,SAE5B,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE;QACtC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;QACnC,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,CAAC,KAAc;YAChB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YACD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/C,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBACD,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -17,7 +17,14 @@ import { createCompositionRoot } from "./composition-root.js";
17
17
  import { RendererLifecycle } from "./lifecycle.js";
18
18
  import { createOsc52ClipboardPort } from "./osc52-clipboard.js";
19
19
  import { createPagerExportPort } from "./pager-export.js";
20
+ import { patchOpenTuiTextContent } from "./patch-opentui-text.js";
21
+ import { setAllowInteractiveStdinInherit } from "../../tools/shell.js";
20
22
  export async function startTuiV2(options = {}) {
23
+ // Must run before any <text content=…> mounts — null content crashes OpenTUI.
24
+ patchOpenTuiTextContent();
25
+ // Never let sudo/ssh steal stdin — that freezes the TUI (Password: under
26
+ // composer, Esc/Ctrl+C/clicks dead). Elevation uses the secret modal + -S.
27
+ setAllowInteractiveStdinInherit(false);
21
28
  // OpenTUI native drag-select is enabled. Interactive chrome (prompts/tools/
22
29
  // composer) sets selectable={false}; response/thinking body stays selectable.
23
30
  // Copy-on-release is wired in TranscriptView via useNativeSelectionCopy.
@@ -1 +1 @@
1
- {"version":3,"file":"start-tui-v2.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/start-tui-v2.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start-tui-v2.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/start-tui-v2.ts"],"names":[],"mappings":"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"}
@@ -10,18 +10,24 @@ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
10
10
  import { useEffect, useState } from "react";
11
11
  import { useKeyboard } from "@opentui/react";
12
12
  import { chordFromKeyEvent } from "../../actions/chord-from-key.js";
13
- const HUNG_AFTER_MS = 120_000;
14
13
  const POLL_MS = 1000;
15
14
  function statusView(job, theme) {
16
15
  if (job.status === "running") {
17
- const elapsed = Date.now() - new Date(job.startedAt).getTime();
18
- return elapsed > HUNG_AFTER_MS
19
- ? { text: "running (possibly hung)", fg: theme.accent }
16
+ const heartbeatAge = job.heartbeatAt ? Date.now() - new Date(job.heartbeatAt).getTime() : undefined;
17
+ return heartbeatAge !== undefined && heartbeatAge > 120_000
18
+ ? { text: "running (quiet)", fg: theme.foreground }
20
19
  : { text: "running", fg: theme.foreground };
21
20
  }
22
21
  if (job.status === "exited") {
23
22
  return { text: `exited (${job.exitCode ?? "?"})`, fg: job.exitCode ? theme.accent : theme.muted };
24
23
  }
24
+ if (job.status === "failed") {
25
+ return { text: `failed (${job.exitCode ?? "?"})`, fg: theme.accent };
26
+ }
27
+ if (job.status === "killed") {
28
+ const detail = [job.signal, job.exitCode].filter((value) => value !== undefined).join("/") || "?";
29
+ return { text: `killed (${detail})`, fg: theme.accent };
30
+ }
25
31
  return { text: job.status, fg: theme.accent };
26
32
  }
27
33
  function elapsedLabel(job) {
@@ -30,11 +36,12 @@ function elapsedLabel(job) {
30
36
  }
31
37
  export function JobsPanel(props) {
32
38
  const { services, theme } = props;
33
- const [jobs, setJobs] = useState(() => services.ports.jobs.running());
39
+ const readJobs = () => services.ports.jobs.recent?.(100) ?? services.ports.jobs.running();
40
+ const [jobs, setJobs] = useState(readJobs);
34
41
  const [selected, setSelected] = useState(0);
35
42
  const [note, setNote] = useState("");
36
43
  useEffect(() => {
37
- const interval = setInterval(() => setJobs(services.ports.jobs.running()), POLL_MS);
44
+ const interval = setInterval(() => setJobs(readJobs()), POLL_MS);
38
45
  return () => clearInterval(interval);
39
46
  }, [services.ports.jobs]);
40
47
  async function tail(job) {
@@ -59,9 +66,10 @@ export function JobsPanel(props) {
59
66
  break;
60
67
  case "jobs.stop":
61
68
  if (job?.status === "running") {
62
- const result = services.ports.jobs.stop(job.id);
63
- setNote(result.output);
64
- setJobs(services.ports.jobs.running());
69
+ void services.ports.jobs.stop(job.id).then((result) => {
70
+ setNote(result.output);
71
+ setJobs(readJobs());
72
+ });
65
73
  }
66
74
  break;
67
75
  case "jobs.tail":
@@ -78,15 +86,16 @@ export function JobsPanel(props) {
78
86
  return (_jsxs("box", { style: {
79
87
  flexDirection: "column",
80
88
  width: "70%",
89
+ height: "70%",
81
90
  border: true,
82
91
  borderColor: theme.border,
83
92
  backgroundColor: theme.background,
84
93
  paddingLeft: 1,
85
94
  paddingRight: 1,
86
- }, children: [_jsx("text", { style: { fg: theme.accent }, children: "Background jobs" }), _jsx("text", { style: { fg: theme.muted }, children: "\u2191\u2193:select \u00B7 enter/t:tail \u00B7 k:kill \u00B7 q/esc:close" }), _jsx("text", { style: { fg: theme.border }, children: "─".repeat(40) }), _jsx("text", { content: " " }), jobs.length === 0 ? (_jsx("text", { style: { fg: theme.muted }, children: "no background jobs" })) : (jobs.map((job, index) => {
87
- const status = statusView(job, theme);
88
- const focused = index === selected;
89
- return (_jsx("box", { onMouseDown: () => setSelected(index), style: { flexDirection: "row" }, children: _jsxs("text", { style: { fg: focused ? theme.accent : theme.foreground }, children: [focused ? "❯ " : " ", "[", job.id, "] ", _jsx("span", { style: { fg: status.fg }, children: status.text }), " ", elapsedLabel(job), " ", job.command.slice(0, 48)] }) }, job.id));
90
- })), note ? _jsx("text", { style: { fg: theme.muted }, children: note }) : null] }));
95
+ }, children: [_jsx("text", { style: { fg: theme.accent }, children: "Background jobs" }), _jsx("text", { style: { fg: theme.muted }, children: "\u2191\u2193:select \u00B7 enter/t:tail \u00B7 k:kill \u00B7 q/esc:close" }), _jsx("text", { style: { fg: theme.border }, children: "─".repeat(40) }), _jsx("text", { content: " " }), _jsx("scrollbox", { scrollY: true, scrollX: false, viewportCulling: true, style: { flexGrow: 1, width: "100%" }, children: jobs.length === 0 ? (_jsx("text", { style: { fg: theme.muted }, children: "no background jobs" })) : (jobs.map((job, index) => {
96
+ const status = statusView(job, theme);
97
+ const focused = index === selected;
98
+ return (_jsx("box", { onMouseDown: () => setSelected(index), style: { flexDirection: "row" }, children: _jsxs("text", { style: { fg: focused ? theme.accent : theme.foreground }, children: [focused ? "❯ " : " ", "[", job.id, "] ", _jsx("span", { style: { fg: status.fg }, children: status.text }), " ", elapsedLabel(job), " ", job.command.slice(0, 48)] }) }, job.id));
99
+ })) }), note ? _jsx("text", { style: { fg: theme.muted }, children: note }) : null] }));
91
100
  }
92
101
  //# sourceMappingURL=jobs-panel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jobs-panel.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/jobs/jobs-panel.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAOpE,MAAM,aAAa,GAAG,OAAO,CAAC;AAC9B,MAAM,OAAO,GAAG,IAAI,CAAC;AAErB,SAAS,UAAU,CAAC,GAAkB,EAAE,KAAY;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO,OAAO,GAAG,aAAa;YAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE;YACvD,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,QAAQ,IAAI,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACpG,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,GAAkB;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACvE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAClC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAkB,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACpF,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1B,KAAK,UAAU,IAAI,CAAC,GAAkB;QACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,OAAO,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE;QAClB,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,GAAG,CAAC,cAAc,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,SAAS;gBACZ,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,WAAW;gBACd,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClE,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,GAAG,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,GAAG;oBAAE,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM;YACR,KAAK,YAAY;gBACf,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,eACE,KAAK,EAAE;YACL,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,eAAe,EAAE,KAAK,CAAC,UAAU;YACjC,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;SAChB,aAED,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,gCAAwB,EACzD,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,+FAA8D,EAC9F,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,YAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAC1D,eAAM,OAAO,EAAC,GAAG,GAAG,EACnB,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACnB,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,mCAA2B,CAC5D,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACtB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,KAAK,KAAK,QAAQ,CAAC;gBACnC,OAAO,CACL,cAAkB,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,YACtF,gBAAM,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,aAC3D,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OACpB,GAAG,CAAC,EAAE,QAAG,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,YAAG,MAAM,CAAC,IAAI,GAAQ,EAAC,IAAI,EACnE,YAAY,CAAC,GAAG,CAAC,QAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IACzC,IALC,GAAG,CAAC,EAAE,CAMV,CACP,CAAC;YACJ,CAAC,CAAC,CACH,EACA,IAAI,CAAC,CAAC,CAAC,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,YAAG,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC1D,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"jobs-panel.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/jobs/jobs-panel.tsx"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Confirmation surface (CORE-002, PICK-002, V2-073).
4
4
  *
5
5
  * Docked above the composer by default — compact action bar, not a full-screen
6
- * black modal. Keys: y/n (or r for reset, i/d/p for plan).
6
+ * black modal. Keys: y/n (or r for reset, i/d/p/s for plan).
7
7
  */
8
8
  import type { ReactNode } from "react";
9
9
  import type { AppServices } from "../../bootstrap/composition-root.js";
@@ -25,15 +25,26 @@ export function ConfirmModal(props) {
25
25
  return;
26
26
  }
27
27
  else if (request.kind === "plan") {
28
- if (chord === "y" || chord === "i")
29
- services.overlay.answerConfirm(true);
30
- else if (chord === "n" || chord === "d" || chord === "escape") {
31
- services.overlay.answerConfirm(false);
28
+ // Only explicit decision keys free-text suggestions use `s` then composer.
29
+ if (chord === "y" || chord === "i" || chord === "enter") {
30
+ services.overlay.answerPlanConfirm("implement");
31
+ }
32
+ else if (chord === "n" || chord === "d") {
33
+ services.overlay.answerPlanConfirm("discard");
32
34
  }
33
- else if (chord === "p")
35
+ else if (chord === "s") {
36
+ services.overlay.answerPlanConfirm("suggest");
37
+ }
38
+ else if (chord === "p") {
34
39
  onViewPlan?.();
35
- else
40
+ }
41
+ else if (chord === "escape") {
42
+ // Dismiss only — leave draft plan pending (do not discard)
43
+ services.overlay.answerPlanConfirm("dismiss");
44
+ }
45
+ else {
36
46
  return;
47
+ }
37
48
  }
38
49
  else {
39
50
  if (chord === "y")
@@ -56,7 +67,7 @@ export function ConfirmModal(props) {
56
67
  const hint = request.kind === "reset"
57
68
  ? "r confirm · esc cancel"
58
69
  : request.kind === "plan"
59
- ? "y/i implement · n/d discard · p view plan · esc cancel"
70
+ ? "y/i implement · s suggest · p view · n/d discard · esc dismiss"
60
71
  : request.kind === "continue"
61
72
  ? "y continue · n stop · esc cancel"
62
73
  : "y approve · n deny · esc cancel";
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-modal.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/modal/confirm-modal.tsx"],"names":[],"mappings":";AASA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAYpE,MAAM,MAAM,GAA2C;IACrD,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,mBAAmB;IAC5B,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE/D,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE;QAClB,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO;QACxC,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,KAAK,GAAG;gBAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;iBACnD,IAAI,KAAK,KAAK,QAAQ;gBAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;;gBAC9D,OAAO;QACd,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;gBAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;iBACpE,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9D,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,KAAK,KAAK,GAAG;gBAAE,UAAU,EAAE,EAAE,CAAC;;gBACpC,OAAO;QACd,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,KAAK,GAAG;gBAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;iBACnD,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC7C,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;;gBAAM,OAAO;QAChB,CAAC;QACD,GAAG,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,SAAS;QACxB,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,CAAC,CAAC,KAAK,CAAC,QAAQ;YAChB,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;gBACxB,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAErB,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,KAAK,OAAO;QACtB,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,CAAC,CAAC,8DAA8D;YAChE,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU;gBAC3B,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,qCAAqC,CAAC;IAEhD,kDAAkD;IAClD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEjE,OAAO,CACL,eACE,MAAM,QACN,WAAW,EAAC,SAAS,EACrB,KAAK,EAAE;YACL,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAC9B,WAAW,EAAE,MAAM;YACnB,eAAe,EAAE,KAAK,CAAC,gBAAgB;YACvC,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;SACjB,aAED,eAAK,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aACjD,eACE,KAAK,EAAE;4BACL,EAAE,EAAE,KAAK,CAAC,UAAU;4BACpB,EAAE,EAAE,MAAM;4BACV,UAAU,EAAE,cAAc,CAAC,IAAI;yBAChC,YAEA,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GACvB,EACP,eAAM,OAAO,EAAC,GAAG,GAAG,EACpB,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,uCAEzD,IACH,EACL,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5B,eAAc,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,YAC1C,IAAI,IADI,CAAC,CAEL,CACR,CAAC,EACF,eAAK,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/D,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,IAAI,EAAE,wBAAW,EAC3E,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,YAAG,IAAI,GAAQ,IAC1C,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACtB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBAClD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"confirm-modal.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/modal/confirm-modal.tsx"],"names":[],"mappings":"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"}
@@ -38,6 +38,6 @@ export function OverlayHost(props) {
38
38
  backgroundColor: theme.background,
39
39
  alignItems: "center",
40
40
  justifyContent: "center",
41
- }, children: [state.kind === "picker" ? (_jsx(Picker, { services: services, theme: theme, request: state.request })) : null, state.kind === "prompt-actions" ? (_jsx(PromptActionsModal, { services: services, theme: theme, request: state.request })) : null, state.kind === "pager" ? (_jsx(Pager, { services: services, theme: theme, title: state.title, body: state.body })) : null, state.kind === "jobs" ? _jsx(JobsPanel, { services: services, theme: theme }) : null] }));
41
+ }, children: [state.kind === "picker" ? (_jsx(Picker, { services: services, theme: theme, request: state.request })) : null, state.kind === "prompt-actions" ? (_jsx(PromptActionsModal, { services: services, theme: theme, request: state.request })) : null, state.kind === "pager" ? (_jsx(Pager, { services: services, theme: theme, title: state.title, body: state.body, source: state.source, highlightPath: state.highlightPath })) : null, state.kind === "jobs" ? _jsx(JobsPanel, { services: services, theme: theme }) : null] }));
42
42
  }
43
43
  //# sourceMappingURL=overlay-host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-host.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/overlay/overlay-host.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overlay-host.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/overlay/overlay-host.tsx"],"names":[],"mappings":"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"}
@@ -11,10 +11,16 @@
11
11
  import { type ReactNode } from "react";
12
12
  import type { AppServices } from "../../bootstrap/composition-root.js";
13
13
  import type { Theme } from "../../rendering/theme.js";
14
+ import type { ArtifactPagerSource } from "../../rendering/artifact-pager-source.js";
14
15
  export interface PagerProps {
15
16
  readonly services: AppServices;
16
17
  readonly theme: Theme;
17
18
  readonly title: string;
18
19
  readonly body: string;
20
+ readonly source?: ArtifactPagerSource | undefined;
21
+ /** When set, syntax-highlight diff bodies using this path's language. */
22
+ readonly highlightPath?: string | undefined;
19
23
  }
24
+ /** Strip gutters from a full pager body for clipboard copy. */
25
+ export declare function bodyOnlyForCopy(full: string): string;
20
26
  export declare function Pager(props: PagerProps): ReactNode;