@abot-ai/runtime 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.md +216 -222
  2. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
  3. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  4. package/dist/src/capabilities/tool-types.d.ts +4 -0
  5. package/dist/src/cli/abot.js +2 -0
  6. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  7. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  8. package/dist/src/computer-access/collection-consent.js +47 -0
  9. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  10. package/dist/src/computer-access/command-output-capture.js +134 -68
  11. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  12. package/dist/src/computer-access/command-output-protection.js +59 -0
  13. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  14. package/dist/src/computer-access/companion/command-output.js +23 -6
  15. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  16. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  17. package/dist/src/computer-access/companion/native-session.js +6 -2
  18. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  19. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  20. package/dist/src/computer-access/companion/observation-process.js +51 -25
  21. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  22. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  23. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  24. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  25. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  26. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  27. package/dist/src/computer-access/handlers.d.ts +2 -1
  28. package/dist/src/computer-access/handlers.js +79 -11
  29. package/dist/src/computer-access/host-observation.d.ts +3 -3
  30. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  31. package/dist/src/computer-access/native-observation-connection.js +78 -0
  32. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  33. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  34. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  35. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  36. package/dist/src/computer-access/observation-source.d.ts +6 -0
  37. package/dist/src/computer-access/observation-source.js +10 -0
  38. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  39. package/dist/src/computer-access/security/desktop-result.js +146 -0
  40. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  41. package/dist/src/computer-access/security/observed-error.js +10 -0
  42. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  43. package/dist/src/computer-access/security/secret-text.js +111 -0
  44. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  45. package/dist/src/computer-access/security/system-results.js +53 -0
  46. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  47. package/dist/src/computer-access/system-result-protection.js +1 -0
  48. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  49. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  50. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  51. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  52. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  53. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  54. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  55. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  56. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  57. package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
  58. package/dist/src/model-gateway/protocol/message-contract.js +1 -1
  59. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  60. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  61. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  62. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  63. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  64. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  65. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  66. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  67. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  68. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  69. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  70. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  71. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  72. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  73. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  74. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  75. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  76. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  77. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  78. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  79. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  80. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  81. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  82. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  83. package/dist/src/model-gateway/server/chat-handler.js +5 -7
  84. package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
  85. package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
  86. package/dist/src/model-gateway/server.js +5 -1
  87. package/dist/src/plugin-contract/index.d.ts +1 -0
  88. package/dist/src/plugin-contract/index.js +1 -0
  89. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  90. package/dist/src/plugin-contract/manifest.js +1 -0
  91. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  92. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  93. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  94. package/dist/src/plugin-sdk/computer-access.js +1 -0
  95. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  96. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  97. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  98. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  99. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  100. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  101. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  102. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  103. package/dist/src/plugin-sdk/files.js +4 -0
  104. package/dist/src/plugin-sdk/index.d.ts +1 -0
  105. package/dist/src/plugin-sdk/index.js +1 -0
  106. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  107. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  108. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  109. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  110. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  111. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  112. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  113. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  114. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  115. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
  116. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
  117. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
  118. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  119. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  120. package/dist/src/runtime/capabilities/tool-availability.js +6 -0
  121. package/dist/src/runtime/context/capability-brief.d.ts +2 -2
  122. package/dist/src/runtime/context/capability-brief.js +3 -3
  123. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
  124. package/dist/src/runtime/context/capability-descriptions.js +57 -20
  125. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  126. package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
  127. package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
  128. package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
  129. package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
  130. package/dist/src/runtime/long-term-memory/projection.js +1 -1
  131. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
  132. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
  133. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
  134. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
  135. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
  136. package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
  137. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
  138. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
  139. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
  140. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  141. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
  142. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
  143. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
  144. package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
  145. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
  146. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
  147. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  148. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  149. package/dist/src/runtime/passive-learning/service.js +2 -3
  150. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  151. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  152. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  153. package/dist/src/runtime/plugins/installation/package.js +2 -0
  154. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  155. package/dist/src/runtime/plugins/loader.js +24 -14
  156. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  157. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  158. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  159. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  160. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  161. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  162. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  163. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  164. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  165. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  166. package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
  167. package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
  168. package/dist/src/runtime/request/prepared-execution.js +3 -0
  169. package/dist/src/runtime/request/root-contract.d.ts +2 -0
  170. package/dist/src/runtime/request/root-execution-kernel.js +1 -0
  171. package/dist/src/runtime/request/runner.js +9 -3
  172. package/dist/src/runtime/request/supervisor-root-execution.js +6 -0
  173. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  174. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  175. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
  176. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
  177. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
  178. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
  179. package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
  180. package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
  181. package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
  182. package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
  183. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
  184. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
  185. package/dist/src/runtime/steps/execution-agent/format.js +4 -3
  186. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
  187. package/dist/src/runtime/steps/execution-agent/input.js +22 -1
  188. package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
  189. package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
  190. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  191. package/dist/src/runtime/steps/execution-agent/prompt.js +7 -8
  192. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  193. package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
  194. package/dist/src/runtime/steps/execution-agent/run.js +4 -1
  195. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +3 -5
  196. package/dist/src/runtime/steps/execution-agent/state-context.js +5 -51
  197. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  198. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  199. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  200. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  201. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
  202. package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
  203. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  204. package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
  205. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
  206. package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
  207. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
  208. package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
  209. package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
  210. package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
  211. package/dist/src/sessions/durable-session-commit.js +3 -3
  212. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  213. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  214. package/dist/src/sessions/session-store.js +3 -3
  215. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  216. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  217. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  218. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  219. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  220. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  221. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  222. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  223. package/dist/src/shared/windows-job-object.d.ts +2 -0
  224. package/dist/src/shared/windows-job-object.js +66 -0
  225. package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
  226. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  227. package/dist/src/web-ui/app/app-state.js +0 -7
  228. package/dist/src/web-ui/app/app.js +54 -156
  229. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  230. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  231. package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
  232. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  233. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  234. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  235. package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
  236. package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
  237. package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
  238. package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
  239. package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
  240. package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
  241. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  242. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  243. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  244. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  245. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  246. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  247. package/dist/src/web-ui/app/components/operations-summary.js +2 -1
  248. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  249. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  250. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  251. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  252. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  253. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  254. package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
  255. package/dist/src/web-ui/app/components/passive-learning/home.js +11 -3
  256. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  257. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  258. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  259. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  260. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  261. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  262. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  263. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  264. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  265. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  266. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  267. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  268. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  269. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  270. package/dist/src/web-ui/app/components/schedules/details.js +3 -2
  271. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  272. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  273. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  274. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  275. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
  276. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  277. package/dist/src/web-ui/app/components/spark-chat/settings.js +8 -4
  278. package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
  279. package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
  280. package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
  281. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  282. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  283. package/dist/src/web-ui/app/components/system-host/rendering.js +6 -3
  284. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
  285. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  286. package/dist/src/web-ui/app/computer-access-feature.js +13 -1
  287. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  288. package/dist/src/web-ui/app/configuration-feature.js +11 -1
  289. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  290. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  291. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  292. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  293. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  294. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  295. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  296. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  297. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  298. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  299. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  300. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  301. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  302. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  303. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  304. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  305. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  306. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  307. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  308. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  309. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  310. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  311. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  312. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  313. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  314. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  315. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  316. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  317. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  318. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  319. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  320. package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
  321. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  322. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  323. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  324. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  325. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  326. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  327. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  328. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  329. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  330. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  331. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  332. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  333. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  334. package/dist/src/web-ui/app/dashboard-feature.js +12 -2
  335. package/dist/src/web-ui/app/lib/reasoning-controls.js +40 -0
  336. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  337. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  338. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  339. package/dist/src/web-ui/app/passive-learning-feature.js +18 -5
  340. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  341. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  342. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  343. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  344. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  345. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  346. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  347. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  348. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  349. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  350. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  351. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  352. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  353. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  354. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  355. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  356. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  357. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  358. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  359. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  360. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  361. package/dist/src/web-ui/app/styles/95-home-widgets.css +109 -0
  362. package/dist/src/web-ui/app/styles.css +3 -0
  363. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  364. package/dist/src/web-ui/client-state/contracts.js +13 -0
  365. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  366. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  367. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  368. package/dist/src/web-ui/client-state/preferences.js +84 -0
  369. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  370. package/dist/src/web-ui/client-state/queue.js +43 -0
  371. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  372. package/dist/src/web-ui/client-state/routes.js +58 -0
  373. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  374. package/dist/src/web-ui/client-state/store.js +88 -0
  375. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  376. package/dist/src/web-ui/local-runtime/http.js +11 -2
  377. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  378. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  379. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  380. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  381. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  382. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  383. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  384. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  385. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  386. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  387. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  388. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  389. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  390. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  391. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  392. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  393. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  394. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  395. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  396. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  397. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  398. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  399. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  400. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  401. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  402. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  403. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  404. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  405. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  406. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  407. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  408. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  409. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  410. package/dist/src/web-ui/server-readiness.js +36 -0
  411. package/dist/src/web-ui/server.d.ts +2 -0
  412. package/dist/src/web-ui/server.js +23 -1
  413. package/dist/src/web-ui/system-host-service.js +13 -2
  414. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  415. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  416. package/docs/installation.md +44 -5
  417. package/docs/plugins.md +174 -28
  418. package/docs/tool-execution-result-evidence-contract.md +57 -0
  419. package/docs/windows-companion-store.md +5 -0
  420. package/package.json +4 -2
  421. package/plugins/capability-brief/plugin.json +5 -1
  422. package/plugins/code-outline/README.md +20 -0
  423. package/plugins/code-outline/plugin.json +2 -1
  424. package/plugins/code-outline/source/index.ts +16 -20
  425. package/plugins/code-outline/source/read-failure.ts +40 -0
  426. package/plugins/code-outline/src/index.cjs +614 -29
  427. package/plugins/document-reader/README.md +33 -0
  428. package/plugins/document-reader/plugin.json +2 -1
  429. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  430. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  431. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  432. package/plugins/document-reader/source/pdf-process.ts +207 -0
  433. package/plugins/document-reader/source/pdf-result.ts +79 -0
  434. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  435. package/plugins/document-reader/source/pdf.ts +4 -1
  436. package/plugins/document-reader/source/read-failure.ts +37 -0
  437. package/plugins/document-reader/source/reader.ts +3 -19
  438. package/plugins/document-reader/src/index.cjs +995 -211
  439. package/plugins/exec/README.md +19 -0
  440. package/plugins/exec/plugin.json +4 -3
  441. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  442. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  443. package/plugins/exec/source/filesystem-observer.ts +8 -79
  444. package/plugins/exec/source/output-files.ts +12 -6
  445. package/plugins/exec/source/paths.ts +3 -1
  446. package/plugins/exec/source/process-manager.ts +8 -24
  447. package/plugins/exec/source/shell-platform.ts +19 -3
  448. package/plugins/exec/source/shell-process.ts +55 -0
  449. package/plugins/exec/source/windows-job-source.ts +1 -0
  450. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  451. package/plugins/exec/src/index.cjs +252 -96
  452. package/plugins/filesystem/README.md +65 -0
  453. package/plugins/filesystem/plugin.json +7 -3
  454. package/plugins/filesystem/source/atomic-write.ts +2 -0
  455. package/plugins/filesystem/source/bounded-io.ts +80 -306
  456. package/plugins/filesystem/source/directory-sample.ts +2 -0
  457. package/plugins/filesystem/source/errors.ts +14 -0
  458. package/plugins/filesystem/source/file-observation.ts +151 -0
  459. package/plugins/filesystem/source/file-version.ts +41 -0
  460. package/plugins/filesystem/source/index.ts +6 -0
  461. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  462. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  463. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  464. package/plugins/filesystem/source/windows/operations.ts +197 -0
  465. package/plugins/filesystem/source/windows/process.ts +214 -0
  466. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  467. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  468. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  469. package/plugins/filesystem/source/windows/source.ts +42 -0
  470. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  471. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  472. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  473. package/plugins/filesystem/src/index.cjs +1208 -322
  474. package/plugins/json-inspector/README.md +18 -0
  475. package/plugins/json-inspector/plugin.json +2 -1
  476. package/plugins/json-inspector/source/index.ts +16 -19
  477. package/plugins/json-inspector/source/read-failure.ts +42 -0
  478. package/plugins/json-inspector/src/index.cjs +612 -27
  479. package/plugins/local-search/README.md +29 -0
  480. package/plugins/local-search/plugin.json +2 -1
  481. package/plugins/local-search/source/errors.ts +2 -0
  482. package/plugins/local-search/source/paths.ts +3 -0
  483. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  484. package/plugins/local-search/source/ripgrep.ts +3 -3
  485. package/plugins/local-search/source/windows-authority.ts +99 -0
  486. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  487. package/plugins/local-search/source/windows-search-process.ts +91 -0
  488. package/plugins/local-search/source/windows-search-script.ts +52 -0
  489. package/plugins/local-search/src/index.cjs +595 -26
  490. package/plugins/memory/plugin.json +5 -1
  491. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  492. package/plugins/memory/source/lock-owner-file.ts +71 -0
  493. package/plugins/memory/source/lock-path-observation.ts +26 -0
  494. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  495. package/plugins/memory/source/store-lock.ts +12 -7
  496. package/plugins/memory/source/store.ts +3 -2
  497. package/plugins/memory/src/index.cjs +174 -25
  498. package/plugins/project-orientation/README.md +23 -0
  499. package/plugins/project-orientation/plugin.json +2 -1
  500. package/plugins/project-orientation/source/index.ts +12 -9
  501. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  502. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  503. package/plugins/project-orientation/source/tree.ts +6 -0
  504. package/plugins/project-orientation/src/index.cjs +647 -31
  505. package/plugins/system/README.md +51 -15
  506. package/plugins/system/plugin.json +6 -2
  507. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  508. package/plugins/system/source/command-working-directory.ts +47 -0
  509. package/plugins/system/source/computer/handlers.ts +13 -9
  510. package/plugins/system/source/computer/observation-result.ts +10 -5
  511. package/plugins/system/source/computer/request-computers.ts +10 -3
  512. package/plugins/system/source/computer/request-modules.ts +3 -6
  513. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  514. package/plugins/system/source/host-dispatch.ts +18 -2
  515. package/plugins/system/source/index.ts +5 -3
  516. package/plugins/system/source/local-command-output-retention.ts +16 -0
  517. package/plugins/system/source/local-command-output.ts +16 -8
  518. package/plugins/system/source/request-system-modules.ts +12 -2
  519. package/plugins/system/source/request-target-snapshot.ts +2 -1
  520. package/plugins/system/source/security/desktop-result.ts +177 -0
  521. package/plugins/system/source/security/observed-error.ts +10 -0
  522. package/plugins/system/source/security/secret-text.ts +118 -0
  523. package/plugins/system/source/security/system-results.ts +62 -0
  524. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  525. package/plugins/system/src/index.cjs +837 -151
  526. package/plugins/system-probe/plugin.json +9 -3
  527. package/plugins/system-probe/source/disk-path.ts +8 -0
  528. package/plugins/system-probe/source/index.ts +10 -5
  529. package/plugins/system-probe/source/machine-load.ts +33 -0
  530. package/plugins/system-probe/source/metrics.ts +6 -8
  531. package/plugins/system-probe/src/index.cjs +49 -16
  532. package/plugins/web/plugin.json +5 -1
