@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
@@ -0,0 +1,42 @@
1
+ type MessagePhase = "commentary" | "final_answer";
2
+ type OutputDiagnostic = Readonly<{
3
+ itemId: string | null;
4
+ outputIndex: number | null;
5
+ arrivalOrder: number;
6
+ textByteCount: number;
7
+ phase?: MessagePhase;
8
+ }>;
9
+ export type OpenAIMessageOutputNormalizationDiagnostic = Readonly<{
10
+ outcome: "additional_message_outputs_ignored";
11
+ outputCount: number;
12
+ selectedOutput: OutputDiagnostic;
13
+ ignoredOutputCount: number;
14
+ sampledIgnoredOutputs: readonly OutputDiagnostic[];
15
+ omittedIgnoredOutputCount: number;
16
+ }>;
17
+ /** One invocation's structured result; never infer its phase from generated text. */
18
+ export declare class OpenAIStructuredMessageOutput {
19
+ private readonly outputs;
20
+ private readonly byItemId;
21
+ private readonly byOutputIndex;
22
+ private unidentifiedOutput;
23
+ private firstTextOutput;
24
+ private selectedOutput;
25
+ private hasExplicitPhase;
26
+ private nextOutputOrder;
27
+ private nextChunkSequence;
28
+ observeItem(event: Record<string, unknown>): string[];
29
+ observeResponse(value: unknown): string[];
30
+ consumeDelta(event: Record<string, unknown>, text: string): string[];
31
+ finish(): {
32
+ text: string[];
33
+ error?: string;
34
+ };
35
+ diagnostic(): OpenAIMessageOutputNormalizationDiagnostic | undefined;
36
+ private selectFinalOutput;
37
+ private takeSelectedText;
38
+ private mergeOutputs;
39
+ private reconcileOutputs;
40
+ private resolveOutput;
41
+ }
42
+ export {};
@@ -0,0 +1,175 @@
1
+ const IGNORED_OUTPUT_DIAGNOSTIC_LIMIT = 8;
2
+ function readRecord(value) {
3
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
4
+ return {};
5
+ }
6
+ return value;
7
+ }
8
+ function readMessagePhase(value) {
9
+ if (value === "commentary" || value === "final_answer")
10
+ return value;
11
+ return undefined;
12
+ }
13
+ function readOutputIndex(value) {
14
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
15
+ return null;
16
+ }
17
+ return value;
18
+ }
19
+ function takePendingText(output) {
20
+ const pending = output.pending;
21
+ output.pending = [];
22
+ return pending.map((chunk) => chunk.text);
23
+ }
24
+ function describeOutput(output) {
25
+ return {
26
+ itemId: output.itemId?.slice(0, 160) ?? null,
27
+ outputIndex: output.outputIndex,
28
+ arrivalOrder: output.arrivalOrder,
29
+ textByteCount: output.textByteCount,
30
+ ...(output.phase ? { phase: output.phase } : {}),
31
+ };
32
+ }
33
+ /** One invocation's structured result; never infer its phase from generated text. */
34
+ export class OpenAIStructuredMessageOutput {
35
+ outputs = [];
36
+ byItemId = new Map();
37
+ byOutputIndex = new Map();
38
+ unidentifiedOutput;
39
+ firstTextOutput;
40
+ selectedOutput;
41
+ hasExplicitPhase = false;
42
+ nextOutputOrder = 0;
43
+ nextChunkSequence = 0;
44
+ observeItem(event) {
45
+ const item = readRecord(event.item);
46
+ if (item.type !== "message")
47
+ return [];
48
+ const output = this.resolveOutput(item.id, event.output_index);
49
+ const phase = readMessagePhase(item.phase);
50
+ if (!phase)
51
+ return this.takeSelectedText(output);
52
+ this.hasExplicitPhase = true;
53
+ output.phase = phase;
54
+ if (phase === "commentary") {
55
+ output.pending = [];
56
+ return [];
57
+ }
58
+ this.selectFinalOutput(output);
59
+ return this.takeSelectedText(output);
60
+ }
61
+ observeResponse(value) {
62
+ const response = readRecord(value);
63
+ if (!Array.isArray(response.output))
64
+ return [];
65
+ return response.output.flatMap((item, outputIndex) => this.observeItem({ item, output_index: outputIndex }));
66
+ }
67
+ consumeDelta(event, text) {
68
+ const output = this.resolveOutput(event.item_id, event.output_index);
69
+ this.firstTextOutput ??= output;
70
+ output.textByteCount += Buffer.byteLength(text, "utf8");
71
+ if (output.phase === "commentary")
72
+ return [];
73
+ output.pending.push({ sequence: this.nextChunkSequence++, text });
74
+ return this.takeSelectedText(output);
75
+ }
76
+ finish() {
77
+ if (this.selectedOutput) {
78
+ return { text: takePendingText(this.selectedOutput) };
79
+ }
80
+ if (this.hasExplicitPhase) {
81
+ return { text: [], error: "openai structured response missing final_answer" };
82
+ }
83
+ // Older responses have no phase: retain the first text message, never join them.
84
+ this.selectedOutput = this.firstTextOutput;
85
+ return {
86
+ text: this.selectedOutput ? takePendingText(this.selectedOutput) : [],
87
+ };
88
+ }
89
+ diagnostic() {
90
+ if (!this.selectedOutput || this.outputs.length < 2)
91
+ return undefined;
92
+ const ignored = this.outputs.filter((output) => output !== this.selectedOutput);
93
+ return {
94
+ outcome: "additional_message_outputs_ignored",
95
+ outputCount: this.outputs.length,
96
+ selectedOutput: describeOutput(this.selectedOutput),
97
+ ignoredOutputCount: ignored.length,
98
+ sampledIgnoredOutputs: ignored.slice(0, IGNORED_OUTPUT_DIAGNOSTIC_LIMIT).map(describeOutput),
99
+ omittedIgnoredOutputCount: Math.max(0, ignored.length - IGNORED_OUTPUT_DIAGNOSTIC_LIMIT),
100
+ };
101
+ }
102
+ selectFinalOutput(output) {
103
+ if (this.selectedOutput)
104
+ return;
105
+ this.selectedOutput = output;
106
+ }
107
+ takeSelectedText(output) {
108
+ if (output !== this.selectedOutput)
109
+ return [];
110
+ // Keep partial identities buffered until both identifiers can join their chunks.
111
+ if (output.itemId === null)
112
+ return [];
113
+ if (output.outputIndex === null)
114
+ return [];
115
+ return takePendingText(output);
116
+ }
117
+ mergeOutputs(first, second) {
118
+ const [output, absorbed] = [first, second].sort((a, b) => a.arrivalOrder - b.arrivalOrder);
119
+ output.itemId ??= absorbed.itemId;
120
+ output.outputIndex ??= absorbed.outputIndex;
121
+ output.phase ??= absorbed.phase;
122
+ output.textByteCount += absorbed.textByteCount;
123
+ output.pending = [...output.pending, ...absorbed.pending]
124
+ .sort((a, b) => a.sequence - b.sequence);
125
+ this.outputs.splice(this.outputs.indexOf(absorbed), 1);
126
+ for (const [key, value] of this.byItemId) {
127
+ if (value === absorbed)
128
+ this.byItemId.set(key, output);
129
+ }
130
+ for (const [key, value] of this.byOutputIndex) {
131
+ if (value === absorbed)
132
+ this.byOutputIndex.set(key, output);
133
+ }
134
+ if (this.firstTextOutput === absorbed)
135
+ this.firstTextOutput = output;
136
+ if (this.selectedOutput === absorbed)
137
+ this.selectedOutput = output;
138
+ return output;
139
+ }
140
+ reconcileOutputs(itemOutput, indexedOutput) {
141
+ if (!itemOutput)
142
+ return indexedOutput;
143
+ if (!indexedOutput)
144
+ return itemOutput;
145
+ if (itemOutput === indexedOutput)
146
+ return itemOutput;
147
+ return this.mergeOutputs(itemOutput, indexedOutput);
148
+ }
149
+ resolveOutput(itemIdValue, outputIndexValue) {
150
+ const itemId = typeof itemIdValue === "string" && itemIdValue.length > 0
151
+ ? itemIdValue : null;
152
+ const outputIndex = readOutputIndex(outputIndexValue);
153
+ const itemOutput = itemId === null ? undefined : this.byItemId.get(itemId);
154
+ const indexedOutput = outputIndex === null ? undefined : this.byOutputIndex.get(outputIndex);
155
+ let output = this.reconcileOutputs(itemOutput, indexedOutput);
156
+ if (itemId === null && outputIndex === null)
157
+ output = this.unidentifiedOutput;
158
+ if (!output) {
159
+ output = { itemId, outputIndex, arrivalOrder: ++this.nextOutputOrder,
160
+ textByteCount: 0, pending: [] };
161
+ this.outputs.push(output);
162
+ }
163
+ if (itemId !== null) {
164
+ output.itemId = itemId;
165
+ this.byItemId.set(itemId, output);
166
+ }
167
+ if (outputIndex !== null) {
168
+ output.outputIndex = outputIndex;
169
+ this.byOutputIndex.set(outputIndex, output);
170
+ }
171
+ if (itemId === null && outputIndex === null)
172
+ this.unidentifiedOutput = output;
173
+ return output;
174
+ }
175
+ }
@@ -1,5 +1,6 @@
1
1
  import { resolveModelInvocation } from "../policy/invocation-policy.js";
