@abot-ai/runtime 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  2. package/dist/src/cli/abot.js +2 -0
  3. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  4. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  5. package/dist/src/computer-access/collection-consent.js +47 -0
  6. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  7. package/dist/src/computer-access/command-output-capture.js +134 -68
  8. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  9. package/dist/src/computer-access/command-output-protection.js +59 -0
  10. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  11. package/dist/src/computer-access/companion/command-output.js +23 -6
  12. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  13. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  14. package/dist/src/computer-access/companion/native-session.js +6 -2
  15. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  16. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  17. package/dist/src/computer-access/companion/observation-process.js +51 -25
  18. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  19. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  20. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  21. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  22. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  23. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  24. package/dist/src/computer-access/handlers.d.ts +2 -1
  25. package/dist/src/computer-access/handlers.js +79 -11
  26. package/dist/src/computer-access/host-observation.d.ts +3 -3
  27. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  28. package/dist/src/computer-access/native-observation-connection.js +78 -0
  29. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  30. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  31. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  32. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  33. package/dist/src/computer-access/observation-source.d.ts +6 -0
  34. package/dist/src/computer-access/observation-source.js +10 -0
  35. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  36. package/dist/src/computer-access/security/desktop-result.js +146 -0
  37. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  38. package/dist/src/computer-access/security/observed-error.js +10 -0
  39. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  40. package/dist/src/computer-access/security/secret-text.js +111 -0
  41. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  42. package/dist/src/computer-access/security/system-results.js +53 -0
  43. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  44. package/dist/src/computer-access/system-result-protection.js +1 -0
  45. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  46. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  47. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  48. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  49. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  50. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  51. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  52. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  53. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  54. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  55. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  56. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  57. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  58. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  59. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  60. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  61. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  62. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  63. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  64. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  65. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  66. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  67. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  68. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  69. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  70. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  71. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  72. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  73. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  74. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  75. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  76. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  77. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  78. package/dist/src/model-gateway/server.js +5 -1
  79. package/dist/src/plugin-contract/index.d.ts +1 -0
  80. package/dist/src/plugin-contract/index.js +1 -0
  81. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  82. package/dist/src/plugin-contract/manifest.js +1 -0
  83. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  84. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  85. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  86. package/dist/src/plugin-sdk/computer-access.js +1 -0
  87. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  88. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  89. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  90. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  91. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  92. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  93. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  94. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  95. package/dist/src/plugin-sdk/files.js +4 -0
  96. package/dist/src/plugin-sdk/index.d.ts +1 -0
  97. package/dist/src/plugin-sdk/index.js +1 -0
  98. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  99. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  100. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  101. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  102. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  103. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  104. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  105. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  106. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  107. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  108. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  109. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  110. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  111. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  112. package/dist/src/runtime/passive-learning/service.js +2 -3
  113. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  114. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  115. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  116. package/dist/src/runtime/plugins/installation/package.js +2 -0
  117. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  118. package/dist/src/runtime/plugins/loader.js +24 -14
  119. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  120. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  121. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  122. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  123. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  124. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  125. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  126. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  127. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  128. package/dist/src/runtime/request/prepared-execution.js +3 -0
  129. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  130. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  131. package/dist/src/runtime/steps/execution-agent/format.js +2 -3
  132. package/dist/src/runtime/steps/execution-agent/input.js +1 -1
  133. package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
  134. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  135. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  136. package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
  137. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  138. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  139. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  140. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  141. package/dist/src/sessions/durable-session-commit.js +3 -3
  142. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  143. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  144. package/dist/src/sessions/session-store.js +3 -3
  145. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  146. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  147. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  148. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  149. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  150. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  151. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  152. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  153. package/dist/src/shared/windows-job-object.d.ts +2 -0
  154. package/dist/src/shared/windows-job-object.js +66 -0
  155. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  156. package/dist/src/web-ui/app/app-state.js +0 -7
  157. package/dist/src/web-ui/app/app.js +53 -156
  158. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  159. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  160. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  161. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  162. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  163. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  164. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  165. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  166. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  167. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  168. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  169. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  170. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  171. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  172. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  173. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  174. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  175. package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
  176. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  177. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  178. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  179. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  180. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  181. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  182. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  183. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  184. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  185. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  186. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  187. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  188. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  189. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  190. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  191. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  192. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  193. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  194. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  195. package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
  196. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  197. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  198. package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
  199. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  200. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  201. package/dist/src/web-ui/app/configuration-feature.js +9 -1
  202. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  203. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  204. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  205. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  206. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  207. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  208. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  209. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  210. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  211. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  212. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  213. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  214. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  215. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  216. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  217. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  218. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  219. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  220. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  221. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  222. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  223. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  224. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  225. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  226. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  227. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  228. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  229. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  230. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  231. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  232. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  233. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  234. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  235. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  236. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  237. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  238. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  239. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  240. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  241. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  242. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  243. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  244. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  245. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  246. package/dist/src/web-ui/app/dashboard-feature.js +3 -2
  247. package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
  248. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  249. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  250. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  251. package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
  252. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  253. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  254. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  255. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  256. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  257. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  258. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  259. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  260. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  261. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  262. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  263. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  264. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  265. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  266. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  267. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  268. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  269. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  270. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  271. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  272. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  273. package/dist/src/web-ui/app/styles.css +2 -0
  274. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  275. package/dist/src/web-ui/client-state/contracts.js +13 -0
  276. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  277. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  278. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  279. package/dist/src/web-ui/client-state/preferences.js +84 -0
  280. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  281. package/dist/src/web-ui/client-state/queue.js +43 -0
  282. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  283. package/dist/src/web-ui/client-state/routes.js +58 -0
  284. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  285. package/dist/src/web-ui/client-state/store.js +88 -0
  286. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  287. package/dist/src/web-ui/local-runtime/http.js +11 -2
  288. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  289. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  290. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  291. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  292. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  293. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  294. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  295. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  296. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  297. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  298. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  299. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  300. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  301. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  302. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  303. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  304. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  305. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  306. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  307. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  308. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  309. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  310. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  311. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  312. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  313. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  314. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  315. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  316. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  317. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  318. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  319. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  320. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  321. package/dist/src/web-ui/server-readiness.js +36 -0
  322. package/dist/src/web-ui/server.d.ts +2 -0
  323. package/dist/src/web-ui/server.js +23 -1
  324. package/dist/src/web-ui/system-host-service.js +13 -2
  325. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  326. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  327. package/docs/installation.md +44 -5
  328. package/docs/plugins.md +145 -4
  329. package/docs/tool-execution-result-evidence-contract.md +57 -0
  330. package/docs/windows-companion-store.md +5 -0
  331. package/package.json +4 -2
  332. package/plugins/capability-brief/plugin.json +4 -0
  333. package/plugins/code-outline/README.md +20 -0
  334. package/plugins/code-outline/plugin.json +1 -0
  335. package/plugins/code-outline/source/index.ts +16 -20
  336. package/plugins/code-outline/source/read-failure.ts +40 -0
  337. package/plugins/code-outline/src/index.cjs +614 -29
  338. package/plugins/document-reader/README.md +33 -0
  339. package/plugins/document-reader/plugin.json +1 -0
  340. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  341. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  342. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  343. package/plugins/document-reader/source/pdf-process.ts +207 -0
  344. package/plugins/document-reader/source/pdf-result.ts +79 -0
  345. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  346. package/plugins/document-reader/source/pdf.ts +4 -1
  347. package/plugins/document-reader/source/read-failure.ts +37 -0
  348. package/plugins/document-reader/source/reader.ts +3 -19
  349. package/plugins/document-reader/src/index.cjs +995 -211
  350. package/plugins/exec/README.md +19 -0
  351. package/plugins/exec/plugin.json +4 -3
  352. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  353. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  354. package/plugins/exec/source/filesystem-observer.ts +8 -79
  355. package/plugins/exec/source/output-files.ts +12 -6
  356. package/plugins/exec/source/paths.ts +3 -1
  357. package/plugins/exec/source/process-manager.ts +8 -24
  358. package/plugins/exec/source/shell-platform.ts +19 -3
  359. package/plugins/exec/source/shell-process.ts +55 -0
  360. package/plugins/exec/source/windows-job-source.ts +1 -0
  361. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  362. package/plugins/exec/src/index.cjs +252 -96
  363. package/plugins/filesystem/README.md +65 -0
  364. package/plugins/filesystem/plugin.json +6 -2
  365. package/plugins/filesystem/source/atomic-write.ts +2 -0
  366. package/plugins/filesystem/source/bounded-io.ts +80 -306
  367. package/plugins/filesystem/source/directory-sample.ts +2 -0
  368. package/plugins/filesystem/source/errors.ts +14 -0
  369. package/plugins/filesystem/source/file-observation.ts +151 -0
  370. package/plugins/filesystem/source/file-version.ts +41 -0
  371. package/plugins/filesystem/source/index.ts +6 -0
  372. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  373. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  374. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  375. package/plugins/filesystem/source/windows/operations.ts +197 -0
  376. package/plugins/filesystem/source/windows/process.ts +214 -0
  377. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  378. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  379. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  380. package/plugins/filesystem/source/windows/source.ts +42 -0
  381. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  382. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  383. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  384. package/plugins/filesystem/src/index.cjs +1208 -322
  385. package/plugins/json-inspector/README.md +18 -0
  386. package/plugins/json-inspector/plugin.json +1 -0
  387. package/plugins/json-inspector/source/index.ts +16 -19
  388. package/plugins/json-inspector/source/read-failure.ts +42 -0
  389. package/plugins/json-inspector/src/index.cjs +612 -27
  390. package/plugins/local-search/README.md +29 -0
  391. package/plugins/local-search/plugin.json +1 -0
  392. package/plugins/local-search/source/errors.ts +2 -0
  393. package/plugins/local-search/source/paths.ts +3 -0
  394. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  395. package/plugins/local-search/source/ripgrep.ts +3 -3
  396. package/plugins/local-search/source/windows-authority.ts +99 -0
  397. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  398. package/plugins/local-search/source/windows-search-process.ts +91 -0
  399. package/plugins/local-search/source/windows-search-script.ts +52 -0
  400. package/plugins/local-search/src/index.cjs +595 -26
  401. package/plugins/memory/plugin.json +4 -0
  402. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  403. package/plugins/memory/source/lock-owner-file.ts +71 -0
  404. package/plugins/memory/source/lock-path-observation.ts +26 -0
  405. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  406. package/plugins/memory/source/store-lock.ts +12 -7
  407. package/plugins/memory/source/store.ts +3 -2
  408. package/plugins/memory/src/index.cjs +174 -25
  409. package/plugins/project-orientation/README.md +23 -0
  410. package/plugins/project-orientation/plugin.json +1 -0
  411. package/plugins/project-orientation/source/index.ts +12 -9
  412. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  413. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  414. package/plugins/project-orientation/source/tree.ts +6 -0
  415. package/plugins/project-orientation/src/index.cjs +647 -31
  416. package/plugins/system/README.md +51 -15
  417. package/plugins/system/plugin.json +5 -1
  418. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  419. package/plugins/system/source/command-working-directory.ts +47 -0
  420. package/plugins/system/source/computer/handlers.ts +13 -9
  421. package/plugins/system/source/computer/observation-result.ts +10 -5
  422. package/plugins/system/source/computer/request-computers.ts +10 -3
  423. package/plugins/system/source/computer/request-modules.ts +3 -6
  424. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  425. package/plugins/system/source/host-dispatch.ts +18 -2
  426. package/plugins/system/source/index.ts +5 -3
  427. package/plugins/system/source/local-command-output-retention.ts +16 -0
  428. package/plugins/system/source/local-command-output.ts +16 -8
  429. package/plugins/system/source/request-system-modules.ts +12 -2
  430. package/plugins/system/source/request-target-snapshot.ts +2 -1
  431. package/plugins/system/source/security/desktop-result.ts +177 -0
  432. package/plugins/system/source/security/observed-error.ts +10 -0
  433. package/plugins/system/source/security/secret-text.ts +118 -0
  434. package/plugins/system/source/security/system-results.ts +62 -0
  435. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  436. package/plugins/system/src/index.cjs +837 -151
  437. package/plugins/system-probe/plugin.json +8 -2
  438. package/plugins/system-probe/source/disk-path.ts +8 -0
  439. package/plugins/system-probe/source/index.ts +10 -5
  440. package/plugins/system-probe/source/machine-load.ts +33 -0
  441. package/plugins/system-probe/source/metrics.ts +6 -8
  442. package/plugins/system-probe/src/index.cjs +49 -16
  443. package/plugins/web/plugin.json +4 -0
