@abot-ai/runtime 1.7.0 → 1.8.1

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 (532) hide show
  1. package/README.md +216 -222
  2. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
  3. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  4. package/dist/src/capabilities/tool-types.d.ts +4 -0
  5. package/dist/src/cli/abot.js +2 -0
  6. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  7. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  8. package/dist/src/computer-access/collection-consent.js +47 -0
  9. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  10. package/dist/src/computer-access/command-output-capture.js +134 -68
  11. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  12. package/dist/src/computer-access/command-output-protection.js +59 -0
  13. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  14. package/dist/src/computer-access/companion/command-output.js +23 -6
  15. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  16. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  17. package/dist/src/computer-access/companion/native-session.js +6 -2
  18. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  19. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  20. package/dist/src/computer-access/companion/observation-process.js +51 -25
  21. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  22. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  23. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  24. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  25. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  26. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  27. package/dist/src/computer-access/handlers.d.ts +2 -1
  28. package/dist/src/computer-access/handlers.js +79 -11
  29. package/dist/src/computer-access/host-observation.d.ts +3 -3
  30. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  31. package/dist/src/computer-access/native-observation-connection.js +78 -0
  32. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  33. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  34. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  35. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  36. package/dist/src/computer-access/observation-source.d.ts +6 -0
  37. package/dist/src/computer-access/observation-source.js +10 -0
  38. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  39. package/dist/src/computer-access/security/desktop-result.js +146 -0
  40. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  41. package/dist/src/computer-access/security/observed-error.js +10 -0
  42. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  43. package/dist/src/computer-access/security/secret-text.js +111 -0
  44. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  45. package/dist/src/computer-access/security/system-results.js +53 -0
  46. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  47. package/dist/src/computer-access/system-result-protection.js +1 -0
  48. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  49. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  50. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  51. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  52. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  53. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  54. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  55. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  56. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  57. package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
  58. package/dist/src/model-gateway/protocol/message-contract.js +1 -1
  59. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  60. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  61. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  62. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  63. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  64. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  65. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  66. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  67. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  68. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  69. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  70. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  71. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  72. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  73. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  74. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  75. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  76. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  77. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  78. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  79. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  80. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  81. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  82. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  83. package/dist/src/model-gateway/server/chat-handler.js +5 -7
  84. package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
  85. package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
  86. package/dist/src/model-gateway/server.js +5 -1
  87. package/dist/src/plugin-contract/index.d.ts +1 -0
  88. package/dist/src/plugin-contract/index.js +1 -0
  89. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  90. package/dist/src/plugin-contract/manifest.js +1 -0
  91. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  92. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  93. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  94. package/dist/src/plugin-sdk/computer-access.js +1 -0
  95. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  96. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  97. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  98. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  99. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  100. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  101. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  102. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  103. package/dist/src/plugin-sdk/files.js +4 -0
  104. package/dist/src/plugin-sdk/index.d.ts +1 -0
  105. package/dist/src/plugin-sdk/index.js +1 -0
  106. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  107. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  108. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  109. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  110. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  111. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  112. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  113. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  114. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  115. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
  116. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
  117. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
  118. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  119. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  120. package/dist/src/runtime/capabilities/tool-availability.js +6 -0
  121. package/dist/src/runtime/context/capability-brief.d.ts +2 -2
  122. package/dist/src/runtime/context/capability-brief.js +3 -3
  123. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
  124. package/dist/src/runtime/context/capability-descriptions.js +57 -20
  125. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  126. package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
  127. package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
  128. package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
  129. package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
  130. package/dist/src/runtime/long-term-memory/projection.js +1 -1
  131. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
  132. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
  133. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
  134. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
  135. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
  136. package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
  137. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
  138. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
  139. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
  140. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  141. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
  142. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
  143. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
  144. package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
  145. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
  146. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
  147. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  148. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  149. package/dist/src/runtime/passive-learning/service.js +2 -3
  150. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  151. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  152. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  153. package/dist/src/runtime/plugins/installation/package.js +2 -0
  154. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  155. package/dist/src/runtime/plugins/loader.js +24 -14
  156. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  157. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  158. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  159. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  160. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  161. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  162. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  163. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  164. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  165. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  166. package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
  167. package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
  168. package/dist/src/runtime/request/prepared-execution.js +3 -0
  169. package/dist/src/runtime/request/root-contract.d.ts +2 -0
  170. package/dist/src/runtime/request/root-execution-kernel.js +1 -0
  171. package/dist/src/runtime/request/runner.js +9 -3
  172. package/dist/src/runtime/request/supervisor-root-execution.js +6 -0
  173. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  174. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  175. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
  176. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
  177. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
  178. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
  179. package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
  180. package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
  181. package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
  182. package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
  183. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
  184. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
  185. package/dist/src/runtime/steps/execution-agent/format.js +4 -3
  186. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
  187. package/dist/src/runtime/steps/execution-agent/input.js +22 -1
  188. package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
  189. package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
  190. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  191. package/dist/src/runtime/steps/execution-agent/prompt.js +7 -8
  192. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  193. package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
  194. package/dist/src/runtime/steps/execution-agent/run.js +4 -1
  195. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +3 -5
  196. package/dist/src/runtime/steps/execution-agent/state-context.js +5 -51
  197. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  198. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  199. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  200. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  201. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
  202. package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
  203. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  204. package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
  205. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
  206. package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
  207. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
  208. package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
  209. package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
  210. package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
  211. package/dist/src/sessions/durable-session-commit.js +3 -3
  212. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  213. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  214. package/dist/src/sessions/session-store.js +3 -3
  215. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  216. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  217. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  218. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  219. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  220. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  221. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  222. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  223. package/dist/src/shared/windows-job-object.d.ts +2 -0
  224. package/dist/src/shared/windows-job-object.js +66 -0
  225. package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
  226. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  227. package/dist/src/web-ui/app/app-state.js +0 -7
  228. package/dist/src/web-ui/app/app.js +54 -156
  229. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  230. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  231. package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
  232. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  233. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  234. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  235. package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
  236. package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
  237. package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
  238. package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
  239. package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
  240. package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
  241. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  242. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  243. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  244. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  245. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  246. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  247. package/dist/src/web-ui/app/components/operations-summary.js +2 -1
  248. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  249. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  250. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  251. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  252. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  253. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  254. package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
  255. package/dist/src/web-ui/app/components/passive-learning/home.js +11 -3
  256. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  257. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  258. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  259. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  260. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  261. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  262. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  263. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  264. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  265. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  266. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  267. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  268. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  269. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  270. package/dist/src/web-ui/app/components/schedules/details.js +3 -2
  271. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  272. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  273. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  274. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  275. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
  276. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  277. package/dist/src/web-ui/app/components/spark-chat/settings.js +8 -4
  278. package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
  279. package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
  280. package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
  281. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  282. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  283. package/dist/src/web-ui/app/components/system-host/rendering.js +6 -3
  284. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
  285. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  286. package/dist/src/web-ui/app/computer-access-feature.js +13 -1
  287. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  288. package/dist/src/web-ui/app/configuration-feature.js +11 -1
  289. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  290. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  291. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  292. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  293. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  294. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  295. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  296. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  297. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  298. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  299. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  300. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  301. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  302. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  303. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  304. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  305. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  306. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  307. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  308. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  309. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  310. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  311. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  312. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  313. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  314. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  315. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  316. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  317. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  318. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  319. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  320. package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
  321. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  322. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  323. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  324. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  325. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  326. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  327. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  328. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  329. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  330. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  331. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  332. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  333. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  334. package/dist/src/web-ui/app/dashboard-feature.js +12 -2
  335. package/dist/src/web-ui/app/lib/reasoning-controls.js +40 -0
  336. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  337. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  338. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  339. package/dist/src/web-ui/app/passive-learning-feature.js +18 -5
  340. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  341. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  342. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  343. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  344. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  345. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  346. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  347. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  348. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  349. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  350. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  351. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  352. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  353. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  354. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  355. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  356. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  357. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  358. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  359. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  360. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  361. package/dist/src/web-ui/app/styles/95-home-widgets.css +109 -0
  362. package/dist/src/web-ui/app/styles.css +3 -0
  363. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  364. package/dist/src/web-ui/client-state/contracts.js +13 -0
  365. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  366. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  367. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  368. package/dist/src/web-ui/client-state/preferences.js +84 -0
  369. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  370. package/dist/src/web-ui/client-state/queue.js +43 -0
  371. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  372. package/dist/src/web-ui/client-state/routes.js +58 -0
  373. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  374. package/dist/src/web-ui/client-state/store.js +88 -0
  375. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  376. package/dist/src/web-ui/local-runtime/http.js +11 -2
  377. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  378. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  379. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  380. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  381. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  382. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  383. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  384. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  385. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  386. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  387. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  388. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  389. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  390. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  391. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  392. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  393. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  394. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  395. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  396. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  397. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  398. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  399. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  400. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  401. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  402. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  403. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  404. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  405. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  406. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  407. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  408. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  409. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  410. package/dist/src/web-ui/server-readiness.js +36 -0
  411. package/dist/src/web-ui/server.d.ts +2 -0
  412. package/dist/src/web-ui/server.js +23 -1
  413. package/dist/src/web-ui/system-host-service.js +13 -2
  414. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  415. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  416. package/docs/installation.md +44 -5
  417. package/docs/plugins.md +174 -28
  418. package/docs/tool-execution-result-evidence-contract.md +57 -0
  419. package/docs/windows-companion-store.md +5 -0
  420. package/package.json +4 -2
  421. package/plugins/capability-brief/plugin.json +5 -1
  422. package/plugins/code-outline/README.md +20 -0
  423. package/plugins/code-outline/plugin.json +2 -1
  424. package/plugins/code-outline/source/index.ts +16 -20
  425. package/plugins/code-outline/source/read-failure.ts +40 -0
  426. package/plugins/code-outline/src/index.cjs +614 -29
  427. package/plugins/document-reader/README.md +33 -0
  428. package/plugins/document-reader/plugin.json +2 -1
  429. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  430. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  431. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  432. package/plugins/document-reader/source/pdf-process.ts +207 -0
  433. package/plugins/document-reader/source/pdf-result.ts +79 -0
  434. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  435. package/plugins/document-reader/source/pdf.ts +4 -1
  436. package/plugins/document-reader/source/read-failure.ts +37 -0
  437. package/plugins/document-reader/source/reader.ts +3 -19
  438. package/plugins/document-reader/src/index.cjs +995 -211
  439. package/plugins/exec/README.md +19 -0
  440. package/plugins/exec/plugin.json +4 -3
  441. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  442. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  443. package/plugins/exec/source/filesystem-observer.ts +8 -79
  444. package/plugins/exec/source/output-files.ts +12 -6
  445. package/plugins/exec/source/paths.ts +3 -1
  446. package/plugins/exec/source/process-manager.ts +8 -24
  447. package/plugins/exec/source/shell-platform.ts +19 -3
  448. package/plugins/exec/source/shell-process.ts +55 -0
  449. package/plugins/exec/source/windows-job-source.ts +1 -0
  450. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  451. package/plugins/exec/src/index.cjs +252 -96
  452. package/plugins/filesystem/README.md +65 -0
  453. package/plugins/filesystem/plugin.json +7 -3
  454. package/plugins/filesystem/source/atomic-write.ts +2 -0
  455. package/plugins/filesystem/source/bounded-io.ts +80 -306
  456. package/plugins/filesystem/source/directory-sample.ts +2 -0
  457. package/plugins/filesystem/source/errors.ts +14 -0
  458. package/plugins/filesystem/source/file-observation.ts +151 -0
  459. package/plugins/filesystem/source/file-version.ts +41 -0
  460. package/plugins/filesystem/source/index.ts +6 -0
  461. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  462. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  463. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  464. package/plugins/filesystem/source/windows/operations.ts +197 -0
  465. package/plugins/filesystem/source/windows/process.ts +214 -0
  466. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  467. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  468. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  469. package/plugins/filesystem/source/windows/source.ts +42 -0
  470. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  471. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  472. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  473. package/plugins/filesystem/src/index.cjs +1208 -322
  474. package/plugins/json-inspector/README.md +18 -0
  475. package/plugins/json-inspector/plugin.json +2 -1
  476. package/plugins/json-inspector/source/index.ts +16 -19
  477. package/plugins/json-inspector/source/read-failure.ts +42 -0
  478. package/plugins/json-inspector/src/index.cjs +612 -27
  479. package/plugins/local-search/README.md +29 -0
  480. package/plugins/local-search/plugin.json +2 -1
  481. package/plugins/local-search/source/errors.ts +2 -0
  482. package/plugins/local-search/source/paths.ts +3 -0
  483. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  484. package/plugins/local-search/source/ripgrep.ts +3 -3
  485. package/plugins/local-search/source/windows-authority.ts +99 -0
  486. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  487. package/plugins/local-search/source/windows-search-process.ts +91 -0
  488. package/plugins/local-search/source/windows-search-script.ts +52 -0
  489. package/plugins/local-search/src/index.cjs +595 -26
  490. package/plugins/memory/plugin.json +5 -1
  491. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  492. package/plugins/memory/source/lock-owner-file.ts +71 -0
  493. package/plugins/memory/source/lock-path-observation.ts +26 -0
  494. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  495. package/plugins/memory/source/store-lock.ts +12 -7
  496. package/plugins/memory/source/store.ts +3 -2
  497. package/plugins/memory/src/index.cjs +174 -25
  498. package/plugins/project-orientation/README.md +23 -0
  499. package/plugins/project-orientation/plugin.json +2 -1
  500. package/plugins/project-orientation/source/index.ts +12 -9
  501. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  502. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  503. package/plugins/project-orientation/source/tree.ts +6 -0
  504. package/plugins/project-orientation/src/index.cjs +647 -31
  505. package/plugins/system/README.md +51 -15
  506. package/plugins/system/plugin.json +6 -2
  507. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  508. package/plugins/system/source/command-working-directory.ts +47 -0
  509. package/plugins/system/source/computer/handlers.ts +13 -9
  510. package/plugins/system/source/computer/observation-result.ts +10 -5
  511. package/plugins/system/source/computer/request-computers.ts +10 -3
  512. package/plugins/system/source/computer/request-modules.ts +3 -6
  513. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  514. package/plugins/system/source/host-dispatch.ts +18 -2
  515. package/plugins/system/source/index.ts +5 -3
  516. package/plugins/system/source/local-command-output-retention.ts +16 -0
  517. package/plugins/system/source/local-command-output.ts +16 -8
  518. package/plugins/system/source/request-system-modules.ts +12 -2
  519. package/plugins/system/source/request-target-snapshot.ts +2 -1
  520. package/plugins/system/source/security/desktop-result.ts +177 -0
  521. package/plugins/system/source/security/observed-error.ts +10 -0
  522. package/plugins/system/source/security/secret-text.ts +118 -0
  523. package/plugins/system/source/security/system-results.ts +62 -0
  524. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  525. package/plugins/system/src/index.cjs +837 -151
  526. package/plugins/system-probe/plugin.json +9 -3
  527. package/plugins/system-probe/source/disk-path.ts +8 -0
  528. package/plugins/system-probe/source/index.ts +10 -5
  529. package/plugins/system-probe/source/machine-load.ts +33 -0
  530. package/plugins/system-probe/source/metrics.ts +6 -8
  531. package/plugins/system-probe/src/index.cjs +49 -16
  532. package/plugins/web/plugin.json +5 -1
