@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
@@ -6,6 +6,14 @@ var __defProp = Object.defineProperty;
6
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __esm = (fn, res, err) => function __init() {
10
+ if (err) throw err[0];
11
+ try {
12
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
13
+ } catch (e) {
14
+ throw err = [e], e;
15
+ }
16
+ };
9
17
  var __export = (target, all) => {
10
18
  for (var name in all)
11
19
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -20,13 +28,563 @@ var __copyProps = (to, from, except, desc) => {
20
28
  };
21
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
30
 
31
+ // src/shared/windows-file-io/native-script.ts
32
+ var WINDOWS_FILESYSTEM_NATIVE;
33
+ var init_native_script = __esm({
34
+ "src/shared/windows-file-io/native-script.ts"() {
35
+ "use strict";
36
+ WINDOWS_FILESYSTEM_NATIVE = String.raw`
37
+ using System;
38
+ using System.IO;
39
+ using System.Text;
40
+ using System.Linq;
41
+ using System.Collections.Generic;
42
+ using System.ComponentModel;
43
+ using System.Runtime.InteropServices;
44
+ using System.Security.AccessControl;
45
+ using System.Security.Principal;
46
+ using System.Web.Script.Serialization;
47
+ using Microsoft.Win32.SafeHandles;
48
+
49
+ public sealed class FsFault : Exception {
50
+ public readonly string Code;
51
+ public FsFault(string code) : base(code) { Code = code; }
52
+ }
53
+ public static partial class AbotFilesystem {
54
+ [StructLayout(LayoutKind.Sequential)] struct UnicodeString { public ushort Length, MaximumLength; public IntPtr Buffer; }
55
+ [StructLayout(LayoutKind.Sequential)] struct ObjectAttributes {
56
+ public int Length; public IntPtr Root, Name; public uint Attributes; public IntPtr Security, Qos;
57
+ }
58
+ [StructLayout(LayoutKind.Sequential)] struct IoStatus { public IntPtr Status, Information; }
59
+ [StructLayout(LayoutKind.Sequential)] struct BasicInfo {
60
+ public long Created, Accessed, Modified, Changed; public uint Attributes;
61
+ }
62
+ [StructLayout(LayoutKind.Sequential)] struct FileInfo {
63
+ public uint Attributes; public System.Runtime.InteropServices.ComTypes.FILETIME Created, Accessed, Modified;
64
+ public uint Volume, SizeHigh, SizeLow, Links, IndexHigh, IndexLow;
65
+ }
66
+ [DllImport("ntdll.dll")] static extern int NtCreateFile(out SafeFileHandle file, uint access,
67
+ ref ObjectAttributes attributes, out IoStatus status, IntPtr allocation, uint fileAttributes,
68
+ uint share, uint disposition, uint options, IntPtr ea, uint eaLength);
69
+ [DllImport("ntdll.dll")] static extern uint RtlNtStatusToDosError(int status);
70
+ [DllImport("ntdll.dll")] static extern int NtSetInformationFile(SafeFileHandle file,
71
+ out IoStatus status, IntPtr info, uint length, int kind);
72
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool GetFileInformationByHandle(SafeFileHandle file, out FileInfo info);
73
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool GetFileInformationByHandleEx(SafeFileHandle file, int kind, IntPtr data, uint length);
74
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool SetFileInformationByHandle(SafeFileHandle file, int kind, ref BasicInfo info, uint length);
75
+ [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern uint GetFinalPathNameByHandle(SafeFileHandle file, StringBuilder name, uint length, uint flags);
76
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool SetFilePointerEx(SafeFileHandle file, long position, out long result, uint method);
77
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool ReadFile(SafeFileHandle file, byte[] bytes, uint count, out uint read, IntPtr overlapped);
78
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool WriteFile(SafeFileHandle file, byte[] bytes, uint count, out uint written, IntPtr overlapped);
79
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool FlushFileBuffers(SafeFileHandle file);
80
+ [DllImport("advapi32.dll")] static extern uint GetSecurityInfo(SafeFileHandle file, int kind, uint information,
81
+ out IntPtr owner, out IntPtr group, out IntPtr dacl, out IntPtr sacl, out IntPtr descriptor);
82
+ [DllImport("advapi32.dll")] static extern uint SetSecurityInfo(SafeFileHandle file, int kind, uint information,
83
+ IntPtr owner, IntPtr group, IntPtr dacl, IntPtr sacl);
84
+ [DllImport("advapi32.dll", SetLastError=true)] static extern bool GetSecurityDescriptorControl(IntPtr descriptor, out ushort control, out uint revision);
85
+ [DllImport("kernel32.dll")] static extern IntPtr LocalFree(IntPtr value);
86
+
87
+ static void Check(bool success) { if (!success) NativeFailure((uint)Marshal.GetLastWin32Error()); }
88
+ static bool IsNotDirectoryError(uint code) { return code == 267; } // ERROR_DIRECTORY
89
+ static void NativeFailure(uint code) {
90
+ if (IsNotDirectoryError(code)) throw new FsFault("not_a_directory");
91
+ if (code == 2 || code == 3) throw new FsFault("file_not_found");
92
+ if (code == 80 || code == 183) throw new FsFault("filesystem_target_changed");
93
+ if (code == 5 || code == 32 || code == 33) throw new FsFault("filesystem_access_denied");
94
+ throw new FsFault("filesystem_native_operation_failed");
95
+ }
96
+ static void CheckNt(int status) { if (status < 0) NativeFailure(RtlNtStatusToDosError(status)); }
97
+ static SafeFileHandle OpenHandle(SafeFileHandle root, string name, bool directory,
98
+ uint disposition, uint access, uint share, byte[] securityDescriptor = null, bool deleteOnClose = false) {
99
+ IntPtr text = Marshal.StringToHGlobalUni(name), unicodePointer = IntPtr.Zero, securityPointer = IntPtr.Zero;
100
+ try {
101
+ int length = Encoding.Unicode.GetByteCount(name);
102
+ if (length > 65532) throw new FsFault("filesystem_invalid_path");
103
+ UnicodeString unicode = new UnicodeString { Length=(ushort)length, MaximumLength=(ushort)(length+2), Buffer=text };
104
+ unicodePointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(UnicodeString)));
105
+ Marshal.StructureToPtr(unicode, unicodePointer, false);
106
+ if (securityDescriptor != null) {
107
+ securityPointer = Marshal.AllocHGlobal(securityDescriptor.Length);
108
+ Marshal.Copy(securityDescriptor, 0, securityPointer, securityDescriptor.Length);
109
+ }
110
+ ObjectAttributes attributes = new ObjectAttributes {
111
+ Length=Marshal.SizeOf(typeof(ObjectAttributes)), Root=root == null ? IntPtr.Zero : root.DangerousGetHandle(),
112
+ Name=unicodePointer, Attributes=0x40, Security=securityPointer
113
+ };
114
+ SafeFileHandle file;
115
+ IoStatus status;
116
+ int result = NtCreateFile(out file, access | 0x100000, ref attributes, out status,
117
+ IntPtr.Zero, 0x80, share, disposition, 0x200020u | (directory ? 1u : 0x40u) | (deleteOnClose ? 0x1000u : 0u), IntPtr.Zero, 0);
118
+ if (result < 0) { if (file != null) file.Dispose(); CheckNt(result); }
119
+ try {
120
+ FileInfo info; Check(GetFileInformationByHandle(file, out info));
121
+ if ((info.Attributes & 0x400) != 0) throw new FsFault("filesystem_path_changed");
122
+ if (((info.Attributes & 0x10) != 0) != directory) throw new FsFault("filesystem_path_changed");
123
+ return file;
124
+ } catch { file.Dispose(); throw; }
125
+ } finally {
126
+ if (securityPointer != IntPtr.Zero) Marshal.FreeHGlobal(securityPointer);
127
+ if (unicodePointer != IntPtr.Zero) Marshal.FreeHGlobal(unicodePointer);
128
+ Marshal.FreeHGlobal(text);
129
+ }
130
+ }
131
+ static BasicInfo Basic(SafeFileHandle file) {
132
+ IntPtr buffer = Marshal.AllocHGlobal(40);
133
+ try { Check(GetFileInformationByHandleEx(file, 0, buffer, 40)); return (BasicInfo)Marshal.PtrToStructure(buffer, typeof(BasicInfo)); }
134
+ finally { Marshal.FreeHGlobal(buffer); }
135
+ }
136
+ static Dictionary<string,object> Record(params object[] pairs) {
137
+ var result = new Dictionary<string,object>();
138
+ for (int i=0;i<pairs.Length;i+=2) result.Add((string)pairs[i], pairs[i+1]);
139
+ return result;
140
+ }
141
+ static string Text(Dictionary<string,object> request, string key) {
142
+ object value;
143
+ if (!request.TryGetValue(key, out value) || !(value is string)) throw new FsFault("filesystem_invalid_request");
144
+ return (string)value;
145
+ }
146
+ static int Limit(Dictionary<string,object> request, string key, int maximum) {
147
+ object value;
148
+ if (!request.TryGetValue(key, out value) || !(value is int)) throw new FsFault("filesystem_invalid_request");
149
+ int number = (int)value;
150
+ if (number < 0 || number > maximum) throw new FsFault("filesystem_invalid_request");
151
+ return number;
152
+ }
153
+ }
154
+ `;
155
+ }
156
+ });
157
+
158
+ // src/shared/windows-file-io/authority-script.ts
159
+ var WINDOWS_FILESYSTEM_AUTHORITY;
160
+ var init_authority_script = __esm({
161
+ "src/shared/windows-file-io/authority-script.ts"() {
162
+ "use strict";
163
+ WINDOWS_FILESYSTEM_AUTHORITY = String.raw`
164
+ public static partial class AbotFilesystem {
165
+ static string NativePath(string path) {
166
+ string full = Path.GetFullPath(path);
167
+ if (full.StartsWith(@"\\?\") || full.StartsWith(@"\\.\")) throw new FsFault("filesystem_invalid_path");
168
+ if (full.StartsWith(@"\\")) return @"\??\UNC\" + full.Substring(2);
169
+ if (full.Length < 3 || full[1] != ':' || full[2] != '\\') throw new FsFault("filesystem_invalid_path");
170
+ return @"\??\" + full;
171
+ }
172
+ static string FinalPath(SafeFileHandle handle) {
173
+ var value = new StringBuilder(32768);
174
+ uint length = GetFinalPathNameByHandle(handle, value, (uint)value.Capacity, 0);
175
+ Check(length != 0);
176
+ if (length >= value.Capacity) throw new FsFault("filesystem_invalid_path");
177
+ string path = value.ToString();
178
+ if (path.StartsWith(@"\\?\UNC\")) return @"\\" + path.Substring(8);
179
+ if (path.StartsWith(@"\\?\")) return path.Substring(4);
180
+ throw new FsFault("filesystem_path_changed");
181
+ }
182
+ static SafeFileHandle OpenRoot(Dictionary<string,object> request) {
183
+ string path = Path.GetFullPath(Text(request, "rootPath"));
184
+ SafeFileHandle root = OpenHandle(null, NativePath(path), true, 1, 0x80000000, 7);
185
+ try {
186
+ if (!String.Equals(FinalPath(root).TrimEnd('\\'), path.TrimEnd('\\'), StringComparison.OrdinalIgnoreCase))
187
+ throw new FsFault("filesystem_path_changed");
188
+ var expected = request["rootIdentity"] as Dictionary<string,object>;
189
+ if (expected == null || !MatchesIdentity(Identity(root), expected)) throw new FsFault("filesystem_path_changed");
190
+ return root;
191
+ } catch { root.Dispose(); throw; }
192
+ }
193
+ static string[] Components(Dictionary<string,object> request) {
194
+ string relative = Text(request, "relativePath");
195
+ if (relative == "") return new string[0];
196
+ string[] parts = relative.Split('/');
197
+ foreach (string part in parts) ValidateComponent(part);
198
+ return parts;
199
+ }
200
+ static void ValidateComponent(string name) {
201
+ if (name.Length == 0 || name == "." || name == "..") throw new FsFault("filesystem_invalid_path");
202
+ if (name.EndsWith(".") || name.EndsWith(" ")) throw new FsFault("filesystem_invalid_path");
203
+ foreach (char c in name) {
204
+ if (c < 32 || "\\/:*?\"<>|".IndexOf(c) >= 0) throw new FsFault("filesystem_invalid_path");
205
+ }
206
+ string stem = name.Split('.')[0].ToUpperInvariant();
207
+ if (stem == "CON" || stem == "PRN" || stem == "AUX" || stem == "NUL" ||
208
+ stem == "CONIN$" || stem == "CONOUT$") throw new FsFault("filesystem_invalid_path");
209
+ if (stem.Length == 4 && (stem.StartsWith("COM") || stem.StartsWith("LPT")) &&
210
+ "123456789\u00b9\u00b2\u00b3".IndexOf(stem[3]) >= 0) throw new FsFault("filesystem_invalid_path");
211
+ }
212
+ sealed class DirectoryChain : IDisposable {
213
+ public readonly SafeFileHandle Root;
214
+ readonly List<SafeFileHandle> children = new List<SafeFileHandle>();
215
+ public SafeFileHandle Current { get { return children.Count == 0 ? Root : children[children.Count-1]; } }
216
+ public DirectoryChain(Dictionary<string,object> request) { Root = OpenRoot(request); }
217
+ public void Walk(string[] parts, int count, bool create) {
218
+ for (int i=0;i<count;i++) children.Add(OpenHandle(Current, parts[i], true, create ? 3u : 1u, 0x80000000, 7));
219
+ }
220
+ public void Dispose() { for (int i=children.Count-1;i>=0;i--) children[i].Dispose(); Root.Dispose(); }
221
+ }
222
+ static ulong FileId(FileInfo info) {
223
+ ulong id=((ulong)info.IndexHigh << 32) | info.IndexLow;
224
+ if (id == 0) throw new FsFault("filesystem_safe_io_unsupported");
225
+ return id;
226
+ }
227
+ static Dictionary<string,object> Identity(SafeFileHandle file) {
228
+ FileInfo info; Check(GetFileInformationByHandle(file, out info));
229
+ BasicInfo basic = Basic(file);
230
+ return Record("device", info.Volume.ToString(), "inode", FileId(info).ToString(),
231
+ "birthtimeNs", ((basic.Created - 116444736000000000L) * 100L).ToString());
232
+ }
233
+ static bool MatchesIdentity(Dictionary<string,object> left, Dictionary<string,object> right) {
234
+ foreach (string key in new [] {"device", "inode", "birthtimeNs"}) {
235
+ if (!right.ContainsKey(key) || !Object.Equals(left[key], right[key])) return false;
236
+ }
237
+ return true;
238
+ }
239
+ static Dictionary<string,object> Metadata(SafeFileHandle file) {
240
+ FileInfo info; Check(GetFileInformationByHandle(file, out info));
241
+ BasicInfo basic = Basic(file);
242
+ ulong size = ((ulong)info.SizeHigh << 32) | info.SizeLow;
243
+ if (size > 9007199254740991UL) throw new FsFault("file_too_large");
244
+ return Record("device", info.Volume.ToString(), "inode", FileId(info).ToString(),
245
+ "size", (long)size, "mode", (basic.Attributes & 1) != 0 ? 292 : 438,
246
+ "modifiedNs", ((basic.Modified - 116444736000000000L) * 100L).ToString(),
247
+ "changedNs", ((basic.Changed - 116444736000000000L) * 100L).ToString());
248
+ }
249
+ static bool SameMetadata(Dictionary<string,object> left, Dictionary<string,object> right) {
250
+ foreach (string key in new [] {"device", "inode", "size", "mode", "modifiedNs", "changedNs"}) {
251
+ if (!right.ContainsKey(key) || Convert.ToString(left[key]) != Convert.ToString(right[key])) return false;
252
+ }
253
+ return true;
254
+ }
255
+ }
256
+ `;
257
+ }
258
+ });
259
+
260
+ // src/shared/windows-file-io/read-bytes-script.ts
261
+ var WINDOWS_FILE_READ_BYTES;
262
+ var init_read_bytes_script = __esm({
263
+ "src/shared/windows-file-io/read-bytes-script.ts"() {
264
+ "use strict";
265
+ WINDOWS_FILE_READ_BYTES = String.raw`
266
+ public static partial class AbotFilesystem {
267
+ static byte[] ReadBytes(SafeFileHandle file, long position, int length) {
268
+ long actual; Check(SetFilePointerEx(file, position, out actual, 0));
269
+ if (actual != position) throw new FsFault("filesystem_read_incomplete");
270
+ var bytes = new byte[length];
271
+ int offset = 0;
272
+ while (offset < length) {
273
+ var chunk = new byte[Math.Min(65536, length-offset)];
274
+ uint read; Check(ReadFile(file, chunk, (uint)chunk.Length, out read, IntPtr.Zero));
275
+ if (read == 0 || read > chunk.Length) throw new FsFault("filesystem_read_incomplete");
276
+ Buffer.BlockCopy(chunk, 0, bytes, offset, (int)read);
277
+ offset += (int)read;
278
+ }
279
+ return bytes;
280
+ }
281
+ }
282
+ `;
283
+ }
284
+ });
285
+
286
+ // src/plugin-sdk/files-windows/read-script.ts
287
+ var BOUNDED_READ, WINDOWS_BOUNDED_READ_SOURCE;
288
+ var init_read_script = __esm({
289
+ "src/plugin-sdk/files-windows/read-script.ts"() {
290
+ "use strict";
291
+ init_native_script();
292
+ init_authority_script();
293
+ init_read_bytes_script();
294
+ BOUNDED_READ = String.raw`
295
+ public static partial class AbotFilesystem {
296
+ static object ReadBounded(Dictionary<string,object> request) {
297
+ long maximum;
298
+ if (!Int64.TryParse(Text(request, "maxBytes"), out maximum) || maximum < 0 ||
299
+ maximum > 9007199254740991L) throw new FsFault("filesystem_invalid_request");
300
+ string[] parts=Components(request);
301
+ if (parts.Length == 0) return Record("ok", false, "reason", "not_regular_file");
302
+ using (var chain=new DirectoryChain(request)) {
303
+ chain.Walk(parts, parts.Length-1, false);
304
+ using (var file=OpenHandle(chain.Current, parts[parts.Length-1], false, 1, 0x80000000, 1)) {
305
+ var expected=request["targetIdentity"] as Dictionary<string,object>;
306
+ if (expected == null || !MatchesIdentity(Identity(file), expected))
307
+ return Record("ok", false, "reason", "changed_during_read");
308
+ var before=Metadata(file);
309
+ long size=Convert.ToInt64(before["size"]);
310
+ // Both the byte array and the base64 JSON response must fit .NET strings.
311
+ if (size > maximum || size > (Int32.MaxValue-4096L)/4*3)
312
+ return Record("ok", false, "reason", "too_large", "byteCount", size);
313
+ var bytes=ReadBytes(file, 0, (int)size);
314
+ if (!SameMetadata(before, Metadata(file)))
315
+ return Record("ok", false, "reason", "changed_during_read");
316
+ return Record("ok", true, "bytes", Convert.ToBase64String(bytes), "byteCount", size);
317
+ }
318
+ }
319
+ }
320
+ public static string Run(string input) {
321
+ var json=new JavaScriptSerializer { MaxJsonLength=Int32.MaxValue };
322
+ try { return json.Serialize(ReadBounded(json.Deserialize<Dictionary<string,object>>(input))); }
323
+ catch (FsFault error) { return json.Serialize(Record("ok", false, "code", error.Code)); }
324
+ catch { return json.Serialize(Record("ok", false, "code", "filesystem_native_operation_failed")); }
325
+ }
326
+ }
327
+ `;
328
+ WINDOWS_BOUNDED_READ_SOURCE = [
329
+ WINDOWS_FILESYSTEM_NATIVE,
330
+ WINDOWS_FILESYSTEM_AUTHORITY,
331
+ WINDOWS_FILE_READ_BYTES,
332
+ BOUNDED_READ
333
+ ].join("\n");
334
+ }
335
+ });
336
+
337
+ // src/plugin-sdk/files-windows/result.ts
338
+ function windowsReadError(code) {
339
+ const error = new Error(
340
+ "The Windows safe file read failed (" + code + "). No fallback read was attempted."
341
+ );
342
+ return Object.assign(error, { code });
343
+ }
344
+ function windowsReadAbortError() {
345
+ const error = new Error("The file read was cancelled.");
346
+ error.name = "AbortError";
347
+ return error;
348
+ }
349
+ function hasByteCount(value) {
350
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
351
+ }
352
+ function decodeNativeFailure(code) {
353
+ switch (code) {
354
+ case "filesystem_windows_policy_blocked":
355
+ case "filesystem_windows_helper_unavailable":
356
+ case "filesystem_safe_io_unsupported":
357
+ return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
358
+ case "filesystem_path_changed":
359
+ case "filesystem_target_changed":
360
+ case "filesystem_read_changed":
361
+ case "filesystem_read_incomplete":
362
+ return Object.freeze({ ok: false, reason: "changed_during_read" });
363
+ case "file_too_large":
364
+ return Object.freeze({ ok: false, reason: "too_large" });
365
+ case "file_not_found":
366
+ throw windowsReadError("ENOENT");
367
+ case "filesystem_access_denied":
368
+ throw windowsReadError("EACCES");
369
+ default:
370
+ throw windowsReadError("EIO");
371
+ }
372
+ }
373
+ function decodeWindowsReadResult(raw, maxBytes) {
374
+ let value;
375
+ try {
376
+ value = JSON.parse(raw);
377
+ } catch {
378
+ throw windowsReadError("EIO");
379
+ }
380
+ if (value?.ok === false && typeof value.code === "string")
381
+ return decodeNativeFailure(value.code);
382
+ if (value?.ok === false && FAILURE_REASONS.has(value.reason)) {
383
+ if (value.byteCount !== void 0 && !hasByteCount(value.byteCount))
384
+ throw windowsReadError("EIO");
385
+ return Object.freeze({
386
+ ok: false,
387
+ reason: value.reason,
388
+ ...value.byteCount !== void 0 ? { byteCount: value.byteCount } : {}
389
+ });
390
+ }
391
+ if (value?.ok !== true || !hasByteCount(value.byteCount))
392
+ throw windowsReadError("EIO");
393
+ if (value.byteCount > maxBytes || typeof value.bytes !== "string")
394
+ throw windowsReadError("EIO");
395
+ if (value.bytes.length !== 4 * Math.ceil(value.byteCount / 3))
396
+ throw windowsReadError("EIO");
397
+ const bytes = Buffer.from(value.bytes, "base64");
398
+ if (bytes.length !== value.byteCount || bytes.toString("base64") !== value.bytes)
399
+ throw windowsReadError("EIO");
400
+ return Object.freeze({ ok: true, bytes, byteCount: value.byteCount });
401
+ }
402
+ var FAILURE_REASONS;
403
+ var init_result = __esm({
404
+ "src/plugin-sdk/files-windows/result.ts"() {
405
+ "use strict";
406
+ FAILURE_REASONS = /* @__PURE__ */ new Set([
407
+ "not_regular_file",
408
+ "too_large",
409
+ "changed_during_read",
410
+ "outside_root",
411
+ "safe_open_unsupported"
412
+ ]);
413
+ }
414
+ });
415
+
416
+ // src/plugin-sdk/files-windows/process.ts
417
+ async function runWindowsBoundedRead(request, maxBytes, signal, spawnProcess = import_node_child_process.spawn) {
418
+ if (signal?.aborted) throw windowsReadAbortError();
419
+ const input = JSON.stringify({
420
+ source: WINDOWS_BOUNDED_READ_SOURCE,
421
+ request: JSON.stringify(request)
422
+ });
423
+ if (Buffer.byteLength(input) > 2 * 1024 * 1024)
424
+ throw windowsReadError("EINVAL");
425
+ const outputLimit = 4 * Math.ceil(Math.min(maxBytes, 2147483647) / 3) + 4096;
426
+ const executable = (0, import_node_path.join)(
427
+ process.env.SystemRoot ?? "C:\\Windows",
428
+ "System32",
429
+ "WindowsPowerShell",
430
+ "v1.0",
431
+ "powershell.exe"
432
+ );
433
+ return new Promise((resolve, reject) => {
434
+ const child = spawnProcess(
435
+ executable,
436
+ ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", BOOTSTRAP],
437
+ { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] }
438
+ );
439
+ const chunks = [];
440
+ let byteCount = 0;
441
+ let failure;
442
+ let unavailable = false;
443
+ const stop = (error) => {
444
+ failure ??= error;
445
+ child.kill("SIGKILL");
446
+ };
447
+ const abort = () => stop(windowsReadAbortError());
448
+ const timer = setTimeout(() => stop(windowsReadError("ETIMEDOUT")), 15e3);
449
+ timer.unref();
450
+ signal?.addEventListener("abort", abort, { once: true });
451
+ child.stdout.on("data", (chunk) => {
452
+ if (failure) return;
453
+ byteCount += chunk.length;
454
+ if (byteCount > outputLimit) {
455
+ stop(windowsReadError("EOVERFLOW"));
456
+ return;
457
+ }
458
+ chunks.push(chunk);
459
+ });
460
+ child.stderr.resume();
461
+ child.stdin.on("error", () => {
462
+ if (child.pid === void 0) return;
463
+ stop(windowsReadError("EIO"));
464
+ });
465
+ child.once("error", () => {
466
+ if (child.pid === void 0) {
467
+ unavailable = true;
468
+ return;
469
+ }
470
+ stop(windowsReadError("EIO"));
471
+ });
472
+ child.once("close", (code) => {
473
+ clearTimeout(timer);
474
+ signal?.removeEventListener("abort", abort);
475
+ if (failure) {
476
+ reject(failure);
477
+ return;
478
+ }
479
+ if (unavailable) {
480
+ resolve(UNAVAILABLE);
481
+ return;
482
+ }
483
+ if (code !== 0) {
484
+ reject(windowsReadError("EIO"));
485
+ return;
486
+ }
487
+ resolve(Buffer.concat(chunks).toString("utf8"));
488
+ });
489
+ if (signal?.aborted) {
490
+ abort();
491
+ return;
492
+ }
493
+ child.stdin.end(input, "utf8");
494
+ });
495
+ }
496
+ var import_node_child_process, import_node_path, BOOTSTRAP, UNAVAILABLE;
497
+ var init_process = __esm({
498
+ "src/plugin-sdk/files-windows/process.ts"() {
499
+ "use strict";
500
+ import_node_child_process = require("node:child_process");
501
+ import_node_path = require("node:path");
502
+ init_read_script();
503
+ init_result();
504
+ BOOTSTRAP = [
505
+ "$ErrorActionPreference='Stop'",
506
+ `if ($ExecutionContext.SessionState.LanguageMode -ne 'FullLanguage') { Write-Output '{"ok":false,"code":"filesystem_windows_policy_blocked"}'; exit 0 }`,
507
+ "$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
508
+ "[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
509
+ "[Console]::OutputEncoding=[Text.UTF8Encoding]::new($false)",
510
+ "$started=$false",
511
+ "try {",
512
+ "$envelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
513
+ "Add-Type -ReferencedAssemblies @('System.Web.Extensions') -TypeDefinition $envelope.source",
514
+ "$started=$true",
515
+ "[Console]::Write([AbotFilesystem]::Run($envelope.request))",
516
+ `} catch { if ($started) { [Console]::Write('{"ok":false,"code":"filesystem_native_operation_failed"}') } else { [Console]::Write('{"ok":false,"code":"filesystem_windows_helper_unavailable"}') } }`
517
+ ].join(";");
518
+ UNAVAILABLE = '{"ok":false,"code":"filesystem_windows_helper_unavailable"}';
519
+ }
520
+ });
521
+
522
+ // src/plugin-sdk/files-windows/read.ts
523
+ var read_exports = {};
524
+ __export(read_exports, {
525
+ readWindowsBoundedRegularFile: () => readWindowsBoundedRegularFile
526
+ });
527
+ function isOutsideRoot(rootRelative) {
528
+ if (import_node_path2.win32.isAbsolute(rootRelative)) return true;
529
+ if (rootRelative === "..") return true;
530
+ return rootRelative.startsWith("..\\");
531
+ }
532
+ function identity(stats) {
533
+ return {
534
+ device: String(stats.dev),
535
+ inode: String(stats.ino),
536
+ birthtimeNs: String(stats.birthtimeNs)
537
+ };
538
+ }
539
+ async function readWindowsBoundedRegularFile(absolutePath, options) {
540
+ const relativePath = import_node_path2.win32.relative(options.rootPath, absolutePath);
541
+ if (isOutsideRoot(relativePath)) return Object.freeze({ ok: false, reason: "outside_root" });
542
+ if (relativePath === "") return Object.freeze({ ok: false, reason: "not_regular_file" });
543
+ let root;
544
+ try {
545
+ const canonicalRoot = await (0, import_promises.realpath)(options.rootPath);
546
+ root = await (0, import_promises.open)(canonicalRoot, "r");
547
+ const rootStats = await root.stat({ bigint: true });
548
+ if (!rootStats.isDirectory() || rootStats.ino <= 0n)
549
+ return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
550
+ const targetPath = import_node_path2.win32.resolve(canonicalRoot, relativePath);
551
+ const target = await (0, import_promises.lstat)(targetPath, { bigint: true });
552
+ if (!target.isFile()) return Object.freeze({ ok: false, reason: "not_regular_file" });
553
+ const canonicalTarget = await (0, import_promises.realpath)(targetPath);
554
+ if (isOutsideRoot(import_node_path2.win32.relative(canonicalRoot, canonicalTarget)))
555
+ return Object.freeze({ ok: false, reason: "outside_root" });
556
+ if (options.signal?.aborted) throw windowsReadAbortError();
557
+ const raw = await runWindowsBoundedRead({
558
+ rootPath: canonicalRoot,
559
+ relativePath: relativePath.split(import_node_path2.win32.sep).join("/"),
560
+ rootIdentity: identity(rootStats),
561
+ targetIdentity: identity(target),
562
+ maxBytes: String(options.maxBytes)
563
+ }, options.maxBytes, options.signal);
564
+ if (options.signal?.aborted) throw windowsReadAbortError();
565
+ return decodeWindowsReadResult(raw, options.maxBytes);
566
+ } finally {
567
+ await root?.close();
568
+ }
569
+ }
570
+ var import_promises, import_node_path2;
571
+ var init_read = __esm({
572
+ "src/plugin-sdk/files-windows/read.ts"() {
573
+ "use strict";
574
+ import_promises = require("node:fs/promises");
575
+ import_node_path2 = require("node:path");
576
+ init_process();
577
+ init_result();
578
+ }
579
+ });
580
+
23
581
  // plugins/project-orientation/source/index.ts
