@abot-ai/runtime 1.6.0 → 1.7.0

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 (380) hide show
  1. package/README.md +2 -0
  2. package/dist/src/bridge/request-steering.js +60 -15
  3. package/dist/src/capabilities/normal-invocation/contracts.d.ts +3 -0
  4. package/dist/src/capabilities/normal-invocation/output-channels.d.ts +10 -0
  5. package/dist/src/capabilities/normal-invocation/output-channels.js +29 -0
  6. package/dist/src/capabilities/normal-invocation/validator.js +4 -2
  7. package/dist/src/capabilities/tool-types.d.ts +1 -1
  8. package/dist/src/cli/host-companion-bundle.mjs +7570 -6781
  9. package/dist/src/cli/host-companion-entry.js +5 -22
  10. package/dist/src/cli/host-companion-input.d.ts +3 -0
  11. package/dist/src/cli/host-companion-input.js +21 -0
  12. package/dist/src/cli/host-companion-lifecycle.d.ts +11 -0
  13. package/dist/src/cli/host-companion-lifecycle.js +32 -0
  14. package/dist/src/cli/host-companion-setup-target.d.ts +4 -0
  15. package/dist/src/cli/host-companion-setup-target.js +17 -0
  16. package/dist/src/cli/host-companion-startup.d.ts +2 -0
  17. package/dist/src/cli/host-companion-startup.js +7 -2
  18. package/dist/src/cli/host-companion.d.ts +6 -0
  19. package/dist/src/cli/host-companion.js +30 -27
  20. package/dist/src/cli/windows-companion-store-entry.d.ts +9 -0
  21. package/dist/src/cli/windows-companion-store-entry.js +67 -0
  22. package/dist/src/computer-access/command-output-capture.d.ts +37 -0
  23. package/dist/src/computer-access/command-output-capture.js +136 -0
  24. package/dist/src/computer-access/command-output-retention.d.ts +5 -0
  25. package/dist/src/computer-access/command-output-retention.js +90 -0
  26. package/dist/src/computer-access/command-output.d.ts +7 -0
  27. package/dist/src/computer-access/command-output.js +1 -0
  28. package/dist/src/computer-access/commands.d.ts +1 -0
  29. package/dist/src/computer-access/commands.js +1 -1
  30. package/dist/src/computer-access/companion/command-output-protocol.d.ts +12 -0
  31. package/dist/src/computer-access/companion/command-output-protocol.js +28 -0
  32. package/dist/src/computer-access/companion/command-output.d.ts +13 -0
  33. package/dist/src/computer-access/companion/command-output.js +110 -0
  34. package/dist/src/computer-access/companion/install-link-macos.d.ts +7 -0
  35. package/dist/src/computer-access/companion/install-link-macos.js +48 -0
  36. package/dist/src/computer-access/companion/install-link-registration.d.ts +4 -0
  37. package/dist/src/computer-access/companion/install-link-registration.js +184 -0
  38. package/dist/src/computer-access/companion/install-link-windows.d.ts +4 -0
  39. package/dist/src/computer-access/companion/install-link-windows.js +65 -0
  40. package/dist/src/computer-access/companion/install-link.d.ts +9 -0
  41. package/dist/src/computer-access/companion/install-link.js +54 -0
  42. package/dist/src/computer-access/companion/native-messages.js +3 -0
  43. package/dist/src/computer-access/companion/native-session.d.ts +1 -0
  44. package/dist/src/computer-access/companion/native-session.js +14 -2
  45. package/dist/src/computer-access/companion/native-supervisor.js +1 -0
  46. package/dist/src/computer-access/companion/notification-windows.d.ts +1 -1
  47. package/dist/src/computer-access/companion/notification-windows.js +8 -3
  48. package/dist/src/computer-access/companion/protocol.d.ts +1 -1
  49. package/dist/src/computer-access/companion/protocol.js +6 -0
  50. package/dist/src/computer-access/companion/release-version.d.ts +1 -1
  51. package/dist/src/computer-access/companion/release-version.js +1 -1
  52. package/dist/src/computer-access/companion/windows-store/connection-error.d.ts +7 -0
  53. package/dist/src/computer-access/companion/windows-store/connection-error.js +19 -0
  54. package/dist/src/computer-access/companion/windows-store/connection-link.d.ts +13 -0
  55. package/dist/src/computer-access/companion/windows-store/connection-link.js +109 -0
  56. package/dist/src/computer-access/companion/windows-store/identity.d.ts +13 -0
  57. package/dist/src/computer-access/companion/windows-store/identity.js +13 -0
  58. package/dist/src/computer-access/companion/windows-store/lifecycle.d.ts +5 -0
  59. package/dist/src/computer-access/companion/windows-store/lifecycle.js +90 -0
  60. package/dist/src/computer-access/contracts.d.ts +1 -1
  61. package/dist/src/computer-access/handlers.d.ts +2 -1
  62. package/dist/src/computer-access/handlers.js +5 -1
  63. package/dist/src/computer-access/process-capture.d.ts +6 -0
  64. package/dist/src/computer-access/process-capture.js +1 -0
  65. package/dist/src/computer-access/process-result.d.ts +2 -0
  66. package/dist/src/computer-access/process-result.js +14 -6
  67. package/dist/src/computer-access/process-runner.d.ts +2 -1
  68. package/dist/src/computer-access/process-runner.js +21 -13
  69. package/dist/src/model-gateway/server/configuration.d.ts +2 -0
  70. package/dist/src/model-gateway/server/configuration.js +73 -21
  71. package/dist/src/plugin-contract/install-source.d.ts +13 -0
  72. package/dist/src/plugin-contract/install-source.js +99 -0
  73. package/dist/src/plugin-contract/manifest.d.ts +2 -1
  74. package/dist/src/plugin-sdk/computer-access.d.ts +8 -0
  75. package/dist/src/plugin-sdk/computer-access.js +5 -0
  76. package/dist/src/runtime/adapters/in-memory-session-store.js +6 -16
  77. package/dist/src/runtime/admin/config-control.js +2 -1
  78. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  79. package/dist/src/runtime/automations/catalog.js +1 -0
  80. package/dist/src/runtime/automations/model-dependency-projection.d.ts +2 -0
  81. package/dist/src/runtime/automations/service.d.ts +2 -0
  82. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.d.ts +10 -5
  83. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.js +8 -7
  84. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.d.ts +2 -2
  85. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.js +2 -2
  86. package/dist/src/runtime/capabilities/automation-builder/tool-contract.d.ts +2 -2
  87. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -1
  88. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +11 -5
  89. package/dist/src/runtime/capabilities/automations/tool-module.js +1 -1
  90. package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +3 -1
  91. package/dist/src/runtime/capabilities/request-permission-catalog.js +21 -2
  92. package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +2 -1
  93. package/dist/src/runtime/capabilities/request-permission-tool-registry.js +18 -10
  94. package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +2 -0
  95. package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +1 -1
  96. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +6 -0
  97. package/dist/src/runtime/config/builders.js +6 -5
  98. package/dist/src/runtime/config/effective-model-config-validation.js +4 -35
  99. package/dist/src/runtime/config/fields.js +15 -0
  100. package/dist/src/runtime/config/model-context-capacity.d.ts +20 -0
  101. package/dist/src/runtime/config/model-context-capacity.js +55 -0
  102. package/dist/src/runtime/config/model-execution-policy.d.ts +5 -1
  103. package/dist/src/runtime/config/model-execution-policy.js +16 -0
  104. package/dist/src/runtime/config/model-plugin-config.d.ts +8 -0
  105. package/dist/src/runtime/config/model-plugin-config.js +40 -0
  106. package/dist/src/runtime/config/schema.js +5 -1
  107. package/dist/src/runtime/config/validation/model-profile-validation.js +2 -0
  108. package/dist/src/runtime/config/validation/runtime-config-validation-contract.d.ts +3 -1
  109. package/dist/src/runtime/config/validation/runtime-config-validation-contract.js +3 -1
  110. package/dist/src/runtime/config/validation/runtime-root-section-validation.js +11 -4
  111. package/dist/src/runtime/config/validation/web-ui-config-validation.js +3 -2
  112. package/dist/src/runtime/config/web-ui.d.ts +5 -0
  113. package/dist/src/runtime/config/web-ui.js +5 -0
  114. package/dist/src/runtime/config.js +2 -0
  115. package/dist/src/runtime/local-application.d.ts +2 -0
  116. package/dist/src/runtime/local-host/app-owner.js +50 -6
  117. package/dist/src/runtime/local-host/app-request-control.d.ts +3 -1
  118. package/dist/src/runtime/local-host/app-request-control.js +91 -11
  119. package/dist/src/runtime/local-host/client-requests.js +32 -5
  120. package/dist/src/runtime/local-host/client-services.d.ts +2 -0
  121. package/dist/src/runtime/local-host/local-request-diagnostics.d.ts +9 -0
  122. package/dist/src/runtime/local-host/local-request-diagnostics.js +47 -0
  123. package/dist/src/runtime/local-host/saved-approvals.js +23 -2
  124. package/dist/src/runtime/model/model-selection.js +4 -1
  125. package/dist/src/runtime/observability/request-control-diagnostics.d.ts +6 -0
  126. package/dist/src/runtime/observability/request-control-diagnostics.js +52 -0
  127. package/dist/src/runtime/plugins/configuration-context.d.ts +9 -0
  128. package/dist/src/runtime/plugins/configuration-context.js +42 -0
  129. package/dist/src/runtime/plugins/configuration-settings.d.ts +2 -0
  130. package/dist/src/runtime/plugins/configuration-settings.js +26 -0
  131. package/dist/src/runtime/plugins/configuration-store.d.ts +23 -0
  132. package/dist/src/runtime/plugins/configuration-store.js +100 -0
  133. package/dist/src/runtime/plugins/configuration-write.d.ts +5 -0
  134. package/dist/src/runtime/plugins/configuration-write.js +58 -0
  135. package/dist/src/runtime/plugins/installation/archive.d.ts +2 -0
  136. package/dist/src/runtime/plugins/installation/archive.js +107 -0
  137. package/dist/src/runtime/plugins/installation/github-download.d.ts +9 -0
  138. package/dist/src/runtime/plugins/installation/github-download.js +72 -0
  139. package/dist/src/runtime/plugins/installation/installed-package.d.ts +9 -0
  140. package/dist/src/runtime/plugins/installation/installed-package.js +66 -0
  141. package/dist/src/runtime/plugins/installation/package.d.ts +45 -0
  142. package/dist/src/runtime/plugins/installation/package.js +79 -0
  143. package/dist/src/runtime/plugins/installation/portable-path.d.ts +2 -0
  144. package/dist/src/runtime/plugins/installation/portable-path.js +10 -0
  145. package/dist/src/runtime/plugins/installation/publication.d.ts +10 -0
  146. package/dist/src/runtime/plugins/installation/publication.js +17 -0
  147. package/dist/src/runtime/plugins/installation/service.d.ts +41 -0
  148. package/dist/src/runtime/plugins/installation/service.js +80 -0
  149. package/dist/src/runtime/plugins/loader.js +15 -29
  150. package/dist/src/runtime/plugins/manifest-projection.js +1 -0
  151. package/dist/src/runtime/plugins/manifest-validator.js +3 -0
  152. package/dist/src/runtime/plugins/module-cache.d.ts +2 -0
  153. package/dist/src/runtime/plugins/module-cache.js +19 -0
  154. package/dist/src/runtime/plugins/selection.d.ts +2 -0
  155. package/dist/src/runtime/plugins/selection.js +16 -11
  156. package/dist/src/runtime/ports.d.ts +6 -4
  157. package/dist/src/runtime/request/dependencies.d.ts +2 -1
  158. package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +1 -1
  159. package/dist/src/runtime/request/handler.js +8 -0
  160. package/dist/src/runtime/request/prepared-execution.js +6 -1
  161. package/dist/src/runtime/request/request-steering.d.ts +4 -0
  162. package/dist/src/runtime/request/request-steering.js +37 -12
  163. package/dist/src/runtime/request/worker-capability-composition.d.ts +2 -0
  164. package/dist/src/runtime/request/worker-capability-composition.js +4 -1
  165. package/dist/src/runtime/scheduler/journal-index-state.d.ts +1 -1
  166. package/dist/src/sessions/assistant-initiative-message.d.ts +3 -0
  167. package/dist/src/sessions/assistant-initiative-message.js +12 -0
  168. package/dist/src/sessions/assistant-initiative.d.ts +2 -2
  169. package/dist/src/sessions/assistant-initiative.js +1 -7
  170. package/dist/src/sessions/durable-session-commit.d.ts +2 -1
  171. package/dist/src/sessions/durable-session-commit.js +6 -1
  172. package/dist/src/sessions/metadata/projection.d.ts +15 -0
  173. package/dist/src/sessions/metadata/projection.js +55 -0
  174. package/dist/src/sessions/metadata/publication.d.ts +12 -0
  175. package/dist/src/sessions/metadata/publication.js +78 -0
  176. package/dist/src/sessions/metadata/source-receipt.d.ts +5 -0
  177. package/dist/src/sessions/metadata/source-receipt.js +42 -0
  178. package/dist/src/sessions/metadata/store.d.ts +7 -0
  179. package/dist/src/sessions/metadata/store.js +119 -0
  180. package/dist/src/sessions/record/projection.d.ts +3 -1
  181. package/dist/src/sessions/record/projection.js +26 -18
  182. package/dist/src/sessions/request-lifecycle/service.js +3 -3
  183. package/dist/src/sessions/session-service.d.ts +2 -4
  184. package/dist/src/sessions/session-service.js +4 -16
  185. package/dist/src/sessions/session-store.d.ts +2 -1
  186. package/dist/src/sessions/session-store.js +9 -3
  187. package/dist/src/sessions/snapshot.d.ts +17 -0
  188. package/dist/src/sessions/snapshot.js +105 -0
  189. package/dist/src/sessions/types.d.ts +2 -0
  190. package/dist/src/shared/tool-selection.d.ts +2 -0
  191. package/dist/src/shared/tool-selection.js +7 -0
  192. package/dist/src/web-ui/app/ARCHITECTURE.md +14 -0
  193. package/dist/src/web-ui/app/app.js +6 -3
  194. package/dist/src/web-ui/app/components/config-workspace/config-model.js +2 -0
  195. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +130 -0
  196. package/dist/src/web-ui/app/components/config-workspace/model-plugin-selection.js +180 -0
  197. package/dist/src/web-ui/app/components/config-workspace/model-plugin-view-state.js +114 -0
  198. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +3 -0
  199. package/dist/src/web-ui/app/components/config-workspace/model-summary.js +39 -0
  200. package/dist/src/web-ui/app/components/config-workspace/summary-rendering.js +30 -0
  201. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +37 -0
  202. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +2 -0
  203. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +9 -1
  204. package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +23 -67
  205. package/dist/src/web-ui/app/components/config-workspace.js +11 -2
  206. package/dist/src/web-ui/app/components/conversation-view.js +36 -5
  207. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +2 -1
  208. package/dist/src/web-ui/app/components/dashboard/workspace.js +2 -1
  209. package/dist/src/web-ui/app/components/operations-summary.js +105 -0
  210. package/dist/src/web-ui/app/components/passive-learning/home.js +1 -9
  211. package/dist/src/web-ui/app/components/plugins/configuration-draft.js +34 -0
  212. package/dist/src/web-ui/app/components/plugins/configuration-editor.js +147 -0
  213. package/dist/src/web-ui/app/components/plugins/configuration-fields.js +103 -0
  214. package/dist/src/web-ui/app/components/plugins/configuration-retained-secrets.js +20 -0
  215. package/dist/src/web-ui/app/components/plugins/configuration-settings.js +108 -0
  216. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +37 -0
  217. package/dist/src/web-ui/app/components/plugins/installation.js +212 -0
  218. package/dist/src/web-ui/app/components/plugins/manager.js +160 -6
  219. package/dist/src/web-ui/app/components/plugins/removal.js +130 -0
  220. package/dist/src/web-ui/app/components/plugins/rendering.js +14 -2
  221. package/dist/src/web-ui/app/components/plugins/summary.js +54 -0
  222. package/dist/src/web-ui/app/components/plugins/tabs.js +31 -0
  223. package/dist/src/web-ui/app/components/plugins/view-state.js +3 -1
  224. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +5 -2
  225. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +9 -1
  226. package/dist/src/web-ui/app/components/runtime-setup/context-window-feedback.js +71 -0
  227. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +2 -0
  228. package/dist/src/web-ui/app/components/runtime-setup-guide.js +15 -3
  229. package/dist/src/web-ui/app/components/spark-chat/empty-state.js +1 -0
  230. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -0
  231. package/dist/src/web-ui/app/components/system-host/connection-card.js +35 -0
  232. package/dist/src/web-ui/app/components/system-host/macos-setup.js +1 -1
  233. package/dist/src/web-ui/app/components/system-host/manager.js +45 -12
  234. package/dist/src/web-ui/app/components/system-host/rendering.js +111 -106
  235. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +293 -0
  236. package/dist/src/web-ui/app/components/workspace-shell.js +6 -0
  237. package/dist/src/web-ui/app/computer-access-feature.js +22 -5
  238. package/dist/src/web-ui/app/configuration-feature.js +35 -2
  239. package/dist/src/web-ui/app/controllers/app-event-bindings.js +4 -1
  240. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +1 -0
  241. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +7 -3
  242. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +88 -0
  243. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +9 -3
  244. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +52 -144
  245. package/dist/src/web-ui/app/controllers/history-pagination.js +111 -0
  246. package/dist/src/web-ui/app/controllers/operations-controller.d.ts +12 -0
  247. package/dist/src/web-ui/app/controllers/operations-controller.js +28 -21
  248. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.d.ts +1 -0
  249. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +11 -0
  250. package/dist/src/web-ui/app/controllers/session-controller.js +10 -2
  251. package/dist/src/web-ui/app/controllers/session-list-pagination.js +71 -0
  252. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +6 -4
  253. package/dist/src/web-ui/app/controllers/spark-chat-reading.js +1 -0
  254. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +24 -5
  255. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +21 -19
  256. package/dist/src/web-ui/app/dashboard-feature.js +2 -2
  257. package/dist/src/web-ui/app/index.html +6 -2
  258. package/dist/src/web-ui/app/lib/history-page-messages.js +49 -0
  259. package/dist/src/web-ui/app/lib/request-lifecycle-view.js +8 -0
  260. package/dist/src/web-ui/app/lib/workspace-route.d.ts +3 -0
  261. package/dist/src/web-ui/app/lib/workspace-route.js +4 -0
  262. package/dist/src/web-ui/app/passive-learning-feature.js +0 -1
  263. package/dist/src/web-ui/app/runtime-onboarding-feature.js +3 -0
  264. package/dist/src/web-ui/app/schedules-feature.js +1 -1
  265. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +20 -0
  266. package/dist/src/web-ui/app/services/runtime-web-client/plugin-configuration.js +19 -0
  267. package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.js +4 -4
  268. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  269. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +6 -1
  270. package/dist/src/web-ui/app/services/runtime-web-client.js +12 -3
  271. package/dist/src/web-ui/app/spark-chat-feature.js +76 -19
  272. package/dist/src/web-ui/app/styles/11-product-links.css +30 -0
  273. package/dist/src/web-ui/app/styles/41-plugin-configuration.css +79 -0
  274. package/dist/src/web-ui/app/styles/41-plugin-discovery.css +132 -0
  275. package/dist/src/web-ui/app/styles/41-plugin-management.css +6 -0
  276. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +173 -0
  277. package/dist/src/web-ui/app/styles/46-system-host.css +61 -107
  278. package/dist/src/web-ui/app/styles/47-config-controls.css +13 -1
  279. package/dist/src/web-ui/app/styles/54-spark-chat.css +33 -1
  280. package/dist/src/web-ui/app/styles.css +4 -0
  281. package/dist/src/web-ui/local-runtime/api-router.js +11 -6
  282. package/dist/src/web-ui/local-runtime/approval-request-attachment.js +14 -5
  283. package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +1 -1
  284. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +9 -3
  285. package/dist/src/web-ui/local-runtime/contracts.d.ts +4 -3
  286. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +5 -1
  287. package/dist/src/web-ui/local-runtime/environment-registry.js +53 -11
  288. package/dist/src/web-ui/local-runtime/history-pagination.d.ts +16 -0
  289. package/dist/src/web-ui/local-runtime/history-pagination.js +20 -0
  290. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.d.ts +16 -0
  291. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.js +68 -0
  292. package/dist/src/web-ui/local-runtime/plugin-installation-routes.d.ts +16 -0
  293. package/dist/src/web-ui/local-runtime/plugin-installation-routes.js +96 -0
  294. package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +8 -1
  295. package/dist/src/web-ui/local-runtime/plugin-management-routes.js +17 -0
  296. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.d.ts +7 -0
  297. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.js +17 -0
  298. package/dist/src/web-ui/local-runtime/plugin-removal-routes.d.ts +18 -0
  299. package/dist/src/web-ui/local-runtime/plugin-removal-routes.js +60 -0
  300. package/dist/src/web-ui/local-runtime/realtime-controller.js +41 -2
  301. package/dist/src/web-ui/local-runtime/request-cancellation-route.js +28 -1
  302. package/dist/src/web-ui/local-runtime/request-control-observation.d.ts +19 -0
  303. package/dist/src/web-ui/local-runtime/request-control-observation.js +80 -0
  304. package/dist/src/web-ui/local-runtime/request-execution.js +69 -37
  305. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +20 -0
  306. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +44 -0
  307. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +2 -0
  308. package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +9 -2
  309. package/dist/src/web-ui/local-runtime/session-routes.d.ts +1 -0
  310. package/dist/src/web-ui/local-runtime/session-routes.js +16 -4
  311. package/dist/src/web-ui/local-runtime/spark-chat-routes.js +4 -3
  312. package/dist/src/web-ui/plugin-capability-selection.js +4 -1
  313. package/dist/src/web-ui/plugin-configuration-input.d.ts +12 -0
  314. package/dist/src/web-ui/plugin-configuration-input.js +68 -0
  315. package/dist/src/web-ui/plugin-configuration-retained-secrets.d.ts +9 -0
  316. package/dist/src/web-ui/plugin-configuration-retained-secrets.js +48 -0
  317. package/dist/src/web-ui/plugin-configuration-service.d.ts +52 -0
  318. package/dist/src/web-ui/plugin-configuration-service.js +66 -0
  319. package/dist/src/web-ui/plugin-configuration-view.d.ts +25 -0
  320. package/dist/src/web-ui/plugin-configuration-view.js +45 -0
  321. package/dist/src/web-ui/plugin-disabled-selection.d.ts +7 -0
  322. package/dist/src/web-ui/plugin-disabled-selection.js +17 -0
  323. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  324. package/dist/src/web-ui/plugin-management-catalog.js +11 -1
  325. package/dist/src/web-ui/plugin-management-selection.js +22 -9
  326. package/dist/src/web-ui/plugin-management-service.d.ts +5 -1
  327. package/dist/src/web-ui/plugin-management-service.js +11 -7
  328. package/dist/src/web-ui/plugin-removal-error.d.ts +7 -0
  329. package/dist/src/web-ui/plugin-removal-error.js +16 -0
  330. package/dist/src/web-ui/plugin-removal-service.d.ts +30 -0
  331. package/dist/src/web-ui/plugin-removal-service.js +109 -0
  332. package/dist/src/web-ui/runtime-setup-gateway.d.ts +6 -2
  333. package/dist/src/web-ui/runtime-setup-gateway.js +30 -10
  334. package/dist/src/web-ui/server.js +6 -2
  335. package/dist/src/web-ui/session-read-state/overview.d.ts +42 -0
  336. package/dist/src/web-ui/session-read-state/overview.js +16 -0
  337. package/dist/src/web-ui/session-read-state/pagination.d.ts +15 -0
  338. package/dist/src/web-ui/session-read-state/pagination.js +42 -0
  339. package/dist/src/web-ui/session-read-state/projection.d.ts +4 -3
  340. package/dist/src/web-ui/session-read-state/service.d.ts +213 -20
  341. package/dist/src/web-ui/session-read-state/service.js +25 -23
  342. package/dist/src/web-ui/session-read-state/visible-messages.d.ts +3 -3
  343. package/dist/src/web-ui/system-host-setup/companion-linux.js +1 -1
  344. package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +1 -1
  345. package/dist/src/web-ui/system-host-setup/installer-contract.js +2 -2
  346. package/dist/src/web-ui/system-host-setup/installers.js +0 -7
  347. package/dist/src/web-ui/system-host-setup/local-connection.d.ts +4 -1
  348. package/dist/src/web-ui/system-host-setup/local-connection.js +10 -17
  349. package/dist/src/web-ui/system-host-setup/routes.d.ts +2 -0
  350. package/dist/src/web-ui/system-host-setup/routes.js +32 -9
  351. package/dist/src/web-ui/system-host-setup/setup-mutation.d.ts +9 -0
  352. package/dist/src/web-ui/system-host-setup/setup-mutation.js +27 -0
  353. package/dist/src/web-ui/system-host-setup/windows-store-route.d.ts +13 -0
  354. package/dist/src/web-ui/system-host-setup/windows-store-route.js +68 -0
  355. package/docs/configuration.md +46 -0
  356. package/docs/installation.md +45 -24
  357. package/docs/plugins.md +165 -2
  358. package/docs/projects-and-full-plus.md +2 -6
  359. package/docs/runtime-library.md +0 -1
  360. package/docs/windows-companion-store.md +127 -0
  361. package/package.json +3 -3
  362. package/plugins/document-reader/plugin.json +1 -0
  363. package/plugins/exec/plugin.json +3 -0
  364. package/plugins/filesystem/plugin.json +2 -0
  365. package/plugins/local-search/plugin.json +1 -0
  366. package/plugins/system/README.md +43 -3
  367. package/plugins/system/plugin.json +5 -0
  368. package/plugins/system/source/companion-command-output.ts +82 -0
  369. package/plugins/system/source/host-dispatch.ts +4 -0
  370. package/plugins/system/source/index.ts +11 -5
  371. package/plugins/system/source/local-command-output.ts +61 -0
  372. package/plugins/system/source/request-system-modules.ts +2 -0
  373. package/plugins/system/src/index.cjs +474 -39
  374. package/plugins/web/README.md +2 -2
  375. package/plugins/web/plugin.json +4 -0
  376. package/runtime.config.schema.json +25 -1
  377. package/src/runtime/README.md +12 -2
  378. package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +0 -2
  379. package/dist/src/web-ui/system-host-setup/companion-windows.js +0 -108
  380. package/docs/publishing.md +0 -167
