@abot-ai/runtime 1.7.0 → 1.8.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 (443) hide show
  1. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  2. package/dist/src/cli/abot.js +2 -0
  3. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  4. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  5. package/dist/src/computer-access/collection-consent.js +47 -0
  6. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  7. package/dist/src/computer-access/command-output-capture.js +134 -68
  8. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  9. package/dist/src/computer-access/command-output-protection.js +59 -0
  10. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  11. package/dist/src/computer-access/companion/command-output.js +23 -6
  12. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  13. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  14. package/dist/src/computer-access/companion/native-session.js +6 -2
  15. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  16. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  17. package/dist/src/computer-access/companion/observation-process.js +51 -25
  18. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  19. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  20. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  21. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  22. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  23. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  24. package/dist/src/computer-access/handlers.d.ts +2 -1
  25. package/dist/src/computer-access/handlers.js +79 -11
  26. package/dist/src/computer-access/host-observation.d.ts +3 -3
  27. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  28. package/dist/src/computer-access/native-observation-connection.js +78 -0
  29. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  30. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  31. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  32. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  33. package/dist/src/computer-access/observation-source.d.ts +6 -0
  34. package/dist/src/computer-access/observation-source.js +10 -0
  35. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  36. package/dist/src/computer-access/security/desktop-result.js +146 -0
  37. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  38. package/dist/src/computer-access/security/observed-error.js +10 -0
  39. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  40. package/dist/src/computer-access/security/secret-text.js +111 -0
  41. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  42. package/dist/src/computer-access/security/system-results.js +53 -0
  43. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  44. package/dist/src/computer-access/system-result-protection.js +1 -0
  45. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  46. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  47. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  48. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  49. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  50. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  51. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  52. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  53. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  54. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  55. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  56. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  57. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  58. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  59. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  60. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  61. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  62. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  63. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  64. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  65. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  66. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  67. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  68. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  69. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  70. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  71. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  72. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  73. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  74. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  75. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  76. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  77. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  78. package/dist/src/model-gateway/server.js +5 -1
  79. package/dist/src/plugin-contract/index.d.ts +1 -0
  80. package/dist/src/plugin-contract/index.js +1 -0
  81. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  82. package/dist/src/plugin-contract/manifest.js +1 -0
  83. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  84. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  85. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  86. package/dist/src/plugin-sdk/computer-access.js +1 -0
  87. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  88. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  89. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  90. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  91. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  92. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  93. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  94. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  95. package/dist/src/plugin-sdk/files.js +4 -0
  96. package/dist/src/plugin-sdk/index.d.ts +1 -0
  97. package/dist/src/plugin-sdk/index.js +1 -0
  98. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  99. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  100. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  101. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  102. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  103. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  104. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  105. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  106. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  107. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  108. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  109. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  110. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  111. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  112. package/dist/src/runtime/passive-learning/service.js +2 -3
  113. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  114. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  115. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  116. package/dist/src/runtime/plugins/installation/package.js +2 -0
  117. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  118. package/dist/src/runtime/plugins/loader.js +24 -14
  119. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  120. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  121. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  122. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  123. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  124. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  125. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  126. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  127. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  128. package/dist/src/runtime/request/prepared-execution.js +3 -0
  129. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  130. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  131. package/dist/src/runtime/steps/execution-agent/format.js +2 -3
  132. package/dist/src/runtime/steps/execution-agent/input.js +1 -1
  133. package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
  134. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  135. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  136. package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
  137. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  138. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  139. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  140. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  141. package/dist/src/sessions/durable-session-commit.js +3 -3
  142. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  143. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  144. package/dist/src/sessions/session-store.js +3 -3
  145. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  146. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  147. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  148. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  149. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  150. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  151. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  152. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  153. package/dist/src/shared/windows-job-object.d.ts +2 -0
  154. package/dist/src/shared/windows-job-object.js +66 -0
  155. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  156. package/dist/src/web-ui/app/app-state.js +0 -7
  157. package/dist/src/web-ui/app/app.js +53 -156
  158. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  159. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  160. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  161. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  162. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  163. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  164. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  165. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  166. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  167. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  168. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  169. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  170. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  171. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  172. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  173. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  174. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  175. package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
  176. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  177. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  178. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  179. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  180. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  181. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  182. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  183. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  184. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  185. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  186. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  187. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  188. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  189. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  190. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  191. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  192. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  193. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  194. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  195. package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
  196. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  197. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  198. package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
  199. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  200. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  201. package/dist/src/web-ui/app/configuration-feature.js +9 -1
  202. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  203. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  204. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  205. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  206. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  207. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  208. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  209. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  210. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  211. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  212. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  213. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  214. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  215. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  216. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  217. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  218. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  219. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  220. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  221. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  222. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  223. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  224. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  225. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  226. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  227. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  228. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  229. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  230. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  231. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  232. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  233. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  234. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  235. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  236. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  237. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  238. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  239. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  240. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  241. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  242. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  243. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  244. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  245. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  246. package/dist/src/web-ui/app/dashboard-feature.js +3 -2
  247. package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
  248. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  249. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  250. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  251. package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
  252. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  253. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  254. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  255. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  256. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  257. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  258. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  259. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  260. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  261. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  262. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  263. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  264. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  265. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  266. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  267. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  268. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  269. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  270. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  271. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  272. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  273. package/dist/src/web-ui/app/styles.css +2 -0
  274. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  275. package/dist/src/web-ui/client-state/contracts.js +13 -0
  276. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  277. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  278. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  279. package/dist/src/web-ui/client-state/preferences.js +84 -0
  280. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  281. package/dist/src/web-ui/client-state/queue.js +43 -0
  282. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  283. package/dist/src/web-ui/client-state/routes.js +58 -0
  284. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  285. package/dist/src/web-ui/client-state/store.js +88 -0
  286. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  287. package/dist/src/web-ui/local-runtime/http.js +11 -2
  288. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  289. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  290. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  291. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  292. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  293. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  294. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  295. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  296. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  297. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  298. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  299. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  300. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  301. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  302. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  303. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  304. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  305. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  306. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  307. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  308. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  309. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  310. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  311. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  312. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  313. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  314. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  315. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  316. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  317. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  318. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  319. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  320. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  321. package/dist/src/web-ui/server-readiness.js +36 -0
  322. package/dist/src/web-ui/server.d.ts +2 -0
  323. package/dist/src/web-ui/server.js +23 -1
  324. package/dist/src/web-ui/system-host-service.js +13 -2
  325. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  326. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  327. package/docs/installation.md +44 -5
  328. package/docs/plugins.md +145 -4
  329. package/docs/tool-execution-result-evidence-contract.md +57 -0
  330. package/docs/windows-companion-store.md +5 -0
  331. package/package.json +4 -2
  332. package/plugins/capability-brief/plugin.json +4 -0
  333. package/plugins/code-outline/README.md +20 -0
  334. package/plugins/code-outline/plugin.json +1 -0
  335. package/plugins/code-outline/source/index.ts +16 -20
  336. package/plugins/code-outline/source/read-failure.ts +40 -0
  337. package/plugins/code-outline/src/index.cjs +614 -29
  338. package/plugins/document-reader/README.md +33 -0
  339. package/plugins/document-reader/plugin.json +1 -0
  340. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  341. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  342. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  343. package/plugins/document-reader/source/pdf-process.ts +207 -0
  344. package/plugins/document-reader/source/pdf-result.ts +79 -0
  345. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  346. package/plugins/document-reader/source/pdf.ts +4 -1
  347. package/plugins/document-reader/source/read-failure.ts +37 -0
  348. package/plugins/document-reader/source/reader.ts +3 -19
  349. package/plugins/document-reader/src/index.cjs +995 -211
  350. package/plugins/exec/README.md +19 -0
  351. package/plugins/exec/plugin.json +4 -3
  352. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  353. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  354. package/plugins/exec/source/filesystem-observer.ts +8 -79
  355. package/plugins/exec/source/output-files.ts +12 -6
  356. package/plugins/exec/source/paths.ts +3 -1
  357. package/plugins/exec/source/process-manager.ts +8 -24
  358. package/plugins/exec/source/shell-platform.ts +19 -3
  359. package/plugins/exec/source/shell-process.ts +55 -0
  360. package/plugins/exec/source/windows-job-source.ts +1 -0
  361. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  362. package/plugins/exec/src/index.cjs +252 -96
  363. package/plugins/filesystem/README.md +65 -0
  364. package/plugins/filesystem/plugin.json +6 -2
  365. package/plugins/filesystem/source/atomic-write.ts +2 -0
  366. package/plugins/filesystem/source/bounded-io.ts +80 -306
  367. package/plugins/filesystem/source/directory-sample.ts +2 -0
  368. package/plugins/filesystem/source/errors.ts +14 -0
  369. package/plugins/filesystem/source/file-observation.ts +151 -0
  370. package/plugins/filesystem/source/file-version.ts +41 -0
  371. package/plugins/filesystem/source/index.ts +6 -0
  372. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  373. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  374. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  375. package/plugins/filesystem/source/windows/operations.ts +197 -0
  376. package/plugins/filesystem/source/windows/process.ts +214 -0
  377. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  378. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  379. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  380. package/plugins/filesystem/source/windows/source.ts +42 -0
  381. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  382. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  383. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  384. package/plugins/filesystem/src/index.cjs +1208 -322
  385. package/plugins/json-inspector/README.md +18 -0
  386. package/plugins/json-inspector/plugin.json +1 -0
  387. package/plugins/json-inspector/source/index.ts +16 -19
  388. package/plugins/json-inspector/source/read-failure.ts +42 -0
  389. package/plugins/json-inspector/src/index.cjs +612 -27
  390. package/plugins/local-search/README.md +29 -0
  391. package/plugins/local-search/plugin.json +1 -0
  392. package/plugins/local-search/source/errors.ts +2 -0
  393. package/plugins/local-search/source/paths.ts +3 -0
  394. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  395. package/plugins/local-search/source/ripgrep.ts +3 -3
  396. package/plugins/local-search/source/windows-authority.ts +99 -0
  397. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  398. package/plugins/local-search/source/windows-search-process.ts +91 -0
  399. package/plugins/local-search/source/windows-search-script.ts +52 -0
  400. package/plugins/local-search/src/index.cjs +595 -26
  401. package/plugins/memory/plugin.json +4 -0
  402. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  403. package/plugins/memory/source/lock-owner-file.ts +71 -0
  404. package/plugins/memory/source/lock-path-observation.ts +26 -0
  405. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  406. package/plugins/memory/source/store-lock.ts +12 -7
  407. package/plugins/memory/source/store.ts +3 -2
  408. package/plugins/memory/src/index.cjs +174 -25
  409. package/plugins/project-orientation/README.md +23 -0
  410. package/plugins/project-orientation/plugin.json +1 -0
  411. package/plugins/project-orientation/source/index.ts +12 -9
  412. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  413. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  414. package/plugins/project-orientation/source/tree.ts +6 -0
  415. package/plugins/project-orientation/src/index.cjs +647 -31
  416. package/plugins/system/README.md +51 -15
  417. package/plugins/system/plugin.json +5 -1
  418. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  419. package/plugins/system/source/command-working-directory.ts +47 -0
  420. package/plugins/system/source/computer/handlers.ts +13 -9
  421. package/plugins/system/source/computer/observation-result.ts +10 -5
  422. package/plugins/system/source/computer/request-computers.ts +10 -3
  423. package/plugins/system/source/computer/request-modules.ts +3 -6
  424. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  425. package/plugins/system/source/host-dispatch.ts +18 -2
  426. package/plugins/system/source/index.ts +5 -3
  427. package/plugins/system/source/local-command-output-retention.ts +16 -0
  428. package/plugins/system/source/local-command-output.ts +16 -8
  429. package/plugins/system/source/request-system-modules.ts +12 -2
  430. package/plugins/system/source/request-target-snapshot.ts +2 -1
  431. package/plugins/system/source/security/desktop-result.ts +177 -0
  432. package/plugins/system/source/security/observed-error.ts +10 -0
  433. package/plugins/system/source/security/secret-text.ts +118 -0
  434. package/plugins/system/source/security/system-results.ts +62 -0
  435. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  436. package/plugins/system/src/index.cjs +837 -151
  437. package/plugins/system-probe/plugin.json +8 -2
  438. package/plugins/system-probe/source/disk-path.ts +8 -0
  439. package/plugins/system-probe/source/index.ts +10 -5
  440. package/plugins/system-probe/source/machine-load.ts +33 -0
  441. package/plugins/system-probe/source/metrics.ts +6 -8
  442. package/plugins/system-probe/src/index.cjs +49 -16
  443. package/plugins/web/plugin.json +4 -0
