@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
@@ -0,0 +1,79 @@
1
+ import { COLOR_PALETTES } from "../lib/color-palettes.js";
2
+
3
+ const paletteIcon = '<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="8.5"/><path d="M12 3.5a8.5 8.5 0 0 0 0 17v-17Z"/><path d="M12 8h5m-5 4h7m-7 4h5"/></svg>';
4
+
5
+ export function createAppearanceDialog({ mount, onOpen, onSelect, onSelectNavigation, onSave, onClose }) {
6
+ const doc = mount.ownerDocument;
7
+ const launcher = doc.createElement("button");
8
+ launcher.type = "button";
9
+ launcher.className = "rail-button appearance-launcher";
10
+ launcher.title = "Appearance";
11
+ launcher.setAttribute("aria-label", "Appearance");
12
+ launcher.setAttribute("aria-haspopup", "dialog");
13
+ launcher.innerHTML = `<span class="rail-icon">${paletteIcon}</span><span class="rail-button-label">Appearance</span>`;
14
+ launcher.addEventListener("click", onOpen);
15
+ mount.append(launcher);
16
+
17
+ const dialog = doc.createElement("dialog");
18
+ dialog.className = "appearance-dialog";
19
+ dialog.setAttribute("aria-labelledby", "appearance-title");
20
+ dialog.innerHTML = `<form class="appearance-form">
21
+ <header class="appearance-heading">
22
+ <h2 id="appearance-title">Appearance</h2>
23
+ <button type="button" class="appearance-close" aria-label="Close appearance">×</button>
24
+ </header>
25
+ <p class="appearance-description">Choose your workspace colors and sidebar layout.</p>
26
+ <fieldset class="appearance-palettes"><legend class="sr-only">Color palette</legend></fieldset>
27
+ <fieldset class="appearance-navigation"><legend>Sidebar layout</legend>
28
+ <label><input type="radio" name="navigation-display" value="labels"><span>Icons and text</span></label>
29
+ <label><input type="radio" name="navigation-display" value="icons"><span>Icons only</span></label>
30
+ </fieldset>
31
+ <p class="appearance-status" role="status" aria-live="polite"></p>
32
+ <footer class="appearance-footer"><button type="button" class="appearance-cancel">Cancel</button>
33
+ <button type="submit" class="appearance-save">Apply</button></footer>
34
+ </form>`;
35
+ const choices = dialog.querySelector(".appearance-palettes");
36
+ for (const palette of COLOR_PALETTES) {
37
+ const card = doc.createElement("label");
38
+ card.className = "appearance-palette";
39
+ card.style.setProperty("--preview-bg", palette.background);
40
+ card.style.setProperty("--preview-panel", palette.panel);
41
+ card.style.setProperty("--preview-accent", palette.accent);
42
+ card.innerHTML = `<input type="radio" name="color-palette" value="${palette.id}">
43
+ <span class="appearance-preview" aria-hidden="true"><span class="appearance-preview-rail"></span>
44
+ <span class="appearance-preview-content"><i></i><i></i><i></i><b></b></span></span>
45
+ <span class="appearance-palette-heading"><strong>${palette.name}</strong><span class="appearance-check" aria-hidden="true">✓</span></span>
46
+ <span class="appearance-palette-caption">${palette.description}</span>`;
47
+ card.querySelector("input").addEventListener("change", () => onSelect(palette.id));
48
+ choices.append(card);
49
+ }
50
+ const close = dialog.querySelector(".appearance-close");
51
+ const navigation = dialog.querySelector(".appearance-navigation");
52
+ for (const input of navigation.querySelectorAll("input"))
53
+ input.addEventListener("change", () => onSelectNavigation(input.value));
54
+ const cancel = dialog.querySelector(".appearance-cancel");
55
+ const save = dialog.querySelector(".appearance-save");
56
+ const status = dialog.querySelector(".appearance-status");
57
+ close.addEventListener("click", onClose);
58
+ cancel.addEventListener("click", onClose);
59
+ dialog.addEventListener("cancel", (event) => { event.preventDefault(); onClose(); });
60
+ dialog.querySelector("form").addEventListener("submit", (event) => { event.preventDefault(); onSave(); });
61
+ doc.body.append(dialog);
62
+ return {
63
+ render(state) {
64
+ for (const input of choices.querySelectorAll("input")) input.checked = input.value === state.selectedId;
65
+ for (const input of navigation.querySelectorAll("input")) input.checked = input.value === state.selectedNavigationMode;
66
+ choices.disabled = state.pending;
67
+ navigation.disabled = state.pending;
68
+ close.disabled = state.pending;
69
+ cancel.disabled = state.pending;
70
+ save.disabled = state.pending;
71
+ save.textContent = state.pending ? "Saving…" : "Apply";
72
+ status.textContent = state.error || "Previewing now. Apply to save across conversations.";
73
+ status.classList.toggle("is-error", Boolean(state.error));
74
+ if (state.open && !dialog.open) dialog.showModal();
75
+ if (!state.open && dialog.open) dialog.close();
76
+ },
77
+ destroy() { dialog.remove(); launcher.remove(); },
78
+ };
79
+ }
@@ -1,13 +1,15 @@
1
1
  export function createAutomationArchiveCommands({ actions, getCurrent, requireSavedGraph,
2
- confirmDiscard, onFilterChange }) {
2
+ confirmations, onFilterChange }) {
3
3
  return {
4
4
  archive: async () => {
5
5
  if (!requireSavedGraph()) return;
6
6
  const current = getCurrent();
7
7
  const selected = current.automations.find((item) => item.id === current.selectedAutomationId);
8
8
  if (!selected?.publishedRevision || selected.status === "archived") return;
9
- if (!confirmDiscard("Archive this automation? Its schedule will pause, and its runs and reports will remain available.")) return;
10
- if (await actions.archive()) onFilterChange(true);
9
+ const archived = await confirmations.run(
10
+ "Archive this automation? Its schedule will pause, and its runs and reports will remain available.",
11
+ { title: "Archive automation", confirmLabel: "Archive", tone: "danger" }, () => actions.archive());
12
+ if (archived) onFilterChange(true);
11
13
  },
12
14
  restore: async () => {
13
15
  if (!requireSavedGraph()) return;
@@ -1,3 +1,5 @@
1
+ import { confirmDialog } from "../confirmation-dialog.js";
2
+
1
3
  export function automationAuthoringStarter(automationId = "", revision = 0) {
2
4
  const draftOnlyScope = "Design the future workflow; do not carry out its steps now. Leave permission grants, publication and execution to me.";
3
5
  const hasExactDraftRevision = automationId && Number.isInteger(revision) && revision > 0;
@@ -7,16 +9,33 @@ export function automationAuthoringStarter(automationId = "", revision = 0) {
7
9
  }
8
10
 
9
11
  /** Opens a normal editable chat; the visible message is the only draft association. */
10
- export function openAutomationAuthoringChat({
11
- dom, shell, automationId = "", revision = 0,
12
- confirmReplace = (message) => globalThis.confirm(message),
12
+ export async function openAutomationAuthoringChat({
13
+ dom, shell, automationId = "", revision = 0, startNewConversation,
14
+ getEnvironmentId = () => "", isCurrent = () => true, confirmReplace = confirmDialog,
13
15
  }) {
14
16
  const composer = dom.composerInput;
15
- if (!composer || !dom.newSessionButton) return false;
16
- if (composer.value.trim() && !confirmReplace("Replace your unsent chat message with an automation starter?"))
17
- return false;
18
- dom.newSessionButton.click();
17
+ if (!composer || typeof startNewConversation !== "function") return false;
18
+ const draft = composer.value;
19
+ const environmentId = getEnvironmentId();
20
+ function canReplaceComposerDraft() {
21
+ if (environmentId !== getEnvironmentId()) return false;
22
+ if (!isCurrent()) return false;
23
+ return composer.value === draft;
24
+ }
25
+ if (draft.trim()) {
26
+ let approved;
27
+ try {
28
+ approved = await confirmReplace("Replace your unsent chat message with an automation starter?",
29
+ { title: "Replace unsent message", confirmLabel: "Replace" });
30
+ } catch { return false; }
31
+ if (approved !== true) return false;
32
+ }
33
+ if (!canReplaceComposerDraft()) return false;
34
+ if (await startNewConversation({ canCommit: canReplaceComposerDraft }) !== true) return false;
35
+ if (environmentId !== getEnvironmentId()) return false;
36
+ if (!isCurrent()) return false;
19
37
  if (shell.activeWorkspace() !== "chat") return false;
38
+ if (composer.value !== draft && composer.value !== "") return false;
20
39
  composer.value = automationAuthoringStarter(automationId, revision);
21
40
  const EventType = composer.ownerDocument?.defaultView?.Event || globalThis.Event;
22
41
  composer.dispatchEvent(new EventType("input", { bubbles: true }));
@@ -0,0 +1,78 @@
1
+ import { confirmDialog } from "../confirmation-dialog.js";
2
+ import { automationRerunConfirmation } from "./rerun-confirmation.js";
3
+
4
+ function automationConfirmationIdentity(snapshot) {
5
+ const selected = snapshot.automations?.find((item) => item.id === snapshot.selectedAutomationId);
6
+ return JSON.stringify([snapshot.selectedAutomationId, snapshot.selectedRunId, snapshot.selectedNodeId,
7
+ snapshot.draft?.revision, snapshot.publishedDefinition?.revision, selected?.publishedRevision,
8
+ selected?.status, snapshot.run?.id, snapshot.run?.status, snapshot.mutation]);
9
+ }
10
+
11
+ /** An approval belongs to the exact view, revision and local edits that requested it. */
12
+ export function captureAutomationConfirmationScope({ actions, getCurrent, getEditRevision = () => 0 }) {
13
+ const ownsView = actions.captureActionScope?.() || (() => true);
14
+ const identity = automationConfirmationIdentity(getCurrent());
15
+ const editRevision = getEditRevision();
16
+ return () => {
17
+ if (!ownsView()) return false;
18
+ if (editRevision !== getEditRevision()) return false;
19
+ return identity === automationConfirmationIdentity(getCurrent());
20
+ };
21
+ }
22
+
23
+ export function createAutomationConfirmations({ actions, getCurrent, getEditRevision, confirm = confirmDialog }) {
24
+ let requestRevision = 0;
25
+ async function prepare(message, options, operation) {
26
+ const revision = ++requestRevision;
27
+ const ownsScope = captureAutomationConfirmationScope({ actions, getCurrent, getEditRevision });
28
+ const isCurrent = () => revision === requestRevision && ownsScope();
29
+ let approved;
30
+ try { approved = await confirm(message, options); }
31
+ catch { return false; }
32
+ if (approved !== true || !isCurrent()) return false;
33
+ const commit = () => isCurrent() ? operation() : false;
34
+ commit.canCommit = isCurrent;
35
+ return commit;
36
+ }
37
+ return {
38
+ invalidate() { requestRevision += 1; },
39
+ prepare,
40
+ async run(message, options, operation) {
41
+ const commit = await prepare(message, options, operation);
42
+ return commit ? commit() : false;
43
+ },
44
+ };
45
+ }
46
+
47
+ export function createAutomationDestructiveCommands({ actions, getCurrent, requireSavedGraph,
48
+ confirmations, onDraftDeleted }) {
49
+ return {
50
+ "remove-node": () => {
51
+ if (!requireSavedGraph()) return false;
52
+ const nodeId = getCurrent().selectedNodeId;
53
+ return confirmations.run("Remove this step from the draft?",
54
+ { title: "Remove step", confirmLabel: "Remove", tone: "danger" }, async () => {
55
+ const removed = await actions.mutateDraft({ kind: "remove_node", nodeId });
56
+ if (removed) actions.selectNode("");
57
+ return removed;
58
+ });
59
+ },
60
+ "delete-draft": () => {
61
+ const current = getCurrent();
62
+ if (!current.draft || current.publishedDefinition) return false;
63
+ if (current.automations.find((item) => item.id === current.selectedAutomationId)?.publishedRevision) return false;
64
+ return confirmations.run("Delete this unpublished automation draft and all its steps? This cannot be undone.",
65
+ { title: "Delete draft", confirmLabel: "Delete", tone: "danger" }, async () => {
66
+ const deleted = await actions.deleteDraft();
67
+ if (deleted) onDraftDeleted();
68
+ return deleted;
69
+ });
70
+ },
71
+ rerun: () => {
72
+ const run = getCurrent().run;
73
+ if (!run) return false;
74
+ return confirmations.run(automationRerunConfirmation(run),
75
+ { title: "Run automation again", confirmLabel: "Run again" }, () => actions.rerun());
76
+ },
77
+ };
78
+ }
@@ -20,6 +20,7 @@ export function createAutomationDraftRecoveryCommands({ actions, requireSavedGra
20
20
  if (!requireSavedGraph()) return false;
21
21
  const restored = await actions.restorePublishedDraft(({ title, publishedRevision }) => confirmDiscard(
22
22
  `Replace the current draft of “${title}” with published revision ${publishedRevision}? Unpublished draft changes will be discarded. The published version, schedule, permissions, and existing runs will stay unchanged.`,
23
+ { title: "Reset draft", confirmLabel: "Reset draft", tone: "danger" },
23
24
  ));
24
25
  if (restored) onRestored();
25
26
  return restored;
@@ -1,3 +1,4 @@
1
+ import { readReasoningPreferenceField } from "../../lib/reasoning-preference.js";
1
2
  import { renderReasoningModeField, retainedReasoningMode } from "../../lib/reasoning-controls.js";
2
3
  import { escapeHtml } from "../../lib/text-format.js";
3
4
  import { readBindingFields, renderBindingFields } from "./binding-fields.js";
@@ -135,7 +136,7 @@ function renderAgentEditor(node, catalog, producers) {
135
136
  return `${producers.length ? `<p class="automation-input-notice" data-input-connection="${connected ? "connected" : "none"}"${connected ? " hidden" : ""}>No earlier step output is connected. Connect an output below if this agent should use it.</p>` : ""}
136
137
  ${renderBindingFields(node.inputs, null, { name: "inputs", allowAdd: true, producers })}
137
138
  ${renderModelChoice(node, catalog)}
138
- ${renderReasoningModeField(node.agentMode || "fast", catalog?.models?.find((model) => model.id === node.modelProfileId))}
139
+ ${renderReasoningModeField(node.agentMode || "fast", catalog?.models?.find((model) => model.id === node.modelProfileId), undefined, node.reasoningPreference)}
139
140
  <label>Role instructions<textarea name="roleInstructions" dir="auto">${escapeHtml(node.roleInstructions || "")}</textarea></label>
140
141
  <label>Prompt<textarea name="prompt" dir="auto" required>${escapeHtml(node.prompt || "")}</textarea></label>
141
142
  <details class="automation-node-contract"><summary>Result contract · ${node.result?.kind === "json" ? "Structured JSON" : "Text"}</summary>
@@ -219,6 +220,9 @@ export function readAutomationNodePatch(form, node, catalog) {
219
220
  if (node.kind === "agent") {
220
221
  patch.modelProfileId = String(fields.get("modelProfileId") || "");
221
222
  patch.agentMode = retainedReasoningMode(form, node.agentMode || "fast");
223
+ const preference = readReasoningPreferenceField(form);
224
+ if (preference) patch.reasoningPreference = preference;
225
+ else if (node.reasoningPreference) patch.reasoningPreference = null;
222
226
  patch.roleInstructions = String(fields.get("roleInstructions") || "");
223
227
  patch.prompt = String(fields.get("prompt") || "");
224
228
  patch.inputs = readBindingFields(form, "inputs");
@@ -1,4 +1,4 @@
1
- import { syncReasoningModeField } from "../../lib/reasoning-controls.js";
1
+ import { clearReasoningOffForMode, syncReasoningModeField } from "../../lib/reasoning-controls.js";
2
2
  import { escapeHtml } from "../../lib/text-format.js";
3
3
  import { listAvailableAutomationProducers } from "../../lib/automation-binding-producers.js";
4
4
  import { findAutomationNode } from "./timeline.js";
@@ -165,7 +165,9 @@ export function createAutomationStepEditorDialog({ root, actions, documentRoot,
165
165
  if (target.matches("[data-agent-tool-search]")) { updateAgentToolPicker(form); return; }
166
166
  if (!form.contains(target) || entry.saving) return;
167
167
  entry.dirty = true;
168
- if (event.type === "change" && target.matches('[name="modelProfileId"]'))
168
+ if (event.type === "change" && target.matches("[data-reasoning-mode]"))
169
+ clearReasoningOffForMode(form, entry.catalog?.models);
170
+ if (event.type === "change" && target.matches('[name="modelProfileId"], [data-reasoning-preference-mode]'))
169
171
  syncReasoningModeField(form, entry.catalog?.models);
170
172
  if (target.matches("[data-agent-tool]")) updateAgentToolPicker(form);
171
173
  if (event.type === "change" && target.matches('[name="toolOperation"]')) {
@@ -46,7 +46,7 @@ function nodeIsRunning(node, run) {
46
46
 
47
47
  function nodeMetadata(node) {
48
48
  if (node.kind === "agent") {
49
- return [node.modelProfileId || "Model not selected", displayReasoningMode(node.agentMode) || ""].filter(Boolean).join(" · ");
49
+ return [node.modelProfileId || "Model not selected", displayReasoningMode(node.agentMode, node.reasoningPreference) || ""].filter(Boolean).join(" · ");
50
50
  }
51
51
  return [node.operation?.toolName, node.operation?.operationId].filter(Boolean).join(" · ") || "Operation not selected";
52
52
  }
@@ -128,7 +128,7 @@ export function renderAutomationNodeDetails(node, run = null) {
128
128
  const record = nodeRunState(run, node.id);
129
129
  const operation = node.kind === "tool"
130
130
  ? `<dt>Operation</dt><dd>${escapeHtml(nodeMetadata(node))}</dd>`
131
- : `<dt>Model</dt><dd>${escapeHtml(node.modelProfileId || "Not selected")}</dd><dt>Role</dt><dd>${escapeHtml(displayReasoningMode(node.agentMode) || "Not selected")}</dd>`;
131
+ : `<dt>Model</dt><dd>${escapeHtml(node.modelProfileId || "Not selected")}</dd><dt>Role</dt><dd>${escapeHtml(displayReasoningMode(node.agentMode, node.reasoningPreference) || "Not selected")}</dd>`;
132
132
  const prompt = node.kind === "agent" && node.prompt
133
133
  ? `<div class="automation-inspector-prompt"><strong>Prompt</strong><p dir="auto">${escapeHtml(node.prompt)}</p></div>`
134
134
  : "";
@@ -0,0 +1,37 @@
1
+ import { captureAutomationConfirmationScope } from "./confirmation-actions.js";
2
+ import { focusSelectedAutomationStep } from "./run-steps-view.js";
3
+
4
+ /** Clean navigation stays synchronous; an async discard approval is never truthy permission. */
5
+ export function createAutomationWorkspaceNavigation({ actions, getCurrent, getEditRevision, prepareLeave, root }) {
6
+ let requestRevision = 0;
7
+ function leave(operation) {
8
+ const revision = ++requestRevision;
9
+ const isCurrent = captureAutomationConfirmationScope({ actions, getCurrent, getEditRevision });
10
+ function commit(approved) {
11
+ if (approved !== true && typeof approved !== "function") return false;
12
+ if (revision !== requestRevision) return false;
13
+ if (!isCurrent()) return false;
14
+ if (approved?.canCommit?.() === false) return false;
15
+ if (typeof approved === "function" && approved() === false) return false;
16
+ return operation();
17
+ }
18
+ const approved = prepareLeave();
19
+ if (typeof approved?.then === "function") return Promise.resolve(approved).then(commit);
20
+ return commit(approved);
21
+ }
22
+ function selectNode(element) {
23
+ return leave(() => {
24
+ const current = getCurrent();
25
+ const nodeId = element.dataset.selectNode || element.dataset.automationNode || "";
26
+ if (nodeId === current.selectedNodeId || !nodeId) { actions.selectNode(""); return; }
27
+ const nodeButton = element.dataset.automationNode !== undefined ? element
28
+ : [...root.querySelectorAll("[data-automation-node]")]
29
+ .find((item) => item.dataset.automationNode === nodeId);
30
+ if (element.dataset.selectNode !== undefined)
31
+ nodeButton?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
32
+ actions.selectNode(nodeId);
33
+ if (current.selectedRunId) focusSelectedAutomationStep(root);
34
+ });
35
+ }
36
+ return { leave, selectNode };
37
+ }
@@ -5,14 +5,14 @@ import { createAutomationDraftRecoveryCommands } from "./draft-recovery-actions.
5
5
  import { activateAutomationLibraryTab, automationLibraryTabForKey, renderAutomationLibraryTabs } from "./library-tabs.js";
6
6
  import { readAutomationDefinitionPatch, renderAutomationEditor, renderAutomationToolResults, toolDisplayName } from "./editor.js";
7
7
  import { createAutomationStepEditorDialog } from "./step-editor-dialog.js";
8
- import { focusSelectedAutomationStep } from "./run-steps-view.js";
9
8
  import { renderAutomationRun } from "./run.js";
10
9
  import { createAutomationRunHistoryControls } from "./run-history-controls.js";
11
10
  import { findAutomationPosition } from "../../lib/automation-graph-position.js";
12
11
  import { canWrapAutomationSequence } from "../../lib/automation-parallel-depth.js";
13
12
  import { createAutomationTimelineCamera } from "./timeline-camera.js";
14
13
  import { createAutomationLiveView } from "./live-view.js";
15
- import { automationRerunConfirmation } from "./rerun-confirmation.js";
14
+ import { createAutomationConfirmations, createAutomationDestructiveCommands } from "./confirmation-actions.js";
15
+ import { createAutomationWorkspaceNavigation } from "./workspace-navigation.js";
16
16
  import { matchesAutomationGrant, requiresFullPlus, selectedAutomationOperations } from "./permission-selection.js";
17
17
 
18
18
  const DRAG_TYPE = "application/x-abot-automation-step";
@@ -34,6 +34,7 @@ export function paletteNode(target, catalog) {
34
34
  return {
35
35
  kind: "agent", title: agent.title || "New agent", onFailure: agent.onFailure || "stop",
36
36
  modelProfileId: agent.modelProfileId || "", agentMode: agent.agentMode || "fast",
37
+ ...(agent.reasoningPreference ? { reasoningPreference: { ...agent.reasoningPreference } } : {}),
37
38
  roleInstructions: agent.roleInstructions || "", prompt: agent.prompt || "",
38
39
  inputs: agent.inputs || {}, tools: agent.tools || [], result: agent.result || { kind: "text" },
39
40
  ...(Array.isArray(agent.acceptance) ? { acceptance: agent.acceptance } : {}),
@@ -53,10 +54,11 @@ function permissionDialogMarkup(selection, purpose, revision) {
53
54
 
54
55
  export function createAutomationsWorkspace({
55
56
  root, actions, documentRoot = document,
56
- confirmDiscard = (message) => window.confirm(message),
57
+ confirmDiscard,
57
58
  }) {
58
59
  let current = actions.snapshot();
59
60
  let definitionDirty = false;
61
+ let editRevision = 0;
60
62
  let insertion = null;
61
63
  let permissionDialog = null;
62
64
  let paletteQuery = "";
@@ -72,6 +74,9 @@ export function createAutomationsWorkspace({
72
74
  });
73
75
  const liveView = createAutomationLiveView(root);
74
76
  const runHistory = createAutomationRunHistoryControls({ root, actions });
77
+ const confirmationScope = { actions, getCurrent: () => current, getEditRevision: () => editRevision };
78
+ const confirmations = createAutomationConfirmations({ ...confirmationScope, confirm: confirmDiscard });
79
+ const navigation = createAutomationWorkspaceNavigation({ ...confirmationScope, prepareLeave, root });
75
80
 
76
81
  function isDirty() { return definitionDirty || stepEditor.isDirty(); }
77
82
 
@@ -83,10 +88,12 @@ export function createAutomationsWorkspace({
83
88
  function prepareLeave() {
84
89
  if (!stepEditor.prepareLeave()) return false;
85
90
  if (permissionDialog?.open) permissionDialog.close();
86
- if (!isDirty()) return true;
87
- if (!confirmDiscard("Discard unsaved automation changes?")) return false;
88
- definitionDirty = false;
89
- return true;
91
+ if (!isDirty()) { confirmations.invalidate(); return true; }
92
+ return confirmations.prepare("Discard unsaved automation changes?",
93
+ { title: "Discard changes", confirmLabel: "Discard", tone: "danger" }, () => {
94
+ definitionDirty = false;
95
+ return true;
96
+ });
90
97
  }
91
98
 
92
99
  function requireSavedGraph() {
@@ -166,7 +173,7 @@ export function createAutomationsWorkspace({
166
173
  async function selectLibraryTab(name, focus = false) {
167
174
  if (name === activeLibraryTab) return;
168
175
  if (name === "templates" && current.selectedAutomationId) {
169
- if (!prepareLeave() || !await actions.openRoute("", "")) return;
176
+ if (!await navigation.leave(() => actions.openRoute("", ""))) return;
170
177
  }
171
178
  activeLibraryTab = name;
172
179
  activateAutomationLibraryTab(root, name, { focus });
@@ -233,13 +240,6 @@ export function createAutomationsWorkspace({
233
240
  await actions.mutateDraft({ kind: "wrap_parallel", nodeIds: [current.selectedNodeId, position.next.id] });
234
241
  }
235
242
 
236
- async function removeStep() {
237
- if (!requireSavedGraph()) return;
238
- if (!confirmDiscard("Remove this step from the draft?")) return;
239
- const removed = await actions.mutateDraft({ kind: "remove_node", nodeId: current.selectedNodeId });
240
- if (removed) actions.selectNode("");
241
- }
242
-
243
243
  function openPermissionDialog(purpose) {
244
244
  if (permissionDialog?.open) return;
245
245
  const selectedAutomation = current.automations.find((item) => item.id === current.selectedAutomationId);
@@ -292,23 +292,20 @@ export function createAutomationsWorkspace({
292
292
  }
293
293
 
294
294
  const command = {
295
- ...createAutomationDraftRecoveryCommands({ actions, requireSavedGraph, confirmDiscard,
295
+ ...createAutomationDraftRecoveryCommands({ actions, requireSavedGraph,
296
+ confirmDiscard: (message, options) => confirmations.run(message, options, () => true),
296
297
  onRestored: () => { definitionDirty = false; insertion = null; } }),
297
298
  ...createAutomationArchiveCommands({ actions, getCurrent: () => current, requireSavedGraph,
298
- confirmDiscard, onFilterChange: (archived) => { showArchived = archived; } }),
299
+ confirmations, onFilterChange: (archived) => { showArchived = archived; } }),
300
+ ...createAutomationDestructiveCommands({ actions, getCurrent: () => current, requireSavedGraph,
301
+ confirmations, onDraftDeleted: () => { definitionDirty = false; insertion = null; } }),
299
302
  "show-full-step-output": () => actions.showFullStepOutput(),
300
303
  refresh: () => actions.refresh(), create: () => actions.create(),
301
304
  describe: () => actions.openAuthoringChat(current.selectedAutomationId, current.draft?.revision),
302
- back: () => { if (prepareLeave()) return actions.openRoute("", ""); },
305
+ back: () => navigation.leave(() => actions.openRoute("", "")),
303
306
  "save-draft": saveDefinition,
304
307
  "edit-step": () => stepEditor.open(root.querySelector('[data-action="edit-step"]')),
305
308
  "toggle-details": () => { detailsCollapsed = !detailsCollapsed; updateDetailsVisibility(); },
306
- "delete-draft": async () => {
307
- if (!current.draft || current.publishedDefinition ||
308
- current.automations.find((item) => item.id === current.selectedAutomationId)?.publishedRevision) return;
309
- if (!confirmDiscard("Delete this unpublished automation draft and all its steps? This cannot be undone.")) return;
310
- if (await actions.deleteDraft()) { definitionDirty = false; insertion = null; }
311
- },
312
309
  "save-agent": () => { if (requireSavedGraph()) return actions.saveAgent(); },
313
310
  validate: () => { if (requireSavedGraph()) return actions.validate(); },
314
311
  publish: async () => {
@@ -319,19 +316,16 @@ export function createAutomationsWorkspace({
319
316
  run: () => { if (requireSavedGraph()) return actions.startRun(); },
320
317
  "toggle-active": () => current.automations.find((item) => item.id === current.selectedAutomationId)?.status === "active"
321
318
  ? actions.setActive(false) : openPermissionDialog("activate"),
322
- "show-runs": () => {
323
- if (!prepareLeave()) return;
319
+ "show-runs": () => navigation.leave(() => {
324
320
  const runId = current.runs[0]?.id || current.lastViewedRunId;
325
321
  return runId ? actions.openRun(runId) : notify("No runs yet.");
326
- },
327
- editor: () => { if (prepareLeave()) return actions.openRoute(current.selectedAutomationId, ""); },
322
+ }),
323
+ editor: () => navigation.leave(() => actions.openRoute(current.selectedAutomationId, "")),
328
324
  stop: () => actions.stopRun(),
329
- rerun: () => current.run &&
330
- confirmDiscard(automationRerunConfirmation(current.run)) && actions.rerun(),
331
325
  "open-chat-run": () => actions.showChatRun(current.selectedRunId),
332
326
  "move-up": () => moveStep(-1), "move-down": () => moveStep(1),
333
327
  "move-to-slot": moveToSlot,
334
- parallel: wrapParallel, "remove-node": removeStep,
328
+ parallel: wrapParallel,
335
329
  };
336
330
 
337
331
  root.addEventListener("input", (event) => {
@@ -340,10 +334,10 @@ export function createAutomationsWorkspace({
340
334
  refreshToolPalette();
341
335
  return;
342
336
  }
343
- if (event.target.closest("[data-automation-definition-form]")) definitionDirty = true;
337
+ if (event.target.closest("[data-automation-definition-form]")) { definitionDirty = true; editRevision += 1; }
344
338
  });
345
339
  root.addEventListener("change", (event) => {
346
- if (event.target.closest("[data-automation-definition-form]")) definitionDirty = true;
340
+ if (event.target.closest("[data-automation-definition-form]")) { definitionDirty = true; editRevision += 1; }
347
341
  });
348
342
  root.addEventListener("click", (event) => {
349
343
  const element = event.target.closest("button");
@@ -362,28 +356,19 @@ export function createAutomationsWorkspace({
362
356
  return;
363
357
  }
364
358
  if (element.dataset.selectAutomation !== undefined) {
365
- if (prepareLeave()) void actions.openRoute(element.dataset.selectAutomation, "");
359
+ void navigation.leave(() => actions.openRoute(element.dataset.selectAutomation, ""));
366
360
  return;
367
361
  }
368
362
  if (element.dataset.templateId !== undefined) {
369
- if (prepareLeave()) void actions.createTemplate(element.dataset.templateId);
363
+ void navigation.leave(() => actions.createTemplate(element.dataset.templateId));
370
364
  return;
371
365
  }
372
366
  if (element.dataset.selectRun !== undefined) {
373
- if (prepareLeave()) void actions.openRun(element.dataset.selectRun);
367
+ void navigation.leave(() => actions.openRun(element.dataset.selectRun));
374
368
  return;
375
369
  }
376
370
  if (element.dataset.selectNode !== undefined || element.dataset.automationNode !== undefined) {
377
- if (!prepareLeave()) return;
378
- const nodeId = element.dataset.selectNode || element.dataset.automationNode || "";
379
- if (nodeId === current.selectedNodeId || !nodeId) { actions.selectNode(""); return; }
380
- const nodeButton = element.dataset.automationNode !== undefined ? element
381
- : [...root.querySelectorAll("[data-automation-node]")]
382
- .find((item) => item.dataset.automationNode === nodeId);
383
- if (element.dataset.selectNode !== undefined)
384
- nodeButton?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
385
- actions.selectNode(nodeId);
386
- if (current.selectedRunId) focusSelectedAutomationStep(root);
371
+ void navigation.selectNode(element);
387
372
  return;
388
373
  }
389
374
  if (element.dataset.insertParent !== undefined) {
@@ -1,3 +1,5 @@
1
+ import { parseReasoningBudgetMode } from "./reasoning-budget.js";
2
+ import { parseReasoningModeBudgets } from "./reasoning-mode-budgets.js";
1
3
  import {
2
4
  malformedConfigRaw,
3
5
  configRequiresRawRepair,
@@ -292,6 +294,10 @@ export function createConfigWorkspaceModel() {
292
294
  const type = input.dataset.valueType || "string";
293
295
  if (type === "boolean") return input.checked;
294
296
  if (type === "number") return parseNumericConfigInputValue(input);
297
+ if (type === "reasoning-budget-mode")
298
+ return parseReasoningBudgetMode(input.value, getConfigPathValue(file.config, path));
299
+ if (type === "reasoning-mode-budgets")
300
+ return parseReasoningModeBudgets(input.value, getConfigPathValue(file.config, path));
295
301
  if (type === "execution-policy") {
296
302
  return executionPolicyValueForConfig(
297
303
  input.value,
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../confirmation-dialog.js";
1
2
  function isDefinitiveModelRemovalRejection(error) {
2
3
  const status = error?.status;
3
4
  if (!Number.isInteger(status)) return false;
@@ -24,7 +25,7 @@ export function createModelRemovalController({
24
25
  refreshRuntimeConfig,
25
26
  onSaved,
26
27
  setStatus,
27
- confirmRemoval = (message) => window.confirm(message),
28
+ confirmRemoval = (message) => confirmDialog(message, { title: "Remove model", confirmLabel: "Remove model", tone: "danger" }),
28
29
  }) {
29
30
  let pending = false;
30
31
 
@@ -78,11 +79,12 @@ export function createModelRemovalController({
78
79
  pending = true;
79
80
  try {
80
81
  if (
81
- !confirmRemoval(
82
+ !await confirmRemoval(
82
83
  `Remove ${label || profileId} from configured models? Its model file, provider and credentials will be kept.`,
83
84
  )
84
85
  )
85
86
  return false;
87
+ if (environmentId !== getEnvironmentId()) return false;
86
88
  try {
87
89
  await removeModel({ profileId, expectedRevision }, environmentId);
88
90
  } catch (error) {
@@ -1,3 +1,5 @@
1
+ import { isTokenBudgetModel, renderReasoningBudget, renderReasoningEffort } from "./reasoning-budget.js";
2
+ import { renderReasoningModeBudgets } from "./reasoning-mode-budgets.js";
1
3
  import { configRequiresRawRepair } from "./raw-config-repair.js";
2
4
  import { escapeAttribute, escapeHtml, textOf } from "../../lib/text-format.js";
3
5
  import { isConfigObject } from "./config-model.js";
@@ -128,22 +130,9 @@ export function createConfigModelRendering({
128
130
  [...basePath, "generation", "topP"],
129
131
  { type: "number", step: "0.01" },
130
132
  )}</label>
131
- <label><span>Reasoning</span>${renderConfigInput(
132
- file,
133
- [...basePath, "generation", "reasoningEffort"],
134
- {
135
- type: "select",
136
- values: [
137
- "",
138
- "none",
139
- "minimal",
140
- "low",
141
- "medium",
142
- "high",
143
- "xhigh",
144
- ],
145
- },
146
- )}</label>
133
+ ${renderReasoningBudget(file, [...basePath, "generation"], renderConfigInput, { supported: isTokenBudgetModel(file, state.configDashboard, profile), dashboard: state.configDashboard })}
134
+ ${renderReasoningEffort(file, [...basePath, "generation"], renderConfigInput)}
135
+ ${renderReasoningModeBudgets(file, [...basePath, "generation"], renderConfigInput, { supported: isTokenBudgetModel(file, state.configDashboard, profile) })}
147
136
  </div>
148
137
  <button
149
138
  class="config-icon-button config-calibration-remove"
@@ -239,6 +228,9 @@ export function createConfigModelRendering({
239
228
  ["contextWindowTokens"],
240
229
  { type: "number", min: "1", step: "1" },
241
230
  )}</label>
231
+ ${isTokenBudgetModel(model, state.configDashboard) ? renderReasoningEffort(model, ["generation"], renderConfigInput) : ""}
232
+ ${renderReasoningBudget(model, ["generation"], renderConfigInput, { supported: isTokenBudgetModel(model, state.configDashboard), dashboard: state.configDashboard })}
233
+ ${renderReasoningModeBudgets(model, ["generation"], renderConfigInput, { supported: isTokenBudgetModel(model, state.configDashboard) })}
242
234
  </div>
243
235
  ${renderExecutionRoute(model)}
244
236
  </div>