@@ -234,6 +234,21 @@ function failureFromError(error, options) {
234
234
  });
235
235
  }
236
236
 
237
+ // src/plugin-sdk/context-text-result.ts
238
+ function deliverPluginTextResult(result, fields, budget) {
239
+ const assessed = enforcePluginResultByteBudget(result, budget);
240
+ if (!canHandOffContextText(result, assessed, budget)) return assessed;
241
+ return enforcePluginResultByteBudget(
242
+ { ...result, contextTextFields: Object.freeze([...fields]) },
243
+ budget
244
+ );
245
+ }
246
+ function canHandOffContextText(original, assessed, budget) {
247
+ if (budget?.acceptsContextText !== true) return false;
248
+ if (assessed === original) return false;
249
+ return assessed.errorCode === "plugin_result_too_large";
250
+ }
251
+
237
252
  // src/capabilities/tool-media.ts
238
253
  var TOOL_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
239
254
 
@@ -255,25 +270,25 @@ function hostStateDirectory(rootDir) {
255
270
  }
256
271
  function ensureHostStateDirectory(directory) {
257
272
  (0, import_node_fs.mkdirSync)(directory, { recursive: true, mode: 448 });
258
- const stat2 = (0, import_node_fs.lstatSync)(directory);
259
- if (!stat2.isDirectory()) throw new Error("host_state_directory_invalid");
273
+ const stat4 = (0, import_node_fs.lstatSync)(directory);
274
+ if (!stat4.isDirectory()) throw new Error("host_state_directory_invalid");
260
275
  if (process.platform === "win32") return;
261
- if (stat2.uid !== process.getuid?.())
276
+ if (stat4.uid !== process.getuid?.())
262
277
  throw new Error("host_state_owner_invalid");
263
- if ((stat2.mode & 63) !== 0)
278
+ if ((stat4.mode & 63) !== 0)
264
279
  throw new Error("host_state_directory_not_private");
265
280
  }
