@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
@@ -3,10 +3,12 @@ import { open } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { directorySnapshot, fileSystemErrorCode, LEASE_DIRECTORY_NAME, MAX_LOCK_RECORD_BYTES, } from "./contracts.js";
5
5
  import { isLockOwnerIdentity } from "./owner-identity.js";
6
+ import { observeLockReadFailure } from "./path-observation.js";
6
7
  export async function readOwnerRecord(lockPath, entryName, expectedToken, directoryModifiedAtMs) {
7
8
  let handle;
8
9
  try {
9
- handle = await open(join(lockPath, LEASE_DIRECTORY_NAME, entryName), constants.O_RDONLY | constants.O_NOFOLLOW);
10
+ const ownerPath = join(lockPath, LEASE_DIRECTORY_NAME, entryName);
11
+ handle = await open(ownerPath, constants.O_RDONLY | constants.O_NOFOLLOW).catch(async (error) => { throw await observeLockReadFailure(ownerPath, error); });
10
12
  const before = await handle.stat({ bigint: true });
11
13
  const modifiedAtMs = Math.max(directoryModifiedAtMs, Number(before.mtimeMs));
12
14
  const hasReadableRecord = before.isFile() &&
@@ -0,0 +1,3 @@
1
+ /** Only confirmed disappearance can normalize a Windows pending-delete denial. */
2
+ export declare function observeLockReadFailure(path: string, error: unknown): Promise<unknown>;
3
+ export declare function isWindowsLockReadDenial(error: unknown): boolean;
@@ -0,0 +1,20 @@
1
+ import { lstat } from "node:fs/promises";
2
+ import { fileSystemErrorCode } from "./contracts.js";
3
+ /** Only confirmed disappearance can normalize a Windows pending-delete denial. */
4
+ export async function observeLockReadFailure(path, error) {
5
+ if (!isWindowsLockReadDenial(error))
6
+ return error;
7
+ try {
8
+ await lstat(path);
9
+ }
10
+ catch (observedError) {
11
+ if (fileSystemErrorCode(observedError) === "ENOENT")
12
+ return observedError;
13
+ }
14
+ return error;
15
+ }
16
+ export function isWindowsLockReadDenial(error) {
17
+ if (process.platform !== "win32")
18
+ return false;
19
+ return fileSystemErrorCode(error) === "EPERM";
20
+ }
@@ -2,6 +2,7 @@ import { lstat, readdir } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { directorySnapshot, fileSystemErrorCode, LEASE_DIRECTORY_NAME, OWNER_FILE_PATTERN, } from "./contracts.js";
4
4
  import { readOwnerRecord } from "./owner-record.js";
5
+ import { observeLockReadFailure } from "./path-observation.js";
5
6
  export async function readLockSnapshot(lockPath) {
6
7
  const lockInfo = await readLockInfo(lockPath);
7
8
  if (!lockInfo)
@@ -13,7 +14,8 @@ export async function readLockSnapshot(lockPath) {
13
14
  try {
14
15
  lockEntries = await readdir(lockPath, { withFileTypes: true });
15
16
  }
16
- catch (error) {
17
+ catch (readError) {
18
+ const error = await observeLockReadFailure(lockPath, readError);
17
19
  const code = fileSystemErrorCode(error);
18
20
  if (code === "ENOENT")
19
21
  return undefined;
@@ -45,7 +47,8 @@ async function readLockInfo(lockPath) {
45
47
  try {
46
48
  return await lstat(lockPath);
47
49
  }
48
- catch (error) {
50
+ catch (readError) {
51
+ const error = await observeLockReadFailure(lockPath, readError);
49
52
  if (fileSystemErrorCode(error) === "ENOENT")
50
53
  return undefined;
51
54
  throw error;
@@ -62,7 +65,8 @@ async function readLeaseSnapshot(lockPath, lockModifiedAtMs) {
62
65
  }
63
66
  leaseEntries = await readdir(leasePath, { withFileTypes: true });
64
67
  }
65
- catch (error) {
68
+ catch (readError) {
69
+ const error = await observeLockReadFailure(leasePath, readError);
66
70
  if (fileSystemErrorCode(error) === "ENOENT") {
67
71
  return invalidLeaseSnapshot(lockModifiedAtMs);
68
72
  }
@@ -1,7 +1,7 @@
1
1
  import type { RuntimeConfig, ModelGatewayClient, SessionStore } from "../ports.js";
2
2
  import type { LongTermMemoryService } from "../long-term-memory/contracts.js";
3
3
  import type { SessionRequestAdmission } from "../request/session-admission.js";
4
- /** The environment owns learning; the paired desktop owns native collection. */
4
+ /** The environment owns learning; the collection adapter owns the selected desktop source. */
5
5
  export declare function createRuntimePassiveLearning(params: {
6
6
  config: RuntimeConfig;
7
7
  models: ModelGatewayClient;
@@ -1,10 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { join } from "node:path";
3
- import { connectHostObservations } from "../../computer-access/companion/observation-client.js";
3
+ import { connectRuntimeObservations } from "./runtime-observation-connection.js";
4
4
  import { createPassiveLearningService } from "../passive-learning/service.js";
5
5
  import { createRuntimePassiveLearningModel } from "../passive-learning/model.js";
6
6
  import { createCoWorkerResourceDependencies } from "./co-worker-resources.js";
7
- /** The environment owns learning; the paired desktop owns native collection. */
7
+ /** The environment owns learning; the collection adapter owns the selected desktop source. */
8
8
  export function createRuntimePassiveLearning(params) {
9
9
  const { config, models, memory } = params;
10
10
  const ownerId = createHash("sha256")
@@ -19,7 +19,7 @@ export function createRuntimePassiveLearning(params) {
19
19
  config, models, memory, context, ownerId, directory: join(config.paths.runtimeDir, "passive-learning"),
20
20
  sessions: params.sessions, deliveryAdmission: params.deliveryAdmission,
21
21
  }),
22
- connect: (input) => connectHostObservations({
22
+ connect: (input) => connectRuntimeObservations({
23
23
  ...input,
24
24
  ownerId,
25
25
  rootDir: config.paths.rootDir,
@@ -0,0 +1,5 @@
1
+ import type { HostObservationSubscription } from "../../shared/passive-observation.js";
2
+ /** Installation consent gates every collection route before transport or helper startup. */
3
+ export declare function connectRuntimeObservations(options: HostObservationSubscription): Promise<Readonly<{
4
+ close(): void;
5
+ }>>;
@@ -0,0 +1,13 @@
1
+ import { connectHostObservations } from "../../computer-access/companion/observation-client.js";
2
+ import { connectNativeObservations } from "../../computer-access/native-observation-connection.js";
3
+ import { requireCollectionConsent } from "../../computer-access/collection-consent.js";
4
+ import { readRuntimeCollectionSource } from "../../computer-access/observation-source.js";
5
+ /** Installation consent gates every collection route before transport or helper startup. */
6
+ export async function connectRuntimeObservations(options) {
7
+ options.abortSignal.throwIfAborted();
8
+ await requireCollectionConsent(options.rootDir);
9
+ options.abortSignal.throwIfAborted();
10
+ if (readRuntimeCollectionSource().mode === "native")
11
+ return connectNativeObservations(options);
12
+ return connectHostObservations(options);
13
+ }
@@ -2,7 +2,9 @@ import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  const execute = promisify(execFile);
4
4
  // Paths travel through an environment value, never through shell interpolation.
5
+ // PowerShell 7 callers can pass incompatible modules to Windows PowerShell 5.1.
5
6
  const privateAccessScript = `
7
+ $env:PSModulePath = "$PSHOME\\Modules"
6
8
  $ErrorActionPreference = 'Stop'
7
9
  $target = $env:ABOT_LOCAL_HOST_PRIVATE_PATH
8
10
  $current = [System.Security.Principal.WindowsIdentity]::GetCurrent().User
@@ -1,4 +1,5 @@
1
1
  import { isLearningApplicationExcluded, learningApplicationKey } from "./application-policy.js";
2
+ import { isOwnObservationApplication } from "../../shared/passive-observation-self-exclusion.js";
2
3
  /** Derived metadata only; counts cover retained observations, never lifetime usage. */
3
4
  export function learningApplicationCatalog(queued, history, preferences) {
4
5
  const rows = new Map();
@@ -18,7 +19,8 @@ export function learningApplicationCatalog(queued, history, preferences) {
18
19
  row.lastObservedAt = observation.timestamp;
19
20
  rows.set(key, row);
20
21
  }
21
- const summaries = [...rows.values()].map((row) => ({ ...row,
22
+ const configurable = [...rows.values()].filter((row) => !isOwnObservationApplication(learningApplicationKey(row.app)));
23
+ const summaries = configurable.map((row) => ({ ...row,
22
24
  collectionExcluded: isLearningApplicationExcluded(row.app, preferences.excludedApplications),
23
25
  processingExcluded: isLearningApplicationExcluded(row.app, preferences.processingExcludedApplications),
24
26
  }));
@@ -12,6 +12,11 @@ function shouldReconnectCollectionSource(event) {
12
12
  return true;
13
13
  return event.reason === "collector_start_failed";
14
14
  }
15
+ function requiresCollectionConsent(error) {
16
+ if (!(error instanceof Error))
17
+ return false;
18
+ return error.message === "collection_consent_required";
19
+ }
15
20
  function hasHealthyCollectionEvent(event) {
16
21
  if (event.type === "observation")
17
22
  return true;
@@ -66,6 +71,8 @@ export class LearningCollectionSource {
66
71
  if (abort.signal.aborted)
67
72
  return;
68
73
  this.options.failed(error);
74
+ if (requiresCollectionConsent(error))
75
+ return;
69
76
  this.reconnect();
70
77
  }
71
78
  }
@@ -16,7 +16,7 @@ import { LearningJournal } from "./journal.js";
16
16
  import { ObservationQueue } from "./queue.js";
17
17
  import { canProcessLearningObservation, isLearningApplicationExcluded } from "./application-policy.js";
18
18
  import { commitLearningApplicationPreferences } from "./application-controls.js";
19
- import { learningFailureReason, summarizeBatch, } from "./status-projection.js";
19
+ import { learningFailureReason, learningCollectionFailureState, summarizeBatch, } from "./status-projection.js";
20
20
  import { DEFAULT_LEARNING_PREFERENCES, normalizeLearningPreferences, } from "./store.js";
21
21
  export function createPassiveLearningService(options) {
22
22
  const service = new LearningService(options);
@@ -447,8 +447,7 @@ class LearningService {
447
447
  }
448
448
  failFeature(error) {
449
449
  this.reason = learningFailureReason(error);
450
- this.state =
451
- this.reason === "learning_host_unavailable" ? "unavailable" : "failed";
450
+ this.state = learningCollectionFailureState(this.reason);
452
451
  this.changed();
453
452
  }
454
453
  failProcessing(error) {
@@ -1,3 +1,4 @@
1
+ import type { PassiveCollectionState } from "../../shared/passive-observation.js";
1
2
  import type { LongTermMemoryService } from "../long-term-memory/contracts.js";
2
3
  import type { LearningBatch, LearningBatchSummary } from "./contracts.js";
3
4
  export declare function summarizeBatch({ observations, reviewProgress: _reviewProgress, ...summary }: LearningBatch): LearningBatchSummary;
@@ -7,4 +8,5 @@ export declare function recentLearningMemories(memory: LongTermMemoryService, hi
7
8
  content: string;
8
9
  createdAt: string;
9
10
  }>[]>;
11
+ export declare function learningCollectionFailureState(reason: string): PassiveCollectionState;
10
12
  export declare function learningFailureReason(error: unknown): string;
@@ -36,6 +36,13 @@ export async function recentLearningMemories(memory, history) {
36
36
  return [];
37
37
  }
38
38
  }
39
+ export function learningCollectionFailureState(reason) {
40
+ if (reason === "collection_consent_required")
41
+ return "permission_required";
42
+ if (reason === "learning_host_unavailable")
43
+ return "unavailable";
44
+ return "failed";
45
+ }
39
46
  export function learningFailureReason(error) {
40
47
  if (!(error instanceof Error))
41
48
  return "learning_failed";
@@ -48,6 +55,8 @@ export function learningFailureReason(error) {
48
55
  "learning_model_profile_overridden",
49
56
  "learning_memory_unavailable",
50
57
  "learning_host_unavailable",
58
+ "collection_consent_required",
59
+ "native_observation_identity_invalid",
51
60
  "learning_storage_unavailable",
52
61
  "learning_batch_timeout",
53
62
  "learning_disabled",
@@ -10,6 +10,7 @@ export declare function preparePluginPackage(rootDir: string, source: PluginInst
10
10
  description?: string;
11
11
  extensions: Readonly<{
12
12
  [ABOT_RUNTIME_EXTENSION]: import("../../../plugin-contract/manifest.js").AbotRuntimePluginExtension;
13
+ ["ai.abot.compatibility"]?: import("../../../plugin-contract/platform-compatibility.js").PluginPlatformDeclaration;
13
14
  [namespace: string]: unknown;
14
15
  }>;
15
16
  }>;
@@ -23,6 +24,13 @@ export declare function preparePluginPackage(rootDir: string, source: PluginInst
23
24
  };
24
25
  digest: string;
25
26
  id: string;
27
+ compatibility: Readonly<{
28
+ supported: boolean;
29
+ status: "declared" | "legacy" | "unsupported" | "undeclared";
30
+ runtimePlatform: NodeJS.Platform;
31
+ runtimePlatforms?: readonly import("../../../plugin-contract/platform-compatibility.js").PluginRuntimePlatform[];
32
+ reason?: string;
33
+ }>;
26
34
  version: string;
27
35
  description: string;
28
36
  capabilities: {
@@ -2,6 +2,7 @@ import { mkdtemp, readFile, readdir, rm } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { PluginInstallError, } from "../../../plugin-contract/install-source.js";
4
4
  import { ABOT_RUNTIME_EXTENSION } from "../../../plugin-contract/manifest.js";
5
+ import { resolvePluginPlatformCompatibility } from "../platform-compatibility.js";
5
6
  import { parseAgentPluginManifest } from "../manifest-validator.js";
6
7
  import { projectManifestRuntimeContract } from "../manifest-projection.js";
7
8
  import { discoverConfiguredRuntimePluginManifests } from "../configured-manifests.js";
@@ -42,6 +43,7 @@ export async function preparePluginPackage(rootDir, source, download = downloadG
42
43
  source: downloaded.source,
43
44
  digest,
44
45
  id: manifest.name,
46
+ compatibility: resolvePluginPlatformCompatibility(manifest),
45
47
  version: manifest.version ?? "",
46
48
  description: manifest.description ?? "",
47
49
  capabilities: capabilities.map((id) => ({
@@ -10,6 +10,13 @@ export declare function inspectPluginPackage(rootDir: string, input: unknown, do
10
10
  };
11
11
  digest: string;
12
12
  id: string;
13
+ compatibility: Readonly<{
14
+ supported: boolean;
15
+ status: "declared" | "legacy" | "unsupported" | "undeclared";
16
+ runtimePlatform: NodeJS.Platform;
17
+ runtimePlatforms?: readonly import("../../../plugin-contract/platform-compatibility.js").PluginRuntimePlatform[];
18
+ reason?: string;
19
+ }>;
13
20
  version: string;
14
21
  description: string;
15
22
  capabilities: {
@@ -11,6 +11,7 @@ import { discoverAgentPluginManifests } from "./manifest-discovery.js";
11
11
  import { resolveBundledRuntimeRoot } from "./bundled-root.js";
12
12
  import { projectManifestRuntimeContract } from "./manifest-projection.js";
13
13
  import { discoverConfiguredRuntimePluginManifests } from "./configured-manifests.js";
14
+ import { resolvePluginPlatformCompatibility } from "./platform-compatibility.js";
14
15
  import { isPluginCatalogDisabled, isPluginToolSelected, normalizePluginSelection, pluginSelectionCacheKey, } from "./selection.js";
15
16
  const require = createRequire(import.meta.url);
16
17
  const compiledCatalogCache = new WeakMap();
@@ -110,20 +111,15 @@ export function loadConfiguredRuntimePlugins(config) {
110
111
  if (cached) {
111
112
  return cached;
112
113
  }
113
- const host = {
114
- rootDir: config.paths.rootDir,
115
- pluginConfiguration: readPluginConfigurationStore(config.paths.rootDir)
116
- .plugins,
117
- runtimeId: config.runtimeId,
118
- agentBridgeUrl: config.agentBridgeUrl,
119
- runtimePaths: config.paths,
120
- };
121
- const manifestPlugins = discoverConfiguredRuntimePluginManifests(config.paths.rootDir, {
114
+ const discoveredPlugins = discoverConfiguredRuntimePluginManifests(config.paths.rootDir, {
122
115
  excludedPluginIds: new Set([
123
116
  ...selection.deny,
124
117
  ...selection.disabledPluginIds,
125
118
  ]),
126
- })
119
+ });
120
+ const compatiblePlugins = discoveredPlugins.filter((plugin) => resolvePluginPlatformCompatibility(plugin.manifest).supported);
121
+ const allPluginsIncompatible = discoveredPlugins.length > 0 && compatiblePlugins.length === 0;
122
+ const selectedPlugins = compatiblePlugins
127
123
  .map((plugin) => ({
128
124
  plugin,
129
125
  selectedCapabilityIds: Object.keys(plugin.manifest.extensions[ABOT_RUNTIME_EXTENSION].capabilities).filter((capabilityId) => isPluginToolSelected({
@@ -132,8 +128,17 @@ export function loadConfiguredRuntimePlugins(config) {
132
128
  selection,
133
129
  })),
134
130
  }))
135
- .filter(({ selectedCapabilityIds }) => selectedCapabilityIds.length > 0)
136
- .map(({ plugin, selectedCapabilityIds }) => loadManifestRuntimePlugin(host, plugin, selectedCapabilityIds));
131
+ .filter(({ selectedCapabilityIds }) => selectedCapabilityIds.length > 0);
132
+ const host = {
133
+ rootDir: config.paths.rootDir,
134
+ pluginConfiguration: allPluginsIncompatible
135
+ ? {}
136
+ : readPluginConfigurationStore(config.paths.rootDir).plugins,
137
+ runtimeId: config.runtimeId,
138
+ agentBridgeUrl: config.agentBridgeUrl,
139
+ runtimePaths: config.paths,
140
+ };
141
+ const manifestPlugins = selectedPlugins.map(({ plugin, selectedCapabilityIds }) => loadManifestRuntimePlugin(host, plugin, selectedCapabilityIds));
137
142
  const pluginIds = new Set();
138
143
  for (const plugin of manifestPlugins) {
139
144
  if (pluginIds.has(plugin.id)) {
@@ -175,14 +180,19 @@ export function loadBundledRuntimePlugins() {
175
180
  if (cached) {
176
181
  return cached;
177
182
  }
183
+ const discoveredPlugins = discoverAgentPluginManifests(packageRoot);
184
+ const selectedPlugins = discoveredPlugins.filter((plugin) => resolvePluginPlatformCompatibility(plugin.manifest).supported);
185
+ const allPluginsIncompatible = discoveredPlugins.length > 0 && selectedPlugins.length === 0;
178
186
  const host = {
179
187
  rootDir,
180
- pluginConfiguration: readPluginConfigurationStore(rootDir).plugins,
188
+ pluginConfiguration: allPluginsIncompatible
189
+ ? {}
190
+ : readPluginConfigurationStore(rootDir).plugins,
181
191
  runtimeId: "default",
182
192
  agentBridgeUrl: "",
183
193
  runtimePaths: createUnconfiguredRuntimePaths(rootDir),
184
194
  };
185
- const catalog = Object.freeze(discoverAgentPluginManifests(packageRoot).map((plugin) => freezeRuntimePlugin(loadManifestRuntimePlugin(host, plugin, Object.keys(plugin.manifest.extensions[ABOT_RUNTIME_EXTENSION].capabilities)))));
195
+ const catalog = Object.freeze(selectedPlugins.map((plugin) => freezeRuntimePlugin(loadManifestRuntimePlugin(host, plugin, Object.keys(plugin.manifest.extensions[ABOT_RUNTIME_EXTENSION].capabilities)))));
186
196
  bundledCatalogCache.set(cacheKey, catalog);
187
197
  return catalog;
188
198
  }
@@ -0,0 +1,2 @@
1
+ import { type PluginPlatformDeclaration } from "../../plugin-contract/platform-compatibility.js";
2
+ export declare function parsePluginPlatformDeclaration(value: unknown): PluginPlatformDeclaration | undefined;
@@ -0,0 +1,39 @@
1
+ import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION, ABOT_PLUGIN_COMPATIBILITY_VERSION, PLUGIN_RUNTIME_PLATFORMS, } from "../../plugin-contract/platform-compatibility.js";
2
+ import { isRecord } from "../config/utils.js";
3
+ function hasUnknownCompatibilityField(value) {
4
+ return Object.keys(value).some((key) => key !== "version" && key !== "runtimePlatforms");
5
+ }
6
+ function isRuntimePlatformList(value) {
7
+ if (!Array.isArray(value))
8
+ return false;
9
+ if (value.length === 0)
10
+ return false;
11
+ return value.length <= PLUGIN_RUNTIME_PLATFORMS.length;
12
+ }
13
+ function isPluginRuntimePlatform(value) {
14
+ return PLUGIN_RUNTIME_PLATFORMS.some((platform) => platform === value);
15
+ }
16
+ function hasRepeatedRuntimePlatform(platforms) {
17
+ return new Set(platforms).size !== platforms.length;
18
+ }
19
+ export function parsePluginPlatformDeclaration(value) {
20
+ if (value === undefined)
21
+ return undefined;
22
+ const path = `extensions.${ABOT_PLUGIN_COMPATIBILITY_EXTENSION}`;
23
+ if (!isRecord(value))
24
+ throw new Error(`${path} must be an object`);
25
+ if (hasUnknownCompatibilityField(value))
26
+ throw new Error(`${path} contains an unknown field`);
27
+ if (value.version !== ABOT_PLUGIN_COMPATIBILITY_VERSION)
28
+ throw new Error(`${path}.version must be ${ABOT_PLUGIN_COMPATIBILITY_VERSION}`);
29
+ if (!isRuntimePlatformList(value.runtimePlatforms))
30
+ throw new Error(`${path}.runtimePlatforms must contain one to three platforms`);
31
+ if (!value.runtimePlatforms.every(isPluginRuntimePlatform))
32
+ throw new Error(`${path}.runtimePlatforms must use linux, darwin, or win32`);
33
+ if (hasRepeatedRuntimePlatform(value.runtimePlatforms))
34
+ throw new Error(`${path}.runtimePlatforms must not contain duplicates`);
35
+ return Object.freeze({
36
+ version: ABOT_PLUGIN_COMPATIBILITY_VERSION,
37
+ runtimePlatforms: Object.freeze([...value.runtimePlatforms]),
38
+ });
39
+ }
@@ -1,5 +1,7 @@
1
1
  import { parseOptionalToolOutputChannels } from "../../capabilities/normal-invocation/output-channels.js";
2
2
  import { parseRequiredToolPermissionMode } from "../../capabilities/tool-permission-mode.js";
3
+ import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION } from "../../plugin-contract/platform-compatibility.js";
4
+ import { parsePluginPlatformDeclaration } from "./manifest-platform-compatibility.js";
3
5
  import { isToolCatalogGroupId } from "../../capabilities/tool-types.js";
4
6
  import { parseEventResultMetadata } from "../../capabilities/tool-definition-validator/event-result-metadata.js";
5
7
  import { parseEventInputTextOptions } from "../../capabilities/tool-definition-validator/event-input-text-options.js";
@@ -321,7 +323,9 @@ function parseOperation(value, path) {
321
323
  ? { payload: payload }
322
324
  : {}),
323
325
  ...(attachmentInput
324
- ? { attachmentInput: attachmentInput }
326
+ ? {
327
+ attachmentInput: attachmentInput,
328
+ }
325
329
  : {}),
326
330
  },
327
331
  ...(legacySkills ? { legacySkills } : {}),
@@ -481,6 +485,7 @@ export function parseAgentPluginManifest(raw, folderName) {
481
485
  }
482
486
  const extensions = expectRecord(manifest.extensions, "plugin.json.extensions");
483
487
  const runtimeExtension = parseRuntimeExtension(extensions[ABOT_RUNTIME_EXTENSION]);
488
+ const compatibility = parsePluginPlatformDeclaration(extensions[ABOT_PLUGIN_COMPATIBILITY_EXTENSION]);
484
489
  return {
485
490
  $schema: AGENT_PLUGIN_MANIFEST_SCHEMA,
486
491
  name: manifest.name,
@@ -493,6 +498,9 @@ export function parseAgentPluginManifest(raw, folderName) {
493
498
  extensions: {
494
499
  ...extensions,
495
500
  [ABOT_RUNTIME_EXTENSION]: runtimeExtension,
501
+ ...(compatibility
502
+ ? { [ABOT_PLUGIN_COMPATIBILITY_EXTENSION]: compatibility }
503
+ : {}),
496
504
  },
497
505
  };
498
506
  }
@@ -0,0 +1,4 @@
1
+ import type { AgentPluginManifest } from "../../plugin-contract/manifest.js";
2
+ import { type PluginPlatformCompatibility } from "../../plugin-contract/platform-compatibility.js";
3
+ /** Compatibility affects loading, never the user's saved plugin selection. */
4
+ export declare function resolvePluginPlatformCompatibility(manifest: AgentPluginManifest, runtimePlatform?: NodeJS.Platform): PluginPlatformCompatibility;
@@ -0,0 +1,44 @@
1
+ import { ABOT_PLUGIN_COMPATIBILITY_EXTENSION, } from "../../plugin-contract/platform-compatibility.js";
2
+ function runtimePlatformName(platform) {
3
+ if (platform === "win32")
4
+ return "Windows";
5
+ if (platform === "darwin")
6
+ return "macOS";
7
+ if (platform === "linux")
8
+ return "Linux";
9
+ return platform;
10
+ }
11
+ function supportsDeclaredRuntimePlatform(declaration, runtimePlatform) {
12
+ return declaration.runtimePlatforms.some((platform) => platform === runtimePlatform);
13
+ }
14
+ function undeclaredPlatformCompatibility(runtimePlatform) {
15
+ if (runtimePlatform === "win32")
16
+ return {
17
+ supported: false,
18
+ status: "undeclared",
19
+ runtimePlatform,
20
+ reason: "This plugin does not declare support for Windows Runtime.",
21
+ };
22
+ return { supported: true, status: "legacy", runtimePlatform };
23
+ }
24
+ /** Compatibility affects loading, never the user's saved plugin selection. */
25
+ export function resolvePluginPlatformCompatibility(manifest, runtimePlatform = process.platform) {
26
+ const declaration = manifest.extensions[ABOT_PLUGIN_COMPATIBILITY_EXTENSION];
27
+ if (!declaration)
28
+ return undeclaredPlatformCompatibility(runtimePlatform);
29
+ const runtimePlatforms = declaration.runtimePlatforms;
30
+ if (supportsDeclaredRuntimePlatform(declaration, runtimePlatform))
31
+ return {
32
+ supported: true,
33
+ status: "declared",
34
+ runtimePlatform,
35
+ runtimePlatforms,
36
+ };
37
+ return {
38
+ supported: false,
39
+ status: "unsupported",
40
+ runtimePlatform,
41
+ runtimePlatforms,
42
+ reason: `This plugin supports Runtime on ${runtimePlatforms.map(runtimePlatformName).join(", ")}; this Runtime is running on ${runtimePlatformName(runtimePlatform)}.`,
43
+ };
44
+ }
@@ -45,13 +45,22 @@ export class RequestActivationEvents {
45
45
  }
46
46
  async commit(operation) {
47
47
  await this.events.drain();
48
- const result = await operation(this.expectation());
49
- if (!result.accepted)
50
- throw new Error(`request_lifecycle_rejected:${result.reason}`);
51
- this.current = result.current;
52
- this.sealed = result.current.status !== "streaming";
53
- this.publishCommitted(result.events);
54
- return result;
48
+ // Draining is an observation, not a queue reservation: steering can emit
49
+ // another event before this continuation runs. Claim this same queue before
50
+ // reading the revision so no event can race the lifecycle commit.
51
+ const committed = this.tail.then(async () => {
52
+ if (this.persistenceError)
53
+ throw this.persistenceError;
54
+ const result = await operation(this.expectation());
55
+ if (!result.accepted)
56
+ throw new Error(`request_lifecycle_rejected:${result.reason}`);
57
+ this.current = result.current;
58
+ this.sealed = result.current.status !== "streaming";
59
+ this.publishCommitted(result.events);
60
+ return result;
61
+ });
62
+ this.tail = committed.then(() => undefined, () => undefined);
63
+ return committed;
55
64
  }
56
65
  /** A failed event write cannot turn a committed wait into an execution failure. */
57
66
  async finalizeFailure(input) {
@@ -115,6 +124,9 @@ export class RequestActivationEvents {
115
124
  return;
116
125
  this.tail = this.tail
117
126
  .then(async () => {
127
+ const hasStreamingActivation = this.current.status === "streaming";
128
+ if (!hasStreamingActivation)
129
+ return;
118
130
  if (this.persistenceError)
119
131
  return;
120
132
  const result = await this.store.appendActivationEvent(this.current.sessionId, {
@@ -0,0 +1,20 @@
1
+ import type { RequestContextCompactionSnapshot } from "../../context/semantic-compaction/snapshot.js";
2
+ import type { SemanticCompactionSource } from "../../context/semantic-compaction/contracts.js";
3
+ import type { RoleCallLedgerCheckpoint } from "../../orchestration/role-calls/checkpoint.js";
4
+ import type { CompiledRequestExecutionPolicy } from "../execution-scope.js";
5
+ /** Invalidate only proven legacy EA projections; the ledger retains the original evidence. */
6
+ export declare function restoreExecutionApprovalCompaction(params: {
7
+ snapshot: RequestContextCompactionSnapshot;
8
+ ledgerCheckpoint: RoleCallLedgerCheckpoint;
9
+ requestId: string;
10
+ executionPolicy: CompiledRequestExecutionPolicy;
11
+ }): Readonly<{
12
+ snapshot?(): RequestContextCompactionSnapshot;
13
+ get(scopeId: string): import("../../context/semantic-compaction/contracts.js").SemanticCompactionCheckpoint | undefined;
14
+ findByCallIds(callIds: readonly string[]): readonly import("../../context/semantic-compaction/contracts.js").SemanticCompactionCheckpoint[];
15
+ registerSources(sources: readonly SemanticCompactionSource[]): void;
16
+ registerSourcesAtomically?(sources: readonly SemanticCompactionSource[]): void;
17
+ quarantineScope?(record: import("../../context/semantic-compaction/scope-quarantine.js").InvalidatedCompactionScope): void;
18
+ materializeSource(sourceRef: string, sourceFingerprint: string): SemanticCompactionSource | undefined;
19
+ commit(checkpoint: import("../../context/semantic-compaction/contracts.js").SemanticCompactionCheckpoint): void;
20
+ }>;