@@ -266,54 +266,37 @@ function canHandOffContextText(original, assessed, budget) {
266
266
  var TOOL_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
267
267
 
268
268
  // plugins/exec/source/filesystem-observer.ts
269
+ var import_promises2 = require("node:fs/promises");
270
+ var import_node_path = require("node:path");
271
+
272
+ // plugins/exec/source/filesystem-file-observer.ts
269
273
  var import_node_crypto = require("node:crypto");
270
274
  var import_node_fs = require("node:fs");
271
275
  var import_promises = require("node:fs/promises");
272
- var import_node_path = require("node:path");
273
- var SNAPSHOT_MAX_ENTRIES = 4096;
274
- var SNAPSHOT_MAX_HASHED_BYTES = 16 * 1024 * 1024;
275
276
  var SNAPSHOT_MAX_HASHED_FILE_BYTES = 2 * 1024 * 1024;
276
- var DELTA_ACTION_LIMIT = 64;
277
- var ACTION_TARGET_MAX_CHARS = 96;
278
277
  function isMissingPathError(error) {
279
278
  return error instanceof Error && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR");
280
279
  }
281
280
  function hashBuffer(content) {
282
281
  return (0, import_node_crypto.createHash)("sha256").update(content).digest("hex");
283
282
  }
284
- async function readBoundedDirectory(absoluteDirectory, maxItems) {
285
- let directory;
286
- try {
287
- directory = await (0, import_promises.opendir)(absoluteDirectory);
288
- } catch (error) {
289
- if (isMissingPathError(error)) {
290
- return Object.freeze({ children: Object.freeze([]), complete: true });
291
- }
292
- throw error;
293
- }
294
- const children = [];
295
- let complete = true;
296
- try {
297
- while (true) {
298
- const child = await directory.read();
299
- if (!child) break;
300
- if (children.length >= maxItems) {
301
- complete = false;
302
- break;
303
- }
304
- children.push(child);
305
- }
306
- } finally {
307
- await directory.close().catch((error) => {
308
- if (!(error instanceof Error) || !("code" in error) || error.code !== "ERR_DIR_CLOSED") {
309
- throw error;
310
- }
283
+ async function inspectExecRegularFile(absolutePath, remainingHashBytes) {
284
+ if (process.platform === "win32") {
285
+ const info = await (0, import_promises.lstat)(absolutePath).catch((error) => {
286
+ if (isMissingPathError(error)) return null;
287
+ throw error;
288
+ });
289
+ if (!info?.isFile()) return void 0;
290
+ return Object.freeze({
291
+ entry: Object.freeze({
292
+ kind: "file",
293
+ mode: info.mode,
294
+ size: info.size,
295
+ mtimeMs: info.mtimeMs
296
+ }),
297
+ hashedBytes: 0
311
298
  });
312
299
  }
313
- children.sort((left, right) => left.name.localeCompare(right.name));
314
- return Object.freeze({ children: Object.freeze(children), complete });
315
- }
316
- async function inspectRegularFile(absolutePath, remainingHashBytes) {
317
300
  const noFollow = import_node_fs.constants.O_NOFOLLOW;
318
301
  if (!Number.isInteger(noFollow)) return void 0;
319
302
  let file;
@@ -359,11 +342,49 @@ async function inspectRegularFile(absolutePath, remainingHashBytes) {
359
342
  await file.close();
360
343
  }
361
344
  }
345
+
346
+ // plugins/exec/source/filesystem-observer.ts
347
+ var SNAPSHOT_MAX_ENTRIES = 4096;
348
+ var SNAPSHOT_MAX_HASHED_BYTES = 16 * 1024 * 1024;
349
+ var DELTA_ACTION_LIMIT = 64;
350
+ var ACTION_TARGET_MAX_CHARS = 96;
351
+ async function readBoundedDirectory(absoluteDirectory, maxItems) {
352
+ let directory;
353
+ try {
354
+ directory = await (0, import_promises2.opendir)(absoluteDirectory);
355
+ } catch (error) {
356
+ if (isMissingPathError(error)) {
357
+ return Object.freeze({ children: Object.freeze([]), complete: true });
358
+ }
359
+ throw error;
360
+ }
361
+ const children = [];
362
+ let complete = true;
363
+ try {
364
+ while (true) {
365
+ const child = await directory.read();
366
+ if (!child) break;
367
+ if (children.length >= maxItems) {
368
+ complete = false;
369
+ break;
370
+ }
371
+ children.push(child);
372
+ }
373
+ } finally {
374
+ await directory.close().catch((error) => {
375
+ if (!(error instanceof Error) || !("code" in error) || error.code !== "ERR_DIR_CLOSED") {
376
+ throw error;
377
+ }
378
+ });
379
+ }
380
+ children.sort((left, right) => left.name.localeCompare(right.name));
381
+ return Object.freeze({ children: Object.freeze(children), complete });
382
+ }
362
383
  async function captureExecFilesystemSnapshot(absoluteRoot, logicalRoot) {
363
384
  const entries = /* @__PURE__ */ new Map();
364
385
  let remainingHashBytes = SNAPSHOT_MAX_HASHED_BYTES;
365
386
  let complete = true;
366
- const rootInfo = await (0, import_promises.lstat)(absoluteRoot).catch((error) => {
387
+ const rootInfo = await (0, import_promises2.lstat)(absoluteRoot).catch((error) => {
367
388
  if (isMissingPathError(error)) return null;
368
389
  throw error;
369
390
  });
@@ -387,7 +408,7 @@ async function captureExecFilesystemSnapshot(absoluteRoot, logicalRoot) {
387
408
  for (const child of directory.children) {
388
409
  const relativePath = relativeDirectory ? (0, import_node_path.join)(relativeDirectory, child.name) : child.name;
389
410
  const absolutePath = (0, import_node_path.join)(absoluteRoot, relativePath);
390
- const info = await (0, import_promises.lstat)(absolutePath).catch((error) => {
411
+ const info = await (0, import_promises2.lstat)(absolutePath).catch((error) => {
391
412
  if (isMissingPathError(error)) return null;
392
413
  throw error;
393
414
  });
@@ -406,7 +427,7 @@ async function captureExecFilesystemSnapshot(absoluteRoot, logicalRoot) {
406
427
  continue;
407
428
  }
408
429
  if (info.isSymbolicLink()) {
409
- const linkTarget = await (0, import_promises.readlink)(absolutePath).catch(() => void 0);
430
+ const linkTarget = await (0, import_promises2.readlink)(absolutePath).catch(() => void 0);
410
431
  entries.set(
411
432
  relativePath,
412
433
  Object.freeze({
@@ -420,7 +441,7 @@ async function captureExecFilesystemSnapshot(absoluteRoot, logicalRoot) {
420
441
  continue;
421
442
  }
422
443
  if (info.isFile()) {
423
- const inspected = await inspectRegularFile(
444
+ const inspected = await inspectExecRegularFile(
424
445
  absolutePath,
425
446
  remainingHashBytes
426
447
  );
@@ -802,7 +823,7 @@ var ExecTerminalDelivery = class {
802
823
 
803
824
  // plugins/exec/source/output-files.ts
804
825
  var import_node_crypto3 = require("node:crypto");
805
- var import_promises2 = require("node:fs/promises");
826
+ var import_promises3 = require("node:fs/promises");
806
827
  var import_node_path2 = require("node:path");
807
828
  var ID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;
808
829
  function outputStorageRoot(stateDir) {
@@ -836,28 +857,32 @@ function outputFailure(code, cause) {
836
857
  async function writeOutputMetadata(path, value) {
837
858
  const temporary = `${path}.${(0, import_node_crypto3.randomUUID)()}.tmp`;
838
859
  try {
839
- const file = await (0, import_promises2.open)(temporary, "wx", 384);
860
+ const file = await (0, import_promises3.open)(temporary, "wx", 384);
840
861
  try {
841
862
  await file.writeFile(JSON.stringify(value));
842
863
  await file.sync();
843
864
  } finally {
844
865
  await file.close();
845
866
  }
846
- await (0, import_promises2.rename)(temporary, path);
847
- const directory = await (0, import_promises2.open)((0, import_node_path2.dirname)(path), "r");
848
- try {
849
- await directory.sync();
850
- } finally {
851
- await directory.close();
852
- }
867
+ await (0, import_promises3.rename)(temporary, path);
868
+ await syncOutputDirectoryEntry(path);
853
869
  } catch (error) {
854
- await (0, import_promises2.rm)(temporary, { force: true }).catch(() => void 0);
870
+ await (0, import_promises3.rm)(temporary, { force: true }).catch(() => void 0);
855
871
  throw outputFailure("metadata_write_failed", error);
856
872
  }
857
873
  }
874
+ async function syncOutputDirectoryEntry(path) {
875
+ if (process.platform === "win32") return;
876
+ const directory = await (0, import_promises3.open)((0, import_node_path2.dirname)(path), "r");
877
+ try {
878
+ await directory.sync();
879
+ } finally {
880
+ await directory.close();
881
+ }
882
+ }
858
883
  async function prepareOutputOwnerDirectory(directory) {
859
884
  try {
860
- await (0, import_promises2.mkdir)(directory, { recursive: true, mode: 448 });
885
+ await (0, import_promises3.mkdir)(directory, { recursive: true, mode: 448 });
861
886
  } catch (error) {
862
887
  throw outputFailure("write_failed", error);
863
888
  }
@@ -865,7 +890,7 @@ async function prepareOutputOwnerDirectory(directory) {
865
890
  async function readOutputOwner(directory) {
866
891
  let value;
867
892
  try {
868
- value = JSON.parse(await (0, import_promises2.readFile)((0, import_node_path2.join)(directory, "owner.json"), "utf8"));
893
+ value = JSON.parse(await (0, import_promises3.readFile)((0, import_node_path2.join)(directory, "owner.json"), "utf8"));
869
894
  } catch (error) {
870
895
  if (error.code === "ENOENT") return void 0;
871
896
  throw outputFailure("owner_read_failed", error);
@@ -884,7 +909,7 @@ async function lookupOutputSnapshot(directory, ownerId, id) {
884
909
  let value;
885
910
  try {
886
911
  value = JSON.parse(
887
- await (0, import_promises2.readFile)(outputSnapshotPath(directory, id), "utf8")
912
+ await (0, import_promises3.readFile)(outputSnapshotPath(directory, id), "utf8")
888
913
  );
889
914
  } catch (error) {
890
915
  throw outputFailure("snapshot_unavailable", error);
@@ -1057,7 +1082,7 @@ function invalid() {
1057
1082
  }
1058
1083
 
1059
1084
  // plugins/exec/source/paths.ts
1060
- var import_promises3 = require("node:fs/promises");
1085
+ var import_promises4 = require("node:fs/promises");
1061
1086
  var import_node_path3 = require("node:path");
1062
1087
  function resolveContextualDirectory(pluginContext, executionContext, requestedPath) {
1063
1088
  if ((0, import_node_path3.isAbsolute)(requestedPath)) return { absolutePath: requestedPath };
@@ -1084,11 +1109,12 @@ function logicalDirectory(absolutePath, base) {
1084
1109
  return import_node_path3.posix.join(base.logicalPath, fromBase.split(import_node_path3.sep).join("/") || ".");
1085
1110
  }
1086
1111
  async function resolveExecWorkingDirectory(pluginContext, executionContext, rawPath) {
1087
- const requestedPath = readRequiredString(rawPath, {
1112
+ const inputPath = readRequiredString(rawPath, {
1088
1113
  name: "cwd",
1089
1114
  trim: false,
1090
1115
  maxLength: 4096
1091
1116
  });
1117
+ const requestedPath = process.platform === "win32" ? inputPath.replaceAll("\\", "/") : inputPath;
1092
1118
  if (requestedPath.includes("\0")) {
1093
1119
  throw new ExecPluginError(
1094
1120
  "exec_cwd_invalid",
@@ -1103,8 +1129,8 @@ async function resolveExecWorkingDirectory(pluginContext, executionContext, rawP
1103
1129
  let absolutePath;
1104
1130
  let info;
1105
1131
  try {
1106
- absolutePath = await (0, import_promises3.realpath)(target.absolutePath);
1107
- info = await (0, import_promises3.stat)(absolutePath);
1132
+ absolutePath = await (0, import_promises4.realpath)(target.absolutePath);
1133
+ info = await (0, import_promises4.stat)(absolutePath);
1108
1134
  } catch (error) {
1109
1135
  if (error instanceof Error && "code" in error && error.code === "ENOENT") {
1110
1136
  throw new ExecPluginError(
@@ -1130,10 +1156,9 @@ async function resolveExecWorkingDirectory(pluginContext, executionContext, rawP
1130
1156
  }
1131
1157
 
1132
1158
  // plugins/exec/source/process-manager.ts
1133
- var import_node_child_process = require("node:child_process");
1134
1159
  var import_node_crypto6 = require("node:crypto");
1135
1160
  var import_node_os = require("node:os");
1136
- var import_node_path6 = require("node:path");
1161
+ var import_node_path7 = require("node:path");
1137
1162
 
1138
1163
  // plugins/exec/source/process-output.ts
1139
1164
  function streamReceipt2(body) {
@@ -1270,7 +1295,7 @@ async function createExecProcessOutput(store, ownerId) {
1270
1295
  }
1271
1296
 
1272
1297
  // plugins/exec/source/output-store.ts
1273
- var import_promises9 = require("node:fs/promises");
1298
+ var import_promises10 = require("node:fs/promises");
1274
1299
  var import_node_path5 = require("node:path");
1275
1300
 
1276
1301
  // plugins/exec/source/output-contracts.ts
@@ -1279,7 +1304,7 @@ var EXEC_OUTPUT_IO_CHUNK_BYTES = 64 * 1024;
1279
1304
 
1280
1305
  // plugins/exec/source/output-range-reader.ts
1281
1306
  var import_node_crypto4 = require("node:crypto");
1282
- var import_promises4 = require("node:fs/promises");
1307
+ var import_promises5 = require("node:fs/promises");
1283
1308
  function assertOutputRange(startByte, endByte, availableBytes) {
1284
1309
  if (!Number.isSafeInteger(startByte) || startByte < 0)
1285
1310
  throw outputFailure("range_invalid");
@@ -1296,7 +1321,7 @@ async function* readOutputFileRange(path, range) {
1296
1321
  if (!Number.isSafeInteger(range.maxChunkBytes) || range.maxChunkBytes < 1 || range.maxChunkBytes > EXEC_OUTPUT_IO_CHUNK_BYTES)
1297
1322
  throw outputFailure("chunk_size_invalid");
1298
1323
  range.signal?.throwIfAborted();
1299
- const handle = await (0, import_promises4.open)(path, "r").catch((error) => {
1324
+ const handle = await (0, import_promises5.open)(path, "r").catch((error) => {
1300
1325
  throw outputFailure("read_failed", error);
1301
1326
  });
1302
1327
  try {
@@ -1346,7 +1371,7 @@ async function assertOutputBodyHash(path, body, signal) {
1346
1371
  }
1347
1372
 
1348
1373
  // plugins/exec/source/output-maintenance.ts
1349
- var import_promises5 = require("node:fs/promises");
1374
+ var import_promises6 = require("node:fs/promises");
1350
1375
  var MAX_CLEANUP_INTERVAL_MS = 60 * 6e4;
1351
1376
  var jobs = /* @__PURE__ */ new Map();
1352
1377
  function scheduleExecOutputCleanup(root, retentionMs, cleanup) {
@@ -1368,7 +1393,7 @@ function scheduleExecOutputCleanup(root, retentionMs, cleanup) {
1368
1393
  let empty = false;
1369
1394
  try {
1370
1395
  await job.cleanup();
1371
- empty = (await (0, import_promises5.readdir)(root).catch((error) => {
1396
+ empty = (await (0, import_promises6.readdir)(root).catch((error) => {
1372
1397
  if (error.code === "ENOENT") return [];
1373
1398
  throw error;
1374
1399
  })).length === 0;
@@ -1393,19 +1418,19 @@ function scheduleExecOutputCleanup(root, retentionMs, cleanup) {
1393
1418
  }
1394
1419
 
1395
1420
  // plugins/exec/source/output-retention.ts
1396
- var import_promises6 = require("node:fs/promises");
1421
+ var import_promises7 = require("node:fs/promises");
1397
1422
  var import_node_path4 = require("node:path");
1398
1423
  async function outputCaptureCompletedAt(directory, owner) {
1399
1424
  if (owner?.completedAt !== null && owner?.completedAt !== void 0)
1400
1425
  return owner.completedAt;
1401
- const entries = await (0, import_promises6.readdir)(directory, { withFileTypes: true });
1426
+ const entries = await (0, import_promises7.readdir)(directory, { withFileTypes: true });
1402
1427
  const captures = entries.filter(
1403
1428
  (entry) => entry.isFile() && entry.name.endsWith(".bytes")
1404
1429
  );
1405
- if (!captures.length) return (await (0, import_promises6.stat)(directory)).mtimeMs;
1430
+ if (!captures.length) return (await (0, import_promises7.stat)(directory)).mtimeMs;
1406
1431
  const times = await Promise.all(
1407
1432
  captures.map(
1408
- async (entry) => (await (0, import_promises6.stat)((0, import_node_path4.join)(directory, entry.name))).mtimeMs
1433
+ async (entry) => (await (0, import_promises7.stat)((0, import_node_path4.join)(directory, entry.name))).mtimeMs
1409
1434
  )
1410
1435
  );
1411
1436
  return Math.max(...times);
@@ -1431,9 +1456,9 @@ function incompleteUtf8TailBytes(tail) {
1431
1456
 
1432
1457
  // plugins/exec/source/output-writer.ts
1433
1458
  var import_node_crypto5 = require("node:crypto");
1434
- var import_promises7 = require("node:fs/promises");
1459
+ var import_promises8 = require("node:fs/promises");
1435
1460
  var import_node_stream = require("node:stream");
1436
- var import_promises8 = require("node:stream/promises");
1461
+ var import_promises9 = require("node:stream/promises");
1437
1462
  var OutputFileSink = class extends import_node_stream.Writable {
1438
1463
  constructor(file) {
1439
1464
  super({ highWaterMark: EXEC_OUTPUT_IO_CHUNK_BYTES });
@@ -1486,11 +1511,11 @@ var OutputFileSink = class extends import_node_stream.Writable {
1486
1511
  async function createOutputWriter(params) {
1487
1512
  const streamId = (0, import_node_crypto5.randomUUID)();
1488
1513
  const path = outputStreamPath(params.directory, streamId);
1489
- const file = await (0, import_promises7.open)(path, "wx+", 384).catch((error) => {
1514
+ const file = await (0, import_promises8.open)(path, "wx+", 384).catch((error) => {
1490
1515
  throw outputFailure("write_failed", error);
1491
1516
  });
1492
1517
  const sink = new OutputFileSink(file);
1493
- const completion = (0, import_promises8.finished)(sink).finally(params.onClosed);
1518
+ const completion = (0, import_promises9.finished)(sink).finally(params.onClosed);
1494
1519
  void completion.catch(() => void 0);
1495
1520
  return Object.freeze({
1496
1521
  sink,
@@ -1644,7 +1669,7 @@ function createExecOutputStore(params) {
1644
1669
  );
1645
1670
  },
1646
1671
  async cleanupExpired() {
1647
- const directories = await (0, import_promises9.readdir)(root, { withFileTypes: true }).catch(
1672
+ const directories = await (0, import_promises10.readdir)(root, { withFileTypes: true }).catch(
1648
1673
  (error) => {
1649
1674
  if (error.code === "ENOENT") return [];
1650
1675
  throw outputFailure("cleanup_failed", error);
@@ -1663,7 +1688,7 @@ function createExecOutputStore(params) {
1663
1688
  throw outputFailure("owner_binding_invalid");
1664
1689
  if (!await hasOutputExpired(directory, owner, now(), retentionMs))
1665
1690
  return;
1666
- await (0, import_promises9.rm)(directory, { recursive: true });
1691
+ await (0, import_promises10.rm)(directory, { recursive: true });
1667
1692
  removed += 1;
1668
1693
  });
1669
1694
  }
@@ -1751,32 +1776,178 @@ async function materializeExecOutput(store, scope, snapshot) {
1751
1776
 
1752
1777
  // plugins/exec/source/shell-platform.ts
1753
1778
  var import_node_fs2 = require("node:fs");
1754
- var import_promises10 = require("node:fs/promises");
1779
+ var import_promises11 = require("node:fs/promises");
1780
+ var import_node_path6 = require("node:path");
1755
1781
  var EXEC_SHELL = "/bin/bash";
1782
+ function execShell(platform = process.platform) {
1783
+ if (platform === "win32")
1784
+ return import_node_path6.win32.join(
1785
+ process.env.SystemRoot ?? "C:\\Windows",
1786
+ "System32",
1787
+ "WindowsPowerShell",
1788
+ "v1.0",
1789
+ "powershell.exe"
1790
+ );
1791
+ return EXEC_SHELL;
1792
+ }
1756
1793
  function isSupportedExecPlatform(platform) {
1794
+ if (platform === "win32") return true;
1757
1795
  return platform === "linux" || platform === "darwin";
1758
1796
  }
1759
1797
  async function assertSupportedShell(platform = process.platform) {
1760
1798
  if (!isSupportedExecPlatform(platform)) {
1761
1799
  throw new ExecPluginError(
1762
1800
  "exec_platform_unsupported",
1763
- "The exec plugin requires Linux or macOS and executable /bin/bash."
1801
+ "The exec plugin requires Linux/macOS with Bash or native Windows with Windows PowerShell."
1764
1802
  );
1765
1803
  }
1766
1804
  try {
1767
- await (0, import_promises10.access)(EXEC_SHELL, import_node_fs2.constants.X_OK);
1805
+ await (0, import_promises11.access)(execShell(platform), import_node_fs2.constants.X_OK);
1768
1806
  } catch {
1769
1807
  throw new ExecPluginError(
1770
1808
  "exec_shell_unavailable",
1771
- "The exec plugin cannot start because executable /bin/bash is unavailable."
1809
+ `The exec shell is unavailable: ${execShell(platform)}. No command ran. Do not retry until the user restores shell availability.`
1772
1810
  );
1773
1811
  }
1774
1812
  }
1775
1813
 
1814
+ // plugins/exec/source/shell-process.ts
1815
+ var import_node_child_process = require("node:child_process");
1816
+
1817
+ // plugins/exec/source/windows-shell-bootstrap.ts
1818
+ var WINDOWS_EXEC_BOOTSTRAP = [
1819
+ "$ErrorActionPreference='Stop'",
1820
+ "$ProgressPreference='SilentlyContinue'",
1821
+ "if ($ExecutionContext.SessionState.LanguageMode -ne 'FullLanguage') { Write-Error 'Windows policy blocks the EXEC helper. No command ran. Do not retry or bypass this restriction; ask the user to contact their administrator.' -ErrorAction Continue; exit 126 }",
1822
+ "$abotExecOriginalPSModulePath=$env:PSModulePath",
1823
+ "try {",
1824
+ "$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
1825
+ "[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
1826
+ "[Console]::OutputEncoding=[Text.UTF8Encoding]::new($false)",
1827
+ "$OutputEncoding=[Text.UTF8Encoding]::new($false)",
1828
+ "$abotExecEnvelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
1829
+ "Add-Type -TypeDefinition $abotExecEnvelope.source",
1830
+ "[AbotExecJob]::Attach()",
1831
+ "} catch { [Console]::Error.WriteLine('The Windows EXEC helper is unavailable or blocked. No command ran. Do not retry or bypass the restriction; the user must resolve helper availability first.'); exit 126 }",
1832
+ "$env:PSModulePath=$abotExecOriginalPSModulePath",
1833
+ "$global:LASTEXITCODE=0",
1834
+ ". ([ScriptBlock]::Create($abotExecEnvelope.command))",
1835
+ "if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }"
1836
+ ].join(";\n");
1837
+
1838
+ // src/shared/windows-job-object.ts
1839
+ var WINDOWS_EXEC_JOB_SOURCE = String.raw`
1840
+ using System;
1841
+ using System.ComponentModel;
1842
+ using System.Runtime.InteropServices;
1843
+
1844
+ public static class AbotExecJob {
1845
+ private static IntPtr job = IntPtr.Zero;
1846
+
1847
+ [StructLayout(LayoutKind.Sequential)]
1848
+ private struct BasicLimits {
1849
+ public long PerProcessUserTimeLimit;
1850
+ public long PerJobUserTimeLimit;
1851
+ public uint LimitFlags;
1852
+ public UIntPtr MinimumWorkingSetSize;
1853
+ public UIntPtr MaximumWorkingSetSize;
1854
+ public uint ActiveProcessLimit;
1855
+ public UIntPtr Affinity;
1856
+ public uint PriorityClass;
1857
+ public uint SchedulingClass;
1858
+ }
1859
+ [StructLayout(LayoutKind.Sequential)]
1860
+ private struct IoCounters {
1861
+ public ulong ReadOperationCount, WriteOperationCount, OtherOperationCount;
1862
+ public ulong ReadTransferCount, WriteTransferCount, OtherTransferCount;
1863
+ }
1864
+ [StructLayout(LayoutKind.Sequential)]
1865
+ private struct ExtendedLimits {
1866
+ public BasicLimits BasicLimitInformation;
1867
+ public IoCounters IoInfo;
1868
+ public UIntPtr ProcessMemoryLimit, JobMemoryLimit;
1869
+ public UIntPtr PeakProcessMemoryUsed, PeakJobMemoryUsed;
1870
+ }
1871
+
1872
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
1873
+ private static extern IntPtr CreateJobObject(IntPtr attributes, string name);
1874
+ [DllImport("kernel32.dll", SetLastError = true)]
1875
+ private static extern bool SetInformationJobObject(IntPtr handle, int kind,
1876
+ ref ExtendedLimits limits, uint size);
1877
+ [DllImport("kernel32.dll", SetLastError = true)]
1878
+ private static extern bool AssignProcessToJobObject(IntPtr handle, IntPtr process);
1879
+ [DllImport("kernel32.dll")]
1880
+ private static extern IntPtr GetCurrentProcess();
1881
+ [DllImport("kernel32.dll")]
1882
+ private static extern bool CloseHandle(IntPtr handle);
1883
+
1884
+ public static void Attach() {
1885
+ if (job != IntPtr.Zero) throw new InvalidOperationException("Already attached");
1886
+ IntPtr candidate = CreateJobObject(IntPtr.Zero, null);
1887
+ if (candidate == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error());
1888
+ try {
1889
+ ExtendedLimits limits = new ExtendedLimits();
1890
+ limits.BasicLimitInformation.LimitFlags = 0x00002000; // KILL_ON_JOB_CLOSE
1891
+ if (!SetInformationJobObject(candidate, 9, ref limits,
1892
+ (uint)Marshal.SizeOf(typeof(ExtendedLimits))))
1893
+ throw new Win32Exception(Marshal.GetLastWin32Error());
1894
+ if (!AssignProcessToJobObject(candidate, GetCurrentProcess()))
1895
+ throw new Win32Exception(Marshal.GetLastWin32Error());
1896
+ job = candidate;
1897
+ candidate = IntPtr.Zero;
1898
+ } finally {
1899
+ if (candidate != IntPtr.Zero) CloseHandle(candidate);
1900
+ }
1901
+ }
1902
+ }
1903
+ `;
1904
+
1905
+ // plugins/exec/source/shell-process.ts
1906
+ function spawnExecShell(command, cwd) {
1907
+ if (process.platform !== "win32")
1908
+ return (0, import_node_child_process.spawn)(execShell(), ["-lc", command], {
1909
+ cwd,
1910
+ detached: true,
1911
+ stdio: ["ignore", "pipe", "pipe"]
1912
+ });
1913
+ const child = (0, import_node_child_process.spawn)(
1914
+ execShell(),
1915
+ [
1916
+ "-NoLogo",
1917
+ "-NoProfile",
1918
+ "-NonInteractive",
1919
+ "-EncodedCommand",
1920
+ Buffer.from(WINDOWS_EXEC_BOOTSTRAP, "utf16le").toString("base64")
1921
+ ],
1922
+ { cwd, windowsHide: true, stdio: ["pipe", "pipe", "pipe"] }
1923
+ );
1924
+ child.stdin.on("error", () => {
1925
+ });
1926
+ child.stdin.end(
1927
+ JSON.stringify({ source: WINDOWS_EXEC_JOB_SOURCE, command }),
1928
+ "utf8"
1929
+ );
1930
+ return child;
1931
+ }
1932
+ function killExecProcessTree(child) {
1933
+ if (process.platform === "win32") {
1934
+ child.kill("SIGKILL");
1935
+ return;
1936
+ }
1937
+ if (typeof child.pid === "number") {
1938
+ try {
1939
+ process.kill(-child.pid, "SIGKILL");
1940
+ return;
1941
+ } catch {
1942
+ }
1943
+ }
1944
+ child.kill("SIGKILL");
1945
+ }
1946
+
1776
1947
  // plugins/exec/source/process-manager.ts
1777
1948
  var MAX_ACTIVE_PROCESSES_PER_SCOPE = 4;
1778
1949
  function createExecProcessManager(store = createExecOutputStore({
1779
- stateDir: (0, import_node_path6.join)((0, import_node_os.tmpdir)(), "abot-exec")
1950
+ stateDir: (0, import_node_path7.join)((0, import_node_os.tmpdir)(), "abot-exec")
1780
1951
  })) {
1781
1952
  const processes = /* @__PURE__ */ new Map();
1782
1953
  const opening = /* @__PURE__ */ new Map();
@@ -1791,21 +1962,10 @@ function createExecProcessManager(store = createExecOutputStore({
1791
1962
  const activeProcessCount = (scope) => [...processes.values()].filter(
1792
1963
  (managed) => managed.scope === scope && !managed.settled
1793
1964
  ).length + (opening.get(scope) ?? 0);
1794
- const killProcessTree = (managed) => {
1795
- const pid = managed.child.pid;
1796
- if (typeof pid === "number") {
1797
- try {
1798
- process.kill(-pid, "SIGKILL");
1799
- return;
1800
- } catch {
1801
- }
1802
- }
1803
- managed.child.kill("SIGKILL");
1804
- };
1805
1965
  const requestTermination = (managed, reason) => {
1806
1966
  if (managed.settled || managed.terminationReason) return;
1807
1967
  managed.terminationReason = reason;
1808
- killProcessTree(managed);
1968
+ killExecProcessTree(managed.child);
1809
1969
  if (reason === "output_storage_failed") {
1810
1970
  managed.child.stdout.destroy();
1811
1971
  managed.child.stderr.destroy();
@@ -1937,11 +2097,7 @@ function createExecProcessManager(store = createExecOutputStore({
1937
2097
  });
1938
2098
  let child;
1939
2099
  try {
1940
- child = (0, import_node_child_process.spawn)(EXEC_SHELL, ["-lc", params.shellCommand], {
1941
- cwd: params.cwd,
1942
- detached: true,
1943
- stdio: ["ignore", "pipe", "pipe"]
1944
- });
2100
+ child = spawnExecShell(params.shellCommand, params.cwd);
1945
2101
  } catch {
1946
2102
  await output.dispose();
1947
2103
  throw new ExecPluginError(
@@ -0,0 +1,65 @@
1
+ # Filesystem plugin
2
+
3
+ The same four tools run on Linux, macOS and native Windows: `dev_view`,
4
+ `read_file`, `write_file` and `edit_file`. Tools use the runtime's existing
5
+ authorized `agent_work` and `workspace` roots. This plugin does not grant access
6
+ to arbitrary host paths.
7
+
8
+ `write_file` takes a complete file path, including its filename. Missing parent
9
+ directories are created automatically: writing `project/index.html` creates
10
+ `project` if needed, while writing `project` creates a file with that name.
11
+ To create an empty directory, use an available SYSTEM or EXEC command tool.
12
+ Files without extensions, such as `README`, remain valid file targets.
13
+ If an intermediate path component is a file, the plugin returns
14
+ `not_a_directory` and explains that the path must be corrected before another
15
+ attempt. It does not replace or remove the blocking file.
16
+
17
+ ## Native Windows
18
+
19
+ Windows uses a plugin-owned C# helper compiled by the built-in Windows
20
+ PowerShell and .NET Framework. No extra application, administrator elevation,
21
+ Companion pairing or execution-policy change is performed. Atomic publication
22
+ requires Windows 10 version 1809 or newer and a filesystem supporting hard
23
+ links, such as NTFS. Unsupported publication is rejected.
24
+
25
+ Before tools enter a request's catalog, the plugin verifies that the helper can
26
+ compile and run. If PowerShell, compilation or organizational policy blocks it,
27
+ the filesystem tools are omitted from that request. A new request checks again.
28
+ This availability check does not guarantee permission to every selected file.
29
+
30
+ If a policy or helper-availability block appears after preparation, the tool
31
+ returns a non-retryable error explaining that no file operation ran. Subsequent
32
+ filesystem calls in that request return the same block without starting the
33
+ helper again. A file-specific access denial does not disable other file tools.
34
+ Organizational policy must be resolved by the user's administrator; the plugin
35
+ does not bypass it.
36
+
37
+ Each operation validates the authorized root's identity and opens path
38
+ components relative to held directory handles. Reparse points, device names,
39
+ alternate data streams and ambiguous Windows path aliases are rejected. Reads
40
+ and directory samples remain bounded. Writes use a private temporary file, check
41
+ the observed destination before commit, then atomically publish a hard link
42
+ under the final name within the held parent directory. New files are restricted
43
+ to the current Windows user; replacement preserves the existing file's DACL and
44
+ its protection flag. The temporary handle denies other opens until publication,
45
+ including while the destination's DACL is copied. The temporary name is marked
46
+ delete-on-close at creation and remains marked through publication. Windows
47
+ removes that name even if the helper is killed; a successfully published final
48
+ name survives independently. Replacing EFS-encrypted, NTFS-compressed or
49
+ named-stream-bearing files is rejected without changing the original or its
50
+ streams (including download-origin metadata). Reads remain available under the
51
+ existing permissions. The tool reports a non-retryable file-specific
52
+ restriction; other files remain usable. Writes to case variants of one Windows
53
+ path share the same in-process queue. Conflict checks before replacement are
54
+ optimistic: a separate process can still change the destination between the last
55
+ check and atomic publication. A read-only destination is left unchanged.
56
+ Interrupted writes with an unknown outcome are reported explicitly and are never
57
+ replayed by the plugin.
58
+
59
+ The maintained native tests cover Windows file operations, junction redirection,
60
+ conflicting writes, DACL preservation, read-only targets and policy blocking.
61
+ Network shares and third-party filesystem providers have not been validated.
62
+ Providers that lack the required identity or handle operations fail explicitly.
63
+
64
+ Optional host-generated chat file previews remain subject to the host's Windows
65
+ support. Successful plugin reads and writes do not depend on those previews.