266
281
  function readHostPrivateJson(path) {
267
282
  try {
268
- const stat2 = (0, import_node_fs.lstatSync)(path);
269
- if (!stat2.isFile()) throw new Error("host_state_file_invalid");
283
+ const stat4 = (0, import_node_fs.lstatSync)(path);
284
+ if (!stat4.isFile()) throw new Error("host_state_file_invalid");
270
285
  if (process.platform !== "win32") {
271
- if (stat2.uid !== process.getuid?.())
286
+ if (stat4.uid !== process.getuid?.())
272
287
  throw new Error("host_state_owner_invalid");
273
- if ((stat2.mode & 63) !== 0)
288
+ if ((stat4.mode & 63) !== 0)
274
289
  throw new Error("host_state_file_not_private");
275
290
  }
276
- if (stat2.size > 16384) throw new Error("host_state_file_too_large");
291
+ if (stat4.size > 16384) throw new Error("host_state_file_too_large");
277
292
  return JSON.parse((0, import_node_fs.readFileSync)(path, "utf8"));
278
293
  } catch (error) {
279
294
  if (error.code === "ENOENT") return void 0;
@@ -4259,7 +4274,7 @@ var import_node_path4 = require("node:path");
4259
4274
  // src/computer-access/process-runner.ts
4260
4275
  var import_node_child_process4 = require("node:child_process");
4261
4276
  var STREAM_MAX_CHARS = 16e3;
4262
- function runSystemProcess(input) {
4277
+ function runSystemProcess(input, capture) {
4263
4278
  if (input.abortSignal?.aborted)
4264
4279
  return Promise.resolve({
4265
4280
  exitCode: null,
@@ -4287,6 +4302,7 @@ function runSystemProcess(input) {
4287
4302
  if (timeout) clearTimeout(timeout);
4288
4303
  if (stopGrace) clearTimeout(stopGrace);
4289
4304
  input.abortSignal?.removeEventListener("abort", abort);
4305
+ capture?.end();
4290
4306
  resolve(
4291
4307
  Object.freeze({
4292
4308
  exitCode,
@@ -4330,18 +4346,25 @@ function runSystemProcess(input) {
4330
4346
  stopGrace.unref();
4331
4347
  };
4332
4348
  const abort = () => stop("aborted");
4333
- child.stdout.setEncoding("utf8");
4334
- child.stderr.setEncoding("utf8");
4335
- child.stdout.on("data", (chunk) => {
4336
- const remaining = streamMaxChars - stdout.length;
4337
- truncated ||= chunk.length > remaining;
4338
- stdout += chunk.slice(0, remaining);
4339
- });
4340
- child.stderr.on("data", (chunk) => {
4341
- const remaining = streamMaxChars - stderr.length;
4342
- truncated ||= chunk.length > remaining;
4343
- stderr += chunk.slice(0, remaining);
4344
- });
4349
+ const attachOutput = () => {
4350
+ if (capture) {
4351
+ capture.attach(child.stdout, child.stderr, () => stop("output_failed"));
4352
+ return;
4353
+ }
4354
+ child.stdout.setEncoding("utf8");
4355
+ child.stderr.setEncoding("utf8");
4356
+ child.stdout.on("data", (chunk) => {
4357
+ const remaining = streamMaxChars - stdout.length;
4358
+ truncated ||= chunk.length > remaining;
4359
+ stdout += chunk.slice(0, remaining);
4360
+ });
4361
+ child.stderr.on("data", (chunk) => {
4362
+ const remaining = streamMaxChars - stderr.length;
4363
+ truncated ||= chunk.length > remaining;
4364
+ stderr += chunk.slice(0, remaining);
4365
+ });
4366
+ };
4367
+ attachOutput();
4345
4368
  child.once("error", (error) => {
4346
4369
  status = "spawn_failed";
4347
4370
  stderr = error.message.slice(0, STREAM_MAX_CHARS);
@@ -4963,7 +4986,7 @@ async function executeSystemCommand(input) {
4963
4986
  );
4964
4987
  await requireNativeWorkingDirectory(target, cwd);
4965
4988
  const plan = params.elevated === true ? await elevatedSystemCommand({ target, command, cwd, run }) : unprivilegedSystemCommand(target, command, cwd);
4966
- return run({
4989
+ return (input.runCommand ?? run)({
4967
4990
  ...plan,
4968
4991
  timeoutMs,
4969
4992
  ...input.abortSignal ? { abortSignal: input.abortSignal } : {}
@@ -5007,6 +5030,11 @@ var LEGACY_EVIDENCE_LABELS = {
5007
5030
  launch_request_dispatch: "application launch request dispatch"
5008
5031
  };
5009
5032
  function systemProcessResult(target, result, evidenceScope, application) {
5033
+ return enforcePluginResultByteBudget(
5034
+ buildSystemProcessResult(target, result, evidenceScope, application)
5035
+ );
5036
+ }
5037
+ function buildSystemProcessResult(target, result, evidenceScope, application) {
5010
5038
  const stdoutOmittedChars = Math.max(
5011
5039
  0,
5012
5040
  result.stdout.length - STREAM_EXCERPT_CHARS
@@ -5049,24 +5077,28 @@ function systemProcessResult(target, result, evidenceScope, application) {
5049
5077
  `Summary omitted characters: stdout=${stdoutOmittedChars}, stderr=${stderrOmittedChars}. Raw stream capture truncated: ${result.outputTruncated}.`
5050
5078
  ].join("\n");
5051
5079
  if (hasSuccessfulSystemObservation(result)) {
5052
- return successResult({
5080
+ return {
5081
+ ok: true,
5082
+ producedNewInformation: true,
5053
5083
  output,
5054
5084
  stdout: result.stdout,
5055
5085
  stderr: result.stderr,
5056
5086
  exitCode: 0,
5057
5087
  data
5058
- });
5088
+ };
5059
5089
  }
5060
5090
  const errorCode = result.status === "completed" ? "system_command_failed" : `system_${result.status}`;
5061
- return failureResult({
5091
+ return {
5092
+ ok: false,
5093
+ producedNewInformation: false,
5062
5094
  errorCode,
5063
- message: hasUncertainDescendantState(result) ? "System command observation stopped. External or detached descendants may remain; inspect the target before retrying." : "The target did not report successful command completion.",
5095
+ error: hasUncertainDescendantState(result) ? "System command observation stopped. External or detached descendants may remain; inspect the target before retrying." : "The target did not report successful command completion.",
5064
5096
  output,
5065
5097
  stdout: result.stdout,
5066
5098
  stderr: result.stderr,
5067
5099
  ...result.exitCode !== null ? { exitCode: result.exitCode } : {},
5068
5100
  data
5069
- });
5101
+ };
5070
5102
  }
5071
5103
  function hasSuccessfulSystemObservation(result) {
5072
5104
  if (result.status !== "completed") return false;
@@ -5103,7 +5135,7 @@ function withSystemOperationErrors(operation) {
5103
5135
  }
5104
5136
  };
5105
5137
  }
5106
- function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => resolveSystemTarget(id, run)) {
5138
+ function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => resolveSystemTarget(id, run), commandOutput) {
5107
5139
  const targets = async () => {
5108
5140
  const observation = await observeSystemTargets(run);
5109
5141
  return successResult({
@@ -5116,12 +5148,15 @@ function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => re
5116
5148
  };
5117
5149
  const command = async (params, context) => {
5118
5150
  const target = await resolveTarget(readSystemTargetId(params.target));
5151
+ const output = commandOutput?.(context);
5119
5152
  const result = await executeSystemCommand({
5120
5153
  target,
5121
5154
  params,
5122
5155
  run,
5156
+ ...output ? { runCommand: output.run } : {},
5123
5157
  ...context?.abortSignal ? { abortSignal: context.abortSignal } : {}
5124
5158
  });
5159
+ if (output) return output.present(target, result);
5125
5160
  return systemProcessResult(target, result, "command_process_completion");
5126
5161
  };
5127
5162
  const applications = async (params) => {
@@ -5170,6 +5205,255 @@ function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => re
5170
5205
  };
5171
5206
  }
5172
5207
 
5208
+ // src/computer-access/command-output-capture.ts
5209
+ var import_node_crypto6 = require("node:crypto");
5210
+ var import_node_events = require("node:events");
5211
+ var import_node_fs5 = require("node:fs");
5212
+ var import_promises6 = require("node:fs/promises");
5213
+ var import_node_path8 = require("node:path");
5214
+ var import_promises7 = require("node:stream/promises");
5215
+
5216
+ // src/computer-access/command-output-retention.ts
5217
+ var import_promises5 = require("node:fs/promises");
5218
+ var import_node_path7 = require("node:path");
5219
+ var DEFAULT_SYSTEM_OUTPUT_RETENTION_MS = 7 * 24 * 60 * 6e4;
5220
+ var activeSystemCaptures = /* @__PURE__ */ new Set();
5221
+ var jobs = /* @__PURE__ */ new Map();
5222
+ var CAPTURE_ID = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;
5223
+ async function cleanupSystemOutput(root, retentionMs) {
5224
+ const entries = await (0, import_promises5.readdir)(root, { withFileTypes: true }).catch((error) => {
5225
+ if (error.code === "ENOENT") return [];
5226
+ throw error;
5227
+ });
5228
+ let removed = 0;
5229
+ for (const entry of entries) {
5230
+ if (!entry.isDirectory() || !CAPTURE_ID.test(entry.name)) continue;
5231
+ const directory = (0, import_node_path7.join)(root, entry.name);
5232
+ if (activeSystemCaptures.has(directory)) continue;
5233
+ const files = await (0, import_promises5.readdir)(directory);
5234
+ const times = await Promise.all(files.map(async (file) => (await (0, import_promises5.stat)((0, import_node_path7.join)(directory, file))).mtimeMs));
5235
+ const completedAt = Math.max((await (0, import_promises5.stat)(directory)).mtimeMs, ...times);
5236
+ const captureRetentionMs = await readCaptureRetention(directory, entry.name, retentionMs);
5237
+ if (Date.now() - completedAt < captureRetentionMs) continue;
5238
+ if (activeSystemCaptures.has(directory)) continue;
5239
+ await (0, import_promises5.rm)(directory, { recursive: true });
5240
+ removed += 1;
5241
+ }
5242
+ return removed;
5243
+ }
5244
+ async function readCaptureRetention(directory, id, fallbackMs) {
5245
+ let receipt;
5246
+ try {
5247
+ receipt = JSON.parse(await (0, import_promises5.readFile)((0, import_node_path7.join)(directory, "receipt.json"), "utf8"));
5248
+ } catch (error) {
5249
+ if (error.code === "ENOENT") return fallbackMs;
5250
+ if (error instanceof SyntaxError) return fallbackMs;
5251
+ throw error;
5252
+ }
5253
+ if (receipt === null || typeof receipt !== "object") return fallbackMs;
5254
+ if (!("kind" in receipt) || receipt.kind !== "system_command_output_v1") return fallbackMs;
5255
+ if (!("id" in receipt) || receipt.id !== id) return fallbackMs;
5256
+ if (!("retentionMs" in receipt) || typeof receipt.retentionMs !== "number") return fallbackMs;
5257
+ if (!Number.isSafeInteger(receipt.retentionMs) || receipt.retentionMs < 1) return fallbackMs;
5258
+ return receipt.retentionMs;
5259
+ }
5260
+ function scheduleSystemOutputCleanup(root, retentionMs) {
5261
+ const previous = jobs.get(root);
5262
+ if (previous) {
5263
+ previous.retentionMs = retentionMs;
5264
+ previous.requested = true;
5265
+ return;
5266
+ }
5267
+ const job = { retentionMs, requested: false };
5268
+ jobs.set(root, job);
5269
+ const sweep = async () => {
5270
+ job.requested = false;
5271
+ let empty = false;
5272
+ try {
5273
+ await cleanupSystemOutput(root, job.retentionMs);
5274
+ empty = (await (0, import_promises5.readdir)(root).catch((error) => {
5275
+ if (error.code === "ENOENT") return [];
5276
+ throw error;
5277
+ })).length === 0;
5278
+ } catch {
5279
+ process.emitWarning("SYSTEM output cleanup failed; retained output was not confirmed removed.", { code: "SYSTEM_OUTPUT_CLEANUP_FAILED" });
5280
+ }
5281
+ if (empty && !job.requested) {
5282
+ jobs.delete(root);
5283
+ return;
5284
+ }
5285
+ const timer = setTimeout(() => {
5286
+ void sweep();
5287
+ }, Math.max(1, Math.min(job.retentionMs, 60 * 6e4)));
5288
+ timer.unref();
5289
+ };
5290
+ void sweep();
5291
+ }
5292
+
5293
+ // src/computer-access/command-output-capture.ts
5294
+ var OUTPUT_IO_CHUNK_BYTES = 64 * 1024;
5295
+ async function createSystemOutputCapture(root, retentionMs) {
5296
+ const id = (0, import_node_crypto6.randomUUID)();
5297
+ const directory = (0, import_node_path8.join)(root, id);
5298
+ activeSystemCaptures.add(directory);
5299
+ try {
5300
+ await (0, import_promises6.mkdir)(directory, { recursive: true, mode: 448 });
5301
+ } catch {
5302
+ activeSystemCaptures.delete(directory);
5303
+ throw new SystemOperationError("system_output_storage_failed", "Output storage could not be prepared. The command was not dispatched.");
5304
+ }
5305
+ let failure;
5306
+ let stop;
5307
+ let ended = false;
5308
+ let retained = false;
5309
+ const sources = [];
5310
+ const streams = ["stdout", "stderr"].map((name) => {
5311
+ const path = (0, import_node_path8.join)(directory, name + ".bytes");
5312
+ const sink = (0, import_node_fs5.createWriteStream)(path, { flags: "wx", mode: 384, highWaterMark: OUTPUT_IO_CHUNK_BYTES, flush: true });
5313
+ const completion = (0, import_promises7.finished)(sink).catch(() => {
5314
+ failure ??= "write_failed";
5315
+ stop?.();
5316
+ });
5317
+ return { name, path, sink, completion, hash: (0, import_node_crypto6.createHash)("sha256") };
5318
+ });
5319
+ try {
5320
+ await Promise.all(streams.map(({ sink }) => (0, import_node_events.once)(sink, "open")));
5321
+ } catch {
5322
+ for (const { sink } of streams) sink.destroy();
5323
+ await Promise.all(streams.map(({ completion }) => completion));
5324
+ activeSystemCaptures.delete(directory);
5325
+ scheduleSystemOutputCleanup(root, retentionMs);
5326
+ throw new SystemOperationError("system_output_storage_failed", "Output files could not be opened. The command was not dispatched.");
5327
+ }
5328
+ scheduleSystemOutputCleanup(root, retentionMs);
5329
+ const capture = {
5330
+ attach(stdout, stderr, onFailure) {
5331
+ stop = onFailure;
5332
+ sources.push(stdout, stderr);
5333
+ stdout.on("data", (bytes) => streams[0].hash.update(bytes));
5334
+ stderr.on("data", (bytes) => streams[1].hash.update(bytes));
5335
+ stdout.pipe(streams[0].sink);
5336
+ stderr.pipe(streams[1].sink);
5337
+ if (failure) onFailure();
5338
+ },
5339
+ end() {
5340
+ if (ended) return;
5341
+ ended = true;
5342
+ for (const source of sources) {
5343
+ source.unpipe();
5344
+ source.destroy();
5345
+ }
5346
+ for (const { sink } of streams) if (!sink.destroyed && !sink.writableEnded) sink.end();
5347
+ }
5348
+ };
5349
+ let receipt;
5350
+ return {
5351
+ capture,
5352
+ get receipt() {
5353
+ return receipt;
5354
+ },
5355
+ get failure() {
5356
+ return failure;
5357
+ },
5358
+ retain() {
5359
+ retained = true;
5360
+ activeSystemCaptures.add(directory);
5361
+ },
5362
+ release() {
5363
+ retained = false;
5364
+ activeSystemCaptures.delete(directory);
5365
+ },
5366
+ async read(stream, offset, length) {
5367
+ const path = streams.find((entry) => entry.name === stream).path;
5368
+ const file = await (0, import_promises6.open)(path, "r");
5369
+ try {
5370
+ const bytes = Buffer.alloc(length);
5371
+ const { bytesRead } = await file.read(bytes, 0, length, offset);
5372
+ return bytes.subarray(0, bytesRead);
5373
+ } finally {
5374
+ await file.close();
5375
+ }
5376
+ },
5377
+ async finish(result, materialize = true) {
5378
+ capture.end();
5379
+ try {
5380
+ await Promise.all(streams.map(({ completion }) => completion));
5381
+ const sizes = await Promise.all(streams.map(async ({ path }) => {
5382
+ try {
5383
+ return (await (0, import_promises6.stat)(path)).size;
5384
+ } catch {
5385
+ failure ??= "read_failed";
5386
+ return 0;
5387
+ }
5388
+ }));
5389
+ let stdout = "", stderr = "";
5390
+ if (!failure && materialize) {
5391
+ try {
5392
+ [stdout, stderr] = await Promise.all(streams.map(({ path }) => (0, import_promises6.readFile)(path, "utf8")));
5393
+ } catch {
5394
+ failure = "read_failed";
5395
+ }
5396
+ }
5397
+ const completedAt = Date.now();
5398
+ receipt = {
5399
+ id,
5400
+ stdoutBytes: sizes[0],
5401
+ stderrBytes: sizes[1],
5402
+ completedAt: new Date(completedAt).toISOString(),
5403
+ retentionMs,
5404
+ complete: !failure,
5405
+ ...!materialize ? { stdoutSha256: streams[0].hash.digest("hex"), stderrSha256: streams[1].hash.digest("hex") } : {}
5406
+ };
5407
+ try {
5408
+ const temporary = (0, import_node_path8.join)(directory, "receipt.tmp");
5409
+ await (0, import_promises6.writeFile)(temporary, JSON.stringify({
5410
+ kind: "system_command_output_v1",
5411
+ ...receipt,
5412
+ processStatus: result?.status,
5413
+ exitCode: result?.exitCode,
5414
+ spawnedProcess: result?.spawnedProcess,
5415
+ ...failure ? { storageFailure: failure } : {}
5416
+ }), { flag: "wx", mode: 384, flush: true });
5417
+ await (0, import_promises6.rename)(temporary, (0, import_node_path8.join)(directory, "receipt.json"));
5418
+ } catch {
5419
+ failure ??= "receipt_write_failed";
5420
+ receipt = { ...receipt, complete: false };
5421
+ }
5422
+ return { stdout, stderr };
5423
+ } finally {
5424
+ if (!retained) activeSystemCaptures.delete(directory);
5425
+ }
5426
+ }
5427
+ };
5428
+ }
5429
+
5430
+ // src/computer-access/companion/command-output-protocol.ts
5431
+ var SYSTEM_OUTPUT_CAPABILITY = "system_command_output_v1";
5432
+ var SYSTEM_OUTPUT_CHUNK_BYTES = 64 * 1024;
5433
+ function isStreamByteCount(value) {
5434
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
5435
+ }
5436
+ function isStreamDigest(value) {
5437
+ return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
5438
+ }
5439
+ function readSystemOutputTransfer(value) {
5440
+ if (!isHostRecord(value)) throw new Error("system_output_receipt_invalid");
5441
+ if (value.kind !== SYSTEM_OUTPUT_CAPABILITY) throw new Error("system_output_receipt_invalid");
5442
+ if (!isHostIdentifier(value.id)) throw new Error("system_output_receipt_invalid");
5443
+ if (!isStreamByteCount(value.stdoutBytes)) throw new Error("system_output_receipt_invalid");
5444
+ if (!isStreamByteCount(value.stderrBytes)) throw new Error("system_output_receipt_invalid");
5445
+ if (!isStreamDigest(value.stdoutSha256)) throw new Error("system_output_receipt_invalid");
5446
+ if (!isStreamDigest(value.stderrSha256)) throw new Error("system_output_receipt_invalid");
5447
+ return {
5448
+ kind: SYSTEM_OUTPUT_CAPABILITY,
5449
+ id: value.id,
5450
+ stdoutBytes: value.stdoutBytes,
5451
+ stderrBytes: value.stderrBytes,
5452
+ stdoutSha256: value.stdoutSha256,
5453
+ stderrSha256: value.stderrSha256
5454
+ };
5455
+ }
5456
+
5173
5457
  // plugins/system/source/computer/public-action.ts
5174
5458
  function readPublicComputerAction(params) {
5175
5459
  const fields = ["desktop_ref", "observation_ref", "action_kind"];
@@ -5332,7 +5616,7 @@ function fits(value) {
5332
5616
  }
5333
5617
 
5334
5618
  // plugins/system/source/computer/request-computers.ts
5335
- var import_node_crypto7 = require("node:crypto");
5619
+ var import_node_crypto8 = require("node:crypto");
5336
5620
 
5337
5621
  // plugins/system/source/request-target-snapshot.ts
5338
5622
  async function captureSystemTargetSnapshot(input) {
@@ -5449,14 +5733,14 @@ function modelSafeRouteObservation(route) {
5449
5733
  }
5450
5734
 
5451
5735
  // plugins/system/source/computer/desktop-bindings.ts
5452
- var import_node_crypto6 = require("node:crypto");
5736
+ var import_node_crypto7 = require("node:crypto");
5453
5737
  var DesktopBindings = class {
5454
5738
  current;
5455
5739
  windows = /* @__PURE__ */ new Map();
5456
5740
  observe(result) {
5457
5741
  this.windows.clear();
5458
5742
  const windows = result.windows.map((window) => {
5459
- const id2 = (0, import_node_crypto6.randomUUID)();
5743
+ const id2 = (0, import_node_crypto7.randomUUID)();
5460
5744
  this.windows.set(id2, window.binding);
5461
5745
  const { binding: _binding, ...details } = window;
5462
5746
  return {
@@ -5472,7 +5756,7 @@ var DesktopBindings = class {
5472
5756
  observation_ref: void 0,
5473
5757
  coordinateSpace: result.desktop.coordinateSpace ?? "native_desktop"
5474
5758
  };
5475
- const id = (0, import_node_crypto6.randomUUID)();
5759
+ const id = (0, import_node_crypto7.randomUUID)();
5476
5760
  this.current = {
5477
5761
  id,
5478
5762
  issuedAt: Date.now(),
@@ -5657,7 +5941,7 @@ var RequestComputers = class {
5657
5941
  this.connection = connection;
5658
5942
  this.nativeFactory = nativeFactory;
5659
5943
  this.entries = snapshot === void 0 ? routes.map((route) => ({
5660
- ref: (0, import_node_crypto7.randomUUID)(),
5944
+ ref: (0, import_node_crypto8.randomUUID)(),
5661
5945
  route,
5662
5946
  bindings: new DesktopBindings()
5663
5947
  })) : restoreComputers(routes, snapshot);
@@ -6026,6 +6310,77 @@ function prepareComputerModules(rootDir, modules, routes, connection, preparatio
6026
6310
  }));
6027
6311
  }
6028
6312
 
6313
+ // plugins/system/source/companion-command-output.ts
6314
+ var import_node_crypto9 = require("node:crypto");
6315
+ var import_node_string_decoder = require("node:string_decoder");
6316
+ function supportsCompanionCommandOutput(route) {
6317
+ return route.capabilities?.includes(SYSTEM_OUTPUT_CAPABILITY) === true;
6318
+ }
6319
+ async function executeCompanionCommand(input) {
6320
+ const { route, context } = input;
6321
+ const call = (operation, params, signal) => input.connection.executeHostOperation(input.rootDir, {
6322
+ hostId: route.hostId,
6323
+ connectionId: route.connectionId,
6324
+ operation,
6325
+ params: { ...params, target: route.target },
6326
+ ...signal ? { abortSignal: signal } : {}
6327
+ });
6328
+ const receipt = await call("system_command_capture", {
6329
+ ...input.params,
6330
+ ...input.outputRetentionMs !== void 0 ? { outputRetentionMs: input.outputRetentionMs } : {}
6331
+ }, context?.abortSignal);
6332
+ if (!receipt.data?.outputTransfer && !receipt.ok) return receipt;
6333
+ let transfer;
6334
+ try {
6335
+ transfer = readSystemOutputTransfer(receipt.data?.outputTransfer);
6336
+ const stdout = await readStream(call, transfer, "stdout", context?.abortSignal);
6337
+ const stderr = await readStream(call, transfer, "stderr", context?.abortSignal);
6338
+ const { outputTransfer: _transfer, ...data } = receipt.data ?? {};
6339
+ const delivered = deliverPluginTextResult({
6340
+ ...receipt,
6341
+ stdout,
6342
+ stderr: stderr || receipt.stderr,
6343
+ data: { ...data, outputDelivery: "complete", summaryOmittedChars: { stdout: stdout.length, stderr: stderr.length } }
6344
+ }, ["stdout", "stderr"], context?.resultBudget);
6345
+ if (delivered.errorCode === "plugin_result_too_large") return transferFailure(receipt, context);
6346
+ return delivered;
6347
+ } catch {
6348
+ return transferFailure(receipt, context);
6349
+ } finally {
6350
+ if (transfer) await call("system_command_output_close", { captureId: transfer.id }, AbortSignal.timeout(3e3)).catch(() => void 0);
6351
+ }
6352
+ }
6353
+ async function readStream(call, transfer, stream, signal) {
6354
+ const size = stream === "stdout" ? transfer.stdoutBytes : transfer.stderrBytes;
6355
+ const digest = stream === "stdout" ? transfer.stdoutSha256 : transfer.stderrSha256;
6356
+ const hash = (0, import_node_crypto9.createHash)("sha256");
6357
+ const decoder = new import_node_string_decoder.StringDecoder("utf8");
6358
+ let text = "";
6359
+ for (let offset = 0; offset < size; offset += SYSTEM_OUTPUT_CHUNK_BYTES) {
6360
+ signal?.throwIfAborted();
6361
+ const part = await call("system_command_output", { captureId: transfer.id, stream, offset }, signal);
6362
+ if (!part.ok) throw new Error("system_output_transfer_failed");
6363
+ const data = part.data;
6364
+ if (data?.captureId !== transfer.id || data.stream !== stream || data.offset !== offset) throw new Error("system_output_chunk_binding_invalid");
6365
+ if (typeof data.bytes !== "string" || data.bytes.length > SYSTEM_OUTPUT_CHUNK_BYTES * 2) throw new Error("system_output_chunk_invalid");
6366
+ const bytes = Buffer.from(data.bytes, "base64");
6367
+ if (bytes.toString("base64") !== data.bytes) throw new Error("system_output_chunk_invalid");
6368
+ if (bytes.length !== Math.min(SYSTEM_OUTPUT_CHUNK_BYTES, size - offset)) throw new Error("system_output_chunk_size_invalid");
6369
+ hash.update(bytes);
6370
+ text += decoder.write(bytes);
6371
+ }
6372
+ if (hash.digest("hex") !== digest) throw new Error("system_output_digest_invalid");
6373
+ return text + decoder.end();
6374
+ }
6375
+ function transferFailure(receipt, context) {
6376
+ return failureResult({
6377
+ errorCode: "system_output_delivery_pending",
6378
+ message: "The command settled, but its retained output could not be delivered completely. Process receipt is preserved; the command was not replayed.",
6379
+ ...receipt.exitCode !== void 0 ? { exitCode: receipt.exitCode } : {},
6380
+ data: { ...receipt.data, outputDelivery: "pending", commandOk: receipt.ok, commandErrorCode: receipt.errorCode ?? null }
6381
+ }, context?.resultBudget);
6382
+ }
6383
+
6029
6384
  // plugins/system/source/host-dispatch.ts
6030
6385
  var defaultSystemHostConnection = {
6031
6386
  readHostStatus,
@@ -6060,6 +6415,8 @@ function boundOperation(input, operation) {
6060
6415
  const route = requireSystemRequestRoute(input.snapshot, params.target);
6061
6416
  if (route.kind === "native")
6062
6417
  return await input.nativeHandlers[operation](params, context);
6418
+ if (operation === "system_command" && supportsCompanionCommandOutput(route))
6419
+ return await executeCompanionCommand({ ...input, route, params, context });
6063
6420
  return await input.connection.executeHostOperation(input.rootDir, {
6064
6421
  hostId: route.hostId,
6065
6422
  connectionId: route.connectionId,
@@ -6112,7 +6469,8 @@ async function prepareSystemRequestModules(rootDir, modules, dependencies = {},
6112
6469
  rootDir,
6113
6470
  snapshot,
6114
6471
  connection,
6115
- nativeHandlers
6472
+ nativeHandlers,
6473
+ outputRetentionMs: dependencies.outputRetentionMs
6116
6474
  });
6117
6475
  return Object.freeze([
6118
6476
  ...modules.filter((module2) => !isComputerTool(module2.definition.name)).map((module2) => projectSystemRequestModule(module2, snapshot, handlers)),
@@ -6173,8 +6531,85 @@ function systemExecutionBinding(snapshot) {
6173
6531
  };
6174
6532
  }
6175
6533
 
6534
+ // plugins/system/source/local-command-output.ts
6535
+ var import_node_path9 = require("node:path");
6536
+ var CONTEXT_STREAMS = Object.freeze(["stdout", "stderr"]);
6537
+ function createLocalSystemCommandOutput(plugin) {
6538
+ const root = (0, import_node_path9.join)(plugin.stateDir, "command-output");
6539
+ const retentionMs = systemCommandOutputRetentionMs(plugin);
6540
+ scheduleSystemOutputCleanup(root, retentionMs);
6541
+ return (context) => {
6542
+ let captured;
6543
+ return {
6544
+ async run(input) {
6545
+ if (input.abortSignal?.aborted) return runSystemProcess(input);
6546
+ captured = await createSystemOutputCapture(root, retentionMs);
6547
+ let result;
6548
+ try {
6549
+ result = await runSystemProcess(input, captured.capture);
6550
+ } catch (error) {
6551
+ await captured.finish();
6552
+ throw error;
6553
+ }
6554
+ const streams = await captured.finish(result);
6555
+ return {
6556
+ ...result,
6557
+ stdout: streams.stdout,
6558
+ stderr: streams.stderr || result.stderr,
6559
+ outputTruncated: Boolean(captured.failure)
6560
+ };
6561
+ },
6562
+ async present(target, result) {
6563
+ if (captured?.failure) return outputFailure(target, result, context, captured.receipt, captured.failure);
6564
+ const receipt = buildSystemProcessResult(target, result, "command_process_completion");
6565
+ const delivered = deliverPluginTextResult({
6566
+ ...receipt,
6567
+ data: { ...receipt.data, ...captured?.receipt ? { outputCapture: captured.receipt } : {} }
6568
+ }, CONTEXT_STREAMS, context?.resultBudget);
6569
+ if (delivered.errorCode === "plugin_result_too_large")
6570
+ return outputFailure(target, result, context, captured?.receipt);
6571
+ return delivered;
6572
+ }
6573
+ };
6574
+ };
6575
+ }
6576
+ function outputFailure(target, result, context, capture, storageFailure) {
6577
+ return failureResult({
6578
+ errorCode: storageFailure ? "system_output_storage_failed" : "system_output_delivery_pending",
6579
+ message: "The command was dispatched. Its output could not be delivered completely; do not repeat the command just to retrieve output. Inspect the process receipt and retained capture.",
6580
+ ...result.exitCode !== null ? { exitCode: result.exitCode } : {},
6581
+ data: {
6582
+ target: target.id,
6583
+ transport: target.transport,
6584
+ processStatus: result.status,
6585
+ spawnedProcess: result.spawnedProcess ?? null,
6586
+ exitCode: result.exitCode,
6587
+ outputCapture: capture ?? null,
6588
+ ...storageFailure ? { storageFailure } : {},
6589
+ outputDelivery: "pending",
6590
+ evidenceScope: "command_process_completion",
6591
+ independentOutcomeCheck: "not_performed",
6592
+ observationMeta: { kind: "volatile_external", carryPolicy: "never" }
6593
+ }
6594
+ }, context?.resultBudget);
6595
+ }
6596
+ function systemCommandOutputRetentionMs(plugin) {
6597
+ return readBoundedInteger(plugin.config?.outputRetentionMs, {
6598
+ name: "outputRetentionMs",
6599
+ defaultValue: DEFAULT_SYSTEM_OUTPUT_RETENTION_MS,
6600
+ minimum: 1,
6601
+ maximum: Number.MAX_SAFE_INTEGER
6602
+ });
6603
+ }
6604
+
6176
6605
  // plugins/system/source/index.ts
6177
- var index_default = defineRuntimePlugin(({ rootDir }) => ({
6178
- handlers: { ...createSystemHandlers(), ...unboundComputerHandlers() },
6179
- prepareRequest: (modules, preparation) => prepareSystemRequestModules(rootDir, modules, {}, preparation)
6180
- }));
6606
+ var index_default = defineRuntimePlugin((context) => {
6607
+ const output = createLocalSystemCommandOutput(context);
6608
+ return {
6609
+ handlers: { ...createSystemHandlers(void 0, void 0, output), ...unboundComputerHandlers() },
6610
+ prepareRequest: (modules, preparation) => prepareSystemRequestModules(context.rootDir, modules, {
6611
+ outputRetentionMs: systemCommandOutputRetentionMs(context),
6612
+ createNativeHandlers: (resolve) => createSystemHandlers(void 0, resolve, output)
6613
+ }, preparation)
6614
+ };
6615
+ });
@@ -130,5 +130,5 @@ discovery of a URL absent from the catalog. It does not require a search key,
130
130
  external network, or model invocation.
131
131
 
132
132
  Run `npm run build:plugins` followed by `npm run validate` from the repository
133
- root. Actual source availability is a separate bounded direct-HTTP check;
134
- model/client acceptance uses the maintained, separately authorized live smoke.
133
+ root. These offline checks do not establish availability of external sources or
134
+ model behavior in a live client session.