@bastani/atomic 0.8.27 → 0.8.28-alpha.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 (397) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +120 -118
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +2 -2
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/web-access/package.json +1 -1
  7. package/dist/builtin/workflows/CHANGELOG.md +22 -0
  8. package/dist/builtin/workflows/README.md +11 -9
  9. package/dist/builtin/workflows/builtin/open-claude-design.ts +150 -13
  10. package/dist/builtin/workflows/package.json +1 -1
  11. package/dist/builtin/workflows/src/authoring.d.ts +5 -2
  12. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +3 -1
  13. package/dist/builtin/workflows/src/extension/hil-answer-notifications.ts +17 -25
  14. package/dist/builtin/workflows/src/extension/index.ts +133 -18
  15. package/dist/builtin/workflows/src/extension/render-result.ts +22 -2
  16. package/dist/builtin/workflows/src/extension/workflow-schema.ts +3 -3
  17. package/dist/builtin/workflows/src/runs/foreground/executor.ts +210 -16
  18. package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
  19. package/dist/builtin/workflows/src/shared/authoring-contract.d.ts +42 -5
  20. package/dist/builtin/workflows/src/shared/store-types.ts +8 -2
  21. package/dist/builtin/workflows/src/shared/store.ts +51 -0
  22. package/dist/builtin/workflows/src/shared/types.ts +14 -4
  23. package/dist/builtin/workflows/src/tui/chat-surface.ts +32 -33
  24. package/dist/builtin/workflows/src/tui/graph-view.ts +4 -1
  25. package/dist/builtin/workflows/src/tui/prompt-card.ts +6 -0
  26. package/dist/builtin/workflows/src/tui/run-detail.ts +11 -4
  27. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +11 -1
  28. package/dist/builtin/workflows/src/tui/status-list.ts +32 -2
  29. package/dist/cli/args.d.ts +4 -0
  30. package/dist/cli/args.d.ts.map +1 -1
  31. package/dist/cli/args.js +35 -0
  32. package/dist/cli/args.js.map +1 -1
  33. package/dist/cli/project-trust.d.ts +10 -0
  34. package/dist/cli/project-trust.d.ts.map +1 -0
  35. package/dist/cli/project-trust.js +36 -0
  36. package/dist/cli/project-trust.js.map +1 -0
  37. package/dist/cli/startup-ui.d.ts +7 -0
  38. package/dist/cli/startup-ui.d.ts.map +1 -0
  39. package/dist/cli/startup-ui.js +57 -0
  40. package/dist/cli/startup-ui.js.map +1 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +24 -3
  43. package/dist/config.js.map +1 -1
  44. package/dist/core/agent-session-runtime.d.ts +3 -1
  45. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  46. package/dist/core/agent-session-runtime.js +1 -0
  47. package/dist/core/agent-session-runtime.js.map +1 -1
  48. package/dist/core/agent-session-services.d.ts +2 -1
  49. package/dist/core/agent-session-services.d.ts.map +1 -1
  50. package/dist/core/agent-session-services.js +2 -2
  51. package/dist/core/agent-session-services.js.map +1 -1
  52. package/dist/core/agent-session.d.ts +9 -5
  53. package/dist/core/agent-session.d.ts.map +1 -1
  54. package/dist/core/agent-session.js +205 -51
  55. package/dist/core/agent-session.js.map +1 -1
  56. package/dist/core/auth-guidance.d.ts +10 -1
  57. package/dist/core/auth-guidance.d.ts.map +1 -1
  58. package/dist/core/auth-guidance.js +26 -1
  59. package/dist/core/auth-guidance.js.map +1 -1
  60. package/dist/core/auth-storage.d.ts.map +1 -1
  61. package/dist/core/auth-storage.js +4 -3
  62. package/dist/core/auth-storage.js.map +1 -1
  63. package/dist/core/compaction/branch-summarization.d.ts +5 -3
  64. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  65. package/dist/core/compaction/branch-summarization.js +16 -10
  66. package/dist/core/compaction/branch-summarization.js.map +1 -1
  67. package/dist/core/compaction/compaction.d.ts +4 -84
  68. package/dist/core/compaction/compaction.d.ts.map +1 -1
  69. package/dist/core/compaction/compaction.js +20 -502
  70. package/dist/core/compaction/compaction.js.map +1 -1
  71. package/dist/core/compaction/context-compaction.d.ts.map +1 -1
  72. package/dist/core/compaction/context-compaction.js +39 -82
  73. package/dist/core/compaction/context-compaction.js.map +1 -1
  74. package/dist/core/compaction/index.d.ts +1 -1
  75. package/dist/core/compaction/index.d.ts.map +1 -1
  76. package/dist/core/compaction/index.js +1 -1
  77. package/dist/core/compaction/index.js.map +1 -1
  78. package/dist/core/compaction/utils.d.ts +1 -1
  79. package/dist/core/compaction/utils.d.ts.map +1 -1
  80. package/dist/core/compaction/utils.js +1 -1
  81. package/dist/core/compaction/utils.js.map +1 -1
  82. package/dist/core/experimental.d.ts +2 -0
  83. package/dist/core/experimental.d.ts.map +1 -0
  84. package/dist/core/experimental.js +5 -0
  85. package/dist/core/experimental.js.map +1 -0
  86. package/dist/core/export-html/template.js +19 -6
  87. package/dist/core/extensions/index.d.ts +1 -1
  88. package/dist/core/extensions/index.d.ts.map +1 -1
  89. package/dist/core/extensions/index.js.map +1 -1
  90. package/dist/core/extensions/loader.d.ts +1 -1
  91. package/dist/core/extensions/loader.d.ts.map +1 -1
  92. package/dist/core/extensions/loader.js +6 -4
  93. package/dist/core/extensions/loader.js.map +1 -1
  94. package/dist/core/extensions/runner.d.ts +11 -4
  95. package/dist/core/extensions/runner.d.ts.map +1 -1
  96. package/dist/core/extensions/runner.js +53 -3
  97. package/dist/core/extensions/runner.js.map +1 -1
  98. package/dist/core/extensions/types.d.ts +44 -12
  99. package/dist/core/extensions/types.d.ts.map +1 -1
  100. package/dist/core/extensions/types.js.map +1 -1
  101. package/dist/core/footer-data-provider.d.ts +2 -0
  102. package/dist/core/footer-data-provider.d.ts.map +1 -1
  103. package/dist/core/footer-data-provider.js +27 -1
  104. package/dist/core/footer-data-provider.js.map +1 -1
  105. package/dist/core/index.d.ts +2 -1
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js +1 -0
  108. package/dist/core/index.js.map +1 -1
  109. package/dist/core/messages.d.ts +1 -11
  110. package/dist/core/messages.d.ts.map +1 -1
  111. package/dist/core/messages.js +10 -25
  112. package/dist/core/messages.js.map +1 -1
  113. package/dist/core/model-registry.d.ts.map +1 -1
  114. package/dist/core/model-registry.js +64 -7
  115. package/dist/core/model-registry.js.map +1 -1
  116. package/dist/core/model-resolver.d.ts.map +1 -1
  117. package/dist/core/model-resolver.js +1 -0
  118. package/dist/core/model-resolver.js.map +1 -1
  119. package/dist/core/output-guard.d.ts +1 -0
  120. package/dist/core/output-guard.d.ts.map +1 -1
  121. package/dist/core/output-guard.js +52 -22
  122. package/dist/core/output-guard.js.map +1 -1
  123. package/dist/core/package-manager.d.ts +1 -0
  124. package/dist/core/package-manager.d.ts.map +1 -1
  125. package/dist/core/package-manager.js +20 -8
  126. package/dist/core/package-manager.js.map +1 -1
  127. package/dist/core/project-trust.d.ts +15 -0
  128. package/dist/core/project-trust.d.ts.map +1 -0
  129. package/dist/core/project-trust.js +58 -0
  130. package/dist/core/project-trust.js.map +1 -0
  131. package/dist/core/prompt-templates.d.ts +5 -4
  132. package/dist/core/prompt-templates.d.ts.map +1 -1
  133. package/dist/core/prompt-templates.js +30 -29
  134. package/dist/core/prompt-templates.js.map +1 -1
  135. package/dist/core/provider-attribution.d.ts +4 -0
  136. package/dist/core/provider-attribution.d.ts.map +1 -0
  137. package/dist/core/provider-attribution.js +73 -0
  138. package/dist/core/provider-attribution.js.map +1 -0
  139. package/dist/core/provider-display-names.d.ts.map +1 -1
  140. package/dist/core/provider-display-names.js +3 -0
  141. package/dist/core/provider-display-names.js.map +1 -1
  142. package/dist/core/resolve-config-value.d.ts +9 -1
  143. package/dist/core/resolve-config-value.d.ts.map +1 -1
  144. package/dist/core/resolve-config-value.js +134 -11
  145. package/dist/core/resolve-config-value.js.map +1 -1
  146. package/dist/core/resource-loader.d.ts +12 -2
  147. package/dist/core/resource-loader.d.ts.map +1 -1
  148. package/dist/core/resource-loader.js +108 -18
  149. package/dist/core/resource-loader.js.map +1 -1
  150. package/dist/core/sdk.d.ts.map +1 -1
  151. package/dist/core/sdk.js +12 -42
  152. package/dist/core/sdk.js.map +1 -1
  153. package/dist/core/session-manager.d.ts +11 -15
  154. package/dist/core/session-manager.d.ts.map +1 -1
  155. package/dist/core/session-manager.js +111 -111
  156. package/dist/core/session-manager.js.map +1 -1
  157. package/dist/core/settings-manager.d.ts +15 -5
  158. package/dist/core/settings-manager.d.ts.map +1 -1
  159. package/dist/core/settings-manager.js +69 -14
  160. package/dist/core/settings-manager.js.map +1 -1
  161. package/dist/core/slash-commands.d.ts.map +1 -1
  162. package/dist/core/slash-commands.js +1 -0
  163. package/dist/core/slash-commands.js.map +1 -1
  164. package/dist/core/system-prompt.d.ts.map +1 -1
  165. package/dist/core/system-prompt.js +0 -3
  166. package/dist/core/system-prompt.js.map +1 -1
  167. package/dist/core/tools/bash.d.ts.map +1 -1
  168. package/dist/core/tools/bash.js +2 -1
  169. package/dist/core/tools/bash.js.map +1 -1
  170. package/dist/core/tools/edit.d.ts.map +1 -1
  171. package/dist/core/tools/edit.js +7 -10
  172. package/dist/core/tools/edit.js.map +1 -1
  173. package/dist/core/tools/find.d.ts.map +1 -1
  174. package/dist/core/tools/find.js +1 -1
  175. package/dist/core/tools/find.js.map +1 -1
  176. package/dist/core/tools/grep.d.ts.map +1 -1
  177. package/dist/core/tools/grep.js +1 -1
  178. package/dist/core/tools/grep.js.map +1 -1
  179. package/dist/core/tools/ls.d.ts.map +1 -1
  180. package/dist/core/tools/ls.js +1 -1
  181. package/dist/core/tools/ls.js.map +1 -1
  182. package/dist/core/tools/oversized-tool-result.d.ts +53 -0
  183. package/dist/core/tools/oversized-tool-result.d.ts.map +1 -0
  184. package/dist/core/tools/oversized-tool-result.js +206 -0
  185. package/dist/core/tools/oversized-tool-result.js.map +1 -0
  186. package/dist/core/tools/read.d.ts +12 -0
  187. package/dist/core/tools/read.d.ts.map +1 -1
  188. package/dist/core/tools/read.js +99 -34
  189. package/dist/core/tools/read.js.map +1 -1
  190. package/dist/core/tools/render-utils.d.ts +6 -0
  191. package/dist/core/tools/render-utils.d.ts.map +1 -1
  192. package/dist/core/tools/render-utils.js +17 -1
  193. package/dist/core/tools/render-utils.js.map +1 -1
  194. package/dist/core/tools/tool-definition-wrapper.d.ts +6 -0
  195. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  196. package/dist/core/tools/tool-definition-wrapper.js +2 -0
  197. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  198. package/dist/core/tools/tool-limits.d.ts +25 -0
  199. package/dist/core/tools/tool-limits.d.ts.map +1 -0
  200. package/dist/core/tools/tool-limits.js +25 -0
  201. package/dist/core/tools/tool-limits.js.map +1 -0
  202. package/dist/core/tools/write.d.ts.map +1 -1
  203. package/dist/core/tools/write.js +1 -1
  204. package/dist/core/tools/write.js.map +1 -1
  205. package/dist/core/trust-manager.d.ts +31 -0
  206. package/dist/core/trust-manager.d.ts.map +1 -0
  207. package/dist/core/trust-manager.js +196 -0
  208. package/dist/core/trust-manager.js.map +1 -0
  209. package/dist/index.d.ts +12 -7
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +8 -4
  212. package/dist/index.js.map +1 -1
  213. package/dist/main.d.ts.map +1 -1
  214. package/dist/main.js +142 -30
  215. package/dist/main.js.map +1 -1
  216. package/dist/migrations.d.ts +3 -1
  217. package/dist/migrations.d.ts.map +1 -1
  218. package/dist/migrations.js +325 -7
  219. package/dist/migrations.js.map +1 -1
  220. package/dist/modes/index.d.ts +1 -1
  221. package/dist/modes/index.d.ts.map +1 -1
  222. package/dist/modes/index.js.map +1 -1
  223. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/bash-execution.js +2 -2
  225. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  226. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -5
  227. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  228. package/dist/modes/interactive/components/chat-message-renderer.js +5 -9
  229. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  230. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  231. package/dist/modes/interactive/components/chat-session-host.js +0 -3
  232. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  233. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  234. package/dist/modes/interactive/components/footer.js +6 -0
  235. package/dist/modes/interactive/components/footer.js.map +1 -1
  236. package/dist/modes/interactive/components/index.d.ts +1 -1
  237. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  238. package/dist/modes/interactive/components/index.js +1 -1
  239. package/dist/modes/interactive/components/index.js.map +1 -1
  240. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  241. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  242. package/dist/modes/interactive/components/login-dialog.js +9 -16
  243. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  244. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  245. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  246. package/dist/modes/interactive/components/settings-selector.js +20 -0
  247. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  248. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  249. package/dist/modes/interactive/components/tool-execution.js +22 -0
  250. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  251. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  252. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  253. package/dist/modes/interactive/components/trust-selector.js +85 -0
  254. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  255. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/user-message.js +1 -1
  257. package/dist/modes/interactive/components/user-message.js.map +1 -1
  258. package/dist/modes/interactive/interactive-mode.d.ts +9 -0
  259. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  260. package/dist/modes/interactive/interactive-mode.js +134 -36
  261. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  262. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  263. package/dist/modes/interactive/theme/theme.js +10 -0
  264. package/dist/modes/interactive/theme/theme.js.map +1 -1
  265. package/dist/modes/print-mode.d.ts.map +1 -1
  266. package/dist/modes/print-mode.js +1 -0
  267. package/dist/modes/print-mode.js.map +1 -1
  268. package/dist/modes/rpc/rpc-client.d.ts +4 -1
  269. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  270. package/dist/modes/rpc/rpc-client.js +52 -8
  271. package/dist/modes/rpc/rpc-client.js.map +1 -1
  272. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  273. package/dist/modes/rpc/rpc-mode.js +24 -5
  274. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  275. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  276. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  277. package/dist/modes/rpc/rpc-types.js.map +1 -1
  278. package/dist/package-manager-cli.d.ts +6 -2
  279. package/dist/package-manager-cli.d.ts.map +1 -1
  280. package/dist/package-manager-cli.js +104 -10
  281. package/dist/package-manager-cli.js.map +1 -1
  282. package/dist/utils/changelog.d.ts +1 -0
  283. package/dist/utils/changelog.d.ts.map +1 -1
  284. package/dist/utils/changelog.js +72 -0
  285. package/dist/utils/changelog.js.map +1 -1
  286. package/dist/utils/deprecation.d.ts +4 -0
  287. package/dist/utils/deprecation.d.ts.map +1 -0
  288. package/dist/utils/deprecation.js +13 -0
  289. package/dist/utils/deprecation.js.map +1 -0
  290. package/dist/utils/git.d.ts.map +1 -1
  291. package/dist/utils/git.js +54 -22
  292. package/dist/utils/git.js.map +1 -1
  293. package/dist/utils/json.d.ts +3 -0
  294. package/dist/utils/json.d.ts.map +1 -0
  295. package/dist/utils/json.js +7 -0
  296. package/dist/utils/json.js.map +1 -0
  297. package/dist/utils/open-browser.d.ts +9 -0
  298. package/dist/utils/open-browser.d.ts.map +1 -0
  299. package/dist/utils/open-browser.js +22 -0
  300. package/dist/utils/open-browser.js.map +1 -0
  301. package/docs/compaction.md +210 -181
  302. package/docs/containerization.md +111 -0
  303. package/docs/custom-provider.md +9 -9
  304. package/docs/development.md +1 -1
  305. package/docs/docs.json +2 -0
  306. package/docs/extensions.md +71 -24
  307. package/docs/index.md +2 -0
  308. package/docs/json.md +3 -4
  309. package/docs/models.md +10 -10
  310. package/docs/packages.md +1 -1
  311. package/docs/prompt-templates.md +9 -2
  312. package/docs/providers.md +18 -5
  313. package/docs/quickstart.md +1 -0
  314. package/docs/rpc.md +3 -2
  315. package/docs/sdk.md +5 -0
  316. package/docs/security.md +56 -0
  317. package/docs/session-format.md +14 -23
  318. package/docs/sessions.md +11 -1
  319. package/docs/settings.md +23 -9
  320. package/docs/skills.md +1 -1
  321. package/docs/terminal-setup.md +44 -2
  322. package/docs/themes.md +1 -1
  323. package/docs/tmux.md +4 -2
  324. package/docs/tui.md +14 -5
  325. package/docs/usage.md +17 -3
  326. package/docs/workflows.md +11 -9
  327. package/examples/README.md +1 -1
  328. package/examples/extensions/README.md +9 -6
  329. package/examples/extensions/bash-spawn-hook.ts +1 -1
  330. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  331. package/examples/extensions/claude-rules.ts +1 -1
  332. package/examples/extensions/commands.ts +1 -1
  333. package/examples/extensions/custom-compaction.ts +43 -106
  334. package/examples/extensions/custom-header.ts +1 -1
  335. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  336. package/examples/extensions/custom-provider-anthropic/package-lock.json +4 -4
  337. package/examples/extensions/custom-provider-anthropic/package.json +6 -6
  338. package/examples/extensions/custom-provider-gitlab-duo/index.ts +55 -4
  339. package/examples/extensions/custom-provider-gitlab-duo/package.json +3 -3
  340. package/examples/extensions/doom-overlay/README.md +1 -1
  341. package/examples/extensions/doom-overlay/index.ts +2 -2
  342. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  343. package/examples/extensions/gondolin/index.ts +523 -0
  344. package/examples/extensions/gondolin/package-lock.json +185 -0
  345. package/examples/extensions/gondolin/package.json +19 -0
  346. package/examples/extensions/handoff.ts +7 -45
  347. package/examples/extensions/hidden-thinking-label.ts +1 -1
  348. package/examples/extensions/inline-bash.ts +2 -2
  349. package/examples/extensions/input-transform-streaming.ts +39 -0
  350. package/examples/extensions/input-transform.ts +3 -3
  351. package/examples/extensions/interactive-shell.ts +2 -2
  352. package/examples/extensions/mac-system-theme.ts +2 -2
  353. package/examples/extensions/minimal-mode.ts +1 -1
  354. package/examples/extensions/modal-editor.ts +1 -1
  355. package/examples/extensions/model-status.ts +1 -1
  356. package/examples/extensions/overlay-qa-tests.ts +198 -179
  357. package/examples/extensions/overlay-test.ts +1 -1
  358. package/examples/extensions/pirate.ts +1 -1
  359. package/examples/extensions/preset.ts +14 -12
  360. package/examples/extensions/project-trust.ts +64 -0
  361. package/examples/extensions/prompt-customizer.ts +1 -1
  362. package/examples/extensions/qna.ts +1 -1
  363. package/examples/extensions/question.ts +1 -1
  364. package/examples/extensions/questionnaire.ts +1 -1
  365. package/examples/extensions/rainbow-editor.ts +1 -1
  366. package/examples/extensions/sandbox/index.ts +16 -14
  367. package/examples/extensions/sandbox/package-lock.json +90 -90
  368. package/examples/extensions/sandbox/package.json +17 -17
  369. package/examples/extensions/snake.ts +1 -1
  370. package/examples/extensions/space-invaders.ts +1 -1
  371. package/examples/extensions/ssh.ts +2 -2
  372. package/examples/extensions/subagent/README.md +13 -13
  373. package/examples/extensions/subagent/agents.ts +4 -2
  374. package/examples/extensions/subagent/index.ts +6 -6
  375. package/examples/extensions/summarize.ts +1 -1
  376. package/examples/extensions/tic-tac-toe.ts +1 -1
  377. package/examples/extensions/titlebar-spinner.ts +1 -1
  378. package/examples/extensions/todo.ts +1 -1
  379. package/examples/extensions/tool-override.ts +1 -1
  380. package/examples/extensions/tools.ts +6 -1
  381. package/examples/extensions/trigger-compact.ts +5 -4
  382. package/examples/extensions/with-deps/package-lock.json +4 -4
  383. package/examples/extensions/with-deps/package.json +7 -7
  384. package/examples/extensions/working-indicator.ts +4 -4
  385. package/examples/extensions/working-message-test.ts +1 -1
  386. package/examples/sdk/01-minimal.ts +1 -1
  387. package/examples/sdk/03-custom-prompt.ts +1 -1
  388. package/examples/sdk/04-skills.ts +1 -1
  389. package/examples/sdk/06-extensions.ts +2 -2
  390. package/examples/sdk/08-prompt-templates.ts +1 -1
  391. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  392. package/examples/sdk/README.md +2 -2
  393. package/package.json +8 -8
  394. package/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  395. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  396. package/dist/modes/interactive/components/compaction-summary-message.js +0 -43
  397. package/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
