@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
@@ -6,6 +6,8 @@ import { renderProjectSessionGroups } from "./components/project-session-groups.
6
6
  export function createProjectsFeature({
7
7
  dom,
8
8
  state,
9
+ preferences,
10
+ confirmAction,
9
11
  client,
10
12
  shell,
11
13
  selectedEnvironmentId,
@@ -23,6 +25,7 @@ export function createProjectsFeature({
23
25
  const expandedProjectSessionIds = new Set();
24
26
  const controller = createProjectsController({
25
27
  client,
28
+ confirmAction,
26
29
  getEnvironmentId: selectedEnvironmentId,
27
30
  isRuntimeReady,
28
31
  getConversationRevision: () =>
@@ -76,21 +79,40 @@ export function createProjectsFeature({
76
79
 
77
80
  function syncProjectGroupEnvironment() {
78
81
  const environmentId = selectedEnvironmentId();
79
- if (groupEnvironmentId === environmentId) return;
80
- groupEnvironmentId = environmentId;
82
+ if (groupEnvironmentId !== environmentId) {
83
+ groupEnvironmentId = environmentId;
84
+ collapsedProjectIds.clear();
85
+ expandedProjectSessionIds.clear();
86
+ }
87
+ const saved = preferences?.loadCollapsedProjectIds?.(environmentId);
88
+ if (!saved) return;
81
89
  collapsedProjectIds.clear();
82
- expandedProjectSessionIds.clear();
90
+ for (const projectId of saved) collapsedProjectIds.add(projectId);
83
91
  }
84
92
 
85
- function rememberProjectGroupCollapse(projectId, collapsed) {
93
+ async function rememberProjectGroupCollapse(projectId, collapsed) {
86
94
  syncProjectGroupEnvironment();
87
95
  const isSearchingSessions = Boolean(String(state.sessionQuery ?? "").trim());
88
96
  if (isSearchingSessions) return;
89
- if (collapsed) {
90
- collapsedProjectIds.add(projectId);
91
- return;
92
- }
93
97
  collapsedProjectIds.delete(projectId);
98
+ if (collapsed) collapsedProjectIds.add(projectId);
99
+ try {
100
+ await preferences?.saveCollapsedProjectIds?.(groupEnvironmentId, [...collapsedProjectIds]);
101
+ } catch {
102
+ renderSessions();
103
+ shell.showToast("Could not save project visibility in ABot", "failed");
104
+ }
105
+ }
106
+
107
+ async function requestProjectDeletion(projectId, projectName) {
108
+ const environmentId = selectedEnvironmentId();
109
+ await controller.deleteProject(projectId, projectName);
110
+ if (selectedEnvironmentId() !== environmentId) return;
111
+ if (dom.sessionsPanel.hidden) return;
112
+ const documentRoot = dom.sessionsList.ownerDocument;
113
+ if (!documentRoot) return;
114
+ if (documentRoot.activeElement !== documentRoot.body) return;
115
+ dom.newProjectButton.focus();
94
116
  }
95
117
 
96
118
  function rememberProjectSessionExpansion(projectId, expanded) {
@@ -117,6 +139,7 @@ export function createProjectsFeature({
117
139
 
118
140
  return {
119
141
  load: controller.load,
142
+ getDeletedProjectIds: controller.getDeletedProjectIds,
120
143
  refreshAvailability,
121
144
  runtimeAvailabilityChanged() {
122
145
  refreshAvailability();
@@ -139,21 +162,28 @@ export function createProjectsFeature({
139
162
  root,
140
163
  sessions,
141
164
  createSessionItem,
165
+ newProjectButton: dom.newProjectButton,
142
166
  ...controller.snapshot(),
167
+ deletedProjectIds: controller.getDeletedProjectIds(),
143
168
  query: state.sessionQuery,
144
169
  collapsedProjectIds,
145
170
  expandedProjectSessionIds,
146
171
  onToggleGroup: rememberProjectGroupCollapse,
147
172
  onToggleProjectSessions: rememberProjectSessionExpansion,
148
173
  onNewConversation: controller.newConversation,
174
+ onDeleteProject: requestProjectDeletion,
149
175
  onRetry: () => void controller.load(),
150
176
  });
151
177
  return true;
152
178
  },
153
179
  bind() {
154
- dom.newProjectButton.addEventListener("click", () => {
180
+ dom.newProjectButton.addEventListener("click", async () => {
155
181
  if (!canUseProjects()) return;
156
- if (!shell.activateWorkspace("chat", { focus: false })) return;
182
+ const environmentId = selectedEnvironmentId();
183
+ const conversationRevision = JSON.stringify([state.currentSessionId, state.sessionViewVersion]);
184
+ if (!await shell.activateWorkspace("chat", { focus: false })) return;
185
+ if (environmentId !== selectedEnvironmentId() || !canUseProjects()) return;
186
+ if (conversationRevision !== JSON.stringify([state.currentSessionId, state.sessionViewVersion])) return;
157
187
  shell.setSessionsDrawerOpen(false);
158
188
  closeFilePreview();
159
189
  controller.openCreate();
@@ -37,6 +37,7 @@ export function createRuntimeOnboardingFeature({
37
37
  return createRuntimeSetupGuide({
38
38
  ...common,
39
39
  loadSetup: () => runtimeClient.getRuntimeSetup(),
40
+ inspectConnection: (input) => runtimeClient.inspectModelConnection(input, selectedEnvironmentId()),
40
41
  openConfiguration: () => dom.modelsWorkspaceButton?.click(),
41
42
  saveSetup: (input) => runtimeClient.saveRuntimeSetup(input),
42
43
  applySetup: () =>
@@ -19,6 +19,7 @@ export function createSchedulesFeature({
19
19
  let view;
20
20
  let active = false;
21
21
  let navigationRevision = 0;
22
+ let navigationRequest = 0;
22
23
  let runtimeReady = isRuntimeReady();
23
24
  const controller = createSchedulesController({
24
25
  client,
@@ -56,6 +57,7 @@ export function createSchedulesFeature({
56
57
  root: dom.schedulesRoot,
57
58
  actions: controller,
58
59
  getCurrentSessionId,
60
+ getEnvironmentId: selectedEnvironmentId,
59
61
  getAgentModes,
60
62
  });
61
63
  view.render(controller.snapshot());
@@ -78,7 +80,7 @@ export function createSchedulesFeature({
78
80
  if (destination !== "schedules") return true;
79
81
  return client.supportsSchedules();
80
82
  },
81
- prepareLeave: view.prepareLeave,
83
+ prepareLeave: view.prepareEnvironmentChange,
82
84
  prepareEnvironmentChange: view.prepareEnvironmentChange,
83
85
  navigationRevision: () => navigationRevision,
84
86
  selectedJobId: () => controller.snapshot().selectedId,
@@ -88,18 +90,39 @@ export function createSchedulesFeature({
88
90
  },
89
91
  async openJob(jobId) {
90
92
  if (!client.supportsSchedules()) return false;
91
- if (!view.prepareLeave()) return false;
92
- if (!shell.activateWorkspace("schedules")) return false;
93
+ if (!await commitScheduleNavigation()) return false;
93
94
  await controller.openJob(jobId);
94
95
  return true;
95
96
  },
96
- createJob(initialValues) {
97
+ async createJob(initialValues) {
97
98
  if (!client.supportsSchedules()) return;
98
- if (!shell.activateWorkspace("schedules")) return;
99
+ if (!await commitScheduleNavigation()) return;
99
100
  void controller.openCreate(initialValues);
100
101
  },
101
102
  };
102
103
 
104
+ async function commitScheduleNavigation() {
105
+ const request = ++navigationRequest;
106
+ const environment = selectedEnvironmentId();
107
+ const revision = navigationRevision;
108
+ const workspaceRequest = shell.navigationRequestRevision?.();
109
+ const preparedDiscard = await view.prepareEnvironmentChange();
110
+ if (!preparedDiscard) return false;
111
+ if (!isCurrentScheduleNavigation()) return false;
112
+ if (workspaceRequest !== shell.navigationRequestRevision?.()) return false;
113
+ const activate = await shell.prepareWorkspaceActivation("schedules");
114
+ if (!activate || !isCurrentScheduleNavigation()) return false;
115
+ if (activate.canCommit?.() === false) return false;
116
+ if (!preparedDiscard()) return false;
117
+ return activate();
118
+ function isCurrentScheduleNavigation() {
119
+ if (request !== navigationRequest) return false;
120
+ if (environment !== selectedEnvironmentId()) return false;
121
+ if (revision !== navigationRevision) return false;
122
+ return preparedDiscard.canCommit() !== false;
123
+ }
124
+ }
125
+
103
126
  function isScheduleSurfaceReady() {
104
127
  if (documentRoot?.visibilityState === "hidden") return false;
105
128
  return isRuntimeReady();
@@ -1,3 +1,4 @@
1
+ import type { ConversationReasoningPreferences } from "./conversation-reasoning-preferences.js";
1
2
  import type { ToolPermissionMode } from "../lib/tool-permission-mode.js";
2
3
 
3
4
  type PreferenceMap = Record<string, unknown>;
@@ -15,11 +16,13 @@ type PreferenceStorage = {
15
16
  snapshot?(): { preferences: Record<string, string> } | null;
16
17
  };
17
18
 
18
- export declare function createClientPreferences(storage: PreferenceStorage): {
19
+ export declare function createClientPreferences(storage: PreferenceStorage): ConversationReasoningPreferences & {
19
20
  subscribe(listener: () => void): (() => void) | undefined;
20
21
  flush(): Promise<void> | undefined;
21
22
  loadSessionSidebar(environmentId: string): SessionSidebarPreferences;
22
23
  saveSessionSidebar(environmentId: string, value: SessionSidebarPreferences): void | Promise<unknown>;
24
+ loadCollapsedProjectIds(environmentId: string): string[];
25
+ saveCollapsedProjectIds(environmentId: string, ids: readonly string[]): void | Promise<unknown>;
23
26
  loadPinnedSessions(): string[];
24
27
  savePinnedSessions(sessionIds: readonly string[]): void | Promise<unknown>;
25
28
  loadSessionModes(normalize: (value: unknown) => ToolPermissionMode): SessionModeMap;
@@ -1,3 +1,4 @@
1
+ import { createConversationReasoningPreferences } from "./conversation-reasoning-preferences.js";
1
2
  import { createSessionSidebarPreferences } from "./session-sidebar-preferences.js";
2
3
 
3
4
  const storageKeys = {
@@ -39,6 +40,7 @@ export function createClientPreferences(storage) {
39
40
  subscribe: (listener) => storage.subscribe?.(listener),
40
41
  flush: () => storage.flush?.(),
41
42
  ...createSessionSidebarPreferences(storage),
43
+ ...createConversationReasoningPreferences(storage),
42
44
  loadPinnedSessions() {
43
45
  try {
44
46
  const acknowledged = storage.snapshot?.();
@@ -0,0 +1,11 @@
1
+ import type { ModelReasoningPreference } from "../../../shared/model-reasoning.js";
2
+ export type ReasoningPreferenceScope = { environmentId: string; sessionId?: string };
3
+ export interface ConversationReasoningPreferences {
4
+ loadReasoningPreference(scope: ReasoningPreferenceScope, profileId: string): ModelReasoningPreference | undefined;
5
+ saveReasoningPreference(scope: ReasoningPreferenceScope, profileId: string, preference?: ModelReasoningPreference): void | Promise<unknown>;
6
+ }
7
+ export declare const REASONING_PREFERENCES_KEY: string;
8
+ export declare function createConversationReasoningPreferences(storage: {
9
+ getItem(key: string): string | null;
10
+ setItem(key: string, value: string): void | Promise<unknown>;
11
+ }): ConversationReasoningPreferences;
@@ -0,0 +1,30 @@
1
+ import { isReasoningPreference } from "../lib/reasoning-preference.js";
2
+
3
+ export const REASONING_PREFERENCES_KEY = "abot-web.reasoningPreferences";
4
+ export function createConversationReasoningPreferences(storage) {
5
+ const keyFor = (scope, profileId) => JSON.stringify([scope.environmentId, scope.sessionId || "", profileId]);
6
+ function read() {
7
+ const raw = storage?.getItem(REASONING_PREFERENCES_KEY);
8
+ if (!raw) return {};
9
+ const value = JSON.parse(raw);
10
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Invalid saved thinking preferences.");
11
+ return value;
12
+ }
13
+ return {
14
+ loadReasoningPreference(scope, profileId) {
15
+ const value = read()[keyFor(scope, profileId)];
16
+ if (value === undefined) return undefined;
17
+ if (!isReasoningPreference(value) || value.profileId !== profileId) throw new Error("Invalid saved thinking preference.");
18
+ return { ...value };
19
+ },
20
+ saveReasoningPreference(scope, profileId, preference) {
21
+ if (preference !== undefined && (!isReasoningPreference(preference) || preference.profileId !== profileId))
22
+ throw new Error("Thinking preference must match the selected model.");
23
+ const values = read();
24
+ const key = keyFor(scope, profileId);
25
+ if (preference === undefined) delete values[key];
26
+ else values[key] = { ...preference };
27
+ return storage.setItem(REASONING_PREFERENCES_KEY, JSON.stringify(values));
28
+ },
29
+ };
30
+ }
@@ -60,10 +60,12 @@ export function createAutomationRequests({ requestApi, getEnvironmentId, getConf
60
60
  requestAutomation(`${path("/catalog", environmentId)}&automation=${encodeURIComponent(automationId)}`),
61
61
  requestAutomation(`/chat/models?environment=${encodeURIComponent(environmentId)}`),
62
62
  ]);
63
- return { ...catalog, models: (catalog.models || []).map((model) => ({
64
- ...model,
65
- supportsThinking: modelCatalog.profiles?.find((profile) => profile.id === model.id)?.supportsThinking === true,
66
- })) };
63
+ return { ...catalog, models: (catalog.models || []).map((model) => {
64
+ const profile = modelCatalog.profiles?.find((item) => item.id === model.id);
65
+ const { reasoningControls: _authoringControls, ...metadata } = model;
66
+ return { ...metadata, supportsThinking: profile?.supportsThinking === true,
67
+ ...(profile?.reasoningControls ? { reasoningControls: profile.reasoningControls } : {}) };
68
+ }) };
67
69
  },
68
70
  startAutomationRun: (automationId, idempotencyKey, environmentId) =>
69
71
  post(path(`/${encodeURIComponent(automationId)}/run`, environmentId), { idempotencyKey }),
@@ -5,6 +5,11 @@ export function createConfigurationRequests({ requestApi, environmentQuery }) {
5
5
  path + "?environment=" + environmentQuery(environmentId);
6
6
  return {
7
7
  ...createPluginConfigurationRequests({ requestApi, environmentQuery }),
8
+ inspectModelConnection(input, environmentId) {
9
+ return requestApi(scoped("/runtime/setup/connection", environmentId), {
10
+ method: "POST", body: JSON.stringify(input),
11
+ });
12
+ },
8
13
  getRuntimeSetup(environmentId) {
9
14
  return requestApi(scoped("/runtime/setup", environmentId));
10
15
  },
@@ -41,6 +41,27 @@ export function createLongTermMemoryRequests({
41
41
  });
42
42
  },
43
43
 
44
+ saveMemoryEmbeddingConnection(input, environmentId = getEnvironmentId()) {
45
+ return requestApi(
46
+ `/runtime/memory/connection?environment=${environmentQuery(environmentId)}`,
47
+ { method: "POST", body: JSON.stringify(input) },
48
+ );
49
+ },
50
+
51
+ saveMemoryEmbeddingProfile(input, environmentId = getEnvironmentId()) {
52
+ return requestApi("/runtime/memory/profiles", {
53
+ method: "POST",
54
+ body: JSON.stringify({ ...input, environment: environmentId }),
55
+ });
56
+ },
57
+
58
+ removeMemoryEmbeddingProfile({ profileId }, environmentId = getEnvironmentId()) {
59
+ return requestApi("/runtime/memory/profiles", {
60
+ method: "DELETE",
61
+ body: JSON.stringify({ profileId, environment: environmentId }),
62
+ });
63
+ },
64
+
44
65
  disableLongTermMemory(environmentId = getEnvironmentId()) {
45
66
  return requestApi("/runtime/memory/disable", {
46
67
  method: "POST",
@@ -3,9 +3,10 @@ import type { SessionProject } from "../../../../sessions/project-binding.js";
3
3
 
4
4
  export interface ProjectRequests {
5
5
  supportsProjects(): boolean;
6
- listProjects(environmentId?: string): Promise<{ projects: readonly RuntimeProject[] }>;
6
+ listProjects(environmentId?: string): Promise<{ projects: readonly RuntimeProject[]; deletedProjectIds?: readonly string[] }>;
7
7
  browseProjectFolders(directory?: string, cursor?: string, environmentId?: string): Promise<ProjectFolderPage>;
8
8
  createProject(input: { name: string; directory: string }, environmentId?: string): Promise<{ project: RuntimeProject }>;
9
+ deleteProject(projectId: string, environmentId?: string): Promise<{ ok: true }>;
9
10
  createProjectSession(projectId: string, environmentId?: string): Promise<{
10
11
  sessionId: string;
11
12
  project: SessionProject;
@@ -25,6 +25,10 @@ export function createProjectRequests({
25
25
  method: "POST",
26
26
  body: JSON.stringify(input),
27
27
  }),
28
+ deleteProject: (projectId, environmentId) =>
29
+ requestProjects(path("/" + encodeURIComponent(projectId), environmentId), {
30
+ method: "DELETE", body: "{}",
31
+ }),
28
32
  createProjectSession: (projectId, environmentId) =>
29
33
  requestProjects(
30
34
  path(`/${encodeURIComponent(projectId)}/sessions`, environmentId),
@@ -41,6 +41,7 @@ export function createToolApprovalRequests({
41
41
  requestId,
42
42
  approvalId,
43
43
  approved,
44
+ reason,
44
45
  generation,
45
46
  waitId,
46
47
  revision,
@@ -57,6 +58,7 @@ export function createToolApprovalRequests({
57
58
  sessionId,
58
59
  requestId,
59
60
  approved,
61
+ ...(reason !== undefined ? { reason } : {}),
60
62
  ...(waitId ? { generation, waitId, revision, commandId } : {}),
61
63
  }),
62
64
  },
@@ -1,3 +1,4 @@
1
+ import type { MemoryEmbeddingConnectionInput } from "../../local-runtime/memory-embedding-connection-input.js";
1
2
  import type { NotificationRequests } from "./runtime-web-client/notifications.js";
2
3
  import type { SparkChatRequests } from "./runtime-web-client/spark-chat.js";
3
4
  import type { ProjectRequests } from "./runtime-web-client/projects.js";
@@ -114,7 +115,9 @@ export declare function createRuntimeWebClient(options: {
114
115
  listProjects: ProjectRequests["listProjects"];
115
116
  browseProjectFolders: ProjectRequests["browseProjectFolders"];
116
117
  createProject: ProjectRequests["createProject"];
118
+ deleteProject: ProjectRequests["deleteProject"];
117
119
  createProjectSession: ProjectRequests["createProjectSession"];
120
+ inspectModelConnection(input: Record<string, unknown>, environmentId?: string): Promise<{ connection: { models: readonly string[] } }>;
118
121
  getRuntimeSetup(environmentId?: string): Promise<Record<string, unknown>>;
119
122
  saveRuntimeSetup(
120
123
  input: {
@@ -261,6 +264,7 @@ export declare function createRuntimeWebClient(options: {
261
264
  agentMode: string;
262
265
  toolPermissionMode: string;
263
266
  modelPreference?: Record<string, unknown> | null;
267
+ reasoningPreference?: import("../../../shared/model-reasoning.js").ModelReasoningPreference;
264
268
  }): Promise<string>;
265
269
  loadModelSetup(environmentId?: string): Promise<Record<string, unknown>>;
266
270
  addRuntimeModel(
@@ -296,6 +300,18 @@ export declare function createRuntimeWebClient(options: {
296
300
  profileId?: string;
297
301
  emitClientEvents: boolean;
298
302
  }): Promise<Record<string, unknown>>;
303
+ saveMemoryEmbeddingConnection(
304
+ input: MemoryEmbeddingConnectionInput,
305
+ environmentId?: string,
306
+ ): Promise<Record<string, unknown>>;
307
+ saveMemoryEmbeddingProfile(
308
+ input: { providerId: string; model: string; label: string },
309
+ environmentId?: string,
310
+ ): Promise<Record<string, unknown>>;
311
+ removeMemoryEmbeddingProfile(
312
+ input: { profileId: string },
313
+ environmentId?: string,
314
+ ): Promise<Record<string, unknown>>;
299
315
  disableLongTermMemory(
300
316
  environmentId?: string,
301
317
  ): Promise<Record<string, unknown>>;
@@ -300,6 +300,7 @@ export function createRuntimeWebClient({
300
300
  agentMode,
301
301
  toolPermissionMode,
302
302
  modelPreference,
303
+ reasoningPreference,
303
304
  }) {
304
305
  const permissionError = toolPermissionRequestError(
305
306
  toolPermissionMode,
@@ -320,6 +321,7 @@ export function createRuntimeWebClient({
320
321
  toolPermissionMode,
321
322
  attachments,
322
323
  ...(modelPreference ? { modelPreference } : {}),
324
+ ...(reasoningPreference !== undefined ? { reasoningPreference } : {}),
323
325
  }),
324
326
  });
325
327
  const requestId =
@@ -1,6 +1,6 @@
1
1
  const storageKey = "abot-web.sessionSidebarByEnvironment";
2
2
 
3
- function sessionIds(value) {
3
+ function preferenceIds(value) {
4
4
  if (!Array.isArray(value)) return [];
5
5
  return [...new Set(value.filter((id) => typeof id === "string" && id))];
6
6
  }
@@ -16,27 +16,47 @@ function readEnvironments(storage) {
16
16
  }
17
17
  }
18
18
 
19
+ function saveSidebarPreferenceFields(storage, environmentId, changedFields) {
20
+ const environments = readEnvironments(storage);
21
+ const saved = environments[environmentId];
22
+ const value = {
23
+ archivedSessionIds: preferenceIds(saved?.archivedSessionIds),
24
+ orderedSessionIds: preferenceIds(saved?.orderedSessionIds),
25
+ };
26
+ if (saved?.collapsedProjectIds !== undefined)
27
+ value.collapsedProjectIds = preferenceIds(saved.collapsedProjectIds);
28
+ Object.assign(value, changedFields);
29
+ Object.defineProperty(environments, environmentId, {
30
+ value,
31
+ enumerable: true,
32
+ configurable: true,
33
+ writable: true,
34
+ });
35
+ return storage.setItem(storageKey, JSON.stringify(environments));
36
+ }
37
+
19
38
  export function createSessionSidebarPreferences(storage) {
20
39
  return {
21
40
  loadSessionSidebar(environmentId) {
22
41
  const saved = readEnvironments(storage)[environmentId];
23
42
  return {
24
- archivedSessionIds: sessionIds(saved?.archivedSessionIds),
25
- orderedSessionIds: sessionIds(saved?.orderedSessionIds),
43
+ archivedSessionIds: preferenceIds(saved?.archivedSessionIds),
44
+ orderedSessionIds: preferenceIds(saved?.orderedSessionIds),
26
45
  };
27
46
  },
28
47
  saveSessionSidebar(environmentId, value) {
29
- const environments = readEnvironments(storage);
30
- Object.defineProperty(environments, environmentId, {
31
- value: {
32
- archivedSessionIds: sessionIds(value.archivedSessionIds),
33
- orderedSessionIds: sessionIds(value.orderedSessionIds),
34
- },
35
- enumerable: true,
36
- configurable: true,
37
- writable: true,
48
+ return saveSidebarPreferenceFields(storage, environmentId, {
49
+ archivedSessionIds: preferenceIds(value.archivedSessionIds),
50
+ orderedSessionIds: preferenceIds(value.orderedSessionIds),
51
+ });
52
+ },
53
+ loadCollapsedProjectIds(environmentId) {
54
+ return preferenceIds(readEnvironments(storage)[environmentId]?.collapsedProjectIds);
55
+ },
56
+ saveCollapsedProjectIds(environmentId, ids) {
57
+ return saveSidebarPreferenceFields(storage, environmentId, {
58
+ collapsedProjectIds: preferenceIds(ids),
38
59
  });
39
- return storage.setItem(storageKey, JSON.stringify(environments));
40
60
  },
41
61
  };
42
62
  }
@@ -6,9 +6,8 @@ export function createSkillsFeature({ dom, client, shell, getEnvironmentId,
6
6
  mountSkillsWorkspace(dom, documentRoot);
7
7
  let view;
8
8
  const controller = createSkillsController({ client, getEnvironmentId,
9
- confirmDiscard: (message) => viewport.confirm(message), render: (snapshot) => view?.render(snapshot) });
10
- view = createSkillsWorkspace({ root: dom.skillsRoot, actions: controller,
11
- confirmArchive: (message) => viewport.confirm(message) });
9
+ render: (snapshot) => view?.render(snapshot) });
10
+ view = createSkillsWorkspace({ root: dom.skillsRoot, actions: controller });
12
11
  view.render(controller.snapshot());
13
12
  shell.addWorkspaceGuard(({ from, to }) => {
14
13
  if (from !== "skills" || to === "skills") return true;
@@ -1,8 +1,10 @@
1
+ import { canChooseReasoningBudget, isReasoningPreference } from "./lib/reasoning-preference.js";
2
+ import { createConversationReasoningPreferences } from "./services/conversation-reasoning-preferences.js";
1
3
  import { canChooseReasoning } from "./lib/reasoning-controls.js";
2
4
  import { createComposerFeature } from "./controllers/composer-feature.js";
3
5
  import { createComposerDrafts } from "./controllers/composer-drafts.js";
4
6
  import { createComposerDraftView } from "./controllers/composer-draft-view.js";
5
- import { workspaceQueue } from "./services/workspace-state.js";
7
+ import { workspaceQueue, workspaceStorage } from "./services/workspace-state.js";
6
8
  import { createAppState } from "./app-state.js";
7
9
  import { createConversationViewFeature } from "./controllers/conversation-view-feature.js";
8
10
  import { createConversationSessionController } from "./controllers/conversation-session-controller.js";
@@ -27,6 +29,7 @@ export function createSparkChatConversation({
27
29
  captureHandoffNavigation, onHandoffOpened,
28
30
  }) {
29
31
  const state = createAppState();
32
+ const thinkingPreferences = createConversationReasoningPreferences(workspaceStorage());
30
33
  const drafts = createComposerDrafts();
31
34
  const draftView = createComposerDraftView({ input: dom.composerInput,
32
35
  getDraft: () => drafts.open({ environmentId: getEnvironmentId(), sessionId: state.currentSessionId }), isVisible: isOpen });
@@ -53,6 +56,14 @@ export function createSparkChatConversation({
53
56
  return profileId ? { profileId } : undefined;
54
57
  };
55
58
  const scope = () => ({ environmentId: getEnvironmentId(), sessionId: state.currentSessionId });
59
+ const reasoningScope = () => ({ environmentId: getEnvironmentId(), sessionId: getConfiguration()?.sessionId || state.currentSessionId });
60
+ function getReasoningPreference() {
61
+ const profileId = getConfiguration()?.modelProfileId || "";
62
+ const preference = thinkingPreferences.loadReasoningPreference(reasoningScope(), profileId);
63
+ if (preference && !canChooseReasoningBudget(getConfiguration()))
64
+ throw new Error("SPARK's model no longer supports this thinking override. Choose Profile default.");
65
+ return preference;
66
+ }
56
67
  const isScopeCurrent = (candidate) => candidate.environmentId === getEnvironmentId() && candidate.sessionId === state.currentSessionId;
57
68
  const steer = createSteerController({
58
69
  sendRealtime,
@@ -126,7 +137,7 @@ export function createSparkChatConversation({
126
137
  state, dom: { ...dom, composerInput: draftView.surface }, shell, client, sessionQueue,
127
138
  drafts, getDraft: draftView.current, conversationSession: session, conversationView: view,
128
139
  getEnvironmentId, ensureSession: () => session.ensureSession(),
129
- getSettings: () => ({ agentMode: state.agentMode, toolPermissionMode: getToolPermissionMode(), modelPreference: getModelPreference() }),
140
+ getSettings: () => ({ agentMode: state.agentMode, toolPermissionMode: getToolPermissionMode(), modelPreference: getModelPreference(), reasoningPreference: getReasoningPreference() }),
130
141
  steer: steer.steer, composerActions: actions,
131
142
  selectedModelSupportsImageInput: () => getConfiguration()?.supportsImageInput === true,
132
143
  isComposerAvailable: () => !getSubmissionBlock(), getSubmissionBlock,
@@ -189,8 +200,23 @@ export function createSparkChatConversation({
189
200
  }
190
201
  return {
191
202
  state, session, view, attachments, render, handleRealtime, bind, queue,
203
+ getReasoningPreference: () => thinkingPreferences.loadReasoningPreference(reasoningScope(), getConfiguration()?.modelProfileId || ""),
204
+ setReasoningPreference(preference) {
205
+ const profileId = getConfiguration()?.modelProfileId || "";
206
+ if (preference && (!canChooseReasoningBudget(getConfiguration()) || !isReasoningPreference(preference) || preference.profileId !== profileId))
207
+ throw new Error("Select a thinking preference supported by SPARK's current model.");
208
+ return thinkingPreferences.saveReasoningPreference(reasoningScope(), profileId, preference);
209
+ },
192
210
  prepareEnvironmentChange: () => queue.prepareRecoveryForNavigation(),
193
- setAgentMode(mode) { if (canChooseReasoning(getConfiguration())) state.agentMode = mode; },
211
+ async setAgentMode(mode) {
212
+ if (!canChooseReasoning(getConfiguration())) return;
213
+ const selectedScope = reasoningScope();
214
+ const profileId = getConfiguration()?.modelProfileId || "";
215
+ const preference = thinkingPreferences.loadReasoningPreference(selectedScope, profileId);
216
+ if (preference?.mode === "off") await thinkingPreferences.saveReasoningPreference(selectedScope, profileId, undefined);
217
+ if (JSON.stringify(selectedScope) !== JSON.stringify(reasoningScope()) || profileId !== getConfiguration()?.modelProfileId) return;
218
+ state.agentMode = mode;
219
+ },
194
220
  update() {
195
221
  state.connected = isConnected();
196
222
  draftView.display(); composer.changed(); updateSendState(); renderActivityStatus();
@@ -60,16 +60,20 @@ export function createSparkChatFeature({ dom, state: appState, client, shell, re
60
60
  if (Number.isFinite(readState.unreadCount)) panel.setUnread(readState.unreadCount);
61
61
  if (readState.readStateStatus === "unavailable") conversation.status("Read status is temporarily unavailable.");
62
62
  }
63
- function openSettings() {
64
- if (!shell.activateWorkspace("learning")) return;
65
- selectLearningView(dom.learningRoot, "chat", true);
63
+ async function openLearningSettings(view) {
64
+ const scope = getEnvironmentId();
65
+ const revision = accessRevision;
66
+ const activate = await shell.prepareWorkspaceActivation("learning");
67
+ if (!activate || !canCompleteSparkOpening(scope, revision)) return false;
68
+ if (!activate()) return false;
69
+ selectLearningView(dom.learningRoot, view, true);
66
70
  panel.setOpen(false, { focus: false });
71
+ return true;
67
72
  }
68
- function openModelSettings() {
69
- if (!shell.activateWorkspace("learning")) return;
70
- selectLearningView(dom.learningRoot, "settings", true);
73
+ const openSettings = () => openLearningSettings("chat");
74
+ async function openModelSettings() {
75
+ if (!await openLearningSettings("settings")) return;
71
76
  dom.learningRoot.querySelector('[data-learning-setting="proactiveModelProfileId"]')?.focus();
72
- panel.setOpen(false, { focus: false });
73
77
  }
74
78
  conversation = createSparkChatConversation({
75
79
  dom: panel.dom, client, shell, getEnvironmentId,
@@ -100,6 +104,8 @@ export function createSparkChatFeature({ dom, state: appState, client, shell, re
100
104
  settings = createSparkChatSettings({
101
105
  root: dom.learningRoot, getWebConfig: () => appState.config,
102
106
  getAgentMode: () => conversation.state.agentMode,
107
+ getReasoningPreference: () => conversation.getReasoningPreference(),
108
+ onReasoningPreferenceChange: (preference) => conversation.setReasoningPreference(preference),
103
109
  onAgentModeChange: (mode) => conversation.setAgentMode(mode),
104
110
  onSave: async (toolPermissionMode) => {
105
111
  const scope = getEnvironmentId();