@bastani/atomic 0.9.5-alpha.1 → 0.9.5-alpha.10

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 (754) hide show
  1. package/CHANGELOG.md +124 -2
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/cursor/src/model-mapper.ts +6 -3
  6. package/dist/builtin/intercom/CHANGELOG.md +31 -0
  7. package/dist/builtin/intercom/README.md +29 -21
  8. package/dist/builtin/intercom/broker/broker.ts +9 -120
  9. package/dist/builtin/intercom/broker/client.ts +29 -54
  10. package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
  11. package/dist/builtin/intercom/broker/paths.ts +42 -5
  12. package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
  13. package/dist/builtin/intercom/broker/send-handler.ts +106 -0
  14. package/dist/builtin/intercom/broker/send-signature.ts +37 -0
  15. package/dist/builtin/intercom/broker/spawn.ts +78 -10
  16. package/dist/builtin/intercom/config.ts +6 -3
  17. package/dist/builtin/intercom/contact-supervisor-tool.ts +6 -4
  18. package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
  19. package/dist/builtin/intercom/index-heavy.ts +50 -54
  20. package/dist/builtin/intercom/index.ts +320 -272
  21. package/dist/builtin/intercom/intercom-tool.ts +9 -3
  22. package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
  23. package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
  24. package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
  25. package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
  26. package/dist/builtin/intercom/lifecycle.ts +37 -20
  27. package/dist/builtin/intercom/package.json +12 -6
  28. package/dist/builtin/intercom/reply-routing.ts +17 -0
  29. package/dist/builtin/intercom/result-renderers.ts +1 -1
  30. package/dist/builtin/intercom/subagent-relay.ts +58 -12
  31. package/dist/builtin/intercom/types.ts +3 -3
  32. package/dist/builtin/intercom/ui/compose.ts +2 -2
  33. package/dist/builtin/intercom/ui/inline-message.ts +2 -2
  34. package/dist/builtin/intercom/ui/session-list.ts +2 -2
  35. package/dist/builtin/mcp/CHANGELOG.md +23 -0
  36. package/dist/builtin/mcp/OAUTH.md +1 -0
  37. package/dist/builtin/mcp/README.md +10 -6
  38. package/dist/builtin/mcp/apps-cancellation.ts +32 -0
  39. package/dist/builtin/mcp/call-tool-result.ts +9 -0
  40. package/dist/builtin/mcp/caller-wait.ts +50 -0
  41. package/dist/builtin/mcp/command-registration.ts +82 -0
  42. package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
  43. package/dist/builtin/mcp/direct-tools.ts +40 -255
  44. package/dist/builtin/mcp/host-html-template.ts +4 -2
  45. package/dist/builtin/mcp/index.ts +274 -239
  46. package/dist/builtin/mcp/init.ts +96 -126
  47. package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
  48. package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
  49. package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
  50. package/dist/builtin/mcp/metadata-hydration.ts +52 -0
  51. package/dist/builtin/mcp/package.json +3 -3
  52. package/dist/builtin/mcp/proxy-auth.ts +4 -4
  53. package/dist/builtin/mcp/proxy-call.ts +111 -40
  54. package/dist/builtin/mcp/proxy-connect.ts +35 -15
  55. package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
  56. package/dist/builtin/mcp/proxy-modes.ts +3 -3
  57. package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
  58. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  59. package/dist/builtin/mcp/state-lease.ts +12 -0
  60. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  61. package/dist/builtin/mcp/ui-server.ts +8 -8
  62. package/dist/builtin/mcp/ui-session.ts +9 -18
  63. package/dist/builtin/subagents/CHANGELOG.md +60 -0
  64. package/dist/builtin/subagents/README.md +30 -29
  65. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  66. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  67. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  68. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  69. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  70. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  71. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  72. package/dist/builtin/subagents/agents/debugger.md +2 -2
  73. package/dist/builtin/subagents/agents/worker.md +2 -2
  74. package/dist/builtin/subagents/package.json +5 -5
  75. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  76. package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
  77. package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
  78. package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
  79. package/dist/builtin/subagents/src/extension/index.ts +289 -320
  80. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
  81. package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
  82. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  83. package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
  84. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
  85. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
  86. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
  87. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
  88. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
  89. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
  90. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
  91. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
  92. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
  93. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
  94. package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
  95. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
  96. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
  97. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
  98. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
  99. package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
  100. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
  101. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
  102. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
  103. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
  104. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
  105. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
  106. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  107. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  108. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  109. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
  110. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
  111. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
  112. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
  113. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
  114. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
  115. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
  116. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
  117. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
  118. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
  119. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
  120. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
  121. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  122. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
  123. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
  124. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
  125. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
  126. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
  127. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
  128. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
  129. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
  130. package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
  131. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
  132. package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
  133. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
  134. package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
  135. package/dist/builtin/subagents/src/shared/settings.ts +20 -10
  136. package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
  137. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  138. package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
  139. package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
  140. package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
  141. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +15 -48
  142. package/dist/builtin/subagents/src/tui/render-layout.ts +9 -0
  143. package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
  144. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
  145. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +27 -25
  146. package/dist/builtin/subagents/src/tui/render-widget.ts +177 -132
  147. package/dist/builtin/subagents/src/tui/render.ts +1 -1
  148. package/dist/builtin/web-access/CHANGELOG.md +14 -0
  149. package/dist/builtin/web-access/README.md +4 -0
  150. package/dist/builtin/web-access/content-tools.ts +8 -3
  151. package/dist/builtin/web-access/index-heavy.ts +1 -1
  152. package/dist/builtin/web-access/index.ts +190 -46
  153. package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
  154. package/dist/builtin/web-access/package.json +2 -2
  155. package/dist/builtin/web-access/result-renderers.ts +1 -1
  156. package/dist/builtin/web-access/summary-review.ts +1 -1
  157. package/dist/builtin/web-access/web-search-activity.ts +1 -1
  158. package/dist/builtin/web-access/web-search-return.ts +7 -0
  159. package/dist/builtin/web-access/web-search-summary.ts +1 -1
  160. package/dist/builtin/web-access/web-search-tool.ts +4 -2
  161. package/dist/builtin/workflows/CHANGELOG.md +86 -0
  162. package/dist/builtin/workflows/README.md +8 -6
  163. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +33 -9
  164. package/dist/builtin/workflows/builtin/goal-artifacts.ts +3 -1
  165. package/dist/builtin/workflows/builtin/goal-prompts.ts +25 -2
  166. package/dist/builtin/workflows/builtin/goal-reducer.ts +21 -0
  167. package/dist/builtin/workflows/builtin/goal-review.ts +60 -6
  168. package/dist/builtin/workflows/builtin/goal-runner.ts +119 -48
  169. package/dist/builtin/workflows/builtin/goal-types.ts +8 -1
  170. package/dist/builtin/workflows/builtin/goal.d.ts +2 -0
  171. package/dist/builtin/workflows/builtin/goal.ts +9 -0
  172. package/dist/builtin/workflows/builtin/index.d.ts +2 -0
  173. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +16 -5
  174. package/dist/builtin/workflows/builtin/ralph-core.ts +61 -13
  175. package/dist/builtin/workflows/builtin/ralph-models.ts +98 -66
  176. package/dist/builtin/workflows/builtin/ralph-review-gate.ts +10 -3
  177. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +159 -0
  178. package/dist/builtin/workflows/builtin/ralph-runner.ts +67 -164
  179. package/dist/builtin/workflows/builtin/review-convergence.ts +111 -0
  180. package/dist/builtin/workflows/builtin/shared-prompts.ts +5 -0
  181. package/dist/builtin/workflows/package.json +2 -2
  182. package/dist/builtin/workflows/skills/create-spec/SKILL.md +2 -0
  183. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  184. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  185. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  186. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  187. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  188. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  189. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  190. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  191. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  192. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  193. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  194. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  195. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  196. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  197. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  198. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  199. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  200. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  201. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  204. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  205. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  206. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  207. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  209. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  210. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  212. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  214. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  219. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  220. package/dist/builtin/workflows/src/durable/child-primitive.ts +12 -8
  221. package/dist/builtin/workflows/src/durable/dbos-backend.ts +63 -2
  222. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +28 -0
  223. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  224. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  225. package/dist/builtin/workflows/src/durable/stage-primitive.ts +167 -28
  226. package/dist/builtin/workflows/src/durable/types.ts +30 -1
  227. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
  228. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  229. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  230. package/dist/builtin/workflows/src/engine/run.ts +32 -32
  231. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  232. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  233. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  234. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  235. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  236. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  237. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  238. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  239. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  240. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -17
  241. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  242. package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
  243. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  244. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  245. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  246. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +13 -3
  247. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  248. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  249. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +8 -0
  250. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +4 -3
  251. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +2 -0
  252. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +18 -19
  253. package/dist/builtin/workflows/src/runs/foreground/stage-runner-unresolved-overflow.ts +38 -0
  254. package/dist/builtin/workflows/src/runs/foreground/stage-tool-execution-buffer.ts +47 -0
  255. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
  256. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  257. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  258. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  259. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
  260. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
  261. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +18 -1
  262. package/dist/builtin/workflows/src/shared/persistence-restore.ts +23 -5
  263. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +4 -0
  264. package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
  265. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  266. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  267. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  268. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  269. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  270. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
  271. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
  272. package/dist/builtin/workflows/src/tui/stage-chat-view-pending-tools.ts +9 -0
  273. package/dist/builtin/workflows/src/tui/stage-chat-view-render-settings.ts +27 -0
  274. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +5 -6
  275. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
  276. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  277. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  278. package/dist/bun/internal-intercom-broker.d.ts +6 -0
  279. package/dist/bun/internal-intercom-broker.d.ts.map +1 -0
  280. package/dist/bun/internal-intercom-broker.js +39 -0
  281. package/dist/bun/internal-intercom-broker.js.map +1 -0
  282. package/dist/bun/split-loader.d.ts +2 -0
  283. package/dist/bun/split-loader.d.ts.map +1 -0
  284. package/dist/bun/split-loader.js +50 -0
  285. package/dist/bun/split-loader.js.map +1 -0
  286. package/dist/cli/args.d.ts.map +1 -1
  287. package/dist/cli/args.js +2 -2
  288. package/dist/cli/args.js.map +1 -1
  289. package/dist/config.d.ts.map +1 -1
  290. package/dist/config.js +6 -4
  291. package/dist/config.js.map +1 -1
  292. package/dist/core/agent-session-auto-compaction.d.ts +26 -6
  293. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  294. package/dist/core/agent-session-auto-compaction.js +178 -19
  295. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  296. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  297. package/dist/core/agent-session-compaction.js +25 -4
  298. package/dist/core/agent-session-compaction.js.map +1 -1
  299. package/dist/core/agent-session-events.d.ts.map +1 -1
  300. package/dist/core/agent-session-events.js +12 -2
  301. package/dist/core/agent-session-events.js.map +1 -1
  302. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  303. package/dist/core/agent-session-extension-bindings.js +1 -1
  304. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  305. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  306. package/dist/core/agent-session-message-queue.js +1 -1
  307. package/dist/core/agent-session-message-queue.js.map +1 -1
  308. package/dist/core/agent-session-methods.d.ts +13 -4
  309. package/dist/core/agent-session-methods.d.ts.map +1 -1
  310. package/dist/core/agent-session-methods.js.map +1 -1
  311. package/dist/core/agent-session-models.d.ts +2 -2
  312. package/dist/core/agent-session-models.d.ts.map +1 -1
  313. package/dist/core/agent-session-models.js.map +1 -1
  314. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  315. package/dist/core/agent-session-prompt.js +2 -1
  316. package/dist/core/agent-session-prompt.js.map +1 -1
  317. package/dist/core/agent-session-retry.d.ts +2 -0
  318. package/dist/core/agent-session-retry.d.ts.map +1 -1
  319. package/dist/core/agent-session-retry.js +152 -4
  320. package/dist/core/agent-session-retry.js.map +1 -1
  321. package/dist/core/agent-session-services.d.ts +1 -0
  322. package/dist/core/agent-session-services.d.ts.map +1 -1
  323. package/dist/core/agent-session-services.js +4 -2
  324. package/dist/core/agent-session-services.js.map +1 -1
  325. package/dist/core/agent-session-types.d.ts +15 -1
  326. package/dist/core/agent-session-types.d.ts.map +1 -1
  327. package/dist/core/agent-session-types.js +1 -1
  328. package/dist/core/agent-session-types.js.map +1 -1
  329. package/dist/core/agent-session.d.ts +6 -0
  330. package/dist/core/agent-session.d.ts.map +1 -1
  331. package/dist/core/agent-session.js +6 -0
  332. package/dist/core/agent-session.js.map +1 -1
  333. package/dist/core/anthropic-thinking-guard.d.ts +5 -5
  334. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  335. package/dist/core/anthropic-thinking-guard.js +42 -32
  336. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  337. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  338. package/dist/core/atomic-guide-command.js +15 -15
  339. package/dist/core/atomic-guide-command.js.map +1 -1
  340. package/dist/core/auth-storage.d.ts.map +1 -1
  341. package/dist/core/auth-storage.js +14 -9
  342. package/dist/core/auth-storage.js.map +1 -1
  343. package/dist/core/builtin-packages.d.ts.map +1 -1
  344. package/dist/core/builtin-packages.js +8 -4
  345. package/dist/core/builtin-packages.js.map +1 -1
  346. package/dist/core/compaction/compaction.d.ts +2 -0
  347. package/dist/core/compaction/compaction.d.ts.map +1 -1
  348. package/dist/core/compaction/compaction.js +79 -46
  349. package/dist/core/compaction/compaction.js.map +1 -1
  350. package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
  351. package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
  352. package/dist/core/compaction/context-assistant-turns.js +87 -0
  353. package/dist/core/compaction/context-assistant-turns.js.map +1 -0
  354. package/dist/core/compaction/context-compaction-critical.d.ts +15 -0
  355. package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -0
  356. package/dist/core/compaction/context-compaction-critical.js +57 -0
  357. package/dist/core/compaction/context-compaction-critical.js.map +1 -0
  358. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
  359. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
  360. package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
  361. package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
  362. package/dist/core/compaction/context-compaction-eviction.d.ts +12 -0
  363. package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -0
  364. package/dist/core/compaction/context-compaction-eviction.js +222 -0
  365. package/dist/core/compaction/context-compaction-eviction.js.map +1 -0
  366. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  367. package/dist/core/compaction/context-compaction-prompt.js +1 -1
  368. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  369. package/dist/core/compaction/context-compaction-runner.d.ts +7 -1
  370. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  371. package/dist/core/compaction/context-compaction-runner.js +113 -21
  372. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  373. package/dist/core/compaction/context-compaction-types.d.ts +2 -0
  374. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
  375. package/dist/core/compaction/context-compaction-types.js.map +1 -1
  376. package/dist/core/compaction/context-deletion-application.d.ts +5 -4
  377. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  378. package/dist/core/compaction/context-deletion-application.js +17 -15
  379. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  380. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
  381. package/dist/core/compaction/context-deletion-store.js +1 -1
  382. package/dist/core/compaction/context-deletion-store.js.map +1 -1
  383. package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
  384. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  385. package/dist/core/compaction/context-deletion-targets.js +36 -31
  386. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  387. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
  388. package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
  389. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
  390. package/dist/core/compaction/context-transcript-analysis.d.ts +4 -2
  391. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  392. package/dist/core/compaction/context-transcript-analysis.js +36 -40
  393. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  394. package/dist/core/copilot-anthropic-sse-repair.d.ts +23 -0
  395. package/dist/core/copilot-anthropic-sse-repair.d.ts.map +1 -0
  396. package/dist/core/copilot-anthropic-sse-repair.js +340 -0
  397. package/dist/core/copilot-anthropic-sse-repair.js.map +1 -0
  398. package/dist/core/copilot-gemini-reasoning.d.ts +16 -8
  399. package/dist/core/copilot-gemini-reasoning.d.ts.map +1 -1
  400. package/dist/core/copilot-gemini-reasoning.js +27 -22
  401. package/dist/core/copilot-gemini-reasoning.js.map +1 -1
  402. package/dist/core/copilot-hosts.d.ts +12 -0
  403. package/dist/core/copilot-hosts.d.ts.map +1 -0
  404. package/dist/core/copilot-hosts.js +33 -0
  405. package/dist/core/copilot-hosts.js.map +1 -0
  406. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  407. package/dist/core/copilot-model-catalog.js +3 -2
  408. package/dist/core/copilot-model-catalog.js.map +1 -1
  409. package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
  410. package/dist/core/copilot-model-synthesis.js +3 -1
  411. package/dist/core/copilot-model-synthesis.js.map +1 -1
  412. package/dist/core/extensions/agent-events.d.ts +1 -1
  413. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  414. package/dist/core/extensions/agent-events.js.map +1 -1
  415. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  416. package/dist/core/extensions/loader-core.js +6 -0
  417. package/dist/core/extensions/loader-core.js.map +1 -1
  418. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  419. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  420. package/dist/core/extensions/loader-virtual-modules.js +10 -4
  421. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  422. package/dist/core/extensions/provider-types.d.ts +2 -7
  423. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  424. package/dist/core/extensions/provider-types.js.map +1 -1
  425. package/dist/core/footer-data-provider.d.ts +6 -0
  426. package/dist/core/footer-data-provider.d.ts.map +1 -1
  427. package/dist/core/footer-data-provider.js +72 -29
  428. package/dist/core/footer-data-provider.js.map +1 -1
  429. package/dist/core/http-dispatcher.d.ts.map +1 -1
  430. package/dist/core/http-dispatcher.js +5 -5
  431. package/dist/core/http-dispatcher.js.map +1 -1
  432. package/dist/core/messages.d.ts +9 -0
  433. package/dist/core/messages.d.ts.map +1 -1
  434. package/dist/core/messages.js +100 -18
  435. package/dist/core/messages.js.map +1 -1
  436. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  437. package/dist/core/model-registry-builtins.js +5 -0
  438. package/dist/core/model-registry-builtins.js.map +1 -1
  439. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  440. package/dist/core/model-registry-custom-loader.js +49 -8
  441. package/dist/core/model-registry-custom-loader.js.map +1 -1
  442. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  443. package/dist/core/model-registry-dynamic.js +11 -5
  444. package/dist/core/model-registry-dynamic.js.map +1 -1
  445. package/dist/core/model-registry-loader.d.ts.map +1 -1
  446. package/dist/core/model-registry-loader.js +8 -0
  447. package/dist/core/model-registry-loader.js.map +1 -1
  448. package/dist/core/model-registry-schemas.d.ts +93 -8
  449. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  450. package/dist/core/model-registry-schemas.js +24 -12
  451. package/dist/core/model-registry-schemas.js.map +1 -1
  452. package/dist/core/model-registry-types.d.ts +7 -6
  453. package/dist/core/model-registry-types.d.ts.map +1 -1
  454. package/dist/core/model-registry-types.js.map +1 -1
  455. package/dist/core/model-registry.d.ts +5 -0
  456. package/dist/core/model-registry.d.ts.map +1 -1
  457. package/dist/core/model-registry.js +23 -0
  458. package/dist/core/model-registry.js.map +1 -1
  459. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  460. package/dist/core/model-resolver-cli.js +33 -5
  461. package/dist/core/model-resolver-cli.js.map +1 -1
  462. package/dist/core/model-resolver-initial.d.ts +6 -1
  463. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  464. package/dist/core/model-resolver-initial.js +12 -7
  465. package/dist/core/model-resolver-initial.js.map +1 -1
  466. package/dist/core/model-resolver-scope.d.ts +9 -0
  467. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  468. package/dist/core/model-resolver-scope.js +12 -4
  469. package/dist/core/model-resolver-scope.js.map +1 -1
  470. package/dist/core/model-resolver.d.ts +4 -3
  471. package/dist/core/model-resolver.d.ts.map +1 -1
  472. package/dist/core/model-resolver.js +2 -2
  473. package/dist/core/model-resolver.js.map +1 -1
  474. package/dist/core/openai-responses-payload-sanitizer.d.ts +7 -0
  475. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -0
  476. package/dist/core/openai-responses-payload-sanitizer.js +74 -0
  477. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -0
  478. package/dist/core/package-manager-auto-resources.d.ts +2 -2
  479. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  480. package/dist/core/package-manager-auto-resources.js +32 -52
  481. package/dist/core/package-manager-auto-resources.js.map +1 -1
  482. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  483. package/dist/core/package-manager-resolver.js +23 -14
  484. package/dist/core/package-manager-resolver.js.map +1 -1
  485. package/dist/core/package-manager-resource-collector.d.ts +3 -3
  486. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  487. package/dist/core/package-manager-resource-collector.js +76 -73
  488. package/dist/core/package-manager-resource-collector.js.map +1 -1
  489. package/dist/core/package-manager-resource-files.d.ts +9 -8
  490. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  491. package/dist/core/package-manager-resource-files.js +92 -81
  492. package/dist/core/package-manager-resource-files.js.map +1 -1
  493. package/dist/core/prompt-templates-async.d.ts +3 -0
  494. package/dist/core/prompt-templates-async.d.ts.map +1 -0
  495. package/dist/core/prompt-templates-async.js +118 -0
  496. package/dist/core/prompt-templates-async.js.map +1 -0
  497. package/dist/core/provider-context-usage.d.ts +11 -0
  498. package/dist/core/provider-context-usage.d.ts.map +1 -0
  499. package/dist/core/provider-context-usage.js +58 -0
  500. package/dist/core/provider-context-usage.js.map +1 -0
  501. package/dist/core/resource-loader-assets.d.ts +3 -3
  502. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  503. package/dist/core/resource-loader-assets.js +66 -83
  504. package/dist/core/resource-loader-assets.js.map +1 -1
  505. package/dist/core/resource-loader-context-files.d.ts +1 -0
  506. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  507. package/dist/core/resource-loader-context-files.js +13 -10
  508. package/dist/core/resource-loader-context-files.js.map +1 -1
  509. package/dist/core/resource-loader-core.d.ts +1 -1
  510. package/dist/core/resource-loader-core.d.ts.map +1 -1
  511. package/dist/core/resource-loader-core.js +5 -5
  512. package/dist/core/resource-loader-core.js.map +1 -1
  513. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  514. package/dist/core/resource-loader-extensions.js +4 -0
  515. package/dist/core/resource-loader-extensions.js.map +1 -1
  516. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  517. package/dist/core/resource-loader-reload.js +54 -7
  518. package/dist/core/resource-loader-reload.js.map +1 -1
  519. package/dist/core/resource-loader-types.d.ts +7 -1
  520. package/dist/core/resource-loader-types.d.ts.map +1 -1
  521. package/dist/core/resource-loader-types.js.map +1 -1
  522. package/dist/core/sdk-types.d.ts +2 -0
  523. package/dist/core/sdk-types.d.ts.map +1 -1
  524. package/dist/core/sdk-types.js.map +1 -1
  525. package/dist/core/sdk.d.ts.map +1 -1
  526. package/dist/core/sdk.js +9 -6
  527. package/dist/core/sdk.js.map +1 -1
  528. package/dist/core/session-entry-normalization.d.ts +7 -0
  529. package/dist/core/session-entry-normalization.d.ts.map +1 -0
  530. package/dist/core/session-entry-normalization.js +14 -0
  531. package/dist/core/session-entry-normalization.js.map +1 -0
  532. package/dist/core/session-manager-core.d.ts.map +1 -1
  533. package/dist/core/session-manager-core.js +1 -0
  534. package/dist/core/session-manager-core.js.map +1 -1
  535. package/dist/core/session-manager-history.d.ts +2 -2
  536. package/dist/core/session-manager-history.d.ts.map +1 -1
  537. package/dist/core/session-manager-history.js +127 -108
  538. package/dist/core/session-manager-history.js.map +1 -1
  539. package/dist/core/settings-manager-basic-accessors.d.ts +3 -2
  540. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  541. package/dist/core/settings-manager-basic-accessors.js +6 -0
  542. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  543. package/dist/core/settings-manager-core.d.ts.map +1 -1
  544. package/dist/core/settings-manager-core.js +3 -2
  545. package/dist/core/settings-manager-core.js.map +1 -1
  546. package/dist/core/settings-storage.d.ts.map +1 -1
  547. package/dist/core/settings-storage.js +2 -1
  548. package/dist/core/settings-storage.js.map +1 -1
  549. package/dist/core/settings-types.d.ts +2 -1
  550. package/dist/core/settings-types.d.ts.map +1 -1
  551. package/dist/core/settings-types.js.map +1 -1
  552. package/dist/core/skills-async.d.ts +3 -0
  553. package/dist/core/skills-async.d.ts.map +1 -0
  554. package/dist/core/skills-async.js +269 -0
  555. package/dist/core/skills-async.js.map +1 -0
  556. package/dist/core/slash-commands.d.ts +2 -0
  557. package/dist/core/slash-commands.d.ts.map +1 -1
  558. package/dist/core/slash-commands.js +141 -0
  559. package/dist/core/slash-commands.js.map +1 -1
  560. package/dist/core/tools/bash.d.ts.map +1 -1
  561. package/dist/core/tools/bash.js +11 -8
  562. package/dist/core/tools/bash.js.map +1 -1
  563. package/dist/core/trust-manager.d.ts +9 -0
  564. package/dist/core/trust-manager.d.ts.map +1 -1
  565. package/dist/core/trust-manager.js +44 -2
  566. package/dist/core/trust-manager.js.map +1 -1
  567. package/dist/index-extensions.d.ts +1 -1
  568. package/dist/index-extensions.d.ts.map +1 -1
  569. package/dist/index-extensions.js.map +1 -1
  570. package/dist/index.d.ts +2 -1
  571. package/dist/index.d.ts.map +1 -1
  572. package/dist/index.js +2 -1
  573. package/dist/index.js.map +1 -1
  574. package/dist/main-deferred-startup.d.ts +33 -0
  575. package/dist/main-deferred-startup.d.ts.map +1 -0
  576. package/dist/main-deferred-startup.js +44 -0
  577. package/dist/main-deferred-startup.js.map +1 -0
  578. package/dist/main-early-input.d.ts +41 -0
  579. package/dist/main-early-input.d.ts.map +1 -0
  580. package/dist/main-early-input.js +154 -0
  581. package/dist/main-early-input.js.map +1 -0
  582. package/dist/main-session.d.ts.map +1 -1
  583. package/dist/main-session.js +1 -0
  584. package/dist/main-session.js.map +1 -1
  585. package/dist/main.d.ts +0 -6
  586. package/dist/main.d.ts.map +1 -1
  587. package/dist/main.js +47 -39
  588. package/dist/main.js.map +1 -1
  589. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  590. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  591. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  592. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  593. package/dist/modes/interactive/components/chat-session-host-events.js +15 -0
  594. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  595. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
  596. package/dist/modes/interactive/components/settings-selector-options.js +3 -1
  597. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
  598. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  600. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  601. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  602. package/dist/modes/interactive/interactive-agent-events.js +37 -2
  603. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  604. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  605. package/dist/modes/interactive/interactive-auth-login.js +0 -1
  606. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  607. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  608. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  609. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  610. package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
  611. package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
  612. package/dist/modes/interactive/interactive-child-ordering.js +26 -0
  613. package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
  614. package/dist/modes/interactive/interactive-deferred-startup.d.ts +8 -1
  615. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  616. package/dist/modes/interactive/interactive-deferred-startup.js +86 -26
  617. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  618. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  619. package/dist/modes/interactive/interactive-editor-actions.js +13 -13
  620. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  621. package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
  622. package/dist/modes/interactive/interactive-extension-runtime.js +16 -0
  623. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  624. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  625. package/dist/modes/interactive/interactive-hotkeys-debug.js +4 -3
  626. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  627. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  628. package/dist/modes/interactive/interactive-input-handling.js +360 -230
  629. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  630. package/dist/modes/interactive/interactive-mode-base.d.ts +19 -4
  631. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  632. package/dist/modes/interactive/interactive-mode-base.js +46 -4
  633. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  634. package/dist/modes/interactive/interactive-mode-deps.d.ts +3 -3
  635. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  636. package/dist/modes/interactive/interactive-mode-deps.js +3 -3
  637. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  638. package/dist/modes/interactive/interactive-mode-surface.d.ts +27 -17
  639. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  640. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  641. package/dist/modes/interactive/interactive-mode-types.d.ts +8 -1
  642. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  643. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  644. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  645. package/dist/modes/interactive/interactive-model-routing.js +14 -10
  646. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  647. package/dist/modes/interactive/interactive-onboarding.d.ts +0 -9
  648. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
  649. package/dist/modes/interactive/interactive-onboarding.js +24 -201
  650. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  651. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  652. package/dist/modes/interactive/interactive-process-lifecycle.js +43 -9
  653. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  654. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  655. package/dist/modes/interactive/interactive-render-chat.js +93 -10
  656. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  657. package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
  658. package/dist/modes/interactive/interactive-resource-disclosure.js +3 -2
  659. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  660. package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
  661. package/dist/modes/interactive/interactive-resource-rendering.js +10 -8
  662. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  663. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  664. package/dist/modes/interactive/interactive-session-routing.js +9 -5
  665. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  666. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  667. package/dist/modes/interactive/interactive-session-runtime.js +1 -1
  668. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  669. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  670. package/dist/modes/interactive/interactive-slash-commands.js +1 -1
  671. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  672. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  673. package/dist/modes/interactive/interactive-startup.js +102 -98
  674. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  675. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  676. package/dist/modes/interactive/theme/global-theme.js +26 -2
  677. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  678. package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
  679. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  680. package/dist/modes/interactive/theme/theme-class.js +2 -0
  681. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  682. package/dist/modes/interactive/theme/theme-loading.d.ts +1 -0
  683. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  684. package/dist/modes/interactive/theme/theme-loading.js +3 -0
  685. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  686. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  687. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  688. package/dist/modes/interactive/theme/theme.js +1 -1
  689. package/dist/modes/interactive/theme/theme.js.map +1 -1
  690. package/dist/utils/child-process.d.ts +8 -1
  691. package/dist/utils/child-process.d.ts.map +1 -1
  692. package/dist/utils/child-process.js +39 -6
  693. package/dist/utils/child-process.js.map +1 -1
  694. package/dist/utils/clipboard-image.d.ts.map +1 -1
  695. package/dist/utils/clipboard-image.js +3 -0
  696. package/dist/utils/clipboard-image.js.map +1 -1
  697. package/dist/utils/event-loop.d.ts +7 -0
  698. package/dist/utils/event-loop.d.ts.map +1 -0
  699. package/dist/utils/event-loop.js +14 -0
  700. package/dist/utils/event-loop.js.map +1 -0
  701. package/dist/utils/fs-watch.d.ts +24 -1
  702. package/dist/utils/fs-watch.d.ts.map +1 -1
  703. package/dist/utils/fs-watch.js +60 -5
  704. package/dist/utils/fs-watch.js.map +1 -1
  705. package/dist/utils/json.d.ts +4 -0
  706. package/dist/utils/json.d.ts.map +1 -1
  707. package/dist/utils/json.js +8 -0
  708. package/dist/utils/json.js.map +1 -1
  709. package/dist/utils/module-require.d.ts +11 -0
  710. package/dist/utils/module-require.d.ts.map +1 -1
  711. package/dist/utils/module-require.js +14 -1
  712. package/dist/utils/module-require.js.map +1 -1
  713. package/dist/utils/split-launcher.d.ts +38 -0
  714. package/dist/utils/split-launcher.d.ts.map +1 -0
  715. package/dist/utils/split-launcher.js +63 -0
  716. package/dist/utils/split-launcher.js.map +1 -0
  717. package/docs/changelog.mdx +19 -0
  718. package/docs/compaction.md +100 -64
  719. package/docs/custom-provider.md +18 -5
  720. package/docs/development.md +4 -0
  721. package/docs/extensions.md +11 -2
  722. package/docs/json.md +3 -1
  723. package/docs/keybindings.md +2 -2
  724. package/docs/models.md +69 -10
  725. package/docs/providers.md +3 -2
  726. package/docs/quickstart.md +15 -11
  727. package/docs/rpc.md +5 -3
  728. package/docs/sdk.md +1 -1
  729. package/docs/settings.md +33 -3
  730. package/docs/subagents.md +40 -5
  731. package/docs/terminal-setup.md +4 -0
  732. package/docs/tools.md +1 -1
  733. package/docs/usage.md +8 -6
  734. package/docs/windows.md +4 -0
  735. package/docs/workflows.md +52 -34
  736. package/examples/extensions/preset.ts +2 -2
  737. package/examples/extensions/subagent/README.md +2 -2
  738. package/examples/extensions/subagent/index.ts +1 -2
  739. package/examples/extensions/subagent/schemas.ts +4 -1
  740. package/examples/sdk/12-full-control.ts +1 -1
  741. package/npm-shrinkwrap.json +538 -51
  742. package/package.json +10 -9
  743. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
  744. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
  745. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
  746. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
  747. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
  748. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
  749. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
  750. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
  751. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
  752. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
  753. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
  754. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
