@abot-ai/runtime 1.6.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 (750) hide show
  1. package/README.md +2 -0
  2. package/dist/src/bridge/request-steering.js +60 -15
  3. package/dist/src/capabilities/normal-invocation/contracts.d.ts +3 -0
  4. package/dist/src/capabilities/normal-invocation/output-channels.d.ts +10 -0
  5. package/dist/src/capabilities/normal-invocation/output-channels.js +29 -0
  6. package/dist/src/capabilities/normal-invocation/validator.js +4 -2
  7. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  8. package/dist/src/capabilities/tool-types.d.ts +1 -1
  9. package/dist/src/cli/abot.js +2 -0
  10. package/dist/src/cli/host-companion-bundle.mjs +8003 -6796
  11. package/dist/src/cli/host-companion-entry.js +5 -22
  12. package/dist/src/cli/host-companion-input.d.ts +3 -0
  13. package/dist/src/cli/host-companion-input.js +21 -0
  14. package/dist/src/cli/host-companion-lifecycle.d.ts +11 -0
  15. package/dist/src/cli/host-companion-lifecycle.js +32 -0
  16. package/dist/src/cli/host-companion-setup-target.d.ts +4 -0
  17. package/dist/src/cli/host-companion-setup-target.js +17 -0
  18. package/dist/src/cli/host-companion-startup.d.ts +2 -0
  19. package/dist/src/cli/host-companion-startup.js +7 -2
  20. package/dist/src/cli/host-companion.d.ts +6 -0
  21. package/dist/src/cli/host-companion.js +30 -27
  22. package/dist/src/cli/windows-companion-store-entry.d.ts +9 -0
  23. package/dist/src/cli/windows-companion-store-entry.js +67 -0
  24. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  25. package/dist/src/computer-access/collection-consent.js +47 -0
  26. package/dist/src/computer-access/command-output-capture.d.ts +48 -0
  27. package/dist/src/computer-access/command-output-capture.js +202 -0
  28. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  29. package/dist/src/computer-access/command-output-protection.js +59 -0
  30. package/dist/src/computer-access/command-output-retention.d.ts +5 -0
  31. package/dist/src/computer-access/command-output-retention.js +90 -0
  32. package/dist/src/computer-access/command-output.d.ts +7 -0
  33. package/dist/src/computer-access/command-output.js +1 -0
  34. package/dist/src/computer-access/commands.d.ts +1 -0
  35. package/dist/src/computer-access/commands.js +1 -1
  36. package/dist/src/computer-access/companion/command-output-protocol.d.ts +12 -0
  37. package/dist/src/computer-access/companion/command-output-protocol.js +28 -0
  38. package/dist/src/computer-access/companion/command-output.d.ts +14 -0
  39. package/dist/src/computer-access/companion/command-output.js +127 -0
  40. package/dist/src/computer-access/companion/install-link-macos.d.ts +7 -0
  41. package/dist/src/computer-access/companion/install-link-macos.js +49 -0
  42. package/dist/src/computer-access/companion/install-link-registration.d.ts +4 -0
  43. package/dist/src/computer-access/companion/install-link-registration.js +184 -0
  44. package/dist/src/computer-access/companion/install-link-windows.d.ts +4 -0
  45. package/dist/src/computer-access/companion/install-link-windows.js +65 -0
  46. package/dist/src/computer-access/companion/install-link.d.ts +9 -0
  47. package/dist/src/computer-access/companion/install-link.js +54 -0
  48. package/dist/src/computer-access/companion/native-messages.js +3 -0
  49. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  50. package/dist/src/computer-access/companion/native-session.d.ts +1 -0
  51. package/dist/src/computer-access/companion/native-session.js +20 -4
  52. package/dist/src/computer-access/companion/native-supervisor.js +1 -0
  53. package/dist/src/computer-access/companion/notification-windows.d.ts +1 -1
  54. package/dist/src/computer-access/companion/notification-windows.js +8 -3
  55. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  56. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  57. package/dist/src/computer-access/companion/observation-process.js +51 -25
  58. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  59. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  60. package/dist/src/computer-access/companion/protocol.d.ts +1 -1
  61. package/dist/src/computer-access/companion/protocol.js +6 -0
  62. package/dist/src/computer-access/companion/release-version.d.ts +1 -1
  63. package/dist/src/computer-access/companion/release-version.js +1 -1
  64. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  65. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  66. package/dist/src/computer-access/companion/windows-store/connection-error.d.ts +7 -0
  67. package/dist/src/computer-access/companion/windows-store/connection-error.js +19 -0
  68. package/dist/src/computer-access/companion/windows-store/connection-link.d.ts +13 -0
  69. package/dist/src/computer-access/companion/windows-store/connection-link.js +109 -0
  70. package/dist/src/computer-access/companion/windows-store/identity.d.ts +13 -0
  71. package/dist/src/computer-access/companion/windows-store/identity.js +13 -0
  72. package/dist/src/computer-access/companion/windows-store/lifecycle.d.ts +5 -0
  73. package/dist/src/computer-access/companion/windows-store/lifecycle.js +90 -0
  74. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  75. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  76. package/dist/src/computer-access/contracts.d.ts +1 -1
  77. package/dist/src/computer-access/handlers.d.ts +3 -1
  78. package/dist/src/computer-access/handlers.js +83 -11
  79. package/dist/src/computer-access/host-observation.d.ts +3 -3
  80. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  81. package/dist/src/computer-access/native-observation-connection.js +78 -0
  82. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  83. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  84. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  85. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  86. package/dist/src/computer-access/observation-source.d.ts +6 -0
  87. package/dist/src/computer-access/observation-source.js +10 -0
  88. package/dist/src/computer-access/process-capture.d.ts +6 -0
  89. package/dist/src/computer-access/process-capture.js +1 -0
  90. package/dist/src/computer-access/process-result.d.ts +2 -0
  91. package/dist/src/computer-access/process-result.js +14 -6
  92. package/dist/src/computer-access/process-runner.d.ts +2 -1
  93. package/dist/src/computer-access/process-runner.js +21 -13
  94. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  95. package/dist/src/computer-access/security/desktop-result.js +146 -0
  96. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  97. package/dist/src/computer-access/security/observed-error.js +10 -0
  98. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  99. package/dist/src/computer-access/security/secret-text.js +111 -0
  100. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  101. package/dist/src/computer-access/security/system-results.js +53 -0
  102. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  103. package/dist/src/computer-access/system-result-protection.js +1 -0
  104. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  105. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  106. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  107. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  108. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  109. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  110. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  111. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  112. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  113. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  114. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  115. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  116. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  117. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  118. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  119. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  120. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  121. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  122. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  123. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  124. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  125. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  126. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  127. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  128. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  129. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  130. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  131. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  132. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  133. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  134. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  135. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  136. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  137. package/dist/src/model-gateway/server/configuration.d.ts +2 -0
  138. package/dist/src/model-gateway/server/configuration.js +73 -21
  139. package/dist/src/model-gateway/server.js +5 -1
  140. package/dist/src/plugin-contract/index.d.ts +1 -0
  141. package/dist/src/plugin-contract/index.js +1 -0
  142. package/dist/src/plugin-contract/install-source.d.ts +13 -0
  143. package/dist/src/plugin-contract/install-source.js +99 -0
  144. package/dist/src/plugin-contract/manifest.d.ts +4 -1
  145. package/dist/src/plugin-contract/manifest.js +1 -0
  146. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  147. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  148. package/dist/src/plugin-sdk/computer-access.d.ts +12 -0
  149. package/dist/src/plugin-sdk/computer-access.js +6 -0
  150. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  151. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  152. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  153. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  154. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  155. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  156. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  157. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  158. package/dist/src/plugin-sdk/files.js +4 -0
  159. package/dist/src/plugin-sdk/index.d.ts +1 -0
  160. package/dist/src/plugin-sdk/index.js +1 -0
  161. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  162. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  163. package/dist/src/runtime/adapters/in-memory-session-store.js +6 -16
  164. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  165. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  166. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  167. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  168. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  169. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  170. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  171. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  172. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  173. package/dist/src/runtime/admin/config-control.js +2 -1
  174. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  175. package/dist/src/runtime/automations/catalog.js +1 -0
  176. package/dist/src/runtime/automations/model-dependency-projection.d.ts +2 -0
  177. package/dist/src/runtime/automations/service.d.ts +2 -0
  178. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.d.ts +10 -5
  179. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.js +8 -7
  180. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.d.ts +2 -2
  181. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.js +2 -2
  182. package/dist/src/runtime/capabilities/automation-builder/tool-contract.d.ts +2 -2
  183. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -1
  184. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +11 -5
  185. package/dist/src/runtime/capabilities/automations/tool-module.js +1 -1
  186. package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +3 -1
  187. package/dist/src/runtime/capabilities/request-permission-catalog.js +21 -2
  188. package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +2 -1
  189. package/dist/src/runtime/capabilities/request-permission-tool-registry.js +18 -10
  190. package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +2 -0
  191. package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +1 -1
  192. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +6 -0
  193. package/dist/src/runtime/config/builders.js +6 -5
  194. package/dist/src/runtime/config/effective-model-config-validation.js +4 -35
  195. package/dist/src/runtime/config/fields.js +15 -0
  196. package/dist/src/runtime/config/model-context-capacity.d.ts +20 -0
  197. package/dist/src/runtime/config/model-context-capacity.js +55 -0
  198. package/dist/src/runtime/config/model-execution-policy.d.ts +5 -1
  199. package/dist/src/runtime/config/model-execution-policy.js +16 -0
  200. package/dist/src/runtime/config/model-plugin-config.d.ts +8 -0
  201. package/dist/src/runtime/config/model-plugin-config.js +40 -0
  202. package/dist/src/runtime/config/schema.js +5 -1
  203. package/dist/src/runtime/config/validation/model-profile-validation.js +2 -0
  204. package/dist/src/runtime/config/validation/runtime-config-validation-contract.d.ts +3 -1
  205. package/dist/src/runtime/config/validation/runtime-config-validation-contract.js +3 -1
  206. package/dist/src/runtime/config/validation/runtime-root-section-validation.js +11 -4
  207. package/dist/src/runtime/config/validation/web-ui-config-validation.js +3 -2
  208. package/dist/src/runtime/config/web-ui.d.ts +5 -0
  209. package/dist/src/runtime/config/web-ui.js +5 -0
  210. package/dist/src/runtime/config.js +2 -0
  211. package/dist/src/runtime/local-application.d.ts +2 -0
  212. package/dist/src/runtime/local-host/app-owner.js +50 -6
  213. package/dist/src/runtime/local-host/app-request-control.d.ts +3 -1
  214. package/dist/src/runtime/local-host/app-request-control.js +91 -11
  215. package/dist/src/runtime/local-host/client-requests.js +32 -5
  216. package/dist/src/runtime/local-host/client-services.d.ts +2 -0
  217. package/dist/src/runtime/local-host/local-request-diagnostics.d.ts +9 -0
  218. package/dist/src/runtime/local-host/local-request-diagnostics.js +47 -0
  219. package/dist/src/runtime/local-host/saved-approvals.js +23 -2
  220. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  221. package/dist/src/runtime/model/model-selection.js +4 -1
  222. package/dist/src/runtime/observability/request-control-diagnostics.d.ts +6 -0
  223. package/dist/src/runtime/observability/request-control-diagnostics.js +52 -0
  224. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  225. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  226. package/dist/src/runtime/passive-learning/service.js +2 -3
  227. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  228. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  229. package/dist/src/runtime/plugins/configuration-context.d.ts +9 -0
  230. package/dist/src/runtime/plugins/configuration-context.js +42 -0
  231. package/dist/src/runtime/plugins/configuration-settings.d.ts +2 -0
  232. package/dist/src/runtime/plugins/configuration-settings.js +26 -0
  233. package/dist/src/runtime/plugins/configuration-store.d.ts +23 -0
  234. package/dist/src/runtime/plugins/configuration-store.js +100 -0
  235. package/dist/src/runtime/plugins/configuration-write.d.ts +5 -0
  236. package/dist/src/runtime/plugins/configuration-write.js +58 -0
  237. package/dist/src/runtime/plugins/installation/archive.d.ts +2 -0
  238. package/dist/src/runtime/plugins/installation/archive.js +107 -0
  239. package/dist/src/runtime/plugins/installation/github-download.d.ts +9 -0
  240. package/dist/src/runtime/plugins/installation/github-download.js +72 -0
  241. package/dist/src/runtime/plugins/installation/installed-package.d.ts +9 -0
  242. package/dist/src/runtime/plugins/installation/installed-package.js +66 -0
  243. package/dist/src/runtime/plugins/installation/package.d.ts +53 -0
  244. package/dist/src/runtime/plugins/installation/package.js +81 -0
  245. package/dist/src/runtime/plugins/installation/portable-path.d.ts +2 -0
  246. package/dist/src/runtime/plugins/installation/portable-path.js +10 -0
  247. package/dist/src/runtime/plugins/installation/publication.d.ts +10 -0
  248. package/dist/src/runtime/plugins/installation/publication.js +17 -0
  249. package/dist/src/runtime/plugins/installation/service.d.ts +48 -0
  250. package/dist/src/runtime/plugins/installation/service.js +80 -0
  251. package/dist/src/runtime/plugins/loader.js +34 -38
  252. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  253. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  254. package/dist/src/runtime/plugins/manifest-projection.js +1 -0
  255. package/dist/src/runtime/plugins/manifest-validator.js +12 -1
  256. package/dist/src/runtime/plugins/module-cache.d.ts +2 -0
  257. package/dist/src/runtime/plugins/module-cache.js +19 -0
  258. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  259. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  260. package/dist/src/runtime/plugins/selection.d.ts +2 -0
  261. package/dist/src/runtime/plugins/selection.js +16 -11
  262. package/dist/src/runtime/ports.d.ts +6 -4
  263. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  264. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  265. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  266. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  267. package/dist/src/runtime/request/dependencies.d.ts +2 -1
  268. package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +1 -1
  269. package/dist/src/runtime/request/handler.js +8 -0
  270. package/dist/src/runtime/request/prepared-execution.js +9 -1
  271. package/dist/src/runtime/request/request-steering.d.ts +4 -0
  272. package/dist/src/runtime/request/request-steering.js +37 -12
  273. package/dist/src/runtime/request/worker-capability-composition.d.ts +2 -0
  274. package/dist/src/runtime/request/worker-capability-composition.js +4 -1
  275. package/dist/src/runtime/scheduler/journal-index-state.d.ts +1 -1
  276. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  277. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  278. package/dist/src/runtime/steps/execution-agent/format.js +2 -3
  279. package/dist/src/runtime/steps/execution-agent/input.js +1 -1
  280. package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
  281. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  282. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  283. package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
  284. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  285. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  286. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  287. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  288. package/dist/src/sessions/assistant-initiative-message.d.ts +3 -0
  289. package/dist/src/sessions/assistant-initiative-message.js +12 -0
  290. package/dist/src/sessions/assistant-initiative.d.ts +2 -2
  291. package/dist/src/sessions/assistant-initiative.js +1 -7
  292. package/dist/src/sessions/durable-session-commit.d.ts +2 -1
  293. package/dist/src/sessions/durable-session-commit.js +9 -4
  294. package/dist/src/sessions/metadata/projection.d.ts +15 -0
  295. package/dist/src/sessions/metadata/projection.js +55 -0
  296. package/dist/src/sessions/metadata/publication.d.ts +12 -0
  297. package/dist/src/sessions/metadata/publication.js +78 -0
  298. package/dist/src/sessions/metadata/source-receipt.d.ts +5 -0
  299. package/dist/src/sessions/metadata/source-receipt.js +42 -0
  300. package/dist/src/sessions/metadata/store.d.ts +7 -0
  301. package/dist/src/sessions/metadata/store.js +119 -0
  302. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  303. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  304. package/dist/src/sessions/record/projection.d.ts +3 -1
  305. package/dist/src/sessions/record/projection.js +26 -18
  306. package/dist/src/sessions/request-lifecycle/service.js +3 -3
  307. package/dist/src/sessions/session-service.d.ts +2 -4
  308. package/dist/src/sessions/session-service.js +4 -16
  309. package/dist/src/sessions/session-store.d.ts +2 -1
  310. package/dist/src/sessions/session-store.js +11 -5
  311. package/dist/src/sessions/snapshot.d.ts +17 -0
  312. package/dist/src/sessions/snapshot.js +105 -0
  313. package/dist/src/sessions/types.d.ts +2 -0
  314. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  315. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  316. package/dist/src/shared/tool-selection.d.ts +2 -0
  317. package/dist/src/shared/tool-selection.js +7 -0
  318. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  319. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  320. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  321. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  322. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  323. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  324. package/dist/src/shared/windows-job-object.d.ts +2 -0
  325. package/dist/src/shared/windows-job-object.js +66 -0
  326. package/dist/src/web-ui/app/ARCHITECTURE.md +14 -0
  327. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  328. package/dist/src/web-ui/app/app-state.js +0 -7
  329. package/dist/src/web-ui/app/app.js +59 -159
  330. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  331. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  332. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  333. package/dist/src/web-ui/app/components/config-workspace/config-model.js +2 -0
  334. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +136 -0
  335. package/dist/src/web-ui/app/components/config-workspace/model-plugin-selection.js +180 -0
  336. package/dist/src/web-ui/app/components/config-workspace/model-plugin-view-state.js +114 -0
  337. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +3 -0
  338. package/dist/src/web-ui/app/components/config-workspace/model-summary.js +39 -0
  339. package/dist/src/web-ui/app/components/config-workspace/summary-rendering.js +30 -0
  340. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +37 -0
  341. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +24 -2
  342. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +9 -1
  343. package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +23 -67
  344. package/dist/src/web-ui/app/components/config-workspace.js +11 -2
  345. package/dist/src/web-ui/app/components/conversation-view.js +36 -5
  346. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +2 -1
  347. package/dist/src/web-ui/app/components/dashboard/workspace.js +2 -1
  348. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  349. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  350. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  351. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  352. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  353. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  354. package/dist/src/web-ui/app/components/operations-summary.js +105 -0
  355. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  356. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  357. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  358. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  359. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  360. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  361. package/dist/src/web-ui/app/components/passive-learning/home.js +8 -11
  362. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  363. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  364. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  365. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  366. package/dist/src/web-ui/app/components/plugins/configuration-draft.js +34 -0
  367. package/dist/src/web-ui/app/components/plugins/configuration-editor.js +147 -0
  368. package/dist/src/web-ui/app/components/plugins/configuration-fields.js +103 -0
  369. package/dist/src/web-ui/app/components/plugins/configuration-retained-secrets.js +20 -0
  370. package/dist/src/web-ui/app/components/plugins/configuration-settings.js +108 -0
  371. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +45 -0
  372. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  373. package/dist/src/web-ui/app/components/plugins/installation.js +213 -0
  374. package/dist/src/web-ui/app/components/plugins/manager.js +160 -6
  375. package/dist/src/web-ui/app/components/plugins/removal.js +130 -0
  376. package/dist/src/web-ui/app/components/plugins/rendering.js +17 -2
  377. package/dist/src/web-ui/app/components/plugins/summary.js +54 -0
  378. package/dist/src/web-ui/app/components/plugins/tabs.js +31 -0
  379. package/dist/src/web-ui/app/components/plugins/view-state.js +3 -1
  380. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  381. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  382. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +5 -2
  383. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +9 -1
  384. package/dist/src/web-ui/app/components/runtime-setup/context-window-feedback.js +71 -0
  385. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +9 -4
  386. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  387. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  388. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  389. package/dist/src/web-ui/app/components/runtime-setup-guide.js +15 -3
  390. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  391. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  392. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  393. package/dist/src/web-ui/app/components/spark-chat/empty-state.js +1 -0
  394. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  395. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -0
  396. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  397. package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
  398. package/dist/src/web-ui/app/components/system-host/connection-card.js +35 -0
  399. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  400. package/dist/src/web-ui/app/components/system-host/macos-setup.js +1 -1
  401. package/dist/src/web-ui/app/components/system-host/manager.js +45 -12
  402. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  403. package/dist/src/web-ui/app/components/system-host/rendering.js +114 -106
  404. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +293 -0
  405. package/dist/src/web-ui/app/components/workspace-shell.js +6 -0
  406. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  407. package/dist/src/web-ui/app/computer-access-feature.js +22 -5
  408. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  409. package/dist/src/web-ui/app/configuration-feature.js +44 -3
  410. package/dist/src/web-ui/app/controllers/app-event-bindings.js +41 -105
  411. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  412. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  413. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  414. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  415. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  416. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  417. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  418. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  419. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  420. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  421. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  422. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  423. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  424. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  425. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  426. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  427. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  428. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  429. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  430. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  431. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +1 -0
  432. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +7 -3
  433. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +91 -0
  434. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +10 -5
  435. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +97 -162
  436. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  437. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  438. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  439. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  440. package/dist/src/web-ui/app/controllers/history-pagination.js +111 -0
  441. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  442. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  443. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  444. package/dist/src/web-ui/app/controllers/operations-controller.d.ts +12 -0
  445. package/dist/src/web-ui/app/controllers/operations-controller.js +28 -21
  446. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  447. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  448. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  449. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  450. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.d.ts +1 -0
  451. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +11 -0
  452. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  453. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  454. package/dist/src/web-ui/app/controllers/session-controller.js +43 -19
  455. package/dist/src/web-ui/app/controllers/session-list-pagination.js +71 -0
  456. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  457. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +17 -17
  458. package/dist/src/web-ui/app/controllers/spark-chat-reading.js +1 -0
  459. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +26 -7
  460. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  461. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  462. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  463. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +21 -19
  464. package/dist/src/web-ui/app/dashboard-feature.js +4 -3
  465. package/dist/src/web-ui/app/index.html +6 -2
  466. package/dist/src/web-ui/app/lib/history-page-messages.js +49 -0
  467. package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
  468. package/dist/src/web-ui/app/lib/request-lifecycle-view.js +8 -0
  469. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  470. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  471. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  472. package/dist/src/web-ui/app/lib/workspace-route.d.ts +3 -0
  473. package/dist/src/web-ui/app/lib/workspace-route.js +4 -0
  474. package/dist/src/web-ui/app/passive-learning-feature.js +16 -4
  475. package/dist/src/web-ui/app/runtime-onboarding-feature.js +3 -0
  476. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  477. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  478. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  479. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  480. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  481. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  482. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +20 -0
  483. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  484. package/dist/src/web-ui/app/services/runtime-web-client/plugin-configuration.js +19 -0
  485. package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.js +4 -4
  486. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +4 -0
  487. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +8 -1
  488. package/dist/src/web-ui/app/services/runtime-web-client.js +14 -3
  489. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  490. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  491. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  492. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  493. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  494. package/dist/src/web-ui/app/spark-chat-feature.js +84 -21
  495. package/dist/src/web-ui/app/styles/11-product-links.css +30 -0
  496. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  497. package/dist/src/web-ui/app/styles/41-plugin-configuration.css +79 -0
  498. package/dist/src/web-ui/app/styles/41-plugin-discovery.css +132 -0
  499. package/dist/src/web-ui/app/styles/41-plugin-management.css +14 -0
  500. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +174 -0
  501. package/dist/src/web-ui/app/styles/46-system-host.css +61 -107
  502. package/dist/src/web-ui/app/styles/47-config-controls.css +13 -1
  503. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  504. package/dist/src/web-ui/app/styles/54-spark-chat.css +33 -1
  505. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  506. package/dist/src/web-ui/app/styles.css +6 -0
  507. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  508. package/dist/src/web-ui/client-state/contracts.js +13 -0
  509. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  510. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  511. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  512. package/dist/src/web-ui/client-state/preferences.js +84 -0
  513. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  514. package/dist/src/web-ui/client-state/queue.js +43 -0
  515. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  516. package/dist/src/web-ui/client-state/routes.js +58 -0
  517. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  518. package/dist/src/web-ui/client-state/store.js +88 -0
  519. package/dist/src/web-ui/local-runtime/api-router.js +11 -6
  520. package/dist/src/web-ui/local-runtime/approval-request-attachment.js +14 -5
  521. package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +1 -1
  522. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +11 -3
  523. package/dist/src/web-ui/local-runtime/contracts.d.ts +4 -3
  524. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +5 -1
  525. package/dist/src/web-ui/local-runtime/environment-registry.js +53 -11
  526. package/dist/src/web-ui/local-runtime/history-pagination.d.ts +16 -0
  527. package/dist/src/web-ui/local-runtime/history-pagination.js +20 -0
  528. package/dist/src/web-ui/local-runtime/http.js +11 -2
  529. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  530. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  531. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  532. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  533. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  534. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  535. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  536. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  537. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.d.ts +16 -0
  538. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.js +68 -0
  539. package/dist/src/web-ui/local-runtime/plugin-installation-routes.d.ts +16 -0
  540. package/dist/src/web-ui/local-runtime/plugin-installation-routes.js +96 -0
  541. package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +8 -1
  542. package/dist/src/web-ui/local-runtime/plugin-management-routes.js +17 -0
  543. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.d.ts +7 -0
  544. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.js +17 -0
  545. package/dist/src/web-ui/local-runtime/plugin-removal-routes.d.ts +18 -0
  546. package/dist/src/web-ui/local-runtime/plugin-removal-routes.js +60 -0
  547. package/dist/src/web-ui/local-runtime/realtime-controller.js +41 -2
  548. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  549. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  550. package/dist/src/web-ui/local-runtime/request-cancellation-route.js +28 -1
  551. package/dist/src/web-ui/local-runtime/request-control-observation.d.ts +19 -0
  552. package/dist/src/web-ui/local-runtime/request-control-observation.js +80 -0
  553. package/dist/src/web-ui/local-runtime/request-execution.js +66 -34
  554. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  555. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  556. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +13 -0
  557. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +21 -0
  558. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  559. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  560. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  561. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  562. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  563. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  564. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  565. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  566. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  567. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  568. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +2 -0
  569. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  570. package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +9 -2
  571. package/dist/src/web-ui/local-runtime/session-routes.d.ts +1 -0
  572. package/dist/src/web-ui/local-runtime/session-routes.js +16 -4
  573. package/dist/src/web-ui/local-runtime/spark-chat-routes.js +4 -3
  574. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  575. package/dist/src/web-ui/plugin-capability-selection.js +4 -1
  576. package/dist/src/web-ui/plugin-configuration-input.d.ts +12 -0
  577. package/dist/src/web-ui/plugin-configuration-input.js +68 -0
  578. package/dist/src/web-ui/plugin-configuration-retained-secrets.d.ts +9 -0
  579. package/dist/src/web-ui/plugin-configuration-retained-secrets.js +48 -0
  580. package/dist/src/web-ui/plugin-configuration-service.d.ts +52 -0
  581. package/dist/src/web-ui/plugin-configuration-service.js +66 -0
  582. package/dist/src/web-ui/plugin-configuration-view.d.ts +25 -0
  583. package/dist/src/web-ui/plugin-configuration-view.js +45 -0
  584. package/dist/src/web-ui/plugin-disabled-selection.d.ts +7 -0
  585. package/dist/src/web-ui/plugin-disabled-selection.js +17 -0
  586. package/dist/src/web-ui/plugin-management-catalog.d.ts +5 -1
  587. package/dist/src/web-ui/plugin-management-catalog.js +13 -1
  588. package/dist/src/web-ui/plugin-management-selection.js +22 -9
  589. package/dist/src/web-ui/plugin-management-service.d.ts +6 -1
  590. package/dist/src/web-ui/plugin-management-service.js +11 -7
  591. package/dist/src/web-ui/plugin-removal-error.d.ts +7 -0
  592. package/dist/src/web-ui/plugin-removal-error.js +16 -0
  593. package/dist/src/web-ui/plugin-removal-service.d.ts +31 -0
  594. package/dist/src/web-ui/plugin-removal-service.js +109 -0
  595. package/dist/src/web-ui/runtime-setup-gateway.d.ts +6 -2
  596. package/dist/src/web-ui/runtime-setup-gateway.js +30 -10
  597. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  598. package/dist/src/web-ui/server-readiness.js +36 -0
  599. package/dist/src/web-ui/server.d.ts +2 -0
  600. package/dist/src/web-ui/server.js +29 -3
  601. package/dist/src/web-ui/session-read-state/overview.d.ts +42 -0
  602. package/dist/src/web-ui/session-read-state/overview.js +16 -0
  603. package/dist/src/web-ui/session-read-state/pagination.d.ts +15 -0
  604. package/dist/src/web-ui/session-read-state/pagination.js +42 -0
  605. package/dist/src/web-ui/session-read-state/projection.d.ts +4 -3
  606. package/dist/src/web-ui/session-read-state/service.d.ts +213 -20
  607. package/dist/src/web-ui/session-read-state/service.js +25 -23
  608. package/dist/src/web-ui/session-read-state/visible-messages.d.ts +3 -3
  609. package/dist/src/web-ui/system-host-service.js +13 -2
  610. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  611. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  612. package/dist/src/web-ui/system-host-setup/companion-linux.js +1 -1
  613. package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +1 -1
  614. package/dist/src/web-ui/system-host-setup/installer-contract.js +2 -2
  615. package/dist/src/web-ui/system-host-setup/installers.js +0 -7
  616. package/dist/src/web-ui/system-host-setup/local-connection.d.ts +4 -1
  617. package/dist/src/web-ui/system-host-setup/local-connection.js +10 -17
  618. package/dist/src/web-ui/system-host-setup/routes.d.ts +2 -0
  619. package/dist/src/web-ui/system-host-setup/routes.js +32 -9
  620. package/dist/src/web-ui/system-host-setup/setup-mutation.d.ts +9 -0
  621. package/dist/src/web-ui/system-host-setup/setup-mutation.js +27 -0
  622. package/dist/src/web-ui/system-host-setup/windows-store-route.d.ts +13 -0
  623. package/dist/src/web-ui/system-host-setup/windows-store-route.js +68 -0
  624. package/docs/configuration.md +46 -0
  625. package/docs/installation.md +88 -28
  626. package/docs/plugins.md +310 -6
  627. package/docs/projects-and-full-plus.md +2 -6
  628. package/docs/runtime-library.md +0 -1
  629. package/docs/tool-execution-result-evidence-contract.md +57 -0
  630. package/docs/windows-companion-store.md +132 -0
  631. package/package.json +6 -4
  632. package/plugins/capability-brief/plugin.json +4 -0
  633. package/plugins/code-outline/README.md +20 -0
  634. package/plugins/code-outline/plugin.json +1 -0
  635. package/plugins/code-outline/source/index.ts +16 -20
  636. package/plugins/code-outline/source/read-failure.ts +40 -0
  637. package/plugins/code-outline/src/index.cjs +614 -29
  638. package/plugins/document-reader/README.md +33 -0
  639. package/plugins/document-reader/plugin.json +2 -0
  640. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  641. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  642. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  643. package/plugins/document-reader/source/pdf-process.ts +207 -0
  644. package/plugins/document-reader/source/pdf-result.ts +79 -0
  645. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  646. package/plugins/document-reader/source/pdf.ts +4 -1
  647. package/plugins/document-reader/source/read-failure.ts +37 -0
  648. package/plugins/document-reader/source/reader.ts +3 -19
  649. package/plugins/document-reader/src/index.cjs +995 -211
  650. package/plugins/exec/README.md +19 -0
  651. package/plugins/exec/plugin.json +7 -3
  652. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  653. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  654. package/plugins/exec/source/filesystem-observer.ts +8 -79
  655. package/plugins/exec/source/output-files.ts +12 -6
  656. package/plugins/exec/source/paths.ts +3 -1
  657. package/plugins/exec/source/process-manager.ts +8 -24
  658. package/plugins/exec/source/shell-platform.ts +19 -3
  659. package/plugins/exec/source/shell-process.ts +55 -0
  660. package/plugins/exec/source/windows-job-source.ts +1 -0
  661. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  662. package/plugins/exec/src/index.cjs +252 -96
  663. package/plugins/filesystem/README.md +65 -0
  664. package/plugins/filesystem/plugin.json +8 -2
  665. package/plugins/filesystem/source/atomic-write.ts +2 -0
  666. package/plugins/filesystem/source/bounded-io.ts +80 -306
  667. package/plugins/filesystem/source/directory-sample.ts +2 -0
  668. package/plugins/filesystem/source/errors.ts +14 -0
  669. package/plugins/filesystem/source/file-observation.ts +151 -0
  670. package/plugins/filesystem/source/file-version.ts +41 -0
  671. package/plugins/filesystem/source/index.ts +6 -0
  672. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  673. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  674. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  675. package/plugins/filesystem/source/windows/operations.ts +197 -0
  676. package/plugins/filesystem/source/windows/process.ts +214 -0
  677. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  678. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  679. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  680. package/plugins/filesystem/source/windows/source.ts +42 -0
  681. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  682. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  683. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  684. package/plugins/filesystem/src/index.cjs +1208 -322
  685. package/plugins/json-inspector/README.md +18 -0
  686. package/plugins/json-inspector/plugin.json +1 -0
  687. package/plugins/json-inspector/source/index.ts +16 -19
  688. package/plugins/json-inspector/source/read-failure.ts +42 -0
  689. package/plugins/json-inspector/src/index.cjs +612 -27
  690. package/plugins/local-search/README.md +29 -0
  691. package/plugins/local-search/plugin.json +2 -0
  692. package/plugins/local-search/source/errors.ts +2 -0
  693. package/plugins/local-search/source/paths.ts +3 -0
  694. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  695. package/plugins/local-search/source/ripgrep.ts +3 -3
  696. package/plugins/local-search/source/windows-authority.ts +99 -0
  697. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  698. package/plugins/local-search/source/windows-search-process.ts +91 -0
  699. package/plugins/local-search/source/windows-search-script.ts +52 -0
  700. package/plugins/local-search/src/index.cjs +595 -26
  701. package/plugins/memory/plugin.json +4 -0
  702. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  703. package/plugins/memory/source/lock-owner-file.ts +71 -0
  704. package/plugins/memory/source/lock-path-observation.ts +26 -0
  705. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  706. package/plugins/memory/source/store-lock.ts +12 -7
  707. package/plugins/memory/source/store.ts +3 -2
  708. package/plugins/memory/src/index.cjs +174 -25
  709. package/plugins/project-orientation/README.md +23 -0
  710. package/plugins/project-orientation/plugin.json +1 -0
  711. package/plugins/project-orientation/source/index.ts +12 -9
  712. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  713. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  714. package/plugins/project-orientation/source/tree.ts +6 -0
  715. package/plugins/project-orientation/src/index.cjs +647 -31
  716. package/plugins/system/README.md +81 -5
  717. package/plugins/system/plugin.json +10 -1
  718. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  719. package/plugins/system/source/command-working-directory.ts +47 -0
  720. package/plugins/system/source/companion-command-output.ts +82 -0
  721. package/plugins/system/source/computer/handlers.ts +13 -9
  722. package/plugins/system/source/computer/observation-result.ts +10 -5
  723. package/plugins/system/source/computer/request-computers.ts +10 -3
  724. package/plugins/system/source/computer/request-modules.ts +3 -6
  725. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  726. package/plugins/system/source/host-dispatch.ts +21 -1
  727. package/plugins/system/source/index.ts +14 -6
  728. package/plugins/system/source/local-command-output-retention.ts +16 -0
  729. package/plugins/system/source/local-command-output.ts +69 -0
  730. package/plugins/system/source/request-system-modules.ts +14 -2
  731. package/plugins/system/source/request-target-snapshot.ts +2 -1
  732. package/plugins/system/source/security/desktop-result.ts +177 -0
  733. package/plugins/system/source/security/observed-error.ts +10 -0
  734. package/plugins/system/source/security/secret-text.ts +118 -0
  735. package/plugins/system/source/security/system-results.ts +62 -0
  736. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  737. package/plugins/system/src/index.cjs +1207 -86
  738. package/plugins/system-probe/plugin.json +8 -2
  739. package/plugins/system-probe/source/disk-path.ts +8 -0
  740. package/plugins/system-probe/source/index.ts +10 -5
  741. package/plugins/system-probe/source/machine-load.ts +33 -0
  742. package/plugins/system-probe/source/metrics.ts +6 -8
  743. package/plugins/system-probe/src/index.cjs +49 -16
  744. package/plugins/web/README.md +2 -2
  745. package/plugins/web/plugin.json +8 -0
  746. package/runtime.config.schema.json +25 -1
  747. package/src/runtime/README.md +12 -2
  748. package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +0 -2
  749. package/dist/src/web-ui/system-host-setup/companion-windows.js +0 -108
  750. package/docs/publishing.md +0 -167
