@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
@@ -1,33 +1,11 @@
1
1
  import { escapeAttribute, escapeHtml, textOf } from "../lib/text-format.js";
2
2
  import { normalizeToolPermissionMode } from "../lib/tool-permission-mode.js";
3
+ import { createReasoningModeController } from "./reasoning-mode-controller.js";
3
4
  import { createToolPermissionModeController } from "./tool-permission-mode-controller.js";
4
5
 
5
6
  export { normalizeToolPermissionMode } from "../lib/tool-permission-mode.js";
6
7
 
7
- export function normalizeAgentMode(mode) {
8
- const normalized = textOf(mode).trim().toLowerCase();
9
- return ["fast", "reasoning", "deep", "auto"].includes(normalized)
10
- ? normalized
11
- : "reasoning";
12
- }
13
-
14
- function agentModeMeta(mode) {
15
- const modes = {
16
- auto: { label: "Auto", description: "Lets the agent choose", icon: "*" },
17
- fast: { label: "Fast", description: "Shorter and quicker", icon: "!" },
18
- deep: {
19
- label: "Deep analysis",
20
- description: "More careful responses",
21
- icon: "D",
22
- },
23
- reasoning: {
24
- label: "Reasoning",
25
- description: "Balanced speed and thinking",
26
- icon: "R",
27
- },
28
- };
29
- return modes[normalizeAgentMode(mode)] || modes.reasoning;
30
- }
8
+ export { normalizeAgentMode } from "./reasoning-mode-controller.js";
31
9
 
