@bastani/atomic 0.8.13-0 → 0.8.14-0

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 (355) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/host-html-template.ts +1 -1
  4. package/dist/builtin/mcp/init.ts +15 -2
  5. package/dist/builtin/mcp/mcp-callback-server.ts +10 -9
  6. package/dist/builtin/mcp/package.json +1 -1
  7. package/dist/builtin/mcp/ui-session.ts +9 -6
  8. package/dist/builtin/subagents/CHANGELOG.md +8 -1
  9. package/dist/builtin/subagents/README.md +39 -32
  10. package/dist/builtin/subagents/package.json +1 -1
  11. package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
  12. package/dist/builtin/subagents/src/agents/agent-management.ts +6 -1
  13. package/dist/builtin/subagents/src/agents/agent-serializer.ts +2 -0
  14. package/dist/builtin/subagents/src/agents/agents.ts +44 -19
  15. package/dist/builtin/subagents/src/extension/config.ts +16 -0
  16. package/dist/builtin/subagents/src/extension/fanout-child.ts +246 -0
  17. package/dist/builtin/subagents/src/extension/index.ts +466 -603
  18. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +6 -4
  19. package/dist/builtin/subagents/src/intercom/result-intercom.ts +109 -1
  20. package/dist/builtin/subagents/src/runs/background/async-execution.ts +124 -19
  21. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +41 -6
  22. package/dist/builtin/subagents/src/runs/background/async-resume.ts +28 -15
  23. package/dist/builtin/subagents/src/runs/background/async-status.ts +60 -30
  24. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +111 -54
  25. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +83 -0
  26. package/dist/builtin/subagents/src/runs/background/run-status.ts +79 -3
  27. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +46 -1
  28. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +66 -14
  29. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +10 -3
  30. package/dist/builtin/subagents/src/runs/foreground/execution.ts +14 -2
  31. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +320 -23
  32. package/dist/builtin/subagents/src/runs/shared/completion-guard.ts +23 -1
  33. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +369 -0
  34. package/dist/builtin/subagents/src/runs/shared/nested-events.ts +935 -0
  35. package/dist/builtin/subagents/src/runs/shared/nested-path.ts +52 -0
  36. package/dist/builtin/subagents/src/runs/shared/nested-render.ts +115 -0
  37. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -0
  38. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +82 -9
  39. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +1 -1
  40. package/dist/builtin/subagents/src/runs/shared/single-output.ts +12 -2
  41. package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +32 -10
  42. package/dist/builtin/subagents/src/runs/shared/worktree.ts +3 -2
  43. package/dist/builtin/subagents/src/shared/artifacts.ts +0 -1
  44. package/dist/builtin/subagents/src/shared/types.ts +96 -1
  45. package/dist/builtin/subagents/src/shared/utils.ts +10 -2
  46. package/dist/builtin/subagents/src/slash/slash-commands.ts +468 -625
  47. package/dist/builtin/subagents/src/tui/render.ts +1227 -2093
  48. package/dist/builtin/web-access/package.json +1 -1
  49. package/dist/builtin/workflows/CHANGELOG.md +24 -0
  50. package/dist/builtin/workflows/README.md +28 -11
  51. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +323 -40
  52. package/dist/builtin/workflows/builtin/ralph.ts +362 -176
  53. package/dist/builtin/workflows/package.json +2 -5
  54. package/dist/builtin/workflows/skills/research-codebase/SKILL.md +1 -1
  55. package/dist/builtin/workflows/skills/skill-creator/LICENSE.txt +202 -0
  56. package/dist/builtin/workflows/skills/skill-creator/SKILL.md +489 -0
  57. package/dist/builtin/workflows/skills/skill-creator/agents/analyzer.md +274 -0
  58. package/dist/builtin/workflows/skills/skill-creator/agents/comparator.md +202 -0
  59. package/dist/builtin/workflows/skills/skill-creator/agents/grader.md +223 -0
  60. package/dist/builtin/workflows/skills/skill-creator/assets/eval_review.html +146 -0
  61. package/dist/builtin/workflows/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  62. package/dist/builtin/workflows/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  63. package/dist/builtin/workflows/skills/skill-creator/references/schemas.md +430 -0
  64. package/dist/builtin/workflows/skills/skill-creator/scripts/__init__.py +0 -0
  65. package/dist/builtin/workflows/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  66. package/dist/builtin/workflows/skills/skill-creator/scripts/generate_report.py +326 -0
  67. package/dist/builtin/workflows/skills/skill-creator/scripts/improve_description.py +247 -0
  68. package/dist/builtin/workflows/skills/skill-creator/scripts/package_skill.py +136 -0
  69. package/dist/builtin/workflows/skills/skill-creator/scripts/quick_validate.py +103 -0
  70. package/dist/builtin/workflows/skills/skill-creator/scripts/run_eval.py +310 -0
  71. package/dist/builtin/workflows/skills/skill-creator/scripts/run_loop.py +328 -0
  72. package/dist/builtin/workflows/skills/skill-creator/scripts/utils.py +47 -0
  73. package/dist/builtin/workflows/src/extension/index.ts +869 -93
  74. package/dist/builtin/workflows/src/extension/render-call.ts +34 -1
  75. package/dist/builtin/workflows/src/extension/render-result.ts +126 -21
  76. package/dist/builtin/workflows/src/extension/runtime.ts +91 -3
  77. package/dist/builtin/workflows/src/extension/wiring.ts +38 -12
  78. package/dist/builtin/workflows/src/extension/workflow-schema.ts +62 -5
  79. package/dist/builtin/workflows/src/runs/background/runner.ts +3 -3
  80. package/dist/builtin/workflows/src/runs/background/status.ts +42 -8
  81. package/dist/builtin/workflows/src/runs/foreground/executor.ts +410 -95
  82. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +5 -2
  83. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +8 -0
  84. package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +6 -4
  85. package/dist/builtin/workflows/src/runs/shared/worktree.ts +3 -2
  86. package/dist/builtin/workflows/src/shared/persistence-restore.ts +138 -5
  87. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +30 -0
  88. package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +78 -120
  89. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +193 -0
  90. package/dist/builtin/workflows/src/shared/store-types.ts +26 -1
  91. package/dist/builtin/workflows/src/shared/store.ts +145 -17
  92. package/dist/builtin/workflows/src/shared/timing.ts +6 -2
  93. package/dist/builtin/workflows/src/shared/workflow-failures.ts +375 -0
  94. package/dist/builtin/workflows/src/tui/chat-surface.ts +68 -17
  95. package/dist/builtin/workflows/src/tui/connectors.ts +2 -2
  96. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +24 -26
  97. package/dist/builtin/workflows/src/tui/graph-canvas.ts +4 -8
  98. package/dist/builtin/workflows/src/tui/graph-view.ts +17 -14
  99. package/dist/builtin/workflows/src/tui/header.ts +38 -0
  100. package/dist/builtin/workflows/src/tui/inline-form-card.ts +161 -238
  101. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +68 -73
  102. package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +2 -3
  103. package/dist/builtin/workflows/src/tui/inline-form-store.ts +2 -1
  104. package/dist/builtin/workflows/src/tui/inputs-overlay.ts +1 -3
  105. package/dist/builtin/workflows/src/tui/inputs-picker.ts +286 -399
  106. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +11 -0
  107. package/dist/builtin/workflows/src/tui/node-card.ts +2 -1
  108. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +9 -1
  109. package/dist/builtin/workflows/src/tui/prompt-card.ts +46 -19
  110. package/dist/builtin/workflows/src/tui/run-detail.ts +63 -80
  111. package/dist/builtin/workflows/src/tui/session-confirm.ts +9 -3
  112. package/dist/builtin/workflows/src/tui/session-picker.ts +19 -16
  113. package/dist/builtin/workflows/src/tui/stage-chat-layout.ts +88 -0
  114. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +368 -879
  115. package/dist/builtin/workflows/src/tui/status-helpers.ts +4 -0
  116. package/dist/builtin/workflows/src/tui/status-list.ts +67 -75
  117. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +50 -12
  118. package/dist/builtin/workflows/src/tui/submit-pane.ts +164 -0
  119. package/dist/builtin/workflows/src/tui/switcher.ts +27 -4
  120. package/dist/builtin/workflows/src/tui/text-helpers.ts +98 -4
  121. package/dist/builtin/workflows/src/tui/widget.ts +90 -68
  122. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +23 -2
  123. package/dist/builtin/workflows/src/tui/workflow-list.ts +44 -68
  124. package/dist/cli/file-processor.d.ts.map +1 -1
  125. package/dist/cli/file-processor.js +2 -3
  126. package/dist/cli/file-processor.js.map +1 -1
  127. package/dist/config.d.ts.map +1 -1
  128. package/dist/config.js +3 -10
  129. package/dist/config.js.map +1 -1
  130. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  131. package/dist/core/agent-session-runtime.js +2 -1
  132. package/dist/core/agent-session-runtime.js.map +1 -1
  133. package/dist/core/agent-session-services.d.ts.map +1 -1
  134. package/dist/core/agent-session-services.js +3 -2
  135. package/dist/core/agent-session-services.js.map +1 -1
  136. package/dist/core/agent-session.d.ts +6 -0
  137. package/dist/core/agent-session.d.ts.map +1 -1
  138. package/dist/core/agent-session.js +16 -2
  139. package/dist/core/agent-session.js.map +1 -1
  140. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  141. package/dist/core/atomic-guide-command.js +8 -9
  142. package/dist/core/atomic-guide-command.js.map +1 -1
  143. package/dist/core/auth-storage.d.ts.map +1 -1
  144. package/dist/core/auth-storage.js +3 -2
  145. package/dist/core/auth-storage.js.map +1 -1
  146. package/dist/core/bash-executor.d.ts.map +1 -1
  147. package/dist/core/bash-executor.js +2 -1
  148. package/dist/core/bash-executor.js.map +1 -1
  149. package/dist/core/export-html/index.d.ts.map +1 -1
  150. package/dist/core/export-html/index.js +8 -6
  151. package/dist/core/export-html/index.js.map +1 -1
  152. package/dist/core/export-html/template.js +6 -3
  153. package/dist/core/extensions/loader.d.ts.map +1 -1
  154. package/dist/core/extensions/loader.js +12 -29
  155. package/dist/core/extensions/loader.js.map +1 -1
  156. package/dist/core/model-registry.d.ts.map +1 -1
  157. package/dist/core/model-registry.js +5 -1
  158. package/dist/core/model-registry.js.map +1 -1
  159. package/dist/core/package-manager.d.ts +8 -0
  160. package/dist/core/package-manager.d.ts.map +1 -1
  161. package/dist/core/package-manager.js +145 -58
  162. package/dist/core/package-manager.js.map +1 -1
  163. package/dist/core/prompt-templates.d.ts.map +1 -1
  164. package/dist/core/prompt-templates.js +6 -20
  165. package/dist/core/prompt-templates.js.map +1 -1
  166. package/dist/core/resource-loader.d.ts.map +1 -1
  167. package/dist/core/resource-loader.js +38 -31
  168. package/dist/core/resource-loader.js.map +1 -1
  169. package/dist/core/sdk.d.ts.map +1 -1
  170. package/dist/core/sdk.js +9 -4
  171. package/dist/core/sdk.js.map +1 -1
  172. package/dist/core/session-manager.d.ts.map +1 -1
  173. package/dist/core/session-manager.js +32 -24
  174. package/dist/core/session-manager.js.map +1 -1
  175. package/dist/core/settings-manager.d.ts.map +1 -1
  176. package/dist/core/settings-manager.js +8 -15
  177. package/dist/core/settings-manager.js.map +1 -1
  178. package/dist/core/skills.d.ts.map +1 -1
  179. package/dist/core/skills.js +8 -22
  180. package/dist/core/skills.js.map +1 -1
  181. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +5 -4
  182. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -1
  183. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +34 -11
  184. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  185. package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts +1 -0
  186. package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts.map +1 -1
  187. package/dist/core/tools/ask-user-question/state/selectors/contract.js.map +1 -1
  188. package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts.map +1 -1
  189. package/dist/core/tools/ask-user-question/state/selectors/projections.js +1 -0
  190. package/dist/core/tools/ask-user-question/state/selectors/projections.js.map +1 -1
  191. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts +1 -2
  192. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -1
  193. package/dist/core/tools/ask-user-question/state/state-reducer.js +26 -9
  194. package/dist/core/tools/ask-user-question/state/state-reducer.js.map +1 -1
  195. package/dist/core/tools/ask-user-question/state/state.d.ts +4 -0
  196. package/dist/core/tools/ask-user-question/state/state.d.ts.map +1 -1
  197. package/dist/core/tools/ask-user-question/state/state.js.map +1 -1
  198. package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts +1 -0
  199. package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts.map +1 -1
  200. package/dist/core/tools/ask-user-question/view/components/option-list-view.js +1 -0
  201. package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -1
  202. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts +9 -6
  203. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  204. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +28 -7
  205. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  206. package/dist/core/tools/ask-user-question/view/props-adapter.d.ts.map +1 -1
  207. package/dist/core/tools/ask-user-question/view/props-adapter.js +4 -1
  208. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -1
  209. package/dist/core/tools/bash.d.ts.map +1 -1
  210. package/dist/core/tools/bash.js +56 -53
  211. package/dist/core/tools/bash.js.map +1 -1
  212. package/dist/core/tools/edit-diff.d.ts +3 -1
  213. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  214. package/dist/core/tools/edit-diff.js +8 -1
  215. package/dist/core/tools/edit-diff.js.map +1 -1
  216. package/dist/core/tools/edit.d.ts +3 -1
  217. package/dist/core/tools/edit.d.ts.map +1 -1
  218. package/dist/core/tools/edit.js +44 -81
  219. package/dist/core/tools/edit.js.map +1 -1
  220. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  221. package/dist/core/tools/file-mutation-queue.js +27 -12
  222. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  223. package/dist/core/tools/find.d.ts.map +1 -1
  224. package/dist/core/tools/find.js +2 -3
  225. package/dist/core/tools/find.js.map +1 -1
  226. package/dist/core/tools/grep.d.ts.map +1 -1
  227. package/dist/core/tools/grep.js +3 -3
  228. package/dist/core/tools/grep.js.map +1 -1
  229. package/dist/core/tools/ls.d.ts.map +1 -1
  230. package/dist/core/tools/ls.js +5 -5
  231. package/dist/core/tools/ls.js.map +1 -1
  232. package/dist/core/tools/output-accumulator.d.ts +2 -0
  233. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  234. package/dist/core/tools/output-accumulator.js +11 -4
  235. package/dist/core/tools/output-accumulator.js.map +1 -1
  236. package/dist/core/tools/path-utils.d.ts +2 -0
  237. package/dist/core/tools/path-utils.d.ts.map +1 -1
  238. package/dist/core/tools/path-utils.js +39 -21
  239. package/dist/core/tools/path-utils.js.map +1 -1
  240. package/dist/core/tools/read.d.ts.map +1 -1
  241. package/dist/core/tools/read.js +9 -8
  242. package/dist/core/tools/read.js.map +1 -1
  243. package/dist/core/tools/truncate.d.ts.map +1 -1
  244. package/dist/core/tools/truncate.js +12 -2
  245. package/dist/core/tools/truncate.js.map +1 -1
  246. package/dist/core/tools/write.d.ts.map +1 -1
  247. package/dist/core/tools/write.js +20 -35
  248. package/dist/core/tools/write.js.map +1 -1
  249. package/dist/index.d.ts +2 -1
  250. package/dist/index.d.ts.map +1 -1
  251. package/dist/index.js +4 -1
  252. package/dist/index.js.map +1 -1
  253. package/dist/main.d.ts.map +1 -1
  254. package/dist/main.js +5 -6
  255. package/dist/main.js.map +1 -1
  256. package/dist/modes/interactive/chat-input-actions.d.ts +24 -0
  257. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -0
  258. package/dist/modes/interactive/chat-input-actions.js +179 -0
  259. package/dist/modes/interactive/chat-input-actions.js.map +1 -0
  260. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  261. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  262. package/dist/modes/interactive/components/chat-message-renderer.js +14 -3
  263. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  264. package/dist/modes/interactive/components/chat-session-host.d.ts +157 -0
  265. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -0
  266. package/dist/modes/interactive/components/chat-session-host.js +1007 -0
  267. package/dist/modes/interactive/components/chat-session-host.js.map +1 -0
  268. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  269. package/dist/modes/interactive/components/config-selector.js +1 -1
  270. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  271. package/dist/modes/interactive/components/footer.d.ts +1 -0
  272. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  273. package/dist/modes/interactive/components/footer.js +14 -5
  274. package/dist/modes/interactive/components/footer.js.map +1 -1
  275. package/dist/modes/interactive/components/index.d.ts +1 -0
  276. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/index.js +1 -0
  278. package/dist/modes/interactive/components/index.js.map +1 -1
  279. package/dist/modes/interactive/components/login-dialog.d.ts +9 -1
  280. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  281. package/dist/modes/interactive/components/login-dialog.js +29 -4
  282. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  283. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  284. package/dist/modes/interactive/interactive-mode.js +18 -67
  285. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  286. package/dist/utils/child-process.d.ts +1 -0
  287. package/dist/utils/child-process.d.ts.map +1 -1
  288. package/dist/utils/child-process.js +8 -0
  289. package/dist/utils/child-process.js.map +1 -1
  290. package/dist/utils/clipboard-native.d.ts +3 -1
  291. package/dist/utils/clipboard-native.d.ts.map +1 -1
  292. package/dist/utils/clipboard-native.js +14 -8
  293. package/dist/utils/clipboard-native.js.map +1 -1
  294. package/dist/utils/image-resize-core.d.ts +30 -0
  295. package/dist/utils/image-resize-core.d.ts.map +1 -0
  296. package/dist/utils/image-resize-core.js +124 -0
  297. package/dist/utils/image-resize-core.js.map +1 -0
  298. package/dist/utils/image-resize-worker.d.ts +2 -0
  299. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  300. package/dist/utils/image-resize-worker.js +31 -0
  301. package/dist/utils/image-resize-worker.js.map +1 -0
  302. package/dist/utils/image-resize.d.ts +7 -27
  303. package/dist/utils/image-resize.d.ts.map +1 -1
  304. package/dist/utils/image-resize.js +75 -115
  305. package/dist/utils/image-resize.js.map +1 -1
  306. package/dist/utils/paths.d.ts +16 -1
  307. package/dist/utils/paths.d.ts.map +1 -1
  308. package/dist/utils/paths.js +49 -7
  309. package/dist/utils/paths.js.map +1 -1
  310. package/docs/changelog.mdx +29 -0
  311. package/docs/compaction.md +1 -1
  312. package/docs/custom-provider.md +2 -2
  313. package/docs/development.md +1 -1
  314. package/docs/docs.json +98 -143
  315. package/docs/extensions.md +29 -16
  316. package/docs/favicon.svg +29 -0
  317. package/docs/images/interactive-mode.png +0 -0
  318. package/docs/images/tree-view.png +0 -0
  319. package/docs/images/workflow-command.png +0 -0
  320. package/docs/images/workflow-graph.png +0 -0
  321. package/docs/images/workflow-input-picker.png +0 -0
  322. package/docs/images/workflow-list.png +0 -0
  323. package/docs/index.md +10 -1
  324. package/docs/logo.svg +59 -0
  325. package/docs/packages.md +3 -3
  326. package/docs/providers.md +1 -1
  327. package/docs/quickstart.md +98 -2
  328. package/docs/rpc.md +8 -8
  329. package/docs/sdk.md +23 -12
  330. package/docs/sessions.md +1 -1
  331. package/docs/skills.md +15 -1
  332. package/docs/termux.md +11 -1
  333. package/docs/themes.md +6 -6
  334. package/docs/tui.md +18 -18
  335. package/docs/usage.md +1 -1
  336. package/docs/workflows.md +172 -2
  337. package/examples/extensions/subagent/index.ts +2 -1
  338. package/package.json +6 -6
  339. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/SKILL.md +0 -0
  340. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/element-attributes.md +0 -0
  341. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/playwright-tests.md +0 -0
  342. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/request-mocking.md +0 -0
  343. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/running-code.md +0 -0
  344. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/session-management.md +0 -0
  345. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/spec-driven-testing.md +0 -0
  346. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/storage-state.md +0 -0
  347. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/test-generation.md +0 -0
  348. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/tracing.md +0 -0
  349. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/video-recording.md +0 -0
  350. /package/dist/builtin/{workflows → subagents}/skills/tdd/SKILL.md +0 -0
  351. /package/dist/builtin/{workflows → subagents}/skills/tdd/deep-modules.md +0 -0
  352. /package/dist/builtin/{workflows → subagents}/skills/tdd/interface-design.md +0 -0
  353. /package/dist/builtin/{workflows → subagents}/skills/tdd/mocking.md +0 -0
  354. /package/dist/builtin/{workflows → subagents}/skills/tdd/refactoring.md +0 -0
  355. /package/dist/builtin/{workflows → subagents}/skills/tdd/tests.md +0 -0