@@ -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.
package/docs/plugins.md CHANGED
@@ -237,12 +237,71 @@ options, or skill lists in `runtime.config.json`. Installing or changing a
237
237
  plugin means changing its package under `plugins/`; runtime config only decides
238
238
  whether that installed capability is available.
239
239
 
240
+ ## Runtime Platform Compatibility
241
+
242
+ A plugin can declare where its code can run using a separate manifest extension:
243
+ `extensions["ai.abot.compatibility"] = { "version": 1, "runtimePlatforms": ["linux", "darwin"] }`.
244
+ The executable `ai.abot.runtime` extension remains at version 1.
245
+
246
+ `runtimePlatforms` is a non-empty, duplicate-free list of Node platform names:
247
+ `linux`, `darwin` (macOS), or `win32` (Windows). Unsupported versions, platform
248
+ names and fields are rejected. Declare only platforms on which the complete
249
+ plugin can safely load; individual operations may still require permissions,
250
+ external programs or a connected computer.
251
+
252
+ The declaration describes the **Runtime host**, not the browser or the computer
253
+ controlled by a tool. A Linux Runtime in WSL or a Linux Docker container remains
254
+ `linux`, including when SYSTEM controls a Windows Companion. It does not grant
255
+ permissions or replace the tool's request-time target checks.
256
+
257
+ Hosts with this compatibility support apply the following policy before resolving
258
+ plugin settings/secrets or importing executable plugin code:
259
+
260
+ - A declared matching platform can load, subject to the existing saved selection.
261
+ - A declared non-matching platform cannot load.
262
+ - Without a declaration, existing non-Windows behavior is preserved. Native
263
+ Windows reports **Compatibility not declared** and does not load the plugin.
264
+
265
+ Installed, onboarding and model-selection views show compatibility separately
266
+ from saved plugin/tool selection. Changing hosts does not rewrite saved selection
267
+ or erase settings and keys. An incompatible package remains inspectable,
268
+ configurable and removable. It can be installed for later use on a supported
269
+ host; the review and installation result explain that it will not load here.
270
+ Applying configuration cannot bypass the loader gate.
271
+
272
+ **Older hosts:** ABot 1.7.0 accepts and preserves additional extension namespaces
273
+ but does not enforce this declaration. Its existing behavior remains unchanged.
274
+ This metadata is not an enforcement guarantee on older hosts, nor a claim that
275
+ ABot 1.7.0 or its bundled plugins support native Windows. Existing bundled plugin
276
+ manifests are not certified for Windows by this contract change.
277
+
278
+ The required `windows-compatibility` CI job builds the Runtime, checks types and
279
+ plugin packages, and runs the focused platform contract and loader suites on
280
+ Windows with Node 24. It complements the Linux validation and macOS Companion
281
+ checks; it does not certify all native Windows tool operations or Store packaging.
282
+
240
283
  ## Manifest Contract
