@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
@@ -2,6 +2,7 @@ import { createEmbeddingSetupStep } from "./embedding.js";
2
2
  import { createSetupPluginStep } from "./plugins.js";
3
3
  import { createSystemHostConnectionManager } from "../system-host/manager.js";
4
4
  import { hostSetupIsReady } from "../system-host/rendering.js";
5
+ import { isNativeWindowsLocalAccess } from "../system-host/native-windows-access.js";
5
6
 
6
7
  /** Optional setup steps retain their owning services and never apply the Runtime. */
7
8
  export function createSetupOptionalSteps({
@@ -57,9 +58,10 @@ export function createSetupOptionalSteps({
57
58
  })
58
59
  : null;
59
60
  const readyStep = computer ? 5 : 4;
60
- function hasFreshComputerReadiness() {
61
+ function hasFreshComputerSetup() {
61
62
  if (!computer) return false;
62
63
  if (computer.state.busy || computer.state.statusUnavailable) return false;
64
+ if (isNativeWindowsLocalAccess(computer.state.snapshot)) return true;
63
65
  return hostSetupIsReady(computer.state.snapshot);
64
66
  }
65
67
  function projection(step) {
@@ -71,7 +73,8 @@ export function createSetupOptionalSteps({
71
73
  plugins: plugins.state.snapshot,
72
74
  hasComputerStep: Boolean(computer),
73
75
  readyStep,
74
- computer: hasFreshComputerReadiness() ? computer.state.snapshot : null,
76
+ computer: hasFreshComputerSetup() ? computer.state.snapshot : null,
77
+ nativeWindowsAccess: hasFreshComputerSetup() && isNativeWindowsLocalAccess(computer.state.snapshot),
75
78
  };
76
79
  if (step === 2)
77
80
  return {
@@ -90,7 +93,7 @@ export function createSetupOptionalSteps({
90
93
  return {
91
94
  ...common,
92
95
  content: `<div data-onboarding-computer>${computer.markup()}</div>`,
93
- canContinue: hasFreshComputerReadiness(),
96
+ canContinue: hasFreshComputerSetup(),
94
97
  };
95
98
  return common;
96
99
  }
@@ -111,7 +114,7 @@ export function createSetupOptionalSteps({
111
114
  }
112
115
  function canContinueComputer(step) {
113
116
  if (step !== 4) return false;
114
- return hasFreshComputerReadiness();
117
+ return hasFreshComputerSetup();
115
118
  }
116
119
  return {
117
120
  embedding,
@@ -1,3 +1,4 @@
1
+ import { renderPluginPlatformNotice } from "../plugins/compatibility.js";
1
2
  import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
2
3
 
3
4
  function blockReason(plugin, capability) {
@@ -33,6 +34,7 @@ function renderPluginCard(plugin, busy) {
33
34
  return `<li class="runtime-plugin-card">
34
35
  ${checkbox(plugin, null, busy)}
35
36
  <p class="runtime-plugin-summary" title="${escapeAttribute(plugin.description || "")}">${escapeHtml(plugin.description || "Installed Runtime plugin.")}</p>
37
+ ${renderPluginPlatformNotice(plugin.compatibility)}
36
38
  <div class="runtime-plugin-tools-heading"><span>Tools</span><span>${plugin.selectedCapabilityCount} of ${capabilities.length} selected</span></div>
37
39
  <ul class="runtime-plugin-capabilities" aria-label="${escapeAttribute(`Tools in ${plugin.id}`)}">${capabilities.map((capability) => `<li>${checkbox(plugin, capability, busy)}</li>`).join("")}</ul>
38
40
  </li>`;
@@ -144,7 +146,7 @@ export function createSetupPluginStep({
144
146
  state.snapshot?.selection?.enabled === false ||
145
147
  state.snapshot?.selection?.deny?.includes("*");
146
148
  return `<div class="runtime-setup-plugins">
147
- <p class="runtime-setup-feedback">All installed plugins start enabled in a new setup. Turn off anything you do not need.</p>
149
+ <p class="runtime-setup-feedback">All installed plugins start selected in a new setup. Host compatibility determines which plugins can load. Turn off anything you do not need.</p>
148
150
  ${globalBlocked ? '<p class="runtime-setup-feedback">An existing global policy blocks plugins. Your saved policy is preserved.</p>' : ""}
149
151
  ${state.error ? `<p class="runtime-setup-feedback error" role="alert">${escapeHtml(state.error)}</p><button type="button" class="runtime-setup-inline-action" data-runtime-setup-action="plugins-reload">Reload selection</button>` : state.message ? `<p class="runtime-setup-feedback" role="status">${escapeHtml(state.message)}</p>` : ""}
150
152
  ${state.busy ? '<p class="runtime-setup-feedback" role="status">Saving or loading plugin selection…</p>' : ""}
@@ -28,7 +28,7 @@ function readyMarkup(state, optional) {
28
28
  <div><dt>Model</dt><dd>${escapeHtml(state.modelId)}</dd></div>
29
29
  <div><dt>Context window</dt><dd>${escapeHtml(formatContextWindowTokens(state.contextWindowTokens))}</dd></div>
30
30
  <div><dt>Embedding</dt><dd>${escapeHtml(optional.memory?.enabled ? optional.memory.model || "Configured" : "Set up later")}</dd></div>
31
- <div><dt>Plugins</dt><dd>${selectedPlugins} enabled</dd></div>
31
+ <div><dt>Plugins</dt><dd>${selectedPlugins} selected</dd></div>
32
32
  </dl></div>`;
33
33
  }
34
34
 
@@ -79,7 +79,7 @@ function footerMarkup(state, availability, optional) {
79
79
  if (state.step === 3)
80
80
  return `<button type="button" class="runtime-setup-secondary" data-runtime-setup-action="back" ${disabled}>Back</button><button type="submit" class="runtime-setup-action" ${busy || !optional.canContinue ? "disabled" : ""}>Continue</button>`;
81
81
  if (state.step === 4 && optional.hasComputerStep)
82
- return `<button type="button" class="runtime-setup-secondary" data-runtime-setup-action="back">Back</button><div class="runtime-setup-footer-actions"><button type="button" class="runtime-setup-secondary" data-runtime-setup-action="skip-computer">Skip for now</button><button type="submit" class="runtime-setup-action" ${!optional.canContinue ? "disabled" : ""}>Continue</button></div>`;
82
+ return `<button type="button" class="runtime-setup-secondary" data-runtime-setup-action="back">Back</button><div class="runtime-setup-footer-actions">${optional.nativeWindowsAccess ? "" : '<button type="button" class="runtime-setup-secondary" data-runtime-setup-action="skip-computer">Skip for now</button>'}<button type="submit" class="runtime-setup-action" ${!optional.canContinue ? "disabled" : ""}>Continue</button></div>`;
83
83
  const secondary =
84
84
  state.step === 1 && canEditSetupConnection(state)
85
85
  ? `<button type="button" class="runtime-setup-secondary" data-runtime-setup-action="back" ${disabled}>Back</button>`
@@ -112,11 +112,13 @@ export function renderRuntimeSetup(state, availability, optional = {}) {
112
112
  const steps = [...STEP_LABELS];
113
113
  if (optional.hasComputerStep) {
114
114
  steps.splice(4, 0, "Computer");
115
- titles.splice(4, 0, "Set up computer access");
115
+ titles.splice(4, 0, optional.nativeWindowsAccess ? "Your Windows computer" : "Set up computer access");
116
116
  descriptions.splice(
117
117
  4,
118
118
  0,
119
- "Optional. Use applications on your computer, or set up access later in Settings.",
119
+ optional.nativeWindowsAccess
120
+ ? ""
121
+ : "Optional. Use applications on your computer, or set up access later in Settings.",
120
122
  );
121
123
  }
122
124
  const content =
@@ -73,6 +73,7 @@ export interface RuntimeSetupGuideDependencies {
73
73
  readonly loadHostConnection?: () => Promise<Record<string, unknown>>;
74
74
  readonly connectLocalHost?: () => Promise<Record<string, unknown>>;
75
75
  readonly createHostPairing?: () => Promise<Record<string, unknown>>;
76
+ readonly requestHostStoreConnection?: () => Promise<Record<string, unknown>>;
76
77
  readonly requestHostPermissions?: (input: Record<string, unknown>) => Promise<Record<string, unknown>>;
77
78
  readonly downloadHostSetup?: (
78
79
  platform: "windows" | "macos" | "linux",
@@ -1,3 +1,4 @@
1
+ import { renderReasoningModeField, syncReasoningModeField, retainedReasoningMode } from "../../lib/reasoning-controls.js";
1
2
  import { escapeHtml } from "../../lib/text-format.js";
2
3
  import { SCHEDULE_WEEKDAYS } from "../../lib/schedule-presentation.js";
3
4
  import { scheduleErrorMessage } from "../../lib/schedule-errors.js";
@@ -88,12 +89,7 @@ export function createScheduleForm({
88
89
  <label>Task prompt<textarea name="prompt" rows="5" required dir="auto" placeholder="What should ABot do when this schedule runs?">${escapeHtml(values.prompt || "")}</textarea></label>
89
90
  <div class="schedule-form-grid">${scheduleFields(values)}</div>
90
91
  <div class="schedule-form-grid"><label>Model<select name="modelProfileId" required><option value="">Choose a model</option>${options(modelOptions, values.modelProfileId)}</select></label>
91
- <label>Mode<select name="agentMode">${options(
92
- modes
93
- .filter((mode) => mode !== "auto")
94
- .map((mode) => ({ value: mode, label: mode })),
95
- values.agentMode || "reasoning",
96
- )}</select></label></div>
92
+ ${renderReasoningModeField(values.agentMode || "reasoning", models.find((model) => model.id === values.modelProfileId), modes.filter((mode) => mode !== "auto"))}</div>
97
93
  <label>Tool access<select name="toolPermissionMode">${options(
98
94
  [
99
95
  { value: "full_access", label: "Full" },
@@ -116,6 +112,12 @@ export function createScheduleForm({
116
112
  }
117
113
  }
118
114
 
115
+ const readInput = () => {
116
+ const data = new FormData(form);
117
+ data.set("agentMode", retainedReasoningMode(form, values.agentMode || "reasoning"));
118
+ return scheduleFormInput(data, job?.schedule);
119
+ };
120
+ fields.namedItem("modelProfileId").addEventListener("change", () => syncReasoningModeField(form, models, modes.filter((mode) => mode !== "auto")));
119
121
  let initialInput;
120
122
  form.querySelector("[data-cancel]").addEventListener("click", onCancel);
121
123
  fields.namedItem("kind").addEventListener("change", syncKind);
@@ -125,7 +127,7 @@ export function createScheduleForm({
125
127
  submit.disabled = true;
126
128
  feedback.hidden = true;
127
129
  try {
128
- const currentInput = scheduleFormInput(new FormData(form), job?.schedule);
130
+ const currentInput = readInput();
129
131
  const input = job
130
132
  ? scheduleUpdateInput(currentInput, initialInput)
131
133
  : currentInput;
@@ -137,7 +139,7 @@ export function createScheduleForm({
137
139
  }
138
140
  });
139
141
  syncKind();
140
- if (job) initialInput = scheduleFormInput(new FormData(form), job.schedule);
142
+ if (job) initialInput = readInput();
141
143
  const initialFields = JSON.stringify([...new FormData(form)]);
142
144
  function trackScheduleDraft() {
143
145
  form.dataset.dirty = String(
@@ -48,12 +48,31 @@ export function createSchedulesWorkspace({
48
48
  });
49
49
 
50
50
  function prepareLeave() {
51
- if (!actions.snapshot().editor) return true;
52
- if (!canDiscardScheduleDraft()) return false;
53
- actions.cancelEdit();
51
+ const prepared = prepareEnvironmentChange();
52
+ if (!prepared) return false;
53
+ prepared();
54
54
  return true;
55
55
  }
56
56
 
57
+ function prepareEnvironmentChange() {
58
+ const editor = actions.snapshot().editor;
59
+ if (editor && !canDiscardScheduleDraft()) return null;
60
+ const form = details.querySelector(".schedule-editor");
61
+ const fingerprint = scheduleDraftFingerprint(form);
62
+ const commit = () => { if (editor) actions.cancelEdit(); };
63
+ commit.canCommit = () => {
64
+ if (actions.snapshot().mutation) return false;
65
+ if (actions.snapshot().editor !== editor) return false;
66
+ if (details.querySelector(".schedule-editor") !== form) return false;
67
+ return scheduleDraftFingerprint(form) === fingerprint;
68
+ };
69
+ return commit;
70
+ }
71
+
72
+ function scheduleDraftFingerprint(form) {
73
+ return form ? JSON.stringify([...new FormData(form)]) : "";
74
+ }
75
+
57
76
  function canDiscardScheduleDraft() {
58
77
  const form = details.querySelector(".schedule-editor");
59
78
  if (form?.dataset.dirty !== "true") return true;
@@ -156,5 +175,5 @@ export function createSchedulesWorkspace({
156
175
  editorIdentity = null;
157
176
  renderScheduleDetails({ root: details, snapshot, actions });
158
177
  }
159
- return { render, prepareLeave };
178
+ return { render, prepareLeave, prepareEnvironmentChange };
160
179
  }
@@ -7,7 +7,7 @@ export function renderSessionSidebarSections({
7
7
  if (showingArchived) {
8
8
  const notice = document.createElement("p");
9
9
  notice.className = "session-archive-notice";
10
- notice.textContent = "Archived in this browser and environment. Restore a conversation from its menu.";
10
+ notice.textContent = "Archived in this ABot installation and environment. Restore a conversation from its menu.";
11
11
  root.appendChild(notice);
12
12
  }
13
13
  const pinned = sessions.filter((session) => isPinned(session.id));
@@ -35,7 +35,7 @@ export function renderSessionSidebarSections({
35
35
  const toggle = document.createElement("button");
36
36
  toggle.type = "button";
37
37
  toggle.className = "session-archive-toggle";
38
- toggle.title = "Conversations archived in this browser and environment";
38
+ toggle.title = "Conversations archived in this ABot installation and environment";
39
39
  toggle.textContent = showingArchived ? "Back to conversations" : `Archived (${archivedCount})`;
40
40
  toggle.setAttribute("aria-pressed", String(showingArchived));
41
41
  toggle.addEventListener("click", onToggleArchived);
@@ -12,7 +12,7 @@ function sameSourceMessage(current, source) {
12
12
 
13
13
  export function createSparkHandoffActions({
14
14
  getScope, getMessages, client, captureNavigation, onOpened, onChange = () => {},
15
- notify, documentRoot = document,
15
+ notify, documentRoot = document, canOpen = () => true,
16
16
  }) {
17
17
  const pending = new Set();
18
18
  function createNode(message) {
@@ -25,7 +25,12 @@ export function createSparkHandoffActions({
25
25
  button.type = "button";
26
26
  button.className = "spark-handoff-button";
27
27
  button.textContent = "Open a session about this";
28
- button.disabled = !message.sparkHandoffAvailable || pending.has(identity);
28
+ function canStartHandoff() {
29
+ if (!canOpen()) return false;
30
+ if (!message.sparkHandoffAvailable) return false;
31
+ return !pending.has(identity);
32
+ }
33
+ button.disabled = !canStartHandoff();
29
34
  row.appendChild(button);
30
35
  if (!message.sparkHandoffAvailable) {
31
36
  const explanation = documentRoot.createElement("p");
@@ -39,7 +44,8 @@ export function createSparkHandoffActions({
39
44
  return getMessages().some((candidate) => sameSourceMessage(candidate, message));
40
45
  }
41
46
  async function open() {
42
- if (button.disabled || pending.has(identity) || !sourceIsCurrent()) return;
47
+ if (!canStartHandoff()) return;
48
+ if (!sourceIsCurrent()) return;
43
49
  const navigate = captureNavigation();
44
50
  pending.add(identity); button.disabled = true;
45
51
  try {
@@ -1,14 +1,11 @@
1
1
  import { createSparkPlacementMotion } from "./motion.js";
2
+ import { workspaceStorage } from "../../services/workspace-state.js";
2
3
 
3
4
  const storageKey = "abot.spark.launcher.position.v1";
4
5
  const margin = 12;
5
6
  const dragThreshold = 5;
6
7
  const positionGrid = 16;
7
8
 
8
- function readBrowserStorage(windowRoot) {
9
- try { return windowRoot.localStorage; } catch { return null; }
10
- }
11
-
12
9
  function readPosition(storage) {
13
10
  try {
14
11
  const value = JSON.parse(storage?.getItem(storageKey) ?? "null");
@@ -31,9 +28,9 @@ function hasMovedPastDragThreshold(pointer, event) {
31
28
  return Math.hypot(event.clientX - pointer.x, event.clientY - pointer.y) >= dragThreshold;
32
29
  }
33
30
 
34
- /** Browser-only launcher placement; conversation and environment state stay untouched. */
31
+ /** Installation-owned launcher placement, clamped to the current screen. */
35
32
  export function createSparkChatPlacement({ root, launcher, panel, notice, dockAnchor, storage, windowRoot = window }) {
36
- const positionStorage = storage === undefined ? readBrowserStorage(windowRoot) : storage;
33
+ const positionStorage = storage === undefined ? workspaceStorage() : storage;
37
34
  let position = readPosition(positionStorage);
38
35
  let pointer = null;
39
36
  let suppressClick = false;
@@ -45,7 +42,7 @@ export function createSparkChatPlacement({ root, launcher, panel, notice, dockAn
45
42
  try {
46
43
  if (position) positionStorage?.setItem(storageKey, JSON.stringify(position));
47
44
  else positionStorage?.removeItem(storageKey);
48
- } catch { /* Placement remains usable when browser storage is unavailable. */ }
45
+ } catch { /* The shared storage owner reports persistence failures. */ }
49
46
  }
50
47
 
51
48
  function placePopup(node, anchor) {
@@ -1,3 +1,4 @@
1
+ import { canChooseReasoning, reasoningModeOptions } from "../../lib/reasoning-controls.js";
1
2
  import { supportsFullPlus } from "../../lib/tool-permission-mode.js";
2
3
 
3
4
  export function createSparkChatSettings({ root, onSave, onClear, onOpen, onResetPosition, onOpenModelSettings, getAgentMode, onAgentModeChange, getWebConfig, documentRoot = document }) {
@@ -29,11 +30,12 @@ export function createSparkChatSettings({ root, onSave, onClear, onOpen, onReset
29
30
  const feedback = card.querySelector("[data-spark-settings-feedback]");
30
31
  let saved = "ask";
31
32
  let ready = false;
33
+ let reasoningEnabled = false;
32
34
  let busy = false;
33
35
  let environmentId;
34
36
  function controls() {
35
37
  select.disabled = busy || !ready;
36
- agentModeSelect.disabled = !ready;
38
+ agentModeSelect.disabled = !ready || !reasoningEnabled;
37
39
  save.disabled = busy || !ready || select.value === saved;
38
40
  clear.disabled = busy || !ready;
39
41
  }
@@ -52,7 +54,7 @@ export function createSparkChatSettings({ root, onSave, onClear, onOpen, onReset
52
54
  finally { if (environment === environmentId) { busy = false; controls(); } }
53
55
  }
54
56
  select.addEventListener("change", controls);
55
- agentModeSelect.addEventListener("change", () => onAgentModeChange(agentModeSelect.value));
57
+ agentModeSelect.addEventListener("change", () => { if (reasoningEnabled) onAgentModeChange(agentModeSelect.value); });
56
58
  card.querySelector("form").addEventListener("submit", (event) => {
57
59
  event.preventDefault();
58
60
  if (save.disabled) return;
@@ -73,7 +75,9 @@ export function createSparkChatSettings({ root, onSave, onClear, onOpen, onReset
73
75
  environmentId = nextEnvironmentId; busy = false; ready = false; feedback.textContent = "";
74
76
  select.value = configuration?.toolPermissionMode || "ask";
75
77
  }
76
- agentModeSelect.value = getAgentMode();
78
+ reasoningEnabled = canChooseReasoning(configuration);
79
+ agentModeSelect.innerHTML = reasoningModeOptions(getAgentMode(), reasoningEnabled);
80
+ agentModeSelect.title = reasoningEnabled ? "Reasoning depth" : "Enable reasoning controls for this model in Models.";
77
81
  const next = configuration?.toolPermissionMode || "ask";
78
82
  if (!ready || select.value === saved || busy) select.value = next;
79
83
  saved = next; ready = Boolean(configuration?.sessionId);
@@ -6,6 +6,7 @@ function hasManagedMacPermissionRuntime(version) {
6
6
  }
7
7
 
8
8
  export function macCompanionPermissionPath(snapshot) {
9
+ if (snapshot?.collectionSource?.mode === "native") return "";
9
10
  if (!snapshot?.paired) return "";
10
11
  if (snapshot.identity?.os !== "macos") return "";
11
12
  if (!hasManagedMacPermissionRuntime(snapshot.companion?.installedVersion))
@@ -20,6 +21,7 @@ export function macCompanionPermissionPath(snapshot) {
20
21
 
21
22
  /** The managed companion keeps its macOS permission subject at one private path. */
22
23
  export function renderMacPermissionGuide(snapshot) {
24
+ if (snapshot?.collectionSource?.mode === "native") return "";
23
25
  if (!snapshot?.paired) return "";
24
26
  if (snapshot.identity?.os !== "macos") return "";
25
27
  const version = snapshot.companion?.installedVersion;
@@ -0,0 +1,50 @@
1
+ import { renderConnectionCard } from "./connection-card.js";
2
+
3
+ /** The server's native Windows facts identify local access, independently of tool readiness. */
4
+ export function isNativeWindowsLocalAccess(snapshot) {
5
+ if (snapshot?.collectionSource?.mode !== "native") return false;
6
+ return snapshot.collectionSource.platform === "windows";
7
+ }
8
+
9
+ export function shouldRenderNativeWindowsAccess(input) {
10
+ if (!input.supported) return false;
11
+ return isNativeWindowsLocalAccess(input.snapshot);
12
+ }
13
+
14
+ function nativeWindowsAccessPresentation(input) {
15
+ if (input.statusUnavailable) return {
16
+ title: "Check Windows access", status: "Status unavailable",
17
+ description: "The current local access status could not be checked. Refresh to try again.",
18
+ };
19
+ if (input.busy) return {
20
+ title: "Checking Windows access…", status: "Checking",
21
+ description: "Waiting for the current local access status…",
22
+ };
23
+ if (input.snapshot?.readiness?.directAccessReady === false) return {
24
+ title: "Check local Windows access", status: "Check needed",
25
+ description: "ABot runs directly on Windows, but direct commands could not be verified. Refresh to check again. Companion pairing is not required for local tools.",
26
+ };
27
+ return {
28
+ title: "Windows access is local", status: "Local",
29
+ description: "ABot runs directly on this Windows computer. Local tools do not need Companion pairing. Compatible plugins and your permission settings determine which actions are available.",
30
+ };
31
+ }
32
+
33
+ function canCompactNativeWindowsAccess(input) {
34
+ if (!input.compact) return false;
35
+ if (input.statusUnavailable || input.busy) return false;
36
+ if (input.error || input.message) return false;
37
+ return input.snapshot?.readiness?.directAccessReady !== false;
38
+ }
39
+
40
+ export function renderNativeWindowsAccess(input) {
41
+ const presentation = nativeWindowsAccessPresentation(input);
42
+ const compact = canCompactNativeWindowsAccess(input);
43
+ return renderConnectionCard({
44
+ ...presentation, ready: false, compact, disabled: input.busy,
45
+ actions: '<button type="button" class="system-host-card-secondary" data-system-host-refresh' +
46
+ (input.busy ? " disabled" : "") + '>Refresh status</button>',
47
+ error: input.error, message: input.message,
48
+ attributes: "data-system-host-native-windows",
49
+ });
50
+ }
@@ -1,6 +1,7 @@
1
1
  import { escapeHtml } from "../../lib/text-format.js";
2
2
  import { renderWindowsStoreSetup, windowsStorePanelIsAvailable } from "./windows-store-setup.js";
3
3
  import { renderConnectionCard, renderComputerMetadata } from "./connection-card.js";
4
+ import { shouldRenderNativeWindowsAccess, renderNativeWindowsAccess } from "./native-windows-access.js";
4
5
  import { macPermissionSummary, renderMacPermissionPreparation } from "./macos-permission-rendering.js";
5
6
  import {
6
7
  renderMacSetupAction,
@@ -123,6 +124,8 @@ function canRenderCompactConnection(input) {
123
124
  return true;
124
125
  }
125
126
  export function renderSystemHostConnection(input) {
127
+ if (shouldRenderNativeWindowsAccess(input))
128
+ return renderNativeWindowsAccess(input);
126
129
  if (input.supported && windowsStorePanelIsAvailable(input.snapshot)) {
127
130
  return renderWindowsStoreSetup({
128
131
  snapshot: input.snapshot, invitation: input.windowsStoreInvitation,
@@ -0,0 +1,37 @@
1
+ export async function acknowledgeWorkspaceStorage(storage, documentRoot = document) {
2
+ if (storage.snapshot().introductionSeen) return;
3
+ const dialog = documentRoot.createElement("dialog");
4
+ dialog.className = "workspace-storage-notice";
5
+ dialog.innerHTML = `<h2>Your workspace settings stay with ABot</h2>
6
+ <p>Settings and queued messages are now saved with this ABot installation, across browsers and app restarts.</p>
7
+ <p>This is a one-time fresh start. Previous browser-only pins, archives, model choices, memory review markers and queued messages are not imported.</p>
8
+ <p>Your conversations, memories, configuration and read status are kept. Tool permissions start in <strong>Ask</strong>; you can change them in the composer.</p>
9
+ <p role="alert" hidden></p><button type="button" class="primary">Continue</button>`;
10
+ documentRoot.body.append(dialog);
11
+ dialog.addEventListener("cancel", (event) => event.preventDefault());
12
+ dialog.showModal();
13
+ await new Promise((resolve) => {
14
+ const button = dialog.querySelector("button");
15
+ button.addEventListener("click", async () => {
16
+ button.disabled = true;
17
+ try { await storage.execute({ kind: "introduction" }); dialog.close(); dialog.remove(); resolve(); }
18
+ catch (error) {
19
+ const notice = dialog.querySelector('[role="alert"]');
20
+ notice.textContent = `${error.message} Reload to try again.`;
21
+ notice.hidden = false;
22
+ }
23
+ });
24
+ });
25
+ }
26
+
27
+ export function showWorkspaceStorageFailure(error, documentRoot = document) {
28
+ let notice = documentRoot.querySelector("[data-workspace-storage-error]");
29
+ if (!notice) {
30
+ notice = documentRoot.createElement("div");
31
+ notice.dataset.workspaceStorageError = "";
32
+ notice.setAttribute("role", "alert");
33
+ notice.className = "workspace-storage-failure";
34
+ documentRoot.body.append(notice);
35
+ }
36
+ notice.textContent = `${error.message} Changes are not confirmed. Reload before sending more messages.`;
37
+ }
@@ -6,6 +6,7 @@ export function createAppliedEnvironmentProjection({
6
6
  dom,
7
7
  selection,
8
8
  loadWebConfig,
9
+ changeEnvironment,
9
10
  }) {
10
11
  let generation = 0;
11
12
  let pending = null;
@@ -23,11 +24,10 @@ export function createAppliedEnvironmentProjection({
23
24
  );
24
25
  }
25
26
 
26
- function restoreProjection(config, selected) {
27
+ function applyProjection(config, selected) {
27
28
  state.config = config;
28
29
  selection.renderEnvironmentOptions();
29
30
  dom.environmentSelect.value = selected;
30
- selection.renderAgentPicker();
31
31
  }
32
32
 
33
33
  function preferredEnvironmentId(options, selected, defaultId) {
@@ -36,45 +36,36 @@ export function createAppliedEnvironmentProjection({
36
36
  return options[0]?.value || "";
37
37
  }
38
38
 
39
- function changeProjectedEnvironment(
40
- next,
41
- previousConfig,
42
- previousEnvironment,
43
- ) {
44
- const ChangeEvent = dom.environmentSelect.ownerDocument.defaultView.Event;
45
- dom.environmentSelect.dispatchEvent(new ChangeEvent("change"));
46
- if (dom.environmentSelect.value === next) return true;
47
- restoreProjection(previousConfig, previousEnvironment);
48
- // Existing listeners also own composer/environment presentation after a refusal.
49
- dom.environmentSelect.dispatchEvent(new ChangeEvent("change"));
50
- return false;
51
- }
52
-
53
- function flush() {
39
+ async function flush() {
54
40
  if (!pending) return "unchanged";
55
- const previousConfig = state.config;
56
41
  const previousEnvironment = selection.selectedEnvironmentId();
57
- state.config = pending;
58
- selection.renderEnvironmentOptions();
42
+ const projected = pending;
43
+ const revision = generation;
59
44
  const next = preferredEnvironmentId(
60
- selection.environmentOptions(),
45
+ selection.configuredEnvironmentOptions(projected),
61
46
  previousEnvironment,
62
- textOf(pending.defaultEnvironmentId).trim(),
47
+ textOf(projected.defaultEnvironmentId).trim(),
63
48
  );
64
- if (!next) {
65
- restoreProjection(previousConfig, previousEnvironment);
66
- return "blocked";
67
- }
68
- dom.environmentSelect.value = next;
69
- const unchanged = next === previousEnvironment;
70
- if (unchanged) {
49
+ if (!next) return "blocked";
50
+ if (next === previousEnvironment) {
51
+ applyProjection(projected, next);
71
52
  pending = null;
72
53
  selection.renderAgentPicker();
73
54
  return "unchanged";
74
55
  }
75
- if (!changeProjectedEnvironment(next, previousConfig, previousEnvironment))
76
- return "blocked";
77
- pending = null;
56
+ // Keep the old catalog and selected option until draft preparation commits.
57
+ const commitEnvironmentOptions = () => {
58
+ applyProjection(projected, next);
59
+ pending = null;
60
+ };
61
+ commitEnvironmentOptions.canCommit = () => {
62
+ if (revision !== generation) return false;
63
+ return pending === projected;
64
+ };
65
+ let accepted = false;
66
+ try { accepted = await changeEnvironment(next, { commitEnvironmentOptions }); }
67
+ catch { /* The old catalog remains active when draft persistence fails. */ }
68
+ if (!accepted) return "blocked";
78
69
  selection.renderAgentPicker();
79
70
  return "changed";
80
71
  }
@@ -87,6 +78,7 @@ export function createConfigurationFeature({
87
78
  state,
88
79
  selection,
89
80
  onConfigurationApplied,
81
+ changeEnvironment,
90
82
  ...options
91
83
  }) {
92
84
  const projection = createAppliedEnvironmentProjection({
@@ -94,6 +86,7 @@ export function createConfigurationFeature({
94
86
  dom: options.dom,
95
87
  selection,
96
88
  loadWebConfig: () => options.runtimeClient.loadWebConfig(),
89
+ changeEnvironment,
97
90
  });
98
91
  const workspace = createWorkspaceFeature({
99
92
  ...options,
@@ -101,13 +94,13 @@ export function createConfigurationFeature({
101
94
  const currentStillConfigured = await projection.prepare();
102
95
  if (currentStillConfigured) await onConfigurationApplied();
103
96
  },
104
- onConfigurationSettled: () => projection.flush() !== "blocked",
97
+ onConfigurationSettled: async () => await projection.flush() !== "blocked",
105
98
  });
106
99
  return {
107
100
  ...workspace,
108
101
  async reloadAppliedEnvironmentModels() {
109
102
  await projection.prepare();
110
- const result = projection.flush();
103
+ const result = await projection.flush();
111
104
  if (result === "blocked") return false;
112
105
  if (result === "changed") return true;
113
106
  const refreshed = await workspace.load();
@@ -278,7 +278,15 @@ export function createConfigurationFeature({
278
278
  "Finish or cancel model setup before leaving configuration.";
279
279
  return null;
280
280
  }
281
- return prepareDiscardChanges(...args);
281
+ const prepared = prepareDiscardChanges(...args);
282
+ if (typeof prepared !== "function") return prepared;
283
+ const commit = () => prepared();
284
+ commit.canCommit = () => {
285
+ if (pluginManager.hasConfigurationDraft()) return false;
286
+ if (modelSetup.isOpen()) return false;
287
+ return prepared.canCommit?.() !== false;
288
+ };
289
+ return commit;
282
290
  },
283
291
  };
284
292
  }