@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
@@ -76,6 +76,7 @@ export function createRuntimeSelectionController({
76
76
  const label = selectedOption?.label || selected || "Environment";
77
77
  dom.agentPickerButton.hidden = false;
78
78
  dom.agentPickerButton.innerHTML = `
79
+ <span class="rail-icon rail-environment-icon" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="m12 3 9 5-9 5-9-5 9-5Zm-9 9 9 5 9-5M3 16l9 5 9-5" /></svg></span>
79
80
  <span class="rail-button-label">${escapeHtml(label)}</span>
80
81
  `;
81
82
  dom.agentPickerButton.title = `Environment: ${label}`;
@@ -174,18 +175,29 @@ export function createRuntimeSelectionController({
174
175
  }
175
176
 
176
177
  const {
177
- clearSessionMode, currentToolPermissionMode, initializeSessionMode,
178
+ clearSessionMode, currentToolPermissionMode, initializeSessionMode: initializeToolSessionMode,
178
179
  renderPermissionMode, setToolPermissionMode,
179
180
  } = createToolPermissionModeController({
180
181
  state, dom, preferences, recordControlEvent, getComposerSessionId,
181
182
  });
182
183
 
183
- const { renderAgentMode, loadAgentMode, setAgentMode } = createReasoningModeController({
184
- state, dom, client, selectedEnvironmentId,
184
+ const { renderAgentMode, loadAgentMode, setAgentMode, selectedReasoningPreference } = createReasoningModeController({
185
+ state, dom, client, selectedEnvironmentId, preferences,
186
+ getScope: () => ({ environmentId: selectedEnvironmentId(), sessionId: getComposerSessionId() }),
185
187
  selectedModelProfile: () => hasModelCatalogFromAnotherEnvironment() ? null : selectedModelProfile(),
186
188
  reloadModels: onReasoningConfigurationApplied || loadModels, recordControlEvent,
187
189
  });
188
190
 
191
+ function initializeSessionMode(sessionId) {
192
+ initializeToolSessionMode(sessionId);
193
+ const environmentId = selectedEnvironmentId();
194
+ const profileId = dom.modelSelect.value;
195
+ if (preferences.loadReasoningPreference?.({ environmentId, sessionId }, profileId)) return;
196
+ const preference = preferences.loadReasoningPreference?.({ environmentId, sessionId: "" }, profileId);
197
+ if (preference) void Promise.resolve(preferences.saveReasoningPreference({ environmentId, sessionId }, profileId, preference)).catch((error) =>
198
+ recordControlEvent({ type: "control", name: "Thinking preference save failed", tone: "failed", summary: error.message }));
199
+ }
200
+
189
201
  function renderModels() {
190
202
  dom.modelSelect.innerHTML = "";
191
203
  dom.modelSelect.disabled = state.modelProfiles.length === 0;
@@ -267,6 +279,7 @@ export function createRuntimeSelectionController({
267
279
  saveModelPreferences,
268
280
  selectedEnvironmentId,
269
281
  selectedModelPreference,
282
+ selectedReasoningPreference,
270
283
  selectedModelSupportsImageInput,
271
284
  setAgentMode,
272
285
  setToolPermissionMode,
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../components/confirmation-dialog.js";
1
2
  import { createSessionPinUpdates } from "./session-pin-updates.js";
2
3
  import {
3
4
  isOlderSessionReadState,
@@ -8,12 +9,14 @@ import { matchesSessionQuery } from "../ui-behavior.js";
8
9
  import { escapeAttribute, escapeHtml, textOf } from "../lib/text-format.js";
9
10
  import { getNumber } from "../lib/event-presentation.js";
10
11
  import { createSessionSidebarController } from "./session-sidebar-controller.js";
12
+ import { captureSessionListViewport, restoreSessionListViewport } from "../components/session-list-viewport.js";
11
13
 
12
14
  export function createSessionController({
13
15
  state,
14
16
  dom,
15
17
  sessionActionsMenu,
16
18
  renderGroups = () => false,
19
+ getDeletedProjectIds = () => [],
17
20
  shell,
18
21
  preferences,
19
22
  client,
@@ -26,7 +29,7 @@ export function createSessionController({
26
29
  onReload,
27
30
  onControlEvent,
28
31
  onSidebarChange,
29
- confirmAction = window.confirm.bind(window),
32
+ confirmAction = confirmDialog,
30
33
  copyText = (value) => navigator.clipboard.writeText(value),
31
34
  }) {
32
35
  let pagination;
@@ -39,7 +42,7 @@ export function createSessionController({
39
42
  const sidebar = createSessionSidebarController({
40
43
  state, preferences, updatePinnedSessions, selectedEnvironmentId, showToast: shell?.showToast,
41
44
  render: () => { (onSidebarChange ?? render)(); void pagination?.load(); }, getFilteredSessions: filtered,
42
- getPageInfo: () => pagination?.info(),
45
+ getPageInfo: () => pagination?.info(), getDeletedProjectIds,
43
46
  });
44
47
 
45
48
  function filtered() {
@@ -56,14 +59,14 @@ export function createSessionController({
56
59
  }
57
60
 
58
61
  function render() {
59
- const scrollTop = dom.sessionsList.scrollTop;
62
+ const viewportScope = JSON.stringify([selectedEnvironmentId(), state.sessionQuery, sidebar.isArchiveView()]);
63
+ captureSessionListViewport(dom.sessionsList, viewportScope);
60
64
  sessionActionsMenu.reset();
61
65
  dom.sessionsList.innerHTML = "";
62
66
  const sessions = filtered();
63
- dom.sessionsCount.textContent = String(pagination?.info().total ?? sessions.length);
64
67
  sidebar.renderSections({ root: dom.sessionsList, sessions, createSessionItem, renderGroups });
65
68
  pagination?.renderFooter();
66
- dom.sessionsList.scrollTop = scrollTop;
69
+ restoreSessionListViewport(dom.sessionsList);
67
70
  }
68
71
 
69
72
  function createSessionItem(session, sessionIndex) {
@@ -251,15 +254,34 @@ export function createSessionController({
251
254
  }
252
255
  }
253
256
 
257
+ function captureSessionMutationTarget(sessionId) {
258
+ const session = byId(sessionId);
259
+ return { environmentId: selectedEnvironmentId(), sessionId,
260
+ currentSessionId: state.currentSessionId, viewVersion: state.sessionViewVersion,
261
+ recordRevision: JSON.stringify([Boolean(session), session?.title, session?.updatedAt, session?.latestMessageId]) };
262
+ }
263
+
264
+ function isCurrentSessionMutationTarget(target) {
265
+ if (selectedEnvironmentId() !== target.environmentId) return false;
266
+ if (state.currentSessionId !== target.currentSessionId) return false;
267
+ if (state.sessionViewVersion !== target.viewVersion) return false;
268
+ if (state.busySessionIds.has(target.sessionId)) return false;
269
+ const session = byId(target.sessionId);
270
+ return JSON.stringify([Boolean(session), session?.title, session?.updatedAt, session?.latestMessageId]) === target.recordRevision;
271
+ }
272
+
254
273
  async function clearMessages(sessionId) {
255
274
  if (!sessionId || state.busySessionIds.has(sessionId)) return;
275
+ const target = captureSessionMutationTarget(sessionId);
256
276
  if (
257
- !confirmAction(
277
+ !await confirmAction(
258
278
  `Clear all messages in "${sessionId}"? The session will stay in the list.`,
279
+ { title: "Clear conversation", confirmLabel: "Clear messages", tone: "danger" },
259
280
  )
260
281
  )
261
282
  return;
262
- const scope = { environmentId: selectedEnvironmentId(), sessionId };
283
+ if (!isCurrentSessionMutationTarget(target)) return;
284
+ const scope = { environmentId: target.environmentId, sessionId };
263
285
  setBusy(sessionId, true);
264
286
  try {
265
287
  await client.clearSessionMessages(sessionId, scope.environmentId);
@@ -284,13 +306,16 @@ export function createSessionController({
284
306
 
285
307
  async function deleteSession(sessionId) {
286
308
  if (!sessionId || state.busySessionIds.has(sessionId)) return;
309
+ const target = captureSessionMutationTarget(sessionId);
287
310
  if (
288
- !confirmAction(
311
+ !await confirmAction(
289
312
  `Delete "${sessionId}" from this environment and the server?`,
313
+ { title: "Delete conversation", confirmLabel: "Delete conversation", tone: "danger" },
290
314
  )
291
315
  )
292
316
  return;
293
- const scope = { environmentId: selectedEnvironmentId(), sessionId };
317
+ if (!isCurrentSessionMutationTarget(target)) return;
318
+ const scope = { environmentId: target.environmentId, sessionId };
294
319
  setBusy(sessionId, true);
295
320
  try {
296
321
  await client.deleteSession(sessionId, scope.environmentId);
@@ -7,6 +7,7 @@ import { filterSessionsByArchiveState } from "../lib/session-archive-visibility.
7
7
 
8
8
  export function createSessionSidebarController({
9
9
  state, preferences, updatePinnedSessions, selectedEnvironmentId = () => "", render, showToast, getFilteredSessions, getPageInfo = () => undefined,
10
+ getDeletedProjectIds = () => [],
10
11
  }) {
11
12
  let showingArchived = false;
12
13
  let environmentId = selectedEnvironmentId();
@@ -38,7 +39,7 @@ export function createSessionSidebarController({
38
39
  return canReorderSidebarSessions(
39
40
  sessions.find((session) => session.id === sourceId),
40
41
  sessions.find((session) => session.id === targetId),
41
- state.pinnedSessionIds,
42
+ state.pinnedSessionIds, getDeletedProjectIds(),
42
43
  );
43
44
  }
44
45
 
@@ -74,9 +75,9 @@ export function createSessionSidebarController({
74
75
  }
75
76
 
76
77
  async function moveInDirection(session, direction) {
77
- const group = sessionSidebarGroup(session, state.pinnedSessionIds);
78
+ const group = sessionSidebarGroup(session, state.pinnedSessionIds, getDeletedProjectIds());
78
79
  const siblings = getFilteredSessions().filter(isSessionVisibleInSidebar).filter((candidate) =>
79
- sessionSidebarGroup(candidate, state.pinnedSessionIds) === group,
80
+ sessionSidebarGroup(candidate, state.pinnedSessionIds, getDeletedProjectIds()) === group,
80
81
  );
81
82
  const index = siblings.findIndex((candidate) => candidate.id === session.id);
82
83
  if (index < 0) return;
@@ -1,12 +1,14 @@
1
+ import { confirmDialog } from "../components/confirmation-dialog.js";
1
2
  /** Owns personal Skill drafts and environment-bound reads/mutations. */
2
3
  export function createSkillsController({ client, getEnvironmentId, render,
3
- confirmDiscard = (message) => window.confirm(message) }) {
4
+ confirmDiscard = (message) => confirmDialog(message, { title: "Unsaved Skill", confirmLabel: "Discard changes", tone: "danger" }) }) {
4
5
  const state = { items: [], skill: null, draft: "", archived: false, creating: false, name: "", description: "",
5
6
  loading: false, reading: false, mutation: "", error: "", message: "" };
6
7
  let epoch = 0;
7
8
  let listRead = 0;
8
9
  let detailRead = 0;
9
10
  let draftRevision = 0;
11
+ let leaveRevision = 0;
10
12
  let active = false;
11
13
  const snapshot = () => ({ ...state, items: [...state.items], dirty: isDirty() });
12
14
  const publish = () => render(snapshot());
@@ -35,24 +37,39 @@ export function createSkillsController({ client, getEnvironmentId, render,
35
37
  if (!state.skill || state.skill.archived) return false;
36
38
  return state.skill.source === "personal";
37
39
  }
38
- function prepareLeave() {
40
+ async function prepareLeave() {
41
+ const request = ++leaveRevision;
39
42
  if (state.mutation) return false;
40
43
  if (!isDirty()) return true;
41
- if (!confirmDiscard("Discard unsaved Skill changes?")) return false;
42
44
  const revision = draftRevision;
43
45
  const scope = capture();
46
+ if (!await confirmDiscard("Discard unsaved Skill changes?")) return false;
47
+ if (!isCurrent(scope) || revision !== draftRevision) return false;
44
48
  const commit = () => {
45
- if (!commit.canCommit()) return;
49
+ if (!commit.canCommit()) return false;
46
50
  if (state.creating) clearEditor();
47
51
  else { state.draft = state.skill.content; draftRevision += 1; }
48
52
  publish();
53
+ return true;
54
+ };
55
+ commit.canCommit = () => {
56
+ if (state.mutation) return false;
57
+ if (request !== leaveRevision) return false;
58
+ if (!isCurrent(scope)) return false;
59
+ return revision === draftRevision;
49
60
  };
50
- commit.canCommit = () => isCurrent(scope) && revision === draftRevision;
51
61
  return commit;
52
62
  }
53
- function acceptLeave() {
54
- const prepared = prepareLeave();
55
- if (prepared === false) return false;
63
+ async function acceptLeave() {
64
+ const scope = capture();
65
+ const revision = draftRevision;
66
+ const pending = prepareLeave();
67
+ const request = leaveRevision;
68
+ const prepared = await pending;
69
+ if (request !== leaveRevision) return false;
70
+ if (!isCurrent(scope) || revision !== draftRevision) return false;
71
+ if (state.mutation) return false;
72
+ if (prepared === false || prepared?.canCommit?.() === false) return false;
56
73
  if (typeof prepared === "function") prepared();
57
74
  return true;
58
75
  }
@@ -75,7 +92,7 @@ export function createSkillsController({ client, getEnvironmentId, render,
75
92
  }
76
93
  async function select(skillId) {
77
94
  if (state.skill?.skillId === skillId) return true;
78
- if (!acceptLeave()) return false;
95
+ if (!await acceptLeave()) return false;
79
96
  if (!state.items.some((item) => item.skillId === skillId)) return false;
80
97
  return loadSkill(skillId);
81
98
  }
@@ -109,8 +126,8 @@ export function createSkillsController({ client, getEnvironmentId, render,
109
126
  state.message = "";
110
127
  publish();
111
128
  }
112
- function beginCreate() {
113
- if (!acceptLeave()) return false;
129
+ async function beginCreate() {
130
+ if (!await acceptLeave()) return false;
114
131
  clearEditor();
115
132
  Object.assign(state, { creating: true, archived: false, error: "", message: "" });
116
133
  publish();
@@ -124,8 +141,8 @@ export function createSkillsController({ client, getEnvironmentId, render,
124
141
  state.message = "";
125
142
  publish();
126
143
  }
127
- function cancelCreate() {
128
- if (!state.creating || !acceptLeave()) return false;
144
+ async function cancelCreate() {
145
+ if (!state.creating || !await acceptLeave()) return false;
129
146
  clearEditor();
130
147
  state.error = "";
131
148
  publish();
@@ -163,9 +180,9 @@ export function createSkillsController({ client, getEnvironmentId, render,
163
180
  if (isCurrent(scope)) { state.mutation = ""; publish(); }
164
181
  }
165
182
  }
166
- function setArchived(archived) {
183
+ async function setArchived(archived) {
167
184
  if (state.archived === archived) return true;
168
- if (!acceptLeave()) return false;
185
+ if (!await acceptLeave()) return false;
169
186
  state.archived = archived;
170
187
  state.error = "";
171
188
  state.message = "";
@@ -174,7 +191,7 @@ export function createSkillsController({ client, getEnvironmentId, render,
174
191
  return true;
175
192
  }
176
193
  async function reloadSelected() {
177
- if (!state.skill || !acceptLeave()) return false;
194
+ if (!state.skill || !await acceptLeave()) return false;
178
195
  return loadSkill(state.skill.skillId);
179
196
  }
180
197
  async function mutate(action) {
@@ -111,7 +111,7 @@ export function createSparkChatSync({
111
111
  onHistoryReset();
112
112
  }
113
113
  if (hasReadableGeneration(result.readState)) readGeneration = result.readState.readGeneration;
114
- onConfiguration({ ...result, supportsImageInput, supportsThinking: profile?.supportsThinking === true, modelAvailable: Boolean(profile) });
114
+ onConfiguration({ ...result, supportsImageInput, supportsThinking: profile?.supportsThinking === true, reasoningControls: profile?.reasoningControls, modelAvailable: Boolean(profile) });
115
115
  onReadState(result.readState);
116
116
  const snapshot = result.snapshot;
117
117
  if (shouldHydrateSparkConversation(initialized, rehydrate, snapshot, state)) {
@@ -5,8 +5,10 @@ export function createSparkHandoffNavigation({ state, getEnvironmentId, shell, c
5
5
  const sessionId = state.currentSessionId;
6
6
  const viewVersion = state.sessionViewVersion;
7
7
  const workspace = shell.activeWorkspace();
8
+ let navigationRequest = shell.navigationRequestRevision?.();
8
9
  function navigationIsCurrent() {
9
10
  if (environmentId !== getEnvironmentId()) return false;
11
+ if (navigationRequest !== shell.navigationRequestRevision?.()) return false;
10
12
  if (sessionId !== state.currentSessionId || viewVersion !== state.sessionViewVersion) return false;
11
13
  return workspace === shell.activeWorkspace();
12
14
  }
@@ -14,12 +16,16 @@ export function createSparkHandoffNavigation({ state, getEnvironmentId, shell, c
14
16
  if (!targetSessionId || !navigationIsCurrent()) return false;
15
17
  await conversation.loadSessions();
16
18
  if (!navigationIsCurrent()) return false;
19
+ const activate = await shell.prepareWorkspaceActivation("chat");
20
+ if (!activate || activate.canCommit?.() === false) return false;
21
+ navigationRequest = shell.navigationRequestRevision?.();
22
+ if (!navigationIsCurrent()) return false;
17
23
  let committed = false;
18
24
  await conversation.openSession(targetSessionId, {
19
25
  isRouteCurrent: navigationIsCurrent,
20
26
  commitRouteNavigation() {
21
27
  if (!navigationIsCurrent()) return false;
22
- committed = shell.activateWorkspace("chat") !== false;
28
+ committed = activate() !== false;
23
29
  return committed;
24
30
  },
25
31
  });
@@ -5,6 +5,7 @@ import type {
5
5
 
6
6
  export interface ToolApprovalControllerState {
7
7
  connected: boolean;
8
+ currentSessionId?: string;
8
9
  events: ToolApprovalEvent[];
9
10
  submittedToolApprovalIds: Set<string>;
10
11
  messages?: Array<Record<string, unknown>>;
@@ -27,5 +28,5 @@ export declare function createToolApprovalController(
27
28
  isPending(event: ToolApprovalEvent | undefined): boolean;
28
29
  pendingEvent(): ToolApprovalEvent | undefined;
29
30
  pendingEvents(): ToolApprovalEvent[];
30
- submit(approvalId: string, approved: boolean): boolean;
31
+ submit(approvalId: string, approved: boolean, reason?: string): boolean;
31
32
  };
@@ -2,6 +2,10 @@ import { textOf } from "../lib/text-format.js";
2
2
  import { requestLifecycles } from "../lib/request-lifecycle-view.js";
3
3
  import { approvalDecisionCommand } from "../lib/approval-decision-command.js";
4
4
  import { projectToolActivityEvent } from "../lib/tool-activity-event.js";
5
+ import {
6
+ approvalRejectionIdentity,
7
+ createApprovalRejectionDrafts,
8
+ } from "../lib/tool-approval-rejection-drafts.js";
5
9
 
6
10
  export function createToolApprovalController({
7
11
  state,
@@ -11,6 +15,16 @@ export function createToolApprovalController({
11
15
  recordControlEvent,
12
16
  createCard: createApprovalCard,
13
17
  }) {
18
+ const rejectionDrafts = createApprovalRejectionDrafts();
19
+
20
+ function approvalScope(event) {
21
+ return {
22
+ ...event,
23
+ environmentId: selectedEnvironmentId(),
24
+ sessionId: event?.sessionId || state.currentSessionId,
25
+ };
26
+ }
27
+
14
28
  function isResolved(approvalId) {
15
29
  for (const lifecycle of requestLifecycles(state).values()) {
16
30
  if (
@@ -76,10 +90,12 @@ export function createToolApprovalController({
76
90
  });
77
91
  }
78
92
  }
79
- return [...pending.values()];
93
+ const events = [...pending.values()];
94
+ rejectionDrafts.retain(events.map(approvalScope));
95
+ return events;
80
96
  }
81
97
 
82
- function submit(approvalId, approved) {
98
+ function submit(approvalId, approved, reason) {
83
99
  if (!state.connected) {
84
100
  recordControlEvent({
85
101
  type: "control",
@@ -99,6 +115,7 @@ export function createToolApprovalController({
99
115
  type: "tool_approval_response",
100
116
  approvalId,
101
117
  approved,
118
+ ...(reason !== undefined ? { reason } : {}),
102
119
  environment: selectedEnvironmentId(),
103
120
  ...(pending.waitId
104
121
  ? {
@@ -113,11 +130,27 @@ export function createToolApprovalController({
113
130
  return sent !== false;
114
131
  }
115
132
 
133
+ function canSubmitFromCard(scope) {
134
+ const pending = pendingEvents().find(
135
+ (event) => event.approvalId === scope.approvalId,
136
+ );
137
+ if (!pending) return false;
138
+ return (
139
+ approvalRejectionIdentity(scope) ===
140
+ approvalRejectionIdentity(approvalScope(pending))
141
+ );
142
+ }
143
+
116
144
  function createCard(event) {
145
+ const scope = approvalScope(event);
117
146
  return createApprovalCard({
118
147
  event,
148
+ rejectionDraft: rejectionDrafts.get(scope),
119
149
  submitted: state.submittedToolApprovalIds.has(textOf(event?.approvalId)),
120
- onDecision: submit,
150
+ onDecision: (approvalId, approved, reason) => {
151
+ if (!canSubmitFromCard(scope)) return false;
152
+ return submit(approvalId, approved, reason);
153
+ },
121
154
  });
122
155
  }
123
156
 
@@ -8,11 +8,17 @@ export function createWorkspaceConversationOpener({ state, shell, openSession })
8
8
  shell.showToast?.("Wait for the environment change to finish before opening a conversation.", "neutral");
9
9
  return false;
10
10
  }
11
- const activate = shell.prepareWorkspaceActivation("chat");
12
- if (!activate) return false;
13
11
  let navigationRevision = shell.navigationRevision?.();
12
+ const sessionIdBefore = state.currentSessionId;
13
+ const viewVersion = state.sessionViewVersion;
14
+ const activate = await shell.prepareWorkspaceActivation("chat");
15
+ if (!activate) return false;
16
+ if (navigationRevision !== shell.navigationRevision?.()) return false;
17
+ if (sessionIdBefore !== state.currentSessionId) return false;
18
+ if (viewVersion !== state.sessionViewVersion) return false;
14
19
  function isConversationWorkspaceNavigationCurrent() {
15
20
  if (!canNavigateConversation(state)) return false;
21
+ if (!committed && activate.canCommit?.() === false) return false;
16
22
  return shell.navigationRevision?.() === navigationRevision;
17
23
  }
18
24
  let committed = false;
@@ -109,6 +109,7 @@ export function createWorkspaceRouteController({
109
109
  function routeNavigationRevisions() {
110
110
  return {
111
111
  shell: shell.navigationRevision(),
112
+ shellRequest: shell.navigationRequestRevision?.() || 0,
112
113
  configuration: configuration.navigationRevision(),
113
114
  schedules: schedules.navigationRevision(),
114
115
  automations: automations?.navigationRevision() || 0,
@@ -117,6 +118,7 @@ export function createWorkspaceRouteController({
117
118
 
118
119
  function hasCurrentRouteNavigation(revisions) {
119
120
  if (shell.navigationRevision() !== revisions.shell) return false;
121
+ if ((shell.navigationRequestRevision?.() || 0) !== revisions.shellRequest) return false;
120
122
  if (configuration.navigationRevision() !== revisions.configuration)
121
123
  return false;
122
124
  if (schedules.navigationRevision() !== revisions.schedules) return false;
@@ -129,6 +131,7 @@ export function createWorkspaceRouteController({
129
131
  environmentId,
130
132
  routeActivationIsCurrent,
131
133
  commitLinkedConversationRoute,
134
+ reloadSessionList,
132
135
  ) {
133
136
  if (route.workspace === "chat" && route.automationRun) return true;
134
137
  if (!routeCarriesConversation(route)) {
@@ -136,7 +139,7 @@ export function createWorkspaceRouteController({
136
139
  return true;
137
140
  }
138
141
  if (route.session === getSessionId()) return true;
139
- await loadSessions();
142
+ if (reloadSessionList) await loadSessions();
140
143
  if (!routeActivationIsCurrent()) return false;
141
144
  if (environmentId !== getEnvironmentId()) return false;
142
145
  let routeCommitted = false;
@@ -161,7 +164,10 @@ export function createWorkspaceRouteController({
161
164
  }
162
165
 
163
166
  async function applyRoute(route, { initial = false } = {}) {
164
- if (automations?.prepareRouteChange?.(route) === false) return false;
167
+ const navigationRevisions = routeNavigationRevisions();
168
+ const preparedRouteChange = await automations?.prepareRouteChange?.(route);
169
+ if (preparedRouteChange === false || preparedRouteChange === null) return false;
170
+ if (!hasCurrentRouteNavigation(navigationRevisions)) return false;
165
171
  if (!routeEnvironmentIsAvailable(route)) {
166
172
  shell.showToast("This environment is no longer available.", "failed");
167
173
  return false;
@@ -170,12 +176,22 @@ export function createWorkspaceRouteController({
170
176
  shell.showToast("This workspace is unavailable with the current backend.", "failed");
171
177
  return false;
172
178
  }
173
- const navigationRevisions = routeNavigationRevisions();
174
- if (routeChangesEnvironment(route, getEnvironmentId())) {
175
- if (
176
- !(await changeEnvironment(route.environment, { restoreSession: false }))
177
- )
178
- return false;
179
+ let routeChangeCommitted = false;
180
+ const environmentChanged = routeChangesEnvironment(route, getEnvironmentId());
181
+ if (environmentChanged) {
182
+ const commitRouteChange = () => {
183
+ if (preparedRouteChange?.canCommit?.() === false) return false;
184
+ if (typeof preparedRouteChange === "function" && preparedRouteChange() === false) return false;
185
+ routeChangeCommitted = true;
186
+ return true;
187
+ };
188
+ commitRouteChange.canCommit = () => hasCurrentRouteNavigation(navigationRevisions) &&
189
+ preparedRouteChange?.canCommit?.() !== false;
190
+ const options = { restoreSession: false, commitEnvironmentOptions: commitRouteChange };
191
+ if (!await changeEnvironment(route.environment, options)) return false;
192
+ if (shell.navigationRevision() !== navigationRevisions.shell) return false;
193
+ if ((shell.navigationRequestRevision?.() || 0) !== navigationRevisions.shellRequest) return false;
194
+ Object.assign(navigationRevisions, routeNavigationRevisions());
179
195
  }
180
196
  if (!hasCurrentRouteNavigation(navigationRevisions)) return false;
181
197
  if (!routeWorkspaceIsAvailable(route)) {
@@ -186,18 +202,26 @@ export function createWorkspaceRouteController({
186
202
  return false;
187
203
  }
188
204
  const environmentId = getEnvironmentId();
189
- const activate = shell.prepareWorkspaceActivation(route.workspace, {
205
+ const activate = await shell.prepareWorkspaceActivation(route.workspace, {
190
206
  focus: false,
191
207
  });
192
208
  if (!activate) return false;
209
+ if (activate.canCommit?.() === false) return false;
210
+ navigationRevisions.shellRequest = shell.navigationRequestRevision?.() || 0;
211
+ if (!hasCurrentRouteNavigation(navigationRevisions)) return false;
212
+ if (environmentId !== getEnvironmentId()) return false;
193
213
  let linkedConversationActivated = false;
194
214
  function routeActivationIsCurrent() {
195
215
  if (!hasCurrentRouteNavigation(navigationRevisions)) return false;
216
+ if (!routeChangeCommitted && preparedRouteChange?.canCommit?.() === false) return false;
196
217
  if (environmentId !== getEnvironmentId()) return false;
197
218
  return !initialRouteWasSuperseded(initial, pendingInitialHistory);
198
219
  }
199
220
  function commitLinkedConversationRoute() {
200
221
  if (!routeActivationIsCurrent()) return false;
222
+ if (activate.canCommit?.() === false) return false;
223
+ if (!routeChangeCommitted && typeof preparedRouteChange === "function" && preparedRouteChange() === false) return false;
224
+ routeChangeCommitted = true;
201
225
  if (!activate()) return false;
202
226
  navigationRevisions.shell = shell.navigationRevision();
203
227
  linkedConversationActivated = true;
@@ -210,11 +234,12 @@ export function createWorkspaceRouteController({
210
234
  environmentId,
211
235
  routeActivationIsCurrent,
212
236
  commitLinkedConversationRoute,
237
+ shouldReloadRouteSessionList(initial, environmentChanged, shell.activeWorkspace()),
213
238
  ))
214
239
  )
215
240
  return false;
216
241
  if (!routeActivationIsCurrent()) return false;
217
- if (!linkedConversationActivated && !activate()) return false;
242
+ if (!linkedConversationActivated && !commitLinkedConversationRoute()) return false;
218
243
  const category = configurationCategoryForWorkspace(route.workspace);
219
244
  if (category) {
220
245
  if (configuration.activateCategory(category) === false)
@@ -356,3 +381,9 @@ function initialRouteWasSuperseded(initial, pendingHistory) {
356
381
  if (!initial) return false;
357
382
  return Boolean(pendingHistory);
358
383
  }
384
+
385
+ function shouldReloadRouteSessionList(initial, environmentChanged, currentWorkspace) {
386
+ if (initial) return true;
387
+ if (environmentChanged) return true;
388
+ return currentWorkspace !== "chat";
389
+ }