241
284
 
242
285
  `@abot-ai/runtime/plugin-sdk` is the single public plugin-authoring entrypoint. It
243
286
  exports the manifest constants and types, entrypoint contract, and bounded
244
287
  authoring helpers consumed by plugin implementations.
245
288
 
289
+ The SDK's `readBoundedRegularFile(path, { rootPath, maxBytes, signal })` reads one
290
+ regular file within its authorized root and returns bounded bytes or a typed
291
+ refusal. On native Windows, it uses the same C# handle primitives as `filesystem`,
292
+ compiled by the built-in Windows PowerShell for each read. Root and file identity
293
+ are checked before reading; traversal rejects reparse points beneath the root,
294
+ including junctions. Binary content and documents up to 10 MiB are covered by
295
+ native tests; each caller still sets its own size limit. Linux/macOS retain the
296
+ existing no-follow file-descriptor path.
297
+
298
+ A Windows policy or compiler restriction returns `safe_open_unsupported`. Plugins
299
+ must report that safe reading is unavailable and avoid automatic retries or a
300
+ less restricted fallback. Cancellation stops the helper and throws `AbortError`;
301
+ a helper deadline (15 seconds) or ordinary I/O failure remains an explicit error.
302
+ This SDK support does not enable Windows compatibility in a plugin manifest.
303
+ Each plugin must still declare and validate its own Windows support.
304
+
246
305
  The manifest follows the Agent Plugins 1.0 package shape and keeps the local