@@ -5,6 +5,7 @@
5
5
  import * as fs from "node:fs";
6
6
  import * as os from "node:os";
7
7
  import * as path from "node:path";
8
+ import chalk from "chalk";
8
9
  import { getProviders, } from "@earendil-works/pi-ai";
9
10
  import { CombinedAutocompleteProvider, Container, fuzzyFilter, getCapabilities, hyperlink, Loader, Markdown, matchesKey, ProcessTerminal, Spacer, setKeybindings, Text, TruncatedText, TUI, visibleWidth, } from "@earendil-works/pi-tui";
10
11
  import { spawn, spawnSync } from "child_process";
@@ -14,7 +15,6 @@ import { pickWhimsicalWorkingMessage } from "./whimsical-messages.js";
14
15
  import { SessionImportFileNotFoundError, } from "../../core/agent-session-runtime.js";
15
16
  import { FooterDataProvider, } from "../../core/footer-data-provider.js";
16
17
  import { KeybindingsManager, } from "../../core/keybindings.js";
17
- import { createCompactionSummaryMessage } from "../../core/messages.js";
18
18
  import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScope, } from "../../core/model-resolver.js";
19
19
  import { formatCodexFastModeModelLabel, hasSupportedCodexFastModeModel, shouldApplyCodexFastMode, } from "../../core/codex-fast-mode.js";