@@ -1,75 +1,17 @@
1
1
  import net from "net";
2
2
  import { writeFileSync, unlinkSync, mkdirSync } from "fs";
3
- import { join } from "path";
4
- import { homedir } from "os";
5
3
  import { randomUUID } from "crypto";
6
- import { CONFIG_DIR_NAME } from "@bastani/atomic";
7
4
  import { writeMessage, createMessageReader } from "./framing.js";
8
- import { getBrokerSocketPath } from "./paths.js";
9
- import type { SessionInfo, Message, Attachment, BrokerMessage } from "../types.js";
5
+ import { getBrokerPidPath, getBrokerSocketPath, getIntercomDirPath } from "./paths.js";
6
+ import type { SessionInfo, BrokerMessage } from "../types.js";
7
+ import { DeliveredMessageCache } from "./delivered-message-cache.js";
8
+ import { handleBrokerSend, type BrokerConnectedSession } from "./send-handler.js";
10
9
 
11
- const INTERCOM_DIR = join(homedir(), CONFIG_DIR_NAME, "agent", "intercom");
10
+ const INTERCOM_DIR = getIntercomDirPath();
12
11
  const SOCKET_PATH = getBrokerSocketPath();
13
- const PID_PATH = join(INTERCOM_DIR, "broker.pid");
12
+ const PID_PATH = getBrokerPidPath();
14
13
 