@@ -1,15 +1,20 @@
1
1
  import { normalizeConversationMessage } from "./conversation-session-controller.js";
2
2
  import { rememberRequestLifecycle, sameConversationMessage } from "../lib/request-lifecycle-view.js";
3
3
 
4
- export function mergeSparkSnapshotMessages(snapshot, current) {
4
+ export function mergeSparkSnapshotMessages(snapshot, current, hasNewer = false) {
5
5
  const canonical = (snapshot.messages || []).map(normalizeConversationMessage);
6
+ if (hasNewer) return current.map((message) => canonical.find((entry) => sameConversationMessage(message, entry)) || message);
6
7
  const activeRequestIds = new Set((snapshot.requests || []).filter((request) => request.status === "streaming").map((request) => request.requestId));
7
8
  const unsettled = current.filter((message) => {
8
9
  if (!message.streaming) return false;
9
10
  if (activeRequestIds.has(message.requestId)) return true;
10
11
  return !canonical.some((entry) => sameConversationMessage(message, entry));
11
12
  });
12
- return [...canonical, ...unsettled];
13
+ if (snapshot.newerCursor === undefined) return [...canonical, ...unsettled];
14
+ const settled = current.filter((message) => !message.streaming);
15
+ const firstIndex = canonical.length ? settled.findIndex((message) => sameConversationMessage(message, canonical[0])) : -1;
16
+ const older = firstIndex >= 0 ? settled.slice(0, firstIndex) : [];
17
+ return [...older, ...canonical, ...unsettled];
13
18
  }
14
19
 
15
20
  function needsRequestLifecycleHydration(snapshot, state) {
@@ -64,6 +69,18 @@ export function createSparkChatSync({
64
69
  if (environmentId !== getEnvironmentId()) return false;
65
70
  return readRevision === revision;
66
71
  }
72
+ function canRetainTargetWindow(sessionId) {
73
+ if (!initialized || state.currentSessionId !== sessionId) return false;
74
+ return conversation.session.history?.hasNewer() === true;
75
+ }
76
+ async function hydrateConversation(result) {
77
+ if (!canRetainTargetWindow(result.sessionId)) {
78
+ await conversation.session.openSession(result.sessionId, { snapshot: { ...result.snapshot, readState: result.readState } });
79
+ return true;
80
+ }
81
+ state.messages = mergeSparkSnapshotMessages(result.snapshot, state.messages, true);
82
+ return conversation.session.rehydrateRequests(result.snapshot.requests || []);
83
+ }
67
84
  async function drain() {
68
85
  if (!canRefresh()) return;
69
86
  queued = false;
@@ -78,7 +95,7 @@ export function createSparkChatSync({
78
95
  try {
79
96
  const result = await client.loadSparkChat(environmentId);
80
97
  if (!isCurrentRead(environmentId, readRevision)) return;
81
- if (modelCatalogEnvironment !== environmentId || !modelProfiles.some((profile) => profile.id === result.modelProfileId)) {
98
+ if (consolidateNext || modelCatalogEnvironment !== environmentId || !modelProfiles.some((profile) => profile.id === result.modelProfileId)) {
82
99
  const catalog = await client.listModels(environmentId);
83
100
  if (!isCurrentRead(environmentId, readRevision)) return;
84
101
  modelProfiles = catalog.profiles || catalog.models || [];
@@ -94,17 +111,19 @@ export function createSparkChatSync({
94
111
  onHistoryReset();
95
112
  }
96
113
  if (hasReadableGeneration(result.readState)) readGeneration = result.readState.readGeneration;
97
- onConfiguration({ ...result, supportsImageInput, modelAvailable: Boolean(profile) });
114
+ onConfiguration({ ...result, supportsImageInput, supportsThinking: profile?.supportsThinking === true, modelAvailable: Boolean(profile) });
98
115
  onReadState(result.readState);
99
116
  const snapshot = result.snapshot;
100
117
  if (shouldHydrateSparkConversation(initialized, rehydrate, snapshot, state)) {
101
- initialized = false; hydrating = true;
102
- await conversation.session.openSession(result.sessionId);
118
+ hydrating = true;
119
+ const restored = await hydrateConversation(result);
103
120
  hydrating = false;
121
+ if (!restored) return;
104
122
  if (!isCurrentRead(environmentId, readRevision)) return;
105
123
  initialized = true;
106
124
  } else {
107
- state.messages = mergeSparkSnapshotMessages(snapshot, state.messages);
125
+ conversation.session.history?.refresh(snapshot);
126
+ state.messages = mergeSparkSnapshotMessages(snapshot, state.messages, conversation.session.history?.hasNewer());
108
127
  for (const request of snapshot.requests || []) rememberRequestLifecycle(state, request.lifecycle);
109
128
  for (const message of state.messages) {
110
129
  if (message.role !== "assistant" || !message.requestId) continue;
@@ -1,3 +1,5 @@
1
+ import { ComposerSubmissionRefused } from "./composer-submission-lifecycle.js";
2
+
1
3
  function createSteerId() {
2
4
  const randomId = globalThis.crypto?.randomUUID?.();
3
5
  if (randomId) return `web-steer-${randomId}`;
@@ -28,7 +30,7 @@ export function createSteerController({
28
30
  if (message.accepted === true) pending.resolve(message);
29
31
  else {
30
32
  pending.reject(
31
- new Error(String(message.reason || "Steer was not accepted.")),
33
+ new ComposerSubmissionRefused(String(message.reason || "Steer was not accepted.")),
32
34
  );
33
35
  }
34
36
  return true;
@@ -43,13 +45,13 @@ export function createSteerController({
43
45
  }
44
46
  }
45
47
 
46
- async function steer(text) {
47
- const { requestId, environmentId, sessionId } = getScope();
48
+ async function steer(text, captured = {}) {
49
+ const { requestId, environmentId, sessionId } = captured.scope ?? getScope();
48
50
  if (!requestId || !sessionId) {
49
- throw new Error("There is no active request to steer.");
51
+ throw new ComposerSubmissionRefused("There is no active request to steer.");
50
52
  }
51
- if (getPendingAttachmentCount() > 0) {
52
- throw new Error("Attachments can only be sent with Send next.");
53
+ if ((captured.pendingAttachmentCount ?? getPendingAttachmentCount()) > 0) {
54
+ throw new ComposerSubmissionRefused("Attachments can only be sent with Send next.");
53
55
  }
54
56
  const steerId = createSteerId();
55
57
  const acknowledgement = new Promise((resolve, reject) => {
@@ -81,7 +83,7 @@ export function createSteerController({
81
83
  const pending = pendingSteers.get(steerId);
82
84
  pendingSteers.delete(steerId);
83
85
  if (pending) clearTimer(pending.timeoutId);
84
- throw new Error("Realtime connection is not available.");
86
+ throw new ComposerSubmissionRefused("Realtime connection is not available.");
85
87
  }
86
88
  await acknowledgement;
87
89
  const current = getScope();
@@ -20,7 +20,7 @@ export function createToolPermissionModeController({
20
20
  function currentToolPermissionMode() {
21
21
  const sessionId = getComposerSessionId();
22
22
  if (!sessionId) return preferences.loadLastToolPermissionMode(normalizeToolPermissionMode);
23
- return normalizeToolPermissionMode(sessionModeFor(sessionId).toolPermissionMode);
23
+ return normalizeToolPermissionMode(sessionModeFor(sessionId).toolPermissionMode || "ask");
24
24
  }
25
25
 
26
26
  function clearSessionMode(sessionId) {
@@ -0,0 +1,34 @@
1
+ import { canNavigateConversation } from "./conversation-navigation-intent.js";
2
+
3
+ /** Prepare the session and recovered draft before committing its workspace. */
4
+ export function createWorkspaceConversationOpener({ state, shell, openSession }) {
5
+ return async (sessionId, options) => {
6
+ if (!sessionId) return false;
7
+ if (!canNavigateConversation(state)) {
8
+ shell.showToast?.("Wait for the environment change to finish before opening a conversation.", "neutral");
9
+ return false;
10
+ }
11
+ const activate = shell.prepareWorkspaceActivation("chat");
12
+ if (!activate) return false;
13
+ let navigationRevision = shell.navigationRevision?.();
14
+ function isConversationWorkspaceNavigationCurrent() {
15
+ if (!canNavigateConversation(state)) return false;
16
+ return shell.navigationRevision?.() === navigationRevision;
17
+ }
18
+ let committed = false;
19
+ const opened = await openSession(sessionId, {
20
+ ...options,
21
+ isRouteCurrent: isConversationWorkspaceNavigationCurrent,
22
+ commitRouteNavigation: () => {
23
+ if (!isConversationWorkspaceNavigationCurrent()) return false;
24
+ committed = activate() === true;
25
+ navigationRevision = shell.navigationRevision?.();
26
+ return committed;
27
+ },
28
+ });
29
+ if (opened !== true) return false;
30
+ if (!committed) return false;
31
+ if (!isConversationWorkspaceNavigationCurrent()) return false;
32
+ return state.currentSessionId === sessionId;
33
+ };
34
+ }
@@ -37,7 +37,7 @@ export function createWorkspaceRouteController({
37
37
  session: getSessionId(),
38
38
  automationRun: automations?.chatRunId() || "",
39
39
  category: configurationCategoryForWorkspace(shell.activeWorkspace()),
40
- tab: shell.activeOperationsTab(),
40
+ tab: shell.activeWorkspace() === "plugins" ? configuration.activePluginTab?.() || "installed" : shell.activeOperationsTab(),
41
41
  job: schedules.selectedJobId(),
42
42
  automation: automations?.selectedAutomationId() || "",
43
43
  run: automations?.selectedRunId() || "",
@@ -136,24 +136,24 @@ export function createWorkspaceRouteController({
136
136
  return true;
137
137
  }
138
138
  if (route.session === getSessionId()) return true;
139
- const sessions = await loadSessions();
139
+ await loadSessions();
140
140
  if (!routeActivationIsCurrent()) return false;
141
141
  if (environmentId !== getEnvironmentId()) return false;
142
- if (!routeSessionIsListed(route, sessions)) {
143
- shell.showToast(
144
- "This conversation is unavailable in the selected environment.",
145
- "failed",
146
- );
142
+ let routeCommitted = false;
143
+ try {
144
+ await openSession(route.session, {
145
+ isRouteCurrent: routeActivationIsCurrent,
146
+ commitRouteNavigation: () => {
147
+ routeCommitted = commitLinkedConversationRoute();
148
+ return routeCommitted;
149
+ },
150
+ });
151
+ } catch (error) {
152
+ if (error.code !== "session_not_found") throw error;
153
+ if (!routeActivationIsCurrent()) return false;
154
+ shell.showToast("This conversation is unavailable in the selected environment.", "failed");
147
155
  return false;
148
156
  }
149
- let routeCommitted = false;
150
- await openSession(route.session, {
151
- isRouteCurrent: routeActivationIsCurrent,
152
- commitRouteNavigation: () => {
153
- routeCommitted = commitLinkedConversationRoute();
154
- return routeCommitted;
155
- },
156
- });
157
157
  if (!routeCommitted) return false;
158
158
  if (!routeActivationIsCurrent()) return false;
159
159
  if (environmentId !== getEnvironmentId()) return false;
@@ -223,6 +223,9 @@ export function createWorkspaceRouteController({
223
223
  if (route.workspace === "config") {
224
224
  shell.activateOperationsTab(route.tab || "runtime");
225
225
  }
226
+ if (route.workspace === "plugins") {
227
+ return configuration.openPluginRoute?.(route) ?? true;
228
+ }
226
229
  if (route.workspace === "schedules") {
227
230
  return await schedules.openJob(route.job || "");
228
231
  }
@@ -251,6 +254,9 @@ export function createWorkspaceRouteController({
251
254
  route.job = "";
252
255
  route.automation = "";
253
256
  route.run = "";
257
+ route.pluginSource = "";
258
+ route.pluginRef = "";
259
+ route.pluginPath = "";
254
260
  }
255
261
  await applyRoute(route, { initial: true });
256
262
  } catch (error) {
@@ -346,10 +352,6 @@ function routeChangesEnvironment(route, selectedEnvironment) {
346
352
  return route.environment !== selectedEnvironment;
347
353
  }
348
354
 
349
- function routeSessionIsListed(route, sessions) {
350
- return sessions.some((session) => session.id === route.session);
351
- }
352
-
353
355
  function initialRouteWasSuperseded(initial, pendingHistory) {
354
356
  if (!initial) return false;
355
357
  return Boolean(pendingHistory);
@@ -1,3 +1,4 @@
1
+ import { createWorkspaceConversationOpener } from "./controllers/workspace-conversation-opener.js";
1
2
  import { createDashboardWorkspace } from "./components/dashboard/workspace.js";
2
3
  import { createDashboardController } from "./controllers/dashboard-controller.js";
3
4
  import { createDashboardApprovalsController } from "./controllers/dashboard-approvals-controller.js";
@@ -17,6 +18,7 @@ export function createDashboardFeature({
17
18
  isComposerAvailable,
18
19
  passiveLearning,
19
20
  }) {
21
+ const openConversation = createWorkspaceConversationOpener({ state, shell, openSession });
20
22
  let view;
21
23
  let controller;
22
24
  const approvals = createDashboardApprovalsController({
@@ -34,7 +36,7 @@ export function createDashboardFeature({
34
36
  render: (snapshot) => {
35
37
  const sessions = filterSessionsByArchiveState(snapshot.sessions,
36
38
  preferences?.loadSessionSidebar?.(selectedEnvironmentId())?.archivedSessionIds);
37
- view?.render({ ...snapshot, sessions, composerAvailable: isComposerAvailable() });
39
+ view?.render({ ...snapshot, sessions, sessionOverview: state.sessionOverview, composerAvailable: isComposerAvailable() });
38
40
  },
39
41
  });
40
42
  view = createDashboardWorkspace({
@@ -50,9 +52,8 @@ export function createDashboardFeature({
50
52
  refresh: controller.refresh,
51
53
  decideApproval: approvals.submit,
52
54
  openConversation: async (sessionId, requestId) => {
53
- if (!shell.activateWorkspace("chat")) return;
54
55
  try {
55
- await openSession(sessionId);
56
+ if (!await openConversation(sessionId, { page: { targetRequestId: requestId } })) return;
56
57
  if (state.currentSessionId !== sessionId) return;
57
58
  if (!requestId) return;
58
59
  requestAnimationFrame(() => {
@@ -25,7 +25,10 @@
25
25
  </section>
26
26
  <div id="app" class="app-shell" data-startup-pending aria-busy="true" inert>
27
27
  <nav class="workspace-rail" aria-label="Workspace navigation">
28
- <div class="workspace-brand"><img src="/favicon.svg" width="28" height="28" alt="ABot" /></div>
28
+ <div class="workspace-brand">
29
+ <img src="/favicon.svg" width="28" height="28" alt="ABot" />
30
+ <a class="product-site-link" href="https://abot-ai.com/" target="_blank" rel="noopener noreferrer" aria-label="abot-ai.com — ABot website (opens in a new tab)">abot-ai.com <span aria-hidden="true">↗</span></a>
31
+ </div>
29
32
  <button
30
33
  id="sessionsToggleButton"
31
34
  class="rail-button rail-history-button"
@@ -314,6 +317,7 @@
314
317
  id="messagesList"
315
318
  class="messages-list"
316
319
  aria-label="Conversation messages"
320
+ tabindex="0"
317
321
  ></section>
318
322
  <div
319
323
  id="messageStatusRegion"
@@ -639,7 +643,7 @@
639
643
  >
640
644
  <header class="workspace-page-header config-workspace-header">
641
645
  <div class="workspace-page-heading config-workspace-heading">
642
- <p class="eyebrow">Runtime workspace</p>
646
+ <a class="product-site-link" href="https://abot-ai.com/" target="_blank" rel="noopener noreferrer" aria-label="abot-ai.com — ABot website (opens in a new tab)">abot-ai.com <span aria-hidden="true">↗</span></a>
643
647
  <h2 id="configWorkspaceTitle">System</h2>
644
648
  </div>
645
649
  <div class="toolbar-actions">
@@ -0,0 +1,49 @@
1
+ import { isApprovalPresentation, mergeConversationMessage, sameConversationMessage } from "./request-lifecycle-view.js";
2
+
3
+ function isRequestResponse(message) {
4
+ if (message.role !== "assistant") return false;
5
+ if (!message.requestId) return false;
6
+ return !isApprovalPresentation(message);
7
+ }
8
+
9
+ function indexConversationMessages(messages) {
10
+ const byId = new Map(messages.map((message) => [message.id, message]));
11
+ const byRequest = new Map();
12
+ for (const message of messages) {
13
+ if (!isRequestResponse(message)) continue;
14
+ const candidates = byRequest.get(message.requestId) || [];
15
+ candidates.push(message);
16
+ byRequest.set(message.requestId, candidates);
17
+ }
18
+ return (incoming) => {
19
+ if (!incoming) return undefined;
20
+ const exact = byId.get(incoming.id);
21
+ if (exact) return exact;
22
+ return byRequest.get(incoming.requestId)?.find((message) => sameConversationMessage(message, incoming));
23
+ };
24
+ }
25
+
26
+ /** Keep the contiguous loaded history before rows received from the live stream. */
27
+ export function mergeHistoryPage(state, incoming, direction, windowEnd) {
28
+ const current = state.messages;
29
+ const findCurrent = indexConversationMessages(current);
30
+ const replaced = new Set();
31
+ const page = incoming.map((message) => {
32
+ const existing = findCurrent(message);
33
+ if (!existing) return message;
34
+ replaced.add(existing);
35
+ return mergeConversationMessage(existing, message);
36
+ });
37
+ const retained = (messages) => messages.filter((message) => !replaced.has(message));
38
+ if (direction === "older") {
39
+ state.messages = [...page, ...retained(current)];
40
+ } else {
41
+ const end = current.indexOf(findCurrent(windowEnd));
42
+ const split = end < 0 ? current.length : end + 1;
43
+ state.messages = [...retained(current.slice(0, split)), ...page, ...retained(current.slice(split))];
44
+ }
45
+ for (const message of state.messages) {
46
+ if (!isRequestResponse(message)) continue;
47
+ state.requestMessages?.set(message.requestId, message.id);
48
+ }
49
+ }
@@ -0,0 +1,35 @@
1
+ import { escapeHtml } from "./text-format.js";
2
+
3
+ export function canChooseReasoning(profile) {
4
+ return profile?.supportsThinking === true;
5
+ }
6
+
7
+ /** Keep the stored mode for compatibility while showing the effective provider default. */
8
+ export function reasoningModeOptions(mode, enabled, modes = ["fast", "reasoning", "deep"]) {
9
+ if (!enabled) return `<option value="${escapeHtml(mode || "reasoning")}">Provider default</option>`;
10
+ const labels = { fast: "Fast", reasoning: "Reasoning", deep: "Deep", auto: "Auto" };
11
+ return modes.map((value) => `<option value="${escapeHtml(value)}"${value === mode ? " selected" : ""}>${escapeHtml(labels[value] || value)}</option>`).join("");
12
+ }
13
+
14
+ export function renderReasoningModeField(mode, profile, modes) {
15
+ const enabled = canChooseReasoning(profile);
16
+ return `<label>Reasoning depth<select name="agentMode" data-reasoning-mode${enabled ? "" : " disabled"}>${reasoningModeOptions(mode, enabled, modes)}</select>
17
+ <small data-reasoning-mode-note${enabled ? " hidden" : ""}>Uses the provider default. Enable reasoning controls for this model in Models.</small></label>`;
18
+ }
19
+
20
+ export function syncReasoningModeField(form, profiles, modes) {
21
+ const select = form?.querySelector("[data-reasoning-mode]");
22
+ if (!select) return;
23
+ const profileId = form.querySelector('[name="modelProfileId"]')?.value;
24
+ const profile = profiles?.find((item) => item.id === profileId);
25
+ const enabled = canChooseReasoning(profile);
26
+ const mode = select.value;
27
+ select.innerHTML = reasoningModeOptions(mode, enabled, modes);
28
+ select.disabled = !enabled;
29
+ const note = form.querySelector("[data-reasoning-mode-note]");
30
+ if (note) note.hidden = enabled;
31
+ }
32
+
33
+ export function retainedReasoningMode(form, fallback) {
34
+ return form.querySelector("[data-reasoning-mode]")?.value || fallback;
35
+ }
@@ -71,6 +71,14 @@ export function sameConversationMessage(existing, incoming) {
71
71
  return !existing.persistedMessageId || !incoming.persistedMessageId;
72
72
  }
73
73
 
74
+ export function mergeConversationMessage(existing, incoming) {
75
+ return {
76
+ ...existing, ...incoming,
77
+ text: incoming.text || existing.text,
78
+ thinkingText: incoming.thinkingText || existing.thinkingText,
79
+ };
80
+ }
81
+
74
82
  export function removeStreamingPlaceholder(state, requestId) {
75
83
  state.messages = state.messages.filter((message) => {
76
84
  if (message.requestId !== requestId || message.role !== "assistant")
@@ -0,0 +1,58 @@
1
+ /** Persisted ownership has no expiry: uncertain sends require a manual handoff. */
2
+ export function hasValidQueueOwnership(queue) {
3
+ const owner = queue.blockedReleaseOwner;
4
+ if (owner === undefined || owner === null) return true;
5
+ if (queue.blockedByReleaseToken === null) return false;
6
+ if (!owner || typeof owner !== "object" || Array.isArray(owner)) return false;
7
+ if (typeof owner.id !== "string" || !owner.id || owner.id.length > 128) return false;
8
+ return ["editing", "sending", "uncertain"].includes(owner.state);
9
+ }
10
+
11
+ export function canEditBlockedRelease(queue, ownerId) {
12
+ if (!queue.blockedReleaseOwner) return true;
13
+ if (queue.blockedReleaseOwner.id !== ownerId) return false;
14
+ return queue.blockedReleaseOwner.state === "editing";
15
+ }
16
+
17
+ export function canUpdateBlockedRelease(queue, ownerId) {
18
+ return canEditBlockedRelease(queue, ownerId);
19
+ }
20
+
21
+ export function canBindBlockedRelease(queue, ownerId) {
22
+ if (!queue.blockedReleaseOwner) return true;
23
+ if (queue.blockedReleaseOwner.id !== ownerId) return false;
24
+ return ["sending", "uncertain"].includes(queue.blockedReleaseOwner.state);
25
+ }
26
+
27
+ export function createQueueOwnership({ ownerId, readStore, writeStore, getQueue, createToken, projectRelease }) {
28
+ function claimBlockedRelease(scope, releaseToken, { takeover = false } = {}) {
29
+ if (!ownerId) return projectRelease(getQueue(readStore(), scope));
30
+ const store = readStore();
31
+ const queue = getQueue(store, scope);
32
+ if (!queue?.blockedReleaseItem || queue.blockedByReleaseToken !== releaseToken) return null;
33
+ const owner = queue.blockedReleaseOwner;
34
+ if (!takeover && owner && !canEditBlockedRelease(queue, ownerId)) return null;
35
+ if (takeover || !owner) queue.blockedByReleaseToken = createToken();
36
+ queue.blockedReleaseOwner = { id: ownerId, state: "editing" };
37
+ writeStore(store);
38
+ return projectRelease(queue);
39
+ }
40
+
41
+ function changeOwnedPhase(scope, releaseToken, from, to) {
42
+ if (!ownerId) return true;
43
+ const store = readStore();
44
+ const queue = getQueue(store, scope);
45
+ if (queue?.blockedByReleaseToken !== releaseToken) return false;
46
+ if (queue.blockedReleaseOwner?.id !== ownerId) return false;
47
+ if (queue.blockedReleaseOwner.state !== from) return false;
48
+ queue.blockedReleaseOwner.state = to;
49
+ writeStore(store);
50
+ return true;
51
+ }
52
+
53
+ return {
54
+ claimBlockedRelease,
55
+ beginBlockedSend: (scope, token) => changeOwnedPhase(scope, token, "editing", "sending"),
56
+ markBlockedUncertain: (scope, token) => changeOwnedPhase(scope, token, "sending", "uncertain"),
57
+ };
58
+ }
@@ -32,9 +32,14 @@ export interface SessionComposerQueueStorage {
32
32
  export interface ReleasedSessionComposerQueueItem {
33
33
  item: SessionComposerQueueItem;
34
34
  releaseToken: string;
35
+ owner?: { id: string; state: "editing" | "sending" | "uncertain" };
35
36
  }
36
37
 
37
38
  export interface SessionComposerQueue {
39
+ refresh?(): Promise<void>;
40
+ claimBlockedRelease(scope: SessionComposerQueueScope, releaseToken: string, options?: { takeover?: boolean }): ReleasedSessionComposerQueueItem | null;
41
+ beginBlockedSend(scope: SessionComposerQueueScope, releaseToken: string): boolean;
42
+ markBlockedUncertain(scope: SessionComposerQueueScope, releaseToken: string): boolean;
38
43
  enqueue(
39
44
  scope: SessionComposerQueueScope,
40
45
  item: SessionComposerQueueItemInput,
@@ -64,12 +69,19 @@ export interface SessionComposerQueue {
64
69
  ): boolean;
65
70
  }
66
71
 
72
+ type QueueMutation = "claimBlockedRelease" | "beginBlockedSend" | "markBlockedUncertain" | "enqueue" | "updateBlockedRelease" | "releaseForTerminal" | "bindReleasedSuccess" | "rebindBlocked";
73
+ export type RemoteSessionComposerQueue = Omit<SessionComposerQueue, QueueMutation> & {
74
+ [K in QueueMutation]: (...args: Parameters<SessionComposerQueue[K]>) => Promise<ReturnType<SessionComposerQueue[K]>>;
75
+ };
76
+
67
77
  export interface CreateSessionComposerQueueOptions {
78
+ ownerId?: string | null;
68
79
  storage?: SessionComposerQueueStorage;
69
80
  storageKey?: string;
70
81
  }
71
82
 
72
83
  export declare const SESSION_COMPOSER_QUEUE_STORAGE_KEY: string;
84
+ export declare function isPersistedStore(value: unknown): boolean;
73
85
 
74
86
  export declare function createSessionComposerQueue(
75
87
  options?: CreateSessionComposerQueueOptions,
@@ -1,3 +1,5 @@
1
+ import { hasValidQueueOwnership, canUpdateBlockedRelease, canBindBlockedRelease, createQueueOwnership } from "./session-composer-queue-ownership.js";
2
+
1
3
  export const SESSION_COMPOSER_QUEUE_STORAGE_KEY =
2
4
  "abot-web.sessionComposerQueue.v1";
3
5
 
@@ -60,6 +62,7 @@ function isQueueRecord(value) {
60
62
  const blockedReleaseItem = value?.blockedReleaseItem ?? null;
61
63
  return Boolean(
62
64
  isRecord(value) &&
65
+ hasValidQueueOwnership(value) &&
63
66
  isNonEmptyString(value.environmentId) &&
64
67
  isNonEmptyString(value.sessionId) &&
65
68
  (value.blockedByReleaseToken === null ||
@@ -72,7 +75,7 @@ function isQueueRecord(value) {
72
75
  );
73
76
  }
74
77
 
75
- function isPersistedStore(value) {
78
+ export function isPersistedStore(value) {
76
79
  if (
77
80
  !isRecord(value) ||
78
81
  value.version !== STORAGE_VERSION ||
@@ -149,7 +152,8 @@ function createReleaseToken() {
149
152
  }
150
153
 
151
154
  export function createSessionComposerQueue({
152
- storage = globalThis.localStorage,
155
+ storage,
156
+ ownerId = null,
153
157
  storageKey = SESSION_COMPOSER_QUEUE_STORAGE_KEY,
154
158
  } = {}) {
155
159
  if (
@@ -210,9 +214,7 @@ export function createSessionComposerQueue({
210
214
  return list(scopeInput)[0] ?? null;
211
215
  }
212
216
 
213
- function getBlockedRelease(scopeInput) {
214
- const scope = validateScope(scopeInput);
215
- const queue = findQueue(readStore(), scope);
217
+ function projectRelease(queue) {
216
218
  if (
217
219
  !queue ||
218
220
  queue.blockedByReleaseToken === null ||
@@ -223,9 +225,14 @@ export function createSessionComposerQueue({
223
225
  return {
224
226
  releaseToken: queue.blockedByReleaseToken,
225
227
  item: cloneJson(queue.blockedReleaseItem),
228
+ ...(queue.blockedReleaseOwner ? { owner: { ...queue.blockedReleaseOwner } } : {}),
226
229
  };
227
230
  }
228
231
 
232
+ function getBlockedRelease(scopeInput) {
233
+ return projectRelease(findQueue(readStore(), validateScope(scopeInput)));
234
+ }
235
+
229
236
  function updateBlockedRelease(scopeInput, releaseToken, itemInput) {
230
237
  const scope = validateScope(scopeInput);
231
238
  if (!isNonEmptyString(releaseToken)) return false;
@@ -239,6 +246,7 @@ export function createSessionComposerQueue({
239
246
  ) {
240
247
  return false;
241
248
  }
249
+ if (!canUpdateBlockedRelease(queue, ownerId)) return false;
242
250
  queue.blockedReleaseItem = item;
243
251
  writeStore(store);
244
252
  return true;
@@ -261,8 +269,9 @@ export function createSessionComposerQueue({
261
269
  const releaseToken = createReleaseToken();
262
270
  queue.blockedByReleaseToken = releaseToken;
263
271
  queue.blockedReleaseItem = item;
272
+ if (ownerId) queue.blockedReleaseOwner = { id: ownerId, state: "editing" };
264
273
  writeStore(store);
265
- return { item: cloneJson(item), releaseToken };
274
+ return projectRelease(queue);
266
275
  }
267
276
 
268
277
  function bindReleasedSuccess(scopeInput, releaseToken, newRequestId) {
@@ -273,12 +282,14 @@ export function createSessionComposerQueue({
273
282
  const store = readStore();
274
283
  const queue = findQueue(store, scope);
275
284
  if (!queue || queue.blockedByReleaseToken !== releaseToken) return false;
285
+ if (!canBindBlockedRelease(queue, ownerId)) return false;
276
286
 
277
287
  if (queue.items[0]) {
278
288
  queue.items[0].waitForRequestId = newRequestId;
279
289
  }
280
290
  queue.blockedByReleaseToken = null;
281
291
  queue.blockedReleaseItem = null;
292
+ delete queue.blockedReleaseOwner;
282
293
  if (queue.items.length === 0) {
283
294
  store.queues = store.queues.filter((candidate) => candidate !== queue);
284
295
  }
@@ -292,12 +303,16 @@ export function createSessionComposerQueue({
292
303
  const store = readStore();
293
304
  const queue = findQueue(store, scope);
294
305
  if (!queue || queue.blockedByReleaseToken === null) return false;
306
+ // A request found in a snapshot is not proof that it belongs to this release.
307
+ if (queue.blockedReleaseOwner) return false;
308
+ if (queue.blockedReleaseItem?.waitForRequestId === newRequestId) return false;
295
309
 
296
310
  if (queue.items[0]) {
297
311
  queue.items[0].waitForRequestId = newRequestId;
298
312
  }
299
313
  queue.blockedByReleaseToken = null;
300
314
  queue.blockedReleaseItem = null;
315
+ delete queue.blockedReleaseOwner;
301
316
  if (queue.items.length === 0) {
302
317
  store.queues = store.queues.filter((candidate) => candidate !== queue);
303
318
  }
@@ -306,6 +321,10 @@ export function createSessionComposerQueue({
306
321
  }
307
322
 
308
323
  return {
324
+ ...createQueueOwnership({
325
+ ownerId, readStore, writeStore, createToken: createReleaseToken, projectRelease,
326
+ getQueue: (store, scope) => findQueue(store, validateScope(scope)),
327
+ }),
309
328
  enqueue,
310
329
  list,
311
330
  peek,
@@ -8,6 +8,9 @@ export interface WorkspaceRoute {
8
8
  job: string;
9
9
  automation: string;
10
10
  run: string;
11
+ pluginSource?: string;
12
+ pluginRef?: string;
13
+ pluginPath?: string;
11
14
  }
12
15
 
13
16
  export function readWorkspaceRoute(
@@ -39,6 +39,7 @@ export function readWorkspaceRoute(location) {
39
39
  job: routeParameter(parameters, "job"),
40
40
  automation: routeParameter(parameters, "automation"),
41
41
  run: routeParameter(parameters, "run"),
42
+ ...(workspace === "plugins" && parameters.has("pluginSource") ? { pluginSource: routeParameter(parameters, "pluginSource"), pluginRef: routeParameter(parameters, "pluginRef"), pluginPath: routeParameter(parameters, "pluginPath") } : {}),
42
43
  };
43
44
  }
44
45
 
@@ -53,6 +54,9 @@ export function workspaceRouteUrl(route) {
53
54
  parameters.set("automationRun", route.automationRun);
54
55
  else if (workspace === "chat" && route.session)
55
56
  parameters.set("session", route.session);
57
+ if (workspace === "plugins") {
58
+ if (route.tab === "discover") parameters.set("tab", "discover");
59
+ }
56
60
  if (workspace === "config") {
57
61
  if (route.tab) parameters.set("tab", route.tab);
58
62
  }