@bastani/atomic 0.9.12 → 0.9.13-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 (1187) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/README.md +35 -17
  3. package/dist/builtin/i-have-adhd/CHANGELOG.md +17 -0
  4. package/dist/builtin/i-have-adhd/LICENSE +21 -0
  5. package/dist/builtin/i-have-adhd/README.md +18 -0
  6. package/dist/builtin/i-have-adhd/index.ts +238 -0
  7. package/dist/builtin/i-have-adhd/package.json +56 -0
  8. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +140 -0
  9. package/dist/builtin/intercom/CHANGELOG.md +25 -0
  10. package/dist/builtin/intercom/README.md +30 -16
  11. package/dist/builtin/intercom/broker/bounded-stderr-install.ts +18 -0
  12. package/dist/builtin/intercom/broker/bounded-stderr.ts +132 -0
  13. package/dist/builtin/intercom/broker/broker.ts +12 -23
  14. package/dist/builtin/intercom/broker/client.ts +81 -5
  15. package/dist/builtin/intercom/broker/paths.ts +9 -0
  16. package/dist/builtin/intercom/broker/presence-handler.ts +103 -0
  17. package/dist/builtin/intercom/broker/spawn.ts +128 -29
  18. package/dist/builtin/intercom/contact-supervisor-tool.ts +13 -3
  19. package/dist/builtin/intercom/foreground-detach-handoff.ts +30 -14
  20. package/dist/builtin/intercom/group.ts +64 -25
  21. package/dist/builtin/intercom/index-heavy.ts +51 -8
  22. package/dist/builtin/intercom/index.ts +50 -22
  23. package/dist/builtin/intercom/intercom-tool.ts +82 -5
  24. package/dist/builtin/intercom/intercom-utils.ts +15 -29
  25. package/dist/builtin/intercom/lazy-subagent-ack.ts +11 -6
  26. package/dist/builtin/intercom/package.json +2 -3
  27. package/dist/builtin/intercom/runtime-group.ts +13 -0
  28. package/dist/builtin/intercom/skills/intercom/SKILL.md +30 -2
  29. package/dist/builtin/intercom/source-ownership.ts +9 -12
  30. package/dist/builtin/intercom/subagent-relay.ts +32 -16
  31. package/dist/builtin/intercom/terminal-ordering-barrier.ts +21 -4
  32. package/dist/builtin/intercom/types.ts +3 -1
  33. package/dist/builtin/intercom/ui/compose.ts +8 -6
  34. package/dist/builtin/intercom/ui/session-list.ts +7 -5
  35. package/dist/builtin/mcp/CHANGELOG.md +19 -0
  36. package/dist/builtin/mcp/README.md +3 -1
  37. package/dist/builtin/mcp/glimpse-ui.ts +2 -1
  38. package/dist/builtin/mcp/index.ts +10 -26
  39. package/dist/builtin/mcp/mcp-panel.ts +35 -34
  40. package/dist/builtin/mcp/mcp-setup-panel.ts +35 -33
  41. package/dist/builtin/mcp/npx-resolver.ts +3 -2
  42. package/dist/builtin/mcp/package.json +3 -3
  43. package/dist/builtin/mcp/sampling-handler.ts +5 -1
  44. package/dist/builtin/mcp/server-manager.ts +4 -7
  45. package/dist/builtin/mcp/startup-warmup.ts +20 -8
  46. package/dist/builtin/subagents/CHANGELOG.md +63 -0
  47. package/dist/builtin/subagents/README.md +144 -351
  48. package/dist/builtin/subagents/agents/worker.md +1 -1
  49. package/dist/builtin/subagents/package.json +5 -5
  50. package/dist/builtin/subagents/prompts/parallel-context-build.md +2 -2
  51. package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +4 -4
  52. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  53. package/dist/builtin/subagents/skills/subagent/SKILL.md +39 -102
  54. package/dist/builtin/subagents/src/agents/agent-discovery.ts +1 -29
  55. package/dist/builtin/subagents/src/agents/agent-loaders.ts +1 -40
  56. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +6 -135
  57. package/dist/builtin/subagents/src/agents/agent-management.ts +52 -282
  58. package/dist/builtin/subagents/src/agents/agent-paths.ts +0 -22
  59. package/dist/builtin/subagents/src/agents/agent-types.ts +0 -40
  60. package/dist/builtin/subagents/src/agents/agents.ts +0 -3
  61. package/dist/builtin/subagents/src/agents/identity.ts +2 -4
  62. package/dist/builtin/subagents/src/agents/skills-paths.ts +8 -1
  63. package/dist/builtin/subagents/src/extension/doctor.ts +4 -24
  64. package/dist/builtin/subagents/src/extension/fanout-child.ts +76 -56
  65. package/dist/builtin/subagents/src/extension/index.ts +32 -39
  66. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +2 -2
  67. package/dist/builtin/subagents/src/extension/schemas.ts +1 -157
  68. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +25 -46
  69. package/dist/builtin/subagents/src/extension/tool-description.ts +4 -13
  70. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +6 -2
  71. package/dist/builtin/subagents/src/intercom/result-intercom.ts +27 -29
  72. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +9 -2
  73. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +248 -435
  74. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +8 -3
  75. package/dist/builtin/subagents/src/runs/background/notify.ts +83 -26
  76. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -281
  77. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +0 -5
  78. package/dist/builtin/subagents/src/runs/foreground/execution.ts +1 -4
  79. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +559 -0
  80. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +103 -259
  81. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +29 -31
  82. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +10 -173
  83. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +7 -5
  84. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +13 -6
  85. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +1 -646
  86. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -7
  87. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -7
  88. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +39 -20
  89. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +16 -11
  90. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +1 -14
  91. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +194 -104
  92. package/dist/builtin/subagents/src/runs/inprocess/background-single.ts +195 -0
  93. package/dist/builtin/subagents/src/runs/inprocess/background.ts +90 -0
  94. package/dist/builtin/subagents/src/runs/inprocess/child-policy.ts +27 -0
  95. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +55 -0
  96. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +106 -0
  97. package/dist/builtin/subagents/src/runs/inprocess/index.ts +50 -0
  98. package/dist/builtin/subagents/src/runs/inprocess/nested-routing.ts +218 -0
  99. package/dist/builtin/subagents/src/runs/{shared/subagent-prompt-runtime.ts → inprocess/prompt-behavior.ts} +37 -75
  100. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +1392 -0
  101. package/dist/builtin/subagents/src/runs/{shared/nested-events.ts → inprocess/runtime-support/nested-api.ts} +13 -7
  102. package/dist/builtin/subagents/src/runs/{shared/nested-events-control.ts → inprocess/runtime-support/nested-control.ts} +18 -17
  103. package/dist/builtin/subagents/src/runs/{shared/nested-events-core.ts → inprocess/runtime-support/nested-core.ts} +14 -61
  104. package/dist/builtin/subagents/src/runs/{shared/nested-events-projection.ts → inprocess/runtime-support/nested-projection.ts} +4 -12
  105. package/dist/builtin/subagents/src/runs/{shared/nested-events-registry.ts → inprocess/runtime-support/nested-registry.ts} +19 -4
  106. package/dist/builtin/subagents/src/runs/{shared/nested-render.ts → inprocess/runtime-support/nested-rendering.ts} +3 -3
  107. package/dist/builtin/subagents/src/runs/{shared/nested-events-sanitize.ts → inprocess/runtime-support/nested-sanitize.ts} +4 -6
  108. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -0
  109. package/dist/builtin/subagents/src/runs/shared/intercom-group.ts +23 -7
  110. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +0 -1
  111. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +15 -492
  112. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +13 -97
  113. package/dist/builtin/subagents/src/runs/shared/run-history.ts +3 -5
  114. package/dist/builtin/subagents/src/runs/shared/single-output.ts +4 -4
  115. package/dist/builtin/subagents/src/runs/shared/worktree.ts +7 -2
  116. package/dist/builtin/subagents/src/shared/formatters.ts +2 -56
  117. package/dist/builtin/subagents/src/shared/settings.ts +14 -350
  118. package/dist/builtin/subagents/src/shared/types-async.ts +8 -32
  119. package/dist/builtin/subagents/src/shared/types-config.ts +29 -13
  120. package/dist/builtin/subagents/src/shared/types-depth.ts +30 -56
  121. package/dist/builtin/subagents/src/shared/types-results.ts +18 -60
  122. package/dist/builtin/subagents/src/shared/types-runtime.ts +0 -1
  123. package/dist/builtin/subagents/src/shared/utils.ts +5 -0
  124. package/dist/builtin/subagents/src/slash/bridge-settlement.ts +87 -0
  125. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +49 -10
  126. package/dist/builtin/subagents/src/slash/slash-bridge.ts +27 -7
  127. package/dist/builtin/subagents/src/slash/slash-commands.ts +37 -82
  128. package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -94
  129. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +3 -35
  130. package/dist/builtin/subagents/src/tui/render-progress.ts +89 -0
  131. package/dist/builtin/subagents/src/tui/render-result-compact.ts +77 -68
  132. package/dist/builtin/subagents/src/tui/render-result.ts +79 -99
  133. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -6
  134. package/dist/builtin/subagents/src/tui/render-status-progress.ts +8 -5
  135. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +6 -63
  136. package/dist/builtin/subagents/src/tui/render-widget.ts +0 -24
  137. package/dist/builtin/web-access/CHANGELOG.md +14 -0
  138. package/dist/builtin/web-access/chrome-cookies.ts +3 -2
  139. package/dist/builtin/web-access/github-api.ts +7 -6
  140. package/dist/builtin/web-access/github-extract.ts +2 -1
  141. package/dist/builtin/web-access/package.json +3 -3
  142. package/dist/builtin/web-access/subprocess.ts +3 -1
  143. package/dist/builtin/web-access/summary-review.ts +2 -2
  144. package/dist/builtin/web-access/web-search-features.ts +38 -22
  145. package/dist/builtin/web-access/web-search-summary.ts +2 -2
  146. package/dist/builtin/workflows/CHANGELOG.md +70 -0
  147. package/dist/builtin/workflows/README.md +54 -4
  148. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +3 -0
  149. package/dist/builtin/workflows/builtin/ralph-models.ts +25 -20
  150. package/dist/builtin/workflows/builtin/shared-prompts.ts +5 -2
  151. package/dist/builtin/workflows/package.json +2 -2
  152. package/dist/builtin/workflows/src/durable/backend.ts +25 -1
  153. package/dist/builtin/workflows/src/durable/completed-catalog-stage-groups.ts +60 -3
  154. package/dist/builtin/workflows/src/durable/completed-catalog.ts +67 -1
  155. package/dist/builtin/workflows/src/durable/completed-subtree.ts +22 -7
  156. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +15 -1
  157. package/dist/builtin/workflows/src/durable/local-command.ts +2 -1
  158. package/dist/builtin/workflows/src/durable/resume-runtime.ts +1 -0
  159. package/dist/builtin/workflows/src/durable/tool-primitive.ts +4 -28
  160. package/dist/builtin/workflows/src/durable/types.ts +22 -1
  161. package/dist/builtin/workflows/src/durable/workflow-child-result.ts +3 -1
  162. package/dist/builtin/workflows/src/engine/primitives/workflow.ts +1 -1
  163. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +10 -2
  164. package/dist/builtin/workflows/src/engine/run-durable-topology.ts +9 -2
  165. package/dist/builtin/workflows/src/engine/run.ts +17 -1
  166. package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +18 -39
  167. package/dist/builtin/workflows/src/extension/companions.ts +1 -1
  168. package/dist/builtin/workflows/src/extension/config-file-loader.ts +10 -1
  169. package/dist/builtin/workflows/src/extension/config-loader.ts +1 -1
  170. package/dist/builtin/workflows/src/extension/dispatcher.ts +4 -0
  171. package/dist/builtin/workflows/src/extension/index.bundle.mjs +2095 -1181
  172. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +332 -39
  173. package/dist/builtin/workflows/src/extension/mcp.ts +13 -2
  174. package/dist/builtin/workflows/src/extension/render-result.ts +5 -0
  175. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +6 -3
  176. package/dist/builtin/workflows/src/extension/runtime.ts +7 -1
  177. package/dist/builtin/workflows/src/extension/ui-surface.ts +7 -20
  178. package/dist/builtin/workflows/src/extension/wiring.ts +86 -17
  179. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +12 -3
  180. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +5 -2
  181. package/dist/builtin/workflows/src/extension/workflow-ports.ts +14 -6
  182. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +11 -6
  183. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +17 -7
  184. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +11 -0
  185. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +18 -1
  186. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +12 -8
  187. package/dist/builtin/workflows/src/extension/workflow-tool.ts +9 -4
  188. package/dist/builtin/workflows/src/intercom/intercom-routing.ts +12 -6
  189. package/dist/builtin/workflows/src/intercom/result-intercom.ts +35 -4
  190. package/dist/builtin/workflows/src/runs/background/quit.ts +28 -4
  191. package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +2 -1
  192. package/dist/builtin/workflows/src/runs/background/status.ts +70 -8
  193. package/dist/builtin/workflows/src/runs/foreground/executor-abort.ts +11 -3
  194. package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +2 -1
  195. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +4 -0
  196. package/dist/builtin/workflows/src/runs/foreground/executor-exit-manager.ts +26 -2
  197. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +3 -1
  198. package/dist/builtin/workflows/src/runs/foreground/executor-run-finalizers.ts +3 -2
  199. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +1 -1
  200. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +1 -1
  201. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +688 -38
  202. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +3 -1
  203. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +19 -514
  204. package/dist/builtin/workflows/src/runs/shared/retry.ts +44 -0
  205. package/dist/builtin/workflows/src/runs/shared/worktree-git-runner.ts +5 -2
  206. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +2 -0
  207. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +10 -3
  208. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +11 -3
  209. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +5 -1
  210. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +5 -0
  211. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +34 -2
  212. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +28 -6
  213. package/dist/builtin/workflows/src/shared/persistence-restore.ts +3 -0
  214. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +4 -0
  215. package/dist/builtin/workflows/src/shared/run-indicator-status.ts +75 -0
  216. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +10 -4
  217. package/dist/builtin/workflows/src/shared/store-public-types.ts +47 -9
  218. package/dist/builtin/workflows/src/shared/store-run-methods.ts +42 -8
  219. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +31 -8
  220. package/dist/builtin/workflows/src/shared/store-types.ts +35 -1
  221. package/dist/builtin/workflows/src/shared/timing.ts +10 -0
  222. package/dist/builtin/workflows/src/shared/workflow-artifact-env.ts +21 -0
  223. package/dist/builtin/workflows/src/shared/workflow-artifacts.ts +2 -5
  224. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +22 -2
  225. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +37 -2
  226. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +0 -15
  227. package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +38 -47
  228. package/dist/builtin/workflows/src/tui/graph-view-input.ts +48 -45
  229. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +266 -0
  230. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +1 -86
  231. package/dist/builtin/workflows/src/tui/graph-view-render.ts +209 -91
  232. package/dist/builtin/workflows/src/tui/graph-view-state.ts +5 -7
  233. package/dist/builtin/workflows/src/tui/graph-view-types.ts +13 -7
  234. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +8 -6
  235. package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +2 -1
  236. package/dist/builtin/workflows/src/tui/inputs-overlay.ts +7 -4
  237. package/dist/builtin/workflows/src/tui/inputs-picker-input.ts +66 -0
  238. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +1 -0
  239. package/dist/builtin/workflows/src/tui/node-card.ts +1 -1
  240. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +18 -46
  241. package/dist/builtin/workflows/src/tui/overlay-terminal-modes.ts +15 -26
  242. package/dist/builtin/workflows/src/tui/session-list.ts +1 -1
  243. package/dist/builtin/workflows/src/tui/session-overlays.ts +19 -12
  244. package/dist/builtin/workflows/src/tui/session-picker.ts +47 -4
  245. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +5 -14
  246. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +8 -7
  247. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +12 -3
  248. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +1 -11
  249. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +0 -8
  250. package/dist/builtin/workflows/src/tui/status-list.ts +32 -47
  251. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +9 -5
  252. package/dist/builtin/workflows/src/tui/widget.ts +16 -46
  253. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +0 -15
  254. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +2 -26
  255. package/dist/builtin/workflows/src/tui/workflow-status.ts +3 -3
  256. package/dist/bun/split-loader.js +2 -0
  257. package/dist/bun/split-loader.js.map +1 -1
  258. package/dist/cli/args.d.ts.map +1 -1
  259. package/dist/cli/args.js +6 -2
  260. package/dist/cli/args.js.map +1 -1
  261. package/dist/cli/auth-check.d.ts +35 -0
  262. package/dist/cli/auth-check.d.ts.map +1 -0
  263. package/dist/cli/auth-check.js +100 -0
  264. package/dist/cli/auth-check.js.map +1 -0
  265. package/dist/cli/auth-command.d.ts +27 -0
  266. package/dist/cli/auth-command.d.ts.map +1 -0
  267. package/dist/cli/auth-command.js +150 -0
  268. package/dist/cli/auth-command.js.map +1 -0
  269. package/dist/cli/config-selector.js +2 -2
  270. package/dist/cli/config-selector.js.map +1 -1
  271. package/dist/cli/credential-print.d.ts +18 -23
  272. package/dist/cli/credential-print.d.ts.map +1 -1
  273. package/dist/cli/credential-print.js +42 -88
  274. package/dist/cli/credential-print.js.map +1 -1
  275. package/dist/cli/experimental/auth.d.ts +16 -0
  276. package/dist/cli/experimental/auth.d.ts.map +1 -0
  277. package/dist/cli/experimental/auth.js +13 -0
  278. package/dist/cli/experimental/auth.js.map +1 -0
  279. package/dist/cli/experimental/cli.d.ts +6 -0
  280. package/dist/cli/experimental/cli.d.ts.map +1 -0
  281. package/dist/cli/experimental/cli.js +5 -0
  282. package/dist/cli/experimental/cli.js.map +1 -0
  283. package/dist/cli/experimental/command-options.d.ts +17 -0
  284. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  285. package/dist/cli/experimental/command-options.js +35 -0
  286. package/dist/cli/experimental/command-options.js.map +1 -0
  287. package/dist/cli/experimental/command.d.ts +63 -0
  288. package/dist/cli/experimental/command.d.ts.map +1 -0
  289. package/dist/cli/experimental/command.js +127 -0
  290. package/dist/cli/experimental/command.js.map +1 -0
  291. package/dist/cli/experimental/commands/client.d.ts +13 -0
  292. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  293. package/dist/cli/experimental/commands/client.js +25 -0
  294. package/dist/cli/experimental/commands/client.js.map +1 -0
  295. package/dist/cli/experimental/commands/pi.d.ts +15 -0
  296. package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
  297. package/dist/cli/experimental/commands/pi.js +28 -0
  298. package/dist/cli/experimental/commands/pi.js.map +1 -0
  299. package/dist/cli/experimental/commands/server.d.ts +13 -0
  300. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  301. package/dist/cli/experimental/commands/server.js +25 -0
  302. package/dist/cli/experimental/commands/server.js.map +1 -0
  303. package/dist/cli/experimental/transport-address.d.ts +10 -0
  304. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  305. package/dist/cli/experimental/transport-address.js +38 -0
  306. package/dist/cli/experimental/transport-address.js.map +1 -0
  307. package/dist/cli/session-picker.js +2 -2
  308. package/dist/cli/session-picker.js.map +1 -1
  309. package/dist/cli/startup-ui.d.ts.map +1 -1
  310. package/dist/cli/startup-ui.js +4 -10
  311. package/dist/cli/startup-ui.js.map +1 -1
  312. package/dist/cli.js +2 -0
  313. package/dist/cli.js.map +1 -1
  314. package/dist/client/index.d.ts +3 -0
  315. package/dist/client/index.d.ts.map +1 -0
  316. package/dist/client/index.js +3 -0
  317. package/dist/client/index.js.map +1 -0
  318. package/dist/client/remote-session.d.ts +64 -0
  319. package/dist/client/remote-session.d.ts.map +1 -0
  320. package/dist/client/remote-session.js +351 -0
  321. package/dist/client/remote-session.js.map +1 -0
  322. package/dist/client/transcript.d.ts +12 -0
  323. package/dist/client/transcript.d.ts.map +1 -0
  324. package/dist/client/transcript.js +98 -0
  325. package/dist/client/transcript.js.map +1 -0
  326. package/dist/core/agent-session-auto-compaction.d.ts +17 -13
  327. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  328. package/dist/core/agent-session-auto-compaction.js +192 -67
  329. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  330. package/dist/core/agent-session-bash.d.ts.map +1 -1
  331. package/dist/core/agent-session-bash.js +2 -0
  332. package/dist/core/agent-session-bash.js.map +1 -1
  333. package/dist/core/agent-session-compaction.d.ts +3 -6
  334. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  335. package/dist/core/agent-session-compaction.js +64 -28
  336. package/dist/core/agent-session-compaction.js.map +1 -1
  337. package/dist/core/agent-session-events.d.ts +1 -11
  338. package/dist/core/agent-session-events.d.ts.map +1 -1
  339. package/dist/core/agent-session-events.js +64 -37
  340. package/dist/core/agent-session-events.js.map +1 -1
  341. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  342. package/dist/core/agent-session-extension-bindings.js +4 -2
  343. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  344. package/dist/core/agent-session-methods.d.ts +19 -2
  345. package/dist/core/agent-session-methods.d.ts.map +1 -1
  346. package/dist/core/agent-session-methods.js.map +1 -1
  347. package/dist/core/agent-session-models.d.ts +1 -0
  348. package/dist/core/agent-session-models.d.ts.map +1 -1
  349. package/dist/core/agent-session-models.js +23 -5
  350. package/dist/core/agent-session-models.js.map +1 -1
  351. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  352. package/dist/core/agent-session-post-tool-compaction.js +22 -6
  353. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  354. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  355. package/dist/core/agent-session-prompt.js +4 -0
  356. package/dist/core/agent-session-prompt.js.map +1 -1
  357. package/dist/core/agent-session-retry.d.ts +21 -4
  358. package/dist/core/agent-session-retry.d.ts.map +1 -1
  359. package/dist/core/agent-session-retry.js +232 -106
  360. package/dist/core/agent-session-retry.js.map +1 -1
  361. package/dist/core/agent-session-runtime-auth.d.ts.map +1 -1
  362. package/dist/core/agent-session-runtime-auth.js +3 -0
  363. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  364. package/dist/core/agent-session-state.d.ts.map +1 -1
  365. package/dist/core/agent-session-state.js +2 -1
  366. package/dist/core/agent-session-state.js.map +1 -1
  367. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  368. package/dist/core/agent-session-tool-hooks.js +37 -14
  369. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  370. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  371. package/dist/core/agent-session-tool-registry.js +5 -1
  372. package/dist/core/agent-session-tool-registry.js.map +1 -1
  373. package/dist/core/agent-session-types.d.ts +5 -1
  374. package/dist/core/agent-session-types.d.ts.map +1 -1
  375. package/dist/core/agent-session-types.js.map +1 -1
  376. package/dist/core/agent-session.d.ts +18 -1
  377. package/dist/core/agent-session.d.ts.map +1 -1
  378. package/dist/core/agent-session.js +37 -0
  379. package/dist/core/agent-session.js.map +1 -1
  380. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  381. package/dist/core/atomic-guide-command.js +2 -3
  382. package/dist/core/atomic-guide-command.js.map +1 -1
  383. package/dist/core/auth-storage.d.ts +18 -1
  384. package/dist/core/auth-storage.d.ts.map +1 -1
  385. package/dist/core/auth-storage.js +83 -0
  386. package/dist/core/auth-storage.js.map +1 -1
  387. package/dist/core/bash-executor.d.ts +5 -0
  388. package/dist/core/bash-executor.d.ts.map +1 -1
  389. package/dist/core/bash-executor.js +43 -19
  390. package/dist/core/bash-executor.js.map +1 -1
  391. package/dist/core/builtin-packages.d.ts.map +1 -1
  392. package/dist/core/builtin-packages.js +6 -0
  393. package/dist/core/builtin-packages.js.map +1 -1
  394. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  395. package/dist/core/codex-fast-mode.js +8 -3
  396. package/dist/core/codex-fast-mode.js.map +1 -1
  397. package/dist/core/exec.d.ts.map +1 -1
  398. package/dist/core/exec.js +4 -3
  399. package/dist/core/exec.js.map +1 -1
  400. package/dist/core/extensions/agent-events.d.ts +0 -1
  401. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  402. package/dist/core/extensions/agent-events.js.map +1 -1
  403. package/dist/core/extensions/api-types.d.ts +5 -3
  404. package/dist/core/extensions/api-types.d.ts.map +1 -1
  405. package/dist/core/extensions/api-types.js.map +1 -1
  406. package/dist/core/extensions/context-types.d.ts +40 -0
  407. package/dist/core/extensions/context-types.d.ts.map +1 -1
  408. package/dist/core/extensions/context-types.js.map +1 -1
  409. package/dist/core/extensions/event-results.d.ts +5 -0
  410. package/dist/core/extensions/event-results.d.ts.map +1 -1
  411. package/dist/core/extensions/event-results.js.map +1 -1
  412. package/dist/core/extensions/index.d.ts +2 -1
  413. package/dist/core/extensions/index.d.ts.map +1 -1
  414. package/dist/core/extensions/index.js +1 -0
  415. package/dist/core/extensions/index.js.map +1 -1
  416. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  417. package/dist/core/extensions/loader-api.js +14 -1
  418. package/dist/core/extensions/loader-api.js.map +1 -1
  419. package/dist/core/extensions/loader-discovery.d.ts.map +1 -1
  420. package/dist/core/extensions/loader-discovery.js +3 -23
  421. package/dist/core/extensions/loader-discovery.js.map +1 -1
  422. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  423. package/dist/core/extensions/loader-runtime.js +20 -3
  424. package/dist/core/extensions/loader-runtime.js.map +1 -1
  425. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  426. package/dist/core/extensions/loader-virtual-modules.js +7 -1
  427. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  428. package/dist/core/extensions/message-types.d.ts +6 -0
  429. package/dist/core/extensions/message-types.d.ts.map +1 -1
  430. package/dist/core/extensions/message-types.js.map +1 -1
  431. package/dist/core/extensions/provider-types.d.ts +9 -3
  432. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  433. package/dist/core/extensions/provider-types.js.map +1 -1
  434. package/dist/core/extensions/runner-context.d.ts +2 -1
  435. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  436. package/dist/core/extensions/runner-context.js +4 -0
  437. package/dist/core/extensions/runner-context.js.map +1 -1
  438. package/dist/core/extensions/runner-registries.d.ts +2 -1
  439. package/dist/core/extensions/runner-registries.d.ts.map +1 -1
  440. package/dist/core/extensions/runner-registries.js +3 -0
  441. package/dist/core/extensions/runner-registries.js.map +1 -1
  442. package/dist/core/extensions/runner-ui.d.ts.map +1 -1
  443. package/dist/core/extensions/runner-ui.js +1 -0
  444. package/dist/core/extensions/runner-ui.js.map +1 -1
  445. package/dist/core/extensions/runner.d.ts +4 -2
  446. package/dist/core/extensions/runner.d.ts.map +1 -1
  447. package/dist/core/extensions/runner.js +9 -3
  448. package/dist/core/extensions/runner.js.map +1 -1
  449. package/dist/core/extensions/runtime-types.d.ts +4 -1
  450. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  451. package/dist/core/extensions/runtime-types.js.map +1 -1
  452. package/dist/core/extensions/stale-context.d.ts +5 -0
  453. package/dist/core/extensions/stale-context.d.ts.map +1 -0
  454. package/dist/core/extensions/stale-context.js +11 -0
  455. package/dist/core/extensions/stale-context.js.map +1 -0
  456. package/dist/core/extensions/ui-types.d.ts +14 -11
  457. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  458. package/dist/core/extensions/ui-types.js.map +1 -1
  459. package/dist/core/footer-data-provider.d.ts.map +1 -1
  460. package/dist/core/footer-data-provider.js +3 -2
  461. package/dist/core/footer-data-provider.js.map +1 -1
  462. package/dist/core/index.d.ts +1 -1
  463. package/dist/core/index.d.ts.map +1 -1
  464. package/dist/core/index.js.map +1 -1
  465. package/dist/core/intercom-runtime-group.d.ts +13 -0
  466. package/dist/core/intercom-runtime-group.d.ts.map +1 -0
  467. package/dist/core/intercom-runtime-group.js +23 -0
  468. package/dist/core/intercom-runtime-group.js.map +1 -0
  469. package/dist/core/keybindings.d.ts +44 -4
  470. package/dist/core/keybindings.d.ts.map +1 -1
  471. package/dist/core/model-config.d.ts +39 -5
  472. package/dist/core/model-config.d.ts.map +1 -1
  473. package/dist/core/model-config.js +6 -0
  474. package/dist/core/model-config.js.map +1 -1
  475. package/dist/core/model-fallback-failures.d.ts +30 -0
  476. package/dist/core/model-fallback-failures.d.ts.map +1 -0
  477. package/dist/core/model-fallback-failures.js +610 -0
  478. package/dist/core/model-fallback-failures.js.map +1 -0
  479. package/dist/core/model-registry.d.ts +12 -5
  480. package/dist/core/model-registry.d.ts.map +1 -1
  481. package/dist/core/model-registry.js +20 -12
  482. package/dist/core/model-registry.js.map +1 -1
  483. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  484. package/dist/core/model-resolver-cli.js +46 -14
  485. package/dist/core/model-resolver-cli.js.map +1 -1
  486. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  487. package/dist/core/model-resolver-defaults.js +2 -0
  488. package/dist/core/model-resolver-defaults.js.map +1 -1
  489. package/dist/core/model-resolver-scope.d.ts +2 -0
  490. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  491. package/dist/core/model-resolver-scope.js +12 -9
  492. package/dist/core/model-resolver-scope.js.map +1 -1
  493. package/dist/core/model-resolver.d.ts +1 -1
  494. package/dist/core/model-resolver.d.ts.map +1 -1
  495. package/dist/core/model-resolver.js +1 -1
  496. package/dist/core/model-resolver.js.map +1 -1
  497. package/dist/core/model-runtime-snapshot.d.ts +10 -0
  498. package/dist/core/model-runtime-snapshot.d.ts.map +1 -1
  499. package/dist/core/model-runtime-snapshot.js +14 -1
  500. package/dist/core/model-runtime-snapshot.js.map +1 -1
  501. package/dist/core/model-runtime-streaming.d.ts +3 -1
  502. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  503. package/dist/core/model-runtime-streaming.js +16 -0
  504. package/dist/core/model-runtime-streaming.js.map +1 -1
  505. package/dist/core/model-runtime-types.d.ts +2 -0
  506. package/dist/core/model-runtime-types.d.ts.map +1 -1
  507. package/dist/core/model-runtime-types.js.map +1 -1
  508. package/dist/core/model-runtime.d.ts +37 -10
  509. package/dist/core/model-runtime.d.ts.map +1 -1
  510. package/dist/core/model-runtime.js +312 -113
  511. package/dist/core/model-runtime.js.map +1 -1
  512. package/dist/core/oauth-login.d.ts.map +1 -1
  513. package/dist/core/oauth-login.js +2 -1
  514. package/dist/core/oauth-login.js.map +1 -1
  515. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
  516. package/dist/core/openai-responses-payload-sanitizer.js +18 -2
  517. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  518. package/dist/core/package-manager-git.d.ts.map +1 -1
  519. package/dist/core/package-manager-git.js +56 -10
  520. package/dist/core/package-manager-git.js.map +1 -1
  521. package/dist/core/package-manager-manifest.d.ts +1 -1
  522. package/dist/core/package-manager-manifest.d.ts.map +1 -1
  523. package/dist/core/package-manager-manifest.js +19 -9
  524. package/dist/core/package-manager-manifest.js.map +1 -1
  525. package/dist/core/package-manager-resource-collector.js.map +1 -1
  526. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  527. package/dist/core/package-manager-resource-files.js +1 -2
  528. package/dist/core/package-manager-resource-files.js.map +1 -1
  529. package/dist/core/provider-composer-internal.d.ts +10 -2
  530. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  531. package/dist/core/provider-composer-internal.js +7 -3
  532. package/dist/core/provider-composer-internal.js.map +1 -1
  533. package/dist/core/provider-composer.d.ts.map +1 -1
  534. package/dist/core/provider-composer.js +19 -12
  535. package/dist/core/provider-composer.js.map +1 -1
  536. package/dist/core/provider-display-names.d.ts.map +1 -1
  537. package/dist/core/provider-display-names.js +2 -0
  538. package/dist/core/provider-display-names.js.map +1 -1
  539. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  540. package/dist/core/remote-catalog-provider.js +77 -67
  541. package/dist/core/remote-catalog-provider.js.map +1 -1
  542. package/dist/core/resolve-config-value.d.ts.map +1 -1
  543. package/dist/core/resolve-config-value.js +3 -0
  544. package/dist/core/resolve-config-value.js.map +1 -1
  545. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  546. package/dist/core/resource-loader-context-files.js +13 -5
  547. package/dist/core/resource-loader-context-files.js.map +1 -1
  548. package/dist/core/retry-policy.d.ts +30 -0
  549. package/dist/core/retry-policy.d.ts.map +1 -0
  550. package/dist/core/retry-policy.js +25 -0
  551. package/dist/core/retry-policy.js.map +1 -0
  552. package/dist/core/runtime-credentials.d.ts +5 -5
  553. package/dist/core/runtime-credentials.d.ts.map +1 -1
  554. package/dist/core/runtime-credentials.js +8 -8
  555. package/dist/core/runtime-credentials.js.map +1 -1
  556. package/dist/core/sdk-types.d.ts +8 -2
  557. package/dist/core/sdk-types.d.ts.map +1 -1
  558. package/dist/core/sdk-types.js.map +1 -1
  559. package/dist/core/sdk.d.ts.map +1 -1
  560. package/dist/core/sdk.js +6 -1
  561. package/dist/core/sdk.js.map +1 -1
  562. package/dist/core/session-manager-core.d.ts +2 -0
  563. package/dist/core/session-manager-core.d.ts.map +1 -1
  564. package/dist/core/session-manager-core.js +7 -0
  565. package/dist/core/session-manager-core.js.map +1 -1
  566. package/dist/core/session-manager-list.d.ts.map +1 -1
  567. package/dist/core/session-manager-list.js +3 -1
  568. package/dist/core/session-manager-list.js.map +1 -1
  569. package/dist/core/settings-manager-ui-accessors.d.ts +8 -1
  570. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  571. package/dist/core/settings-manager-ui-accessors.js +31 -0
  572. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  573. package/dist/core/settings-manager.d.ts +2 -1
  574. package/dist/core/settings-manager.d.ts.map +1 -1
  575. package/dist/core/settings-manager.js.map +1 -1
  576. package/dist/core/settings-merge.d.ts.map +1 -1
  577. package/dist/core/settings-merge.js +13 -16
  578. package/dist/core/settings-merge.js.map +1 -1
  579. package/dist/core/settings-types.d.ts +5 -0
  580. package/dist/core/settings-types.d.ts.map +1 -1
  581. package/dist/core/settings-types.js.map +1 -1
  582. package/dist/core/slash-commands.d.ts.map +1 -1
  583. package/dist/core/slash-commands.js +0 -2
  584. package/dist/core/slash-commands.js.map +1 -1
  585. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +2 -2
  586. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -1
  587. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +39 -2
  588. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  589. package/dist/core/tools/bash-async-execution.d.ts +2 -0
  590. package/dist/core/tools/bash-async-execution.d.ts.map +1 -1
  591. package/dist/core/tools/bash-async-execution.js +4 -1
  592. package/dist/core/tools/bash-async-execution.js.map +1 -1
  593. package/dist/core/tools/bash-async-output.d.ts +1 -0
  594. package/dist/core/tools/bash-async-output.d.ts.map +1 -1
  595. package/dist/core/tools/bash-async-output.js +62 -27
  596. package/dist/core/tools/bash-async-output.js.map +1 -1
  597. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  598. package/dist/core/tools/bash-pty-native.js +2 -1
  599. package/dist/core/tools/bash-pty-native.js.map +1 -1
  600. package/dist/core/tools/bash.d.ts +9 -0
  601. package/dist/core/tools/bash.d.ts.map +1 -1
  602. package/dist/core/tools/bash.js +34 -16
  603. package/dist/core/tools/bash.js.map +1 -1
  604. package/dist/core/tools/directory-tree.d.ts +11 -0
  605. package/dist/core/tools/directory-tree.d.ts.map +1 -1
  606. package/dist/core/tools/directory-tree.js +26 -0
  607. package/dist/core/tools/directory-tree.js.map +1 -1
  608. package/dist/core/tools/edit.d.ts +4 -0
  609. package/dist/core/tools/edit.d.ts.map +1 -1
  610. package/dist/core/tools/edit.js +12 -8
  611. package/dist/core/tools/edit.js.map +1 -1
  612. package/dist/core/tools/errno.d.ts +25 -0
  613. package/dist/core/tools/errno.d.ts.map +1 -0
  614. package/dist/core/tools/errno.js +29 -0
  615. package/dist/core/tools/errno.js.map +1 -0
  616. package/dist/core/tools/find.d.ts +8 -1
  617. package/dist/core/tools/find.d.ts.map +1 -1
  618. package/dist/core/tools/find.js +20 -15
  619. package/dist/core/tools/find.js.map +1 -1
  620. package/dist/core/tools/grep.d.ts.map +1 -1
  621. package/dist/core/tools/grep.js +5 -1
  622. package/dist/core/tools/grep.js.map +1 -1
  623. package/dist/core/tools/index.d.ts +7 -7
  624. package/dist/core/tools/index.d.ts.map +1 -1
  625. package/dist/core/tools/index.js +7 -7
  626. package/dist/core/tools/index.js.map +1 -1
  627. package/dist/core/tools/ls.d.ts +4 -0
  628. package/dist/core/tools/ls.d.ts.map +1 -1
  629. package/dist/core/tools/ls.js +5 -1
  630. package/dist/core/tools/ls.js.map +1 -1
  631. package/dist/core/tools/output-accumulator.d.ts +8 -1
  632. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  633. package/dist/core/tools/output-accumulator.js +50 -28
  634. package/dist/core/tools/output-accumulator.js.map +1 -1
  635. package/dist/core/tools/oversized-tool-result.d.ts.map +1 -1
  636. package/dist/core/tools/oversized-tool-result.js +129 -22
  637. package/dist/core/tools/oversized-tool-result.js.map +1 -1
  638. package/dist/core/tools/persisted-output-file.d.ts +80 -0
  639. package/dist/core/tools/persisted-output-file.d.ts.map +1 -0
  640. package/dist/core/tools/persisted-output-file.js +284 -0
  641. package/dist/core/tools/persisted-output-file.js.map +1 -0
  642. package/dist/core/tools/read.d.ts +10 -0
  643. package/dist/core/tools/read.d.ts.map +1 -1
  644. package/dist/core/tools/read.js +20 -8
  645. package/dist/core/tools/read.js.map +1 -1
  646. package/dist/core/tools/search.d.ts +4 -0
  647. package/dist/core/tools/search.d.ts.map +1 -1
  648. package/dist/core/tools/search.js +5 -1
  649. package/dist/core/tools/search.js.map +1 -1
  650. package/dist/core/tools/session-temp-cleanup.d.ts +133 -0
  651. package/dist/core/tools/session-temp-cleanup.d.ts.map +1 -0
  652. package/dist/core/tools/session-temp-cleanup.js +669 -0
  653. package/dist/core/tools/session-temp-cleanup.js.map +1 -0
  654. package/dist/core/tools/session-temp-dir.d.ts +116 -0
  655. package/dist/core/tools/session-temp-dir.d.ts.map +1 -0
  656. package/dist/core/tools/session-temp-dir.js +409 -0
  657. package/dist/core/tools/session-temp-dir.js.map +1 -0
  658. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  659. package/dist/core/tools/tool-definition-wrapper.js +2 -0
  660. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  661. package/dist/core/tools/tool-limits.d.ts +11 -0
  662. package/dist/core/tools/tool-limits.d.ts.map +1 -1
  663. package/dist/core/tools/tool-limits.js +11 -0
  664. package/dist/core/tools/tool-limits.js.map +1 -1
  665. package/dist/core/tools/windows-directory-security.d.ts +82 -0
  666. package/dist/core/tools/windows-directory-security.d.ts.map +1 -0
  667. package/dist/core/tools/windows-directory-security.js +238 -0
  668. package/dist/core/tools/windows-directory-security.js.map +1 -0
  669. package/dist/core/tools/write.d.ts +4 -0
  670. package/dist/core/tools/write.d.ts.map +1 -1
  671. package/dist/core/tools/write.js +8 -4
  672. package/dist/core/tools/write.js.map +1 -1
  673. package/dist/core/trust-manager.js +1 -1
  674. package/dist/core/trust-manager.js.map +1 -1
  675. package/dist/extensions/llama/huggingface-ui.d.ts +1 -1
  676. package/dist/extensions/llama/huggingface-ui.d.ts.map +1 -1
  677. package/dist/extensions/llama/huggingface-ui.js +6 -5
  678. package/dist/extensions/llama/huggingface-ui.js.map +1 -1
  679. package/dist/extensions/llama/index.d.ts.map +1 -1
  680. package/dist/extensions/llama/index.js +11 -2
  681. package/dist/extensions/llama/index.js.map +1 -1
  682. package/dist/extensions/llama/provider.d.ts.map +1 -1
  683. package/dist/extensions/llama/provider.js +24 -8
  684. package/dist/extensions/llama/provider.js.map +1 -1
  685. package/dist/extensions/llama/ui.d.ts.map +1 -1
  686. package/dist/extensions/llama/ui.js +5 -2
  687. package/dist/extensions/llama/ui.js.map +1 -1
  688. package/dist/index-extensions.d.ts +2 -2
  689. package/dist/index-extensions.d.ts.map +1 -1
  690. package/dist/index-extensions.js +1 -1
  691. package/dist/index-extensions.js.map +1 -1
  692. package/dist/index.d.ts +8 -2
  693. package/dist/index.d.ts.map +1 -1
  694. package/dist/index.js +8 -2
  695. package/dist/index.js.map +1 -1
  696. package/dist/main-runtime-api-key.d.ts +2 -2
  697. package/dist/main-runtime-api-key.d.ts.map +1 -1
  698. package/dist/main-runtime-api-key.js +7 -2
  699. package/dist/main-runtime-api-key.js.map +1 -1
  700. package/dist/main-session.js +2 -2
  701. package/dist/main-session.js.map +1 -1
  702. package/dist/main.d.ts.map +1 -1
  703. package/dist/main.js +130 -26
  704. package/dist/main.js.map +1 -1
  705. package/dist/modes/index.d.ts +1 -0
  706. package/dist/modes/index.d.ts.map +1 -1
  707. package/dist/modes/index.js.map +1 -1
  708. package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
  709. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  710. package/dist/modes/interactive/components/assistant-message.js +18 -5
  711. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  712. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  713. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  714. package/dist/modes/interactive/components/bordered-loader.js +5 -4
  715. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  716. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  717. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  718. package/dist/modes/interactive/components/branch-summary-message.js +3 -2
  719. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  720. package/dist/modes/interactive/components/chat-message-renderer.d.ts +17 -7
  721. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  722. package/dist/modes/interactive/components/chat-message-renderer.js +35 -69
  723. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  724. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  725. package/dist/modes/interactive/components/chat-session-host-actions.js +11 -3
  726. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  727. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  728. package/dist/modes/interactive/components/chat-session-host-events.js +25 -15
  729. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  730. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  731. package/dist/modes/interactive/components/chat-session-host-rendering.js +9 -4
  732. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  733. package/dist/modes/interactive/components/chat-session-host-state.d.ts +2 -0
  734. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  735. package/dist/modes/interactive/components/chat-session-host-state.js +2 -0
  736. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  737. package/dist/modes/interactive/components/chat-session-host.d.ts +9 -0
  738. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  739. package/dist/modes/interactive/components/chat-session-host.js +14 -0
  740. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  741. package/dist/modes/interactive/components/chat-transcript.d.ts +32 -0
  742. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  743. package/dist/modes/interactive/components/chat-transcript.js +173 -5
  744. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  745. package/dist/modes/interactive/components/config-selector-list.d.ts +1 -1
  746. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  747. package/dist/modes/interactive/components/config-selector-list.js +9 -8
  748. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  749. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  750. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  751. package/dist/modes/interactive/components/custom-editor.js +32 -10
  752. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  753. package/dist/modes/interactive/components/custom-message.d.ts +2 -1
  754. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  755. package/dist/modes/interactive/components/custom-message.js +3 -2
  756. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  757. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  758. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  759. package/dist/modes/interactive/components/extension-editor.js +3 -2
  760. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  761. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  762. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  763. package/dist/modes/interactive/components/extension-input.js +1 -0
  764. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  765. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  766. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  767. package/dist/modes/interactive/components/extension-selector.js +4 -0
  768. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  769. package/dist/modes/interactive/components/fast-mode-selector.d.ts +1 -1
  770. package/dist/modes/interactive/components/fast-mode-selector.d.ts.map +1 -1
  771. package/dist/modes/interactive/components/fast-mode-selector.js +7 -5
  772. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  773. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
  774. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  775. package/dist/modes/interactive/components/first-time-setup.js +3 -0
  776. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  777. package/dist/modes/interactive/components/footer.js +1 -1
  778. package/dist/modes/interactive/components/footer.js.map +1 -1
  779. package/dist/modes/interactive/components/host-input-form.d.ts +1 -1
  780. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -1
  781. package/dist/modes/interactive/components/host-input-form.js +6 -5
  782. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  783. package/dist/modes/interactive/components/index.d.ts +1 -1
  784. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  785. package/dist/modes/interactive/components/index.js.map +1 -1
  786. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  787. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  788. package/dist/modes/interactive/components/login-dialog.js +2 -1
  789. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  790. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  791. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  792. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  793. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  794. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  795. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  796. package/dist/modes/interactive/components/mermaid.js +81 -0
  797. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  798. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  799. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  800. package/dist/modes/interactive/components/model-selector.js +9 -6
  801. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  802. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  803. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  804. package/dist/modes/interactive/components/oauth-selector.js +3 -2
  805. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  806. package/dist/modes/interactive/components/scoped-models-selector.d.ts +6 -2
  807. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  808. package/dist/modes/interactive/components/scoped-models-selector.js +39 -13
  809. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  810. package/dist/modes/interactive/components/session-selector-delete.d.ts.map +1 -1
  811. package/dist/modes/interactive/components/session-selector-delete.js +2 -1
  812. package/dist/modes/interactive/components/session-selector-delete.js.map +1 -1
  813. package/dist/modes/interactive/components/session-selector-list.d.ts +1 -1
  814. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
  815. package/dist/modes/interactive/components/session-selector-list.js +12 -11
  816. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  817. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  818. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  819. package/dist/modes/interactive/components/session-selector.js +3 -3
  820. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  821. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  822. package/dist/modes/interactive/components/settings-selector-handlers.js +9 -0
  823. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  824. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  825. package/dist/modes/interactive/components/settings-selector-items.js +21 -0
  826. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  827. package/dist/modes/interactive/components/settings-selector-submenus.d.ts +3 -3
  828. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
  829. package/dist/modes/interactive/components/settings-selector-submenus.js +6 -1
  830. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  831. package/dist/modes/interactive/components/settings-selector-types.d.ts +8 -1
  832. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  833. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  834. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  835. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  836. package/dist/modes/interactive/components/skill-invocation-message.js +3 -2
  837. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  838. package/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  839. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  840. package/dist/modes/interactive/components/tool-execution.js +50 -27
  841. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  842. package/dist/modes/interactive/components/tree-selector-component.d.ts +1 -1
  843. package/dist/modes/interactive/components/tree-selector-component.d.ts.map +1 -1
  844. package/dist/modes/interactive/components/tree-selector-component.js +2 -3
  845. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -1
  846. package/dist/modes/interactive/components/tree-selector-help.d.ts +1 -1
  847. package/dist/modes/interactive/components/tree-selector-help.d.ts.map +1 -1
  848. package/dist/modes/interactive/components/tree-selector-help.js +3 -1
  849. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -1
  850. package/dist/modes/interactive/components/tree-selector-label-input.d.ts +1 -1
  851. package/dist/modes/interactive/components/tree-selector-label-input.d.ts.map +1 -1
  852. package/dist/modes/interactive/components/tree-selector-label-input.js +1 -0
  853. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -1
  854. package/dist/modes/interactive/components/tree-selector-list.d.ts +1 -1
  855. package/dist/modes/interactive/components/tree-selector-list.d.ts.map +1 -1
  856. package/dist/modes/interactive/components/tree-selector-list.js +3 -0
  857. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -1
  858. package/dist/modes/interactive/components/trust-selector.d.ts +1 -1
  859. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  860. package/dist/modes/interactive/components/trust-selector.js +4 -0
  861. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  862. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  863. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  864. package/dist/modes/interactive/components/user-message-selector.js +4 -0
  865. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  866. package/dist/modes/interactive/components/user-message.d.ts +4 -1
  867. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  868. package/dist/modes/interactive/components/user-message.js +10 -2
  869. package/dist/modes/interactive/components/user-message.js.map +1 -1
  870. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  871. package/dist/modes/interactive/external-editor.js +2 -1
  872. package/dist/modes/interactive/external-editor.js.map +1 -1
  873. package/dist/modes/interactive/interactive-agent-events.js +36 -18
  874. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  875. package/dist/modes/interactive/interactive-auth-login.js +9 -2
  876. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  877. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
  878. package/dist/modes/interactive/interactive-auth-routing.js +5 -1
  879. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  880. package/dist/modes/interactive/interactive-bash-compact.js +16 -4
  881. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  882. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  883. package/dist/modes/interactive/interactive-deferred-startup.js +3 -0
  884. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  885. package/dist/modes/interactive/interactive-editor-actions.js +2 -0
  886. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  887. package/dist/modes/interactive/interactive-extension-context.js +12 -7
  888. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  889. package/dist/modes/interactive/interactive-extension-custom-ui.js +1 -0
  890. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  891. package/dist/modes/interactive/interactive-extension-dialogs.js +7 -0
  892. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  893. package/dist/modes/interactive/interactive-extension-widgets.js +7 -24
  894. package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  895. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  896. package/dist/modes/interactive/interactive-input-handling.js +9 -8
  897. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  898. package/dist/modes/interactive/interactive-mode-base.d.ts +52 -3
  899. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  900. package/dist/modes/interactive/interactive-mode-base.js +143 -5
  901. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  902. package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
  903. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  904. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  905. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  906. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -3
  907. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  908. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  909. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  910. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  911. package/dist/modes/interactive/interactive-mode.js +1 -0
  912. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  913. package/dist/modes/interactive/interactive-model-routing.js +107 -41
  914. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  915. package/dist/modes/interactive/interactive-process-lifecycle.js +1 -1
  916. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  917. package/dist/modes/interactive/interactive-render-chat.js +24 -6
  918. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  919. package/dist/modes/interactive/interactive-selectors.js +44 -5
  920. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  921. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  922. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  923. package/dist/modes/interactive/interactive-slash-commands.js +9 -4
  924. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  925. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  926. package/dist/modes/interactive/interactive-startup.js +37 -18
  927. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  928. package/dist/modes/interactive/interactive-tui.d.ts +21 -0
  929. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -0
  930. package/dist/modes/interactive/interactive-tui.js +279 -0
  931. package/dist/modes/interactive/interactive-tui.js.map +1 -0
  932. package/dist/modes/interactive/streaming-assistant-message.d.ts +34 -0
  933. package/dist/modes/interactive/streaming-assistant-message.d.ts.map +1 -0
  934. package/dist/modes/interactive/streaming-assistant-message.js +76 -0
  935. package/dist/modes/interactive/streaming-assistant-message.js.map +1 -0
  936. package/dist/modes/interactive/theme/catppuccin-frappe.json +1 -0
  937. package/dist/modes/interactive/theme/catppuccin-latte.json +1 -0
  938. package/dist/modes/interactive/theme/catppuccin-macchiato.json +1 -0
  939. package/dist/modes/interactive/theme/catppuccin-mocha.json +1 -0
  940. package/dist/modes/interactive/theme/dark.json +1 -0
  941. package/dist/modes/interactive/theme/light.json +1 -0
  942. package/dist/modes/interactive/theme/terminal-detection.d.ts +10 -0
  943. package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -1
  944. package/dist/modes/interactive/theme/terminal-detection.js +19 -0
  945. package/dist/modes/interactive/theme/terminal-detection.js.map +1 -1
  946. package/dist/modes/interactive/theme/theme-class.d.ts +2 -2
  947. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  948. package/dist/modes/interactive/theme/theme-class.js +5 -1
  949. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  950. package/dist/modes/interactive/theme/theme-controller.d.ts +3 -1
  951. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  952. package/dist/modes/interactive/theme/theme-controller.js +10 -13
  953. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  954. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  955. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  956. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  957. package/dist/modes/interactive/theme/theme-schema.d.ts +4 -0
  958. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  959. package/dist/modes/interactive/theme/theme-schema.js +2 -1
  960. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  961. package/dist/modes/interactive/theme/theme-schema.json +5 -1
  962. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  963. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  964. package/dist/modes/interactive/theme/theme.js +1 -1
  965. package/dist/modes/interactive/theme/theme.js.map +1 -1
  966. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +1 -1
  967. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  968. package/dist/modes/interactive-engine/engine-custom-ui.js +28 -11
  969. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  970. package/dist/modes/interactive-engine/engine-render-service.js +3 -3
  971. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  972. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +2 -1
  973. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  974. package/dist/modes/interactive-engine/extension-ui-bridge.js +2 -2
  975. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  976. package/dist/modes/interactive-engine/isolated-runtime.d.ts +7 -0
  977. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  978. package/dist/modes/interactive-engine/isolated-runtime.js +7 -0
  979. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  980. package/dist/modes/interactive-engine/protocol.d.ts +12 -10
  981. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  982. package/dist/modes/interactive-engine/protocol.js +14 -11
  983. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  984. package/dist/modes/interactive-engine/remote-component.d.ts +11 -1
  985. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  986. package/dist/modes/interactive-engine/remote-component.js +48 -8
  987. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  988. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts +19 -12
  989. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts.map +1 -1
  990. package/dist/modes/interactive-engine/terminal-mode-controller.js +54 -35
  991. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -1
  992. package/dist/modes/json-event.d.ts +28 -0
  993. package/dist/modes/json-event.d.ts.map +1 -0
  994. package/dist/modes/json-event.js +12 -0
  995. package/dist/modes/json-event.js.map +1 -0
  996. package/dist/modes/print-mode.d.ts.map +1 -1
  997. package/dist/modes/print-mode.js +2 -1
  998. package/dist/modes/print-mode.js.map +1 -1
  999. package/dist/modes/rpc/rpc-client-process.d.ts +1 -0
  1000. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  1001. package/dist/modes/rpc/rpc-client-process.js +5 -1
  1002. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  1003. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1004. package/dist/modes/rpc/rpc-client.js +7 -2
  1005. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1006. package/dist/modes/rpc/rpc-command-handler.js +1 -1
  1007. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  1008. package/dist/modes/rpc/rpc-event-buffer.d.ts +9 -0
  1009. package/dist/modes/rpc/rpc-event-buffer.d.ts.map +1 -1
  1010. package/dist/modes/rpc/rpc-event-buffer.js +10 -5
  1011. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -1
  1012. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  1013. package/dist/modes/rpc/rpc-extension-ui.js +3 -0
  1014. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  1015. package/dist/modes/rpc/rpc-input.js +1 -1
  1016. package/dist/modes/rpc/rpc-input.js.map +1 -1
  1017. package/dist/modes/rpc/rpc-output-buffer.d.ts +9 -0
  1018. package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -1
  1019. package/dist/modes/rpc/rpc-output-buffer.js +10 -5
  1020. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
  1021. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  1022. package/dist/modes/rpc/rpc-provider-auth.js +3 -0
  1023. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  1024. package/dist/modes/rpc/rpc-responses.d.ts +1 -1
  1025. package/dist/modes/rpc/rpc-responses.d.ts.map +1 -1
  1026. package/dist/modes/rpc/rpc-responses.js +13 -1
  1027. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  1028. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  1029. package/dist/modes/rpc/rpc-session-binding.js +2 -1
  1030. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  1031. package/dist/modes/rpc/rpc-types.d.ts +9 -2
  1032. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1033. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1034. package/dist/rpc-entry.js +2 -0
  1035. package/dist/rpc-entry.js.map +1 -1
  1036. package/dist/self-update-plan.d.ts.map +1 -1
  1037. package/dist/self-update-plan.js +5 -4
  1038. package/dist/self-update-plan.js.map +1 -1
  1039. package/dist/server/create-harness.d.ts +53 -0
  1040. package/dist/server/create-harness.d.ts.map +1 -0
  1041. package/dist/server/create-harness.js +349 -0
  1042. package/dist/server/create-harness.js.map +1 -0
  1043. package/dist/utils/agent-attribution.d.ts +2 -0
  1044. package/dist/utils/agent-attribution.d.ts.map +1 -0
  1045. package/dist/utils/agent-attribution.js +2 -0
  1046. package/dist/utils/agent-attribution.js.map +1 -0
  1047. package/dist/utils/child-process.d.ts +3 -1
  1048. package/dist/utils/child-process.d.ts.map +1 -1
  1049. package/dist/utils/child-process.js +24 -4
  1050. package/dist/utils/child-process.js.map +1 -1
  1051. package/dist/utils/clipboard-image.d.ts.map +1 -1
  1052. package/dist/utils/clipboard-image.js +2 -1
  1053. package/dist/utils/clipboard-image.js.map +1 -1
  1054. package/dist/utils/clipboard.d.ts.map +1 -1
  1055. package/dist/utils/clipboard.js +12 -3
  1056. package/dist/utils/clipboard.js.map +1 -1
  1057. package/dist/utils/management-http.d.ts +23 -0
  1058. package/dist/utils/management-http.d.ts.map +1 -0
  1059. package/dist/utils/management-http.js +50 -0
  1060. package/dist/utils/management-http.js.map +1 -0
  1061. package/dist/utils/open-browser.d.ts.map +1 -1
  1062. package/dist/utils/open-browser.js +2 -1
  1063. package/dist/utils/open-browser.js.map +1 -1
  1064. package/dist/utils/paths.d.ts +2 -0
  1065. package/dist/utils/paths.d.ts.map +1 -1
  1066. package/dist/utils/paths.js +13 -0
  1067. package/dist/utils/paths.js.map +1 -1
  1068. package/dist/utils/shell.d.ts.map +1 -1
  1069. package/dist/utils/shell.js +17 -4
  1070. package/dist/utils/shell.js.map +1 -1
  1071. package/dist/utils/tool-result-images.d.ts +17 -0
  1072. package/dist/utils/tool-result-images.d.ts.map +1 -0
  1073. package/dist/utils/tool-result-images.js +41 -0
  1074. package/dist/utils/tool-result-images.js.map +1 -0
  1075. package/dist/utils/tools-manager.d.ts.map +1 -1
  1076. package/dist/utils/tools-manager.js +7 -8
  1077. package/dist/utils/tools-manager.js.map +1 -1
  1078. package/dist/utils/version-check.d.ts +4 -0
  1079. package/dist/utils/version-check.d.ts.map +1 -1
  1080. package/dist/utils/version-check.js +20 -2
  1081. package/dist/utils/version-check.js.map +1 -1
  1082. package/docs/compaction.md +2 -1
  1083. package/docs/custom-provider.md +15 -7
  1084. package/docs/development.md +1 -0
  1085. package/docs/docs.json +1 -0
  1086. package/docs/environment-variables.md +4 -0
  1087. package/docs/extensions.md +102 -18
  1088. package/docs/i-have-adhd.md +36 -0
  1089. package/docs/intercom.md +31 -16
  1090. package/docs/json.md +2 -2
  1091. package/docs/keybindings.md +55 -12
  1092. package/docs/models/model-selection.md +34 -8
  1093. package/docs/models.md +28 -3
  1094. package/docs/providers.md +20 -2
  1095. package/docs/quickstart.md +5 -5
  1096. package/docs/rpc.md +18 -12
  1097. package/docs/sdk.md +43 -7
  1098. package/docs/security.md +10 -10
  1099. package/docs/sessions.md +2 -0
  1100. package/docs/settings.md +32 -6
  1101. package/docs/subagents.md +30 -45
  1102. package/docs/themes.md +5 -3
  1103. package/docs/tools.md +21 -1
  1104. package/docs/tui.md +41 -24
  1105. package/docs/usage.md +40 -14
  1106. package/docs/windows.md +2 -0
  1107. package/docs/workflows.md +237 -25
  1108. package/examples/extensions/custom-provider-anthropic/index.ts +9 -2
  1109. package/examples/extensions/custom-provider-gitlab-duo/index.ts +9 -2
  1110. package/examples/extensions/gondolin/package-lock.json +3 -3
  1111. package/examples/extensions/modal-editor.ts +8 -10
  1112. package/examples/extensions/rainbow-editor.ts +3 -2
  1113. package/examples/extensions/subagent/README.md +16 -45
  1114. package/examples/extensions/subagent/index.ts +6 -96
  1115. package/examples/extensions/subagent/render.ts +0 -78
  1116. package/examples/extensions/subagent/runner.ts +0 -3
  1117. package/examples/extensions/subagent/schemas.ts +0 -13
  1118. package/examples/extensions/subagent/types.ts +1 -2
  1119. package/examples/sdk/09-api-keys-and-oauth.ts +6 -2
  1120. package/examples/sdk/12-full-control.ts +8 -2
  1121. package/examples/sdk/README.md +4 -1
  1122. package/npm-shrinkwrap.json +191 -634
  1123. package/package.json +14 -7
  1124. package/dist/builtin/subagents/src/agents/chain-serializer.ts +0 -257
  1125. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +0 -112
  1126. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +0 -543
  1127. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +0 -140
  1128. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +0 -279
  1129. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +0 -99
  1130. package/dist/builtin/subagents/src/runs/background/async-execution.ts +0 -17
  1131. package/dist/builtin/subagents/src/runs/background/async-resume.ts +0 -402
  1132. package/dist/builtin/subagents/src/runs/background/async-status.ts +0 -411
  1133. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +0 -196
  1134. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +0 -102
  1135. package/dist/builtin/subagents/src/runs/background/parallel-groups.ts +0 -59
  1136. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +0 -300
  1137. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +0 -166
  1138. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +0 -77
  1139. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +0 -48
  1140. package/dist/builtin/subagents/src/runs/background/result-status.ts +0 -87
  1141. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +0 -72
  1142. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +0 -320
  1143. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +0 -105
  1144. package/dist/builtin/subagents/src/runs/background/run-status.ts +0 -358
  1145. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +0 -457
  1146. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +0 -376
  1147. package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +0 -150
  1148. package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +0 -109
  1149. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +0 -128
  1150. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +0 -309
  1151. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +0 -173
  1152. package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +0 -578
  1153. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +0 -330
  1154. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +0 -330
  1155. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +0 -210
  1156. package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +0 -69
  1157. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +0 -90
  1158. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +0 -12
  1159. package/dist/builtin/subagents/src/runs/foreground/chain-execution-details.ts +0 -38
  1160. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +0 -280
  1161. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +0 -217
  1162. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +0 -271
  1163. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +0 -271
  1164. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +0 -200
  1165. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +0 -184
  1166. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +0 -140
  1167. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +0 -108
  1168. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-types.ts +0 -17
  1169. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +0 -558
  1170. package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +0 -83
  1171. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +0 -109
  1172. package/dist/builtin/subagents/src/runs/shared/attempt-watchdog.ts +0 -126
  1173. package/dist/builtin/subagents/src/runs/shared/chain-outputs.ts +0 -126
  1174. package/dist/builtin/subagents/src/runs/shared/dynamic-fanout.ts +0 -387
  1175. package/dist/builtin/subagents/src/runs/shared/final-drain.ts +0 -39
  1176. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +0 -339
  1177. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +0 -165
  1178. package/dist/builtin/subagents/src/runs/shared/spawn-env.ts +0 -21
  1179. package/dist/builtin/subagents/src/runs/shared/structured-output.ts +0 -150
  1180. package/dist/builtin/subagents/src/runs/shared/workflow-graph.ts +0 -232
  1181. package/dist/builtin/subagents/src/shared/post-exit-stdio-guard.ts +0 -86
  1182. package/dist/builtin/subagents/src/slash/saved-chain-mapping.ts +0 -60
  1183. package/dist/builtin/subagents/src/tui/render-chain-graph.ts +0 -335
  1184. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  1185. package/examples/extensions/subagent/prompts/implement.md +0 -10
  1186. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
  1187. /package/dist/builtin/subagents/src/runs/{shared/nested-path.ts → inprocess/runtime-support/nested-paths.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-temp-dir.js","sourceRoot":"","sources":["../../../src/core/tools/session-temp-dir.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owner- and session-scoped temp storage for tool output files.\n *\n * Every file a tool spills to the system temp directory (bash overflow logs,\n * async bash logs, `OutputAccumulator` spill files, and the in-memory-session\n * tool-result fallback) lands under:\n *\n * ```text\n * <tmpdir>/<APP_NAME>-<owner>/<sanitized-session-id>/\n * ```\n *\n * The owner segment mirrors the upstream Claude Code `claude-{uid}` convention\n * (mehmoodosman/claude-code): a shared multi-user temp directory must never let\n * one account write into (or read) another account's tree. The session segment\n * makes the tree reapable as a unit by the age-based sweeper in\n * `session-temp-cleanup.ts` once the session is long gone.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { chmodSync, lstatSync, mkdirSync, realpathSync, rmSync, type Stats } from \"node:fs\";\nimport { tmpdir, userInfo } from \"node:os\";\nimport { dirname, join, sep } from \"node:path\";\nimport { APP_NAME } from \"../../config.ts\";\nimport { getErrnoCode } from \"./errno.ts\";\nimport {\n\tresetWindowsDirectorySecurityStateForTesting,\n\tverifyWindowsDirectorySecurity,\n} from \"./windows-directory-security.ts\";\n\n/** Directory mode for every directory this module creates (owner-only). */\nexport const SESSION_TEMP_DIR_MODE = 0o700;\n\n/** File mode for persisted tool-output files (owner-only). */\nexport const SESSION_TEMP_FILE_MODE = 0o600;\n\n/** Longest path component this module will emit for a sanitized value. */\nconst MAX_PATH_COMPONENT_LENGTH = 64;\n\nconst FALLBACK_SESSION_COMPONENT = \"session\";\nconst FALLBACK_OWNER_COMPONENT = \"user\";\n\n/**\n * Reduce a value to a single safe path component.\n *\n * Disallowed characters collapse to `_`; leading `.`/`_` and trailing `.`/`_`\n * are stripped so the result can never be `.`, `..`, a hidden sweeper marker\n * file name, or anything that escapes the parent directory. Trimming uses a\n * linear scan rather than a `/^[._]+|[._]+$/` regex to avoid polynomial-time\n * backtracking on adversarial ids (CodeQL js/polynomial-redos).\n */\nexport function sanitizeTempPathComponent(value: string, fallback: string): string {\n\tconst collapsed = value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n\tlet start = 0;\n\tlet end = collapsed.length;\n\twhile (start < end && (collapsed[start] === \"_\" || collapsed[start] === \".\")) {\n\t\tstart++;\n\t}\n\twhile (end > start && (collapsed[end - 1] === \"_\" || collapsed[end - 1] === \".\")) {\n\t\tend--;\n\t}\n\tconst sanitized = collapsed.slice(start, end).slice(0, MAX_PATH_COMPONENT_LENGTH);\n\treturn sanitized.length > 0 ? sanitized : fallback;\n}\n\nlet cachedOwnerComponent: string | undefined;\n\n/**\n * Derive the owner component for a named (non-uid) account.\n *\n * Sanitizing a name to a safe path component is lossy, and two distinct\n * accounts can reduce to the same component (`aliceé` and `aliceø` both yield\n * `alice_`). Where the system temp directory is machine-wide and\n * shared-accessible, that would put two accounts in one tree. Appending a short\n * digest of the raw identity keeps distinct accounts on distinct roots, with\n * the readable component in front so the directory stays recognizable.\n *\n * This prevents collision; it is not owner verification. Ownership is proven\n * separately by `verifyOwnedDirectory` — a uid check on POSIX, an owner-SID\n * and DACL check on Windows.\n *\n * Exported as a pure function so the collision property can be tested directly:\n * its only caller reaches this branch on Windows, which a POSIX test host\n * cannot enter.\n */\nexport function deriveOwnerComponent(rawIdentity: string): string {\n\t// Windows account names are case-insensitive, so `Alice` and `alice` are one\n\t// account and must resolve to one root. Normalize before both the readable\n\t// component and the digest: normalizing only the digest would still emit two\n\t// spellings of one directory, which NTFS then treats as the same path while\n\t// the sweeper's bookkeeping sees two.\n\tconst normalized = rawIdentity.toLowerCase();\n\tconst readable = sanitizeTempPathComponent(normalized, FALLBACK_OWNER_COMPONENT);\n\tconst digest = createHash(\"sha256\").update(normalized).digest(\"hex\").slice(0, 8);\n\treturn `${readable}-${digest}`;\n}\n\n/**\n * Assemble the account identity used where there is no uid.\n *\n * `userInfo().username` returns the bare account name, so `CONTOSO\\Alice` and\n * `FABRIKAM\\Alice` would otherwise be one identity and share a tree. Exported\n * for tests: its caller only reaches this branch on Windows.\n */\nexport function windowsPrincipal(name: string | undefined): string {\n\tconst account = name || process.env.USERNAME || process.env.USER || \"\";\n\t// USERDOMAIN is the NetBIOS domain and is set for both domain and local\n\t// accounts; USERDNSDOMAIN appears only on domain-joined hosts and\n\t// distinguishes two forests that share a NetBIOS name. Neither is\n\t// authoritative on its own, so both take part in the identity.\n\tconst domain = process.env.USERDNSDOMAIN || process.env.USERDOMAIN || \"\";\n\treturn domain ? `${domain}\\\\${account}` : account;\n}\n\n/**\n * Identify the account that owns the temp tree.\n *\n * POSIX uses the numeric uid, which is already collision-free. Windows has no\n * `process.getuid`, so the domain-qualified principal stands in.\n */\nfunction ownerComponent(): string {\n\tif (cachedOwnerComponent !== undefined) {\n\t\treturn cachedOwnerComponent;\n\t}\n\tconst uid = typeof process.getuid === \"function\" ? process.getuid() : undefined;\n\tif (typeof uid === \"number\" && Number.isFinite(uid)) {\n\t\tcachedOwnerComponent = String(uid);\n\t\treturn cachedOwnerComponent;\n\t}\n\tlet name: string | undefined;\n\ttry {\n\t\tname = userInfo().username;\n\t} catch {\n\t\t// A container without a passwd entry cannot name the account; the env\n\t\t// fallback inside windowsPrincipal still separates the common case.\n\t\tname = undefined;\n\t}\n\tcachedOwnerComponent = deriveOwnerComponent(windowsPrincipal(name));\n\treturn cachedOwnerComponent;\n}\n\ninterface BaseTempDirs {\n\traw: string;\n\tcanonical: string;\n}\n\nlet cachedBaseTempDirs: BaseTempDirs | undefined;\n\n/**\n * Preserve the OS-provided temp spelling for returned paths while caching a\n * canonical form for internal component checks (macOS `/var` → `/private/var`,\n * for example). Nothing below the base is resolved through `realpath`.\n */\nfunction baseTempDirs(): BaseTempDirs {\n\tconst raw = tmpdir();\n\tif (cachedBaseTempDirs?.raw === raw) {\n\t\treturn cachedBaseTempDirs;\n\t}\n\tlet canonical = raw;\n\ttry {\n\t\tcanonical = realpathSync(raw);\n\t} catch {\n\t\t// An unresolvable temp directory is checked as given.\n\t}\n\tcachedBaseTempDirs = { raw, canonical };\n\treturn cachedBaseTempDirs;\n}\n\n/** `<tmpdir>/<APP_NAME>-<owner>` — the root every session temp tree lives under. */\nexport function getTempRootDir(): string {\n\tconst app = sanitizeTempPathComponent(APP_NAME, \"atomic\");\n\treturn join(baseTempDirs().raw, `${app}-${ownerComponent()}`);\n}\n\n/**\n * The temp directory path for a session, without creating it.\n *\n * Falls back to the process-scoped component when no session id is available,\n * so a tool running outside a transcript session still writes inside the\n * owner-scoped root instead of directly into the system temp directory.\n */\nexport function resolveSessionTempDirPath(sessionId?: string): string {\n\tconst id = sessionId ?? activeSessionId ?? `pid-${process.pid}`;\n\treturn join(getTempRootDir(), sanitizeTempPathComponent(id, FALLBACK_SESSION_COMPONENT));\n}\n\nconst ensuredDirs = new Set<string>();\n\n/** An existing real directory — not a symlink, not a file, not missing. */\nfunction isRealDirectory(path: string): boolean {\n\ttry {\n\t\tconst stat = lstatSync(path);\n\t\treturn stat.isDirectory() && !stat.isSymbolicLink();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Raised when a temp directory cannot be created or trusted; callers degrade to no spill file. */\nexport class TempDirRefusedError extends Error {\n\tconstructor(path: string, reason: string) {\n\t\tsuper(`Refusing to use temp directory ${path}: ${reason}`);\n\t\tthis.name = \"TempDirRefusedError\";\n\t}\n}\n\n/**\n * Confirm one existing component is a directory this account owns, at mode 0700.\n *\n * A looser mode is tightened and re-checked; a component owned by another\n * account, or one whose mode cannot be tightened, is refused rather than used.\n *\n * Windows has no uid or POSIX mode, so the proof comes from the security\n * descriptor instead: the owner SID must be a trusted principal and the DACL\n * must grant access to trusted principals only\n * (see `windows-directory-security.ts`). Node exposes neither — `lstatSync`\n * reports uid/gid 0 on Windows — so the read goes through a PowerShell\n * `Get-Acl` subprocess. Successful verifications are cached per path per\n * process, keyed to the directory's metadata identity so a swapped directory\n * or an in-place DACL edit forces a fresh read. Domain-qualifying the\n * principal (see `windowsPrincipal`) stops two accounts *colliding* by\n * accident, which is a different problem and is not a substitute for this\n * verification.\n */\nfunction verifyOwnedDirectory(path: string, known?: Stats): void {\n\tlet stat = known ?? lstatSync(path);\n\tif (stat.isSymbolicLink()) {\n\t\tthrow new TempDirRefusedError(path, \"it is a symbolic link\");\n\t}\n\tif (!stat.isDirectory()) {\n\t\tthrow new TempDirRefusedError(path, \"it is not a directory\");\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst refusal = verifyWindowsDirectorySecurity(path);\n\t\tif (refusal !== undefined) {\n\t\t\tthrow new TempDirRefusedError(path, refusal);\n\t\t}\n\t\treturn;\n\t}\n\tconst uid = typeof process.getuid === \"function\" ? process.getuid() : undefined;\n\tif (typeof uid === \"number\" && stat.uid !== uid) {\n\t\tthrow new TempDirRefusedError(path, \"it is owned by another account\");\n\t}\n\tif ((stat.mode & 0o777) === SESSION_TEMP_DIR_MODE) {\n\t\treturn;\n\t}\n\ttry {\n\t\tchmodSync(path, SESSION_TEMP_DIR_MODE);\n\t\tstat = lstatSync(path);\n\t} catch {\n\t\tthrow new TempDirRefusedError(path, \"its permissions could not be tightened\");\n\t}\n\tif ((stat.mode & 0o777) !== SESSION_TEMP_DIR_MODE) {\n\t\tthrow new TempDirRefusedError(path, \"its permissions could not be tightened\");\n\t}\n}\n\n/**\n * Create or adopt one path component, never following a link to get there.\n *\n * Creation is non-recursive on purpose: `mkdir -p` resolves an existing symlink\n * on the way down, which is how a link planted at the predictable owner root\n * redirects every later write outside the tree.\n */\nfunction ensureOwnedDirectory(path: string): void {\n\tlet stat: Stats | undefined;\n\ttry {\n\t\tstat = lstatSync(path);\n\t} catch {\n\t\tstat = undefined;\n\t}\n\tif (stat === undefined) {\n\t\ttry {\n\t\t\tmkdirSync(path, { recursive: false, mode: SESSION_TEMP_DIR_MODE });\n\t\t} catch (error) {\n\t\t\t// A concurrent creator winning the race is fine; anything else is not.\n\t\t\tif (getErrnoCode(error) !== \"EEXIST\") {\n\t\t\t\tthrow new TempDirRefusedError(path, \"it could not be created\");\n\t\t\t}\n\t\t}\n\t\tverifyOwnedDirectory(path);\n\t\treturn;\n\t}\n\tverifyOwnedDirectory(path, stat);\n}\n\n/**\n * Adopt the final component, replacing something that is not a directory.\n *\n * Only the leaf gets this treatment: a stale file or link left where a session\n * directory belongs is ours to clear, and removing a symlink removes the link\n * alone. A parent — above all the owner root — is refused instead, because\n * deleting it would be acting on a directory this process does not own.\n */\nfunction ensureLeafDirectory(dir: string): void {\n\ttry {\n\t\tif (!lstatSync(dir).isDirectory()) {\n\t\t\trmSync(dir, { force: true });\n\t\t}\n\t} catch {\n\t\t// Nothing at the path yet, or it cannot be inspected; creation decides.\n\t}\n\tensureOwnedDirectory(dir);\n}\n\n/** Map a lexical temp child to the same path below the canonical temp base. */\nfunction canonicalTempChild(dir: string, base: BaseTempDirs): string | undefined {\n\tfor (const candidate of [base.raw, base.canonical]) {\n\t\tconst prefix = `${candidate}${sep}`;\n\t\tif (dir.startsWith(prefix)) {\n\t\t\treturn join(base.canonical, dir.slice(prefix.length));\n\t\t}\n\t}\n\treturn undefined;\n}\n/**\n * Create `dir` with owner-only permissions, validating every component below the\n * system temp directory.\n *\n * Temp children always revalidate the canonical owner root and every later\n * component, even after a cache hit. A system temp reaper can delete a session\n * tree, and an attacker must not turn a memoized path into a symlink bypass.\n * Caller-owned paths outside the temp base may use the memo after confirming\n * the leaf is still a real directory.\n *\n * Throws {@link TempDirRefusedError} when a component cannot be trusted. Every\n * caller treats that as \"no spill file\", never as a fatal error: failing closed\n * loses a convenience artifact, while failing open writes tool output into a\n * directory someone else controls.\n */\nexport function ensureTempDir(dir: string): string {\n\tconst base = baseTempDirs();\n\tconst checkedDir = canonicalTempChild(dir, base);\n\tif (checkedDir !== undefined) {\n\t\tconst prefix = `${base.canonical}${sep}`;\n\t\tconst parts = checkedDir\n\t\t\t.slice(prefix.length)\n\t\t\t.split(sep)\n\t\t\t.filter((part) => part.length > 0);\n\t\tlet current = base.canonical;\n\t\tfor (const part of parts.slice(0, -1)) {\n\t\t\tcurrent = join(current, part);\n\t\t\tensureOwnedDirectory(current);\n\t\t}\n\t\tensureLeafDirectory(checkedDir);\n\t} else {\n\t\t// A caller-supplied directory outside the system temp base (a session\n\t\t// directory, for instance) is the caller's to own; only the leaf is ours.\n\t\tif (!(ensuredDirs.has(dir) && isRealDirectory(dir))) {\n\t\t\tmkdirSync(dirname(dir), { recursive: true, mode: SESSION_TEMP_DIR_MODE });\n\t\t\tensureLeafDirectory(dir);\n\t\t}\n\t}\n\tensuredDirs.add(dir);\n\treturn dir;\n}\n\n/**\n * Resolve and create the temp directory for a session.\n *\n * Pass an already-resolved directory to reuse a caller-provided path (still\n * created lazily with the same mode).\n */\nexport function getSessionTempDir(sessionId?: string): string {\n\treturn ensureTempDir(resolveSessionTempDirPath(sessionId));\n}\n\n/** Create `explicitDir` when supplied, otherwise the active session's temp directory. */\nexport function ensureSessionTempDir(explicitDir?: string): string {\n\treturn ensureTempDir(explicitDir ?? resolveSessionTempDirPath());\n}\n\nlet activeSessionId: string | undefined;\n\n/**\n * Refcounted protection for directories the sweeper must not reap.\n *\n * A count rather than a set, because protection has more than one holder and\n * more than one lifetime: a session protects its own tree, an async spill writer\n * outlives the session object it started under, and one session can be replaced\n * by another wrapping the same paths. Releasing one holder must not unprotect a\n * directory another is still writing to, and a session that is gone must stop\n * protecting a tree the startup sweep exists to collect.\n */\nconst protectedPathCounts = new Map<string, number>();\n\n/** A protection claim held by one owner; releasing twice is a no-op. */\nexport interface ProtectedPathLease {\n\trelease(): void;\n}\n\n/** Protect `paths` until the returned lease is released. */\nexport function acquireProtectedPaths(paths: readonly string[]): ProtectedPathLease {\n\tconst claimed = paths.filter((path) => path.length > 0);\n\tfor (const path of claimed) {\n\t\tprotectedPathCounts.set(path, (protectedPathCounts.get(path) ?? 0) + 1);\n\t}\n\tlet released = false;\n\treturn {\n\t\trelease() {\n\t\t\tif (released) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treleased = true;\n\t\t\tfor (const path of claimed) {\n\t\t\t\tconst remaining = (protectedPathCounts.get(path) ?? 0) - 1;\n\t\t\t\tif (remaining > 0) {\n\t\t\t\t\tprotectedPathCounts.set(path, remaining);\n\t\t\t\t} else {\n\t\t\t\t\tprotectedPathCounts.delete(path);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Make `sessionId` the default target for writers without a session handle.\n *\n * Deliberately separate from protection: a disposed session must stop protecting\n * its tree, but whichever session ran last still names where an unattached\n * writer spills.\n */\nexport function setActiveSessionTempId(sessionId: string): string {\n\tactiveSessionId = sessionId;\n\treturn resolveSessionTempDirPath(sessionId);\n}\n\n/** Directories this process must not reap: session temp trees and live tool-results. */\nexport function getProtectedSessionTempDirs(): ReadonlySet<string> {\n\treturn new Set(protectedPathCounts.keys());\n}\n\n/** Test seam: forget the process-level active/protected session state. */\nexport function resetSessionTempDirStateForTesting(): void {\n\tactiveSessionId = undefined;\n\tprotectedPathCounts.clear();\n\tensuredDirs.clear();\n\tcachedOwnerComponent = undefined;\n\tcachedBaseTempDirs = undefined;\n\tresetWindowsDirectorySecurityStateForTesting();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,QAAQ,+BAA+B,CAAC;IAC9C,UAAU,SAAS,CAAC,WAAW,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG;QACxE,qGAAqG;QACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,2FAA2F;QAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B;CACD;AAYD,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC7E,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC7C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CA6B9B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAC/C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAE/B;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EACtG,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,GAChC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAqBnC"}
1
+ {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,QAAQ,+BAA+B,CAAC;IAC9C,UAAU,SAAS,CAAC,WAAW,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG;QACxE,qGAAqG;QACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,2FAA2F;QAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B;CACD;AAYD,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC7E,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC7C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CA+B9B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAC/C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAE/B;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EACtG,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,GAChC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAqBnC"}
@@ -9,6 +9,8 @@ export function wrapToolDefinition(definition, ctxFactory) {
9
9
  ...(Object.hasOwn(definition, "constrainedSampling")
10
10
  ? { constrainedSampling: definition.constrainedSampling }
11
11
  : {}),
12
+ promptSnippet: definition.promptSnippet,
13
+ promptGuidelines: definition.promptGuidelines ? [...definition.promptGuidelines] : undefined,
12
14
  maxResultSizeChars: definition.maxResultSizeChars,
13
15
  prepareArguments: definition.prepareArguments
14
16
  ? (args) => runSynchronousCallback({ kind: "tool.prepare", name: definition.name }, () => definition.prepareArguments?.(args))
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAuB9E,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CACjC,UAA6C,EAC7C,UAAmC;IAEnC,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC;YACnD,CAAC,CAAC,EAAE,mBAAmB,EAAE,UAAU,CAAC,mBAAmB,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;QACN,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;YAC5C,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CACT,sBAAsB,CACrB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAC/C,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAA8B,CACtE;YACH,CAAC,CAAC,SAAS;QACZ,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAA0B,EAAE,EAAE,CAC7E,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CAC7E,UAAU,CAAC,OAAO,CACjB,UAAU,EACV,MAAyB,EACzB,MAAM,EACN,QAAQ,EACR,OAAO,IAAK,UAAU,EAAE,EAAuB,CAC/C,CACD;KACF,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAA+C,EAC/C,UAAmC;IAEnC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAChD,IAAkC;IAElC,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAoB,CAAC,CAAC,CAAC,SAAS;QAChH,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC/D,IAAI,CAAC,OAAqD,CAC1D,UAAU,EACV,MAA+B,EAC/B,MAAM,EACN,QAAQ,EACR,OAAO,CACP;KACF,CAAC;AACH,CAAC","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { Static, TSchema } from \"typebox\";\nimport { runCallback, runSynchronousCallback } from \"../callback-activity.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\ndeclare module \"@earendil-works/pi-agent-core\" {\n\tinterface AgentTool<TParameters extends TSchema = TSchema, TDetails = any> {\n\t\t/** Optional per-tool character cap for model-visible result persistence. Use Infinity to opt out. */\n\t\tmaxResultSizeChars?: number;\n\t\t/** Optional prompt metadata retained by factory-created tools registered as extensions. */\n\t\tpromptSnippet?: string;\n\t\tpromptGuidelines?: string[];\n\t}\n}\n\ntype PiToolParams<TParams extends TSchema> = Parameters<AgentTool<TParams>[\"execute\"]>[1];\ntype PiPreparedParams<TParams extends TSchema> = ReturnType<NonNullable<AgentTool<TParams>[\"prepareArguments\"]>>;\ntype ContextualAgentExecute<TParams extends TSchema, TDetails> = (\n\ttoolCallId: string,\n\tparams: PiToolParams<TParams>,\n\tsignal?: AbortSignal,\n\tonUpdate?: Parameters<AgentTool<TParams, TDetails>[\"execute\"]>[3],\n\tcontext?: ExtensionContext,\n) => ReturnType<AgentTool<TParams, TDetails>[\"execute\"]>;\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TParams extends TSchema, TDetails = unknown>(\n\tdefinition: ToolDefinition<TParams, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TParams, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\t...(Object.hasOwn(definition, \"constrainedSampling\")\n\t\t\t? { constrainedSampling: definition.constrainedSampling }\n\t\t\t: {}),\n\t\tmaxResultSizeChars: definition.maxResultSizeChars,\n\t\tprepareArguments: definition.prepareArguments\n\t\t\t? (args) =>\n\t\t\t\t\trunSynchronousCallback(\n\t\t\t\t\t\t{ kind: \"tool.prepare\", name: definition.name },\n\t\t\t\t\t\t() => definition.prepareArguments?.(args) as PiPreparedParams<TParams>,\n\t\t\t\t\t)\n\t\t\t: undefined,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate, context?: ExtensionContext) =>\n\t\t\trunCallback({ kind: \"tool.execute\", name: definition.name, toolCallId }, () =>\n\t\t\t\tdefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tparams as Static<TParams>,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tcontext ?? (ctxFactory?.() as ExtensionContext),\n\t\t\t\t),\n\t\t\t),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<TSchema, unknown>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TSchema, unknown>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool<TParams extends TSchema = TSchema, TDetails = unknown>(\n\ttool: AgentTool<TParams, TDetails>,\n): ToolDefinition<TParams, TDetails> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters,\n\t\t...(Object.hasOwn(tool, \"constrainedSampling\") ? { constrainedSampling: tool.constrainedSampling } : {}),\n\t\tpromptSnippet: tool.promptSnippet,\n\t\tpromptGuidelines: tool.promptGuidelines,\n\t\tmaxResultSizeChars: tool.maxResultSizeChars,\n\t\tprepareArguments: tool.prepareArguments ? (args) => tool.prepareArguments?.(args) as Static<TParams> : undefined,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate, context) =>\n\t\t\t(tool.execute as ContextualAgentExecute<TParams, TDetails>)(\n\t\t\t\ttoolCallId,\n\t\t\t\tparams as PiToolParams<TParams>,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tcontext,\n\t\t\t),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { Static, TSchema } from \"typebox\";\nimport { runCallback, runSynchronousCallback } from \"../callback-activity.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\ndeclare module \"@earendil-works/pi-agent-core\" {\n\tinterface AgentTool<TParameters extends TSchema = TSchema, TDetails = any> {\n\t\t/** Optional per-tool character cap for model-visible result persistence. Use Infinity to opt out. */\n\t\tmaxResultSizeChars?: number;\n\t\t/** Optional prompt metadata retained by factory-created tools registered as extensions. */\n\t\tpromptSnippet?: string;\n\t\tpromptGuidelines?: string[];\n\t}\n}\n\ntype PiToolParams<TParams extends TSchema> = Parameters<AgentTool<TParams>[\"execute\"]>[1];\ntype PiPreparedParams<TParams extends TSchema> = ReturnType<NonNullable<AgentTool<TParams>[\"prepareArguments\"]>>;\ntype ContextualAgentExecute<TParams extends TSchema, TDetails> = (\n\ttoolCallId: string,\n\tparams: PiToolParams<TParams>,\n\tsignal?: AbortSignal,\n\tonUpdate?: Parameters<AgentTool<TParams, TDetails>[\"execute\"]>[3],\n\tcontext?: ExtensionContext,\n) => ReturnType<AgentTool<TParams, TDetails>[\"execute\"]>;\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TParams extends TSchema, TDetails = unknown>(\n\tdefinition: ToolDefinition<TParams, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TParams, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\t...(Object.hasOwn(definition, \"constrainedSampling\")\n\t\t\t? { constrainedSampling: definition.constrainedSampling }\n\t\t\t: {}),\n\t\tpromptSnippet: definition.promptSnippet,\n\t\tpromptGuidelines: definition.promptGuidelines ? [...definition.promptGuidelines] : undefined,\n\t\tmaxResultSizeChars: definition.maxResultSizeChars,\n\t\tprepareArguments: definition.prepareArguments\n\t\t\t? (args) =>\n\t\t\t\t\trunSynchronousCallback(\n\t\t\t\t\t\t{ kind: \"tool.prepare\", name: definition.name },\n\t\t\t\t\t\t() => definition.prepareArguments?.(args) as PiPreparedParams<TParams>,\n\t\t\t\t\t)\n\t\t\t: undefined,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate, context?: ExtensionContext) =>\n\t\t\trunCallback({ kind: \"tool.execute\", name: definition.name, toolCallId }, () =>\n\t\t\t\tdefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tparams as Static<TParams>,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tcontext ?? (ctxFactory?.() as ExtensionContext),\n\t\t\t\t),\n\t\t\t),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<TSchema, unknown>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TSchema, unknown>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool<TParams extends TSchema = TSchema, TDetails = unknown>(\n\ttool: AgentTool<TParams, TDetails>,\n): ToolDefinition<TParams, TDetails> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters,\n\t\t...(Object.hasOwn(tool, \"constrainedSampling\") ? { constrainedSampling: tool.constrainedSampling } : {}),\n\t\tpromptSnippet: tool.promptSnippet,\n\t\tpromptGuidelines: tool.promptGuidelines,\n\t\tmaxResultSizeChars: tool.maxResultSizeChars,\n\t\tprepareArguments: tool.prepareArguments ? (args) => tool.prepareArguments?.(args) as Static<TParams> : undefined,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate, context) =>\n\t\t\t(tool.execute as ContextualAgentExecute<TParams, TDetails>)(\n\t\t\t\ttoolCallId,\n\t\t\t\tparams as PiToolParams<TParams>,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tcontext,\n\t\t\t),\n\t};\n}\n"]}
@@ -22,4 +22,15 @@ export declare const PERSISTED_OUTPUT_TAG = "<persisted-output>";
22
22
  export declare const PERSISTED_OUTPUT_CLOSING_TAG = "</persisted-output>";
23
23
  /** Preview size in bytes shown inline in the persisted-output message. */
24
24
  export declare const PREVIEW_SIZE_BYTES = 2000;
25
+ /**
26
+ * Hard cap on the number of bytes any single persisted tool-output file may hold.
27
+ *
28
+ * Persisted output exists so the model can read back what did not fit in context;
29
+ * past this size the file is no longer a useful artifact, only a way to fill the
30
+ * disk. Writers stop at the cap and append {@link PERSISTED_OUTPUT_TRUNCATION_MARKER}
31
+ * so the total file size never exceeds it.
32
+ */
33
+ export declare const MAX_PERSISTED_OUTPUT_BYTES: number;
34
+ /** Appended in place of the content dropped at {@link MAX_PERSISTED_OUTPUT_BYTES}. */
35
+ export declare const PERSISTED_OUTPUT_TRUNCATION_MARKER = "\n[Output truncated: persisted-output cap of 67108864 bytes reached]\n";
25
36
  //# sourceMappingURL=tool-limits.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-limits.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-limits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AACzD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAElE,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,OAAO,CAAC"}
1
+ {"version":3,"file":"tool-limits.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-limits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AACzD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAElE,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,QAAmB,CAAC;AAE3D,sFAAsF;AACtF,eAAO,MAAM,kCAAkC,2EAAgG,CAAC"}
@@ -22,4 +22,15 @@ export const PERSISTED_OUTPUT_TAG = "<persisted-output>";
22
22
  export const PERSISTED_OUTPUT_CLOSING_TAG = "</persisted-output>";
23
23
  /** Preview size in bytes shown inline in the persisted-output message. */
24
24
  export const PREVIEW_SIZE_BYTES = 2000;
25
+ /**
26
+ * Hard cap on the number of bytes any single persisted tool-output file may hold.
27
+ *
28
+ * Persisted output exists so the model can read back what did not fit in context;
29
+ * past this size the file is no longer a useful artifact, only a way to fill the
30
+ * disk. Writers stop at the cap and append {@link PERSISTED_OUTPUT_TRUNCATION_MARKER}
31
+ * so the total file size never exceeds it.
32
+ */
33
+ export const MAX_PERSISTED_OUTPUT_BYTES = 64 * 1024 * 1024;
34
+ /** Appended in place of the content dropped at {@link MAX_PERSISTED_OUTPUT_BYTES}. */
35
+ export const PERSISTED_OUTPUT_TRUNCATION_MARKER = `\n[Output truncated: persisted-output cap of ${MAX_PERSISTED_OUTPUT_BYTES} bytes reached]\n`;
25
36
  //# sourceMappingURL=tool-limits.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-limits.js","sourceRoot":"","sources":["../../../src/core/tools/tool-limits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAEpD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AACzD,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAElE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC","sourcesContent":["/**\n * Constants related to tool result size limits.\n *\n * These mirror the conventions used by the upstream Claude Code tool-result\n * storage mechanism (mehmoodosman/claude-code, `src/constants/toolLimits.ts`):\n * oversized tool results are persisted to disk and replaced in model context\n * with a short preview that references the saved file.\n */\n\n/**\n * Default maximum size in characters for tool results before they get persisted\n * to disk. When exceeded, the result is saved to a file and the model receives\n * a preview with the file path instead of the full content.\n *\n * Individual tools may declare a lower cap, but this constant acts as a\n * system-wide ceiling regardless of what tools declare.\n */\nexport const DEFAULT_MAX_RESULT_SIZE_CHARS = 50_000;\n\n/** Subdirectory (within the session directory) for persisted tool results. */\nexport const TOOL_RESULTS_SUBDIR = \"tool-results\";\n\n/** XML tags wrapping a persisted-output preview message. */\nexport const PERSISTED_OUTPUT_TAG = \"<persisted-output>\";\nexport const PERSISTED_OUTPUT_CLOSING_TAG = \"</persisted-output>\";\n\n/** Preview size in bytes shown inline in the persisted-output message. */\nexport const PREVIEW_SIZE_BYTES = 2000;\n"]}
1
+ {"version":3,"file":"tool-limits.js","sourceRoot":"","sources":["../../../src/core/tools/tool-limits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAEpD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AACzD,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAElE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3D,sFAAsF;AACtF,MAAM,CAAC,MAAM,kCAAkC,GAAG,gDAAgD,0BAA0B,mBAAmB,CAAC","sourcesContent":["/**\n * Constants related to tool result size limits.\n *\n * These mirror the conventions used by the upstream Claude Code tool-result\n * storage mechanism (mehmoodosman/claude-code, `src/constants/toolLimits.ts`):\n * oversized tool results are persisted to disk and replaced in model context\n * with a short preview that references the saved file.\n */\n\n/**\n * Default maximum size in characters for tool results before they get persisted\n * to disk. When exceeded, the result is saved to a file and the model receives\n * a preview with the file path instead of the full content.\n *\n * Individual tools may declare a lower cap, but this constant acts as a\n * system-wide ceiling regardless of what tools declare.\n */\nexport const DEFAULT_MAX_RESULT_SIZE_CHARS = 50_000;\n\n/** Subdirectory (within the session directory) for persisted tool results. */\nexport const TOOL_RESULTS_SUBDIR = \"tool-results\";\n\n/** XML tags wrapping a persisted-output preview message. */\nexport const PERSISTED_OUTPUT_TAG = \"<persisted-output>\";\nexport const PERSISTED_OUTPUT_CLOSING_TAG = \"</persisted-output>\";\n\n/** Preview size in bytes shown inline in the persisted-output message. */\nexport const PREVIEW_SIZE_BYTES = 2000;\n\n/**\n * Hard cap on the number of bytes any single persisted tool-output file may hold.\n *\n * Persisted output exists so the model can read back what did not fit in context;\n * past this size the file is no longer a useful artifact, only a way to fill the\n * disk. Writers stop at the cap and append {@link PERSISTED_OUTPUT_TRUNCATION_MARKER}\n * so the total file size never exceeds it.\n */\nexport const MAX_PERSISTED_OUTPUT_BYTES = 64 * 1024 * 1024;\n\n/** Appended in place of the content dropped at {@link MAX_PERSISTED_OUTPUT_BYTES}. */\nexport const PERSISTED_OUTPUT_TRUNCATION_MARKER = `\\n[Output truncated: persisted-output cap of ${MAX_PERSISTED_OUTPUT_BYTES} bytes reached]\\n`;\n"]}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Windows owner-SID and DACL verification for the session temp tree.
3
+ *
4
+ * POSIX proves ownership of an existing temp component with a uid comparison
5
+ * and a mode check. Node exposes neither on Windows — `lstatSync` reports
6
+ * uid/gid 0 — so this module reads the real security descriptor through a
7
+ * PowerShell `Get-Acl` subprocess and decides from SIDs alone: the owner must
8
+ * be a trusted principal and every access-allowed ACE must grant only trusted
9
+ * principals. Names are never compared; two accounts can share a display name,
10
+ * but never a SID.
11
+ *
12
+ * A subprocess per directory creation would sit on the spill hot path, so a
13
+ * successful verification is cached per canonical path per process, keyed to
14
+ * the directory's metadata identity — creation time, NTFS change time, and
15
+ * last-write time. A directory swapped underneath the path carries a fresh
16
+ * creation time, and an in-place DACL edit bumps the change time, so either
17
+ * forces a fresh descriptor read rather than trust from a stale check (see
18
+ * `verifyWindowsDirectorySecurity`). Failures are not cached: a refusal means
19
+ * "no spill file this time", and a transient read failure must not disable
20
+ * persistence for the rest of the process.
21
+ */
22
+ /** One DACL entry with its trustee resolved to a literal SID. */
23
+ export interface WindowsAccessRule {
24
+ /** True for an access-allowed entry, false for access-denied. */
25
+ allow: boolean;
26
+ /** The SID the entry applies to. */
27
+ sid: string;
28
+ }
29
+ /** What the security read produces: the caller's SID plus the descriptor. */
30
+ export interface WindowsDirectorySecurity {
31
+ /** SID of the current process token's user. */
32
+ currentSid: string;
33
+ /** SID owning the directory. */
34
+ ownerSid: string;
35
+ /** The DACL portion of the descriptor in SDDL form (may be empty). */
36
+ dacl: string;
37
+ /**
38
+ * Every DACL entry with its trustee as a literal SID (`GetAccessRules`
39
+ * resolves domain-relative SDDL abbreviations such as `LA` that a
40
+ * name-side parse cannot). The SDDL string above cross-checks that these
41
+ * rules describe the whole DACL: only plain allow/deny ACE types, one
42
+ * rule per ACE.
43
+ */
44
+ accessRules: readonly WindowsAccessRule[];
45
+ }
46
+ /**
47
+ * Decide whether a directory's descriptor is safe to adopt.
48
+ *
49
+ * Returns a refusal reason, or `undefined` when the directory is owned by a
50
+ * trusted principal and its DACL grants access to trusted principals only.
51
+ * Exported as a pure function so the decision table is testable on any host.
52
+ */
53
+ export declare function evaluateWindowsDirectorySecurity(security: WindowsDirectorySecurity): string | undefined;
54
+ /** Test seam: why the most recent `readWindowsDirectorySecurity` returned `undefined`. */
55
+ export declare function getLastWindowsSecurityReadFailureForTesting(): string | undefined;
56
+ /**
57
+ * Read the security descriptor of `path`, or `undefined` when it cannot be
58
+ * read (access denied, missing PowerShell, timeout). Callers treat
59
+ * `undefined` as unverifiable and refuse the directory.
60
+ */
61
+ export declare function readWindowsDirectorySecurity(path: string): WindowsDirectorySecurity | undefined;
62
+ type SecurityReader = (path: string) => WindowsDirectorySecurity | undefined;
63
+ /**
64
+ * Verify `path` as adoptable, returning the refusal reason when it is not.
65
+ *
66
+ * The subprocess read sits on the spill path, so a successful verification
67
+ * is cached for the life of the process while the directory's metadata
68
+ * identity (creation, change, and last-write times) is unchanged. A swapped
69
+ * directory or an in-place DACL edit changes that identity and forces a
70
+ * fresh read; so does creating a file inside the directory, which trades one
71
+ * bounded subprocess per spill for never trusting a stale descriptor. The
72
+ * symlink/directory checks in `session-temp-dir.ts` still run on every use.
73
+ * A failure is never cached, so a transient read error does not permanently
74
+ * disable spills.
75
+ */
76
+ export declare function verifyWindowsDirectorySecurity(path: string): string | undefined;
77
+ /** Test seam: substitute the descriptor reader; pass `undefined` to restore. */
78
+ export declare function setWindowsDirectorySecurityReaderForTesting(reader: SecurityReader | undefined): void;
79
+ /** Test seam: forget verified paths so a suite can re-drive verification. */
80
+ export declare function resetWindowsDirectorySecurityStateForTesting(): void;
81
+ export {};
82
+ //# sourceMappingURL=windows-directory-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-directory-security.d.ts","sourceRoot":"","sources":["../../../src/core/tools/windows-directory-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IACjC,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,6EAA6E;AAC7E,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC1C;AAqBD;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,GAAG,SAAS,CAoDvG;AAoCD,0FAA0F;AAC1F,wBAAgB,2CAA2C,IAAI,MAAM,GAAG,SAAS,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CA0B/F;AAqBD,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,CAAC;AAuB7E;;;;;;;;;;;;GAYG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA4B/E;AAED,gFAAgF;AAChF,wBAAgB,2CAA2C,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAEpG;AAED,6EAA6E;AAC7E,wBAAgB,4CAA4C,IAAI,IAAI,CAGnE"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Windows owner-SID and DACL verification for the session temp tree.
3
+ *
4
+ * POSIX proves ownership of an existing temp component with a uid comparison
5
+ * and a mode check. Node exposes neither on Windows — `lstatSync` reports
6
+ * uid/gid 0 — so this module reads the real security descriptor through a
7
+ * PowerShell `Get-Acl` subprocess and decides from SIDs alone: the owner must
8
+ * be a trusted principal and every access-allowed ACE must grant only trusted
9
+ * principals. Names are never compared; two accounts can share a display name,
10
+ * but never a SID.
11
+ *
12
+ * A subprocess per directory creation would sit on the spill hot path, so a
13
+ * successful verification is cached per canonical path per process, keyed to
14
+ * the directory's metadata identity — creation time, NTFS change time, and
15
+ * last-write time. A directory swapped underneath the path carries a fresh
16
+ * creation time, and an in-place DACL edit bumps the change time, so either
17
+ * forces a fresh descriptor read rather than trust from a stale check (see
18
+ * `verifyWindowsDirectorySecurity`). Failures are not cached: a refusal means
19
+ * "no spill file this time", and a transient read failure must not disable
20
+ * persistence for the rest of the process.
21
+ */
22
+ import { spawnSync } from "node:child_process";
23
+ import { statSync } from "node:fs";
24
+ /**
25
+ * Principals allowed to own, or hold access-allowed ACEs on, a temp component.
26
+ *
27
+ * SYSTEM and Administrators hold both on any per-user Windows temp directory
28
+ * by inheritance, and both can reach any file on the volume regardless, so
29
+ * permitting them grants nothing an attacker did not already have. Elevated
30
+ * processes also create directories owned by the Administrators group rather
31
+ * than the user, which is why the owner check shares this set. CREATOR OWNER
32
+ * is inherit-only plumbing: it materializes as the creating account on
33
+ * descendants, and creation inside the tree is already restricted to the
34
+ * SIDs allowed here.
35
+ */
36
+ const TRUSTED_STATIC_SIDS = new Set([
37
+ "S-1-5-18", // Local System
38
+ "S-1-5-32-544", // Builtin Administrators
39
+ "S-1-3-0", // Creator Owner
40
+ "S-1-3-4", // Owner Rights
41
+ ]);
42
+ /**
43
+ * Decide whether a directory's descriptor is safe to adopt.
44
+ *
45
+ * Returns a refusal reason, or `undefined` when the directory is owned by a
46
+ * trusted principal and its DACL grants access to trusted principals only.
47
+ * Exported as a pure function so the decision table is testable on any host.
48
+ */
49
+ export function evaluateWindowsDirectorySecurity(security) {
50
+ const trusted = (sid) => sid === security.currentSid || TRUSTED_STATIC_SIDS.has(sid);
51
+ if (!security.ownerSid.startsWith("S-1-")) {
52
+ return "its owner could not be verified";
53
+ }
54
+ if (!trusted(security.ownerSid)) {
55
+ return "it is owned by another account";
56
+ }
57
+ // `Get-Acl` renders a null DACL (everyone has full control) as an absent
58
+ // `D:` section; an empty DACL (`D:` with no ACEs) grants nobody anything
59
+ // and is fine.
60
+ const dacl = security.dacl.trim();
61
+ if (!dacl.startsWith("D:")) {
62
+ return "it has no access control list";
63
+ }
64
+ let rest = dacl.slice(2);
65
+ const flagsEnd = rest.indexOf("(");
66
+ const flags = flagsEnd === -1 ? rest : rest.slice(0, flagsEnd);
67
+ if (!/^[A-Z]*$/.test(flags)) {
68
+ return "its access control list could not be parsed";
69
+ }
70
+ rest = flagsEnd === -1 ? "" : rest.slice(flagsEnd);
71
+ const aces = rest.match(/\([^()]*\)/g) ?? [];
72
+ if (aces.join("") !== rest) {
73
+ return "its access control list could not be parsed";
74
+ }
75
+ for (const ace of aces) {
76
+ const type = ace.slice(1, -1).split(";")[0];
77
+ if (type !== "A" && type !== "D") {
78
+ // Conditional, object, and callback ACEs are not modeled by the
79
+ // resolved access rules below, so a DACL containing one cannot be
80
+ // proven restrictive.
81
+ return "its access control list could not be verified";
82
+ }
83
+ }
84
+ if (security.accessRules.length !== aces.length) {
85
+ // The resolved rules must describe the whole DACL; a mismatch means
86
+ // part of it was not translated and cannot be checked.
87
+ return "its access control list could not be verified";
88
+ }
89
+ for (const rule of security.accessRules) {
90
+ if (!rule.allow) {
91
+ continue; // A deny entry only ever removes access.
92
+ }
93
+ if (!rule.sid.startsWith("S-1-")) {
94
+ return "its access control list could not be verified";
95
+ }
96
+ if (!trusted(rule.sid)) {
97
+ return "it grants access to another account";
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /**
103
+ * One PowerShell round trip: the caller's SID, the owner SID, the DACL in
104
+ * SDDL form, and one `Allow|Deny;SID` line per resolved access rule. The path
105
+ * travels through the environment rather than the command line so no quoting
106
+ * rules apply to it.
107
+ */
108
+ const READ_SECURITY_SCRIPT = [
109
+ "$ErrorActionPreference = 'Stop'",
110
+ "$acl = Get-Acl -LiteralPath $env:ATOMIC_SECURITY_QUERY_PATH",
111
+ "$owner = $acl.GetOwner([System.Security.Principal.SecurityIdentifier]).Value",
112
+ "$dacl = $acl.GetSecurityDescriptorSddlForm('Access')",
113
+ "$user = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value",
114
+ "$lines = @($user, $owner, $dacl)",
115
+ "foreach ($rule in $acl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]))" +
116
+ ' { $lines += "$($rule.AccessControlType);$($rule.IdentityReference.Value)" }',
117
+ '[Console]::Out.Write(($lines -join "`n"))',
118
+ ].join("; ");
119
+ /** Bounded wait for the security read; a wedged subprocess must not hang a spill. */
120
+ const READ_SECURITY_TIMEOUT_MS = 30_000;
121
+ /** PowerShell hosts to try, most specific first: an absolute Windows
122
+ * PowerShell path immune to a stripped `PATH`, then whichever of
123
+ * `powershell.exe`/`pwsh.exe` the environment resolves. */
124
+ function powershellCandidates() {
125
+ const candidates = [];
126
+ const systemRoot = process.env.SystemRoot ?? process.env.windir ?? "C:\\Windows";
127
+ candidates.push(`${systemRoot}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`);
128
+ candidates.push("powershell.exe", "pwsh.exe");
129
+ return candidates;
130
+ }
131
+ let lastReadFailure;
132
+ /** Test seam: why the most recent `readWindowsDirectorySecurity` returned `undefined`. */
133
+ export function getLastWindowsSecurityReadFailureForTesting() {
134
+ return lastReadFailure;
135
+ }
136
+ /**
137
+ * Read the security descriptor of `path`, or `undefined` when it cannot be
138
+ * read (access denied, missing PowerShell, timeout). Callers treat
139
+ * `undefined` as unverifiable and refuse the directory.
140
+ */
141
+ export function readWindowsDirectorySecurity(path) {
142
+ lastReadFailure = undefined;
143
+ const failures = [];
144
+ for (const executable of powershellCandidates()) {
145
+ const result = spawnSync(executable, ["-NoProfile", "-NonInteractive", "-Command", READ_SECURITY_SCRIPT], {
146
+ env: { ...process.env, ATOMIC_SECURITY_QUERY_PATH: path },
147
+ encoding: "utf8",
148
+ timeout: READ_SECURITY_TIMEOUT_MS,
149
+ windowsHide: true,
150
+ });
151
+ if (result.error || result.status !== 0 || typeof result.stdout !== "string") {
152
+ failures.push(`${executable}: status=${result.status} signal=${result.signal} error=${result.error?.message} stderr=${typeof result.stderr === "string" ? result.stderr.trim().slice(0, 500) : result.stderr}`);
153
+ continue;
154
+ }
155
+ const parsed = parseSecurityOutput(result.stdout);
156
+ if (parsed !== undefined) {
157
+ return parsed;
158
+ }
159
+ failures.push(`${executable}: unparseable output ${JSON.stringify(result.stdout.slice(0, 500))}`);
160
+ }
161
+ lastReadFailure = failures.join(" | ");
162
+ return undefined;
163
+ }
164
+ function parseSecurityOutput(stdout) {
165
+ const [currentSid, ownerSid, dacl, ...ruleLines] = stdout.split("\n").map((line) => line.trim());
166
+ if (!currentSid || !ownerSid || dacl === undefined) {
167
+ return undefined;
168
+ }
169
+ const accessRules = [];
170
+ for (const line of ruleLines) {
171
+ if (line.length === 0) {
172
+ continue;
173
+ }
174
+ const [type, sid] = line.split(";");
175
+ if ((type !== "Allow" && type !== "Deny") || !sid) {
176
+ return undefined;
177
+ }
178
+ accessRules.push({ allow: type === "Allow", sid });
179
+ }
180
+ return { currentSid, ownerSid, dacl, accessRules };
181
+ }
182
+ let securityReader = readWindowsDirectorySecurity;
183
+ /** Verified paths mapped to the metadata identity observed *before* the
184
+ * descriptor was read. Snapshotting before the read means any mutation that
185
+ * races the read still changes the identity relative to the cache entry, so
186
+ * the next call re-verifies rather than trusting the racing state. */
187
+ const verifiedPaths = new Map();
188
+ /**
189
+ * Verify `path` as adoptable, returning the refusal reason when it is not.
190
+ *
191
+ * The subprocess read sits on the spill path, so a successful verification
192
+ * is cached for the life of the process while the directory's metadata
193
+ * identity (creation, change, and last-write times) is unchanged. A swapped
194
+ * directory or an in-place DACL edit changes that identity and forces a
195
+ * fresh read; so does creating a file inside the directory, which trades one
196
+ * bounded subprocess per spill for never trusting a stale descriptor. The
197
+ * symlink/directory checks in `session-temp-dir.ts` still run on every use.
198
+ * A failure is never cached, so a transient read error does not permanently
199
+ * disable spills.
200
+ */
201
+ export function verifyWindowsDirectorySecurity(path) {
202
+ let identity;
203
+ try {
204
+ const stat = statSync(path);
205
+ identity = { birthtimeMs: stat.birthtimeMs, ctimeMs: stat.ctimeMs, mtimeMs: stat.mtimeMs };
206
+ }
207
+ catch {
208
+ return "its ownership could not be verified";
209
+ }
210
+ const cached = verifiedPaths.get(path);
211
+ if (cached !== undefined &&
212
+ cached.birthtimeMs === identity.birthtimeMs &&
213
+ cached.ctimeMs === identity.ctimeMs &&
214
+ cached.mtimeMs === identity.mtimeMs) {
215
+ return undefined;
216
+ }
217
+ const security = securityReader(path);
218
+ if (security === undefined) {
219
+ return "its ownership could not be verified";
220
+ }
221
+ const refusal = evaluateWindowsDirectorySecurity(security);
222
+ if (refusal !== undefined) {
223
+ verifiedPaths.delete(path);
224
+ return refusal;
225
+ }
226
+ verifiedPaths.set(path, identity);
227
+ return undefined;
228
+ }
229
+ /** Test seam: substitute the descriptor reader; pass `undefined` to restore. */
230
+ export function setWindowsDirectorySecurityReaderForTesting(reader) {
231
+ securityReader = reader ?? readWindowsDirectorySecurity;
232
+ }
233
+ /** Test seam: forget verified paths so a suite can re-drive verification. */
234
+ export function resetWindowsDirectorySecurityStateForTesting() {
235
+ verifiedPaths.clear();
236
+ securityReader = readWindowsDirectorySecurity;
237
+ }
238
+ //# sourceMappingURL=windows-directory-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-directory-security.js","sourceRoot":"","sources":["../../../src/core/tools/windows-directory-security.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Windows owner-SID and DACL verification for the session temp tree.\n *\n * POSIX proves ownership of an existing temp component with a uid comparison\n * and a mode check. Node exposes neither on Windows — `lstatSync` reports\n * uid/gid 0 — so this module reads the real security descriptor through a\n * PowerShell `Get-Acl` subprocess and decides from SIDs alone: the owner must\n * be a trusted principal and every access-allowed ACE must grant only trusted\n * principals. Names are never compared; two accounts can share a display name,\n * but never a SID.\n *\n * A subprocess per directory creation would sit on the spill hot path, so a\n * successful verification is cached per canonical path per process, keyed to\n * the directory's metadata identity — creation time, NTFS change time, and\n * last-write time. A directory swapped underneath the path carries a fresh\n * creation time, and an in-place DACL edit bumps the change time, so either\n * forces a fresh descriptor read rather than trust from a stale check (see\n * `verifyWindowsDirectorySecurity`). Failures are not cached: a refusal means\n * \"no spill file this time\", and a transient read failure must not disable\n * persistence for the rest of the process.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { statSync } from \"node:fs\";\n\n/** One DACL entry with its trustee resolved to a literal SID. */\nexport interface WindowsAccessRule {\n\t/** True for an access-allowed entry, false for access-denied. */\n\tallow: boolean;\n\t/** The SID the entry applies to. */\n\tsid: string;\n}\n\n/** What the security read produces: the caller's SID plus the descriptor. */\nexport interface WindowsDirectorySecurity {\n\t/** SID of the current process token's user. */\n\tcurrentSid: string;\n\t/** SID owning the directory. */\n\townerSid: string;\n\t/** The DACL portion of the descriptor in SDDL form (may be empty). */\n\tdacl: string;\n\t/**\n\t * Every DACL entry with its trustee as a literal SID (`GetAccessRules`\n\t * resolves domain-relative SDDL abbreviations such as `LA` that a\n\t * name-side parse cannot). The SDDL string above cross-checks that these\n\t * rules describe the whole DACL: only plain allow/deny ACE types, one\n\t * rule per ACE.\n\t */\n\taccessRules: readonly WindowsAccessRule[];\n}\n\n/**\n * Principals allowed to own, or hold access-allowed ACEs on, a temp component.\n *\n * SYSTEM and Administrators hold both on any per-user Windows temp directory\n * by inheritance, and both can reach any file on the volume regardless, so\n * permitting them grants nothing an attacker did not already have. Elevated\n * processes also create directories owned by the Administrators group rather\n * than the user, which is why the owner check shares this set. CREATOR OWNER\n * is inherit-only plumbing: it materializes as the creating account on\n * descendants, and creation inside the tree is already restricted to the\n * SIDs allowed here.\n */\nconst TRUSTED_STATIC_SIDS = new Set<string>([\n\t\"S-1-5-18\", // Local System\n\t\"S-1-5-32-544\", // Builtin Administrators\n\t\"S-1-3-0\", // Creator Owner\n\t\"S-1-3-4\", // Owner Rights\n]);\n\n/**\n * Decide whether a directory's descriptor is safe to adopt.\n *\n * Returns a refusal reason, or `undefined` when the directory is owned by a\n * trusted principal and its DACL grants access to trusted principals only.\n * Exported as a pure function so the decision table is testable on any host.\n */\nexport function evaluateWindowsDirectorySecurity(security: WindowsDirectorySecurity): string | undefined {\n\tconst trusted = (sid: string): boolean => sid === security.currentSid || TRUSTED_STATIC_SIDS.has(sid);\n\tif (!security.ownerSid.startsWith(\"S-1-\")) {\n\t\treturn \"its owner could not be verified\";\n\t}\n\tif (!trusted(security.ownerSid)) {\n\t\treturn \"it is owned by another account\";\n\t}\n\t// `Get-Acl` renders a null DACL (everyone has full control) as an absent\n\t// `D:` section; an empty DACL (`D:` with no ACEs) grants nobody anything\n\t// and is fine.\n\tconst dacl = security.dacl.trim();\n\tif (!dacl.startsWith(\"D:\")) {\n\t\treturn \"it has no access control list\";\n\t}\n\tlet rest = dacl.slice(2);\n\tconst flagsEnd = rest.indexOf(\"(\");\n\tconst flags = flagsEnd === -1 ? rest : rest.slice(0, flagsEnd);\n\tif (!/^[A-Z]*$/.test(flags)) {\n\t\treturn \"its access control list could not be parsed\";\n\t}\n\trest = flagsEnd === -1 ? \"\" : rest.slice(flagsEnd);\n\tconst aces = rest.match(/\\([^()]*\\)/g) ?? [];\n\tif (aces.join(\"\") !== rest) {\n\t\treturn \"its access control list could not be parsed\";\n\t}\n\tfor (const ace of aces) {\n\t\tconst type = ace.slice(1, -1).split(\";\")[0];\n\t\tif (type !== \"A\" && type !== \"D\") {\n\t\t\t// Conditional, object, and callback ACEs are not modeled by the\n\t\t\t// resolved access rules below, so a DACL containing one cannot be\n\t\t\t// proven restrictive.\n\t\t\treturn \"its access control list could not be verified\";\n\t\t}\n\t}\n\tif (security.accessRules.length !== aces.length) {\n\t\t// The resolved rules must describe the whole DACL; a mismatch means\n\t\t// part of it was not translated and cannot be checked.\n\t\treturn \"its access control list could not be verified\";\n\t}\n\tfor (const rule of security.accessRules) {\n\t\tif (!rule.allow) {\n\t\t\tcontinue; // A deny entry only ever removes access.\n\t\t}\n\t\tif (!rule.sid.startsWith(\"S-1-\")) {\n\t\t\treturn \"its access control list could not be verified\";\n\t\t}\n\t\tif (!trusted(rule.sid)) {\n\t\t\treturn \"it grants access to another account\";\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * One PowerShell round trip: the caller's SID, the owner SID, the DACL in\n * SDDL form, and one `Allow|Deny;SID` line per resolved access rule. The path\n * travels through the environment rather than the command line so no quoting\n * rules apply to it.\n */\nconst READ_SECURITY_SCRIPT = [\n\t\"$ErrorActionPreference = 'Stop'\",\n\t\"$acl = Get-Acl -LiteralPath $env:ATOMIC_SECURITY_QUERY_PATH\",\n\t\"$owner = $acl.GetOwner([System.Security.Principal.SecurityIdentifier]).Value\",\n\t\"$dacl = $acl.GetSecurityDescriptorSddlForm('Access')\",\n\t\"$user = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value\",\n\t\"$lines = @($user, $owner, $dacl)\",\n\t\"foreach ($rule in $acl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]))\" +\n\t\t' { $lines += \"$($rule.AccessControlType);$($rule.IdentityReference.Value)\" }',\n\t'[Console]::Out.Write(($lines -join \"`n\"))',\n].join(\"; \");\n\n/** Bounded wait for the security read; a wedged subprocess must not hang a spill. */\nconst READ_SECURITY_TIMEOUT_MS = 30_000;\n\n/** PowerShell hosts to try, most specific first: an absolute Windows\n * PowerShell path immune to a stripped `PATH`, then whichever of\n * `powershell.exe`/`pwsh.exe` the environment resolves. */\nfunction powershellCandidates(): string[] {\n\tconst candidates: string[] = [];\n\tconst systemRoot = process.env.SystemRoot ?? process.env.windir ?? \"C:\\\\Windows\";\n\tcandidates.push(`${systemRoot}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`);\n\tcandidates.push(\"powershell.exe\", \"pwsh.exe\");\n\treturn candidates;\n}\n\nlet lastReadFailure: string | undefined;\n\n/** Test seam: why the most recent `readWindowsDirectorySecurity` returned `undefined`. */\nexport function getLastWindowsSecurityReadFailureForTesting(): string | undefined {\n\treturn lastReadFailure;\n}\n\n/**\n * Read the security descriptor of `path`, or `undefined` when it cannot be\n * read (access denied, missing PowerShell, timeout). Callers treat\n * `undefined` as unverifiable and refuse the directory.\n */\nexport function readWindowsDirectorySecurity(path: string): WindowsDirectorySecurity | undefined {\n\tlastReadFailure = undefined;\n\tconst failures: string[] = [];\n\tfor (const executable of powershellCandidates()) {\n\t\tconst result = spawnSync(executable, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", READ_SECURITY_SCRIPT], {\n\t\t\tenv: { ...process.env, ATOMIC_SECURITY_QUERY_PATH: path },\n\t\t\tencoding: \"utf8\",\n\t\t\ttimeout: READ_SECURITY_TIMEOUT_MS,\n\t\t\twindowsHide: true,\n\t\t});\n\t\tif (result.error || result.status !== 0 || typeof result.stdout !== \"string\") {\n\t\t\tfailures.push(\n\t\t\t\t`${executable}: status=${result.status} signal=${result.signal} error=${result.error?.message} stderr=${\n\t\t\t\t\ttypeof result.stderr === \"string\" ? result.stderr.trim().slice(0, 500) : result.stderr\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsed = parseSecurityOutput(result.stdout);\n\t\tif (parsed !== undefined) {\n\t\t\treturn parsed;\n\t\t}\n\t\tfailures.push(`${executable}: unparseable output ${JSON.stringify(result.stdout.slice(0, 500))}`);\n\t}\n\tlastReadFailure = failures.join(\" | \");\n\treturn undefined;\n}\n\nfunction parseSecurityOutput(stdout: string): WindowsDirectorySecurity | undefined {\n\tconst [currentSid, ownerSid, dacl, ...ruleLines] = stdout.split(\"\\n\").map((line) => line.trim());\n\tif (!currentSid || !ownerSid || dacl === undefined) {\n\t\treturn undefined;\n\t}\n\tconst accessRules: WindowsAccessRule[] = [];\n\tfor (const line of ruleLines) {\n\t\tif (line.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst [type, sid] = line.split(\";\");\n\t\tif ((type !== \"Allow\" && type !== \"Deny\") || !sid) {\n\t\t\treturn undefined;\n\t\t}\n\t\taccessRules.push({ allow: type === \"Allow\", sid });\n\t}\n\treturn { currentSid, ownerSid, dacl, accessRules };\n}\n\ntype SecurityReader = (path: string) => WindowsDirectorySecurity | undefined;\n\nlet securityReader: SecurityReader = readWindowsDirectorySecurity;\n\n/** The metadata identity a successful verification is bound to. */\ninterface VerifiedDirectoryIdentity {\n\t/** Creation time: a directory recreated at the path carries a fresh one. */\n\tbirthtimeMs: number;\n\t/** NTFS change time: bumped by an in-place DACL edit (and by entry\n\t * creation/removal inside the directory, which forces a harmless\n\t * re-read). */\n\tctimeMs: number;\n\t/** Last-write time: redundant with the change time on NTFS, kept so the\n\t * cache never outlives any observable metadata change. */\n\tmtimeMs: number;\n}\n\n/** Verified paths mapped to the metadata identity observed *before* the\n * descriptor was read. Snapshotting before the read means any mutation that\n * races the read still changes the identity relative to the cache entry, so\n * the next call re-verifies rather than trusting the racing state. */\nconst verifiedPaths = new Map<string, VerifiedDirectoryIdentity>();\n\n/**\n * Verify `path` as adoptable, returning the refusal reason when it is not.\n *\n * The subprocess read sits on the spill path, so a successful verification\n * is cached for the life of the process while the directory's metadata\n * identity (creation, change, and last-write times) is unchanged. A swapped\n * directory or an in-place DACL edit changes that identity and forces a\n * fresh read; so does creating a file inside the directory, which trades one\n * bounded subprocess per spill for never trusting a stale descriptor. The\n * symlink/directory checks in `session-temp-dir.ts` still run on every use.\n * A failure is never cached, so a transient read error does not permanently\n * disable spills.\n */\nexport function verifyWindowsDirectorySecurity(path: string): string | undefined {\n\tlet identity: VerifiedDirectoryIdentity;\n\ttry {\n\t\tconst stat = statSync(path);\n\t\tidentity = { birthtimeMs: stat.birthtimeMs, ctimeMs: stat.ctimeMs, mtimeMs: stat.mtimeMs };\n\t} catch {\n\t\treturn \"its ownership could not be verified\";\n\t}\n\tconst cached = verifiedPaths.get(path);\n\tif (\n\t\tcached !== undefined &&\n\t\tcached.birthtimeMs === identity.birthtimeMs &&\n\t\tcached.ctimeMs === identity.ctimeMs &&\n\t\tcached.mtimeMs === identity.mtimeMs\n\t) {\n\t\treturn undefined;\n\t}\n\tconst security = securityReader(path);\n\tif (security === undefined) {\n\t\treturn \"its ownership could not be verified\";\n\t}\n\tconst refusal = evaluateWindowsDirectorySecurity(security);\n\tif (refusal !== undefined) {\n\t\tverifiedPaths.delete(path);\n\t\treturn refusal;\n\t}\n\tverifiedPaths.set(path, identity);\n\treturn undefined;\n}\n\n/** Test seam: substitute the descriptor reader; pass `undefined` to restore. */\nexport function setWindowsDirectorySecurityReaderForTesting(reader: SecurityReader | undefined): void {\n\tsecurityReader = reader ?? readWindowsDirectorySecurity;\n}\n\n/** Test seam: forget verified paths so a suite can re-drive verification. */\nexport function resetWindowsDirectorySecurityStateForTesting(): void {\n\tverifiedPaths.clear();\n\tsecurityReader = readWindowsDirectorySecurity;\n}\n"]}
@@ -6,6 +6,10 @@ declare const writeSchema: Type.TObject<{
6
6
  path: Type.TString;
7
7
  content: Type.TString;
8
8
  }>;
9
+ export declare const writeToolSystemPromptContribution: Readonly<{
10
+ readonly snippet: "Create or overwrite a writable path selector.";
11
+ readonly guidelines: readonly ["Use write when replacing the full content of a target; use edit for source edits anchored to existing hashline snapshots."];
12
+ }>;
9
13
  export type WriteToolInput = Static<typeof writeSchema>;
10
14
  export interface WriteToolDetails {
11
15
  resolvedPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAW/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAGtF,OAAO,EAGN,KAAK,qBAAqB,EAI1B,MAAM,eAAe,CAAC;AAiBvB,QAAA,MAAM,WAAW;;;EAYhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,gBAAgB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAwFD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACtC;AA+ID,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC,CA2MlE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAW/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAGtF,OAAO,EAGN,KAAK,qBAAqB,EAI1B,MAAM,eAAe,CAAC;AAiBvB,QAAA,MAAM,WAAW;;;EAYhB,CAAC;AAEF,eAAO,MAAM,iCAAiC;sBACpC,+CAA+C;;EAI9C,CAAC;AACZ,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,gBAAgB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAwFD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACtC;AA+ID,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAyMlE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG"}
@@ -20,6 +20,12 @@ const writeSchema = Type.Object({
20
20
  description: "Full replacement content. SQLite non-delete writes parse as a JSON5 object; empty content deletes a SQLite row when a row key exists.",
21
21
  }),
22
22
  }, { additionalProperties: false });
23
+ export const writeToolSystemPromptContribution = Object.freeze({
24
+ snippet: "Create or overwrite a writable path selector.",
25
+ guidelines: Object.freeze([
26
+ "Use write when replacing the full content of a target; use edit for source edits anchored to existing hashline snapshots.",
27
+ ]),
28
+ });
23
29
  async function findConflictBlocks(root, limit = 100) {
24
30
  const out = [];
25
31
  async function walk(dir) {
@@ -232,10 +238,8 @@ export function createWriteToolDefinition(cwd, options) {
232
238
  name: "write",
233
239
  label: "write",
234
240
  description: "Create or overwrite a file, writable internal resource, archive entry, SQLite row, or merge-conflict resolution.",
235
- promptSnippet: "Create or overwrite a writable path selector.",
236
- promptGuidelines: [
237
- "Use write when replacing the full content of a target; use edit for source edits anchored to existing hashline snapshots.",
238
- ],
241
+ promptSnippet: writeToolSystemPromptContribution.snippet,
242
+ promptGuidelines: [...writeToolSystemPromptContribution.guidelines],
239
243
  parameters: writeSchema,
240
244
  async execute(_toolCallId, { path, content }, signal, _onUpdate, _ctx) {
241
245
  const resourceCtx = _ctx;