24
582
  var index_exports = {};
25
583
  __export(index_exports, {
26
584
  default: () => index_default
27
585
  });
28
586
  module.exports = __toCommonJS(index_exports);
29
- var import_promises4 = require("node:fs/promises");
587
+ var import_promises5 = require("node:fs/promises");
30
588
 
31
589
  // src/plugin-sdk/bounds.ts
32
590
  function boundText(value, options) {
@@ -60,8 +618,8 @@ function sanitizeJsonText(value) {
60
618
 
61
619
  // src/plugin-sdk/files.ts
62
620
  var import_node_fs = require("node:fs");
63
- var import_promises = require("node:fs/promises");
64
- var import_node_path = require("node:path");
621
+ var import_promises2 = require("node:fs/promises");
622
+ var import_node_path3 = require("node:path");
65
623
  function throwIfAborted(signal) {
66
624
  if (!signal?.aborted) return;
67
625
  const error = new Error("The file read was cancelled.");
@@ -88,12 +646,16 @@ async function readBoundedRegularFile(absolutePath, options) {
88
646
  throw new RangeError("maxBytes must be a non-negative safe integer");
89
647
  }
90
648
  throwIfAborted(options.signal);
649
+ if (process.platform === "win32") {
650
+ const { readWindowsBoundedRegularFile: readWindowsBoundedRegularFile2 } = await Promise.resolve().then(() => (init_read(), read_exports));
651
+ return readWindowsBoundedRegularFile2(absolutePath, options);
652
+ }
91
653
  if (typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
92
654
  return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
93
655
  }
94
656
  let handle;
95
657
  try {
96
- handle = await (0, import_promises.open)(
658
+ handle = await (0, import_promises2.open)(
97
659
  absolutePath,
98
660
  import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_NOFOLLOW
99
661
  );
@@ -102,14 +664,14 @@ async function readBoundedRegularFile(absolutePath, options) {
102
664
  return Object.freeze({ ok: false, reason: "not_regular_file" });
103
665
  }
104
666
  const [canonicalRoot, canonicalTarget] = await Promise.all([
105
- (0, import_promises.realpath)(options.rootPath),
106
- (0, import_promises.realpath)(absolutePath)
667
+ (0, import_promises2.realpath)(options.rootPath),
668
+ (0, import_promises2.realpath)(absolutePath)
107
669
  ]);
108
- const rootRelative = (0, import_node_path.relative)(canonicalRoot, canonicalTarget);
109
- if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path.sep}`) || rootRelative.startsWith(import_node_path.sep)) {
670
+ const rootRelative = (0, import_node_path3.relative)(canonicalRoot, canonicalTarget);
671
+ if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path3.sep}`) || rootRelative.startsWith(import_node_path3.sep)) {
110
672
  return Object.freeze({ ok: false, reason: "outside_root" });
111
673
  }
112
- const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
674
+ const pathIdentity = await (0, import_promises2.stat)(canonicalTarget, { bigint: true });
113
675
  if (pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino || !pathIdentity.isFile()) {
114
676
  return Object.freeze({ ok: false, reason: "changed_during_read" });
115
677
  }
@@ -352,9 +914,60 @@ function failureFromError(error, options) {
352
914
  // src/capabilities/tool-media.ts
353
915
  var TOOL_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
354
916
 
917
+ // plugins/project-orientation/source/inspection-failure.ts
918
+ var ProjectInspectionError = class extends Error {
919
+ constructor(code, message) {
920
+ super(message);
921
+ this.code = code;
922
+ this.name = "ProjectInspectionError";
923
+ }
924
+ code;
925
+ };
926
+ function throwIfProjectInspectionCancelled(signal) {
927
+ signal?.throwIfAborted();
928
+ }
929
+ function isProjectInspectionCancelled(error, signal) {
930
+ if (signal?.aborted) return true;
931
+ if (!(error instanceof Error)) return false;
932
+ if (error.name === "AbortError") return true;
933
+ return "code" in error && error.code === "ABORT_ERR";
934
+ }
935
+ function failProjectManifestRead(file) {
936
+ if (file.reason === "safe_open_unsupported") {
937
+ throw new ProjectInspectionError(
938
+ "project_safe_read_unavailable",
939
+ "Safe project manifest reading is unavailable on this system. On Windows, computer policy may block the required PowerShell/C# helper. Do not retry or bypass this restriction with another tool; ask the user to check system requirements or contact their administrator."
940
+ );
941
+ }
942
+ if (file.reason === "outside_root") {
943
+ throw new ProjectInspectionError(
944
+ "project_outside_root",
945
+ "The project manifest resolves outside its authorized root. Do not retry this target or bypass the path restriction."
946
+ );
947
+ }
948
+ throw new Error("Project manifest changed while it was being read.");
949
+ }
950
+ function projectInspectionFailure(error, signal) {
951
+ if (isProjectInspectionCancelled(error, signal)) {
952
+ return failureResult({
953
+ errorCode: "project_inspection_cancelled",
954
+ message: "Project inspection was cancelled.",
955
+ interruption: "aborted"
956
+ });
957
+ }
958
+ if (error instanceof ProjectInspectionError) {
959
+ return failureResult({ errorCode: error.code, message: error.message });
960
+ }
961
+ return failureFromError(error, {
962
+ fallbackCode: "project_orientation_failed",
963
+ fallbackMessage: "Project orientation failed.",
964
+ operation: "inspect_project"
965
+ });
966
+ }
967
+
355
968
  // plugins/project-orientation/source/manifest-summary.ts
356
- var import_promises2 = require("node:fs/promises");
357
- var import_node_path2 = require("node:path");
969
+ var import_promises3 = require("node:fs/promises");
970
+ var import_node_path4 = require("node:path");
358
971
  var PACKAGE_JSON_MAX_BYTES = 256 * 1024;
359
972
  var PACKAGE_SCRIPT_LIMIT = 100;
360
973
  var MANIFEST_IDENTITY_MAX_CHARS = 256;
@@ -370,7 +983,7 @@ var KNOWN_MANIFESTS = Object.freeze([
370
983
  "vite.config.js"
371
984
  ]);
372
985
  function logicalChild(parent, name) {
373
- return parent.logicalPath === "." ? name : import_node_path2.posix.join(parent.logicalPath, name);
986
+ return parent.logicalPath === "." ? name : import_node_path4.posix.join(parent.logicalPath, name);
374
987
  }
375
988
  function stringField(record, key) {
376
989
  const value = record[key];
@@ -385,7 +998,7 @@ async function existingChild(context, root, name) {
385
998
  requirePath: true,
386
999
  allowedLocations: ["agent_work", "workspace"]
387
1000
  });
388
- const info = await (0, import_promises2.stat)(child.absolutePath);
1001
+ const info = await (0, import_promises3.stat)(child.absolutePath);
389
1002
  return info.isFile() ? child : void 0;
390
1003
  } catch (error) {
391
1004
  if (isRuntimeToolPathError(error)) throw error;
@@ -394,9 +1007,10 @@ async function existingChild(context, root, name) {
394
1007
  throw error;
395
1008
  }
396
1009
  }
397
- async function readProjectManifests(context, root) {
1010
+ async function readProjectManifests(context, root, signal) {
398
1011
  const summaries = [];
399
1012
  for (const name of KNOWN_MANIFESTS) {
1013
+ throwIfProjectInspectionCancelled(signal);
400
1014
  const target = await existingChild(context, root, name);
401
1015
  if (!target) continue;
402
1016
  if (name !== "package.json") {
@@ -405,7 +1019,8 @@ async function readProjectManifests(context, root) {
405
1019
  }
406
1020
  const file = await readBoundedRegularFile(target.absolutePath, {
407
1021
  maxBytes: PACKAGE_JSON_MAX_BYTES,
408
- rootPath: target.rootPath
1022
+ rootPath: target.rootPath,
1023
+ ...signal ? { signal } : {}
409
1024
  });
410
1025
  if (!file.ok && file.reason === "too_large") {
411
1026
  summaries.push(
@@ -413,8 +1028,7 @@ async function readProjectManifests(context, root) {
413
1028
  );
414
1029
  continue;
415
1030
  }
416
- if (!file.ok)
417
- throw new Error("Project manifest changed while it was being read.");
1031
+ if (!file.ok) failProjectManifestRead(file);
418
1032
  try {
419
1033
  const parsed = JSON.parse(file.bytes.toString("utf8"));
420
1034
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
@@ -452,13 +1066,13 @@ async function readProjectManifests(context, root) {
452
1066
  }
453
1067
 
454
1068
  // plugins/project-orientation/source/tree.ts
455
- var import_promises3 = require("node:fs/promises");
456
- var import_node_path3 = require("node:path");
1069
+ var import_promises4 = require("node:fs/promises");
1070
+ var import_node_path5 = require("node:path");
457
1071
  var IGNORED_NAMES = /* @__PURE__ */ new Set([".git", "node_modules", "dist", "coverage"]);
458
1072
  var DISPLAY_PATH_MAX_CHARS = 64;
459
1073
  function childLogicalPath(parent, childName) {
460
1074
  if (parent.logicalPath === ".") return childName;
461
- return import_node_path3.posix.join(parent.logicalPath, childName);
1075
+ return import_node_path5.posix.join(parent.logicalPath, childName);
462
1076
  }
463
1077
  function relativeDisplayPath(root, child) {
464
1078
  if (child.logicalPath === root.logicalPath) return ".";
@@ -478,7 +1092,7 @@ function boundedDisplayPath(path) {
478
1092
  truncated: true
479
1093
  });
480
1094
  }
481
- async function collectProjectTree(context, root, depth, maxEntries) {
1095
+ async function collectProjectTree(context, root, depth, maxEntries, signal) {
482
1096
  const directories = [];
483
1097
  const files = [];
484
1098
  let entries = 0;
@@ -486,11 +1100,13 @@ async function collectProjectTree(context, root, depth, maxEntries) {
486
1100
  let truncatedPathCount = 0;
487
1101
  const queue = [{ target: root, remainingDepth: depth }];
488
1102
  while (queue.length > 0 && entries < maxEntries) {
1103
+ throwIfProjectInspectionCancelled(signal);
489
1104
  const current = queue.shift();
490
1105
  if (!current) break;
491
1106
  const sampled = [];
492
- const directory = await (0, import_promises3.opendir)(current.target.absolutePath);
1107
+ const directory = await (0, import_promises4.opendir)(current.target.absolutePath);
493
1108
  for await (const entry of directory) {
1109
+ throwIfProjectInspectionCancelled(signal);
494
1110
  if (entry.isDirectory() && IGNORED_NAMES.has(entry.name)) continue;
495
1111
  if (entries + sampled.length >= maxEntries) {
496
1112
  truncated = true;
@@ -500,6 +1116,7 @@ async function collectProjectTree(context, root, depth, maxEntries) {
500
1116
  }
501
1117
  sampled.sort((left, right) => left.name.localeCompare(right.name));
502
1118
  for (const entry of sampled) {
1119
+ throwIfProjectInspectionCancelled(signal);
503
1120
  const child = resolvePluginPath(
504
1121
  context,
505
1122
  childLogicalPath(current.target, entry.name),
@@ -508,7 +1125,7 @@ async function collectProjectTree(context, root, depth, maxEntries) {
508
1125
  allowedLocations: ["agent_work", "workspace"]
509
1126
  }
510
1127
  );
511
- const info = await (0, import_promises3.stat)(child.absolutePath);
1128
+ const info = await (0, import_promises4.stat)(child.absolutePath);
512
1129
  const display = boundedDisplayPath(relativeDisplayPath(root, child));
513
1130
  if (display.truncated) truncatedPathCount += 1;
514
1131
  entries += 1;
@@ -564,13 +1181,15 @@ var index_default = defineRuntimePlugin((context) => {
564
1181
  ...context,
565
1182
  runtimePathResolver: executionContext?.runtimePathResolver ?? context.runtimePathResolver
566
1183
  };
1184
+ const signal = executionContext?.abortSignal;
567
1185
  try {
1186
+ throwIfProjectInspectionCancelled(signal);
568
1187
  const requestedPath = readOptionalString(params.path) ?? ".";
569
1188
  const target = resolvePluginPath(pathContext, requestedPath, {
570
1189
  defaultPath: ".",
571
1190
  allowedLocations: ["agent_work", "workspace"]
572
1191
  });
573
- const info = await (0, import_promises4.stat)(target.absolutePath);
1192
+ const info = await (0, import_promises5.stat)(target.absolutePath);
574
1193
  if (!info.isDirectory()) {
575
1194
  return failureResult({
576
1195
  errorCode: "project_target_not_directory",
@@ -590,9 +1209,10 @@ var index_default = defineRuntimePlugin((context) => {
590
1209
  name: "maxEntries"
591
1210
  });
592
1211
  const [tree, manifests] = await Promise.all([
593
- collectProjectTree(pathContext, target, depth, maxEntries),
594
- readProjectManifests(pathContext, target)
1212
+ collectProjectTree(pathContext, target, depth, maxEntries, signal),
1213
+ readProjectManifests(pathContext, target, signal)
595
1214
  ]);
1215
+ throwIfProjectInspectionCancelled(signal);
596
1216
  const packageManifest = manifests.find(
597
1217
  ({ file }) => file === "package.json"
598
1218
  );
@@ -629,11 +1249,7 @@ var index_default = defineRuntimePlugin((context) => {
629
1249
  }
630
1250
  });
631
1251
  } catch (error) {
632
- return failureFromError(error, {
633
- fallbackCode: "project_orientation_failed",
634
- fallbackMessage: "Project orientation failed.",
635
- operation: "inspect_project"
636
- });
1252
+ return projectInspectionFailure(error, signal);
637
1253
  }
638
1254
  }
639
1255
  }