2
2
  import { respondToGatewayHandlerError } from "./errors.js";
3
+ import { writeChatStreamResponse } from "./chat-stream-response.js";
3
4
  import { sendText } from "./http-response.js";
4
5
  import { applyConfiguredModelPolicy, emitResolvedModelInvocation, validateImageInvocationSupport, validateMessageInteractionRequest, } from "./invocation-validation.js";
5
6
  import { createContextGuardedProviderFetch } from "./provider-fetch.js";
@@ -62,14 +63,11 @@ export function createChatHandler(options = {}, inputTokenMeasurements) {
62
63
  if (result.kind !== "chat") {
63
64
  throw new Error("model_provider_adapter_chat_result_invalid");
64
65
  }
65
- response.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
66
- response.setHeader("Cache-Control", "no-cache");
67
- await result.stream({
68
- emit(event) {
69
- response.write(`${JSON.stringify(event)}\n`);
70
- },
66
+ await writeChatStreamResponse({
67
+ invocation: result,
68
+ response,
69
+ abortSignal,
71
70
  });
72
- response.end();
73
71
  }
74
72
  catch (error) {
75
73
  respondToGatewayHandlerError({
@@ -0,0 +1,7 @@
1
+ import type { ModelProviderChatInvocation } from "../providers/contracts.js";
2
+ import type { GatewayResponse } from "./contracts.js";
3
+ export declare function writeChatStreamResponse(params: {
4
+ invocation: ModelProviderChatInvocation;
5
+ response: GatewayResponse;
6
+ abortSignal: AbortSignal;
7
+ }): Promise<void>;
@@ -0,0 +1,25 @@
1
+ export async function writeChatStreamResponse(params) {
2
+ const { invocation, response, abortSignal } = params;
3
+ let hasEmittedEvent = false;
4
+ response.setHeader("Content-Type", "application/x-ndjson; charset=utf-8");
5
+ response.setHeader("Cache-Control", "no-cache");
6
+ try {
7
+ await invocation.stream({
8
+ emit(event) {
9
+ response.write(`${JSON.stringify(event)}\n`);
10
+ hasEmittedEvent = true;
11
+ },
12
+ });
13
+ }
14
+ catch (error) {
15
+ if (abortSignal.aborted)
16
+ return;
17
+ // Before the first write, the handler can still send its normal HTTP error.
18
+ if (!hasEmittedEvent)
19
+ throw error;
20
+ console.error(error);
21
+ response.end(`${JSON.stringify({ type: "error", error: "server error" })}\n`);
22
+ return;
23
+ }
24
+ response.end();
25
+ }
@@ -1,7 +1,11 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { recoverRuntimeSetupEdit } from "../web-ui/local-runtime/runtime-setup-edit-recovery.js";
1
3
  import { createModelGatewayServer, resolveModelGatewayPort, } from "./server/index.js";
2
4
  export * from "./server/index.js";
3
5
  export { buildOllamaPayload, buildOllamaRawPayload, resolveFormat, } from "./providers/ollama.js";
4
- if (import.meta.url === `file://${process.argv[1]}`) {
6
+ const invokedPath = process.argv[1] ? pathToFileURL(process.argv[1]).href : "";
7
+ if (import.meta.url === invokedPath) {
8
+ await recoverRuntimeSetupEdit(process.cwd());
5
9
  const port = resolveModelGatewayPort();
6
10
  createModelGatewayServer().listen(port, () => {
7
11
  console.log(`MODEL GATEWAY RUNNING ${port}`);
@@ -1,2 +1,3 @@
1
1
  export type * from "./entrypoint.js";
2
2
  export * from "./manifest.js";
3
+ export * from "./platform-compatibility.js";
@@ -1 +1,2 @@
1
1
  export * from "./manifest.js";
2
+ export * from "./platform-compatibility.js";
@@ -1,4 +1,5 @@
1
1
  import type { ToolCatalogGroup, ToolDevelopmentRole, ToolEventPresentation, ToolNormalInvocationApproval, ToolNormalInvocationAttachmentInput, ToolNormalInvocationEffect, ToolNormalInvocationFixedValue, ToolNormalInvocationInput, ToolNormalInvocationPayload, ToolNormalInvocationOutputChannels, ToolPayloadChannelSpec, ToolRoutingCapability, ToolRuntimePathBinding } from "../capabilities/tool-types.js";
2
+ import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION, type PluginPlatformDeclaration } from "./platform-compatibility.js";
2
3
  export declare const AGENT_PLUGIN_MANIFEST_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
3
4
  export declare const ABOT_RUNTIME_EXTENSION = "ai.abot.runtime";
4
5
  export declare const ABOT_RUNTIME_EXTENSION_VERSION: 1;
@@ -48,6 +49,7 @@ export type AgentPluginManifest = Readonly<{
48
49
  description?: string;
49
50
  extensions: Readonly<{
50
51
  [ABOT_RUNTIME_EXTENSION]: AbotRuntimePluginExtension;
52
+ [ABOT_PLUGIN_COMPATIBILITY_EXTENSION]?: PluginPlatformDeclaration;
51
53
  [namespace: string]: unknown;
52
54
  }>;
53
55
  }>;
@@ -1,3 +1,4 @@
1
+ import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION, } from "./platform-compatibility.js";
1
2
  export const AGENT_PLUGIN_MANIFEST_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
2
3
  export const ABOT_RUNTIME_EXTENSION = "ai.abot.runtime";
3
4
  export const ABOT_RUNTIME_EXTENSION_VERSION = 1;
@@ -0,0 +1,16 @@
1
+ export declare const ABOT_PLUGIN_COMPATIBILITY_EXTENSION = "ai.abot.compatibility";
2
+ export declare const ABOT_PLUGIN_COMPATIBILITY_VERSION: 1;
3
+ export declare const PLUGIN_RUNTIME_PLATFORMS: readonly ["linux", "darwin", "win32"];
4
+ export type PluginRuntimePlatform = (typeof PLUGIN_RUNTIME_PLATFORMS)[number];
5
+ /** The OS running Runtime, independent of a connected computer's OS. */
6
+ export type PluginPlatformDeclaration = Readonly<{
7
+ version: typeof ABOT_PLUGIN_COMPATIBILITY_VERSION;
8
+ runtimePlatforms: readonly PluginRuntimePlatform[];
9
+ }>;
10
+ export type PluginPlatformCompatibility = Readonly<{
11
+ supported: boolean;
12
+ status: "declared" | "legacy" | "unsupported" | "undeclared";
13
+ runtimePlatform: NodeJS.Platform;
14
+ runtimePlatforms?: readonly PluginRuntimePlatform[];
15
+ reason?: string;
16
+ }>;
@@ -0,0 +1,3 @@
1
+ export const ABOT_PLUGIN_COMPATIBILITY_EXTENSION = "ai.abot.compatibility";
2
+ export const ABOT_PLUGIN_COMPATIBILITY_VERSION = 1;
3
+ export const PLUGIN_RUNTIME_PLATFORMS = ["linux", "darwin", "win32"];
@@ -1,4 +1,5 @@
1
1
  /** Shared computer access. Import this subpath only when your plugin uses the host. */
2
+ export { HOST_SECRET_PROTECTION_CAPABILITY } from "../computer-access/companion/secret-protection-protocol.js";
2
3
  export { executeHostOperation, readHostStatus, } from "../computer-access/companion/broker-client.js";
3
4
  export { HOST_OPERATIONS, type HostIdentity, type HostOperation, type HostStatus, isHostIdentifier, isHostIdentity, isHostOperation, } from "../computer-access/companion/protocol.js";
4
5
  export { computerFields, computerInputError, computerRecord, computerText, readNativeComputerAction, readPhysicalRectangle, } from "../computer-access/computer/action-input.js";
@@ -19,3 +20,6 @@ export type { SystemProcessResult } from "../computer-access/contracts.js";
19
20
  export { createSystemOutputCapture, type SystemOutputReceipt } from "../computer-access/command-output-capture.js";
20
21
  export { DEFAULT_SYSTEM_OUTPUT_RETENTION_MS, scheduleSystemOutputCleanup } from "../computer-access/command-output-retention.js";
21
22
  export { SYSTEM_OUTPUT_CAPABILITY, SYSTEM_OUTPUT_CHUNK_BYTES, readSystemOutputTransfer } from "../computer-access/companion/command-output-protocol.js";
23
+ export type { SystemResultProtection } from "../computer-access/system-result-protection.js";
24
+ export type { SystemApplication } from "../computer-access/contracts.js";
25
+ export type { SystemApplicationCatalog, SystemApplicationCatalogScope } from "../computer-access/application-catalog.js";
@@ -1,4 +1,5 @@
1
1
  /** Shared computer access. Import this subpath only when your plugin uses the host. */
2
+ export { HOST_SECRET_PROTECTION_CAPABILITY } from "../computer-access/companion/secret-protection-protocol.js";
2
3
  export { executeHostOperation, readHostStatus, } from "../computer-access/companion/broker-client.js";
3
4
  export { HOST_OPERATIONS, isHostIdentifier, isHostIdentity, isHostOperation, } from "../computer-access/companion/protocol.js";
4
5
  export { computerFields, computerInputError, computerRecord, computerText, readNativeComputerAction, readPhysicalRectangle, } from "../computer-access/computer/action-input.js";
@@ -0,0 +1,3 @@
1
+ import { spawn } from "node:child_process";
2
+ /** Read-only helper. Never alters execution policy, retries, or reads through a fallback. */
3
+ export declare function runWindowsBoundedRead(request: Readonly<Record<string, unknown>>, maxBytes: number, signal?: AbortSignal, spawnProcess?: typeof spawn): Promise<string>;
@@ -0,0 +1,93 @@
1
+ import { spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { WINDOWS_BOUNDED_READ_SOURCE } from "./read-script.js";
4
+ import { windowsReadAbortError, windowsReadError } from "./result.js";
5
+ const BOOTSTRAP = [
6
+ "$ErrorActionPreference='Stop'",
7
+ 'if ($ExecutionContext.SessionState.LanguageMode -ne \'FullLanguage\') { Write-Output \'{"ok":false,"code":"filesystem_windows_policy_blocked"}\'; exit 0 }',
8
+ "$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
9
+ "[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
10
+ "[Console]::OutputEncoding=[Text.UTF8Encoding]::new($false)",
11
+ "$started=$false",
12
+ "try {",
13
+ "$envelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
14
+ "Add-Type -ReferencedAssemblies @('System.Web.Extensions') -TypeDefinition $envelope.source",
15
+ "$started=$true",
16
+ "[Console]::Write([AbotFilesystem]::Run($envelope.request))",
17
+ '} catch { if ($started) { [Console]::Write(\'{"ok":false,"code":"filesystem_native_operation_failed"}\') } else { [Console]::Write(\'{"ok":false,"code":"filesystem_windows_helper_unavailable"}\') } }',
18
+ ].join(";");
19
+ const UNAVAILABLE = '{"ok":false,"code":"filesystem_windows_helper_unavailable"}';
20
+ /** Read-only helper. Never alters execution policy, retries, or reads through a fallback. */
21
+ export async function runWindowsBoundedRead(request, maxBytes, signal, spawnProcess = spawn) {
22
+ if (signal?.aborted)
23
+ throw windowsReadAbortError();
24
+ const input = JSON.stringify({
25
+ source: WINDOWS_BOUNDED_READ_SOURCE,
26
+ request: JSON.stringify(request),
27
+ });
28
+ if (Buffer.byteLength(input) > 2 * 1024 * 1024)
29
+ throw windowsReadError("EINVAL");
30
+ const outputLimit = 4 * Math.ceil(Math.min(maxBytes, 2_147_483_647) / 3) + 4096;
31
+ const executable = join(process.env.SystemRoot ?? "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
32
+ return new Promise((resolve, reject) => {
33
+ const child = spawnProcess(executable, ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", BOOTSTRAP], { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] });
34
+ const chunks = [];
35
+ let byteCount = 0;
36
+ let failure;
37
+ let unavailable = false;
38
+ const stop = (error) => {
39
+ failure ??= error;
40
+ child.kill("SIGKILL");
41
+ };
42
+ const abort = () => stop(windowsReadAbortError());
43
+ const timer = setTimeout(() => stop(windowsReadError("ETIMEDOUT")), 15_000);
44
+ timer.unref();
45
+ signal?.addEventListener("abort", abort, { once: true });
46
+ child.stdout.on("data", (chunk) => {
47
+ if (failure)
48
+ return;
49
+ byteCount += chunk.length;
50
+ if (byteCount > outputLimit) {
51
+ stop(windowsReadError("EOVERFLOW"));
52
+ return;
53
+ }
54
+ chunks.push(chunk);
55
+ });
56
+ // Compiler/native diagnostics may contain private paths. Never expose them.
57
+ child.stderr.resume();
58
+ child.stdin.on("error", () => {
59
+ if (child.pid === undefined)
60
+ return;
61
+ stop(windowsReadError("EIO"));
62
+ });
63
+ child.once("error", () => {
64
+ if (child.pid === undefined) {
65
+ unavailable = true;
66
+ return;
67
+ }
68
+ stop(windowsReadError("EIO"));
69
+ });
70
+ child.once("close", (code) => {
71
+ clearTimeout(timer);
72
+ signal?.removeEventListener("abort", abort);
73
+ if (failure) {
74
+ reject(failure);
75
+ return;
76
+ }
77
+ if (unavailable) {
78
+ resolve(UNAVAILABLE);
79
+ return;
80
+ }
81
+ if (code !== 0) {
82
+ reject(windowsReadError("EIO"));
83
+ return;
84
+ }
85
+ resolve(Buffer.concat(chunks).toString("utf8"));
86
+ });
87
+ if (signal?.aborted) {
88
+ abort();
89
+ return;
90
+ }
91
+ child.stdin.end(input, "utf8");
92
+ });
93
+ }
@@ -0,0 +1 @@
1
+ export declare const WINDOWS_BOUNDED_READ_SOURCE: string;
@@ -0,0 +1,43 @@
1
+ import { WINDOWS_FILESYSTEM_NATIVE } from "../../shared/windows-file-io/native-script.js";
2
+ import { WINDOWS_FILESYSTEM_AUTHORITY } from "../../shared/windows-file-io/authority-script.js";
3
+ import { WINDOWS_FILE_READ_BYTES } from "../../shared/windows-file-io/read-bytes-script.js";
4
+ const BOUNDED_READ = String.raw `
5
+ public static partial class AbotFilesystem {
6
+ static object ReadBounded(Dictionary<string,object> request) {
7
+ long maximum;
8
+ if (!Int64.TryParse(Text(request, "maxBytes"), out maximum) || maximum < 0 ||
9
+ maximum > 9007199254740991L) throw new FsFault("filesystem_invalid_request");
10
+ string[] parts=Components(request);
11
+ if (parts.Length == 0) return Record("ok", false, "reason", "not_regular_file");
12
+ using (var chain=new DirectoryChain(request)) {
13
+ chain.Walk(parts, parts.Length-1, false);
14
+ using (var file=OpenHandle(chain.Current, parts[parts.Length-1], false, 1, 0x80000000, 1)) {
15
+ var expected=request["targetIdentity"] as Dictionary<string,object>;
16
+ if (expected == null || !MatchesIdentity(Identity(file), expected))
17
+ return Record("ok", false, "reason", "changed_during_read");
18
+ var before=Metadata(file);
19
+ long size=Convert.ToInt64(before["size"]);
20
+ // Both the byte array and the base64 JSON response must fit .NET strings.
21
+ if (size > maximum || size > (Int32.MaxValue-4096L)/4*3)
22
+ return Record("ok", false, "reason", "too_large", "byteCount", size);
23
+ var bytes=ReadBytes(file, 0, (int)size);
24
+ if (!SameMetadata(before, Metadata(file)))
25
+ return Record("ok", false, "reason", "changed_during_read");
26
+ return Record("ok", true, "bytes", Convert.ToBase64String(bytes), "byteCount", size);
27
+ }
28
+ }
29
+ }
30
+ public static string Run(string input) {
31
+ var json=new JavaScriptSerializer { MaxJsonLength=Int32.MaxValue };
32
+ try { return json.Serialize(ReadBounded(json.Deserialize<Dictionary<string,object>>(input))); }
33
+ catch (FsFault error) { return json.Serialize(Record("ok", false, "code", error.Code)); }
34
+ catch { return json.Serialize(Record("ok", false, "code", "filesystem_native_operation_failed")); }
35
+ }
36
+ }
37
+ `;
38
+ export const WINDOWS_BOUNDED_READ_SOURCE = [
39
+ WINDOWS_FILESYSTEM_NATIVE,
40
+ WINDOWS_FILESYSTEM_AUTHORITY,
41
+ WINDOWS_FILE_READ_BYTES,
42
+ BOUNDED_READ,
43
+ ].join("\n");
@@ -0,0 +1,6 @@
1
+ import type { BoundedRegularFileReadResult } from "../files.js";
2
+ export declare function readWindowsBoundedRegularFile(absolutePath: string, options: Readonly<{
3
+ maxBytes: number;
4
+ rootPath: string;
5
+ signal?: AbortSignal;
6
+ }>): Promise<BoundedRegularFileReadResult>;
@@ -0,0 +1,56 @@
1
+ import { lstat, open, realpath } from "node:fs/promises";
2
+ import { win32 } from "node:path";
3
+ import { runWindowsBoundedRead } from "./process.js";
4
+ import { decodeWindowsReadResult, windowsReadAbortError } from "./result.js";
5
+ function isOutsideRoot(rootRelative) {
6
+ if (win32.isAbsolute(rootRelative))
7
+ return true;
8
+ if (rootRelative === "..")
9
+ return true;
10
+ return rootRelative.startsWith("..\\");
11
+ }
12
+ function identity(stats) {
13
+ return {
14
+ device: String(stats.dev),
15
+ inode: String(stats.ino),
16
+ birthtimeNs: String(stats.birthtimeNs),
17
+ };
18
+ }
19
+ export async function readWindowsBoundedRegularFile(absolutePath, options) {
20
+ const relativePath = win32.relative(options.rootPath, absolutePath);
21
+ if (isOutsideRoot(relativePath))
22
+ return Object.freeze({ ok: false, reason: "outside_root" });
23
+ if (relativePath === "")
24
+ return Object.freeze({ ok: false, reason: "not_regular_file" });
25
+ let root;
26
+ try {
27
+ const canonicalRoot = await realpath(options.rootPath);
28
+ root = await open(canonicalRoot, "r");
29
+ const rootStats = await root.stat({ bigint: true });
30
+ if (!rootStats.isDirectory() || rootStats.ino <= 0n)
31
+ return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
32
+ // Metadata only: all content reads happen through the rooted native handles.
33
+ const targetPath = win32.resolve(canonicalRoot, relativePath);
34
+ const target = await lstat(targetPath, { bigint: true });
35
+ if (!target.isFile())
36
+ return Object.freeze({ ok: false, reason: "not_regular_file" });
37
+ const canonicalTarget = await realpath(targetPath);
38
+ if (isOutsideRoot(win32.relative(canonicalRoot, canonicalTarget)))
39
+ return Object.freeze({ ok: false, reason: "outside_root" });
40
+ if (options.signal?.aborted)
41
+ throw windowsReadAbortError();
42
+ const raw = await runWindowsBoundedRead({
43
+ rootPath: canonicalRoot,
44
+ relativePath: relativePath.split(win32.sep).join("/"),
45
+ rootIdentity: identity(rootStats),
46
+ targetIdentity: identity(target),
47
+ maxBytes: String(options.maxBytes),
48
+ }, options.maxBytes, options.signal);
49
+ if (options.signal?.aborted)
50
+ throw windowsReadAbortError();
51
+ return decodeWindowsReadResult(raw, options.maxBytes);
52
+ }
53
+ finally {
54
+ await root?.close();
55
+ }
56
+ }
@@ -0,0 +1,4 @@
1
+ import type { BoundedRegularFileReadResult } from "../files.js";
2
+ export declare function windowsReadError(code: string): Error;
3
+ export declare function windowsReadAbortError(): Error;
4
+ export declare function decodeWindowsReadResult(raw: string, maxBytes: number): BoundedRegularFileReadResult;
@@ -0,0 +1,67 @@
1
+ export function windowsReadError(code) {
2
+ const error = new Error("The Windows safe file read failed (" + code + "). No fallback read was attempted.");
3
+ return Object.assign(error, { code });
4
+ }
5
+ export function windowsReadAbortError() {
6
+ const error = new Error("The file read was cancelled.");
7
+ error.name = "AbortError";
8
+ return error;
9
+ }
10
+ const FAILURE_REASONS = new Set([
11
+ "not_regular_file",
12
+ "too_large",
13
+ "changed_during_read",
14
+ "outside_root",
15
+ "safe_open_unsupported",
16
+ ]);
17
+ function hasByteCount(value) {
18
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
19
+ }
20
+ function decodeNativeFailure(code) {
21
+ switch (code) {
22
+ case "filesystem_windows_policy_blocked":
23
+ case "filesystem_windows_helper_unavailable":
24
+ case "filesystem_safe_io_unsupported":
25
+ return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
26
+ case "filesystem_path_changed":
27
+ case "filesystem_target_changed":
28
+ case "filesystem_read_changed":
29
+ case "filesystem_read_incomplete":
30
+ return Object.freeze({ ok: false, reason: "changed_during_read" });
31
+ case "file_too_large":
32
+ return Object.freeze({ ok: false, reason: "too_large" });
33
+ case "file_not_found": throw windowsReadError("ENOENT");
34
+ case "filesystem_access_denied": throw windowsReadError("EACCES");
35
+ default: throw windowsReadError("EIO");
36
+ }
37
+ }
38
+ export function decodeWindowsReadResult(raw, maxBytes) {
39
+ let value;
40
+ try {
41
+ value = JSON.parse(raw);
42
+ }
43
+ catch {
44
+ throw windowsReadError("EIO");
45
+ }
46
+ if (value?.ok === false && typeof value.code === "string")
47
+ return decodeNativeFailure(value.code);
48
+ if (value?.ok === false && FAILURE_REASONS.has(value.reason)) {
49
+ if (value.byteCount !== undefined && !hasByteCount(value.byteCount))
50
+ throw windowsReadError("EIO");
51
+ return Object.freeze({
52
+ ok: false,
53
+ reason: value.reason,
54
+ ...(value.byteCount !== undefined ? { byteCount: value.byteCount } : {}),
55
+ });
56
+ }
57
+ if (value?.ok !== true || !hasByteCount(value.byteCount))
58
+ throw windowsReadError("EIO");
59
+ if (value.byteCount > maxBytes || typeof value.bytes !== "string")
60
+ throw windowsReadError("EIO");
61
+ if (value.bytes.length !== 4 * Math.ceil(value.byteCount / 3))
62
+ throw windowsReadError("EIO");
63
+ const bytes = Buffer.from(value.bytes, "base64");
64
+ if (bytes.length !== value.byteCount || bytes.toString("base64") !== value.bytes)
65
+ throw windowsReadError("EIO");
66
+ return Object.freeze({ ok: true, bytes, byteCount: value.byteCount });
67
+ }