20
20
  import { configureHttpDispatcher } from "../../core/http-dispatcher.js";
@@ -24,7 +24,7 @@ import { formatMissingSessionCwdPrompt, MissingSessionCwdError, } from "../../co
24
24
  import { SessionManager, } from "../../core/session-manager.js";
25
25
  import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
26
26
  import { isInstallTelemetryEnabled } from "../../core/telemetry.js";
27
- import { getChangelogPath, getEntriesForVersion, getNewEntries, parseChangelog, } from "../../utils/changelog.js";
27
+ import { getChangelogPath, getEntriesForVersion, getNewEntries, normalizeChangelogLinks, parseChangelog, } from "../../utils/changelog.js";
28
28
  import { copyToClipboard } from "../../utils/clipboard.js";
29
29
  import { combineQueuedMessagesForEditor, openExternalEditorForText, pasteClipboardImageToEditor, } from "./chat-input-actions.js";
30
30
  import { parseGitUrl } from "../../utils/git.js";
@@ -41,7 +41,6 @@ import { BorderedLoader } from "./components/bordered-loader.js";
41
41
  import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
42
42
  import { chatEntriesFromAgentMessages, renderChatMessageEntry, } from "./components/chat-message-renderer.js";
43
43
  import { addChatTranscriptEntry } from "./components/chat-transcript.js";