247
306
  executable contract under `extensions.ai.abot.runtime`:
248
307
 
@@ -364,10 +423,14 @@ receive it. Planner uses this same brief instead of a separate aggregate-tag
364
423
  catalog. Its existing group-selection schema and Worker scope enforcement stay
365
424
  unchanged; descriptions do not select a group or execute an operation.
366
425
 
367
- Under `execution-agent-v1`, the canonical root receives group descriptions
368
- generated from member capability ids and summaries, and may mechanically open
369
- or extend its own RoleCall scope.
370
- It then selects a concrete capability only from that active scope. Scope
426
+ Under `execution-agent-v1`, the canonical root receives every group and member
427
+ in ASCII order on each decision, and may mechanically open or extend its own
428
+ RoleCall scope. A capability's exact summary appears as `capabilityId: summary`
429
+ at its first group membership; later memberships contain only its id, referring
430
+ to that definition. The first group has no selection priority. Descriptions
431
+ are neither sampled, truncated, nor synthesized. The active catalog supplies
432
+ each capability's id and effect; its selection controls remain in the decision
433
+ schema. It then selects a concrete capability only from that active scope. Scope
371
434
  updates, capability binding, payload authoring, adapter execution, and
372
435
  settlement use the same ledger and capability engine as delegated Worker
