@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
@@ -34,12 +34,19 @@ export function startDesktopCollector(options) {
34
34
  const command = desktopCollectorCommand(options.platform ?? process.platform);
35
35
  let child;
36
36
  let closed = false;
37
+ let stopped = false;
38
+ const confirmStopped = () => {
39
+ if (stopped)
40
+ return;
41
+ stopped = true;
42
+ options.onStopped?.();
43
+ };
37
44
  let received = Buffer.alloc(0);
38
45
  let terminalStatus = false;
39
46
  const filter = new ObservationFilter(options.excludedApplications);
40
47
  const close = () => {
41
48
  closed = true;
42
- if (!child?.pid)
49
+ if (stopped || !child?.pid)
43
50
  return;
44
51
  // POSIX language launchers can spawn an interpreter; stop the entire owned process group.
45
52
  if (process.platform !== "win32") {
@@ -59,6 +66,7 @@ export function startDesktopCollector(options) {
59
66
  state: "unavailable",
60
67
  reason: "platform_unsupported",
61
68
  });
69
+ confirmStopped();
62
70
  return { close };
63
71
  }
64
72
  if (process.platform === "darwin") {
@@ -77,19 +85,28 @@ export function startDesktopCollector(options) {
77
85
  state: "unavailable",
78
86
  reason: "macos_swift_tools_unavailable",
79
87
  });
88
+ confirmStopped();
80
89
  return { close };
81
90
  }
82
91
  }
83
92
  options.onEvent({ type: "status", state: "starting" });
84
- child = (options.spawnProcess ?? spawn)(command.file, command.args, {
85
- windowsHide: true,
86
- detached: process.platform !== "win32",
87
- stdio: ["pipe", "pipe", "pipe"],
88
- env: {
89
- ...process.env,
90
- ABOT_OBSERVATION_EXCLUSIONS: JSON.stringify(options.excludedApplications),
91
- },
92
- });
93
+ try {
94
+ child = (options.spawnProcess ?? spawn)(command.file, command.args, {
95
+ windowsHide: true,
96
+ detached: process.platform !== "win32",
97
+ stdio: ["pipe", "pipe", "pipe"],
98
+ env: {
99
+ ...process.env,
100
+ ABOT_OBSERVATION_EXCLUSIONS: JSON.stringify(options.excludedApplications),
101
+ },
102
+ });
103
+ }
104
+ catch {
105
+ options.onEvent({ type: "status", state: "failed", reason: "collector_start_failed" });
106
+ closed = true;
107
+ confirmStopped();
108
+ return { close };
109
+ }
93
110
  child.stdin?.on("error", () => { });
94
111
  child.stdin?.end(command.input);
95
112
  // Compiler/dependency diagnostics can contain local paths. Never forward them into model or general logs.
@@ -130,25 +147,34 @@ export function startDesktopCollector(options) {
130
147
  }
131
148
  });
132
149
  child.once("error", () => {
133
- if (closed)
134
- return;
135
- options.onEvent({
136
- type: "status",
137
- state: "unavailable",
138
- reason: "collector_dependency_unavailable",
139
- });
140
- close();
141
- });
142
- child.once("exit", (code) => {
143
- if (closed)
144
- return;
145
- if (!terminalStatus)
150
+ try {
151
+ if (closed)
152
+ return;
146
153
  options.onEvent({
147
154
  type: "status",
148
155
  state: "unavailable",
149
- reason: code === 0 ? "collector_stopped" : "collector_start_failed",
156
+ reason: "collector_dependency_unavailable",
150
157
  });
151
- close();
158
+ close();
159
+ }
160
+ finally {
161
+ if (!child?.pid)
162
+ confirmStopped();
163
+ }
164
+ });
165
+ child.once("exit", (code) => {
166
+ try {
167
+ if (!closed && !terminalStatus)
168
+ options.onEvent({
169
+ type: "status",
170
+ state: "unavailable",
171
+ reason: code === 0 ? "collector_stopped" : "collector_start_failed",
172
+ });
173
+ }
174
+ finally {
175
+ closed = true;
176
+ confirmStopped();
177
+ }
152
178
  });
153
179
  return { close };
154
180
  }
@@ -1,9 +1,4 @@
1
1
  import type { PassiveObservationSource } from "../../shared/passive-observation.js";