44
- import { CompactionSummaryMessageComponent } from "./components/compaction-summary-message.js";
45
44
  import { ContextCompactionSummaryMessageComponent } from "./components/context-compaction-summary-message.js";
46
45
  import { CountdownTimer } from "./components/countdown-timer.js";
47
46
  import { CustomEditor } from "./components/custom-editor.js";
@@ -65,6 +64,8 @@ import { SettingsSelectorComponent } from "./components/settings-selector.js";
65
64
  import { SkillInvocationMessageComponent } from "./components/skill-invocation-message.js";
66
65
  import { ToolExecutionComponent } from "./components/tool-execution.js";
67
66
  import { TreeSelectorComponent } from "./components/tree-selector.js";
67
+ import { TrustSelectorComponent } from "./components/trust-selector.js";
68
+ import { hasProjectConfigDir, ProjectTrustStore } from "../../core/trust-manager.js";
68
69
  import { UserMessageComponent } from "./components/user-message.js";
69
70
  import { UserMessageSelectorComponent } from "./components/user-message-selector.js";
70
71
  import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, initTheme, onThemeChange, setRegisteredThemes, setTheme, setThemeInstance, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
@@ -89,13 +90,6 @@ class ExpandableText extends Text {
89
90
  this.setText(this.expanded ? this.getExpandedText() : this.getCollapsedText());
90
91
  }