15
- interface ConnectedSession {
16
- socket: net.Socket;
17
- info: SessionInfo;
18
- }
19
-
20
- function isAttachment(value: unknown): value is Attachment {
21
- if (typeof value !== "object" || value === null) {
22
- return false;
23
- }
24
-
25
- const attachment = value as Record<string, unknown>;
26
-
27
- if (
28
- attachment.type !== "file"
29
- && attachment.type !== "snippet"
30
- && attachment.type !== "context"
31
- ) {
32
- return false;
33
- }
34
-
35
- if (typeof attachment.name !== "string" || typeof attachment.content !== "string") {
36
- return false;
37
- }
38
-
39
- return attachment.language === undefined || typeof attachment.language === "string";
40
- }
41
-
42
- function isMessage(value: unknown): value is Message {
43
- if (typeof value !== "object" || value === null) {
44
- return false;
45
- }
46
-
47
- const message = value as Record<string, unknown>;
48
-
49
- if (typeof message.id !== "string" || typeof message.timestamp !== "number") {
50
- return false;
51
- }
52
-
53
- if (message.replyTo !== undefined && typeof message.replyTo !== "string") {
54
- return false;
55
- }
56
-
57
- if (message.expectsReply !== undefined && typeof message.expectsReply !== "boolean") {
58
- return false;
59
- }
60
-
61
- if (typeof message.content !== "object" || message.content === null) {
62
- return false;
63
- }
64
-
65
- const content = message.content as Record<string, unknown>;
66
- if (typeof content.text !== "string") {
67
- return false;
68
- }
69
-
70
- return content.attachments === undefined
71
- || (Array.isArray(content.attachments) && content.attachments.every(isAttachment));
72
- }
14
+ type ConnectedSession = BrokerConnectedSession;
73
15
 
