@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
@@ -0,0 +1,15 @@
1
+ /** Session opens and New conversation share the latest navigation intent. */
2
+ export function beginConversationNavigation(state) {
3
+ const revision = (state.conversationNavigationRevision ?? 0) + 1;
4
+ state.conversationNavigationRevision = revision;
5
+ return () => state.conversationNavigationRevision === revision;
6
+ }
7
+
8
+ /** The selector may name a target whose recovered drafts are not saved yet. */
9
+ export function canNavigateConversation(state) {
10
+ return hasCommittedConversationEnvironment(state);
11
+ }
12
+
13
+ export function hasCommittedConversationEnvironment(state) {
14
+ return state.environmentChangePending !== true;
15
+ }
@@ -20,4 +20,5 @@ export declare function createConversationReadStateController(
20
20
  options: ConversationReadStateControllerOptions,
21
21
  ): {
22
22
  markCurrentSessionReadSoon(): void;
23
+ markDisplayedMessagesReadSoon(messages: ConversationSessionState["messages"]): void;
23
24
  };
@@ -66,14 +66,14 @@ export function createConversationReadStateController({
66
66
  }
67
67
  }
68
68
 
69
- function markCurrentSessionReadSoon() {
69
+ function markDisplayedMessagesReadSoon(messages) {
70
70
  const scope = {
71
71
  environmentId: selectedEnvironmentId(),
72
72
  sessionId: state.currentSessionId,
73
73
  viewVersion: state.sessionViewVersion,
74
74
  };
75
75
  if (!canMarkConversationRead(scope)) return;
76
- const boundary = displayedAssistantReadBoundary(state.messages);
76
+ const boundary = displayedAssistantReadBoundary(messages);
77
77
  if (!boundary) return;
78
78
  scheduleTask(() => {
79
79
  if (!canMarkConversationRead(scope)) return;
@@ -81,5 +81,9 @@ export function createConversationReadStateController({
81
81
  });
82
82
  }
83
83
 
84
- return { markCurrentSessionReadSoon };
84
+ function markCurrentSessionReadSoon() {
85
+ markDisplayedMessagesReadSoon(state.messages);
86
+ }
87
+
88
+ return { markCurrentSessionReadSoon, markDisplayedMessagesReadSoon };
85
89
  }
@@ -0,0 +1,91 @@
1
+ import { isStoppedRequest, restoreStoppedResponses } from "../lib/request-stop-state.js";
2
+ import { isApprovalPresentation, rememberRequestLifecycle } from "../lib/request-lifecycle-view.js";
3
+ import { textOf } from "../lib/text-format.js";
4
+ import { canRestoreSnapshotQueue } from "./history-pagination.js";
5
+
6
+ function isBindableResponse(message) {
7
+ if (message.role !== "assistant" || !message.requestId) return false;
8
+ return !isApprovalPresentation(message);
9
+ }
10
+ function isStreamingRequest(request) {
11
+ if (!request.requestId) return false;
12
+ return request.status === "streaming";
13
+ }
14
+ function isQueuedTerminalRequest(request, queued) {
15
+ if (textOf(request.requestId) !== queued?.waitForRequestId) return false;
16
+ return request.status === "completed" || request.status === "failed";
17
+ }
18
+ function mergeRefreshedRequests(previous, fresh) {
19
+ // A latest-page fetch includes every active request. Keep metadata for the
20
+ // displayed historical page, but never revive an older active projection.
21
+ const requests = new Map(previous
22
+ .filter((request) => !isStreamingRequest(request) && request.status !== "awaiting_approval")
23
+ .map((request) => [request.requestId, request]));
24
+ for (const request of fresh) requests.set(request.requestId, request);
25
+ return [...requests.values()];
26
+ }
27
+ function requestsForEventRestoration(requests, streamingRequestIds, appendEvents) {
28
+ if (!appendEvents) return requests;
29
+ // Existing live rows already contain received tokens. Resume their events only after lastSeq.
30
+ return requests.map((request) => streamingRequestIds.has(request.requestId) ? { ...request, events: [] } : request);
31
+ }
32
+
33
+ /** Shared snapshot lifecycle restoration; the caller owns the visible history window. */
34
+ export function createConversationRequestHydration({
35
+ state, client, selectedEnvironmentId, sessionQueue, applyConversationChrome, renderSessions,
36
+ updateComposerSendState, reportQueueFailure, activeAssistantForRequest, restoreSessionEventState,
37
+ subscribeSession, subscribeRequest, replayRequestEvents, resumeRequest, recoverBlockedQueue, drainQueuedMessage, renderMessages,
38
+ }) {
39
+ function isCurrentHydration(scope, viewVersion) {
40
+ if (scope.environmentId !== selectedEnvironmentId()) return false;
41
+ if (scope.sessionId !== state.currentSessionId) return false;
42
+ return viewVersion === state.sessionViewVersion;
43
+ }
44
+ async function restore(requests, { appendEvents = false } = {}) {
45
+ const scope = { environmentId: selectedEnvironmentId(), sessionId: state.currentSessionId };
46
+ const viewVersion = state.sessionViewVersion;
47
+ await sessionQueue.refresh?.();
48
+ if (!isCurrentHydration(scope, viewVersion)) return false;
49
+ const waitingRequestId = sessionQueue.peek(scope)?.waitForRequestId;
50
+ if (!canRestoreSnapshotQueue({ requests }, waitingRequestId)) {
51
+ const snapshot = await client.loadSession(scope.sessionId, scope.environmentId, { waitingRequestId });
52
+ if (!isCurrentHydration(scope, viewVersion)) return false;
53
+ requests = mergeRefreshedRequests(requests, snapshot.requests || []);
54
+ }
55
+ for (const message of state.messages) {
56
+ if (!isBindableResponse(message)) continue;
57
+ state.requestMessages.set(message.requestId, message.id);
58
+ }
59
+ for (const request of requests) rememberRequestLifecycle(state, request.lifecycle);
60
+ applyConversationChrome();
61
+ renderSessions();
62
+ const streamingRequestIds = new Set(requests
63
+ .filter(isStreamingRequest)
64
+ .map((request) => textOf(request.requestId)));
65
+ state.activeRequestId = [...streamingRequestIds][0] || "";
66
+ updateComposerSendState();
67
+ for (const requestId of streamingRequestIds) activeAssistantForRequest(requestId);
68
+ restoreStoppedResponses(state.messages, requests);
69
+ restoreSessionEventState(requestsForEventRestoration(requests, streamingRequestIds, appendEvents), streamingRequestIds, appendEvents);
70
+ for (const requestId of streamingRequestIds) {
71
+ subscribeRequest(requestId);
72
+ await replayRequestEvents(requestId, viewVersion);
73
+ if (!isCurrentHydration(scope, viewVersion)) return false;
74
+ resumeRequest(requestId);
75
+ }
76
+ if (state.activeRequestId) { renderMessages(); return true; }
77
+ await recoverBlockedQueue(scope);
78
+ if (!isCurrentHydration(scope, viewVersion)) return false;
79
+ const queued = sessionQueue.peek(scope);
80
+ const terminal = requests.find((request) => isQueuedTerminalRequest(request, queued));
81
+ if (terminal) await drainQueuedMessage({ ...scope, terminalRequestId: terminal.requestId, cancelled: isStoppedRequest(terminal) });
82
+ if (!isCurrentHydration(scope, viewVersion)) return false;
83
+ renderMessages();
84
+ return true;
85
+ }
86
+ async function rehydrate(requests) {
87
+ subscribeSession(state.currentSessionId);
88
+ return restore(requests, { appendEvents: true });
89
+ }
90
+ return { restore, rehydrate };
91
+ }
@@ -47,10 +47,11 @@ export interface ConversationSessionClient {
47
47
  readThroughMessageId: number | string | null;
48
48
  readThroughRequestId?: string;
49
49
  }): Promise<Record<string, unknown>>;
50
- listSessions(environmentId: string): Promise<Record<string, unknown>>;
50
+ listSessions(environmentId: string, page?: Record<string, unknown>): Promise<Record<string, unknown>>;
51
51
  loadSession(
52
52
  sessionId: string,
53
53
  environmentId: string,
54
+ page?: Record<string, unknown>,
54
55
  ): Promise<Record<string, unknown>>;
55
56
  fetchRequestEvents(options: {
56
57
  requestId: string;
@@ -85,7 +86,6 @@ export interface ConversationSessionControllerOptions {
85
86
  };
86
87
  conversationView: { reset(): void };
87
88
  selectedEnvironmentId(): string;
88
- clearPendingAttachments(): void;
89
89
  applyConversationChrome(): void;
90
90
  applyModelSelection(): void;
91
91
  renderSessions(): void;
@@ -125,6 +125,7 @@ export declare function normalizeConversationMessage(
125
125
  export declare function createConversationSessionController(
126
126
  options: ConversationSessionControllerOptions,
127
127
  ): {
128
+ history: { load(direction?: "older" | "newer"): Promise<void>; latest(): Promise<void>; hasNewer(): boolean };
128
129
  activateRequestForScope(
129
130
  scope: { environmentId: string; sessionId: string },
130
131
  requestId: string,
@@ -135,7 +136,7 @@ export declare function createConversationSessionController(
135
136
  text: string;
136
137
  attachments: unknown[];
137
138
  requestId?: string;
138
- }): void;
139
+ }): () => void;
139
140
  appendRequestError(error: unknown): void;
140
141
  applySessionReadState(sessionId: string, readState: unknown): void;
141
142
  applySessionTitleUpdate(sessionId: string, title: unknown): void;
@@ -150,12 +151,16 @@ export declare function createConversationSessionController(
150
151
  invalidateEnvironmentLoads(): void;
151
152
  loadSessions(): Promise<ConversationSession[]>;
152
153
  markCurrentSessionReadSoon(): void;
154
+ rehydrateRequests(requests: Record<string, unknown>[]): Promise<boolean>;
153
155
  normalizeMessage(raw: unknown): ConversationMessage;
154
156
  openSession(
155
157
  sessionId: string,
156
158
  options?: {
157
- isRouteCurrent(): boolean;
158
- commitRouteNavigation(): boolean;
159
+ isRouteCurrent?(): boolean;
160
+ commitRouteNavigation?(): boolean;
161
+ snapshot?: Record<string, unknown>;
162
+ page?: Record<string, unknown>;
163
+ preserveCurrentWindow?: boolean;
159
164
  },
160
165
  ): Promise<void>;
161
166
  requestBelongsToCurrentView(requestId: string): boolean;
@@ -1,28 +1,28 @@
1
+ import { beginConversationNavigation, canNavigateConversation } from "./conversation-navigation-intent.js";
1
2
  import {
2
3
  captureContextReplayScope,
3
4
  bindContextReplayEvents,
4
5
  isContextReplayCurrent,
5
6
  } from "../lib/context-window-replay.js";
6
7
  import { synchronizeContextRequestLifecycle } from "../lib/context-window-state.js";
7
- import { mergeSessionListReadState } from "../lib/session-read-state.js";
8
+ import { createSessionListPagination } from "./session-list-pagination.js";
9
+ import { createHistoryPagination, canRestoreSnapshotQueue } from "./history-pagination.js";
8
10
  import { createConversationReadStateController } from "./conversation-read-state-controller.js";
11
+ import { createConversationRequestHydration } from "./conversation-request-hydration.js";
9
12
  import { normalizeScheduleReference } from "../lib/schedule-message.js";
10
- import { createWebSessionId, escapeHtml, textOf } from "../lib/text-format.js";
13
+ import { createWebSessionId, textOf } from "../lib/text-format.js";
11
14
  import { insertRequestUserMessageBeforeAssistant } from "../ui-behavior.js";
12
15
  import { normalizeRealtimeMessage } from "../lib/realtime-message.js";
13
16
  import {
14
17
  sparkProposalId,
15
18
  sparkHandoffAvailable,
16
19
  } from "../lib/spark-proposal-message.js";
17
- import {
18
- isStoppedRequest,
19
- restoreStoppedResponses,
20
- } from "../lib/request-stop-state.js";
21
20
  import {
22
21
  isApprovalPresentation,
23
22
  requestLifecycles,
24
23
  rememberRequestLifecycle,
25
24
  sameConversationMessage,
25
+ mergeConversationMessage,
26
26
  } from "../lib/request-lifecycle-view.js";
27
27
 
28
28
  export function normalizeConversationMessage(raw, fallbackIndex = 0) {
@@ -59,7 +59,6 @@ export function createConversationSessionController({
59
59
  sessionQueue,
60
60
  conversationView,
61
61
  selectedEnvironmentId,
62
- clearPendingAttachments,
63
62
  applyConversationChrome,
64
63
  applyModelSelection,
65
64
  renderSessions,
@@ -82,13 +81,21 @@ export function createConversationSessionController({
82
81
  onSessionCreated = () => {},
83
82
  }) {
84
83
  let environmentLoadRevision = 0;
85
- let sessionListRevision = 0;
84
+ const listPagination = createSessionListPagination({ state, dom, client, sessions, selectedEnvironmentId, renderSessions, onSessionListState });
85
+ const history = createHistoryPagination({ state, dom, client, selectedEnvironmentId,
86
+ normalizeMessage: normalizeConversationMessage, renderMessages, conversationView, applyReadState: sessions.applyReadState,
87
+ onRequests: (requests) => restoreSessionEventState(requests, new Set(), true),
88
+ loadLatest: () => openSession(state.currentSessionId, { preserveCurrentWindow: true }),
89
+ onNewerPage: (messages) => markDisplayedMessagesReadSoon(messages),
90
+ });
86
91
  let sessionRestoreRevision = 0;
87
92
 
88
93
  function invalidateEnvironmentLoads() {
89
94
  environmentLoadRevision += 1;
90
- sessionListRevision += 1;
95
+ listPagination.invalidate();
96
+ history.reset();
91
97
  sessionRestoreRevision += 1;
98
+ beginConversationNavigation(state);
92
99
  state.sessions = [];
93
100
  onSessionListState({ status: "loading", sessions: [] });
94
101
  renderSessions();
@@ -98,7 +105,7 @@ export function createConversationSessionController({
98
105
  return normalizeConversationMessage(raw, state.messages.length);
99
106
  }
100
107
 
101
- const { markCurrentSessionReadSoon } = createConversationReadStateController({
108
+ const { markCurrentSessionReadSoon, markDisplayedMessagesReadSoon } = createConversationReadStateController({
102
109
  state,
103
110
  client,
104
111
  selectedEnvironmentId,
@@ -107,6 +114,11 @@ export function createConversationSessionController({
107
114
  isConversationVisible,
108
115
  scheduleTask,
109
116
  });
117
+ const requestHydration = createConversationRequestHydration({
118
+ state, client, selectedEnvironmentId, sessionQueue, applyConversationChrome, renderSessions,
119
+ updateComposerSendState, reportQueueFailure, activeAssistantForRequest, restoreSessionEventState,
120
+ subscribeSession, subscribeRequest, replayRequestEvents, resumeRequest, recoverBlockedQueue, drainQueuedMessage, renderMessages,
121
+ });
110
122
 
111
123
  function addOrMergeMessage(message) {
112
124
  const id = textOf(message.id);
@@ -115,13 +127,7 @@ export function createConversationSessionController({
115
127
  sameConversationMessage(item, message),
116
128
  );
117
129
  if (existingIndex >= 0) {
118
- state.messages[existingIndex] = {
119
- ...state.messages[existingIndex],
120
- ...message,
121
- text: message.text || state.messages[existingIndex].text,
122
- thinkingText:
123
- message.thinkingText || state.messages[existingIndex].thinkingText,
124
- };
130
+ state.messages[existingIndex] = mergeConversationMessage(state.messages[existingIndex], message);
125
131
  } else {
126
132
  state.messages.push(message);
127
133
  }
@@ -156,11 +162,11 @@ export function createConversationSessionController({
156
162
  }
157
163
 
158
164
  function resetLiveRequestView() {
165
+ history.reset();
159
166
  state.events = [];
160
167
  state.taskProgressByRequest.clear();
161
168
  state.contextWindowByRequest.clear();
162
169
  state.activeRequestId = "";
163
- state.composerSending = false;
164
170
  conversationView.reset();
165
171
  state.submittedToolApprovalIds.clear();
166
172
  state.requestMessages.clear();
@@ -172,9 +178,10 @@ export function createConversationSessionController({
172
178
  }
173
179
 
174
180
  function clearCurrentSessionView() {
181
+ sessionRestoreRevision += 1;
182
+ beginConversationNavigation(state);
175
183
  state.currentSessionId = "";
176
184
  state.messages = [];
177
- clearPendingAttachments();
178
185
  resetLiveRequestView();
179
186
  dom.sessionTitle.textContent = "New conversation";
180
187
  applyConversationChrome();
@@ -183,7 +190,6 @@ export function createConversationSessionController({
183
190
 
184
191
  function clearSessionMessagesView() {
185
192
  state.messages = [];
186
- clearPendingAttachments();
187
193
  resetLiveRequestView();
188
194
  applyConversationChrome();
189
195
  renderMessages();
@@ -253,12 +259,16 @@ export function createConversationSessionController({
253
259
  function restoreSessionEventState(
254
260
  requests = [],
255
261
  hydrateRequestIds = new Set(),
262
+ append = false,
256
263
  ) {
257
- state.events = [];
258
- state.taskProgressByRequest.clear();
259
- state.contextWindowByRequest.clear();
264
+ if (!append) {
265
+ state.events = [];
266
+ state.taskProgressByRequest.clear();
267
+ state.contextWindowByRequest.clear();
268
+ }
260
269
  const requestEvents = [];
261
270
  for (const request of requests) {
271
+ rememberRequestLifecycle(state, request.lifecycle);
262
272
  if (!Array.isArray(request.events)) continue;
263
273
  const replayScope = captureContextReplayScope(
264
274
  state,
@@ -372,46 +382,7 @@ export function createConversationSessionController({
372
382
  handleRealtimeMessage(event);
373
383
  }
374
384
 
375
- async function loadSessions() {
376
- const environmentRevision = environmentLoadRevision;
377
- const requestRevision = ++sessionListRevision;
378
- const environmentId = selectedEnvironmentId();
379
- onSessionListState({ status: "loading", sessions: state.sessions });
380
- try {
381
- const payload = await client.listSessions(environmentId);
382
- if (
383
- environmentRevision !== environmentLoadRevision ||
384
- requestRevision !== sessionListRevision ||
385
- environmentId !== selectedEnvironmentId()
386
- ) {
387
- return [];
388
- }
389
- state.sessions = mergeSessionListReadState(
390
- Array.isArray(payload.sessions) ? payload.sessions : [],
391
- state.sessions,
392
- );
393
- onSessionListState({ status: "ready", sessions: state.sessions });
394
- renderSessions();
395
- return state.sessions;
396
- } catch (error) {
397
- if (
398
- environmentRevision !== environmentLoadRevision ||
399
- requestRevision !== sessionListRevision ||
400
- environmentId !== selectedEnvironmentId()
401
- ) {
402
- return [];
403
- }
404
- onSessionListState({
405
- status: "error",
406
- sessions: state.sessions,
407
- error: error instanceof Error ? error.message : String(error),
408
- });
409
- dom.sessionsList.innerHTML = `<div class="empty-state error-text">${escapeHtml(
410
- error instanceof Error ? error.message : String(error),
411
- )}</div>`;
412
- return [];
413
- }
414
- }
385
+ const loadSessions = () => listPagination.load();
415
386
 
416
387
  async function restoreLastSession() {
417
388
  const environmentRevision = environmentLoadRevision;
@@ -422,47 +393,70 @@ export function createConversationSessionController({
422
393
  environmentRevision !== environmentLoadRevision ||
423
394
  restoreRevision !== sessionRestoreRevision ||
424
395
  environmentId !== selectedEnvironmentId() ||
425
- availableSessions.length === 0 ||
426
396
  state.currentSessionId
427
397
  ) {
428
398
  return;
429
399
  }
430
400
  const savedSessionId = preferences.sessionIdForEnvironment(environmentId);
431
- const targetSession =
432
- availableSessions.find((session) => session.id === savedSessionId) ||
433
- availableSessions[0];
434
- if (targetSession?.id) await openSession(targetSession.id);
401
+ const targetId = savedSessionId || availableSessions[0]?.id;
402
+ if (!targetId) return;
403
+ try { await openSession(targetId); }
404
+ catch (error) {
405
+ if (error.code !== "session_not_found") throw error;
406
+ if (availableSessions[0]?.id && availableSessions[0].id !== targetId) await openSession(availableSessions[0].id);
407
+ }
435
408
  }
436
409
 
437
410
  async function openSession(
438
411
  sessionId,
439
- { isRouteCurrent, commitRouteNavigation } = {},
412
+ { isRouteCurrent, commitRouteNavigation, snapshot, page, preserveCurrentWindow = false } = {},
440
413
  ) {
414
+ if (!canNavigateConversation(state)) {
415
+ setMessageStatus("Wait for the environment change to finish before opening a conversation.");
416
+ return false;
417
+ }
418
+ sessionRestoreRevision += 1;
419
+ const isCurrentOpen = beginConversationNavigation(state);
441
420
  const routeOwned = typeof commitRouteNavigation === "function";
421
+ const loadBeforeReset = routeOwned || preserveCurrentWindow;
442
422
  let payload;
443
- if (routeOwned) {
423
+ const pageOptions = { ...page, waitingRequestId: sessionQueue.peek({ environmentId: selectedEnvironmentId(), sessionId })?.waitForRequestId };
424
+ let prefetched = canRestoreSnapshotQueue(snapshot, pageOptions.waitingRequestId) ? snapshot : undefined;
425
+ if (loadBeforeReset) {
444
426
  const environmentId = selectedEnvironmentId();
445
427
  const viewVersion = state.sessionViewVersion;
446
428
  const currentSessionId = state.currentSessionId;
447
- payload = await client.loadSession(sessionId, environmentId);
448
- if (environmentId !== selectedEnvironmentId()) return;
449
- if (viewVersion !== state.sessionViewVersion) return;
450
- if (currentSessionId !== state.currentSessionId) return;
451
- if (isRouteCurrent?.() !== true) return;
429
+ payload = prefetched ?? await client.loadSession(sessionId, environmentId, pageOptions);
430
+ if (!isCurrentOpen()) return false;
431
+ if (environmentId !== selectedEnvironmentId()) return false;
432
+ if (viewVersion !== state.sessionViewVersion) return false;
433
+ if (currentSessionId !== state.currentSessionId) return false;
434
+ if (routeOwned && isRouteCurrent?.() !== true) return false;
452
435
  }
453
- if (
454
- state.currentSessionId &&
455
- state.currentSessionId !== sessionId &&
456
- !suspendQueueRecovery()
457
- ) {
458
- return;
436
+ if (state.currentSessionId) {
437
+ const previousSessionId = state.currentSessionId;
438
+ const environmentId = selectedEnvironmentId();
439
+ const canSuspendRecovery = () => {
440
+ if (!canNavigateConversation(state)) return false;
441
+ if (!isCurrentOpen()) return false;
442
+ if (selectedEnvironmentId() !== environmentId) return false;
443
+ if (state.currentSessionId !== previousSessionId) return false;
444
+ if (routeOwned && isRouteCurrent?.() !== true) return false;
445
+ return true;
446
+ };
447
+ let prepared = suspendQueueRecovery(canSuspendRecovery);
448
+ if (typeof prepared?.then === "function") {
449
+ prepared = await prepared;
450
+ payload = undefined;
451
+ prefetched = undefined;
452
+ }
453
+ if (!prepared || !canSuspendRecovery()) return false;
459
454
  }
460
- if (routeOwned && commitRouteNavigation() !== true) return;
455
+ if (routeOwned && commitRouteNavigation() !== true) return false;
461
456
  const viewVersion = state.sessionViewVersion + 1;
462
457
  state.currentSessionId = sessionId;
463
458
  preferences.saveSessionIdForEnvironment(selectedEnvironmentId(), sessionId);
464
459
  state.messages = [];
465
- clearPendingAttachments();
466
460
  resetLiveRequestView();
467
461
  state.sessionViewVersion = viewVersion;
468
462
  sessions.setCurrentTitle(
@@ -474,96 +468,28 @@ export function createConversationSessionController({
474
468
  renderMessages();
475
469
  subscribeSession(sessionId);
476
470
 
477
- if (!routeOwned) {
478
- payload = await client.loadSession(sessionId, selectedEnvironmentId());
471
+ if (!payload) {
472
+ payload = prefetched ?? await client.loadSession(sessionId, selectedEnvironmentId(), pageOptions);
479
473
  }
480
474
  if (
475
+ !isCurrentOpen() ||
481
476
  state.currentSessionId !== sessionId ||
482
477
  state.sessionViewVersion !== viewVersion
483
478
  ) {
484
- return;
479
+ return false;
485
480
  }
481
+ history.adopt(payload);
486
482
  const rawMessages = Array.isArray(payload.messages) ? payload.messages : [];
487
- const scope = { environmentId: selectedEnvironmentId(), sessionId };
488
483
  state.messages = rawMessages.map((message, index) =>
489
484
  normalizeConversationMessage(message, index),
490
485
  );
486
+ const displayedPage = [...state.messages];
491
487
  sessions.applyTitle(sessionId, payload.title);
492
488
  sessions.applyReadState(sessionId, payload.readState);
493
- for (const message of state.messages) {
494
- if (
495
- message.role === "assistant" &&
496
- message.requestId &&
497
- !isApprovalPresentation(message)
498
- ) {
499
- state.requestMessages.set(message.requestId, message.id);
500
- }
501
- }
502
489
  const requests = Array.isArray(payload.requests) ? payload.requests : [];
503
- for (const request of requests)
504
- rememberRequestLifecycle(state, request.lifecycle);
505
- applyConversationChrome();
506
- renderSessions();
507
- const streamingRequestIds = new Set(
508
- requests
509
- .filter(
510
- (request) => request.status === "streaming" && request.requestId,
511
- )
512
- .map((request) => textOf(request.requestId)),
513
- );
514
- if (streamingRequestIds.size === 1) {
515
- const [streamingRequestId] = streamingRequestIds;
516
- try {
517
- sessionQueue.rebindBlocked(scope, streamingRequestId);
518
- } catch (error) {
519
- reportQueueFailure(
520
- scope,
521
- `The active request was restored, but the remaining Send next queue is paused: ${
522
- error instanceof Error ? error.message : String(error)
523
- }`,
524
- );
525
- }
526
- }
527
- state.activeRequestId = [...streamingRequestIds][0] || "";
528
- updateComposerSendState();
529
- for (const requestId of streamingRequestIds) {
530
- activeAssistantForRequest(requestId);
531
- }
532
- restoreStoppedResponses(state.messages, requests);
533
- restoreSessionEventState(requests, streamingRequestIds);
534
- for (const request of requests) {
535
- if (request.status === "streaming" && request.requestId) {
536
- subscribeRequest(request.requestId);
537
- await replayRequestEvents(request.requestId, viewVersion);
538
- if (
539
- state.currentSessionId !== sessionId ||
540
- state.sessionViewVersion !== viewVersion
541
- ) {
542
- return;
543
- }
544
- resumeRequest(request.requestId);
545
- }
546
- }
547
- if (!state.activeRequestId) {
548
- recoverBlockedQueue(scope);
549
- const queued = sessionQueue.peek(scope);
550
- const terminal = queued
551
- ? requests.find(
552
- (request) =>
553
- textOf(request.requestId) === queued.waitForRequestId &&
554
- (request.status === "completed" || request.status === "failed"),
555
- )
556
- : null;
557
- if (terminal) {
558
- await drainQueuedMessage({
559
- ...scope,
560
- terminalRequestId: terminal.requestId,
561
- cancelled: isStoppedRequest(terminal),
562
- });
563
- }
564
- }
565
- renderMessages();
566
- markCurrentSessionReadSoon();
490
+ if (!await requestHydration.restore(requests)) return false;
491
+ markDisplayedMessagesReadSoon(displayedPage);
492
+ return true;
567
493
  }
568
494
 
569
495
  function ensureSession() {
@@ -580,7 +506,7 @@ export function createConversationSessionController({
580
506
  }
581
507
 
582
508
  function appendLocalUserMessage({ text, attachments, requestId = "" }) {
583
- state.messages.push({
509
+ const message = {
584
510
  id: `user-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
585
511
  role: "user",
586
512
  text,
@@ -588,8 +514,15 @@ export function createConversationSessionController({
588
514
  requestId,
589
515
  streaming: false,
590
516
  attachments,
591
- });
517
+ };
518
+ state.messages.push(message);
592
519
  renderMessages();
520
+ return () => {
521
+ const index = state.messages.indexOf(message);
522
+ if (index < 0) return;
523
+ state.messages.splice(index, 1);
524
+ renderMessages();
525
+ };
593
526
  }
594
527
 
595
528
  function insertSteerMessage({ steerId, requestId, text }) {
@@ -628,6 +561,7 @@ export function createConversationSessionController({
628
561
  }
629
562
 
630
563
  return {
564
+ history,
631
565
  activateRequestForScope,
632
566
  activeAssistantForRequest,
633
567
  addOrMergeMessage,
@@ -642,6 +576,7 @@ export function createConversationSessionController({
642
576
  invalidateEnvironmentLoads,
643
577
  loadSessions,
644
578
  markCurrentSessionReadSoon,
579
+ rehydrateRequests: requestHydration.rehydrate,
645
580
  normalizeMessage,
646
581
  openSession,
647
582
  requestBelongsToCurrentView,
@@ -0,0 +1,27 @@
1
+ import { canNavigateConversation } from "./conversation-navigation-intent.js";
2
+
3
+ /** Navigation commits only after the recovered draft is saved for the same view. */
4
+ export function createConversationWorkspaceActivation({ state, shell, composerQueue, selectedEnvironmentId }) {
5
+ return async () => {
6
+ if (!canNavigateConversation(state)) {
7
+ shell.showToast?.("Wait for the environment change to finish before opening a conversation.", "neutral");
8
+ return false;
9
+ }
10
+ const environment = selectedEnvironmentId();
11
+ const session = state.currentSessionId;
12
+ const version = state.sessionViewVersion;
13
+ const navigationRevision = shell.navigationRevision?.();
14
+ const recovery = await composerQueue.prepareRecoveryForNavigation();
15
+ if (!recovery || recovery.canCommit?.() === false) return false;
16
+ if (!canNavigateConversation(state)) return false;
17
+ const hasCurrentWorkspaceNavigation = navigationRevision === shell.navigationRevision?.();
18
+ if (!hasCurrentWorkspaceNavigation) return false;
19
+ if (environment !== selectedEnvironmentId()) return false;
20
+ if (session !== state.currentSessionId) return false;
21
+ if (version !== state.sessionViewVersion) return false;
22
+ const activate = shell.prepareWorkspaceActivation("chat", { focus: false });
23
+ if (!activate) return false;
24
+ recovery();
25
+ return activate() !== false;
26
+ };
27
+ }