91
92
  }
92
- function isContextCompactionResult(result) {
93
- return (typeof result === "object" &&
94
- result !== null &&
95
- "stats" in result &&
96
- "deletedTargets" in result &&
97
- "protectedEntryIds" in result);
98
- }
99
93
  const DEAD_TERMINAL_ERROR_CODES = new Set(["EIO", "EPIPE", "ENOTCONN"]);
100
94
  function isDeadTerminalError(error) {
101
95
  if (!error || typeof error !== "object" || !("code" in error)) {
@@ -115,6 +109,27 @@ function isUnknownModel(model) {
115
109
  model.id === "unknown" &&
116
110
  model.api === "unknown");
117
111
  }
112
+ function quoteIfNeeded(value) {
113
+ if (value.length > 0 && !/[^a-zA-Z0-9_\-./~:@]/.test(value)) {
114
+ return value;
115
+ }
116
+ return `'${value.replace(/'/g, `'\\''`)}'`;
117
+ }
118
+ export function formatResumeCommand(sessionManager) {
119
+ if (!process.stdout.isTTY)
120
+ return undefined;
121
+ if (!sessionManager.isPersisted())
122
+ return undefined;
123
+ const sessionFile = sessionManager.getSessionFile();
124
+ if (!sessionFile || !fs.existsSync(sessionFile))
125
+ return undefined;
126
+ const args = [APP_NAME];
127
+ if (!sessionManager.usesDefaultSessionDir()) {
128
+ args.push("--session-dir", quoteIfNeeded(sessionManager.getSessionDir()));
129
+ }
130
+ args.push("--session", sessionManager.getSessionId());
131
+ return args.join(" ");
132
+ }
118
133
  function hasDefaultModelProvider(providerId) {
119
134
  return providerId in defaultModelPerProvider;
120
135
  }
@@ -146,6 +161,7 @@ export class InteractiveMode {
146
161
  constructor(runtimeHost, options = {}) {
147
162
  this.autocompleteProviderWrappers = [];
148
163
  this.isInitialized = false;
164
+ this.pendingUserInputs = [];
149
165
  this.loadingAnimation = undefined;
150
166
  this.workingMessage = undefined;
151
167
  this.workingVisible = true;
@@ -209,6 +225,7 @@ export class InteractiveMode {
209
225
  */
210
226
  this.isShuttingDown = false;
211
227
  this.options = options;
228
+ this.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;
212
229
  this.runtimeHost = runtimeHost;
213
230
  this.runtimeHost.setBeforeSessionInvalidate(() => {
214
231
  this.resetExtensionUI();
@@ -648,7 +665,7 @@ export class InteractiveMode {
648
665
  if (currentEntries.length > 0) {
649
666
  this.settingsManager.setLastChangelogVersion(VERSION);
650
667
  this.reportInstallTelemetry(VERSION);
651
- return currentEntries.map((e) => e.content).join("\n\n");
668
+ return currentEntries.map((e) => normalizeChangelogLinks(e.content, e)).join("\n\n");
652
669
  }
653
670
  return undefined;
654
671
  }
@@ -1245,6 +1262,7 @@ export class InteractiveMode {
1245
1262
  const uiContext = this.createExtensionUIContext();
1246
1263
  await this.session.bindExtensions({
1247
1264
  uiContext,
1265
+ mode: "tui",
1248
1266
  commandContextActions: {
1249
1267
  waitForIdle: () => this.session.agent.waitForIdle(),
1250
1268
  newSession: async (options) => {
@@ -1381,12 +1399,14 @@ export class InteractiveMode {
1381
1399
  // Create a context for shortcut handlers
1382
1400
  const createContext = () => ({
1383
1401
  ui: this.createExtensionUIContext(),
1402
+ mode: "tui",
1384
1403
  hasUI: true,
1385
1404
  cwd: this.sessionManager.getCwd(),
1386
1405
  sessionManager: this.sessionManager,
1387
1406
  modelRegistry: this.session.modelRegistry,
1388
1407
  model: this.session.model,
1389
1408
  isIdle: () => !this.session.isStreaming,
1409
+ isProjectTrusted: () => this.session.settingsManager.isProjectTrusted(),
1390
1410
  signal: this.session.agent.signal,
1391
1411
  abort: () => this.session.abort(),
1392
1412
  hasPendingMessages: () => this.session.pendingMessageCount > 0,
@@ -1397,7 +1417,7 @@ export class InteractiveMode {
1397
1417
  compact: (options) => {
1398
1418
  void (async () => {
1399
1419
  try {
1400
- const result = await this.session.compact(options?.customInstructions);
1420
+ const result = await this.session.compact();
1401
1421
  options?.onComplete?.(result);
1402
1422
  }
1403
1423
  catch (error) {
@@ -1688,6 +1708,20 @@ export class InteractiveMode {
1688
1708
  }
1689
1709
  this.extensionTerminalInputUnsubscribers.clear();
1690
1710
  }
1711
+ createProjectTrustContext(cwd) {
1712
+ const ui = this.createExtensionUIContext();
1713
+ return {
1714
+ cwd,
1715
+ mode: "tui",
1716
+ hasUI: true,
1717
+ ui: {
1718
+ select: ui.select,
1719
+ confirm: ui.confirm,
1720
+ input: ui.input,
1721
+ notify: ui.notify,
1722
+ },
1723
+ };
1724
+ }
1691
1725
  /**
1692
1726
  * Create the ExtensionUIContext for extensions.
1693
1727
  */
@@ -2242,6 +2276,11 @@ export class InteractiveMode {
2242
2276
  this.editor.setText("");
2243
2277
  return;
2244
2278
  }
2279
+ if (text === "/trust") {
2280
+ this.showTrustSelector();
2281
+ this.editor.setText("");
2282
+ return;
2283
+ }
2245
2284
  if (text === "/login") {
2246
2285
  this.showOAuthSelector("login");
2247
2286
  this.editor.setText("");
@@ -2343,6 +2382,9 @@ export class InteractiveMode {
2343
2382
  if (this.onInputCallback) {
2344
2383
  this.onInputCallback(text);
2345
2384
  }
2385
+ else {
2386
+ this.pendingUserInputs.push(text);
2387
+ }
2346
2388
  this.editor.addToHistory?.(text);
2347
2389
  };
2348
2390
  }
@@ -2595,12 +2637,7 @@ export class InteractiveMode {
2595
2637
  else if (event.result) {
2596
2638
  this.chatContainer.clear();
2597
2639
  this.rebuildChatFromMessages();
2598
- if (isContextCompactionResult(event.result)) {
2599
- this.addContextCompactionSummaryToChat(event.result);
2600
- }
2601
- else {
2602
- this.addMessageToChat(createCompactionSummaryMessage(event.result.summary, event.result.tokensBefore, new Date().toISOString()));
2603
- }
2640
+ this.addContextCompactionSummaryToChat(event.result);
2604
2641
  this.footer.invalidate();
2605
2642
  }
2606
2643
  else if (event.errorMessage) {
@@ -2787,13 +2824,6 @@ export class InteractiveMode {
2787
2824
  }
2788
2825
  break;
2789
2826
  }
2790
- case "compactionSummary": {
2791
- this.chatContainer.addChild(new Spacer(1));
2792
- const component = new CompactionSummaryMessageComponent(message, this.getMarkdownThemeWithSettings());
2793
- component.setExpanded(this.toolOutputExpanded);
2794
- this.chatContainer.addChild(component);
2795
- break;
2796
- }
2797
2827
  case "branchSummary": {
2798
2828
  this.chatContainer.addChild(new Spacer(1));
2799
2829
  const component = new BranchSummaryMessageComponent(message, this.getMarkdownThemeWithSettings());
@@ -2838,10 +2868,8 @@ export class InteractiveMode {
2838
2868
  // Tool results are rendered inline with tool calls, handled separately
2839
2869
  break;
2840
2870
  }
2841
- default: {
2842
- const _exhaustive = message;
2843
- void _exhaustive;
2844
- }
2871
+ default:
2872
+ break;
2845
2873
  }
2846
2874
  }
2847
2875
  /**
@@ -2886,6 +2914,10 @@ export class InteractiveMode {
2886
2914
  }
2887
2915
  }
2888
2916
  async getUserInput() {
2917
+ const queuedInput = this.pendingUserInputs.shift();
2918
+ if (queuedInput !== undefined) {
2919
+ return queuedInput;
2920
+ }
2889
2921
  return new Promise((resolve) => {
2890
2922
  this.onInputCallback = (text) => {
2891
2923
  this.onInputCallback = undefined;
@@ -2915,16 +2947,28 @@ export class InteractiveMode {
2915
2947
  // Only called when editor is empty (enforced by CustomEditor)
2916
2948
  void this.shutdown();
2917
2949
  }
2918
- async shutdown() {
2950
+ async shutdown(options) {
2919
2951
  if (this.isShuttingDown)
2920
2952
  return;
2921
2953
  this.isShuttingDown = true;
2922
2954
  this.unregisterSignalHandlers();
2955
+ if (options?.fromSignal) {
2956
+ await this.runtimeHost.dispose();
2957
+ // Drain any in-flight Kitty key release events before stopping.
2958
+ // This prevents escape sequences from leaking to the parent shell over slow SSH.
2959
+ await this.ui.terminal.drainInput(1000);
2960
+ this.stop();
2961
+ process.exit(0);
2962
+ }
2923
2963
  // Drain any in-flight Kitty key release events before stopping.
2924
2964
  // This prevents escape sequences from leaking to the parent shell over slow SSH.
2925
2965
  await this.ui.terminal.drainInput(1000);
2926
2966
  this.stop();
2927
2967
  await this.runtimeHost.dispose();
2968
+ const resumeCommand = formatResumeCommand(this.sessionManager);
2969
+ if (resumeCommand) {
2970
+ process.stdout.write(`${chalk.dim("To resume this session:")} ${resumeCommand}\n`);
2971
+ }
2928
2972
  process.exit(0);
2929
2973
  }
2930
2974
  emergencyTerminalExit() {
@@ -2983,11 +3027,8 @@ export class InteractiveMode {
2983
3027
  }
2984
3028
  for (const signal of signals) {
2985
3029
  const handler = () => {
2986
- if (signal === "SIGHUP") {
2987
- this.emergencyTerminalExit();
2988
- }
2989
3030
  killTrackedDetachedChildren();
2990
- void this.shutdown();
3031
+ void this.shutdown({ fromSignal: true });
2991
3032
  };
2992
3033
  process.prependListener(signal, handler);
2993
3034
  this.signalCleanupHandlers.push(() => process.off(signal, handler));
@@ -3461,6 +3502,7 @@ export class InteractiveMode {
3461
3502
  editorPaddingX: this.settingsManager.getEditorPaddingX(),
3462
3503
  autocompleteMaxVisible: this.settingsManager.getAutocompleteMaxVisible(),
3463
3504
  quietStartup: this.settingsManager.getQuietStartup(),
3505
+ defaultProjectTrust: this.settingsManager.getDefaultProjectTrust(),
3464
3506
  clearOnShrink: this.settingsManager.getClearOnShrink(),
3465
3507
  showTerminalProgress: this.settingsManager.getShowTerminalProgress(),
3466
3508
  warnings: this.settingsManager.getWarnings(),
@@ -3549,6 +3591,9 @@ export class InteractiveMode {
3549
3591
  onQuietStartupChange: (enabled) => {
3550
3592
  this.settingsManager.setQuietStartup(enabled);
3551
3593
  },
3594
+ onDefaultProjectTrustChange: (defaultProjectTrust) => {
3595
+ this.settingsManager.setDefaultProjectTrust(defaultProjectTrust);
3596
+ },
3552
3597
  onDoubleEscapeActionChange: (action) => {
3553
3598
  this.settingsManager.setDoubleEscapeAction(action);
3554
3599
  },
@@ -3809,6 +3854,51 @@ export class InteractiveMode {
3809
3854
  this.showError(error instanceof Error ? error.message : String(error));
3810
3855
  }
3811
3856
  }
3857
+ maybeSaveImplicitProjectTrustAfterReload() {
3858
+ const cwd = this.sessionManager.getCwd();
3859
+ if (this.autoTrustOnReloadCwd !== cwd) {
3860
+ return false;
3861
+ }
3862
+ if (!this.settingsManager.isProjectTrusted() || !hasProjectConfigDir(cwd)) {
3863
+ return false;
3864
+ }
3865
+ const trustStore = new ProjectTrustStore(this.runtimeHost.services.agentDir);
3866
+ try {
3867
+ if (trustStore.get(cwd) !== null) {
3868
+ this.autoTrustOnReloadCwd = undefined;
3869
+ return false;
3870
+ }
3871
+ trustStore.set(cwd, true);
3872
+ this.autoTrustOnReloadCwd = undefined;
3873
+ return true;
3874
+ }
3875
+ catch (error) {
3876
+ this.showWarning(`Could not save project trust after reload: ${error instanceof Error ? error.message : String(error)}`);
3877
+ return false;
3878
+ }
3879
+ }
3880
+ showTrustSelector() {
3881
+ const cwd = this.sessionManager.getCwd();
3882
+ const trustStore = new ProjectTrustStore(this.runtimeHost.services.agentDir);
3883
+ const savedDecision = trustStore.getEntry(cwd);
3884
+ this.showSelector((done) => {
3885
+ const selector = new TrustSelectorComponent({
3886
+ cwd,
3887
+ savedDecision,
3888
+ projectTrusted: this.settingsManager.isProjectTrusted(),
3889
+ onSelect: (selection) => {
3890
+ trustStore.setMany(selection.updates);
3891
+ done();
3892
+ this.showStatus(`Saved trust decision: ${selection.trusted ? "trusted" : "untrusted"}. Restart ${APP_NAME} for this to take effect.`);
3893
+ },
3894
+ onCancel: () => {
3895
+ done();
3896
+ this.ui.requestRender();
3897
+ },
3898
+ });
3899
+ return { component: selector, focus: selector };
3900
+ });
3901
+ }
3812
3902
  showTreeSelector(initialSelectedId) {
3813
3903
  const tree = this.sessionManager.getTree();
3814
3904
  const realLeafId = this.sessionManager.getLeafId();
@@ -3909,7 +3999,9 @@ export class InteractiveMode {
3909
3999
  }
3910
4000
  showSessionSelector() {
3911
4001
  this.showSelector((done) => {
3912
- const selector = new SessionSelectorComponent((onProgress) => SessionManager.list(this.sessionManager.getCwd(), this.sessionManager.getSessionDir(), onProgress), SessionManager.listAll, async (sessionPath) => {
4002
+ const selector = new SessionSelectorComponent((onProgress) => SessionManager.list(this.sessionManager.getCwd(), this.sessionManager.getSessionDir(), onProgress), (onProgress) => this.sessionManager.usesDefaultSessionDir()
4003
+ ? SessionManager.listAll(onProgress)
4004
+ : SessionManager.listAll(this.sessionManager.getSessionDir(), onProgress), async (sessionPath) => {
3913
4005
  done();
3914
4006
  await this.handleResumeSession(sessionPath);
3915
4007
  }, () => {
@@ -3940,6 +4032,7 @@ export class InteractiveMode {
3940
4032
  try {
3941
4033
  const result = await this.runtimeHost.switchSession(sessionPath, {
3942
4034
  withSession: options?.withSession,
4035
+ projectTrustContextFactory: (cwd) => this.createProjectTrustContext(cwd),
3943
4036
  });
3944
4037
  if (result.cancelled) {
3945
4038
  return result;
@@ -3958,6 +4051,7 @@ export class InteractiveMode {
3958
4051
  const result = await this.runtimeHost.switchSession(sessionPath, {
3959
4052
  cwdOverride: selectedCwd,
3960
4053
  withSession: options?.withSession,
4054
+ projectTrustContextFactory: (cwd) => this.createProjectTrustContext(cwd),
3961
4055
  });
3962
4056
  if (result.cancelled) {
3963
4057
  return result;
@@ -4364,10 +4458,14 @@ export class InteractiveMode {
4364
4458
  this.setupExtensionShortcuts(runner);
4365
4459
  this.rebuildChatFromMessages();
4366
4460
  dismissReloadBox(this.editor);
4461
+ const savedImplicitProjectTrust = this.maybeSaveImplicitProjectTrustAfterReload();
4367
4462
  this.showLoadedResources({
4368
4463
  force: false,
4369
4464
  showDiagnosticsWhenQuiet: true,
4370
4465
  });
4466
+ if (savedImplicitProjectTrust) {
4467
+ this.showStatus("Saved project trust for future sessions");
4468
+ }
4371
4469
  const modelsJsonError = this.session.modelRegistry.getError();
4372
4470
  if (modelsJsonError) {
4373
4471
  this.showError(`models.json error: ${modelsJsonError}`);
@@ -4629,7 +4727,7 @@ export class InteractiveMode {
4629
4727
  const changelogMarkdown = allEntries.length > 0
4630
4728
  ? allEntries
4631
4729
  .reverse()
4632
- .map((e) => e.content)
4730
+ .map((e) => normalizeChangelogLinks(e.content, e))
4633
4731
  .join("\n\n")
4634
4732
  : "No changelog entries found.";
4635
4733
  this.chatContainer.addChild(new Spacer(1));