@@ -2,7 +2,7 @@
2
2
  * Custom `EditorComponent` swapped in via `ctx.ui.setEditorComponent` while
3
3
  * an inline workflow form is active. Owns ALL keystrokes during fill-out:
4
4
  *
5
- * tab / shift+tab — move focus across form fields (NOT editor lines)
5
+ * tab / shift+tab — move focus across form fields and the final Submit action
6
6
  * ↑/↓ — move focus (or caret between logical lines in `text`)
7
7
  * ←/→ — caret nav (text) | choice cycle (select) | flip (bool)
8
8
  * alt/ctrl+←/→ — word movement in text/string/number fields
@@ -16,13 +16,13 @@
16
16
  * space — boolean toggle
17
17
  * enter — newline (text) | otherwise next field
18
18
  * printable ASCII — insert at caret (text/string/number)
19
- * ctrl+x submit form (if valid)
19
+ * submit action ↑/↓ returns to questions; enter submits
20
20
  * esc / ctrl+c — cancel form
21
21
  *
22
22
  * Editor-mode keys (cursor movement, word jumps, deletions) route through
23
23
  * the Pi `KeybindingsManager` injected by the host at factory time, so any
24
24
  * user-configured keybinding overrides surfaces here as well. Form-level
25
- * keys (tab/shift+tab/ctrl+x/esc/ctrl+c) stay as raw byte checks because
25
+ * keys (tab/shift+tab/esc/ctrl+c) stay as raw byte checks because
26
26
  * they are workflow form contract, not Pi-configurable actions.