@@ -1,119 +1,22 @@
1
- import { createComposerAttachmentsController } from "./composer-attachments-controller.js";
2
- import { createComposerSubmitController } from "./composer-submit-controller.js";
3
-
4
- export function createHomeComposerFeature({
5
- workspace,
6
- shell,
7
- client,
8
- composerActions,
9
- selectedEnvironmentId,
10
- selectedModelSupportsImageInput,
11
- isComposerAvailable,
12
- getSubmissionBlock,
13
- onSubmissionBlocked,
14
- onControlEvent,
15
- onStateChange,
16
- activateHomeSession,
17
- sendMessage,
18
- }) {
19
- const attachments = createComposerAttachmentsController({
20
- state: workspace.homeState,
21
- dom: workspace.homeDom,
22
- shell,
23
- client,
24
- selectedEnvironmentId,
25
- selectedModelSupportsImageInput,
26
- ensureSession: workspace.ensureHomeSession,
27
- isComposerAvailable,
28
- isComposerVisible: workspace.isHome,
29
- onSendStateChange: onStateChange,
30
- onControlEvent,
31
- });
32
-
33
- async function sendHomeMessage(text) {
34
- const draft = workspace.takeHomeDraft(text);
35
- let activated = false;
36
- try {
37
- activated = activateHomeSession(draft) !== false;
38
- } catch (error) {
39
- workspace.restoreHomeDraft(draft);
40
- attachments.render();
41
- throw error;
42
- }
43
- if (!activated) {
44
- workspace.restoreHomeDraft(draft);
45
- attachments.render();
46
- return;
47
- }
48
- await sendMessage(text);
49
- }
50
-
51
- function reportRequestError(error) {
52
- onControlEvent({
53
- type: "control",
54
- name: "Message could not be sent",
55
- tone: "failed",
56
- summary: error instanceof Error ? error.message : String(error),
57
- });
58
- }
59
-
60
- const submit = createComposerSubmitController({
61
- state: workspace.homeState,
62
- dom: workspace.homeDom,
63
- composerActions,
64
- attachments,
65
- queue: {
66
- isCurrentDraining: () => false,
67
- queuedCount: () => 0,
1
+ /** Home is another surface of the shared composer, with navigation before POST. */
2
+ export function createHomeComposerFeature({ workspace, composer, selectedModelSupportsImageInput, activateHomeSession }) {
3
+ const surface = composer.createSurface({
4
+ surfaceDom: workspace.homeDom, currentDraft: workspace.homeView.current,
5
+ ensureDraftSession: workspace.ensureHomeSession, visible: workspace.isHome,
6
+ supportsImages: selectedModelSupportsImageInput, allowsActiveRequest: false,
7
+ async prepareSend(payload) {
8
+ const activated = await activateHomeSession(payload.scope);
9
+ if (!activated) return false;
10
+ workspace.finishHomeActivation(payload.scope);
11
+ return true;
68
12
  },
69
- chatRequests: { sendMessage: sendHomeMessage },
70
- conversationSession: { appendRequestError: reportRequestError },
71
- selectedEnvironmentId,
72
- setMessageStatus: () => {},
73
- getSubmissionBlock,
74
- onSubmissionBlocked,
75
- isComposerVisible: workspace.isHome,
76
13
  });
77
-
78
- function environmentChanged() {
79
- if (workspace.homeState.environmentId === selectedEnvironmentId()) return;
80
- attachments.clear();
81
- workspace.resetHomeDraft();
82
- if (workspace.isHome()) workspace.ensureHomeSession();
83
- }
84
-
85
- function render() {
86
- workspace.syncChatDraft();
87
- environmentChanged();
88
- if (!workspace.isHome()) return;
89
- attachments.render();
90
- submit.resize();
91
- submit.updateSendState();
92
- }
93
-
94
- function setWorkspace(destination) {
95
- environmentChanged();
96
- workspace.setWorkspace(destination);
97
- render();
98
- }
99
-
100
- function dispatch() {
101
- environmentChanged();
102
- submit.dispatch("send");
103
- }
104
-
105
- async function upload(file) {
106
- environmentChanged();
107
- await attachments.upload(file);
108
- }
109
-
14
+ function render() { workspace.syncChatDraft(); surface.render(); }
110
15
  return {
111
- attachments,
112
- submit,
113
- setWorkspace,
114
- environmentChanged,
115
- dispatch,
116
- upload,
117
- render,
16
+ ...surface, render,
17
+ setWorkspace(destination) { workspace.setWorkspace(destination); render(); },
18
+ environmentChanged: render,
19
+ dispatch: () => surface.submit.dispatch("send"),
20
+ upload: surface.attachments.upload,
118
21
  };
119
22
  }
@@ -1,3 +1,5 @@
1
+ import { createConversationWorkspaceActivation } from "./conversation-workspace-activation.js";
2
+
1
3
  export function createHomeConversationActivation({
2
4
  state,
3
5
  shell,
@@ -11,17 +13,13 @@ export function createHomeConversationActivation({
11
13
  setCurrentTitle,
12
14
  updateComposerSendState,
13
15
  }) {
14
- return function activateHomeConversation(draft) {
16
+ const activate = createConversationWorkspaceActivation({ state, shell, composerQueue, selectedEnvironmentId });
17
+ return async function activateHomeConversation(draft) {
18
+ if (draft.environmentId !== selectedEnvironmentId()) return false;
19
+ if (!await activate()) return false;
15
20
  if (draft.environmentId !== selectedEnvironmentId()) return false;
16
- const activateChat = shell.prepareWorkspaceActivation("chat", {
17
- focus: false,
18
- });
19
- if (!activateChat) return false;
20
- if (!composerQueue.suspendRecoveryForNavigation()) return false;
21
- if (!activateChat()) return false;
22
21
  conversationSession.clearCurrentSessionView();
23
22
  state.currentSessionId = draft.sessionId;
24
- state.pendingAttachments = draft.attachments;
25
23
  preferences.saveSessionIdForEnvironment(
26
24
  draft.environmentId,
27
25
  draft.sessionId,
@@ -349,11 +349,67 @@ export function createPassiveLearningController({
349
349
  resetEnvironment();
350
350
  }
351
351
 
352
+ async function refreshCollectionAccess() {
353
+ if (!isRuntimeReady()) return;
354
+ const epoch = environmentEpoch;
355
+ const environment = getEnvironmentId();
356
+ function collectionReadIsCurrent() {
357
+ if (!isRuntimeReady() || epoch !== environmentEpoch) return false;
358
+ return environment === getEnvironmentId();
359
+ }
360
+ try {
361
+ const host = await client.getSystemHostConnection();
362
+ if (!collectionReadIsCurrent()) return;
363
+ if (typeof host?.collectionConsent?.accepted !== "boolean")
364
+ throw new Error("Collection acknowledgment status is unavailable. Refresh and try again.");
365
+ state.hostConnection = host;
366
+ publish();
367
+ return host;
368
+ } catch (error) {
369
+ if (!collectionReadIsCurrent()) return;
370
+ state.statusError = errorMessage(error);
371
+ publish();
372
+ }
373
+ }
374
+
375
+ async function acceptCollectionConsent() {
376
+ if (!isRuntimeReady() || state.saving) return;
377
+ const epoch = environmentEpoch;
378
+ const environment = getEnvironmentId();
379
+ function consentUpdateIsCurrent() {
380
+ if (!isRuntimeReady() || epoch !== environmentEpoch) return false;
381
+ return environment === getEnvironmentId();
382
+ }
383
+ state.saving = true;
384
+ state.statusError = "";
385
+ publish();
386
+ try {
387
+ const receipt = await client.acceptSystemHostCollectionConsent();
388
+ if (!consentUpdateIsCurrent()) return;
389
+ if (receipt?.collectionConsent?.accepted !== true)
390
+ throw new Error("Collection acknowledgment was not confirmed.");
391
+ const host = await refreshCollectionAccess();
392
+ if (!consentUpdateIsCurrent()) return;
393
+ if (host?.collectionConsent?.accepted !== true)
394
+ throw new Error("Collection acknowledgment could not be verified. Refresh and try again.");
395
+ return host;
396
+ } catch (error) {
397
+ if (consentUpdateIsCurrent()) state.statusError = errorMessage(error);
398
+ } finally {
399
+ if (consentUpdateIsCurrent()) {
400
+ state.saving = false;
401
+ publish();
402
+ }
403
+ }
404
+ }
405
+
352
406
  return Object.freeze({
353
407
  snapshot,
354
408
  runtimeAvailabilityChanged,
355
409
  publish,
356
410
  restartCollection,
411
+ acceptCollectionConsent,
412
+ refreshCollectionAccess,
357
413
  configure: (preferences) =>
358
414
  mutateLearningState(
359
415
  (id) => client.configurePassiveLearning(preferences, id),
@@ -24,7 +24,7 @@ export declare function createProjectsController(options: {
24
24
  getEnvironmentId: () => string;
25
25
  isRuntimeReady?: () => boolean;
26
26
  getConversationRevision: () => string | number;
27
- prepareConversation: () => boolean;
27
+ prepareConversation: () => boolean | Promise<boolean>;
28
28
  openSession: (sessionId: string) => Promise<unknown>;
29
29
  loadSessions: () => Promise<unknown>;
30
30
  onChange: (state: ProjectsControllerState) => void;
@@ -230,11 +230,16 @@ export function createProjectsController({
230
230
  async function newConversation(projectId) {
231
231
  if (!canUseProjects()) return;
232
232
  if (state.busyProjectId) return;
233
- if (!prepareConversation()) return;
234
233
  const environmentId = getEnvironmentId();
235
234
  const token = revision;
236
235
  const conversationRevision = getConversationRevision();
237
236
  const activationToken = ++activationRevision;
237
+ let prepared = prepareConversation();
238
+ if (typeof prepared?.then === "function") prepared = await prepared;
239
+ if (!prepared) return;
240
+ if (!isCurrentEnvironment(environmentId, token)) return;
241
+ if (activationToken !== activationRevision) return;
242
+ if (getConversationRevision() !== conversationRevision) return;
238
243
  state = { ...state, busyProjectId: projectId };
239
244
  publish();
240
245
  try {
@@ -0,0 +1,174 @@
1
+ import { escapeAttribute, escapeHtml, textOf } from "../lib/text-format.js";
2
+ import { canChooseReasoning } from "../lib/reasoning-controls.js";
3
+ import { createReasoningOverridePrompt } from "../components/reasoning-override-prompt.js";
4
+
5
+ export function normalizeAgentMode(mode) {
6
+ const normalized = textOf(mode).trim().toLowerCase();
7
+ return ["fast", "reasoning", "deep", "auto"].includes(normalized)
8
+ ? normalized
9
+ : "reasoning";
10
+ }
11
+
12
+ function agentModeMeta(mode) {
13
+ const modes = {
14
+ auto: { label: "Auto", description: "Lets the agent choose", icon: "*" },
15
+ fast: { label: "Fast", description: "Shorter and quicker", icon: "!" },
16
+ deep: {
17
+ label: "Deep analysis",
18
+ description: "More careful responses",
19
+ icon: "D",
20
+ },
21
+ reasoning: {
22
+ label: "Reasoning",
23
+ description: "Balanced speed and thinking",
24
+ icon: "R",
25
+ },
26
+ };
27
+ return modes[normalizeAgentMode(mode)] || modes.reasoning;
28
+ }
29
+
30
+ export function createReasoningModeController({ state, dom, client, selectedEnvironmentId, selectedModelProfile, reloadModels, recordControlEvent }) {
31
+ let agentModeLoadRevision = 0;
32
+ const agentModeMutationRevisions = new Map();
33
+ let agentModeMutationInFlight = false;
34
+ const agentModeMutationRevisionFor = (environmentId) =>
35
+ agentModeMutationRevisions.get(environmentId) || 0;
36
+ const prompt = createReasoningOverridePrompt({
37
+ root: dom.agentModeMenu, client, getEnvironmentId: selectedEnvironmentId,
38
+ getProfile: selectedModelProfile, refreshModels: reloadModels,
39
+ render: () => renderAgentMode(),
40
+ });
41
+ function renderAgentMode() {
42
+ const allowed = canChooseReasoning(selectedModelProfile());
43
+ const meta = allowed ? agentModeMeta(state.agentMode) : { label: "Provider default", icon: "—" };
44
+ dom.agentModeButton.setAttribute("aria-haspopup", allowed ? "menu" : "dialog");
45
+ dom.agentModeMenu.classList.toggle("reasoning-override-menu", !allowed);
46
+ dom.agentModeButton.title = `Reasoning depth: ${meta.label}`;
47
+ dom.agentModeButton.setAttribute("aria-label", `Reasoning depth: ${meta.label}`);
48
+ dom.agentModeButton.disabled = agentModeMutationInFlight;
49
+ dom.agentModeButton.innerHTML = `
50
+ <span class="agent-mode-icon">${escapeHtml(meta.icon)}</span>
51
+ <span>${escapeHtml(meta.label)}</span>`;
52
+ dom.agentModeButton.classList.toggle("open", state.agentModeMenuOpen);
53
+ dom.agentModeButton.setAttribute(
54
+ "aria-expanded",
55
+ state.agentModeMenuOpen ? "true" : "false",
56
+ );
57
+ dom.agentModeMenu.classList.toggle("open", state.agentModeMenuOpen);
58
+ dom.agentModeMenu.hidden = !state.agentModeMenuOpen;
59
+ dom.agentModeMenu.setAttribute("role", allowed ? "menu" : "dialog");
60
+ dom.agentModeMenu.setAttribute("aria-label", allowed ? "Reasoning depth" : "Enable reasoning controls");
61
+ if (!allowed) { prompt.render(state.agentModeMenuOpen); return; }
62
+ const restoreFocus = Boolean(dom.agentModeMenu.contains?.(dom.agentModeMenu.ownerDocument?.activeElement));
63
+ prompt.reset();
64
+ dom.agentModeMenu.innerHTML = state.supportedAgentModes
65
+ .map((mode) => {
66
+ const item = agentModeMeta(mode);
67
+ const selected = normalizeAgentMode(mode) === state.agentMode;
68
+ return `
69
+ <button class="agent-mode-option ${selected ? "selected" : ""}" type="button"
70
+ role="menuitemradio" aria-checked="${selected ? "true" : "false"}"
71
+ tabindex="${selected ? "0" : "-1"}" data-mode="${escapeAttribute(mode)}" ${agentModeMutationInFlight ? "disabled" : ""}>
72
+ <span class="agent-mode-option-icon">${escapeHtml(item.icon)}</span>
73
+ <span><strong>${escapeHtml(item.label)}</strong><small>${escapeHtml(item.description)}</small></span>
74
+ </button>`;
75
+ })
76
+ .join("");
77
+ dom.agentModeMenu
78
+ .querySelectorAll(".agent-mode-option")
79
+ .forEach((button) => {
80
+ button.addEventListener(
81
+ "click",
82
+ () => void setAgentMode(button.dataset.mode),
83
+ );
84
+ });
85
+ if (restoreFocus && state.agentModeMenuOpen)
86
+ dom.agentModeMenu.querySelector?.('[tabindex="0"]')?.focus();
87
+ }
88
+
89
+ async function loadAgentMode() {
90
+ const revision = ++agentModeLoadRevision;
91
+ const environmentId = selectedEnvironmentId();
92
+ const mutationRevision = agentModeMutationRevisionFor(environmentId);
93
+ renderAgentMode();
94
+ try {
95
+ const payload = await client.getAgentMode(environmentId);
96
+ if (
97
+ revision !== agentModeLoadRevision ||
98
+ mutationRevision !== agentModeMutationRevisionFor(environmentId) ||
99
+ environmentId !== selectedEnvironmentId()
100
+ ) {
101
+ return false;
102
+ }
103
+ state.agentMode = normalizeAgentMode(payload.mode);
104
+ state.supportedAgentModes = Array.isArray(payload.supportedModes)
105
+ ? payload.supportedModes.map(normalizeAgentMode)
106
+ : state.supportedAgentModes;
107
+ renderAgentMode();
108
+ return true;
109
+ } catch {
110
+ if (
111
+ revision !== agentModeLoadRevision ||
112
+ mutationRevision !== agentModeMutationRevisionFor(environmentId) ||
113
+ environmentId !== selectedEnvironmentId()
114
+ ) {
115
+ return false;
116
+ }
117
+ state.agentMode = "reasoning";
118
+ renderAgentMode();
119
+ return false;
120
+ }
121
+ }
122
+
123
+ async function setAgentMode(mode) {
124
+ if (agentModeMutationInFlight) return false;
125
+ if (!canChooseReasoning(selectedModelProfile())) return false;
126
+ agentModeMutationInFlight = true;
127
+ const environmentId = selectedEnvironmentId();
128
+ const revision = agentModeMutationRevisionFor(environmentId) + 1;
129
+ agentModeMutationRevisions.set(environmentId, revision);
130
+ const loadRevisionAtStart = ++agentModeLoadRevision;
131
+ const previousMode = state.agentMode;
132
+ const requestedMode = normalizeAgentMode(mode);
133
+ state.agentMode = requestedMode;
134
+ state.agentModeMenuOpen = false;
135
+ renderAgentMode();
136
+ dom.agentModeButton.focus();
137
+ try {
138
+ const payload = await client.setAgentMode(requestedMode, environmentId);
139
+ if (
140
+ revision !== agentModeMutationRevisionFor(environmentId) ||
141
+ environmentId !== selectedEnvironmentId()
142
+ ) {
143
+ return false;
144
+ }
145
+ agentModeLoadRevision += 1;
146
+ state.agentMode = normalizeAgentMode(payload.mode);
147
+ renderAgentMode();
148
+ return true;
149
+ } catch (error) {
150
+ if (
151
+ revision !== agentModeMutationRevisionFor(environmentId) ||
152
+ environmentId !== selectedEnvironmentId()
153
+ ) {
154
+ return false;
155
+ }
156
+ if (agentModeLoadRevision === loadRevisionAtStart) {
157
+ state.agentMode = previousMode;
158
+ renderAgentMode();
159
+ }
160
+ recordControlEvent({
161
+ type: "control",
162
+ name: "Reasoning mode update failed",
163
+ tone: "failed",
164
+ summary: error instanceof Error ? error.message : String(error),
165
+ });
166
+ return false;
167
+ } finally {
168
+ agentModeMutationInFlight = false;
169
+ renderAgentMode();
170
+ }
171
+ }
172
+
173
+ return { renderAgentMode, loadAgentMode, setAgentMode };
174
+ }
@@ -1,3 +1,6 @@
1
+ import type { createRuntimeWebClient } from "../services/runtime-web-client.js";
2
+ type ReasoningConfigClient = ReturnType<typeof createRuntimeWebClient>;
3
+
1
4
  export type AgentMode = "auto" | "fast" | "reasoning" | "deep";
2
5
  import type { ToolPermissionMode } from "../lib/tool-permission-mode.js";
3
6
  export type { ToolPermissionMode } from "../lib/tool-permission-mode.js";
@@ -137,6 +140,9 @@ export interface RuntimeSelectionControllerDependencies {
137
140
  sync(): void;
138
141
  }>;
139
142
  readonly client: Readonly<{
143
+ loadConfigDashboard?: ReasoningConfigClient["loadConfigDashboard"];
144
+ saveConfigFile?: ReasoningConfigClient["saveConfigFile"];
145
+ applyRuntimeConfiguration?: ReasoningConfigClient["applyRuntimeConfiguration"];
140
146
  getAgentMode(environmentId: string): Promise<Record<string, unknown>>;
141
147
  setAgentMode(
142
148
  mode: AgentMode,
@@ -155,6 +161,7 @@ export interface RuntimeSelectionControllerDependencies {
155
161
  readonly onModelCatalogLoading?: () => void;
156
162
  readonly onModelCatalogLoaded?: (payload: Record<string, unknown>) => void;
157
163
  readonly onModelCatalogUnavailable?: (error: unknown) => void;
164
+ readonly onReasoningConfigurationApplied?: () => Promise<boolean>;
158
165
  }
159
166
 
160
167
  export declare function createRuntimeSelectionController(