@abot-ai/runtime 1.9.0 → 2.0.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 (506) hide show
  1. package/README.md +5 -1
  2. package/dist/scripts/add-runtime-model.js +11 -5
  3. package/dist/scripts/init-runtime.js +15 -10
  4. package/dist/scripts/runtime-model-addition.js +6 -1
  5. package/dist/scripts/runtime-setup-command-options.d.ts +11 -0
  6. package/dist/scripts/runtime-setup-command-options.js +41 -0
  7. package/dist/scripts/runtime-setup-files.d.ts +3 -2
  8. package/dist/scripts/runtime-setup-files.js +19 -4
  9. package/dist/scripts/runtime-setup-model-options.d.ts +8 -0
  10. package/dist/scripts/runtime-setup-model-options.js +40 -0
  11. package/dist/scripts/runtime-setup-presentation.js +2 -2
  12. package/dist/scripts/runtime-setup-provider-options.d.ts +4 -0
  13. package/dist/scripts/runtime-setup-provider-options.js +20 -0
  14. package/dist/src/model-gateway/client/contracts.d.ts +3 -0
  15. package/dist/src/model-gateway/client/input-token-count.js +36 -16
  16. package/dist/src/model-gateway/client/message-projection.d.ts +2 -0
  17. package/dist/src/model-gateway/client/message-projection.js +1 -0
  18. package/dist/src/model-gateway/client/options.js +1 -1
  19. package/dist/src/model-gateway/client/raw.js +1 -0
  20. package/dist/src/model-gateway/index.d.ts +1 -1
  21. package/dist/src/model-gateway/observability/input-token-count-diagnostics.d.ts +26 -0
  22. package/dist/src/model-gateway/observability/input-token-count-diagnostics.js +178 -0
  23. package/dist/src/model-gateway/policy/invocation-policy.d.ts +1 -3
  24. package/dist/src/model-gateway/policy/invocation-policy.js +3 -30
  25. package/dist/src/model-gateway/policy/reasoning-mode-budget.d.ts +5 -0
  26. package/dist/src/model-gateway/policy/reasoning-mode-budget.js +13 -0
  27. package/dist/src/model-gateway/policy/reasoning-policy.d.ts +10 -0
  28. package/dist/src/model-gateway/policy/reasoning-policy.js +124 -0
  29. package/dist/src/model-gateway/protocol/openai-embedding-response.d.ts +1 -0
  30. package/dist/src/model-gateway/protocol/openai-embedding-response.js +28 -0
  31. package/dist/src/model-gateway/protocol/sse-data.d.ts +9 -0
  32. package/dist/src/model-gateway/protocol/sse-data.js +67 -0
  33. package/dist/src/model-gateway/providers/envelope-budget.js +10 -1
  34. package/dist/src/model-gateway/providers/llamacpp/adapter.d.ts +2 -0
  35. package/dist/src/model-gateway/providers/llamacpp/adapter.js +79 -0
  36. package/dist/src/model-gateway/providers/llamacpp/connection.d.ts +9 -0
  37. package/dist/src/model-gateway/providers/llamacpp/connection.js +73 -0
  38. package/dist/src/model-gateway/providers/llamacpp/diagnostics.d.ts +2 -0
  39. package/dist/src/model-gateway/providers/llamacpp/diagnostics.js +17 -0
  40. package/dist/src/model-gateway/providers/llamacpp/embeddings.d.ts +2 -0
  41. package/dist/src/model-gateway/providers/llamacpp/embeddings.js +56 -0
  42. package/dist/src/model-gateway/providers/llamacpp/input-token-count.d.ts +3 -0
  43. package/dist/src/model-gateway/providers/llamacpp/input-token-count.js +59 -0
  44. package/dist/src/model-gateway/providers/llamacpp/message-projection.d.ts +2 -0
  45. package/dist/src/model-gateway/providers/llamacpp/message-projection.js +33 -0
  46. package/dist/src/model-gateway/providers/llamacpp/payload.d.ts +2 -0
  47. package/dist/src/model-gateway/providers/llamacpp/payload.js +44 -0
  48. package/dist/src/model-gateway/providers/llamacpp/response-lifetime.d.ts +1 -0
  49. package/dist/src/model-gateway/providers/llamacpp/response-lifetime.js +56 -0
  50. package/dist/src/model-gateway/providers/llamacpp/schema-format.d.ts +2 -0
  51. package/dist/src/model-gateway/providers/llamacpp/schema-format.js +29 -0
  52. package/dist/src/model-gateway/providers/llamacpp/settings.d.ts +9 -0
  53. package/dist/src/model-gateway/providers/llamacpp/settings.js +25 -0
  54. package/dist/src/model-gateway/providers/llamacpp/stream-normalizer.d.ts +10 -0
  55. package/dist/src/model-gateway/providers/llamacpp/stream-normalizer.js +85 -0
  56. package/dist/src/model-gateway/providers/llamacpp/stream.d.ts +9 -0
  57. package/dist/src/model-gateway/providers/llamacpp/stream.js +33 -0
  58. package/dist/src/model-gateway/providers/openai/embeddings.js +2 -29
  59. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +1 -9
  60. package/dist/src/model-gateway/providers/openai/sse-data.js +1 -67
  61. package/dist/src/model-gateway/providers/registry.js +2 -0
  62. package/dist/src/model-gateway/server/input-token-count-handler.js +10 -1
  63. package/dist/src/model-gateway/types.d.ts +11 -1
  64. package/dist/src/runtime/adapters/long-term-memory/onboarding-provider-availability.d.ts +4 -0
  65. package/dist/src/runtime/adapters/long-term-memory/onboarding-provider-availability.js +11 -0
  66. package/dist/src/runtime/adapters/long-term-memory/onboarding-service.js +28 -1
  67. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.d.ts +1 -0
  68. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.js +6 -1
  69. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/contracts.d.ts +1 -0
  70. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.d.ts +1 -0
  71. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +2 -0
  72. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.d.ts +1 -0
  73. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.js +2 -0
  74. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.d.ts +1 -0
  75. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.js +1 -0
  76. package/dist/src/runtime/adapters/registered-tool-worker-capabilities.js +1 -0
  77. package/dist/src/runtime/adapters/scheduler-runtime.js +2 -0
  78. package/dist/src/runtime/automations/agent-step-executor.js +1 -0
  79. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  80. package/dist/src/runtime/automations/catalog.js +2 -0
  81. package/dist/src/runtime/automations/definition-contracts.d.ts +2 -0
  82. package/dist/src/runtime/automations/definition-input.js +3 -1
  83. package/dist/src/runtime/automations/draft-mutations.js +5 -1
  84. package/dist/src/runtime/automations/model-dependency-projection.d.ts +3 -1
  85. package/dist/src/runtime/automations/model-dependency-projection.js +4 -2
  86. package/dist/src/runtime/automations/publication-validation.js +7 -0
  87. package/dist/src/runtime/automations/saved-agent-management.js +1 -0
  88. package/dist/src/runtime/automations/service.d.ts +3 -0
  89. package/dist/src/runtime/capabilities/automation-builder/payload-schema.js +7 -5
  90. package/dist/src/runtime/capabilities/automations/authoring-catalog.d.ts +9 -0
  91. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -0
  92. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +3 -0
  93. package/dist/src/runtime/capabilities/automations/tool-contract.js +3 -2
  94. package/dist/src/runtime/capabilities/automations/tool-module.js +16 -7
  95. package/dist/src/runtime/capabilities/model-reasoning-controls.d.ts +23 -0
  96. package/dist/src/runtime/capabilities/model-reasoning-controls.js +56 -0
  97. package/dist/src/runtime/capabilities/scheduling/create-operations.js +2 -0
  98. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +1 -0
  99. package/dist/src/runtime/capabilities/scheduling/tool-module.js +5 -2
  100. package/dist/src/runtime/capabilities/scheduling/update-operations.js +2 -0
  101. package/dist/src/runtime/config/builders.js +6 -0
  102. package/dist/src/runtime/config/effective-model-config-validation.js +4 -0
  103. package/dist/src/runtime/config/llamacpp-profile-validation.d.ts +3 -0
  104. package/dist/src/runtime/config/llamacpp-profile-validation.js +15 -0
  105. package/dist/src/runtime/config/model-reasoning-schema.d.ts +40 -0
  106. package/dist/src/runtime/config/model-reasoning-schema.js +38 -0
  107. package/dist/src/runtime/config/model-reasoning-validation.d.ts +3 -0
  108. package/dist/src/runtime/config/model-reasoning-validation.js +37 -0
  109. package/dist/src/runtime/config/runner/step-instructions.d.ts +4 -0
  110. package/dist/src/runtime/config/runner/step-instructions.js +10 -6
  111. package/dist/src/runtime/config/schema.js +3 -0
  112. package/dist/src/runtime/config/validation/model-invocation-config-validation.js +14 -0
  113. package/dist/src/runtime/context/compacted-capability-result-receipt.d.ts +2 -0
  114. package/dist/src/runtime/context/compacted-capability-result-receipt.js +8 -7
  115. package/dist/src/runtime/context/execution-compacted-evidence.d.ts +4 -0
  116. package/dist/src/runtime/context/execution-compacted-evidence.js +2 -23
  117. package/dist/src/runtime/context/execution-compaction-checkpoint-selection.d.ts +19 -0
  118. package/dist/src/runtime/context/execution-compaction-checkpoint-selection.js +104 -0
  119. package/dist/src/runtime/context/model-step-compaction-inheritance.d.ts +12 -0
  120. package/dist/src/runtime/context/model-step-compaction-inheritance.js +28 -0
  121. package/dist/src/runtime/context/model-step-compaction-projection.d.ts +12 -0
  122. package/dist/src/runtime/context/model-step-compaction-projection.js +322 -0
  123. package/dist/src/runtime/context/model-step-compaction.d.ts +2 -1
  124. package/dist/src/runtime/context/model-step-compaction.js +25 -316
  125. package/dist/src/runtime/context/operation-supervision-compacted-evidence.js +7 -1
  126. package/dist/src/runtime/context/request-context.d.ts +2 -0
  127. package/dist/src/runtime/context/request-context.js +16 -0
  128. package/dist/src/runtime/context/request-tool-results-checkpoint.d.ts +2 -1
  129. package/dist/src/runtime/context/request-tool-results-checkpoint.js +35 -6
  130. package/dist/src/runtime/context/request-tool-results.js +3 -1
  131. package/dist/src/runtime/context/semantic-compaction/checkpoint-message.d.ts +5 -1
  132. package/dist/src/runtime/context/semantic-compaction/checkpoint-message.js +10 -4
  133. package/dist/src/runtime/context/semantic-compaction/execution-evidence-instructions.d.ts +4 -0
  134. package/dist/src/runtime/context/semantic-compaction/execution-evidence-instructions.js +38 -0
  135. package/dist/src/runtime/context/semantic-compaction/generation-contracts.d.ts +3 -1
  136. package/dist/src/runtime/context/semantic-compaction/generation-input.js +15 -10
  137. package/dist/src/runtime/context/semantic-compaction/inherited-source-digests.d.ts +8 -0
  138. package/dist/src/runtime/context/semantic-compaction/inherited-source-digests.js +76 -0
  139. package/dist/src/runtime/context/semantic-compaction/replacement-budget.js +3 -1
  140. package/dist/src/runtime/context/semantic-compaction/run.js +6 -12
  141. package/dist/src/runtime/knowledge-skills/builtins/computer-use.js +1 -1
  142. package/dist/src/runtime/knowledge-skills/builtins/technical-work.js +20 -2
  143. package/dist/src/runtime/knowledge-skills/builtins/what-can-i-do.d.ts +2 -0
  144. package/dist/src/runtime/knowledge-skills/builtins/what-can-i-do.js +27 -0
  145. package/dist/src/runtime/knowledge-skills/catalog.js +2 -0
  146. package/dist/src/runtime/local-application.d.ts +5 -0
  147. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -1
  148. package/dist/src/runtime/local-host/app-service-dispatch.js +2 -0
  149. package/dist/src/runtime/local-host/client-services.d.ts +5 -0
  150. package/dist/src/runtime/local-host/saved-approvals.js +1 -0
  151. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +5 -7
  152. package/dist/src/runtime/long-term-memory/onboarding/contracts.d.ts +26 -0
  153. package/dist/src/runtime/long-term-memory/onboarding/embedding-profile-id.d.ts +1 -0
  154. package/dist/src/runtime/long-term-memory/onboarding/embedding-profile-id.js +8 -0
  155. package/dist/src/runtime/long-term-memory/onboarding/saved-profiles.d.ts +17 -0
  156. package/dist/src/runtime/long-term-memory/onboarding/saved-profiles.js +77 -0
  157. package/dist/src/runtime/long-term-memory/onboarding/service.js +40 -10
  158. package/dist/src/runtime/model/input-token-count.js +1 -0
  159. package/dist/src/runtime/model/invoke-step.js +12 -0
  160. package/dist/src/runtime/model/invoke-structured-step.d.ts +4 -1
  161. package/dist/src/runtime/model/invoke-structured-step.js +4 -0
  162. package/dist/src/runtime/model/model-catalog.d.ts +3 -0
  163. package/dist/src/runtime/model/model-catalog.js +2 -0
  164. package/dist/src/runtime/model/model-context-budget.d.ts +5 -0
  165. package/dist/src/runtime/model/model-context-budget.js +2 -0
  166. package/dist/src/runtime/model/model-step-port.d.ts +7 -0
  167. package/dist/src/runtime/model/optional-context-admission.d.ts +18 -0
  168. package/dist/src/runtime/model/optional-context-admission.js +23 -0
  169. package/dist/src/runtime/ports.d.ts +3 -1
  170. package/dist/src/runtime/projects/contracts.d.ts +6 -0
  171. package/dist/src/runtime/projects/registry-format.d.ts +3 -0
  172. package/dist/src/runtime/projects/registry-format.js +50 -0
  173. package/dist/src/runtime/projects/repository.d.ts +6 -3
  174. package/dist/src/runtime/projects/repository.js +26 -19
  175. package/dist/src/runtime/projects/service.js +11 -0
  176. package/dist/src/runtime/request/approval-wait/preflight.js +1 -0
  177. package/dist/src/runtime/request/approval-wait/snapshot.d.ts +1 -1
  178. package/dist/src/runtime/request/approval-wait/snapshot.js +1 -0
  179. package/dist/src/runtime/request/contracts.d.ts +5 -1
  180. package/dist/src/runtime/request/execution-facets.js +2 -0
  181. package/dist/src/runtime/request/execution-payload-artifact-policy.d.ts +3 -0
  182. package/dist/src/runtime/request/execution-payload-artifact-policy.js +6 -0
  183. package/dist/src/runtime/request/execution-payload-compacted-evidence.js +1 -0
  184. package/dist/src/runtime/request/execution-scope-surfaces.d.ts +2 -0
  185. package/dist/src/runtime/request/execution-scope-surfaces.js +3 -0
  186. package/dist/src/runtime/request/execution-scope.d.ts +2 -0
  187. package/dist/src/runtime/request/execution-scope.js +2 -0
  188. package/dist/src/runtime/request/input.d.ts +1 -0
  189. package/dist/src/runtime/request/input.js +1 -0
  190. package/dist/src/runtime/request/prepared-execution.d.ts +1 -0
  191. package/dist/src/runtime/request/prepared-execution.js +3 -0
  192. package/dist/src/runtime/request/reasoning-preference.d.ts +10 -0
  193. package/dist/src/runtime/request/reasoning-preference.js +29 -0
  194. package/dist/src/runtime/request/root-reference-action.js +3 -3
  195. package/dist/src/runtime/request/root-skill-read-admission.d.ts +4 -0
  196. package/dist/src/runtime/request/root-skill-read-admission.js +14 -0
  197. package/dist/src/runtime/request/root-skill-read.js +13 -5
  198. package/dist/src/runtime/request/supervisor-skill-selection-window.d.ts +16 -0
  199. package/dist/src/runtime/request/supervisor-skill-selection-window.js +17 -0
  200. package/dist/src/runtime/request/worker-capability-composition.js +2 -0
  201. package/dist/src/runtime/scheduler/contracts.d.ts +7 -1
  202. package/dist/src/runtime/scheduler/job-management.js +7 -1
  203. package/dist/src/runtime/scheduler/run-records.js +2 -0
  204. package/dist/src/runtime/scheduler/schedule-validation.js +2 -0
  205. package/dist/src/runtime/scheduler/scheduler-engine.js +1 -0
  206. package/dist/src/runtime/scheduler/snapshot-validation.js +2 -0
  207. package/dist/src/runtime/steps/auditor-decision/projection.js +2 -0
  208. package/dist/src/runtime/steps/execution-agent/capability-controls-partition.d.ts +9 -0
  209. package/dist/src/runtime/steps/execution-agent/capability-controls-partition.js +29 -0
  210. package/dist/src/runtime/steps/execution-agent/capability-scope.d.ts +17 -0
  211. package/dist/src/runtime/steps/execution-agent/capability-scope.js +54 -0
  212. package/dist/src/runtime/steps/execution-agent/compaction.js +22 -6
  213. package/dist/src/runtime/steps/execution-agent/controls-compacted-evidence.js +2 -0
  214. package/dist/src/runtime/steps/execution-agent/evidence-reuse-instructions.d.ts +6 -0
  215. package/dist/src/runtime/steps/execution-agent/evidence-reuse-instructions.js +13 -0
  216. package/dist/src/runtime/steps/execution-agent/format.js +3 -6
  217. package/dist/src/runtime/steps/execution-agent/input.d.ts +5 -1
  218. package/dist/src/runtime/steps/execution-agent/input.js +10 -36
  219. package/dist/src/runtime/steps/execution-agent/observation-guidance.d.ts +11 -0
  220. package/dist/src/runtime/steps/execution-agent/observation-guidance.js +33 -0
  221. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  222. package/dist/src/runtime/steps/execution-agent/refinement.d.ts +3 -2
  223. package/dist/src/runtime/steps/execution-agent/refinement.js +17 -6
  224. package/dist/src/runtime/steps/execution-agent/run.js +7 -1
  225. package/dist/src/runtime/steps/skill-read-decision.d.ts +1 -0
  226. package/dist/src/runtime/steps/skill-read-decision.js +9 -4
  227. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.d.ts +6 -1
  228. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.js +15 -0
  229. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +1 -1
  230. package/dist/src/runtime/steps/supervisor-decision/contracts.js +2 -0
  231. package/dist/src/runtime/steps/supervisor-decision/decision-phases.d.ts +3 -0
  232. package/dist/src/runtime/steps/supervisor-decision/decision-phases.js +22 -3
  233. package/dist/src/runtime/steps/supervisor-decision/delegation-contract.d.ts +9 -0
  234. package/dist/src/runtime/steps/supervisor-decision/delegation-contract.js +82 -0
  235. package/dist/src/runtime/steps/supervisor-decision/delegation-input.d.ts +7 -0
  236. package/dist/src/runtime/steps/supervisor-decision/delegation-input.js +105 -0
  237. package/dist/src/runtime/steps/supervisor-decision/delegation-prompt.d.ts +7 -0
  238. package/dist/src/runtime/steps/supervisor-decision/delegation-prompt.js +13 -0
  239. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  240. package/dist/src/runtime/steps/supervisor-decision/preparation-input.d.ts +3 -5
  241. package/dist/src/runtime/steps/supervisor-decision/preparation-input.js +5 -21
  242. package/dist/src/runtime/steps/supervisor-decision/preparation.d.ts +4 -1
  243. package/dist/src/runtime/steps/supervisor-decision/preparation.js +58 -6
  244. package/dist/src/runtime/steps/supervisor-decision/procedure-entry.d.ts +22 -0
  245. package/dist/src/runtime/steps/supervisor-decision/procedure-entry.js +61 -0
  246. package/dist/src/runtime/steps/supervisor-decision/procedure-gate.d.ts +39 -0
  247. package/dist/src/runtime/steps/supervisor-decision/procedure-gate.js +146 -0
  248. package/dist/src/runtime/steps/supervisor-decision/procedure-memory.d.ts +9 -0
  249. package/dist/src/runtime/steps/supervisor-decision/procedure-memory.js +100 -0
  250. package/dist/src/runtime/steps/supervisor-decision/procedure-recall.d.ts +10 -0
  251. package/dist/src/runtime/steps/supervisor-decision/procedure-recall.js +52 -0
  252. package/dist/src/runtime/steps/supervisor-decision/prompt.js +3 -16
  253. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +2 -2
  254. package/dist/src/runtime/steps/supervisor-decision/role-guidance.d.ts +3 -0
  255. package/dist/src/runtime/steps/supervisor-decision/role-guidance.js +20 -0
  256. package/dist/src/runtime/steps/supervisor-decision/run.js +50 -7
  257. package/dist/src/runtime/steps/supervisor-decision/skill-read-state.d.ts +10 -0
  258. package/dist/src/runtime/steps/supervisor-decision/skill-read-state.js +45 -0
  259. package/dist/src/runtime/steps/supervisor-decision/skill-selection-candidates.d.ts +15 -0
  260. package/dist/src/runtime/steps/supervisor-decision/skill-selection-candidates.js +25 -0
  261. package/dist/src/runtime/steps/supervisor-decision/skill-selection-catalog.d.ts +3 -0
  262. package/dist/src/runtime/steps/supervisor-decision/skill-selection-catalog.js +15 -0
  263. package/dist/src/runtime/steps/supervisor-decision/skill-selection-continuation.d.ts +10 -0
  264. package/dist/src/runtime/steps/supervisor-decision/skill-selection-continuation.js +65 -0
  265. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.d.ts +3 -1
  266. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.js +20 -22
  267. package/dist/src/runtime/steps/supervisor-decision/skill-selection.d.ts +3 -2
  268. package/dist/src/runtime/steps/supervisor-decision/skill-selection.js +62 -15
  269. package/dist/src/runtime/steps/supervisor-response/prompt.js +18 -4
  270. package/dist/src/shared/model-reasoning-modes.d.ts +5 -0
  271. package/dist/src/shared/model-reasoning-modes.js +20 -0
  272. package/dist/src/shared/model-reasoning-schema.d.ts +38 -0
  273. package/dist/src/shared/model-reasoning-schema.js +29 -0
  274. package/dist/src/shared/model-reasoning.d.ts +35 -0
  275. package/dist/src/shared/model-reasoning.js +100 -0
  276. package/dist/src/web-ui/app/ARCHITECTURE.md +13 -0
  277. package/dist/src/web-ui/app/app-bootstrap.js +9 -12
  278. package/dist/src/web-ui/app/app-dom.js +6 -1
  279. package/dist/src/web-ui/app/app-state.js +1 -0
  280. package/dist/src/web-ui/app/app.js +8 -3
  281. package/dist/src/web-ui/app/appearance-feature.js +28 -0
  282. package/dist/src/web-ui/app/automations-feature.js +20 -11
  283. package/dist/src/web-ui/app/components/appearance-dialog.js +79 -0
  284. package/dist/src/web-ui/app/components/automations/archive-actions.js +5 -3
  285. package/dist/src/web-ui/app/components/automations/authoring-entry.js +26 -7
  286. package/dist/src/web-ui/app/components/automations/confirmation-actions.js +78 -0
  287. package/dist/src/web-ui/app/components/automations/draft-recovery-actions.js +1 -0
  288. package/dist/src/web-ui/app/components/automations/node-inspector.js +5 -1
  289. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +4 -2
  290. package/dist/src/web-ui/app/components/automations/timeline.js +2 -2
  291. package/dist/src/web-ui/app/components/automations/workspace-navigation.js +37 -0
  292. package/dist/src/web-ui/app/components/automations/workspace.js +31 -46
  293. package/dist/src/web-ui/app/components/config-workspace/config-model.js +6 -0
  294. package/dist/src/web-ui/app/components/config-workspace/model-removal.js +4 -2
  295. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +8 -16
  296. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget-edit.js +113 -0
  297. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget.d.ts +16 -0
  298. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget.js +67 -0
  299. package/dist/src/web-ui/app/components/config-workspace/reasoning-mode-budgets.d.ts +7 -0
  300. package/dist/src/web-ui/app/components/config-workspace/reasoning-mode-budgets.js +25 -0
  301. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +15 -7
  302. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +32 -12
  303. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +1 -1
  304. package/dist/src/web-ui/app/components/config-workspace.js +2 -1
  305. package/dist/src/web-ui/app/components/confirmation-dialog.js +88 -0
  306. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  307. package/dist/src/web-ui/app/components/conversation-activity.js +32 -3
  308. package/dist/src/web-ui/app/components/conversation-memory-activity.js +31 -0
  309. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +2 -0
  310. package/dist/src/web-ui/app/components/conversation-role-cards.js +14 -11
  311. package/dist/src/web-ui/app/components/conversation-skill-activity.js +67 -0
  312. package/dist/src/web-ui/app/components/conversation-tools.js +5 -5
  313. package/dist/src/web-ui/app/components/conversation-view.js +6 -0
  314. package/dist/src/web-ui/app/components/dashboard/approvals.js +13 -1
  315. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-dialog.d.ts +38 -0
  316. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-dialog.js +289 -0
  317. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-feature.js +75 -0
  318. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-rendering.js +31 -0
  319. package/dist/src/web-ui/app/components/long-term-memory/manager.js +15 -5
  320. package/dist/src/web-ui/app/components/long-term-memory/saved-embedding-profiles.js +114 -0
  321. package/dist/src/web-ui/app/components/long-term-memory/setup-rendering.js +55 -0
  322. package/dist/src/web-ui/app/components/long-term-memory-setup.js +141 -76
  323. package/dist/src/web-ui/app/components/model-setup/rendering.js +3 -2
  324. package/dist/src/web-ui/app/components/model-setup/validation.js +6 -2
  325. package/dist/src/web-ui/app/components/model-setup/wizard.d.ts +1 -0
  326. package/dist/src/web-ui/app/components/model-setup/wizard.js +28 -5
  327. package/dist/src/web-ui/app/components/passive-learning/memory.js +12 -5
  328. package/dist/src/web-ui/app/components/plugins/manager.js +14 -0
  329. package/dist/src/web-ui/app/components/plugins/removal.js +10 -2
  330. package/dist/src/web-ui/app/components/project-group-actions.js +35 -0
  331. package/dist/src/web-ui/app/components/project-session-groups.js +17 -31
  332. package/dist/src/web-ui/app/components/runtime-setup/commands.js +1 -1
  333. package/dist/src/web-ui/app/components/runtime-setup/connection-form.d.ts +15 -0
  334. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +32 -9
  335. package/dist/src/web-ui/app/components/runtime-setup/connection-input.js +23 -0
  336. package/dist/src/web-ui/app/components/runtime-setup/connection-inspection.js +57 -0
  337. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +18 -4
  338. package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.js +3 -0
  339. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-options.js +54 -0
  340. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-receipt.js +3 -0
  341. package/dist/src/web-ui/app/components/runtime-setup/embedding-rendering.js +22 -22
  342. package/dist/src/web-ui/app/components/runtime-setup/embedding.js +60 -16
  343. package/dist/src/web-ui/app/components/runtime-setup/reasoning-fields.d.ts +17 -0
  344. package/dist/src/web-ui/app/components/runtime-setup/reasoning-fields.js +54 -0
  345. package/dist/src/web-ui/app/components/runtime-setup/validation.js +5 -1
  346. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +9 -3
  347. package/dist/src/web-ui/app/components/runtime-setup-guide.js +20 -29
  348. package/dist/src/web-ui/app/components/schedules/details.js +2 -2
  349. package/dist/src/web-ui/app/components/schedules/form.js +12 -5
  350. package/dist/src/web-ui/app/components/schedules/workspace.js +30 -18
  351. package/dist/src/web-ui/app/components/session-list-viewport.js +49 -0
  352. package/dist/src/web-ui/app/components/session-search-disclosure.js +27 -0
  353. package/dist/src/web-ui/app/components/skills/workspace.js +7 -3
  354. package/dist/src/web-ui/app/components/spark-chat/panel.js +7 -3
  355. package/dist/src/web-ui/app/components/spark-chat/settings.js +57 -15
  356. package/dist/src/web-ui/app/components/tool-approval-card.d.ts +2 -1
  357. package/dist/src/web-ui/app/components/tool-approval-card.js +10 -2
  358. package/dist/src/web-ui/app/components/tool-approval-rejection-input.js +116 -0
  359. package/dist/src/web-ui/app/components/workspace-shell.js +30 -38
  360. package/dist/src/web-ui/app/components/workspace-transitions.js +42 -0
  361. package/dist/src/web-ui/app/configuration-feature.js +34 -4
  362. package/dist/src/web-ui/app/controllers/app-event-bindings.js +45 -29
  363. package/dist/src/web-ui/app/controllers/appearance-controller.js +105 -0
  364. package/dist/src/web-ui/app/controllers/automations-controller.js +9 -1
  365. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +1 -1
  366. package/dist/src/web-ui/app/controllers/composer-feature.js +10 -3
  367. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +1 -1
  368. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +9 -3
  369. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +1 -1
  370. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +8 -2
  371. package/dist/src/web-ui/app/controllers/dashboard-approvals-controller.js +10 -9
  372. package/dist/src/web-ui/app/controllers/environment-transition.js +2 -2
  373. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +9 -7
  374. package/dist/src/web-ui/app/controllers/preference-view-sync.js +35 -0
  375. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +4 -0
  376. package/dist/src/web-ui/app/controllers/projects-controller.js +64 -3
  377. package/dist/src/web-ui/app/controllers/reasoning-budget-controller.d.ts +17 -0
  378. package/dist/src/web-ui/app/controllers/reasoning-budget-controller.js +80 -0
  379. package/dist/src/web-ui/app/controllers/reasoning-budget-menu-events.js +45 -0
  380. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +35 -40
  381. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +6 -1
  382. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +16 -3
  383. package/dist/src/web-ui/app/controllers/session-controller.js +34 -9
  384. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +4 -3
  385. package/dist/src/web-ui/app/controllers/skills-controller.js +33 -16
  386. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +1 -1
  387. package/dist/src/web-ui/app/controllers/spark-handoff-navigation.js +7 -1
  388. package/dist/src/web-ui/app/controllers/tool-approval-controller.d.ts +2 -1
  389. package/dist/src/web-ui/app/controllers/tool-approval-controller.js +36 -3
  390. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +8 -2
  391. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +41 -10
  392. package/dist/src/web-ui/app/index.html +38 -32
  393. package/dist/src/web-ui/app/lib/color-palettes.d.ts +17 -0
  394. package/dist/src/web-ui/app/lib/color-palettes.js +20 -0
  395. package/dist/src/web-ui/app/lib/memory-activity-model.d.ts +12 -0
  396. package/dist/src/web-ui/app/lib/memory-activity-model.js +61 -0
  397. package/dist/src/web-ui/app/lib/navigation-display.d.ts +8 -0
  398. package/dist/src/web-ui/app/lib/navigation-display.js +12 -0
  399. package/dist/src/web-ui/app/lib/reasoning-controls.js +47 -6
  400. package/dist/src/web-ui/app/lib/reasoning-preference.d.ts +9 -0
  401. package/dist/src/web-ui/app/lib/reasoning-preference.js +75 -0
  402. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +4 -0
  403. package/dist/src/web-ui/app/lib/session-composer-queue.js +4 -0
  404. package/dist/src/web-ui/app/lib/session-project-groups.js +28 -0
  405. package/dist/src/web-ui/app/lib/session-sidebar-order.js +7 -5
  406. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +1 -0
  407. package/dist/src/web-ui/app/lib/tool-activity-event.js +1 -0
  408. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +1 -0
  409. package/dist/src/web-ui/app/lib/tool-activity-model.js +1 -0
  410. package/dist/src/web-ui/app/lib/tool-approval-rejection-drafts.js +45 -0
  411. package/dist/src/web-ui/app/lib/tool-skill-activity-fields.js +1 -1
  412. package/dist/src/web-ui/app/notifications-feature.js +10 -2
  413. package/dist/src/web-ui/app/passive-learning-feature.js +2 -2
  414. package/dist/src/web-ui/app/projects-feature.js +40 -10
  415. package/dist/src/web-ui/app/runtime-onboarding-feature.js +1 -0
  416. package/dist/src/web-ui/app/schedules-feature.js +28 -5
  417. package/dist/src/web-ui/app/services/client-preferences.d.ts +4 -1
  418. package/dist/src/web-ui/app/services/client-preferences.js +2 -0
  419. package/dist/src/web-ui/app/services/conversation-reasoning-preferences.d.ts +11 -0
  420. package/dist/src/web-ui/app/services/conversation-reasoning-preferences.js +30 -0
  421. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +6 -4
  422. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +5 -0
  423. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +21 -0
  424. package/dist/src/web-ui/app/services/runtime-web-client/projects.d.ts +2 -1
  425. package/dist/src/web-ui/app/services/runtime-web-client/projects.js +4 -0
  426. package/dist/src/web-ui/app/services/runtime-web-client/tool-approvals.js +2 -0
  427. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +16 -0
  428. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  429. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +33 -13
  430. package/dist/src/web-ui/app/skills-feature.js +2 -3
  431. package/dist/src/web-ui/app/spark-chat-conversation.js +29 -3
  432. package/dist/src/web-ui/app/spark-chat-feature.js +13 -7
  433. package/dist/src/web-ui/app/styles/01-color-palettes.css +90 -0
  434. package/dist/src/web-ui/app/styles/11-product-links.css +6 -2
  435. package/dist/src/web-ui/app/styles/11-workspace-header-width.css +37 -25
  436. package/dist/src/web-ui/app/styles/12-conversation-sidebar.css +56 -22
  437. package/dist/src/web-ui/app/styles/13-projects.css +56 -19
  438. package/dist/src/web-ui/app/styles/19-runtime-setup.css +16 -0
  439. package/dist/src/web-ui/app/styles/22-reasoning-budget.css +39 -0
  440. package/dist/src/web-ui/app/styles/27-conversation-memory.css +45 -0
  441. package/dist/src/web-ui/app/styles/27-conversation-skills.css +96 -0
  442. package/dist/src/web-ui/app/styles/28-tool-approval-card.css +38 -1
  443. package/dist/src/web-ui/app/styles/35-embedding-profiles.css +159 -0
  444. package/dist/src/web-ui/app/styles/54-spark-chat.css +62 -46
  445. package/dist/src/web-ui/app/styles/65-appearance.css +60 -0
  446. package/dist/src/web-ui/app/styles/66-navigation-display.css +30 -0
  447. package/dist/src/web-ui/app/styles/67-confirmation-dialog.css +32 -0
  448. package/dist/src/web-ui/app/styles.css +8 -0
  449. package/dist/src/web-ui/client-state/preference-shapes.js +6 -1
  450. package/dist/src/web-ui/client-state/preferences.js +8 -2
  451. package/dist/src/web-ui/client-state/reasoning-preference-shape.d.ts +1 -0
  452. package/dist/src/web-ui/client-state/reasoning-preference-shape.js +18 -0
  453. package/dist/src/web-ui/local-runtime/api-router.d.ts +1 -0
  454. package/dist/src/web-ui/local-runtime/api-router.js +11 -0
  455. package/dist/src/web-ui/local-runtime/memory-embedding-connection-input.d.ts +7 -0
  456. package/dist/src/web-ui/local-runtime/memory-embedding-connection-input.js +22 -0
  457. package/dist/src/web-ui/local-runtime/memory-embedding-connection-service.d.ts +20 -0
  458. package/dist/src/web-ui/local-runtime/memory-embedding-connection-service.js +47 -0
  459. package/dist/src/web-ui/local-runtime/memory-onboarding-routes.js +32 -0
  460. package/dist/src/web-ui/local-runtime/model-connection-inspection.d.ts +7 -0
  461. package/dist/src/web-ui/local-runtime/model-connection-inspection.js +48 -0
  462. package/dist/src/web-ui/local-runtime/model-setup-catalog.d.ts +2 -1
  463. package/dist/src/web-ui/local-runtime/model-setup-catalog.js +3 -1
  464. package/dist/src/web-ui/local-runtime/model-setup-identity.js +1 -1
  465. package/dist/src/web-ui/local-runtime/model-setup-input.d.ts +5 -2
  466. package/dist/src/web-ui/local-runtime/model-setup-input.js +29 -6
  467. package/dist/src/web-ui/local-runtime/model-setup-provider.d.ts +1 -1
  468. package/dist/src/web-ui/local-runtime/model-setup-provider.js +9 -6
  469. package/dist/src/web-ui/local-runtime/model-setup-retry.js +4 -1
  470. package/dist/src/web-ui/local-runtime/model-setup-service.d.ts +2 -1
  471. package/dist/src/web-ui/local-runtime/pending-tool-approvals.js +4 -1
  472. package/dist/src/web-ui/local-runtime/project-routes.js +10 -2
  473. package/dist/src/web-ui/local-runtime/request-execution.js +1 -0
  474. package/dist/src/web-ui/local-runtime/runtime-setup-auth.d.ts +2 -0
  475. package/dist/src/web-ui/local-runtime/runtime-setup-auth.js +20 -0
  476. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +3 -2
  477. package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.js +6 -1
  478. package/dist/src/web-ui/local-runtime/runtime-setup-input.d.ts +3 -2
  479. package/dist/src/web-ui/local-runtime/runtime-setup-input.js +17 -5
  480. package/dist/src/web-ui/local-runtime/runtime-setup-provider.d.ts +4 -1
  481. package/dist/src/web-ui/local-runtime/runtime-setup-provider.js +6 -2
  482. package/dist/src/web-ui/local-runtime/runtime-setup-routes.d.ts +11 -2
  483. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +11 -2
  484. package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.js +3 -2
  485. package/dist/src/web-ui/local-runtime/runtime-setup-service.d.ts +25 -4
  486. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +19 -9
  487. package/dist/src/web-ui/local-runtime/setup-embedding-input.d.ts +3 -1
  488. package/dist/src/web-ui/local-runtime/setup-embedding-input.js +38 -6
  489. package/dist/src/web-ui/local-runtime/setup-embedding-llamacpp.d.ts +11 -0
  490. package/dist/src/web-ui/local-runtime/setup-embedding-llamacpp.js +53 -0
  491. package/dist/src/web-ui/local-runtime/setup-embedding-provider.js +23 -9
  492. package/dist/src/web-ui/local-runtime/setup-embedding-routes.d.ts +7 -2
  493. package/dist/src/web-ui/local-runtime/setup-embedding-routes.js +5 -3
  494. package/dist/src/web-ui/local-runtime/setup-embedding-service.d.ts +1 -0
  495. package/docs/configuration.md +10 -8
  496. package/docs/installation.md +11 -5
  497. package/docs/llamacpp.md +248 -0
  498. package/docs/long-term-memory.md +12 -0
  499. package/docs/running-locally.md +7 -1
  500. package/package.json +2 -1
  501. package/plugins/project-orientation/source/index.ts +2 -3
  502. package/plugins/project-orientation/source/inspection-failure.ts +1 -1
  503. package/plugins/project-orientation/source/project-target.ts +29 -0
  504. package/plugins/project-orientation/src/index.cjs +21 -2
  505. package/runtime.config.schema.json +140 -0
  506. package/src/runtime/README.md +50 -4
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  createInitialWorkspaceShellState,
3
- normalizeWorkspaceDestination,
4
3
  toggleWorkspaceSheet,