2
- /**
3
- * Mask the entire field when a known secret indicator is present, including
4
- * surrounding useful text. No value boundaries or source-language grammar are
5
- * inferred. Unlabelled arbitrary secrets and unknown encodings remain outside
6
- * detection; this is not a guarantee that unchanged text contains no secrets.
7
- */
8
- export declare function redactObservationText(input: string): string;
2
+ import { redactSecretText as redactObservationText } from "../security/secret-text.js";
3
+ export { redactObservationText };
9
4
  export declare function redactObservationSource(source: PassiveObservationSource, sourceKey: string): PassiveObservationSource;
@@ -1,114 +1,5 @@
1
- const REDACTED = "[REDACTED]";
2
- const CREDENTIAL_KEY_SOURCE = String.raw `(?:[A-Za-z][A-Za-z0-9_-]*\.)*(?:[A-Za-z][A-Za-z0-9]*[-_])*(?:password|passwd|pwd|api[_ -]?key|access[_ -]?token|refresh[_ -]?token|client[_ -]?secret|secret[_ -]?access[_ -]?key|recovery[_ -]?code)`;
3
- const credentialIndicator = new RegExp(String.raw `(?<![\p{L}\p{N}_.-])(?:-{1,2})?(?:${CREDENTIAL_KEY_SOURCE}|(?:proxy-)?authorization)[\s"'\\]*[:=]`, "iu");
4
- /** Detection only: normalize ASCII encodings once, without interpreting a language. */
5
- function detectionText(input) {
6
- const percentDecoded = input.replace(/%([0-7][0-9a-f])/giu, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
7
- return percentDecoded.replace(/\\(?:u00|x|U000000)([0-7][0-9a-fA-F])/gu, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
8
- }
9
- function hasPrivateKeyIndicator(text) {
10
- return /-----BEGIN (?:[A-Z0-9]+ )*PRIVATE KEY(?: BLOCK)?-----/u.test(text);
11
- }
12
- function hasUrlCredentials(text) {
13
- return /\b[a-z][a-z0-9+.-]*(?::|%3a)(?:\/|%2f){2}[^\s/?#<>]*(?:@|%40)/iu.test(text);
14
- }
15
- function hasAuthorizationCredentials(text) {
16
- for (const match of text.matchAll(/\b(Bearer|Basic)[ \t]+([A-Za-z0-9._~+/-]+={0,2})/giu)) {
17
- if (match[1].toLowerCase() === "bearer")
18
- return true;
19
- const value = match[2];
20
- if (!/^[A-Za-z0-9+/]+={0,2}$/u.test(value))
21
- continue;
22
- if (value.length < 8)
23
- continue;
24
- if (Buffer.from(value, "base64").toString("utf8").includes(":"))
25
- return true;
26
- }
27
- return false;
28
- }
29
- function isAwsAccessKeyValue(value, atEnd) {
30
- if (/^[A-Z0-9]{16}$/u.test(value))
31
- return true;
32
- if (!atEnd)
33
- return false;
34
- return /^[A-Z0-9]{4,15}$/u.test(value);
35
- }
36
- function isRecognizedProviderToken(prefix, value, atEnd) {
37
- if (prefix === "AKIA" || prefix === "ASIA")
38
- return isAwsAccessKeyValue(value, atEnd);
39
- if (value.length >= 20)
40
- return true;
41
- const partialMinimum = prefix === "sk-" ? 8 : 1;
42
- return atEnd && value.length >= partialMinimum;
43
- }
44
- function hasProviderToken(text) {
45
- const provider = /\b(sk-(?:proj-|svcacct-)?|gh[pousr]_|github_pat_|xox[baprs]-|AKIA|ASIA)([A-Za-z0-9_-]+)/gu;
46
- for (const match of text.matchAll(provider)) {
47
- const atEnd = match.index + match[0].length === text.length;
48
- if (isRecognizedProviderToken(match[1], match[2], atEnd))
49
- return true;
50
- }
51
- return false;
52
- }
53
- function compactJoseSegmentCount(header) {
54
- try {
55
- const value = JSON.parse(Buffer.from(header, "base64url").toString("utf8"));
56
- if (typeof value !== "object" || value === null || Array.isArray(value))
57
- return undefined;
58
- const fields = value;
59
- if (typeof fields.alg !== "string")
60
- return undefined;
61
- return typeof fields.enc === "string" ? 5 : 3;
62
- }
63
- catch {
64
- return undefined;
65
- }
66
- }
67
- function hasCompactJoseToken(text) {
68
- const jose = /\b([A-Za-z0-9_-]+)(?:\.[A-Za-z0-9_-]*)+/gu;
69
- for (const match of text.matchAll(jose)) {
70
- const parts = match[0].split(".");
71
- const capturedAtEnd = match.index + match[0].length === text.length;
72
- for (let index = 0; index < parts.length - 1; index += 1) {
73
- const expected = compactJoseSegmentCount(parts[index]);
74
- if (expected === undefined)
75
- continue;
76
- if (expected === 3 && parts[index + 1] === "")
77
- continue;
78
- if (parts.length - index >= expected)
79
- return true;
80
- if (capturedAtEnd)
81
- return true;
82
- }
83
- }
84
- return false;
85
- }
86
- function hasSecretIndicator(text) {
87
- if (credentialIndicator.test(text))
88
- return true;
89
- if (hasPrivateKeyIndicator(text))
90
- return true;
91
- if (hasUrlCredentials(text))
92
- return true;
93
- if (hasAuthorizationCredentials(text))
94
- return true;
95
- if (hasProviderToken(text))
96
- return true;
97
- return hasCompactJoseToken(text);
98
- }
99
- /**
100
- * Mask the entire field when a known secret indicator is present, including
101
- * surrounding useful text. No value boundaries or source-language grammar are
102
- * inferred. Unlabelled arbitrary secrets and unknown encodings remain outside
103
- * detection; this is not a guarantee that unchanged text contains no secrets.
104
- */
105
- export function redactObservationText(input) {
106
- if (hasSecretIndicator(input))
107
- return REDACTED;
108
- if (hasSecretIndicator(detectionText(input)))
109
- return REDACTED;
110
- return input;
111
- }
1
+ import { redactSecretText as redactObservationText } from "../security/secret-text.js";
2
+ export { redactObservationText };
112
3
  export function redactObservationSource(source, sourceKey) {
113
4
  const redacted = {
114
5
  app: redactObservationText(source.app).slice(0, 128),
@@ -0,0 +1,6 @@
1
+ /** Host-side observed-text protection before delivery, projection and transport.
2
+ * Command capture may temporarily retain unchecked bytes in private local files.
3
+ * Version 1 covers text and metadata; images are withheld when their associated
4
+ * text is suspect. It does not assert OCR or pixel-content inspection.
5
+ */
6
+ export declare const HOST_SECRET_PROTECTION_CAPABILITY = "host_secret_protection_v1";
@@ -0,0 +1,6 @@
1
+ /** Host-side observed-text protection before delivery, projection and transport.
2
+ * Command capture may temporarily retain unchecked bytes in private local files.
3
+ * Version 1 covers text and metadata; images are withheld when their associated
4
+ * text is suspect. It does not assert OCR or pixel-content inspection.
5
+ */
6
+ export const HOST_SECRET_PROTECTION_CAPABILITY = "host_secret_protection_v1";
@@ -6,6 +6,8 @@ import { computerNumber, computerText } from "./action-input.js";
6
6
  import { createNativeComputerBackend } from "./native-backend.js";
7
7
  import { COMPUTER_FRAME_CHUNK_BYTES, COMPUTER_IMAGE_MAX_BYTES, readNativeComputerRequest, readNativeComputerResult, } from "./native-validation.js";
8
8
  import { withDesktopQueue } from "./desktop-action-queue.js";
9
+ import { protectDesktopResult } from "../security/desktop-result.js";
10
+ import { protectObservedError } from "../security/observed-error.js";
9
11
  /** Connection-owned, bounded private sessions. No image is written to disk. */
10
12
  export class CompanionComputerSessions {
11
13
  platform;
@@ -30,9 +32,7 @@ export class CompanionComputerSessions {
30
32
  catch (error) {
31
33
  return failureResult({
32
34
  errorCode: "computer_native_operation_failed",
33
- message: error instanceof Error
34
- ? error.message
35
- : "The computer operation failed; observe before retrying.",
35
+ message: protectObservedError(error, "The computer operation failed; observe before retrying."),
36
36
  });
37
37
  }
38
38
  };
@@ -96,14 +96,15 @@ export class CompanionComputerSessions {
96
96
  const session = await this.acquire(id);
97
97
  this.eraseFrame(session);
98
98
  const result = await session.backend.execute(request, signal);
99
- const { image, ...metadata } = result;
99
+ const { image: rawImage, ...rawMetadata } = result;
100
100
  try {
101
- readNativeComputerResult(metadata);
101
+ readNativeComputerResult(rawMetadata);
102
102
  }
103
103
  catch (error) {
104
- image?.bytes.fill(0);
104
+ rawImage?.bytes.fill(0);
105
105
  throw error;
106
106
  }
107
+ const { image, ...metadata } = protectDesktopResult(result);
107
108
  if (!image)
108
109
  return successResult({
109
110
  output: "Native desktop observation.",
@@ -9,7 +9,7 @@ export function createUnixNativeProcess(options) {
9
9
  let failedReason;
10
10
  let buffer = Buffer.alloc(0);
11
11
  let queue = Promise.resolve();
12
- let lastResult;
12
+ let lastDesktop;
13
13
  function interruptedResult(reason) {
14
14
  const dispatch = pending?.request.operation === "act"
15
15
  ? (pending.dispatch ?? {
@@ -19,13 +19,9 @@ export function createUnixNativeProcess(options) {
19
19
  })
20
20
  : undefined;
21
21
  const result = unavailableUnixDesktop(options.platform, reason, dispatch);
22
- if (!lastResult)
22
+ if (!lastDesktop)
23
23
  return result;
24
- return {
25
- ...result,
26
- desktop: { ...lastResult.desktop, available: false, reason },
27
- windows: lastResult.windows,
28
- };
24
+ return { ...result, desktop: { ...result.desktop, ...lastDesktop } };
29
25
  }
30
26
  function terminate(reason) {
31
27
  failedReason = reason;
@@ -38,6 +34,7 @@ export function createUnixNativeProcess(options) {
38
34
  retiring.once("exit", () => clearTimeout(hardStop));
39
35
  }
40
36
  child = undefined;
37
+ buffer.fill(0);
41
38
  buffer = Buffer.alloc(0);
42
39
  }
43
40
  function receiveLine(line) {
@@ -54,7 +51,18 @@ export function createUnixNativeProcess(options) {
54
51
  if (message.type !== "result")
55
52
  throw new Error("native_protocol_invalid");
56
53
  const result = readUnixNativeResult(message.result, options.platform);
57
- lastResult = result;
54
+ // Retain only mechanical interruption identity, never observation content.
55
+ lastDesktop = {
56
+ binding: result.desktop.binding,
57
+ bounds: {
58
+ x: result.desktop.bounds.x,
59
+ y: result.desktop.bounds.y,
60
+ width: result.desktop.bounds.width,
61
+ height: result.desktop.bounds.height,
62
+ },
63
+ coordinateSpace: result.desktop.coordinateSpace,
64
+ targetingGuarantee: result.desktop.targetingGuarantee,
65
+ };
58
66
  pending.finish(result);
59
67
  }
60
68
  function ensureHelper() {
@@ -69,15 +77,19 @@ export function createUnixNativeProcess(options) {
69
77
  child.stdout.on("data", (chunk) => {
70
78
  if (closed || failedReason)
71
79
  return;
72
- buffer = Buffer.concat([buffer, chunk]);
80
+ const previous = buffer;
81
+ buffer = Buffer.concat([previous, chunk]);
82
+ previous.fill(0);
73
83
  if (buffer.length > NATIVE_JSON_LIMIT) {
74
84
  terminate("computer_native_result_limit");
75
85
  return;
76
86
  }
77
87
  let boundary = buffer.indexOf(10);
78
88
  while (boundary >= 0) {
79
- const line = buffer.subarray(0, boundary).toString("utf8");
80
- buffer = buffer.subarray(boundary + 1);
89
+ const received = buffer;
90
+ const line = received.subarray(0, boundary).toString("utf8");
91
+ buffer = Buffer.from(received.subarray(boundary + 1));
92
+ received.fill(0);
81
93
  try {
82
94
  receiveLine(line);
83
95
  }
@@ -1,4 +1,5 @@
1
1
  import { type ToolImplementation } from "../plugin-sdk/index.js";
2
2
  import { type SystemProcessRunner, type SystemTarget, type SystemTargetId } from "./contracts.js";
3
3
  import type { SystemCommandOutputFactory } from "./command-output.js";
4
- export declare function createSystemHandlers(run?: SystemProcessRunner, resolveTarget?: (id: SystemTargetId) => Promise<SystemTarget>, commandOutput?: SystemCommandOutputFactory): Record<string, ToolImplementation>;
4
+ import type { SystemResultProtection } from "./system-result-protection.js";
5
+ export declare function createSystemHandlers(run?: SystemProcessRunner, resolveTarget?: (id: SystemTargetId) => Promise<SystemTarget>, commandOutput?: SystemCommandOutputFactory, protection?: SystemResultProtection): Record<string, ToolImplementation>;
@@ -8,16 +8,63 @@ import { SystemOperationError, } from "./contracts.js";
8
8
  import { runSystemProcess } from "./process-runner.js";
9
9
  import { systemProcessResult } from "./process-result.js";
10
10
  import { readSystemTargetId, resolveSystemTarget } from "./targets.js";
11
- function withSystemOperationErrors(operation) {
11
+ const PROTECTION_FAILURE = "The system result could not be protected for delivery.";
12
+ function protectSystemResult(operation) {
13
+ try {
14
+ return operation();
15
+ }
16
+ catch {
17
+ throw new SystemOperationError("system_result_protection_failed", PROTECTION_FAILURE);
18
+ }
19
+ }
20
+ function failedSystemProtectionReceipt(target, result, evidenceScope) {
21
+ const safeProcess = {
22
+ status: result.status,
23
+ exitCode: result.exitCode,
24
+ outputTruncated: result.outputTruncated,
25
+ stdout: "[UNAVAILABLE: result protection failed]",
26
+ stderr: "[UNAVAILABLE: result protection failed]",
27
+ ...(result.spawnedProcess ? {
28
+ spawnedProcess: {
29
+ pid: result.spawnedProcess.pid,
30
+ pidNamespace: result.spawnedProcess.pidNamespace,
31
+ identitySource: result.spawnedProcess.identitySource,
32
+ executable: "[REDACTED]",
33
+ },
34
+ } : {}),
35
+ };
36
+ const receipt = systemProcessResult(target, safeProcess, evidenceScope);
37
+ return failureResult({
38
+ errorCode: "system_result_protection_failed",
39
+ message: PROTECTION_FAILURE,
40
+ output: "The operation was dispatched. Inspect the process receipt before another action; the command was not replayed.\n" + receipt.output,
41
+ stdout: safeProcess.stdout,
42
+ stderr: safeProcess.stderr,
43
+ ...(result.exitCode !== null ? { exitCode: result.exitCode } : {}),
44
+ data: receipt.data,
45
+ });
46
+ }
47
+ function withSystemOperationErrors(operation, protection) {
12
48
  return async (params, context) => {
13
49
  try {
14
50
  return await operation(params, context);
15
51
  }
16
52
  catch (error) {
53
+ let message = error instanceof Error ? error.message : undefined;
54
+ try {
55
+ if (protection && message !== undefined)
56
+ message = protection.protectMessage(message);
57
+ }
58
+ catch {
59
+ return failureResult({
60
+ errorCode: "system_result_protection_failed",
61
+ message: PROTECTION_FAILURE,
62
+ });
63
+ }
17
64
  if (error instanceof SystemOperationError)
18
65
  return failureResult({
19
66
  errorCode: error.code,
20
- message: error.message,
67
+ message: message,
21
68
  data: {
22
69
  humanActionRequired: error.code === "system_authorization_required",
23
70
  },
@@ -30,9 +77,10 @@ function withSystemOperationErrors(operation) {
30
77
  }
31
78
  };
32
79
  }
33
- export function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => resolveSystemTarget(id, run), commandOutput) {
80
+ export function createSystemHandlers(run = runSystemProcess, resolveTarget = (id) => resolveSystemTarget(id, run), commandOutput, protection) {
34
81
  const targets = async () => {
35
- const observation = await observeSystemTargets(run);
82
+ const observed = await observeSystemTargets(run);
83
+ const observation = protection ? protectSystemResult(() => protection.protectTargets(observed)) : observed;
36
84
  return successResult({
37
85
  output: JSON.stringify(observation),
38
86
  data: {
@@ -44,13 +92,21 @@ export function createSystemHandlers(run = runSystemProcess, resolveTarget = (id
44
92
  const command = async (params, context) => {
45
93
  const target = await resolveTarget(readSystemTargetId(params.target));
46
94
  const output = commandOutput?.(context);
47
- const result = await executeSystemCommand({
95
+ const observed = await executeSystemCommand({
48
96
  target,
49
97
  params,
50
98
  run,
51
99
  ...(output ? { runCommand: output.run } : {}),
52
100
  ...(context?.abortSignal ? { abortSignal: context.abortSignal } : {}),
53
101
  });
102
+ let result = observed;
103
+ try {
104
+ if (protection)
105
+ result = protection.protectProcess(observed);
106
+ }
107
+ catch {
108
+ return failedSystemProtectionReceipt(target, observed, "command_process_completion");
109
+ }
54
110
  if (output)
55
111
  return output.present(target, result);
56
112
  return systemProcessResult(target, result, "command_process_completion");
@@ -65,7 +121,8 @@ export function createSystemHandlers(run = runSystemProcess, resolveTarget = (id
65
121
  minimum: 1,
66
122
  maximum: 100,
67
123
  });
68
- const catalog = await readSystemApplications(target, run);
124
+ const observed = await readSystemApplications(target, run);
125
+ const catalog = protection ? protectSystemResult(() => protection.protectCatalog(observed)) : observed;
69
126
  const { output, data } = systemApplicationObservation(target, catalog, query, limit);
70
127
  return successResult({
71
128
  output,
@@ -83,12 +140,23 @@ export function createSystemHandlers(run = runSystemProcess, resolveTarget = (id
83
140
  run,
84
141
  ...(context?.abortSignal ? { abortSignal: context.abortSignal } : {}),
85
142
  });
86
- return systemProcessResult(target, result.process, "launch_request_dispatch", result.application);
143
+ let process = result.process;
144
+ let application = result.application;
145
+ try {
146
+ if (protection) {
147
+ process = protection.protectProcess(result.process);
148
+ application = protection.protectApplication(result.application);
149
+ }
150
+ }
151
+ catch {
152
+ return failedSystemProtectionReceipt(target, result.process, "launch_request_dispatch");
153
+ }
154
+ return systemProcessResult(target, process, "launch_request_dispatch", application);
87
155
  };
88
156
  return {
89
- system_targets: withSystemOperationErrors(targets),
90
- system_command: withSystemOperationErrors(command),
91
- system_applications: withSystemOperationErrors(applications),
92
- system_launch: withSystemOperationErrors(launch),
157
+ system_targets: withSystemOperationErrors(targets, protection),
158
+ system_command: withSystemOperationErrors(command, protection),
159
+ system_applications: withSystemOperationErrors(applications, protection),
160
+ system_launch: withSystemOperationErrors(launch, protection),
93
161
  };
94
162
  }
@@ -7,7 +7,7 @@ export type SystemHostFacts = Readonly<{
7
7
  export declare function readSystemHostFacts(): SystemHostFacts;
8
8
  export declare function isWslHostRuntime(facts: SystemHostFacts): boolean;
9
9
  export declare function observeSystemHost(facts?: SystemHostFacts): {
10
- readonly runtimeOs: SystemTargetId | "unsupported";
10
+ readonly runtimeOs: "unsupported" | SystemTargetId;
11
11
  readonly kernelRelease: string;
12
12
  readonly environment: "container";
13
13
  readonly inferredHostOs: "unknown";
@@ -15,10 +15,10 @@ export declare function observeSystemHost(facts?: SystemHostFacts): {
15
15
  readonly windowsExecutionRequiresProbe: false;
16
16
  readonly guiSessionStatus: "not_checked";
17
17
  } | {
18
- readonly runtimeOs: SystemTargetId | "unsupported";
18
+ readonly runtimeOs: "unsupported" | SystemTargetId;
19
19
  readonly kernelRelease: string;
20
20
  readonly environment: "wsl_guest" | "not_identified_as_wsl";
21
- readonly inferredHostOs: SystemTargetId | "unsupported";
21
+ readonly inferredHostOs: "unsupported" | SystemTargetId;
22
22
  readonly hostInferenceSource: "wsl_kernel_signature" | "runtime_platform_only";
23
23
  readonly windowsExecutionRequiresProbe: boolean;
24
24
  readonly guiSessionStatus: "not_checked";
@@ -0,0 +1,12 @@
1
+ import type { HostObservationSubscription } from "../shared/passive-observation.js";
2
+ import { startDesktopCollector } from "./companion/observation-process.js";
3
+ import { acquireNativeObservationOwnership } from "./native-observation-ownership.js";
4
+ type NativeObservationDependencies = Readonly<{
5
+ acquireOwnership?: typeof acquireNativeObservationOwnership;
6
+ startCollector?: typeof startDesktopCollector;
7
+ }>;
8
+ /** Local transport retains the existing collector's filtering and the source's owner/lease contract. */
9
+ export declare function connectNativeObservations(options: HostObservationSubscription, dependencies?: NativeObservationDependencies): Promise<Readonly<{
10
+ close(): void;
11
+ }>>;
12
+ export {};
@@ -0,0 +1,78 @@
1
+ import { startDesktopCollector } from "./companion/observation-process.js";
2
+ import { acquireNativeObservationOwnership } from "./native-observation-ownership.js";
3
+ import { createNativeObservationShutdown, waitForNativeObservationShutdown } from "./native-observation-shutdown.js";
4
+ function canPublishNativeObservation(closed, signal) {
5
+ if (closed)
6
+ return false;
7
+ return !signal.aborted;
8
+ }
9
+ /** Local transport retains the existing collector's filtering and the source's owner/lease contract. */
10
+ export async function connectNativeObservations(options, dependencies = {}) {
11
+ await waitForNativeObservationShutdown(options.rootDir, options.ownerId, options.abortSignal);
12
+ options.abortSignal.throwIfAborted();
13
+ const ownership = await (dependencies.acquireOwnership ?? acquireNativeObservationOwnership)(options.rootDir);
14
+ const shutdown = createNativeObservationShutdown(options.rootDir, options.ownerId);
15
+ let collector;
16
+ let closed = false;
17
+ let starting = true;
18
+ let stopped = false;
19
+ function onStopped() {
20
+ if (stopped)
21
+ return;
22
+ stopped = true;
23
+ closed = true;
24
+ options.abortSignal.removeEventListener("abort", close);
25
+ shutdown.begin();
26
+ void ownership.release().then(() => shutdown.confirmReleased()).catch(() => process.emitWarning("Native collection ownership could not be released.", { code: "NATIVE_OBSERVATION_RELEASE_FAILED" }));
27
+ }
28
+ function stopCollector() {
29
+ if (stopped)
30
+ return;
31
+ try {
32
+ collector?.close();
33
+ }
34
+ catch {
35
+ process.emitWarning("Native collector stop was not confirmed; its ownership is retained.", { code: "NATIVE_OBSERVATION_STOP_UNCONFIRMED" });
36
+ }
37
+ }
38
+ function close() {
39
+ if (closed)
40
+ return;
41
+ closed = true;
42
+ shutdown.begin();
43
+ options.abortSignal.removeEventListener("abort", close);
44
+ if (!starting)
45
+ stopCollector();
46
+ }
47
+ function onEvent(event) {
48
+ if (!canPublishNativeObservation(closed, options.abortSignal))
49
+ return;
50
+ try {
51
+ options.onEvent({ ...event, deviceId: ownership.deviceId, ownerId: options.ownerId, leaseId: options.leaseId });
52
+ }
53
+ catch {
54
+ process.emitWarning("Native observation delivery failed; collection is closing.", { code: "NATIVE_OBSERVATION_DELIVERY_FAILED" });
55
+ close();
56
+ }
57
+ }
58
+ options.abortSignal.addEventListener("abort", close, { once: true });
59
+ if (options.abortSignal.aborted) {
60
+ onStopped();
61
+ options.abortSignal.throwIfAborted();
62
+ }
63
+ try {
64
+ collector = (dependencies.startCollector ?? startDesktopCollector)({
65
+ excludedApplications: options.excludedApplications ?? [], onEvent, onStopped,
66
+ });
67
+ }
68
+ catch {
69
+ onEvent({ type: "status", state: "failed", reason: "collector_start_failed" });
70
+ close();
71
+ }
72
+ finally {
73
+ starting = false;
74
+ if (closed)
75
+ stopCollector();
76
+ }
77
+ return { close };
78
+ }
@@ -0,0 +1,6 @@
1
+ export type NativeObservationOwnership = Readonly<{
2
+ deviceId: string;
3
+ release(): Promise<void>;
4
+ }>;
5
+ /** One installation shares a device identity and exclusive collector across environment processes. */
6
+ export declare function acquireNativeObservationOwnership(rootDir: string): Promise<NativeObservationOwnership>;