@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,87 @@
1
+ import { lstatSync, realpathSync } from "node:fs";
2
+ import { realpath, rm } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { withFileLock } from "../../runtime/adapters/long-term-memory/file-lock.js";
5
+ import { CONFIG_FILE_LOCK_OPTIONS } from "../../runtime/adapters/config-file-transaction.js";
6
+ import { isMissingSetupEditFile, readSetupEditFile, requireSetupEditFileSnapshot, restoreSetupEditFile, setupEditFileMatches, setupEditRecoveryRequired, setupEditTextSnapshot, syncSetupEditDirectory, } from "./runtime-setup-edit-files.js";
7
+ import { readSetupEditJournal, setupEditJournalPath, } from "./runtime-setup-edit-journal.js";
8
+ /** Synchronous consumers must not observe any part of an unresolved edit. */
9
+ export function requireRuntimeSetupEditSettled(rootDir) {
10
+ let path = resolve(rootDir);
11
+ try {
12
+ path = realpathSync(path);
13
+ lstatSync(setupEditJournalPath(path));
14
+ }
15
+ catch (error) {
16
+ if (isMissingSetupEditFile(error))
17
+ return;
18
+ throw setupEditRecoveryRequired();
19
+ }
20
+ throw setupEditRecoveryRequired();
21
+ }
22
+ async function requireRecoverableSetupEditFiles(journal) {
23
+ for (const file of journal.files) {
24
+ const current = await readSetupEditFile(file.path);
25
+ if (setupEditFileMatches(current, file.after))
26
+ continue;
27
+ if (journal.phase === "pending" &&
28
+ setupEditFileMatches(current, file.before))
29
+ continue;
30
+ throw setupEditRecoveryRequired();
31
+ }
32
+ }
33
+ /** Caller holds every participant lock; repeatable after interruption at any restore. */
34
+ export async function reconcileSetupEditJournal(journal) {
35
+ await requireRecoverableSetupEditFiles(journal);
36
+ if (journal.phase === "pending") {
37
+ for (const file of [...journal.files].reverse()) {
38
+ const current = await readSetupEditFile(file.path);
39
+ if (setupEditFileMatches(current, file.before))
40
+ continue;
41
+ if (!setupEditFileMatches(current, file.after))
42
+ throw setupEditRecoveryRequired();
43
+ await restoreSetupEditFile(file.path, file.after, file.before);
44
+ }
45
+ }
46
+ const path = setupEditJournalPath(journal.rootDir);
47
+ await requireSetupEditFileSnapshot(path, setupEditTextSnapshot(JSON.stringify(journal) + "\n", 0o600));
48
+ await rm(path);
49
+ await syncSetupEditDirectory(journal.rootDir);
50
+ }
51
+ async function withSetupEditRecoveryLocks(journal, operation) {
52
+ const [model, config, receipt] = journal.files;
53
+ const locks = [
54
+ config.path + ".config.lock",
55
+ model.path + ".config.lock",
56
+ join(journal.rootDir, ".env.credentials.lock"),
57
+ receipt.path + ".config.lock",
58
+ ];
59
+ const acquire = (index) => {
60
+ if (index === locks.length)
61
+ return operation();
62
+ return withFileLock(locks[index], () => acquire(index + 1), CONFIG_FILE_LOCK_OPTIONS);
63
+ };
64
+ return acquire(0);
65
+ }
66
+ /** Runs before dotenv/configuration loading. No journal means no speculative repair. */
67
+ export async function recoverRuntimeSetupEdit(rootDir) {
68
+ try {
69
+ requireRuntimeSetupEditSettled(rootDir);
70
+ return;
71
+ }
72
+ catch {
73
+ // Parsing and lock acquisition below decide whether recovery is safe.
74
+ }
75
+ const root = await realpath(rootDir);
76
+ await withFileLock(join(root, ".runtime-setup.lock"), async () => {
77
+ const journal = await readSetupEditJournal(root);
78
+ if (!journal)
79
+ return;
80
+ await withSetupEditRecoveryLocks(journal, async () => {
81
+ const current = await readSetupEditJournal(root);
82
+ if (!current || JSON.stringify(current) !== JSON.stringify(journal))
83
+ throw setupEditRecoveryRequired();
84
+ await reconcileSetupEditJournal(journal);
85
+ });
86
+ }, CONFIG_FILE_LOCK_OPTIONS);
87
+ }
@@ -0,0 +1,3 @@
1
+ import { type SetupEditFilePlan } from "./runtime-setup-edit-journal.js";
2
+ /** Setup, config, model and credential locks enclose this complete transaction. */
3
+ export declare function commitRuntimeSetupEdit(rootDir: string, files: readonly SetupEditFilePlan[], commit: () => Promise<void>, publishCommittedCredentials: () => void): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { createSetupEditJournal, readSetupEditJournal, writeSetupEditJournal, } from "./runtime-setup-edit-journal.js";
3
+ import { requireSetupEditFileSnapshot, syncSetupEditFile, } from "./runtime-setup-edit-files.js";
4
+ import { reconcileSetupEditJournal, requireRuntimeSetupEditSettled, } from "./runtime-setup-edit-recovery.js";
5
+ /** Setup, config, model and credential locks enclose this complete transaction. */
6
+ export async function commitRuntimeSetupEdit(rootDir, files, commit, publishCommittedCredentials) {
7
+ const root = await realpath(rootDir);
8
+ requireRuntimeSetupEditSettled(root);
9
+ const journal = await createSetupEditJournal(root, files);
10
+ await writeSetupEditJournal(journal);
11
+ try {
12
+ await commit();
13
+ for (const file of journal.files) {
14
+ await requireSetupEditFileSnapshot(file.path, file.after);
15
+ await syncSetupEditFile(file.path);
16
+ }
17
+ await writeSetupEditJournal({ ...journal, phase: "committed" }, journal);
18
+ }
19
+ catch (error) {
20
+ try {
21
+ const persisted = await readSetupEditJournal(root);
22
+ if (persisted?.phase === "committed")
23
+ publishCommittedCredentials();
24
+ if (persisted)
25
+ await reconcileSetupEditJournal(persisted);
26
+ if (persisted?.phase === "committed")
27
+ return;
28
+ }
29
+ catch (recoveryError) {
30
+ throw new AggregateError([error, recoveryError], "Connection edit failed and needs recovery before it can be applied.");
31
+ }
32
+ throw error;
33
+ }
34
+ publishCommittedCredentials();
35
+ // A cleanup failure leaves a committed marker. Never roll it back.
36
+ await reconcileSetupEditJournal({ ...journal, phase: "committed" });
37
+ }
@@ -1,3 +1,4 @@
1
+ import { requireRuntimeSetupEditSettled } from "./runtime-setup-edit-recovery.js";
1
2
  import { readDefaultContextWindowTokens } from "../../../scripts/runtime-setup-files.js";