373
436
  execution. Unknown, empty, invalid, repeated, or no-op scopes are rejected
@@ -492,6 +555,36 @@ they must not include secrets and they never act as instructions, new user
492
555
  intent, or proof that the whole request completed. See
493
556
  [tool-execution-result-evidence-contract.md](tool-execution-result-evidence-contract.md).
494
557
 
558
+ ### Reporting a confirmed mutation
559
+
560
+ Use `successResult()` for ordinary successful observations. After the owning
561
+ plugin has confirmed a completed mutation, use `mutationSuccessResult()` to
562
+ preserve its receipt and add the Runtime's required `data.mutationEvidence: true`:
563
+
564
+ ```ts
565
+ import { mutationSuccessResult } from "@abot-ai/runtime/plugin-sdk";
566
+
567
+ // apiReceipt is the result of a completed write already confirmed by this handler.
568
+ return mutationSuccessResult({
569
+ output: "The article was published.",
570
+ data: apiReceipt,
571
+ }, context.resultBudget);
572
+ ```
573
+
574
+ The helper does not execute the operation or independently verify its effect.
575
+ Do not use it for a failed, ambiguous, pending, or no-op operation. It retains
576
+ the same JSON and result-size bounds as `successResult()`; a rejected receipt
577
+ returns a failure without asserting mutation evidence. The existing generic
578
+ helper does not infer a mutation from `ok`, `progress`, prose, or the presence of
579
+ arbitrary data. Explicit `actions`, `progress`, and other result fields remain
580
+ available to the owning plugin.
581
+
582
+ The adapter records operation outcome separately from observed effect.
583
+ For a `mutating` operation, `ok: true` without `mutationEvidence: true` is
584
+ classified as `mutation_evidence_missing`. The new helper supplies that marker
585
+ after the plugin has established the evidence; it does not change the Runtime's
586
+ classification rules or prove completion of the user's whole request.
587
+
495
588
  ### EXEC output storage