5
4
  } from "../ui-behavior.js";
6
5
  import { createOnboardingWorkspaceAccess } from "./onboarding-workspace-access.js";
@@ -10,6 +9,8 @@ import {
10
9
  resolveConversationSidebarLayout,
11
10
  } from "./conversation-sidebar-layout.js";
12
11
  import { createOperationsSection } from "./operations-section.js";
12
+ import { createWorkspaceTransitions } from "./workspace-transitions.js";
13
+ import { captureSessionListViewport, restoreSessionListViewport } from "./session-list-viewport.js";
13
14
  import { isConfigurationWorkspace, renderConfigurationPageHeading } from "../lib/configuration-pages.js";
14
15
 
15
16
  export function createWorkspaceShell({
@@ -31,6 +32,12 @@ export function createWorkspaceShell({
31
32
  const workspaceListeners = new Set();
32
33
  const runtimeAvailabilityListeners = new Set();
33
34
  const workspaceGuards = new Set();
35
+ const transitions = createWorkspaceTransitions({
36
+ getWorkspace: () => shellState.workspace,
37
+ getNavigationRevision: () => navigationRevision,
38
+ isAvailable: workspaceAccess.isAvailable,
39
+ getGuards: () => [beforeWorkspaceChange, ...workspaceGuards],
40
+ });
34
41
  function notifyWorkspaceListeners(workspace) {
35
42
  onWorkspaceChange(workspace);
36
43
  for (const listener of workspaceListeners) listener(workspace);
@@ -66,6 +73,7 @@ export function createWorkspaceShell({
66
73
  }
67
74
 
68
75
  function syncShell() {
76
+ captureSessionListViewport(dom.sessionsList);
69
77
  workspaceAccess.render();
70
78
  const homeWorkspace = shellState.workspace === "home";
71
79
  const chatWorkspace = shellState.workspace === "chat";
@@ -142,6 +150,7 @@ export function createWorkspaceShell({
142
150
  }
143
151
  setCurrentPage(dom.notificationsWorkspaceButton, notificationsWorkspace);
144
152
  dom.sessionsPanel.hidden = !sessions.visible;
153
+ restoreSessionListViewport(dom.sessionsList);
145
154
  dom.sessionsPanel.inert = !sessions.visible;
146
155
  dom.sessionsPanel.setAttribute(
147
156
  "aria-hidden",
@@ -183,7 +192,7 @@ export function createWorkspaceShell({
183
192
  dom.closeSessionsButton.focus();
184
193
  return;
185
194
  }
186
- const sidebarControl = dom.sessionSearchInput ?? dom.refreshSessionsButton;
195
+ const sidebarControl = dom.sessionSearchToggleButton ?? dom.refreshSessionsButton;
187
196
  (sidebarControl ?? dom.chatWorkspaceButton).focus();
188
197
  }
189
198
 
@@ -218,35 +227,9 @@ export function createWorkspaceShell({
218
227
  visibleNavigationButton.focus();
219
228
  }
220
229
 
221
- function prepareWorkspaceTransition(destination) {
222
- const nextWorkspace = normalizeWorkspaceDestination(destination);
223
- if (!workspaceAccess.isAvailable(nextWorkspace)) return null;
224
- if (nextWorkspace === shellState.workspace) {
225
- return { nextWorkspace, commitBeforeChange: () => {} };
226
- }
227
- const preparedChange = beforeWorkspaceChange({
228
- from: shellState.workspace,
229
- to: nextWorkspace,
230
- });
231
- if (preparedChange === false || preparedChange === null) return null;
232
- const additionalChanges = [];
233
- for (const guard of workspaceGuards) {
234
- const change = guard({ from: shellState.workspace, to: nextWorkspace });
235
- if (change === false || change === null) return null;
236
- if (typeof change === "function") additionalChanges.push(change);
237
- }
238
- return {
239
- nextWorkspace,
240
- commitBeforeChange() {
241
- if (typeof preparedChange === "function") preparedChange();
242
- for (const change of additionalChanges) change();
243
- },
244
- };
245
- }
246
-
247
230
  function commitWorkspaceActivation(preparedTransition, options = {}) {
248
231
  if (!workspaceAccess.isAvailable(preparedTransition.nextWorkspace)) return false;
249
- preparedTransition.commitBeforeChange();
232
+ if (!preparedTransition.commitBeforeChange()) return false;
250
233
  const nextWorkspace = preparedTransition.nextWorkspace;
251
234
  const previousWorkspace = shellState.workspace;
252
235
  const previousSheet = shellState.activeSheet;
@@ -285,27 +268,34 @@ export function createWorkspaceShell({
285
268
  return true;
286
269
  }
287
270
 
288
- function prepareWorkspaceActivation(destination, options = {}) {
289
- const preparedTransition = prepareWorkspaceTransition(destination);
271
+ async function prepareWorkspaceActivation(destination, options = {}) {
272
+ const preparedTransition = await transitions.prepare(destination);
290
273
  if (!preparedTransition) return null;
291
274
  let committed = false;
292
- return () => {
275
+ const activate = () => {
293
276
  if (committed) return true;
294
277
  const activated = commitWorkspaceActivation(preparedTransition, options);
295
278
  committed = activated;
296
279
  return activated;
297
280
  };
281
+ activate.canCommit = () => committed || preparedTransition.canCommit();
282
+ return activate;
298
283
  }
299
284
 
300
- function activateWorkspace(destination, options = {}) {
301
- const preparedActivation = prepareWorkspaceActivation(destination, options);
285
+ async function activateWorkspace(destination, options = {}) {
286
+ const preparedActivation = await prepareWorkspaceActivation(destination, options);
302
287
  return preparedActivation ? preparedActivation() : false;
303
288
  }
304
289
 
305
290
  function setSessionsDrawerOpen(open, options = {}) {
306
- const preparedTransition = prepareWorkspaceTransition("chat");
307
- if (!preparedTransition) return false;
308
- preparedTransition.commitBeforeChange();
291
+ if (shellState.workspace === "chat") return commitSessionsDrawer(open, options);
292
+ return transitions.prepare("chat").then((prepared) => {
293
+ if (!prepared?.commitBeforeChange()) return false;
294
+ return commitSessionsDrawer(open, options);
295
+ });
296
+ }
297
+
298
+ function commitSessionsDrawer(open, options) {
309
299
  const wasOpen = shellState.activeSheet === "sessions";
310
300
  shellState.workspace = "chat";
311
301
  const useDrawer = open && sidebarViewport?.matches !== true;
@@ -351,7 +341,8 @@ export function createWorkspaceShell({
351
341
  return true;
352
342
  }
353
343
  if (["config", "models", "plugins", "schedules", "automations", "learning", "memory", "skills", "notifications"].includes(shellState.workspace)) {
354
- return activateWorkspace("chat");
344
+ void activateWorkspace("chat");
345
+ return true;
355
346
  }
356
347
  return false;
357
348
  }
@@ -433,6 +424,7 @@ export function createWorkspaceShell({
433
424
  runtimeAvailabilityChanged,
434
425
  workspaceUnavailableMessage: workspaceAccess.unavailableMessage,
435
426
  navigationRevision: () => navigationRevision,
427
+ navigationRequestRevision: transitions.requestRevision,
436
428
  subscribeRuntimeAvailabilityChange(listener) {
437
429
  runtimeAvailabilityListeners.add(listener);
438
430
  return () => runtimeAvailabilityListeners.delete(listener);
@@ -0,0 +1,42 @@
1
+ import { normalizeWorkspaceDestination } from "../ui-behavior.js";
2
+
3
+ export function createWorkspaceTransitions({ getWorkspace, getNavigationRevision, isAvailable, getGuards }) {
4
+ let requestRevision = 0;
5
+ async function prepare(destination) {
6
+ const request = ++requestRevision;
7
+ const from = getWorkspace();
8
+ const revision = getNavigationRevision();
9
+ const nextWorkspace = normalizeWorkspaceDestination(destination);
10
+ const changes = [];
11
+ function isCurrentTransitionRequest() {
12
+ if (request !== requestRevision) return false;
13
+ if (from !== getWorkspace()) return false;
14
+ if (revision !== getNavigationRevision()) return false;
15
+ return isAvailable(nextWorkspace);
16
+ }
17
+ function canCommitTransition() {
18
+ if (!isCurrentTransitionRequest()) return false;
19
+ return changes.every((change) => change?.canCommit?.() !== false);
20
+ }
21
+ if (!isCurrentTransitionRequest()) return null;
22
+ const guards = nextWorkspace === from ? [] : getGuards();
23
+ for (const guard of guards) {
24
+ const change = await guard({ from, to: nextWorkspace });
25
+ if (!canCommitTransition()) return null;
26
+ if (change === false || change === null) return null;
27
+ changes.push(change);
28
+ }
29
+ if (!canCommitTransition()) return null;
30
+ return {
31
+ nextWorkspace, canCommit: canCommitTransition,
32
+ commitBeforeChange() {
33
+ if (!canCommitTransition()) return false;
34
+ for (const change of changes) {
35
+ if (typeof change === "function" && change() === false) return false;
36
+ }
37
+ return true;
38
+ },
39
+ };
40
+ }
41
+ return { prepare, requestRevision: () => requestRevision };
42
+ }
@@ -6,6 +6,7 @@ import { createHomeGuidance } from "./components/home-guidance/home-guidance.js"
6
6
  import { createConfigWorkspace } from "./components/config-workspace.js";
7
7
  import { createModelRemovalController } from "./components/config-workspace/model-removal.js";
8
8
  import { createLongTermMemorySetup } from "./components/long-term-memory-setup.js";
9
+ import { createMemoryEmbeddingConnectionFeature } from "./components/long-term-memory/embedding-connection-feature.js";
9
10
  import { createLongTermMemoryManager } from "./components/long-term-memory/manager.js";
10
11
  import { createMemoryWorkspace } from "./components/long-term-memory/workspace.js";
11
12
  import { createLongTermMemoryController } from "./controllers/long-term-memory/controller.js";
@@ -28,7 +29,24 @@ export function createConfigurationFeature({
28
29
  let activation;
29
30
  let modelSetup;
30
31
  let modelRemoval;
32
+ const memoryConnection = createMemoryEmbeddingConnectionFeature({
33
+ root: dom.memoryWorkspacePanel,
34
+ runtimeClient,
35
+ getEnvironmentId: selectedEnvironmentId,
36
+ getWorkspace: () => configWorkspace,
37
+ canOpen: () => !modelSetup?.isOpen() && !pluginManager.hasConfigurationDraft(),
38
+ refreshMemory: () => longTermMemorySetup.load({ preserveInputs: false }),
39
+ onSaved: () => activation?.markPending(),
40
+ onApplied: async () => {
41
+ activation?.markApplied();
42
+ pluginManager.markApplied?.();
43
+ await onConfigurationApplied();
44
+ },
45
+ onClosed: () => onConfigurationSettled(),
46
+ });
31
47
  const longTermMemorySetup = createLongTermMemorySetup({
48
+ onAddConnection: (options) => memoryConnection.open(options),
49
+ onEnvironmentChanged: () => memoryConnection.environmentChanged(),
32
50
  getEnvironmentId: selectedEnvironmentId,
33
51
  loadStatus: (environmentId) =>
34
52
  runtimeClient.loadLongTermMemoryStatus(environmentId),
@@ -45,6 +63,10 @@ export function createConfigurationFeature({
45
63
  activation?.markPending();
46
64
  return result;
47
65
  },
66
+ saveProfile: (input, environmentId) =>
67
+ runtimeClient.saveMemoryEmbeddingProfile(input, environmentId),
68
+ removeProfile: (input, environmentId) =>
69
+ runtimeClient.removeMemoryEmbeddingProfile(input, environmentId),
48
70
  disableMemory: async (environmentId) => {
49
71
  const result = await runtimeClient.disableLongTermMemory(environmentId);
50
72
  activation?.markPending();
@@ -67,6 +89,7 @@ export function createConfigurationFeature({
67
89
  });
68
90
  longTermMemoryManager = createLongTermMemoryManager({
69
91
  actions: longTermMemoryController,
92
+ getEnvironmentId: selectedEnvironmentId,
70
93
  });
71
94
  longTermMemorySetup.mount(dom.memorySetupRoot);
72
95
  longTermMemoryManager.mount(dom.memoryManagementRoot);
@@ -140,7 +163,7 @@ export function createConfigurationFeature({
140
163
  getOperationsSummary,
141
164
  onNavigationChange,
142
165
  onRemoveModel: (model) => {
143
- if (modelSetup?.isOpen()) return;
166
+ if (modelSetup?.isOpen() || memoryConnection.isOpen()) return;
144
167
  return modelRemoval.remove(model);
145
168
  },
146
169
  dom: {
@@ -164,7 +187,7 @@ export function createConfigurationFeature({
164
187
  return result;
165
188
  },
166
189
  onAddModel: async (options) => {
167
- if (modelSetup?.isOpen()) return;
190
+ if (modelSetup?.isOpen() || memoryConnection.isOpen()) return;
168
191
  if (!configWorkspace.beginExternalRuntimeMutation("model setup")) return;
169
192
  configWorkspace.endExternalRuntimeMutation();
170
193
  try {
@@ -215,6 +238,7 @@ export function createConfigurationFeature({
215
238
  root: dom.configDashboard.parentElement,
216
239
  getEnvironmentId: selectedEnvironmentId,
217
240
  loadSetup: () => runtimeClient.loadModelSetup(selectedEnvironmentId()),
241
+ inspectConnection: (input) => runtimeClient.inspectModelConnection(input, selectedEnvironmentId()),
218
242
  saveModel: (input) =>
219
243
  runtimeClient.addRuntimeModel(input, selectedEnvironmentId()),
220
244
  applySetup: () =>
@@ -269,7 +293,7 @@ export function createConfigurationFeature({
269
293
  void longTermMemoryController.setOriginFilter("passive_observation");
270
294
  longTermMemoryManager.focus();
271
295
  },
272
- prepareDiscardChanges: (...args) => {
296
+ prepareDiscardChanges: async (...args) => {
273
297
  if (pluginManager.hasConfigurationDraft()) {
274
298
  dom.configStatus.textContent =
275
299
  "Finish or cancel plugin configuration before leaving.";
@@ -280,12 +304,18 @@ export function createConfigurationFeature({
280
304
  "Finish or cancel model setup before leaving configuration.";
281
305
  return null;
282
306
  }
283
- const prepared = prepareDiscardChanges(...args);
307
+ if (memoryConnection.isOpen()) {
308
+ dom.configStatus.textContent =
309
+ "Finish or cancel embedding connection setup before leaving.";
310
+ return null;
311
+ }
312
+ const prepared = await prepareDiscardChanges(...args);
284
313
  if (typeof prepared !== "function") return prepared;
285
314
  const commit = () => prepared();
286
315
  commit.canCommit = () => {
287
316
  if (pluginManager.hasConfigurationDraft()) return false;
288
317
  if (modelSetup.isOpen()) return false;
318
+ if (memoryConnection.isOpen()) return false;
289
319
  return prepared.canCommit?.() !== false;
290
320
  };
291
321
  return commit;
@@ -1,3 +1,5 @@
1
+ import { bindSessionSearchDisclosure } from "../components/session-search-disclosure.js";
2
+ import { bindReasoningBudgetMenu } from "./reasoning-budget-menu-events.js";
1
3
  import { beginConversationNavigation, canNavigateConversation } from "./conversation-navigation-intent.js";
2
4
  import {
3
5
  focusSelectedMenuItem,
@@ -34,6 +36,7 @@ export function createAppEventBindings({
34
36
  }
35
37
  const isCurrentNavigation = beginConversationNavigation(state);
36
38
  const navigationRevision = shell.navigationRevision?.();
39
+ const navigationRequest = shell.navigationRequestRevision?.();
37
40
  const environment = actions.selectedEnvironmentId?.();
38
41
  const session = state.currentSessionId;
39
42
  const prepared = await prepareQueueRecovery();
@@ -43,6 +46,7 @@ export function createAppEventBindings({
43
46
  if (prepared?.canCommit?.() === false) return false;
44
47
  const hasCurrentWorkspaceNavigation = navigationRevision === shell.navigationRevision?.();
45
48
  if (!hasCurrentWorkspaceNavigation) return false;
49
+ if (navigationRequest !== shell.navigationRequestRevision?.()) return false;
46
50
  if (actions.selectedEnvironmentId?.() !== environment) return false;
47
51
  if (state.currentSessionId !== session) return false;
48
52
  return () => {
@@ -57,7 +61,42 @@ export function createAppEventBindings({
57
61
  };
58
62
  }
59
63
 
64
+ async function newConversation({ canCommit = () => true } = {}) {
65
+ if (!canCommit()) return false;
66
+ const recovery = await prepareCurrentQueueRecovery();
67
+ if (!recovery || !canCommit()) return false;
68
+ const preparedWorkspaceActivation = await shell.prepareWorkspaceActivation(
69
+ "chat",
70
+ { focus: false },
71
+ );
72
+ if (!preparedWorkspaceActivation || !canCommit()) return false;
73
+ if (preparedWorkspaceActivation.canCommit?.() === false) return false;
74
+ if (recovery() === false) return false;
75
+ if (preparedWorkspaceActivation() === false) return false;
76
+ state.currentSessionId = createWebSessionId();
77
+ onSessionCreated(state.currentSessionId);
78
+ actions.saveSessionId(
79
+ actions.selectedEnvironmentId(),
80
+ state.currentSessionId,
81
+ );
82
+ actions.rememberModelSelection();
83
+ state.messages = [];
84
+ actions.resetLiveRequestView();
85
+ actions.setCurrentSessionTitle(state.currentSessionId);
86
+ actions.applyConversationChrome();
87
+ actions.subscribeSession(state.currentSessionId);
88
+ actions.renderSessions();
89
+ actions.renderMessages();
90
+ shell.setSessionsDrawerOpen(false);
91
+ dom.composerInput.focus();
92
+ return true;
93
+ }
94
+
60
95
  function bind() {
96
+ bindReasoningBudgetMenu({ state, dom, actions, modelSelector, documentRoot });
97
+ bindSessionSearchDisclosure({
98
+ toggle: dom.sessionSearchToggleButton, field: dom.sessionSearchField, input: dom.sessionSearchInput,
99
+ });
61
100
  let searchTimer;
62
101
  dom.sessionSearchInput.addEventListener("input", () => {
63
102
  state.sessionQuery = dom.sessionSearchInput.value;
@@ -69,33 +108,7 @@ export function createAppEventBindings({
69
108
  "click",
70
109
  () => void actions.loadSessions(),
71
110
  );
72
- dom.newSessionButton.addEventListener("click", async () => {
73
- const recovery = await prepareCurrentQueueRecovery();
74
- if (!recovery) return;
75
- const preparedWorkspaceActivation = shell.prepareWorkspaceActivation(
76
- "chat",
77
- { focus: false },
78
- );
79
- if (!preparedWorkspaceActivation) return;
80
- if (recovery() === false) return;
81
- if (preparedWorkspaceActivation() === false) return;
82
- state.currentSessionId = createWebSessionId();
83
- onSessionCreated(state.currentSessionId);
84
- actions.saveSessionId(
85
- actions.selectedEnvironmentId(),
86
- state.currentSessionId,
87
- );
88
- actions.rememberModelSelection();
89
- state.messages = [];
90
- actions.resetLiveRequestView();
91
- actions.setCurrentSessionTitle(state.currentSessionId);
92
- actions.applyConversationChrome();
93
- actions.subscribeSession(state.currentSessionId);
94
- actions.renderSessions();
95
- actions.renderMessages();
96
- shell.setSessionsDrawerOpen(false);
97
- dom.composerInput.focus();
98
- });
111
+ dom.newSessionButton.addEventListener("click", () => newConversation());
99
112
  dom.environmentSelect.addEventListener("change", environmentTransition.onSelectChange, true);
100
113
  dom.agentPickerButton.addEventListener("click", (event) => {
101
114
  event.stopPropagation();
@@ -199,7 +212,9 @@ export function createAppEventBindings({
199
212
  actions.renderPermissionMode();
200
213
  }
201
214
  actions.renderAgentMode();
202
- if (state.agentModeMenuOpen) focusSelectedMenuItem(dom.agentModeMenu);
215
+ if (state.agentModeMenuOpen) {
216
+ focusSelectedMenuItem(dom.agentModeMenu);
217
+ }
203
218
  });
204
219
  dom.agentModeButton.addEventListener("keydown", (event) => {
205
220
  if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return;
@@ -218,7 +233,7 @@ export function createAppEventBindings({
218
233
  event.stopPropagation(),
219
234
  );
220
235
  dom.agentModeMenu.addEventListener("keydown", (event) => {
221
- handleMenuNavigation(event, dom.agentModeMenu);
236
+ if (event.target.closest?.("[data-mode]")) handleMenuNavigation(event, dom.agentModeMenu);
222
237
  });
223
238
  documentRoot.addEventListener("click", (event) => {
224
239
  if (
@@ -306,6 +321,7 @@ export function createAppEventBindings({
306
321
 
307
322
  return {
308
323
  bind,
324
+ newConversation,
309
325
  ...environmentTransition,
310
326
  };
311
327
  }
@@ -0,0 +1,105 @@
1
+ import { isColorPaletteId, PALETTE_PREFERENCE_KEY, savedColorPalette } from "../lib/color-palettes.js";
2
+ import { isNavigationMode, NAVIGATION_PREFERENCE_KEY, savedNavigationMode } from "../lib/navigation-display.js";
3
+
4
+ export function createAppearanceController({ storage, applyPalette, applyNavigationMode = () => {}, onChange = () => {} }) {
5
+ let savedId = savedColorPalette(storage);
6
+ let selectedId = savedId;
7
+ let savedNavigation = savedNavigationMode(storage);
8
+ let selectedNavigation = savedNavigation;
9
+ let open = false;
10
+ let pending = false;
11
+ let error = "";
12
+ const state = () => ({ savedId, selectedId, savedNavigationMode: savedNavigation, selectedNavigationMode: selectedNavigation, open, pending, error });
13
+ const render = () => onChange(state());
14
+ const canPreviewAppearance = () => open && !pending;
15
+ applyPalette(savedId);
16
+ applyNavigationMode(savedNavigation);
17
+
18
+ function restoreAcknowledgedAppearance() {
19
+ savedId = savedColorPalette(storage);
20
+ selectedId = savedId;
21
+ savedNavigation = savedNavigationMode(storage);
22
+ selectedNavigation = savedNavigation;
23
+ applyPalette(savedId);
24
+ applyNavigationMode(savedNavigation);
25
+ }
26
+
27
+ const unsubscribe = storage.subscribe?.(() => {
28
+ const previousSavedId = savedId;
29
+ const previousSavedNavigation = savedNavigation;
30
+ savedId = savedColorPalette(storage);
31
+ savedNavigation = savedNavigationMode(storage);
32
+ if (followsSavedAppearance(open, selectedId, previousSavedId)) {
33
+ selectedId = savedId;
34
+ applyPalette(savedId);
35
+ }
36
+ if (followsSavedAppearance(open, selectedNavigation, previousSavedNavigation)) {
37
+ selectedNavigation = savedNavigation;
38
+ applyNavigationMode(savedNavigation);
39
+ }
40
+ render();
41
+ });
42
+
43
+ return {
44
+ state,
45
+ open() {
46
+ if (open) return;
47
+ restoreAcknowledgedAppearance();
48
+ error = "";
49
+ open = true;
50
+ render();
51
+ },
52
+ select(id) {
53
+ if (!canPreviewAppearance()) return;
54
+ if (!isColorPaletteId(id)) return;
55
+ selectedId = id;
56
+ error = "";
57
+ applyPalette(id);
58
+ render();
59
+ },
60
+ selectNavigationMode(mode) {
61
+ if (!canPreviewAppearance()) return;
62
+ if (!isNavigationMode(mode)) return;
63
+ selectedNavigation = mode;
64
+ error = "";
65
+ applyNavigationMode(mode);
66
+ render();
67
+ },
68
+ close() {
69
+ if (pending) return false;
70
+ open = false;
71
+ restoreAcknowledgedAppearance();
72
+ render();
73
+ return true;
74
+ },
75
+ async save() {
76
+ if (!canPreviewAppearance()) return;
77
+ const paletteToSave = selectedId;
78
+ const navigationToSave = selectedNavigation;
79
+ pending = true;
80
+ error = "";
81
+ render();
82
+ try {
83
+ if (paletteToSave !== savedColorPalette(storage))
84
+ await storage.setItem(PALETTE_PREFERENCE_KEY, paletteToSave);
85
+ if (navigationToSave !== savedNavigationMode(storage))
86
+ await storage.setItem(NAVIGATION_PREFERENCE_KEY, navigationToSave);
87
+ open = false;
88
+ } catch (failure) {
89
+ error = failure?.message || "Could not save appearance settings. Reload and try again.";
90
+ } finally {
91
+ pending = false;
92
+ restoreAcknowledgedAppearance();
93
+ render();
94
+ }
95
+ },
96
+ destroy() {
97
+ unsubscribe?.();
98
+ restoreAcknowledgedAppearance();
99
+ },
100
+ };
101
+ }
102
+
103
+ function followsSavedAppearance(open, selected, previouslySaved) {
104
+ return !open || selected === previouslySaved;
105
+ }
@@ -380,8 +380,16 @@ export function createAutomationsController({
380
380
  eventRefresh.schedule();
381
381
  }
382
382
 
383
+ function captureActionScope() {
384
+ const continuation = captureView().captureContinuation();
385
+ const draftRevision = state.draft?.revision;
386
+ const publishedRevision = state.publishedDefinition?.revision;
387
+ return () => continuation.isCurrent() && draftRevision === state.draft?.revision &&
388
+ publishedRevision === state.publishedDefinition?.revision;
389
+ }
390
+
383
391
  return {
384
- snapshot, openRoute, refresh, create,
392
+ snapshot, openRoute, refresh, create, captureActionScope,
385
393
  createTemplate: (templateId) => create(templateId), deleteDraft, mutateDraft, saveDefinition,
386
394
  saveNode, saveAgent, validate, publishDefinition, setActive, undoDraftMove, restorePublishedDraft,
387
395
  archive: () => changeArchiveState(true), restore: () => changeArchiveState(false),
@@ -52,7 +52,7 @@ export interface ComposerFeatureOptions {
52
52
  recordControlEvent: ReturnType<typeof createRealtimeEventController>["recordControlEvent"];
53
53
  drafts?: ComposerDrafts;
54
54
  onChange?(): void;
55
- confirmReview?(message: string): boolean;
55
+ confirmReview?(message: string, options?: { title: string; confirmLabel: string }): boolean | Promise<boolean>;
56
56
  }
57
57
  export interface ComposerFeature extends ComposerSurface {
58
58
  queue: ComposerQueueController;
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../components/confirmation-dialog.js";
1
2
  import { createComposerDrafts } from "./composer-drafts.js";
2
3
  import { createComposerSubmissionLifecycle, ComposerSubmissionRefused } from "./composer-submission-lifecycle.js";
3
4
  import { createComposerAttachmentsController } from "./composer-attachments-controller.js";
@@ -14,7 +15,7 @@ export function createComposerFeature({
14
15
  getSubmissionBlock, onSubmissionBlocked, isVisible = () => true,
15
16
  renderSessions, renderMessages, applyConversationChrome, setMessageStatus, recordControlEvent,
16
17
  drafts = createComposerDrafts(), onChange = () => {},
17
- confirmReview = (message) => globalThis.confirm?.(message) === true,
18
+ confirmReview = confirmDialog,
18
19
  }) {
19
20
  const surfaces = [];
20
21
  let queue;
@@ -49,7 +50,12 @@ export function createComposerFeature({
49
50
  canDeleteAttachment: (file) => !drafts.contains(file) && !lifecycle.ownsAttachment(file) && !queue.ownsAttachment(file),
50
51
  });
51
52
  const notice = createComposerSubmissionNotice({ form: surfaceDom.composerForm, review: async (attempt) => {
52
- if (!confirmReview("Check the conversation first: this message may already have been sent. Restore it for manual review? Sending it again may repeat its actions.")) return;
53
+ const draft = currentDraft();
54
+ const revision = draft.revision;
55
+ if (!await confirmReview("Check the conversation first: this message may already have been sent. Restore it for manual review? Sending it again may repeat its actions.",
56
+ { title: "Review paused message", confirmLabel: "Restore for review" })) return;
57
+ if (!visible() || currentDraft() !== draft || draft.revision !== revision) return;
58
+ if (!lifecycle.paused(draft.scope).includes(attempt)) return;
53
59
  try { await lifecycle.restoreForManualReview(attempt.id, queue.authorizeReview); }
54
60
  catch (error) { reportFailure(attempt.payload.scope, error.message); }
55
61
  }, recover: async (scope) => {
@@ -75,7 +81,8 @@ export function createComposerFeature({
75
81
  function send(action) {
76
82
  let draft = currentDraft();
77
83
  draft.text = surfaceDom.composerInput.value.trim();
78
- const settings = getSettings();
84
+ const configured = getSettings();
85
+ const settings = { ...configured, ...(configured.reasoningPreference ? { reasoningPreference: { ...configured.reasoningPreference } } : {}) };
79
86
  if (!draft.scope.sessionId) { ensureBoundSession(); draft = currentDraft(); }
80
87
  const activeRequestId = allowsActiveRequest ? state.activeRequestId : "";
81
88
  return lifecycle.submit({ draft, action, settings,
@@ -22,7 +22,7 @@ export interface ComposerQueueControllerOptions {
22
22
  reportFailure(scope: ComposerScope, summary: string): void;
23
23
  reportRecovery?(scope: ComposerScope, summary: string): void;
24
24
  onChange?(): void;
25
- confirmTakeover?(message: string): boolean;
25
+ confirmTakeover?(message: string, options?: { title: string; confirmLabel: string }): boolean | Promise<boolean>;
26
26
  }
27
27
 
28
28
  export interface ComposerQueueController {
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../components/confirmation-dialog.js";
1
2
  import { ComposerSubmissionRefused, isDefiniteSubmissionRefusal } from "./composer-submission-lifecycle.js";
2
3
 
3
4
  const scopeKey = (scope) => JSON.stringify([scope.environmentId, scope.sessionId]);
@@ -11,7 +12,7 @@ function hasConversationQueueScope(scope) {
11
12
  export function createComposerQueueController({
12
13
  queue, drafts, lifecycle, getDraft, requests, getSettings,
13
14
  isCurrentScope, reportFailure, reportRecovery = () => {}, onChange = () => {},
14
- confirmTakeover = (message) => globalThis.confirm?.(message) === true,
15
+ confirmTakeover = confirmDialog,
15
16
  }) {
16
17
  const processing = new Map();
17
18
  const bindings = new Map();
@@ -112,8 +113,13 @@ export function createComposerQueueController({
112
113
  }
113
114
  let claimed = await queue.claimBlockedRelease(scope, release.releaseToken);
114
115
  if (!claimed) {
115
- const approved = confirmTakeover("This queued message may have been sent or may belong to another window. Close that window and check the conversation before taking ownership for manual review. Sending it again may repeat its actions. Continue?");
116
+ if (!isCurrentScope(scope)) return false;
117
+ const revision = draft.revision;
118
+ const approved = await confirmTakeover("This queued message may have been sent or may belong to another window. Close that window and check the conversation before taking ownership for manual review. Sending it again may repeat its actions. Continue?",
119
+ { title: "Review queued message", confirmLabel: "Take ownership" });
116
120
  if (!approved) return false;
121
+ if (!isCurrentScope(scope) || draft.revision !== revision) return false;
122
+ if (queue.getBlockedRelease(scope)?.releaseToken !== release.releaseToken) return false;
117
123
  claimed = await queue.claimBlockedRelease(scope, release.releaseToken, { takeover: true });
118
124
  }
119
125
  if (!claimed) throw new Error("This queued message changed before it could be recovered.");
@@ -168,7 +174,7 @@ export function createComposerQueueController({
168
174
  const item = released.item;
169
175
  const attempt = await lifecycle.submitCaptured({
170
176
  action: "send", payload: { scope, text: item.text, attachments: item.attachments, release: released },
171
- settings: { agentMode: item.agentMode, toolPermissionMode: item.toolPermissionMode, modelPreference: item.modelPreference },
177
+ settings: { agentMode: item.agentMode, toolPermissionMode: item.toolPermissionMode, modelPreference: item.modelPreference, ...(item.reasoningPreference ? { reasoningPreference: item.reasoningPreference } : {}) },
172
178
  prepare: async (submission) => { await prepareManualSend(submission); requests.prepareView(submission); },
173
179
  execute: send, accepted: bindAccepted, prepareRestore,
174
180
  });
@@ -2,7 +2,7 @@ import type { SessionComposerQueueItem, ReleasedSessionComposerQueueItem } from
2
2
  import type { ComposerAttachment, ComposerDraft, ComposerDraftSnapshot, ComposerDrafts, ComposerScope } from "./composer-drafts.js";
3
3
 
4
4
  export type ComposerSubmissionAction = "send" | "send_next" | "steer";
5
- export type ComposerSubmissionSettings = Pick<SessionComposerQueueItem, "agentMode" | "toolPermissionMode" | "modelPreference">;
5
+ export type ComposerSubmissionSettings = Pick<SessionComposerQueueItem, "agentMode" | "toolPermissionMode" | "modelPreference" | "reasoningPreference">;
6
6
  export type ComposerSubmissionPhase = "preparing" | "sending" | "accepted" | "refused" | "uncertain" | "restored";
7
7
 
8
8
  export interface ComposerSubmissionAttempt<Settings = unknown, Result = unknown> {