2
3
  import { initializeConfiguredRuntimeDirectories } from "../../../scripts/runtime-setup-directories.js";
3
4
  import { configuredSetupModel, requiresConfiguredCredential, } from "./runtime-setup-provider.js";
@@ -20,6 +21,7 @@ export class RuntimeSetupService {
20
21
  this.options = options;
21
22
  }
22
23
  source() {
24
+ requireRuntimeSetupEditSettled(this.options.rootDir);
23
25
  return inspectRuntimeConfigFileWithMeta(this.options.rootDir, this.savedConfigPath ?? this.options.getConfigPath());
24
26
  }
25
27
  async status() {
@@ -156,7 +158,9 @@ export class RuntimeSetupService {
156
158
  draft,
157
159
  input,
158
160
  credentialChanged,
161
+ credentialWrite,
159
162
  });
163
+ credentialsPersisted = true;
160
164
  draft = edited.draft;
161
165
  embeddingInvalidated = edited.embeddingInvalidated;
162
166
  }
@@ -3,6 +3,9 @@ import { LocalRuntimeApiRouter } from "./local-runtime/api-router.js";
3
3
  import { LocalRuntimeControlRoutes } from "./local-runtime/control-routes.js";
4
4
  import { RuntimeEnvironmentRegistry } from "./local-runtime/environment-registry.js";