496
589
 
497
590
  EXEC captures stdout and stderr in private files under its injected `stateDir`.
@@ -654,6 +747,54 @@ counts imply full-file coverage.
654
747
 
655
748
  No concrete tool or skill mapping should be added anywhere under `src/runtime`.
656
749
 
750
+ ### Native Windows plugin support
751
+
752
+ The native Windows group contains `capability-brief`, `code-outline`,
753
+ `document-reader`, `exec`, `filesystem`, `json-inspector`, `local-search`, `memory`, `web`,
754
+ `project-orientation`, `system-probe`, and `system`.
755
+ Each declares `win32` in its versioned
756
+ `ai.abot.compatibility` extension, alongside its existing Linux and macOS support.
757
+ Compatibility uses the Runtime process OS, not the browser or a paired computer.
758
+ A Windows-only plugin should declare only `win32`; other hosts will not load it.
759
+
760
+ On native Windows, SYSTEM provides `system_targets`, `system_command`,
761
+ `system_applications`, and `system_launch`. Commands run in local PowerShell and
762
+ retain existing approvals, cancellation, and protected output handling. Desktop
763
+ observation and input (`computer_*`) are excluded from the request catalog in
764
+ this phase. Linux/macOS Runtime and WSL/Docker Companion routes retain their
765
+ existing capabilities. This phase does not add screenshot OCR.
766
+
767
+ `system-probe` reports Windows load averages as unsupported instead of presenting
768
+ the OS's placeholder zeros as measured load. Its default disk probe uses the
769
+ Runtime installation's filesystem; an explicit path selects that path's volume.
770
+
771
+ `code-outline` uses the SDK's bounded file reader on Windows, with the same
772
+ authorized roots, parser and output limits as Linux/macOS. If safe reading is
773
+ unavailable, it reports the restriction explicitly and tells the model not to
774
+ retry or bypass it. See [Code Outline](../plugins/code-outline/README.md).
775
+
776
+ `document-reader` uses the SDK's bounded Windows reader for configured paths
777
+ and request attachments, with shared text, Office and PDF parsers and limits.
778
+ A blocked reader reports an explicit no-retry restriction.
779
+ See [Document Reader](../plugins/document-reader/README.md).
780
+
781
+ `json-inspector` uses the SDK's bounded Windows reader with the existing path,
782
+ UTF-8, size and summary limits. A blocked reader reports an explicit no-retry
783
+ restriction. See [JSON Inspector](../plugins/json-inspector/README.md).
784
+
785
+ `project-orientation` uses the SDK's bounded Windows reader for package
786
+ metadata and retains its existing directory-tree and result limits. Blocked
787
+ manifest reads return an explicit no-retry restriction.
788
+ See [Project Orientation](../plugins/project-orientation/README.md).
789
+
790
+ `local-search` uses native Windows ripgrep through a PowerShell/C# helper that
791
+ pins the selected path and owns the child process through a Job Object. Existing
792
+ query, output, timeout and cancellation limits still apply. A blocked helper
793
+ fails explicitly without a retry or policy bypass.
794
+ See [Local Search](../plugins/local-search/README.md).
795
+
796
+ Enabling manifests alone is not a validation step.
797
+
657
798
  ### Shared Computer access
658
799
 
659
800
  Plugins that need host facilities can import the opt-in