74
16
  function isSessionRegistration(value: unknown): value is Omit<SessionInfo, "id"> {
75
17
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
@@ -99,6 +41,7 @@ class IntercomBroker {
99
41
  private sessions = new Map<string, ConnectedSession>();
100
42
  private server: net.Server;
101
43
  private shutdownTimer: NodeJS.Timeout | null = null;
44
+ private deliveredMessages = new DeliveredMessageCache();
102
45
 
103
46
  constructor() {
104
47
  mkdirSync(INTERCOM_DIR, { recursive: true });
@@ -220,52 +163,7 @@ class IntercomBroker {
220
163
  }
221
164
 
222
165
  case "send": {
223
- const message = clientMessage.message;
224
- const messageId = isMessage(message) ? message.id : "unknown";
225
-
226
- if (typeof clientMessage.to !== "string" || !isMessage(message)) {
227
- writeMessage(socket, {
228
- type: "delivery_failed",
229
- messageId,
230
- reason: "Invalid message format",
231
- });
232
- break;
233
- }
234
-
235
- const targets = this.findSessions(clientMessage.to);
236
- if (targets.length === 1) {
237
- const fromSession = this.sessions.get(currentId);
238
- if (!fromSession) {
239
- writeMessage(socket, {
240
- type: "delivery_failed",
241
- messageId: message.id,
242
- reason: "Sender session not found",
243
- });
244
- break;
245
- }
246
- writeMessage(targets[0].socket, {
247
- type: "message",
248
- from: fromSession.info,
249
- message,
250
- });
251
- writeMessage(socket, { type: "delivered", messageId: message.id });
252
- break;
253
- }
254
-
255
- if (targets.length > 1) {
256
- writeMessage(socket, {
257
- type: "delivery_failed",
258
- messageId: message.id,
259
- reason: `Multiple sessions named \"${clientMessage.to}\" are connected. Use the session ID instead.`,
260
- });
261
- break;
262
- }
263
-
264
- writeMessage(socket, {
265
- type: "delivery_failed",
266
- messageId: message.id,
267
- reason: "Session not found",
268
- });
166
+ handleBrokerSend(socket, clientMessage, currentId, this.sessions, this.deliveredMessages, writeMessage);
269
167
  break;
270
168
  }
271
169
 
@@ -301,15 +199,6 @@ class IntercomBroker {
301
199
  }
302
200
  }
303
201
 
304
- private findSessions(nameOrId: string): ConnectedSession[] {
305
- const byId = this.sessions.get(nameOrId);
306
- if (byId) {
307
- return [byId];
308
- }
309
-
310
- const lowerName = nameOrId.toLowerCase();
311
- return Array.from(this.sessions.values()).filter(session => session.info.name?.toLowerCase() === lowerName);
312
- }
313
202
 
314
203
  private broadcast(msg: BrokerMessage, exclude?: string): void {
315
204
  for (const [id, session] of this.sessions) {
@@ -4,6 +4,7 @@ import { randomUUID } from "crypto";
4
4
  import { writeMessage, createMessageReader } from "./framing.js";
5
5
  import { getBrokerSocketPath } from "./paths.js";
6
6
  import type { SessionInfo, Message, Attachment } from "../types.js";
7
+ import { buildSendSignature, PendingSendRegistry } from "./pending-send-registry.js";
7
8
 
8
9
  const BROKER_SOCKET = getBrokerSocketPath();
9
10
 
@@ -107,19 +108,14 @@ function isSessionInfo(value: unknown): value is SessionInfo {
107
108
  export class IntercomClient extends EventEmitter {
108
109
  private socket: net.Socket | null = null;
109
110
  private _sessionId: string | null = null;
110
- private pendingSends = new Map<string, { resolve: (r: SendResult) => void; reject: (e: Error) => void }>();
111
+ private pendingSends = new PendingSendRegistry();
111
112
  private pendingLists = new Map<string, { resolve: (sessions: SessionInfo[]) => void; reject: (e: Error) => void }>();
112
113
  private disconnecting = false;
113
114
  private disconnectError: Error | null = null;
114
115
 
115
116
  private failPending(error: Error): void {
116
- for (const pending of this.pendingSends.values()) {
117
- pending.reject(error);
118
- }
119
- this.pendingSends.clear();
120
- for (const pending of this.pendingLists.values()) {
121
- pending.reject(error);
122
- }
117
+ this.pendingSends.rejectAll(error);
118
+ for (const pending of this.pendingLists.values()) pending.reject(error);
123
119
  this.pendingLists.clear();
124
120
  }
125
121
 
@@ -314,31 +310,23 @@ export class IntercomClient extends EventEmitter {
314
310
  break;
315
311
  }
316
312
  case "delivered": {
317
- const { messageId } = brokerMessage;
318
- if (typeof messageId !== "string") {
313
+ const { messageId, attemptId } = brokerMessage;
314
+ if (typeof messageId !== "string" || (attemptId !== undefined && typeof attemptId !== "string")) {
319
315
  throw new Error("Invalid delivered message");
320
316
  }
321
- const pending = this.pendingSends.get(messageId);
322
- if (!pending) {
323
- // Late send responses are harmless once the caller has already timed out.
324
- return;
325
- }
326
- this.pendingSends.delete(messageId);
327
- pending.resolve({ id: messageId, delivered: true });
317
+ const result = { id: messageId, delivered: true } as const;
318
+ if (attemptId === undefined) this.pendingSends.resolveLegacy(messageId, result);
319
+ else this.pendingSends.resolve(messageId, attemptId, result);
328
320
  break;
329
321
  }
330
322
  case "delivery_failed": {
331
- const { messageId, reason } = brokerMessage;
332
- if (typeof messageId !== "string" || typeof reason !== "string") {
323
+ const { messageId, attemptId, reason } = brokerMessage;
324
+ if (typeof messageId !== "string" || (attemptId !== undefined && typeof attemptId !== "string") || typeof reason !== "string") {
333
325
  throw new Error("Invalid delivery_failed message");
334
326
  }
335
- const pending = this.pendingSends.get(messageId);
336
- if (!pending) {
337
- // Late send responses are harmless once the caller has already timed out.
338
- return;
339
- }
340
- this.pendingSends.delete(messageId);
341
- pending.resolve({ id: messageId, delivered: false, reason });
327
+ const result = { id: messageId, delivered: false, reason } as const;
328
+ if (attemptId === undefined) this.pendingSends.resolveLegacy(messageId, result);
329
+ else this.pendingSends.resolve(messageId, attemptId, result);
342
330
  break;
343
331
  }
344
332
  case "session_joined": {
@@ -452,40 +440,27 @@ export class IntercomClient extends EventEmitter {
452
440
  return Promise.reject(toError(error));
453
441
  }
454
442
  const messageId = options.messageId ?? randomUUID();
443
+ let acquired;
444
+ try {
445
+ acquired = this.pendingSends.acquire(messageId, buildSendSignature(to, options), 10000);
446
+ } catch (error) {
447
+ return Promise.reject(toError(error));
448
+ }
449
+ if (!acquired.owner) return acquired.attempt.promise;
450
+
455
451
  const message: Message = {
456
452
  id: messageId,
457
453
  timestamp: Date.now(),
458
454
  replyTo: options.replyTo,
459
455
  expectsReply: options.expectsReply,
460
- content: {
461
- text: options.text,
462
- attachments: options.attachments,
463
- },
456
+ content: { text: options.text, attachments: options.attachments },
464
457
  };
465
- return new Promise((resolve, reject) => {
466
- const wrappedResolve = (result: SendResult) => {
467
- clearTimeout(timeout);
468
- resolve(result);
469
- };
470
- const wrappedReject = (error: Error) => {
471
- clearTimeout(timeout);
472
- reject(error);
473
- };
474
- const timeout = setTimeout(() => {
475
- if (this.pendingSends.has(messageId)) {
476
- this.pendingSends.delete(messageId);
477
- wrappedReject(new Error("Send timeout"));
478
- }
479
- }, 10000);
480
- this.pendingSends.set(messageId, { resolve: wrappedResolve, reject: wrappedReject });
481
- try {
482
- writeMessage(socket, { type: "send", to, message });
483
- } catch (error) {
484
- clearTimeout(timeout);
485
- this.pendingSends.delete(messageId);
486
- reject(toError(error));
487
- }
488
- });
458
+ try {
459
+ writeMessage(socket, { type: "send", to, message, attemptId: acquired.attempt.attemptId });
460
+ } catch (error) {
461
+ this.pendingSends.reject(acquired.attempt, toError(error));
462
+ }
463
+ return acquired.attempt.promise;
489
464
  }
490
465
  updatePresence(updates: { name?: string; status?: string; model?: string }): void {
491
466
  if (this.disconnecting) {
@@ -0,0 +1,44 @@
1
+ const DEFAULT_TTL_MS = 10 * 60 * 1000;
2
+ const DEFAULT_MAX_ENTRIES = 10_000;
3
+
4
+ export type DeliveredMessageMatch = "miss" | "match" | "conflict";
5
+
6
+ interface DeliveredMessage {
7
+ deliveredAt: number;
8
+ signature: string;
9
+ }
10
+
11
+ /** Bounded successful-delivery cache used to make broker and local retries idempotent. */
12
+ export class DeliveredMessageCache {
13
+ private readonly delivered = new Map<string, DeliveredMessage>();
14
+
15
+ constructor(
16
+ private readonly ttlMs = DEFAULT_TTL_MS,
17
+ private readonly maxEntries = DEFAULT_MAX_ENTRIES,
18
+ ) {}
19
+
20
+ lookup(messageId: string, signature: string, now = Date.now()): DeliveredMessageMatch {
21
+ this.prune(now);
22
+ const delivered = this.delivered.get(messageId);
23
+ if (!delivered || now - delivered.deliveredAt > this.ttlMs) return "miss";
24
+ return delivered.signature === signature ? "match" : "conflict";
25
+ }
26
+
27
+ record(messageId: string, signature: string, now = Date.now()): void {
28
+ this.prune(now);
29
+ this.delivered.delete(messageId);
30
+ this.delivered.set(messageId, { deliveredAt: now, signature });
31
+ while (this.delivered.size > this.maxEntries) {
32
+ const oldest = this.delivered.keys().next().value as string | undefined;
33
+ if (oldest === undefined) break;
34
+ this.delivered.delete(oldest);
35
+ }
36
+ }
37
+
38
+ private prune(now: number): void {
39
+ for (const [messageId, delivered] of this.delivered) {
40
+ if (now - delivered.deliveredAt <= this.ttlMs) break;
41
+ this.delivered.delete(messageId);
42
+ }
43
+ }
44
+ }
@@ -1,6 +1,31 @@
1
- import { join } from "path";
2
1
  import { homedir } from "os";
3
- import { CONFIG_DIR_NAME } from "@bastani/atomic";
2
+ import { join } from "path";
3
+
4
+ function getHomeDir(): string {
5
+ if (process.platform === "win32") {
6
+ if (process.env.USERPROFILE) return process.env.USERPROFILE;
7
+ if (process.env.HOMEDRIVE && process.env.HOMEPATH) return `${process.env.HOMEDRIVE}${process.env.HOMEPATH}`;
8
+ if (process.env.HOME) return process.env.HOME;
9
+ return homedir();
10
+ }
11
+ return process.env.HOME || process.env.USERPROFILE || homedir();
12
+ }
13
+
14
+ function expandTildePath(path: string): string {
15
+ if (path === "~") return getHomeDir();
16
+ if (path.startsWith("~/") || (process.platform === "win32" && path.startsWith("~\\"))) {
17
+ return join(getHomeDir(), path.slice(2));
18
+ }
19
+ return path;
20
+ }
21
+
22
+ function getAgentDir(): string {
23
+ const atomicAgentDir = process.env.ATOMIC_CODING_AGENT_DIR;
24
+ if (atomicAgentDir) return expandTildePath(atomicAgentDir);
25
+ const piAgentDir = process.env.PI_CODING_AGENT_DIR;
26
+ if (piAgentDir) return expandTildePath(piAgentDir);
27
+ return join(getHomeDir(), ".atomic", "agent");
28
+ }
4
29
 
5
30
  function sanitizePipeSegment(value: string): string {
6
31
  return value
@@ -9,13 +34,25 @@ function sanitizePipeSegment(value: string): string {
9
34
  .toLowerCase() || "default";
10
35
  }
11
36
 
37
+ export function getIntercomDirPath(agentDir: string = getAgentDir()): string {
38
+ return join(agentDir, "intercom");
39
+ }
40
+
41
+ export function getBrokerPidPath(agentDir: string = getAgentDir()): string {
42
+ return join(getIntercomDirPath(agentDir), "broker.pid");
43
+ }
44
+
45
+ export function getBrokerSpawnLockPath(agentDir: string = getAgentDir()): string {
46
+ return join(getIntercomDirPath(agentDir), "broker.spawn.lock");
47
+ }
48
+
12
49
  export function getBrokerSocketPath(
13
50
  platform: NodeJS.Platform = process.platform,
14
- homeDir: string = homedir(),
51
+ agentDir: string = getAgentDir(),
15
52
  ): string {
16
53
  if (platform === "win32") {
17
- return `\\\\.\\pipe\\pi-intercom-${sanitizePipeSegment(homeDir)}`;
54
+ return `\\\\.\\pipe\\pi-intercom-${sanitizePipeSegment(agentDir)}`;
18
55
  }
19
56
 
20
- return join(homeDir, CONFIG_DIR_NAME, "agent", "intercom", "broker.sock");
57
+ return join(getIntercomDirPath(agentDir), "broker.sock");
21
58
  }
@@ -0,0 +1,142 @@
1
+ import { randomUUID } from "crypto";
2
+ import type { LogicalSendOptions } from "./send-signature.js";
3
+ export { buildSendSignature } from "./send-signature.js";
4
+
5
+ const DEFAULT_GENERATION_TTL_MS = 10 * 60 * 1000;
6
+ const DEFAULT_MAX_GENERATIONS = 10_000;
7
+
8
+ export interface SendOptionsLike extends LogicalSendOptions {}
9
+
10
+ export interface SendResultLike {
11
+ id: string;
12
+ delivered: boolean;
13
+ reason?: string;
14
+ }
15
+
16
+ export interface PendingSendAttempt {
17
+ readonly messageId: string;
18
+ readonly attemptId: string;
19
+ readonly signature: string;
20
+ readonly promise: Promise<SendResultLike>;
21
+ }
22
+
23
+ interface OwnedPendingSend extends PendingSendAttempt {
24
+ legacyEligible: boolean;
25
+ generation: number;
26
+ resolve(result: SendResultLike): void;
27
+ reject(error: Error): void;
28
+ timer?: ReturnType<typeof setTimeout>;
29
+ }
30
+
31
+ export interface PendingSendAcquisition {
32
+ attempt: PendingSendAttempt;
33
+ owner: boolean;
34
+ }
35
+
36
+ interface SendGeneration {
37
+ generation: number;
38
+ touchedAt: number;
39
+ }
40
+
41
+
42
+ export class PendingSendRegistry {
43
+ private readonly attempts = new Map<string, OwnedPendingSend>();
44
+ private readonly generations = new Map<string, SendGeneration>();
45
+
46
+ constructor(
47
+ private readonly generationTtlMs = DEFAULT_GENERATION_TTL_MS,
48
+ private readonly maxGenerations = DEFAULT_MAX_GENERATIONS,
49
+ private readonly now: () => number = Date.now,
50
+ ) {}
51
+
52
+ private nextGeneration(messageId: string): number {
53
+ const now = this.now();
54
+ for (const [id, record] of this.generations) {
55
+ if (now - record.touchedAt <= this.generationTtlMs) break;
56
+ this.generations.delete(id);
57
+ }
58
+ const previous = this.generations.get(messageId);
59
+ const generation = previous && now - previous.touchedAt <= this.generationTtlMs ? previous.generation + 1 : 1;
60
+ this.generations.delete(messageId);
61
+ this.generations.set(messageId, { generation, touchedAt: now });
62
+ while (this.generations.size > Math.max(1, this.maxGenerations)) {
63
+ const oldest = this.generations.keys().next().value as string | undefined;
64
+ if (oldest === undefined) break;
65
+ this.generations.delete(oldest);
66
+ }
67
+ return generation;
68
+ }
69
+
70
+ private touchGeneration(attempt: OwnedPendingSend): void {
71
+ this.generations.delete(attempt.messageId);
72
+ this.generations.set(attempt.messageId, { generation: attempt.generation, touchedAt: this.now() });
73
+ while (this.generations.size > Math.max(1, this.maxGenerations)) {
74
+ const oldest = this.generations.keys().next().value as string | undefined;
75
+ if (oldest === undefined) break;
76
+ this.generations.delete(oldest);
77
+ }
78
+ }
79
+ acquire(messageId: string, signature: string, timeoutMs: number): PendingSendAcquisition {
80
+ const existing = this.attempts.get(messageId);
81
+ if (existing) {
82
+ if (existing.signature !== signature) {
83
+ throw new Error(`Intercom message ID '${messageId}' is already pending with a different target or payload`);
84
+ }
85
+ return { attempt: existing, owner: false };
86
+ }
87
+
88
+ let resolvePromise!: (result: SendResultLike) => void;
89
+ let rejectPromise!: (error: Error) => void;
90
+ const promise = new Promise<SendResultLike>((resolve, reject) => {
91
+ resolvePromise = resolve;
92
+ rejectPromise = reject;
93
+ });
94
+ const generation = this.nextGeneration(messageId);
95
+ const attempt: OwnedPendingSend = {
96
+ messageId,
97
+ attemptId: randomUUID(),
98
+ signature,
99
+ promise,
100
+ resolve: resolvePromise,
101
+ reject: rejectPromise,
102
+ legacyEligible: generation === 1,
103
+ generation,
104
+ };
105
+ attempt.timer = setTimeout(() => {
106
+ this.reject(attempt, new Error("Send timeout"));
107
+ }, timeoutMs);
108
+ this.attempts.set(messageId, attempt);
109
+ return { attempt, owner: true };
110
+ }
111
+
112
+ resolve(messageId: string, attemptId: string, result: SendResultLike): boolean {
113
+ const attempt = this.attempts.get(messageId);
114
+ if (!attempt || attempt.attemptId !== attemptId) return false;
115
+ this.attempts.delete(messageId);
116
+ if (attempt.timer) clearTimeout(attempt.timer);
117
+ this.touchGeneration(attempt);
118
+ attempt.resolve(result);
119
+ return true;
120
+ }
121
+
122
+ /** Resolve a pre-attemptId response only for an ID's first active generation. */
123
+ resolveLegacy(messageId: string, result: SendResultLike): boolean {
124
+ const attempt = this.attempts.get(messageId);
125
+ if (!attempt?.legacyEligible) return false;
126
+ return this.resolve(messageId, attempt.attemptId, result);
127
+ }
128
+
129
+ reject(attempt: PendingSendAttempt, error: Error): boolean {
130
+ const current = this.attempts.get(attempt.messageId);
131
+ if (current !== attempt) return false;
132
+ this.attempts.delete(attempt.messageId);
133
+ if (current.timer) clearTimeout(current.timer);
134
+ this.touchGeneration(current);
135
+ current.reject(error);
136
+ return true;
137
+ }
138
+
139
+ rejectAll(error: Error): void {
140
+ for (const attempt of [...this.attempts.values()]) this.reject(attempt, error);
141
+ }
142
+ }
@@ -0,0 +1,106 @@
1
+ import type net from "node:net";
2
+ import type { Attachment, BrokerMessage, Message, SessionInfo } from "../types.js";
3
+ import { DeliveredMessageCache } from "./delivered-message-cache.js";
4
+ import { buildMessageSendSignature } from "./send-signature.js";
5
+
6
+ export interface BrokerConnectedSession {
7
+ socket: net.Socket;
8
+ info: SessionInfo;
9
+ }
10
+
11
+ interface SendClientMessage extends Record<string, unknown> {
12
+ type: string;
13
+ }
14
+
15
+ function isAttachment(value: unknown): value is Attachment {
16
+ if (typeof value !== "object" || value === null) return false;
17
+ const attachment = value as Record<string, unknown>;
18
+ if (attachment.type !== "file" && attachment.type !== "snippet" && attachment.type !== "context") return false;
19
+ if (typeof attachment.name !== "string" || typeof attachment.content !== "string") return false;
20
+ return attachment.language === undefined || typeof attachment.language === "string";
21
+ }
22
+
23
+ function isMessage(value: unknown): value is Message {
24
+ if (typeof value !== "object" || value === null) return false;
25
+ const message = value as Record<string, unknown>;
26
+ if (typeof message.id !== "string" || typeof message.timestamp !== "number") return false;
27
+ if (message.replyTo !== undefined && typeof message.replyTo !== "string") return false;
28
+ if (message.expectsReply !== undefined && typeof message.expectsReply !== "boolean") return false;
29
+ if (typeof message.content !== "object" || message.content === null) return false;
30
+ const content = message.content as Record<string, unknown>;
31
+ if (typeof content.text !== "string") return false;
32
+ return content.attachments === undefined || (Array.isArray(content.attachments) && content.attachments.every(isAttachment));
33
+ }
34
+
35
+ function findSessions(sessions: Map<string, BrokerConnectedSession>, nameOrId: string): BrokerConnectedSession[] {
36
+ const byId = sessions.get(nameOrId);
37
+ if (byId) return [byId];
38
+ const lowerName = nameOrId.toLowerCase();
39
+ return Array.from(sessions.values()).filter((session) => session.info.name?.toLowerCase() === lowerName);
40
+ }
41
+
42
+ /** Validate and route one wire-level send request. */
43
+ export function handleBrokerSend(
44
+ socket: net.Socket,
45
+ clientMessage: SendClientMessage,
46
+ currentId: string | null,
47
+ sessions: Map<string, BrokerConnectedSession>,
48
+ deliveredMessages: DeliveredMessageCache,
49
+ write: (target: net.Socket, message: BrokerMessage) => void,
50
+ ): void {
51
+ const message = clientMessage.message;
52
+ const messageId = isMessage(message) ? message.id : "unknown";
53
+ const hasAttemptId = Object.prototype.hasOwnProperty.call(clientMessage, "attemptId");
54
+ if (hasAttemptId && typeof clientMessage.attemptId !== "string") {
55
+ write(socket, {
56
+ type: "delivery_failed",
57
+ messageId,
58
+ reason: "Invalid attemptId format",
59
+ });
60
+ return;
61
+ }
62
+ const attemptId = typeof clientMessage.attemptId === "string" ? clientMessage.attemptId : undefined;
63
+ if (typeof clientMessage.to !== "string" || !isMessage(message)) {
64
+ write(socket, { type: "delivery_failed", messageId, attemptId, reason: "Invalid message format" });
65
+ return;
66
+ }
67
+
68
+ const signature = buildMessageSendSignature(clientMessage.to, message);
69
+ const deliveredMatch = deliveredMessages.lookup(message.id, signature);
70
+ if (deliveredMatch === "match") {
71
+ write(socket, { type: "delivered", messageId: message.id, attemptId });
72
+ return;
73
+ }
74
+ if (deliveredMatch === "conflict") {
75
+ write(socket, {
76
+ type: "delivery_failed",
77
+ messageId: message.id,
78
+ attemptId,
79
+ reason: `Intercom message ID '${message.id}' was already delivered with a different target or payload`,
80
+ });
81
+ return;
82
+ }
83
+
84
+ const targets = findSessions(sessions, clientMessage.to);
85
+ if (targets.length === 1) {
86
+ const fromSession = currentId ? sessions.get(currentId) : undefined;
87
+ if (!fromSession) {
88
+ write(socket, { type: "delivery_failed", messageId: message.id, attemptId, reason: "Sender session not found" });
89
+ return;
90
+ }
91
+ write(targets[0].socket, { type: "message", from: fromSession.info, message });
92
+ deliveredMessages.record(message.id, signature);
93
+ write(socket, { type: "delivered", messageId: message.id, attemptId });
94
+ return;
95
+ }
96
+ if (targets.length > 1) {
97
+ write(socket, {
98
+ type: "delivery_failed",
99
+ messageId: message.id,
100
+ attemptId,
101
+ reason: `Multiple sessions named \"${clientMessage.to}\" are connected. Use the session ID instead.`,
102
+ });
103
+ return;
104
+ }
105
+ write(socket, { type: "delivery_failed", messageId: message.id, attemptId, reason: "Session not found" });
106
+ }
@@ -0,0 +1,37 @@
1
+ import type { Attachment, Message } from "../types.js";
2
+
3
+ export interface LogicalSendOptions {
4
+ text: string;
5
+ attachments?: Attachment[];
6
+ replyTo?: string;
7
+ expectsReply?: boolean;
8
+ }
9
+
10
+ function normalizeAttachments(attachments: Attachment[] | undefined): Array<Record<string, string>> | undefined {
11
+ return attachments?.map((attachment) => ({
12
+ type: attachment.type,
13
+ name: attachment.name,
14
+ content: attachment.content,
15
+ ...(attachment.language === undefined ? {} : { language: attachment.language }),
16
+ }));
17
+ }
18
+
19
+ /** Canonical identity for one logical send; transport attempt metadata is deliberately excluded. */
20
+ export function buildSendSignature(to: string, options: LogicalSendOptions): string {
21
+ return JSON.stringify({
22
+ to,
23
+ text: options.text,
24
+ attachments: normalizeAttachments(options.attachments) ?? [],
25
+ replyTo: options.replyTo ?? null,
26
+ expectsReply: options.expectsReply ?? false,
27
+ });
28
+ }
29
+
30
+ export function buildMessageSendSignature(to: string, message: Message): string {
31
+ return buildSendSignature(to, {
32
+ text: message.content.text,
33
+ attachments: message.content.attachments,
34
+ replyTo: message.replyTo,
35
+ expectsReply: message.expectsReply,
36
+ });
37
+ }