5
5
  import { sendJson } from "./local-runtime/http.js";
6
+ import { RequestBodyInputError } from "./local-runtime/request-body-error.js";
7
+ import { RuntimeSetupError } from "./local-runtime/runtime-setup-input.js";
8
+ import { requireRuntimeSetupEditSettled } from "./local-runtime/runtime-setup-edit-recovery.js";
6
9
  import { LocalRealtimeController } from "./local-runtime/realtime-controller.js";
7
10
  import { RealtimeClientHub } from "./local-runtime/realtime-hub.js";
8
11
  import { LocalRequestExecution } from "./local-runtime/request-execution.js";
@@ -21,6 +24,7 @@ export class LocalRuntimeWebBackend {
21
24
  notifications;
22
25
  notificationRoutes;
23
26
  constructor(options) {
27
+ requireRuntimeSetupEditSettled(options.rootDir ?? process.cwd());
24
28
  const resolvedOptions = {
25
29
  ...options,
26
30
  providerAdapters: resolveProviderAdapters({
@@ -87,6 +91,16 @@ export class LocalRuntimeWebBackend {
87
91
  return false;
88
92
  }
89
93
  catch (error) {
94
+ const requiresSetupRecovery = error instanceof RuntimeSetupError &&
95
+ error.code === "setup_edit_recovery_required";
96
+ if (error instanceof RequestBodyInputError || requiresSetupRecovery) {
97
+ sendJson(res, error.statusCode, {
98
+ ok: false,
99
+ error: error.code,
100
+ message: error.message,
101
+ });
102
+ return true;
103
+ }
90
104
  sendJson(res, 500, {
91
105
  ok: false,
92
106
  error: "local_runtime_backend_error",
@@ -1,3 +1,4 @@
1
+ import { resolvePluginPlatformCompatibility } from "../runtime/plugins/platform-compatibility.js";
1
2
  import type { RuntimePluginConfig } from "../runtime/ports.js";
2
3
  import type { DiscoveredAgentPluginManifest } from "../runtime/plugins/discovered-manifest.js";
3
4
  import { type PluginSelection } from "../runtime/plugins/selection.js";
@@ -15,6 +16,7 @@ export type RuntimePluginSnapshot = {
15
16
  description?: string;
16
17
  version?: string;
17
18
  pluginEnabled: boolean;
19
+ compatibility: ReturnType<typeof resolvePluginPlatformCompatibility>;
18
20
  removable: boolean;
19
21
  configurable: boolean;
20
22
  capabilities: RuntimePluginCapabilitySnapshot[];
@@ -25,4 +27,4 @@ export type RuntimePluginSnapshot = {
25
27
  }>;
26
28
  application: "restart_required";
27
29
  };
28
- export declare function projectPluginSnapshot(manifests: readonly DiscoveredAgentPluginManifest[], config: RuntimePluginConfig, consumerRoot?: string): RuntimePluginSnapshot;
30
+ export declare function projectPluginSnapshot(manifests: readonly DiscoveredAgentPluginManifest[], config: RuntimePluginConfig, consumerRoot?: string, runtimePlatform?: NodeJS.Platform): RuntimePluginSnapshot;
@@ -1,3 +1,4 @@
1
+ import { resolvePluginPlatformCompatibility } from "../runtime/plugins/platform-compatibility.js";
1
2
  import { readPluginConfigurationStore } from "../runtime/plugins/configuration-store.js";
2
3
  import { hasConfigurablePluginValues } from "./plugin-configuration-view.js";
3
4
  import { installedPluginPackage } from "../runtime/plugins/installation/installed-package.js";
@@ -33,7 +34,7 @@ function projectPluginCapabilities(plugin, selection) {
33
34
  };
34
35
  });
35
36
  }
36
- export function projectPluginSnapshot(manifests, config, consumerRoot) {
37
+ export function projectPluginSnapshot(manifests, config, consumerRoot, runtimePlatform = process.platform) {
37
38
  const selection = normalizePluginSelection(config);
38
39
  const local = consumerRoot
39
40
  ? readPluginConfigurationStore(consumerRoot).plugins
@@ -47,6 +48,7 @@ export function projectPluginSnapshot(manifests, config, consumerRoot) {
47
48
  const selectedCapabilityCount = capabilities.filter((capability) => capability.enabled).length;
48
49
  return {
49
50
  id: manifest.name,
51
+ compatibility: resolvePluginPlatformCompatibility(manifest, runtimePlatform),
50
52
  configurable: hasConfigurablePluginValues(manifest.extensions[ABOT_RUNTIME_EXTENSION], Object.hasOwn(local, manifest.name)
51
53
  ? local[manifest.name]
52
54
  : undefined),
@@ -21,6 +21,7 @@ export declare function setRuntimePluginEnabled(options: PluginManagementOptions
21
21
  description?: string;
22
22
  version?: string;
23
23
  pluginEnabled: boolean;
24
+ compatibility: ReturnType<typeof import("../runtime/plugins/platform-compatibility.js").resolvePluginPlatformCompatibility>;
24
25
  removable: boolean;
25
26
  configurable: boolean;
26
27
  capabilities: import("./plugin-management-catalog.js").RuntimePluginCapabilitySnapshot[];
@@ -18,6 +18,7 @@ export declare function removeRuntimePlugin(options: PluginManagementOptions & P
18
18
  description?: string;
19
19
  version?: string;
20
20
  pluginEnabled: boolean;
21
+ compatibility: ReturnType<typeof import("../runtime/plugins/platform-compatibility.js").resolvePluginPlatformCompatibility>;
21
22
  removable: boolean;
22
23
  configurable: boolean;
23
24
  capabilities: import("./plugin-management-catalog.js").RuntimePluginCapabilitySnapshot[];
@@ -0,0 +1,3 @@
1
+ import type { Server } from "node:http";
2
+ /** Resolve the actual bound address, including when the caller requested port 0. */
3
+ export declare function waitForWebUiListening(server: Server, signal: AbortSignal): Promise<string>;
@@ -0,0 +1,36 @@
1
+ /** Resolve the actual bound address, including when the caller requested port 0. */
2
+ export function waitForWebUiListening(server, signal) {
3
+ return new Promise((resolve, reject) => {
4
+ const cleanup = () => {
5
+ server.off("listening", listening);
6
+ server.off("error", failed);
7
+ signal.removeEventListener("abort", aborted);
8
+ };
9
+ const failed = (error) => {
10
+ cleanup();
11
+ reject(error);
12
+ };
13
+ const aborted = () => failed(new Error("web_ui_closed_before_listening"));
14
+ const listening = () => {
15
+ const address = server.address();
16
+ if (!address || typeof address === "string") {
17
+ failed(new Error("web_ui_tcp_address_unavailable"));
18
+ return;
19
+ }
20
+ cleanup();
21
+ const host = address.family === "IPv6" ? `[${address.address}]` : address.address;
22
+ resolve(`http://${host}:${address.port}/`);
23
+ };
24
+ if (signal.aborted) {
25
+ aborted();
26
+ return;
27
+ }
28
+ if (server.listening) {
29
+ listening();
30
+ return;
31
+ }
32
+ server.once("listening", listening);
33
+ server.once("error", failed);
34
+ signal.addEventListener("abort", aborted, { once: true });
35
+ });
36
+ }
@@ -26,6 +26,8 @@ type WebUiServerOptions = {
26
26
  checkRuntimeSetupActivation?: (configPath: string) => Promise<RuntimeSetupActivation>;
27
27
  };
28
28
  type WebUiServerHandle = {
29
+ ready: () => Promise<string>;
29
30
  close: () => Promise<void>;
30
31
  };
31
32
  export declare function startWebUiServer(overrides?: WebUiServerOptions): WebUiServerHandle;
33
+ export declare function startWebUiServerWithRecovery(overrides?: WebUiServerOptions): Promise<WebUiServerHandle>;
@@ -9,8 +9,11 @@ import { resolveWebUiEnvironmentConfig, } from "./environment-config.js";
9
9
  export { resolveWebUiEnvironmentConfig, } from "./environment-config.js";
10
10
  import { closeRuntimeSetupServices } from "./runtime-setup-shutdown.js";
11
11
  import { loadDotEnvFile } from "../shared/load-dotenv.js";
12
+ import { waitForWebUiListening } from "./server-readiness.js";
13
+ import { recoverRuntimeSetupEdit, requireRuntimeSetupEditSettled, } from "./local-runtime/runtime-setup-edit-recovery.js";
12
14
  import { createWebUiShutdown } from "./server-shutdown.js";
13
15
  import { ExternalBridgeWebBackend } from "./external-bridge-backend.js";
16
+ import { WebClientStateRoutes } from "./client-state/routes.js";
14
17
  import { LocalRuntimeWebBackend } from "./local-runtime-backend.js";
15
18
  import { resolveWebUiAddress } from "./web-ui-address.js";
16
19
  import { createLinkPreviewRouteHandler } from "./link-preview/routes.js";
@@ -126,6 +129,12 @@ async function serveStatic(req, res, appDir) {
126
129
  sendJson(res, 404, { ok: false, error: "not_found" });
127
130
  }
128
131
  export function startWebUiServer(overrides = {}) {
132
+ const startupRoots = new Set([
133
+ process.cwd(),
134
+ overrides.rootDir ?? process.cwd(),
135
+ ]);
136
+ for (const rootDir of startupRoots)
137
+ requireRuntimeSetupEditSettled(rootDir);
129
138
  const envOptions = getOptionsFromEnv();
130
139
  const rootDir = overrides.rootDir ?? envOptions.rootDir;
131
140
  const configPath = overrides.configPath ?? envOptions.configPath;
@@ -206,6 +215,12 @@ export function startWebUiServer(overrides = {}) {
206
215
  });
207
216
  }
208
217
  const handleLinkPreview = createLinkPreviewRouteHandler();
218
+ const clientState = new WebClientStateRoutes(rootDir, () => {
219
+ for (const client of wss.clients) {
220
+ if (client.readyState === 1)
221
+ client.send(JSON.stringify({ type: "workspace_changed", resources: ["client-state"] }));
222
+ }
223
+ });
209
224
  const systemHost = localRuntimeBackend
210
225
  ? new WebSystemHostService(rootDir, () => localRuntimeBackend.notifyHostConnectionChanged(), (environmentId) => localRuntimeBackend.nativePermissions(environmentId))
211
226
  : null;
@@ -217,6 +232,8 @@ export function startWebUiServer(overrides = {}) {
217
232
  if (await handleLinkPreview(req, res))
218
233
  return;
219
234
  const pathname = new URL(req.url || "/", "http://localhost").pathname;
235
+ if (await clientState.handle(req, res, pathname))
236
+ return;
220
237
  if (await systemHost?.handleHttp(req, res, pathname))
221
238
  return;
222
239
  if (pathname === "/web-config") {
@@ -317,10 +334,15 @@ export function startWebUiServer(overrides = {}) {
317
334
  });
318
335
  const schedulerStartup = localRuntimeBackend?.start(options.environments.map(({ id }) => id));
319
336
  return {
337
+ ready: () => waitForWebUiListening(server, listenAbort.signal),
320
338
  close: createWebUiShutdown(server, wss, schedulerStartup, () => closeRuntimeSetupServices(async () => localRuntimeBackend?.stop(), () => setupGateway.close(), async () => systemHost?.close()), listenAbort),
321
339
  };
322
340
  }
341
+ export async function startWebUiServerWithRecovery(overrides = {}) {
342
+ await recoverRuntimeSetupEdit(overrides.rootDir ?? process.cwd());
343
+ return startWebUiServer(overrides);
344
+ }
323
345
  const invokedPath = process.argv[1] ? pathToFileURL(process.argv[1]).href : "";
324
346
  if (import.meta.url === invokedPath) {
325
- startWebUiServer();
347
+ await startWebUiServerWithRecovery();
326
348
  }
@@ -4,6 +4,9 @@ import { HostConnection } from "../computer-access/companion/connection.js";
4
4
  import { HostPairingStore } from "../computer-access/companion/pairing-store.js";
5
5
  import { startHostBroker } from "../computer-access/companion/broker-server.js";
6
6
  import { hostStateDirectory } from "../computer-access/companion/private-store.js";
7
+ import { readCollectionConsent } from "../computer-access/collection-consent.js";
8
+ import { readRuntimeCollectionSource } from "../computer-access/observation-source.js";
9
+ import { COLLECTION_CONSENT_PATH, handleCollectionConsent } from "./system-host-setup/collection-consent-route.js";
7
10
  import { HOST_SOCKET_PATH, HOST_WIRE_MAX_BYTES, } from "../computer-access/companion/protocol.js";
8
11
  import { isProcessOwnerAlive, requireCurrentProcessOwnerIdentity, } from "../computer-access/companion/process-owner-identity.js";
9
12
  import { ensurePrivateRuntimeDirectory } from "../runtime/local-host/private-directory.js";
@@ -21,6 +24,8 @@ import { NativeRuntimePermissionRoute } from "./system-host-setup/native-permiss
21
24
  function isSystemHostRoute(pathname) {
22
25
  if (pathname === "/web-api/runtime/system-host")
23
26
  return true;
27
+ if (pathname === COLLECTION_CONSENT_PATH)
28
+ return true;
24
29
  return pathname === "/web-api/runtime/system-host/pairing";
25
30
  }
26
31
  export class WebSystemHostService {
@@ -102,6 +107,10 @@ export class WebSystemHostService {
102
107
  return false;
103
108
  response.setHeader("cache-control", "no-store");
104
109
  try {
110
+ if (pathname === COLLECTION_CONSENT_PATH) {
111
+ await handleCollectionConsent(request, response, this.rootDir);
112
+ return true;
113
+ }
105
114
  if (pathname === HOST_PERMISSION_PATH) {
106
115
  await this.permissions.handle(request, response);
107
116
  return true;
@@ -115,7 +124,8 @@ export class WebSystemHostService {
115
124
  const status = this.connection.status();
116
125
  const readiness = withLocalMacSetup(request, await readHostReadiness(status));
117
126
  const nativePermissions = await this.nativePermissions.status(request);
118
- sendJson(response, 200, { ok: true, ...status, readiness, nativePermissions });
127
+ sendJson(response, 200, { ok: true, ...status, readiness, nativePermissions,
128
+ collectionSource: readRuntimeCollectionSource(), collectionConsent: readCollectionConsent(this.rootDir) });
119
129
  return true;
120
130
  }
121
131
  if (!acceptConfigMutationRequest(request, response))
@@ -145,7 +155,8 @@ export class WebSystemHostService {
145
155
  this.connection.disconnect();
146
156
  const status = this.connection.status();
147
157
  sendJson(response, 200, { ok: true, ...status,
148
- readiness: withLocalMacSetup(request, await readHostReadiness(status)) });
158
+ readiness: withLocalMacSetup(request, await readHostReadiness(status)),
159
+ collectionSource: readRuntimeCollectionSource(), collectionConsent: readCollectionConsent(this.rootDir) });
149
160
  return true;
150
161
  }
151
162
  sendJson(response, 405, { ok: false, error: "method_not_allowed" });
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ export declare const COLLECTION_CONSENT_PATH = "/web-api/runtime/system-host/collection-consent";
3
+ export declare function handleCollectionConsent(request: IncomingMessage, response: ServerResponse, rootDir: string): Promise<void>;
@@ -0,0 +1,30 @@
1
+ import { acceptCollectionConsent } from "../../computer-access/collection-consent.js";
2
+ import { acceptConfigMutationRequest } from "../local-runtime/config-mutation-request.js";
3
+ import { readBody, sendJson } from "../local-runtime/http.js";
4
+ export const COLLECTION_CONSENT_PATH = "/web-api/runtime/system-host/collection-consent";
5
+ function hasExplicitCollectionAcknowledgment(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value))
7
+ return false;
8
+ if (Object.keys(value).length !== 1)
9
+ return false;
10
+ return value.acknowledged === true;
11
+ }
12
+ export async function handleCollectionConsent(request, response, rootDir) {
13
+ if (request.method !== "POST") {
14
+ sendJson(response, 405, { ok: false, error: "method_not_allowed" });
15
+ return;
16
+ }
17
+ if (!acceptConfigMutationRequest(request, response))
18
+ return;
19
+ let body;
20
+ try {
21
+ body = JSON.parse((await readBody(request, { maxBytes: 1_024 })).toString());
22
+ }
23
+ catch { /* malformed or oversized input is rejected below */ }
24
+ if (!hasExplicitCollectionAcknowledgment(body)) {
25
+ sendJson(response, 400, { ok: false, error: "invalid_collection_acknowledgment" });
26
+ return;
27
+ }
28
+ const collectionConsent = await acceptCollectionConsent(rootDir);
29
+ sendJson(response, 200, { ok: true, collectionConsent });
30
+ }
@@ -140,12 +140,35 @@ See [Passive Long-Term Memory](long-term-memory.md) before enabling persistence.
140
140
 
141
141
  ### Computer Access During Setup
142
142
 
143
- The optional **Computer** step and **Home → Computer access** manage one
144
- Computer access connection shared by SYSTEM tools, ABot Spark and compatible
145
- plugins. Direct native/WSL command access can already work; the shared companion
146
- adds desktop access and background collection without a second ABot Spark setup.
143
+ The **Computer** step and computer card on **Home** use the platform where the
144
+ Runtime is running. Direct native/WSL command access can already work; compatible
145
+ plugins still require their own permissions.
147
146
 
148
- #### Windows: Microsoft Store connection
147
+ #### Native Windows
148
+
149
+ When the Runtime runs directly on Windows, computer setup does not require
150
+ Companion or a pairing link. Compatible tools run locally with their existing
151
+ approval controls. Spark uses the same Windows collection implementation locally.
152
+ Opening a WSL or Docker Runtime in a Windows browser still uses the Companion
153
+ connection described below.
154
+
155
+ #### Spark collection acknowledgment
156
+
157
+ On every platform, Spark asks for an explicit, initially unchecked acknowledgment
158
+ before granting collection permission or starting collection. It explains the
159
+ application content collected and how the configured learning model may receive
160
+ it, with links to the [Software Terms](https://abot-ai.com/terms/#software) and
161
+ [Privacy Policy](https://abot-ai.com/privacy/#software).
162
+
163
+ The acknowledgment is saved once per ABot installation, shared across environments,
164
+ and retained across updates and computer re-pairing. Existing installations also
165
+ need to acknowledge it once. This record does not enable collection or learning:
166
+ activity permissions and Start/Stop remain separate. Previously enabled collection
167
+ resumes after a Runtime restart according to its saved schedule and permissions.
168
+ Where Companion is required, connect the computer as an additional step before
169
+ starting collection.
170
+
171
+ #### Windows computer connected to WSL or Docker: Microsoft Store connection
149
172
 
150
173
  **ABot AI Companion** is available from
151
174
  [Microsoft Store](https://apps.microsoft.com/detail/9PK2FDQQLQS9).
@@ -187,6 +210,22 @@ computer and enables startup at sign-in. This path does not download a Finder
187
210
  installer or require an Apple Developer account. Use **Repair Mac connection**
188
211
  to repair or update an existing connection while retaining its pairing.
189
212
 
213
+ After updating and restarting Runtime, an already connected Mac may still have
214
+ an older Marketplace installation-link handler. If **Repair Mac connection** is not
215
+ offered, use the updated CLI on that Mac to refresh the connection:
216
+
217
+ ```sh
218
+ abot host status
219
+ abot host connect --url '<url from host status>'
220
+ ```
221
+
222
+ For a project-local installation, run both commands as `npx --no-install abot ...`
223
+ from that project instead. Use the exact saved `url` reported by `host status`,
224
+ not a new address. This reuses the existing pairing, refreshes the managed
225
+ Companion and link handler, and briefly reconnects Computer Access. Do not run
226
+ `disconnect` first. Then retry the Marketplace link: it opens plugin review,
227
+ not an automatic installation.
228
+
190
229
  For a Mac connecting to a Docker or forwarded Runtime, choose **Connect a Mac**.
191
230
  Install the ABot CLI on that Mac, run the displayed `abot host connect --url ...`
192
231
  command in its graphical login, then paste the one-time code when Terminal asks.