@@ -0,0 +1,40 @@
1
+ import { escapeHtml } from "./text-format.js";
2
+
3
+ export function displayReasoningMode(mode) {
4
+ if (mode === "fast") return "Low";
5
+ return mode;
6
+ }
7
+
8
+ export function canChooseReasoning(profile) {
9
+ return profile?.supportsThinking === true;
10
+ }
11
+
12
+ /** Keep the stored mode for compatibility while showing the effective provider default. */
13
+ export function reasoningModeOptions(mode, enabled, modes = ["fast", "reasoning", "deep"]) {
14
+ if (!enabled) return `<option value="${escapeHtml(mode || "reasoning")}">Provider default</option>`;
15
+ const labels = { fast: "Low", reasoning: "Reasoning", deep: "Deep", auto: "Auto" };
16
+ return modes.map((value) => `<option value="${escapeHtml(value)}"${value === mode ? " selected" : ""}>${escapeHtml(labels[value] || value)}</option>`).join("");
17
+ }
18
+
19
+ export function renderReasoningModeField(mode, profile, modes) {
20
+ const enabled = canChooseReasoning(profile);
21
+ return `<label>Reasoning depth<select name="agentMode" data-reasoning-mode${enabled ? "" : " disabled"}>${reasoningModeOptions(mode, enabled, modes)}</select>
22
+ <small data-reasoning-mode-note${enabled ? " hidden" : ""}>Uses the provider default. Enable reasoning controls for this model in Models.</small></label>`;
23
+ }
24
+
25
+ export function syncReasoningModeField(form, profiles, modes) {
26
+ const select = form?.querySelector("[data-reasoning-mode]");
27
+ if (!select) return;
28
+ const profileId = form.querySelector('[name="modelProfileId"]')?.value;
29
+ const profile = profiles?.find((item) => item.id === profileId);
30
+ const enabled = canChooseReasoning(profile);
31
+ const mode = select.value;
32
+ select.innerHTML = reasoningModeOptions(mode, enabled, modes);
33
+ select.disabled = !enabled;
34
+ const note = form.querySelector("[data-reasoning-mode-note]");
35
+ if (note) note.hidden = enabled;
36
+ }
37
+
38
+ export function retainedReasoningMode(form, fallback) {
39
+ return form.querySelector("[data-reasoning-mode]")?.value || fallback;
40
+ }
@@ -0,0 +1,58 @@
1
+ /** Persisted ownership has no expiry: uncertain sends require a manual handoff. */
2
+ export function hasValidQueueOwnership(queue) {
3
+ const owner = queue.blockedReleaseOwner;
4
+ if (owner === undefined || owner === null) return true;
5
+ if (queue.blockedByReleaseToken === null) return false;
6
+ if (!owner || typeof owner !== "object" || Array.isArray(owner)) return false;
7
+ if (typeof owner.id !== "string" || !owner.id || owner.id.length > 128) return false;
8
+ return ["editing", "sending", "uncertain"].includes(owner.state);
9
+ }
10
+
11
+ export function canEditBlockedRelease(queue, ownerId) {
12
+ if (!queue.blockedReleaseOwner) return true;
13
+ if (queue.blockedReleaseOwner.id !== ownerId) return false;
14
+ return queue.blockedReleaseOwner.state === "editing";
15
+ }
16
+
17
+ export function canUpdateBlockedRelease(queue, ownerId) {
18
+ return canEditBlockedRelease(queue, ownerId);
19
+ }
20
+
21
+ export function canBindBlockedRelease(queue, ownerId) {
22
+ if (!queue.blockedReleaseOwner) return true;
23
+ if (queue.blockedReleaseOwner.id !== ownerId) return false;
24
+ return ["sending", "uncertain"].includes(queue.blockedReleaseOwner.state);
25
+ }
26
+
27
+ export function createQueueOwnership({ ownerId, readStore, writeStore, getQueue, createToken, projectRelease }) {
28
+ function claimBlockedRelease(scope, releaseToken, { takeover = false } = {}) {
29
+ if (!ownerId) return projectRelease(getQueue(readStore(), scope));
30
+ const store = readStore();
31
+ const queue = getQueue(store, scope);
32
+ if (!queue?.blockedReleaseItem || queue.blockedByReleaseToken !== releaseToken) return null;
33
+ const owner = queue.blockedReleaseOwner;
34
+ if (!takeover && owner && !canEditBlockedRelease(queue, ownerId)) return null;
35
+ if (takeover || !owner) queue.blockedByReleaseToken = createToken();
36
+ queue.blockedReleaseOwner = { id: ownerId, state: "editing" };
37
+ writeStore(store);
38
+ return projectRelease(queue);
39
+ }
40
+
41
+ function changeOwnedPhase(scope, releaseToken, from, to) {
42
+ if (!ownerId) return true;
43
+ const store = readStore();
44
+ const queue = getQueue(store, scope);
45
+ if (queue?.blockedByReleaseToken !== releaseToken) return false;
46
+ if (queue.blockedReleaseOwner?.id !== ownerId) return false;
47
+ if (queue.blockedReleaseOwner.state !== from) return false;
48
+ queue.blockedReleaseOwner.state = to;
49
+ writeStore(store);
50
+ return true;
51
+ }
52
+
53
+ return {
54
+ claimBlockedRelease,
55
+ beginBlockedSend: (scope, token) => changeOwnedPhase(scope, token, "editing", "sending"),
56
+ markBlockedUncertain: (scope, token) => changeOwnedPhase(scope, token, "sending", "uncertain"),
57
+ };
58
+ }
@@ -32,9 +32,14 @@ export interface SessionComposerQueueStorage {
32
32
  export interface ReleasedSessionComposerQueueItem {
33
33
  item: SessionComposerQueueItem;
34
34
  releaseToken: string;
35
+ owner?: { id: string; state: "editing" | "sending" | "uncertain" };
35
36
  }
36
37
 
37
38
  export interface SessionComposerQueue {
39
+ refresh?(): Promise<void>;
40
+ claimBlockedRelease(scope: SessionComposerQueueScope, releaseToken: string, options?: { takeover?: boolean }): ReleasedSessionComposerQueueItem | null;
41
+ beginBlockedSend(scope: SessionComposerQueueScope, releaseToken: string): boolean;
42
+ markBlockedUncertain(scope: SessionComposerQueueScope, releaseToken: string): boolean;
38
43
  enqueue(
39
44
  scope: SessionComposerQueueScope,
40
45
  item: SessionComposerQueueItemInput,
@@ -64,12 +69,19 @@ export interface SessionComposerQueue {
64
69
  ): boolean;
65
70
  }
66
71
 
72
+ type QueueMutation = "claimBlockedRelease" | "beginBlockedSend" | "markBlockedUncertain" | "enqueue" | "updateBlockedRelease" | "releaseForTerminal" | "bindReleasedSuccess" | "rebindBlocked";
73
+ export type RemoteSessionComposerQueue = Omit<SessionComposerQueue, QueueMutation> & {
74
+ [K in QueueMutation]: (...args: Parameters<SessionComposerQueue[K]>) => Promise<ReturnType<SessionComposerQueue[K]>>;
75
+ };
76
+
67
77
  export interface CreateSessionComposerQueueOptions {
78
+ ownerId?: string | null;
68
79
  storage?: SessionComposerQueueStorage;
69
80
  storageKey?: string;
70
81
  }
71
82
 
72
83
  export declare const SESSION_COMPOSER_QUEUE_STORAGE_KEY: string;
84
+ export declare function isPersistedStore(value: unknown): boolean;
73
85
 
74
86
  export declare function createSessionComposerQueue(
75
87
  options?: CreateSessionComposerQueueOptions,
@@ -1,3 +1,5 @@
1
+ import { hasValidQueueOwnership, canUpdateBlockedRelease, canBindBlockedRelease, createQueueOwnership } from "./session-composer-queue-ownership.js";
2
+
1
3
  export const SESSION_COMPOSER_QUEUE_STORAGE_KEY =
2
4
  "abot-web.sessionComposerQueue.v1";
3
5
 
@@ -60,6 +62,7 @@ function isQueueRecord(value) {
60
62
  const blockedReleaseItem = value?.blockedReleaseItem ?? null;
61
63
  return Boolean(
62
64
  isRecord(value) &&
65
+ hasValidQueueOwnership(value) &&
63
66
  isNonEmptyString(value.environmentId) &&
64
67
  isNonEmptyString(value.sessionId) &&
65
68
  (value.blockedByReleaseToken === null ||
@@ -72,7 +75,7 @@ function isQueueRecord(value) {
72
75
  );
73
76
  }
74
77
 
75
- function isPersistedStore(value) {
78
+ export function isPersistedStore(value) {
76
79
  if (
77
80
  !isRecord(value) ||
78
81
  value.version !== STORAGE_VERSION ||
@@ -149,7 +152,8 @@ function createReleaseToken() {
149
152
  }
150
153
 
151
154
  export function createSessionComposerQueue({
152
- storage = globalThis.localStorage,
155
+ storage,
156
+ ownerId = null,
153
157
  storageKey = SESSION_COMPOSER_QUEUE_STORAGE_KEY,
154
158
  } = {}) {
155
159
  if (
@@ -210,9 +214,7 @@ export function createSessionComposerQueue({
210
214
  return list(scopeInput)[0] ?? null;
211
215
  }
212
216
 
213
- function getBlockedRelease(scopeInput) {
214
- const scope = validateScope(scopeInput);
215
- const queue = findQueue(readStore(), scope);
217
+ function projectRelease(queue) {
216
218
  if (
217
219
  !queue ||
218
220
  queue.blockedByReleaseToken === null ||
@@ -223,9 +225,14 @@ export function createSessionComposerQueue({
223
225
  return {
224
226
  releaseToken: queue.blockedByReleaseToken,
225
227
  item: cloneJson(queue.blockedReleaseItem),
228
+ ...(queue.blockedReleaseOwner ? { owner: { ...queue.blockedReleaseOwner } } : {}),
226
229
  };
227
230
  }
228
231
 
232
+ function getBlockedRelease(scopeInput) {
233
+ return projectRelease(findQueue(readStore(), validateScope(scopeInput)));
234
+ }
235
+
229
236
  function updateBlockedRelease(scopeInput, releaseToken, itemInput) {
230
237
  const scope = validateScope(scopeInput);
231
238
  if (!isNonEmptyString(releaseToken)) return false;
@@ -239,6 +246,7 @@ export function createSessionComposerQueue({
239
246
  ) {
240
247
  return false;
241
248
  }
249
+ if (!canUpdateBlockedRelease(queue, ownerId)) return false;
242
250
  queue.blockedReleaseItem = item;
243
251
  writeStore(store);
244
252
  return true;
@@ -261,8 +269,9 @@ export function createSessionComposerQueue({
261
269
  const releaseToken = createReleaseToken();
262
270
  queue.blockedByReleaseToken = releaseToken;
263
271
  queue.blockedReleaseItem = item;
272
+ if (ownerId) queue.blockedReleaseOwner = { id: ownerId, state: "editing" };
264
273
  writeStore(store);
265
- return { item: cloneJson(item), releaseToken };
274
+ return projectRelease(queue);
266
275
  }
267
276
 
268
277
  function bindReleasedSuccess(scopeInput, releaseToken, newRequestId) {
@@ -273,12 +282,14 @@ export function createSessionComposerQueue({
273
282
  const store = readStore();
274
283
  const queue = findQueue(store, scope);
275
284
  if (!queue || queue.blockedByReleaseToken !== releaseToken) return false;
285
+ if (!canBindBlockedRelease(queue, ownerId)) return false;
276
286
 
277
287
  if (queue.items[0]) {
278
288
  queue.items[0].waitForRequestId = newRequestId;
279
289
  }
280
290
  queue.blockedByReleaseToken = null;
281
291
  queue.blockedReleaseItem = null;
292
+ delete queue.blockedReleaseOwner;
282
293
  if (queue.items.length === 0) {
283
294
  store.queues = store.queues.filter((candidate) => candidate !== queue);
284
295
  }
@@ -292,12 +303,16 @@ export function createSessionComposerQueue({
292
303
  const store = readStore();
293
304
  const queue = findQueue(store, scope);
294
305
  if (!queue || queue.blockedByReleaseToken === null) return false;
306
+ // A request found in a snapshot is not proof that it belongs to this release.
307
+ if (queue.blockedReleaseOwner) return false;
308
+ if (queue.blockedReleaseItem?.waitForRequestId === newRequestId) return false;
295
309
 
296
310
  if (queue.items[0]) {
297
311
  queue.items[0].waitForRequestId = newRequestId;
298
312
  }
299
313
  queue.blockedByReleaseToken = null;
300
314
  queue.blockedReleaseItem = null;
315
+ delete queue.blockedReleaseOwner;
301
316
  if (queue.items.length === 0) {
302
317
  store.queues = store.queues.filter((candidate) => candidate !== queue);
303
318
  }
@@ -306,6 +321,10 @@ export function createSessionComposerQueue({
306
321
  }
307
322
 
308
323
  return {
324
+ ...createQueueOwnership({
325
+ ownerId, readStore, writeStore, createToken: createReleaseToken, projectRelease,
326
+ getQueue: (store, scope) => findQueue(store, validateScope(scope)),
327
+ }),
309
328
  enqueue,
310
329
  list,
311
330
  peek,
@@ -1,4 +1,5 @@
1
1
  import { createMacCollectionConsent } from "./components/passive-learning/macos-collection-consent.js";
2
+ import { createCollectionConsentGate } from "./components/passive-learning/collection-consent-gate.js";
2
3
  import { createPassiveLearningController } from "./controllers/passive-learning-controller.js";
3
4
  import { createPassiveLearningHome } from "./components/passive-learning/home.js";
4
5
  import { createPassiveLearningMemory } from "./components/passive-learning/memory.js";
@@ -17,8 +18,10 @@ export function createPassiveLearningFeature({
17
18
  let home;
18
19
  let memory;
19
20
  let collectionConsent;
21
+ let macConsent;
20
22
  function renderViews(snapshot) {
21
23
  collectionConsent?.update(snapshot);
24
+ macConsent?.update(snapshot);
22
25
  home?.render(snapshot);
23
26
  memory?.render(snapshot);
24
27
  }
@@ -31,11 +34,16 @@ export function createPassiveLearningFeature({
31
34
  onChange();
32
35
  },
33
36
  });
34
- collectionConsent = createMacCollectionConsent({
37
+ macConsent = createMacCollectionConsent({
35
38
  actions: controller,
36
39
  container: learningRoot,
37
40
  });
38
- const actions = { ...controller, configure: collectionConsent.configure };
41
+ collectionConsent = createCollectionConsentGate({
42
+ actions: { ...controller, configure: macConsent.configure },
43
+ container: learningRoot, openComputerAccess,
44
+ });
45
+ const actions = { ...controller, configure: collectionConsent.configure,
46
+ restartCollection: collectionConsent.restartCollection };
39
47
  home = createPassiveLearningHome({
40
48
  actions,
41
49
  openLearning,
@@ -54,18 +62,23 @@ export function createPassiveLearningFeature({
54
62
  ...actions,
55
63
  setWorkspace(workspace) {
56
64
  collectionConsent.cancel();
65
+ macConsent.cancel();
57
66
  controller.setWorkspace(workspace);
58
67
  },
59
68
  handleRealtime(message) {
60
- if (message?.type === "system-host.changed") collectionConsent.cancel();
69
+ if (message?.type === "system-host.changed") {
70
+ collectionConsent.cancel();
71
+ macConsent.cancel();
72
+ }
61
73
  controller.handleRealtime(message);
62
74
  },
63
75
  environmentChanged() {
64
76
  collectionConsent.cancel();
77
+ macConsent.cancel();
65
78
  controller.environmentChanged();
66
79
  },
67
- mountHome: (root) => {
68
- home.mount(root);
80
+ mountHome: (root, onRendered) => {
81
+ home.mount(root, onRendered);
69
82
  home.render(controller.snapshot());
70
83
  },
71
84
  });
@@ -1,8 +1,10 @@
1
+ import { createWorkspaceConversationOpener } from "./controllers/workspace-conversation-opener.js";
1
2
  import { createSchedulesController } from "./controllers/schedules-controller.js";
2
3
  import { createSchedulesWorkspace } from "./components/schedules/workspace.js";
3
4
 
4
5
  export function createSchedulesFeature({
5
6
  dom,
7
+ state = {},
6
8
  client,
7
9
  shell,
8
10
  selectedEnvironmentId,
@@ -13,6 +15,7 @@ export function createSchedulesFeature({
13
15
  documentRoot = globalThis.document,
14
16
  isRuntimeReady = () => true,
15
17
  }) {
18
+ const openConversation = createWorkspaceConversationOpener({ state, shell, openSession });
16
19
  let view;
17
20
  let active = false;
18
21
  let navigationRevision = 0;
@@ -29,10 +32,8 @@ export function createSchedulesFeature({
29
32
  onNavigationChange();
30
33
  },
31
34
  openConversation: async (sessionId, requestId) => {
32
- if (!shell.activateWorkspace("chat")) return;
33
- if (!sessionId) return;
34
35
  try {
35
- await openSession(sessionId, { page: { targetRequestId: requestId } });
36
+ if (!await openConversation(sessionId, { page: { targetRequestId: requestId } })) return;
36
37
  if (!requestId) return;
37
38
  requestAnimationFrame(() => {
38
39
  const messages = [
@@ -78,6 +79,7 @@ export function createSchedulesFeature({
78
79
  return client.supportsSchedules();
79
80
  },
80
81
  prepareLeave: view.prepareLeave,
82
+ prepareEnvironmentChange: view.prepareEnvironmentChange,
81
83
  navigationRevision: () => navigationRevision,
82
84
  selectedJobId: () => controller.snapshot().selectedId,
83
85
  setActive(value) {
@@ -6,25 +6,33 @@ type SessionSidebarPreferences = {
6
6
  archivedSessionIds: string[];
7
7
  orderedSessionIds: string[];
8
8
  };
9
+ type PreferenceStorage = {
10
+ getItem(key: string): string | null;
11
+ setItem(key: string, value: string): void | Promise<unknown>;
12
+ removeItem(key: string): void | Promise<unknown>;
13
+ subscribe?(listener: () => void): () => void;
14
+ flush?(): Promise<void>;
15
+ snapshot?(): { preferences: Record<string, string> } | null;
16
+ };
9
17
 
10
- export declare function createClientPreferences(storage: Pick<
11
- Storage, "getItem" | "setItem" | "removeItem"
12
- >): {
18
+ export declare function createClientPreferences(storage: PreferenceStorage): {
19
+ subscribe(listener: () => void): (() => void) | undefined;
20
+ flush(): Promise<void> | undefined;
13
21
  loadSessionSidebar(environmentId: string): SessionSidebarPreferences;
14
- saveSessionSidebar(environmentId: string, value: SessionSidebarPreferences): void;
22
+ saveSessionSidebar(environmentId: string, value: SessionSidebarPreferences): void | Promise<unknown>;
15
23
  loadPinnedSessions(): string[];
16
- savePinnedSessions(sessionIds: readonly string[]): void;
24
+ savePinnedSessions(sessionIds: readonly string[]): void | Promise<unknown>;
17
25
  loadSessionModes(normalize: (value: unknown) => ToolPermissionMode): SessionModeMap;
18
- saveSessionModes(modes: SessionModeMap): void;
26
+ saveSessionModes(modes: SessionModeMap): void | Promise<unknown>;
19
27
  loadLastToolPermissionMode(normalize: (value: unknown) => ToolPermissionMode): ToolPermissionMode;
20
- saveLastToolPermissionMode(mode: ToolPermissionMode): void;
28
+ saveLastToolPermissionMode(mode: ToolPermissionMode): void | Promise<unknown>;
21
29
  loadModelPreferences(): {
22
30
  sessionModels: PreferenceMap;
23
31
  lastModelByEnvironment: PreferenceMap;
24
32
  };
25
- saveModelPreferences(sessionModels: PreferenceMap, lastModelByEnvironment: PreferenceMap): void;
33
+ saveModelPreferences(sessionModels: PreferenceMap, lastModelByEnvironment: PreferenceMap): Promise<unknown[]>;
26
34
  environmentId(): string;
27
- saveEnvironmentId(environmentId: string): void;
35
+ saveEnvironmentId(environmentId: string): void | Promise<unknown>;
28
36
  sessionIdForEnvironment(environmentId: string): string;
29
- saveSessionIdForEnvironment(environmentId: string, sessionId: string): void;
37
+ saveSessionIdForEnvironment(environmentId: string, sessionId: string): void | Promise<unknown>;
30
38
  };
@@ -15,10 +15,10 @@ function parseObject(storage, key) {
15
15
  const raw = storage.getItem(key);
16
16
  const value = raw ? JSON.parse(raw) : {};
17
17
  return value && typeof value === "object" && !Array.isArray(value)
18
- ? value
19
- : {};
18
+ ? Object.assign(Object.create(null), value)
19
+ : Object.create(null);
20
20
  } catch {
21
- return {};
21
+ return Object.create(null);
22
22
  }
23
23
  }
24
24
 
@@ -36,10 +36,15 @@ function restoreSessionMode(value, normalizeToolPermissionMode) {
36
36
 
37
37
  export function createClientPreferences(storage) {
38
38
  return {
39
+ subscribe: (listener) => storage.subscribe?.(listener),
40
+ flush: () => storage.flush?.(),
39
41
  ...createSessionSidebarPreferences(storage),
40
42
  loadPinnedSessions() {
41
43
  try {
42
- const raw = storage.getItem(storageKeys.pinnedSessions);
44
+ const acknowledged = storage.snapshot?.();
45
+ const raw = acknowledged
46
+ ? acknowledged.preferences[storageKeys.pinnedSessions]
47
+ : storage.getItem(storageKeys.pinnedSessions);
43
48
  const value = raw ? JSON.parse(raw) : [];
44
49
  return Array.isArray(value)
45
50
  ? value.map((id) => String(id || "")).filter(Boolean)
@@ -50,7 +55,7 @@ export function createClientPreferences(storage) {
50
55
  },
51
56
 
52
57
  savePinnedSessions(sessionIds) {
53
- storage.setItem(storageKeys.pinnedSessions, JSON.stringify(sessionIds));
58
+ return storage.setItem(storageKeys.pinnedSessions, JSON.stringify(sessionIds));
54
59
  },
55
60
 
56
61
  loadSessionModes(normalizeToolPermissionMode) {
@@ -61,24 +66,25 @@ export function createClientPreferences(storage) {
61
66
  return restored ? [[sessionId, restored]] : [];
62
67
  },
63
68
  ));
64
- storage.setItem(storageKeys.sessionModes, JSON.stringify(modes));
65
- return modes;
69
+ return Object.assign(Object.create(null), modes);
66
70
  },
67
71
 
68
72
  saveSessionModes(modes) {
69
- storage.setItem(storageKeys.sessionModes, JSON.stringify(modes));
73
+ return storage.setItem(storageKeys.sessionModes, JSON.stringify(modes));
70
74
  },
71
75
 
72
76
  loadLastToolPermissionMode(normalizeToolPermissionMode) {
73
77
  try {
74
- return normalizeToolPermissionMode(storage.getItem(storageKeys.lastToolPermissionMode));
78
+ const mode = storage.getItem(storageKeys.lastToolPermissionMode);
79
+ if (!["ask", "full_access", "full_plus"].includes(mode)) return "ask";
80
+ return normalizeToolPermissionMode(mode);
75
81
  } catch {
76
- return "full_access";
82
+ return "ask";
77
83
  }
78
84
  },
79
85
 
80
86
  saveLastToolPermissionMode(mode) {
81
- storage.setItem(storageKeys.lastToolPermissionMode, mode);
87
+ return storage.setItem(storageKeys.lastToolPermissionMode, mode);
82
88
  },
83
89
 
84
90
  loadModelPreferences() {
@@ -92,11 +98,14 @@ export function createClientPreferences(storage) {
92
98
  },
93
99
 
94
100
  saveModelPreferences(sessionModels, lastModelByEnvironment) {
95
- storage.setItem(storageKeys.sessionModels, JSON.stringify(sessionModels));
96
- storage.setItem(
101
+ const sessions = storage.setItem(storageKeys.sessionModels, JSON.stringify(sessionModels));
102
+ const environments = storage.setItem(
97
103
  storageKeys.lastModelByEnvironment,
98
104
  JSON.stringify(lastModelByEnvironment),
99
105
  );
106
+ const saved = Promise.all([sessions, environments]);
107
+ void saved.catch(() => {});
108
+ return saved;
100
109
  },
101
110
 
102
111
  environmentId() {
@@ -105,8 +114,8 @@ export function createClientPreferences(storage) {
105
114
 
106
115
  saveEnvironmentId(environmentId) {
107
116
  if (environmentId)
108
- storage.setItem(storageKeys.environmentId, environmentId);
109
- else storage.removeItem(storageKeys.environmentId);
117
+ return storage.setItem(storageKeys.environmentId, environmentId);
118
+ return storage.removeItem(storageKeys.environmentId);
110
119
  },
111
120
 
112
121
  sessionIdForEnvironment(environmentId) {
@@ -124,7 +133,7 @@ export function createClientPreferences(storage) {
124
133
  );
125
134
  if (sessionId) sessions[environmentId] = sessionId;
126
135
  else delete sessions[environmentId];
127
- storage.setItem(
136
+ return storage.setItem(
128
137
  storageKeys.currentSessionByEnvironment,
129
138
  JSON.stringify(sessions),
130
139
  );
@@ -1,4 +1,4 @@
1
- /** Browser-local review receipts only. Memory content never goes into storage. */
1
+ /** Bounded review receipts only. Memory content is owned by the memory service. */
2
2
  export function createHomeGuidancePreferences(storage) {
3
3
  const key = (environment) => `abot-web.homeGuidance.${encodeURIComponent(environment)}`;
4
4
  const volatile = new Map();
@@ -9,35 +9,35 @@ export function createHomeGuidancePreferences(storage) {
9
9
  if (value && typeof value === "object" && !Array.isArray(value)) return {
10
10
  offeredOn: typeof value.offeredOn === "string" ? value.offeredOn : "",
11
11
  dismissed: Array.isArray(value.dismissed) ? value.dismissed.filter((id) => typeof id === "string").slice(-8) : [],
12
- reviewed: Array.isArray(value.reviewed) ? value.reviewed.filter((id) => typeof id === "string").slice(-200) : [],
12
+ reviewed: Array.isArray(value.reviewed) ? value.reviewed.filter((item) => typeof item?.id === "string" && typeof item.updatedAt === "string").slice(-200) : [],
13
13
  };
14
- } catch { /* Browser preferences may be unavailable. */ }
14
+ } catch { /* A malformed projection does not count as a review receipt. */ }
15
15
  return volatile.get(environment) || {};
16
16
  }
17
17
  function save(environment, patch) {
18
18
  const value = { ...read(environment), ...patch };
19
- try {
20
- if (!storage) throw new Error("Storage unavailable");
21
- storage.setItem(key(environment), JSON.stringify(value));
22
- volatile.delete(environment);
23
- } catch { volatile.set(environment, value); }
19
+ if (!storage) { volatile.set(environment, value); return; }
20
+ return storage.setItem(key(environment), JSON.stringify(value));
24
21
  }
25
22
  return {
26
23
  dismissed: (environment) => read(environment).dismissed || [],
27
24
  dismiss(environment, id) {
28
25
  const dismissed = new Set(read(environment).dismissed || []);
29
26
  dismissed.add(id);
30
- save(environment, { dismissed: [...dismissed].slice(-8) });
27
+ return save(environment, { dismissed: [...dismissed].slice(-8) });
31
28
  },
32
29
  wasOffered: (environment, day) => read(environment).offeredOn === day,
33
30
  markOffered: (environment, day) => save(environment, { offeredOn: day }),
34
31
  hasReviewed(environment, record) {
35
- return (read(environment).reviewed || []).includes(`${record.id}:${record.updatedAt}`);
32
+ return (read(environment).reviewed || []).some((item) => item.id === record.id && item.updatedAt === record.updatedAt);
36
33
  },
37
34
  markReviewed(environment, record) {
38
- const receipt = `${record.id}:${record.updatedAt}`;
39
- const reviewed = (read(environment).reviewed || []).filter((id) => id !== receipt);
40
- save(environment, { reviewed: [...reviewed, receipt].slice(-200) });
35
+ const reviewed = (read(environment).reviewed || []).filter((item) => item.id !== record.id);
36
+ return save(environment, { reviewed: [...reviewed, { id: record.id, updatedAt: record.updatedAt }].slice(-200) });
37
+ },
38
+ forgetReviewed(environment, id) {
39
+ const reviewed = (read(environment).reviewed || []).filter((item) => item.id !== id);
40
+ return save(environment, { reviewed });
41
41
  },
42
42
  };
43
43
  }
@@ -0,0 +1,12 @@
1
+ /** Save only the selected profile flag through the revision-checked config service. */
2
+ export async function enableModelReasoning(client, profileId, environmentId) {
3
+ const payload = await client.loadConfigDashboard(environmentId, { settled: true });
4
+ const file = payload?.dashboard?.files?.models?.find((item) => item.id === profileId && item.registered === true);
5
+ if (!file || file.invalidJson || !file.revision)
6
+ throw new Error("This model cannot be updated here. Open Models to review its configuration.");
7
+ if (file.config?.supportsThinking === true) return;
8
+ await client.saveConfigFile({
9
+ environmentId, kind: "model", id: profileId,
10
+ config: { ...file.config, supportsThinking: true }, expectedRevision: file.revision,
11
+ });
12
+ }
@@ -47,8 +47,16 @@ export function createAutomationRequests({ requestApi, getEnvironmentId, getConf
47
47
  requestAutomation(path(`/${encodeURIComponent(automationId)}/permission`, environmentId), {
48
48
  method: "PUT", body: JSON.stringify(permission),
49
49
  }),
50
- getAutomationCatalog: (automationId, environmentId) =>
51
- requestAutomation(`${path("/catalog", environmentId)}&automation=${encodeURIComponent(automationId)}`),
50
+ async getAutomationCatalog(automationId, environmentId = getEnvironmentId()) {
51
+ const [catalog, modelCatalog] = await Promise.all([
52
+ requestAutomation(`${path("/catalog", environmentId)}&automation=${encodeURIComponent(automationId)}`),
53
+ requestAutomation(`/chat/models?environment=${encodeURIComponent(environmentId)}`),
54
+ ]);
55
+ return { ...catalog, models: (catalog.models || []).map((model) => ({
56
+ ...model,
57
+ supportsThinking: modelCatalog.profiles?.find((profile) => profile.id === model.id)?.supportsThinking === true,
58
+ })) };
59
+ },
52
60
  startAutomationRun: (automationId, idempotencyKey, environmentId) =>
53
61
  post(path(`/${encodeURIComponent(automationId)}/run`, environmentId), { idempotencyKey }),
54
62
  listAutomationRuns: (automationId, environmentId) =>
@@ -2,6 +2,7 @@ export function createLongTermMemoryRequests({
2
2
  requestApi,
3
3
  getEnvironmentId,
4
4
  environmentQuery,
5
+ onMemoryDeleted = async () => {},
5
6
  }) {
6
7
  return Object.freeze({
7
8
  loadLongTermMemoryStatus(environmentId = getEnvironmentId()) {
@@ -102,13 +103,17 @@ export function createLongTermMemoryRequests({
102
103
  });
103
104
  },
104
105
 
105
- deleteLongTermMemory({ environmentId = getEnvironmentId(), id }) {
106
- return requestApi(
106
+ async deleteLongTermMemory({ environmentId = getEnvironmentId(), id }) {
107
+ const result = await requestApi(
107
108
  `/runtime/memory/records/${encodeURIComponent(
108
109
  id,
109
110
  )}?environment=${environmentQuery(environmentId)}`,
110
111
  { method: "DELETE" },
111
112
  );
113
+ if (result?.deleted !== true) return result;
114
+ try { await onMemoryDeleted(environmentId, id); }
115
+ catch { /* Receipt storage reports its failure separately; DELETE already succeeded. */ }
116
+ return result;
112
117
  },
113
118
  });
114
119
  }
@@ -14,6 +14,8 @@ export function createSystemHostRequests({ requestApi, getConfig, getEnvironment
14
14
  return {
15
15
  supportsSystemHostConnection,
16
16
  getSystemHostConnection: () => requestSystemHost(`?environment=${encodeURIComponent(getEnvironmentId())}`),
17
+ acceptSystemHostCollectionConsent: () =>
18
+ requestSystemHost("/collection-consent", { method: "POST", body: JSON.stringify({ acknowledged: true }) }),
17
19
  requestSystemHostPermissions: (input) =>
18
20
  requestSystemHost("/permissions", { method: "POST", body: JSON.stringify(input) }),
19
21
  connectLocalSystemHost: () =>
@@ -84,6 +84,7 @@ export declare function createRuntimeWebClient(options: {
84
84
  getEnvironmentId: () => string;
85
85
  fetchImpl?: typeof fetch;
86
86
  origin?: string;
87
+ onMemoryDeleted?: (environmentId: string, id: string) => Promise<unknown> | void;
87
88
  }): {
88
89
  supportsSparkChat: SparkChatRequests["supportsSparkChat"];
89
90
  loadSparkChat: SparkChatRequests["loadSparkChat"];
@@ -99,6 +100,7 @@ export declare function createRuntimeWebClient(options: {
99
100
  decideToolApproval: ToolApprovalRequests["decideToolApproval"];
100
101
  supportsSystemHostConnection(): boolean;
101
102
  getSystemHostConnection(): Promise<Record<string, unknown>>;
103
+ acceptSystemHostCollectionConsent(): Promise<Record<string, unknown>>;
102
104
  requestSystemHostPermissions(input: Record<string, unknown>): Promise<Record<string, unknown>>;
103
105
  connectLocalSystemHost(): Promise<Record<string, unknown>>;
104
106
  requestSystemHostStoreConnection(): Promise<Record<string, unknown>>;