27
27
  *
28
28
  * On submit/cancel the editor calls back to the orchestrator which:
@@ -47,8 +47,10 @@ import type { GraphTheme } from "./graph-theme.js";
47
47
  import type { WorkflowInputEntry } from "../extension/render-result.js";
48
48
  import type { InlineFormState } from "./inline-form-store.js";
49
49
  import { getForm, touch } from "./inline-form-store.js";
50
+ import { computeInvalid } from "./inputs-picker.js";
50
51
  import {
51
52
  type KeybindingsLike,
53
+ TUI_ACTION,
52
54
  deleteRange,
53
55
  isKeybindingsLike,
54
56
  lineEnd,
@@ -57,14 +59,14 @@ import {
57
59
  wordLeft,
58
60
  wordRight,
59
61
  } from "./keybindings-adapter.js";
60
- import { decodePrintableKey, matchesKey, visibleWidth } from "./text-helpers.js";
62
+ import { decodePrintableKey, Key, matchesKey, visibleWidth } from "./text-helpers.js";
61
63
 
62
64
  export type FormEditorOutcome = "submit" | "cancel";
63
65
 
64
66
  export interface InlineFormEditorOpts {
65
67
  formId: string;
66
68
  theme: GraphTheme;
67
- /** Called when Ctrl+X passes validation or cancel fires. */
69
+ /** Called when the Submit row passes validation or cancel fires. */
68
70
  onExit: (outcome: FormEditorOutcome) => void;
69
71
  /**
70
72
  * Pi's `KeybindingsManager` injected as the third arg of the editor
@@ -433,27 +435,23 @@ export class InlineFormEditor implements PiEditorComponent {
433
435
  // editor actions, so they stay as raw byte checks:
434
436
  // esc (\x1b) — cancel form
435
437
  // ctrl+c (\x03) — cancel form
436
- // ctrl+x submit form
437
- // tab (\t) — focus next field
438
- // shift+tab (\x1b[Z) focus previous field
439
- if (matchesKey(data, "ctrl+c") || matchesKey(data, "escape")) {
438
+ // tab (\t) focus next field / final Submit action
439
+ // shift+tab (\x1b[Z) — focus previous field / final Submit action
440
+ if (matchesKey(data, Key.ctrl("c")) || matchesKey(data, Key.escape)) {
440
441
  this.opts.onExit("cancel");
441
442
  return true;
442
443
  }
443
- if (matchesKey(data, "ctrl+x")) {
444
- if (this.allValid(state)) this.opts.onExit("submit");
445
- else this.focusFirstInvalid(state);
446
- return true;
447
- }
448
- if (matchesKey(data, "tab")) {
444
+ if (matchesKey(data, Key.tab)) {
449
445
  this.moveFocus(state, +1);
450
446
  return true;
451
447
  }
452
- if (matchesKey(data, "shift+tab")) {
448
+ if (matchesKey(data, Key.shift("tab"))) {
453
449
  this.moveFocus(state, -1);
454
450
  return true;
455
451
  }
456
452
 
453
+ if (state.focusedIdx === state.fields.length) return this.handleSubmit(data, state);
454
+
457
455
  const field = state.fields[state.focusedIdx];
458
456
  if (!field) return false;
459
457
 
@@ -462,6 +460,31 @@ export class InlineFormEditor implements PiEditorComponent {
462
460
  return this.handleText(data, field, state);
463
461
  }
464
462
 
463
+ private handleSubmit(data: string, state: InlineFormState): boolean {
464
+ if (matchesAction(this.kb, data, TUI_ACTION.selectUp) || matchesAction(this.kb, data, TUI_ACTION.editorCursorUp)) {
465
+ this.moveFocus(state, -1);
466
+ return true;
467
+ }
468
+ if (matchesAction(this.kb, data, TUI_ACTION.selectDown) || matchesAction(this.kb, data, TUI_ACTION.editorCursorDown)) {
469
+ this.moveFocus(state, +1);
470
+ return true;
471
+ }
472
+ if (
473
+ matchesKey(data, Key.enter) ||
474
+ matchesAction(this.kb, data, TUI_ACTION.selectConfirm) ||
475
+ matchesAction(this.kb, data, TUI_ACTION.inputSubmit)
476
+ ) {
477
+ return this.submitOrFocusInvalid(state);
478
+ }
479
+ return false;
480
+ }
481
+
482
+ private submitOrFocusInvalid(state: InlineFormState): boolean {
483
+ if (this.allValid(state)) this.opts.onExit("submit");
484
+ else this.focusFirstInvalid(state);
485
+ return true;
486
+ }
487
+
465
488
  private handleSelect(
466
489
  data: string,
467
490
  field: WorkflowInputEntry,
@@ -471,22 +494,19 @@ export class InlineFormEditor implements PiEditorComponent {
471
494
  if (choices.length === 0) return false;
472
495
  const cur = state.rawText[field.name] ?? choices[0]!;
473
496
  const i = Math.max(0, choices.indexOf(cur));
474
- if (matchesAction(this.kb, data, "tui.editor.cursorLeft")) {
497
+ if (matchesAction(this.kb, data, TUI_ACTION.selectUp) || matchesAction(this.kb, data, TUI_ACTION.editorCursorLeft)) {
475
498
  state.rawText[field.name] = choices[(i - 1 + choices.length) % choices.length]!;
476
499
  return true;
477
500
  }
478
- if (matchesAction(this.kb, data, "tui.editor.cursorRight") || matchesKey(data, "space")) {
501
+ if (
502
+ matchesAction(this.kb, data, TUI_ACTION.selectDown) ||
503
+ matchesAction(this.kb, data, TUI_ACTION.editorCursorRight) ||
504
+ matchesKey(data, Key.space)
505
+ ) {
479
506
  state.rawText[field.name] = choices[(i + 1) % choices.length]!;
480
507
  return true;
481
508
  }
482
- if (matchesAction(this.kb, data, "tui.editor.cursorUp")) {
483
- this.moveFocus(state, -1);
484
- return true;
485
- }
486
- if (
487
- matchesAction(this.kb, data, "tui.editor.cursorDown") ||
488
- matchesAction(this.kb, data, "tui.input.submit")
489
- ) {
509
+ if (matchesAction(this.kb, data, TUI_ACTION.selectConfirm) || matchesAction(this.kb, data, TUI_ACTION.inputSubmit)) {
490
510
  this.moveFocus(state, +1);
491
511
  return true;
492
512
  }
@@ -499,21 +519,16 @@ export class InlineFormEditor implements PiEditorComponent {
499
519
  state: InlineFormState,
500
520
  ): boolean {
501
521
  if (
502
- matchesKey(data, "space") ||
503
- matchesAction(this.kb, data, "tui.editor.cursorLeft") ||
504
- matchesAction(this.kb, data, "tui.editor.cursorRight")
522
+ matchesKey(data, Key.space) ||
523
+ matchesAction(this.kb, data, TUI_ACTION.selectUp) ||
524
+ matchesAction(this.kb, data, TUI_ACTION.selectDown) ||
525
+ matchesAction(this.kb, data, TUI_ACTION.editorCursorLeft) ||
526
+ matchesAction(this.kb, data, TUI_ACTION.editorCursorRight)
505
527
  ) {
506
528
  state.rawText[field.name] = state.rawText[field.name] === "true" ? "false" : "true";
507
529
  return true;
508
530
  }
509
- if (matchesAction(this.kb, data, "tui.editor.cursorUp")) {
510
- this.moveFocus(state, -1);
511
- return true;
512
- }
513
- if (
514
- matchesAction(this.kb, data, "tui.editor.cursorDown") ||
515
- matchesAction(this.kb, data, "tui.input.submit")
516
- ) {
531
+ if (matchesAction(this.kb, data, TUI_ACTION.selectConfirm) || matchesAction(this.kb, data, TUI_ACTION.inputSubmit)) {
517
532
  this.moveFocus(state, +1);
518
533
  return true;
519
534
  }
@@ -531,7 +546,7 @@ export class InlineFormEditor implements PiEditorComponent {
531
546
 
532
547
  // Vertical navigation — text fields walk between logical lines first,
533
548
  // single-line scalars advance focus immediately.
534
- if (matchesAction(this.kb, data, "tui.editor.cursorUp")) {
549
+ if (matchesAction(this.kb, data, TUI_ACTION.editorCursorUp)) {
535
550
  if (field.type === "text") {
536
551
  const newCaret = caretLineUp(cur, caret);
537
552
  if (newCaret !== null) {
@@ -542,7 +557,7 @@ export class InlineFormEditor implements PiEditorComponent {
542
557
  this.moveFocus(state, -1);
543
558
  return true;
544
559
  }
545
- if (matchesAction(this.kb, data, "tui.editor.cursorDown")) {
560
+ if (matchesAction(this.kb, data, TUI_ACTION.editorCursorDown)) {
546
561
  if (field.type === "text") {
547
562
  const newCaret = caretLineDown(cur, caret);
548
563
  if (newCaret !== null) {
@@ -579,11 +594,11 @@ export class InlineFormEditor implements PiEditorComponent {
579
594
  }
580
595
 
581
596
  // Character cursor movement.
582
- if (matchesAction(this.kb, data, "tui.editor.cursorLeft")) {
597
+ if (matchesAction(this.kb, data, TUI_ACTION.editorCursorLeft)) {
583
598
  state.caret = previousGraphemeOffset(cur, caret);
584
599
  return true;
585
600
  }
586
- if (matchesAction(this.kb, data, "tui.editor.cursorRight")) {
601
+ if (matchesAction(this.kb, data, TUI_ACTION.editorCursorRight)) {
587
602
  state.caret = nextGraphemeOffset(cur, caret);
588
603
  return true;
589
604
  }
@@ -642,7 +657,7 @@ export class InlineFormEditor implements PiEditorComponent {
642
657
  // explicitly equivalent to plain Enter in our form contract; both
643
658
  // insert a newline in text fields and advance focus elsewhere.
644
659
  if (
645
- matchesAction(this.kb, data, "tui.input.submit") ||
660
+ matchesAction(this.kb, data, TUI_ACTION.inputSubmit) ||
646
661
  matchesAction(this.kb, data, "tui.input.newLine")
647
662
  ) {
648
663
  if (field.type === "text") {
@@ -669,48 +684,28 @@ export class InlineFormEditor implements PiEditorComponent {
669
684
  }
670
685
 
671
686
  private moveFocus(state: InlineFormState, delta: number): void {
672
- const n = state.fields.length;
673
- if (n === 0) return;
687
+ const n = state.fields.length + 1;
688
+ if (n <= 1) return;
674
689
  state.focusedIdx = (state.focusedIdx + delta + n) % n;
690
+ if (state.focusedIdx === state.fields.length) {
691
+ state.caret = 0;
692
+ state.submitChoiceIdx = 0;
693
+ return;
694
+ }
675
695
  const next = state.fields[state.focusedIdx]!;
676
696
  state.caret = (state.rawText[next.name] ?? "").length;
677
697
  }
678
698
 
679
699
  private focusFirstInvalid(state: InlineFormState): void {
680
- const idx = state.fields.findIndex((f) => {
681
- const v = state.rawText[f.name] ?? "";
682
- if (f.required && v.trim() === "") return true;
683
- if ((f.type === "number" || f.type === "integer") && v !== "" && !Number.isFinite(Number(v))) {
684
- return true;
685
- }
686
- return f.type === "select" && Boolean(f.choices) && v !== "" && !f.choices!.includes(v);
687
- });
688
- if (idx < 0) return;
700
+ const [idx] = computeInvalid(state.fields, state.rawText);
701
+ if (idx === undefined) return;
702
+ state.submitChoiceIdx = 0;
689
703
  state.focusedIdx = idx;
690
704
  state.caret = (state.rawText[state.fields[idx]!.name] ?? "").length;
691
705
  }
692
706
 
693
707
  private allValid(state: InlineFormState): boolean {
694
- for (const f of state.fields) {
695
- const v = state.rawText[f.name] ?? "";
696
- if (f.required && v.trim() === "") return false;
697
- if (
698
- (f.type === "number" || f.type === "integer") &&
699
- v !== "" &&
700
- !Number.isFinite(Number(v))
701
- ) {
702
- return false;
703
- }
704
- if (
705
- f.type === "select" &&
706
- f.choices &&
707
- v !== "" &&
708
- !f.choices.includes(v)
709
- ) {
710
- return false;
711
- }
712
- }
713
- return true;
708
+ return computeInvalid(state.fields, state.rawText).length === 0;
714
709
  }
715
710
  }
716
711
 
@@ -57,7 +57,6 @@ export type InlineFormResult =
57
57
 
58
58
  export interface OpenInlineFormOpts {
59
59
  workflowName: string;
60
- description?: string;
61
60
  fields: readonly WorkflowInputEntry[];
62
61
  prefilled?: Record<string, unknown>;
63
62
  theme: GraphTheme;
@@ -107,7 +106,7 @@ export function registerInlineFormRenderer(pi: ExtensionAPI, theme: GraphTheme):
107
106
  const state = getForm(formId);
108
107
  if (!state) {
109
108
  // Process restart / map evicted — tombstone the entry.
110
- return `▎ ${message.content ?? "workflow form"} · (snapshot lost)`;
109
+ return ` ${message.content ?? "workflow form"} · (snapshot lost)`;
111
110
  }
112
111
  return {
113
112
  // The card is fully reactive: read fresh state on every render call,
@@ -199,10 +198,10 @@ export async function openInlineInputsForm(
199
198
  const state = createForm({
200
199
  formId,
201
200
  workflowName: opts.workflowName,
202
- description: opts.description,
203
201
  fields: opts.fields,
204
202
  rawText,
205
203
  focusedIdx,
204
+ submitChoiceIdx: 0,
206
205
  caret: (rawText[opts.fields[focusedIdx]!.name] ?? "").length,
207
206
  status: "editing",
208
207
  });
@@ -32,11 +32,12 @@ export type FormStatus = "editing" | "submitted" | "cancelled";
32
32
  export interface InlineFormState {
33
33
  formId: string;
34
34
  workflowName: string;
35
- description?: string;
36
35
  fields: readonly WorkflowInputEntry[];
37
36
  /** Raw string per field; mirrors `inputs-picker.ts` semantics. */
38
37
  rawText: Record<string, string>;
39
38
  focusedIdx: number;
39
+ /** Reserved for older form snapshots; Submit is now a single final action. */
40
+ submitChoiceIdx: number;
40
41
  caret: number;
41
42
  status: FormStatus;
42
43
  /** Tick counter; bumped on every mutation so renderers can hash-dedupe. */
@@ -55,7 +55,6 @@ export type InputsPickerResult =
55
55
 
56
56
  export interface OpenInputsPickerOpts {
57
57
  workflowName: string;
58
- description?: string;
59
58
  fields: WorkflowInputEntry[];
60
59
  /** Prefilled values (e.g. from `key=value` slash args). The form
61
60
  * seeds these into the form so the user doesn't re-type what they typed. */
@@ -78,7 +77,7 @@ export function openInputsPicker(
78
77
  opts: OpenInputsPickerOpts,
79
78
  ): Promise<InputsPickerResult> {
80
79
  return new Promise<InputsPickerResult>((resolve) => {
81
- const { workflowName, description, fields, prefilled, theme } = opts;
80
+ const { workflowName, fields, prefilled, theme } = opts;
82
81
  const custom = ui.custom;
83
82
  if (typeof custom !== "function") {
84
83
  resolve({ kind: "cancel" });
@@ -124,7 +123,6 @@ export function openInputsPicker(
124
123
  width,
125
124
  theme,
126
125
  workflowName,
127
- description,
128
126
  fields,
129
127
  state,
130
128
  cursorOn,