32
10
  export function createRuntimeSelectionController({
33
11
  state,
@@ -41,18 +19,14 @@ export function createRuntimeSelectionController({
41
19
  onModelCatalogLoading = () => {},
42
20
  onModelCatalogLoaded = () => {},
43
21
  onModelCatalogUnavailable = () => {},
22
+ onReasoningConfigurationApplied,
44
23
  }) {
45
- let agentModeLoadRevision = 0;
46
- const agentModeMutationRevisions = new Map();
47
- let agentModeMutationInFlight = false;
24
+ let modelCatalogEnvironmentId = null;
48
25
  let modelCatalogLoadRevision = 0;
49
26
 
50
- const agentModeMutationRevisionFor = (environmentId) =>
51
- agentModeMutationRevisions.get(environmentId) || 0;
52
-
53
- function configuredEnvironmentOptions() {
54
- const raw = Array.isArray(state.config?.environments)
55
- ? state.config.environments
27
+ function configuredEnvironmentOptions(config = state.config) {
28
+ const raw = Array.isArray(config?.environments)
29
+ ? config.environments
56
30
  : [];
57
31
  const options = raw
58
32
  .map((entry) => {
@@ -63,7 +37,7 @@ export function createRuntimeSelectionController({
63
37
  })
64
38
  .filter(Boolean);
65
39
  if (options.length > 0) return options;
66
- const fallback = textOf(state.config?.defaultEnvironmentId).trim();
40
+ const fallback = textOf(config?.defaultEnvironmentId).trim();
67
41
  return fallback ? [{ value: fallback, label: fallback }] : [];
68
42
  }
69
43
 
@@ -166,6 +140,7 @@ export function createRuntimeSelectionController({
166
140
  function applyModelSelection() {
167
141
  if (!dom.modelSelect.options.length) {
168
142
  modelSelector.sync();
143
+ renderAgentMode();
169
144
  return;
170
145
  }
171
146
  const target =
@@ -179,6 +154,7 @@ export function createRuntimeSelectionController({
179
154
  dom.modelSelect.value = target;
180
155
  }
181
156
  modelSelector.sync();
157
+ renderAgentMode();
182
158
  }
183
159
 
184
160
  function rememberModelSelection() {
@@ -188,6 +164,7 @@ export function createRuntimeSelectionController({
188
164
  if (getComposerSessionId())
189
165
  state.sessionModels[getComposerSessionId()] = profileId;
190
166
  saveModelPreferences();
167
+ renderAgentMode();
191
168
  }
192
169
 
193
170
  const {
@@ -197,127 +174,11 @@ export function createRuntimeSelectionController({
197
174
  state, dom, preferences, recordControlEvent, getComposerSessionId,
198
175
  });
199
176
 
200
- function renderAgentMode() {
201
- const meta = agentModeMeta(state.agentMode);
202
- dom.agentModeButton.title = `Reasoning depth: ${meta.label}`;
203
- dom.agentModeButton.setAttribute("aria-label", `Reasoning depth: ${meta.label}`);
204
- dom.agentModeButton.disabled = agentModeMutationInFlight;
205
- dom.agentModeButton.innerHTML = `
206
- <span class="agent-mode-icon">${escapeHtml(meta.icon)}</span>
207
- <span>${escapeHtml(meta.label)}</span>`;
208
- dom.agentModeButton.classList.toggle("open", state.agentModeMenuOpen);
209
- dom.agentModeButton.setAttribute(
210
- "aria-expanded",
211
- state.agentModeMenuOpen ? "true" : "false",
212
- );
213
- dom.agentModeMenu.classList.toggle("open", state.agentModeMenuOpen);
214
- dom.agentModeMenu.hidden = !state.agentModeMenuOpen;
215
- dom.agentModeMenu.setAttribute("role", "menu");
216
- dom.agentModeMenu.innerHTML = state.supportedAgentModes
217
- .map((mode) => {
218
- const item = agentModeMeta(mode);
219
- const selected = normalizeAgentMode(mode) === state.agentMode;
220
- return `
221
- <button class="agent-mode-option ${selected ? "selected" : ""}" type="button"
222
- role="menuitemradio" aria-checked="${selected ? "true" : "false"}"
223
- tabindex="${selected ? "0" : "-1"}" data-mode="${escapeAttribute(mode)}" ${agentModeMutationInFlight ? "disabled" : ""}>
224
- <span class="agent-mode-option-icon">${escapeHtml(item.icon)}</span>
225
- <span><strong>${escapeHtml(item.label)}</strong><small>${escapeHtml(item.description)}</small></span>
226
- </button>`;
227
- })
228
- .join("");
229
- dom.agentModeMenu
230
- .querySelectorAll(".agent-mode-option")
231
- .forEach((button) => {
232
- button.addEventListener(
233
- "click",
234
- () => void setAgentMode(button.dataset.mode),
235
- );
236
- });
237
- }
238
-
239
- async function loadAgentMode() {
240
- const revision = ++agentModeLoadRevision;
241
- const environmentId = selectedEnvironmentId();
242
- const mutationRevision = agentModeMutationRevisionFor(environmentId);
243
- renderAgentMode();
244
- try {
245
- const payload = await client.getAgentMode(environmentId);
246
- if (
247
- revision !== agentModeLoadRevision ||
248
- mutationRevision !== agentModeMutationRevisionFor(environmentId) ||
249
- environmentId !== selectedEnvironmentId()
250
- ) {
251
- return false;
252
- }
253
- state.agentMode = normalizeAgentMode(payload.mode);
254
- state.supportedAgentModes = Array.isArray(payload.supportedModes)
255
- ? payload.supportedModes.map(normalizeAgentMode)
256
- : state.supportedAgentModes;
257
- renderAgentMode();
258
- return true;
259
- } catch {
260
- if (
261
- revision !== agentModeLoadRevision ||
262
- mutationRevision !== agentModeMutationRevisionFor(environmentId) ||
263
- environmentId !== selectedEnvironmentId()
264
- ) {
265
- return false;
266
- }
267
- state.agentMode = "reasoning";
268
- renderAgentMode();
269
- return false;
270
- }
271
- }
272
-
273
- async function setAgentMode(mode) {
274
- if (agentModeMutationInFlight) return false;
275
- agentModeMutationInFlight = true;
276
- const environmentId = selectedEnvironmentId();
277
- const revision = agentModeMutationRevisionFor(environmentId) + 1;
278
- agentModeMutationRevisions.set(environmentId, revision);
279
- const loadRevisionAtStart = ++agentModeLoadRevision;
280
- const previousMode = state.agentMode;
281
- const requestedMode = normalizeAgentMode(mode);
282
- state.agentMode = requestedMode;
283
- state.agentModeMenuOpen = false;
284
- renderAgentMode();
285
- dom.agentModeButton.focus();
286
- try {
287
- const payload = await client.setAgentMode(requestedMode, environmentId);
288
- if (
289
- revision !== agentModeMutationRevisionFor(environmentId) ||
290
- environmentId !== selectedEnvironmentId()
291
- ) {
292
- return false;
293
- }
294
- agentModeLoadRevision += 1;
295
- state.agentMode = normalizeAgentMode(payload.mode);
296
- renderAgentMode();
297
- return true;
298
- } catch (error) {
299
- if (
300
- revision !== agentModeMutationRevisionFor(environmentId) ||
301
- environmentId !== selectedEnvironmentId()
302
- ) {
303
- return false;
304
- }
305
- if (agentModeLoadRevision === loadRevisionAtStart) {
306
- state.agentMode = previousMode;
307
- renderAgentMode();
308
- }
309
- recordControlEvent({
310
- type: "control",
311
- name: "Reasoning mode update failed",
312
- tone: "failed",
313
- summary: error instanceof Error ? error.message : String(error),
314
- });
315
- return false;
316
- } finally {
317
- agentModeMutationInFlight = false;
318
- renderAgentMode();
319
- }
320
- }
177
+ const { renderAgentMode, loadAgentMode, setAgentMode } = createReasoningModeController({
178
+ state, dom, client, selectedEnvironmentId,
179
+ selectedModelProfile: () => modelCatalogEnvironmentId !== null && modelCatalogEnvironmentId !== selectedEnvironmentId() ? null : selectedModelProfile(),
180
+ reloadModels: onReasoningConfigurationApplied || loadModels, recordControlEvent,
181
+ });
321
182
 
322
183
  function renderModels() {
323
184
  dom.modelSelect.innerHTML = "";
@@ -328,6 +189,7 @@ export function createRuntimeSelectionController({
328
189
  option.textContent = "No models configured";
329
190
  dom.modelSelect.appendChild(option);
330
191
  modelSelector.sync();
192
+ renderAgentMode();
331
193
  return;
332
194
  }
333
195
  for (const profile of state.modelProfiles) {
@@ -345,6 +207,7 @@ export function createRuntimeSelectionController({
345
207
  async function loadModels() {
346
208
  const revision = ++modelCatalogLoadRevision;
347
209
  const environmentId = selectedEnvironmentId();
210
+ renderAgentMode();
348
211
  onModelCatalogLoading();
349
212
  let payload = null;
350
213
  try {
@@ -355,6 +218,7 @@ export function createRuntimeSelectionController({
355
218
  ) {
356
219
  return false;
357
220
  }
221
+ modelCatalogEnvironmentId = environmentId;
358
222
  state.defaultModelProfileId = textOf(payload.defaultProfileId);
359
223
  state.modelProfiles = Array.isArray(payload.profiles)
360
224
  ? payload.profiles
@@ -366,6 +230,7 @@ export function createRuntimeSelectionController({
366
230
  ) {
367
231
  return false;
368
232
  }
233
+ modelCatalogEnvironmentId = environmentId;
369
234
  state.defaultModelProfileId = "";
370
235
  state.modelProfiles = [];
371
236
  renderModels();
@@ -1,3 +1,4 @@
1
+ import { createSessionPinUpdates } from "./session-pin-updates.js";
1
2
  import {
2
3
  isOlderSessionReadState,
3
4
  isSessionReadStateUnavailable,
@@ -19,6 +20,7 @@ export function createSessionController({
19
20
  selectedEnvironmentId,
20
21
  onOpen,
21
22
  onClearCurrent,
23
+ onSessionAttachmentsCleared = () => {},
22
24
  onClearSessionMode,
23
25
  onSaveModelPreferences,
24
26
  onReload,
@@ -28,13 +30,14 @@ export function createSessionController({
28
30
  copyText = (value) => navigator.clipboard.writeText(value),
29
31
  }) {
30
32
  let pagination;
33
+ const updatePinnedSessions = createSessionPinUpdates({ state, preferences });
31
34
  const titleOf = (session) =>
32
35
  textOf(session?.displayName || session?.title || session?.id);
33
36
  const byId = (sessionId) =>
34
37
  state.sessions.find((session) => textOf(session.id) === sessionId);
35
38
  const isPinned = (sessionId) => state.pinnedSessionIds.includes(sessionId);
36
39
  const sidebar = createSessionSidebarController({
37
- state, preferences, selectedEnvironmentId, showToast: shell?.showToast,
40
+ state, preferences, updatePinnedSessions, selectedEnvironmentId, showToast: shell?.showToast,
38
41
  render: () => { (onSidebarChange ?? render)(); void pagination?.load(); }, getFilteredSessions: filtered,
39
42
  getPageInfo: () => pagination?.info(),
40
43
  });
@@ -98,7 +101,7 @@ export function createSessionController({
98
101
  <button class="session-action pin-action" type="button" role="menuitem" tabindex="-1" title="${pinned ? "Unpin session" : "Pin session"}">${pinned ? "Unpin" : "Pin"}</button>
99
102
  <button class="session-action move-up-action" type="button" role="menuitem" tabindex="-1">Move up</button>
100
103
  <button class="session-action move-down-action" type="button" role="menuitem" tabindex="-1">Move down</button>
101
- <button class="session-action archive-action" type="button" role="menuitem" tabindex="-1" title="Hide or restore this conversation in this browser and environment">${sidebar.isArchiveView() ? "Restore" : "Archive"}</button>
104
+ <button class="session-action archive-action" type="button" role="menuitem" tabindex="-1" title="Hide or restore this conversation in this ABot installation and environment">${sidebar.isArchiveView() ? "Restore" : "Archive"}</button>
102
105
  <button class="session-action copy-filename-action" type="button" role="menuitem" tabindex="-1" title="Copy session filename">Copy filename</button>
103
106
  <button class="session-action clear-action" type="button" role="menuitem" tabindex="-1" title="Reset messages">Reset</button>
104
107
  <button class="session-action delete-action" type="button" role="menuitem" tabindex="-1" title="Delete session">Delete</button>
@@ -227,12 +230,13 @@ export function createSessionController({
227
230
  render();
228
231
  }
229
232
 
230
- function togglePinned(sessionId) {
233
+ async function togglePinned(sessionId) {
231
234
  if (!sessionId) return;
232
- state.pinnedSessionIds = isPinned(sessionId)
233
- ? state.pinnedSessionIds.filter((item) => item !== sessionId)
234
- : [sessionId, ...state.pinnedSessionIds];
235
- preferences.savePinnedSessions(state.pinnedSessionIds);
235
+ try {
236
+ await updatePinnedSessions((pins) => pins.includes(sessionId)
237
+ ? pins.filter((item) => item !== sessionId) : [sessionId, ...pins]);
238
+ }
239
+ catch { shell.showToast("Could not save pinned conversations", "failed"); return; }
236
240
  render();
237
241
  void pagination?.load();
238
242
  }
@@ -255,13 +259,17 @@ export function createSessionController({
255
259
  )
256
260
  )
257
261
  return;
262
+ const scope = { environmentId: selectedEnvironmentId(), sessionId };
258
263
  setBusy(sessionId, true);
259
264
  try {
260
- await client.clearSessionMessages(sessionId, selectedEnvironmentId());
265
+ await client.clearSessionMessages(sessionId, scope.environmentId);
266
+ onSessionAttachmentsCleared(scope);
267
+ if (selectedEnvironmentId() !== scope.environmentId) return;
261
268
  onClearSessionMode(sessionId);
262
269
  if (state.currentSessionId === sessionId) onClearCurrent(false);
263
270
  await onReload();
264
271
  } catch (error) {
272
+ if (selectedEnvironmentId() !== scope.environmentId) return;
265
273
  onControlEvent({
266
274
  type: "control",
267
275
  name: "Session clear failed",
@@ -269,7 +277,8 @@ export function createSessionController({
269
277
  summary: error instanceof Error ? error.message : String(error),
270
278
  });
271
279
  } finally {
272
- setBusy(sessionId, false);
280
+ state.busySessionIds.delete(sessionId);
281
+ if (selectedEnvironmentId() === scope.environmentId) render();
273
282
  }
274
283
  }
275
284
 
@@ -281,21 +290,26 @@ export function createSessionController({
281
290
  )
282
291
  )
283
292
  return;
293
+ const scope = { environmentId: selectedEnvironmentId(), sessionId };
284
294
  setBusy(sessionId, true);
285
295
  try {
286
- await client.deleteSession(sessionId, selectedEnvironmentId());
287
- state.pinnedSessionIds = state.pinnedSessionIds.filter(
288
- (item) => item !== sessionId,
289
- );
290
- preferences.savePinnedSessions(state.pinnedSessionIds);
296
+ await client.deleteSession(sessionId, scope.environmentId);
297
+ onSessionAttachmentsCleared(scope);
298
+ if (selectedEnvironmentId() !== scope.environmentId) return;
299
+ void updatePinnedSessions((pins) => pins.filter((item) => item !== sessionId))
300
+ .then(() => { if (selectedEnvironmentId() === scope.environmentId) render(); })
301
+ .catch(() => {
302
+ if (selectedEnvironmentId() === scope.environmentId)
303
+ shell.showToast("Conversation deleted, but its saved pin could not be removed", "failed");
304
+ });
291
305
  onClearSessionMode(sessionId);
292
306
  delete state.sessionModels[sessionId];
293
307
  onSaveModelPreferences();
294
308
  if (
295
- preferences.sessionIdForEnvironment(selectedEnvironmentId()) ===
309
+ preferences.sessionIdForEnvironment(scope.environmentId) ===
296
310
  sessionId
297
311
  ) {
298
- preferences.saveSessionIdForEnvironment(selectedEnvironmentId(), "");
312
+ preferences.saveSessionIdForEnvironment(scope.environmentId, "");
299
313
  }
300
314
  state.sessions = state.sessions.filter(
301
315
  (session) => session.id !== sessionId,
@@ -304,6 +318,7 @@ export function createSessionController({
304
318
  render();
305
319
  await onReload();
306
320
  } catch (error) {
321
+ if (selectedEnvironmentId() !== scope.environmentId) return;
307
322
  onControlEvent({
308
323
  type: "control",
309
324
  name: "Session delete failed",
@@ -311,7 +326,8 @@ export function createSessionController({
311
326
  summary: error instanceof Error ? error.message : String(error),
312
327
  });
313
328
  } finally {
314
- setBusy(sessionId, false);
329
+ state.busySessionIds.delete(sessionId);
330
+ if (selectedEnvironmentId() === scope.environmentId) render();
315
331
  }
316
332
  }
317
333
 
@@ -0,0 +1,14 @@
1
+ /** Apply explicit pin actions in order, publishing only acknowledged values. */
2
+ export function createSessionPinUpdates({ state, preferences }) {
3
+ let pending = Promise.resolve();
4
+ return function updatePinnedSessions(change) {
5
+ const saving = pending.then(async () => {
6
+ const next = change(state.pinnedSessionIds);
7
+ await preferences.savePinnedSessions(next);
8
+ state.pinnedSessionIds = next;
9
+ });
10
+ // A rejected action must not prevent a later explicit action from settling.
11
+ pending = saving.catch(() => {});
12
+ return saving;
13
+ };
14
+ }
@@ -6,7 +6,7 @@ import { renderSessionSidebarSections } from "../components/session-sidebar-sect
6
6
  import { filterSessionsByArchiveState } from "../lib/session-archive-visibility.js";
7
7
 
8
8
  export function createSessionSidebarController({
9
- state, preferences, selectedEnvironmentId = () => "", render, showToast, getFilteredSessions, getPageInfo = () => undefined,
9
+ state, preferences, updatePinnedSessions, selectedEnvironmentId = () => "", render, showToast, getFilteredSessions, getPageInfo = () => undefined,
10
10
  }) {
11
11
  let showingArchived = false;
12
12
  let environmentId = selectedEnvironmentId();
@@ -42,27 +42,25 @@ export function createSessionSidebarController({
42
42
  );
43
43
  }
44
44
 
45
- function saveSidebar(value) {
45
+ async function saveSidebar(value) {
46
46
  try {
47
- preferences.saveSessionSidebar(environmentId, value);
47
+ await preferences.saveSessionSidebar(environmentId, value);
48
48
  return true;
49
49
  } catch {
50
- showToast?.("Could not save conversation preferences in this browser", "failed");
50
+ showToast?.("Could not save conversation preferences in ABot", "failed");
51
51
  return false;
52
52
  }
53
53
  }
54
54
 
55
- function move(sourceId, targetId, placement) {
55
+ async function move(sourceId, targetId, placement) {
56
56
  if (!canMoveSidebarSession(sourceId, targetId)) return;
57
57
  if (state.pinnedSessionIds.includes(sourceId)) {
58
- const pinned = moveSidebarSession(state.pinnedSessionIds, sourceId, targetId, placement);
59
58
  try {
60
- preferences.savePinnedSessions(pinned);
59
+ await updatePinnedSessions((pins) => moveSidebarSession(pins, sourceId, targetId, placement));
61
60
  } catch {
62
61
  showToast?.("Could not save pinned conversation order", "failed");
63
62
  return;
64
63
  }
65
- state.pinnedSessionIds = pinned;
66
64
  render();
67
65
  return;
68
66
  }
@@ -72,10 +70,10 @@ export function createSessionSidebarController({
72
70
  saved.orderedSessionIds = moveSidebarSession(
73
71
  [...unrankedIds, ...saved.orderedSessionIds], sourceId, targetId, placement,
74
72
  );
75
- if (saveSidebar(saved)) render();
73
+ if (await saveSidebar(saved)) render();
76
74
  }
77
75
 
78
- function moveInDirection(session, direction) {
76
+ async function moveInDirection(session, direction) {
79
77
  const group = sessionSidebarGroup(session, state.pinnedSessionIds);
80
78
  const siblings = getFilteredSessions().filter(isSessionVisibleInSidebar).filter((candidate) =>
81
79
  sessionSidebarGroup(candidate, state.pinnedSessionIds) === group,
@@ -84,7 +82,7 @@ export function createSessionSidebarController({
84
82
  if (index < 0) return;
85
83
  const target = siblings[index + direction];
86
84
  if (!target) return;
87
- move(session.id, target.id, direction < 0 ? "before" : "after");
85
+ await move(session.id, target.id, direction < 0 ? "before" : "after");
88
86
  document.getElementById(`session-open-${encodeURIComponent(session.id)}`)?.focus();
89
87
  }
90
88
 
@@ -97,17 +95,17 @@ export function createSessionSidebarController({
97
95
  return true;
98
96
  }
99
97
 
100
- function setSessionArchived(sessionId, archived) {
98
+ async function setSessionArchived(sessionId, archived) {
101
99
  if (!sessionId) return false;
102
100
  const saved = savedPreferences();
103
101
  if (saved.archivedSessionIds.includes(sessionId) === archived) return true;
104
102
  saved.archivedSessionIds = archived
105
103
  ? [...saved.archivedSessionIds, sessionId]
106
104
  : saved.archivedSessionIds.filter((id) => id !== sessionId);
107
- if (!saveSidebar(saved)) return false;
105
+ if (!await saveSidebar(saved)) return false;
108
106
  render();
109
107
  sidebarRoot?.querySelector(".session-archive-toggle")?.focus();
110
- showToast?.(archived ? "Conversation archived in this browser" : "Conversation restored");
108
+ showToast?.(archived ? "Conversation archived" : "Conversation restored");
111
109
  return true;
112
110
  }
113
111
 
@@ -95,7 +95,7 @@ export function createSparkChatSync({
95
95
  try {
96
96
  const result = await client.loadSparkChat(environmentId);
97
97
  if (!isCurrentRead(environmentId, readRevision)) return;
98
- if (modelCatalogEnvironment !== environmentId || !modelProfiles.some((profile) => profile.id === result.modelProfileId)) {
98
+ if (consolidateNext || modelCatalogEnvironment !== environmentId || !modelProfiles.some((profile) => profile.id === result.modelProfileId)) {
99
99
  const catalog = await client.listModels(environmentId);
100
100
  if (!isCurrentRead(environmentId, readRevision)) return;
101
101
  modelProfiles = catalog.profiles || catalog.models || [];
@@ -111,7 +111,7 @@ export function createSparkChatSync({
111
111
  onHistoryReset();
112
112
  }
113
113
  if (hasReadableGeneration(result.readState)) readGeneration = result.readState.readGeneration;
114
- onConfiguration({ ...result, supportsImageInput, modelAvailable: Boolean(profile) });
114
+ onConfiguration({ ...result, supportsImageInput, supportsThinking: profile?.supportsThinking === true, modelAvailable: Boolean(profile) });
115
115
  onReadState(result.readState);
116
116
  const snapshot = result.snapshot;
117
117
  if (shouldHydrateSparkConversation(initialized, rehydrate, snapshot, state)) {
@@ -1,3 +1,5 @@
1
+ import { ComposerSubmissionRefused } from "./composer-submission-lifecycle.js";
2
+
1
3
  function createSteerId() {
2
4
  const randomId = globalThis.crypto?.randomUUID?.();
3
5
  if (randomId) return `web-steer-${randomId}`;
@@ -28,7 +30,7 @@ export function createSteerController({
28
30
  if (message.accepted === true) pending.resolve(message);
29
31
  else {
30
32
  pending.reject(
31
- new Error(String(message.reason || "Steer was not accepted.")),
33
+ new ComposerSubmissionRefused(String(message.reason || "Steer was not accepted.")),
32
34
  );
33
35
  }
34
36
  return true;
@@ -43,13 +45,13 @@ export function createSteerController({
43
45
  }
44
46
  }
45
47
 
46
- async function steer(text) {
47
- const { requestId, environmentId, sessionId } = getScope();
48
+ async function steer(text, captured = {}) {
49
+ const { requestId, environmentId, sessionId } = captured.scope ?? getScope();
48
50
  if (!requestId || !sessionId) {
49
- throw new Error("There is no active request to steer.");
51
+ throw new ComposerSubmissionRefused("There is no active request to steer.");
50
52
  }
51
- if (getPendingAttachmentCount() > 0) {
52
- throw new Error("Attachments can only be sent with Send next.");
53
+ if ((captured.pendingAttachmentCount ?? getPendingAttachmentCount()) > 0) {
54
+ throw new ComposerSubmissionRefused("Attachments can only be sent with Send next.");
53
55
  }
54
56
  const steerId = createSteerId();
55
57
  const acknowledgement = new Promise((resolve, reject) => {
@@ -81,7 +83,7 @@ export function createSteerController({
81
83
  const pending = pendingSteers.get(steerId);
82
84
  pendingSteers.delete(steerId);
83
85
  if (pending) clearTimer(pending.timeoutId);
84
- throw new Error("Realtime connection is not available.");
86
+ throw new ComposerSubmissionRefused("Realtime connection is not available.");
85
87
  }
86
88
  await acknowledgement;
87
89
  const current = getScope();
@@ -20,7 +20,7 @@ export function createToolPermissionModeController({
20
20
  function currentToolPermissionMode() {
21
21
  const sessionId = getComposerSessionId();
22
22
  if (!sessionId) return preferences.loadLastToolPermissionMode(normalizeToolPermissionMode);
23
- return normalizeToolPermissionMode(sessionModeFor(sessionId).toolPermissionMode);
23
+ return normalizeToolPermissionMode(sessionModeFor(sessionId).toolPermissionMode || "ask");
24
24
  }
25
25
 
26
26
  function clearSessionMode(sessionId) {
@@ -0,0 +1,34 @@
1
+ import { canNavigateConversation } from "./conversation-navigation-intent.js";
2
+
3
+ /** Prepare the session and recovered draft before committing its workspace. */
4
+ export function createWorkspaceConversationOpener({ state, shell, openSession }) {
5
+ return async (sessionId, options) => {
6
+ if (!sessionId) return false;
7
+ if (!canNavigateConversation(state)) {
8
+ shell.showToast?.("Wait for the environment change to finish before opening a conversation.", "neutral");
9
+ return false;
10
+ }
11
+ const activate = shell.prepareWorkspaceActivation("chat");
12
+ if (!activate) return false;
13
+ let navigationRevision = shell.navigationRevision?.();
14
+ function isConversationWorkspaceNavigationCurrent() {
15
+ if (!canNavigateConversation(state)) return false;
16
+ return shell.navigationRevision?.() === navigationRevision;
17
+ }
18
+ let committed = false;
19
+ const opened = await openSession(sessionId, {
20
+ ...options,
21
+ isRouteCurrent: isConversationWorkspaceNavigationCurrent,
22
+ commitRouteNavigation: () => {
23
+ if (!isConversationWorkspaceNavigationCurrent()) return false;
24
+ committed = activate() === true;
25
+ navigationRevision = shell.navigationRevision?.();
26
+ return committed;
27
+ },
28
+ });
29
+ if (opened !== true) return false;
30
+ if (!committed) return false;
31
+ if (!isConversationWorkspaceNavigationCurrent()) return false;
32
+ return state.currentSessionId === sessionId;
33
+ };
34
+ }
@@ -1,3 +1,4 @@
1
+ import { createWorkspaceConversationOpener } from "./controllers/workspace-conversation-opener.js";
1
2
  import { createDashboardWorkspace } from "./components/dashboard/workspace.js";
2
3
  import { createDashboardController } from "./controllers/dashboard-controller.js";
3
4
  import { createDashboardApprovalsController } from "./controllers/dashboard-approvals-controller.js";
@@ -17,6 +18,7 @@ export function createDashboardFeature({
17
18
  isComposerAvailable,
18
19
  passiveLearning,
19
20
  }) {
21
+ const openConversation = createWorkspaceConversationOpener({ state, shell, openSession });
20
22
  let view;
21
23
  let controller;
22
24
  const approvals = createDashboardApprovalsController({
@@ -50,9 +52,8 @@ export function createDashboardFeature({
50
52
  refresh: controller.refresh,
51
53
  decideApproval: approvals.submit,
52
54
  openConversation: async (sessionId, requestId) => {
53
- if (!shell.activateWorkspace("chat")) return;
54
55
  try {
55
- await openSession(sessionId, { page: { targetRequestId: requestId } });
56
+ if (!await openConversation(sessionId, { page: { targetRequestId: requestId } })) return;
56
57
  if (state.currentSessionId !== sessionId) return;
57
58
  if (!requestId) return;
58
59
  requestAnimationFrame(() => {
@@ -74,6 +75,15 @@ export function createDashboardFeature({
74
75
  document.addEventListener("visibilitychange", controller.visibilityChanged);
75
76
  return {
76
77
  ...controller,
78
+ compactWidgets: view.compactWidgets,
79
+ setActive(value) {
80
+ view.compactWidgets.setWorkspace(value ? "home" : "other");
81
+ controller.setActive(value);
82
+ },
83
+ environmentChanged() {
84
+ view.compactWidgets.close({ restoreFocus: false });
85
+ controller.environmentChanged();
86
+ },
77
87
  composerHost: view.composerHost,
78
88
  setupHost: view.setupHost,
79
89
  };