@abot-ai/runtime 1.9.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +5 -1
  2. package/dist/scripts/add-runtime-model.js +11 -5
  3. package/dist/scripts/init-runtime.js +15 -10
  4. package/dist/scripts/runtime-model-addition.js +6 -1
  5. package/dist/scripts/runtime-setup-command-options.d.ts +11 -0
  6. package/dist/scripts/runtime-setup-command-options.js +41 -0
  7. package/dist/scripts/runtime-setup-files.d.ts +3 -2
  8. package/dist/scripts/runtime-setup-files.js +19 -4
  9. package/dist/scripts/runtime-setup-model-options.d.ts +8 -0
  10. package/dist/scripts/runtime-setup-model-options.js +40 -0
  11. package/dist/scripts/runtime-setup-presentation.js +2 -2
  12. package/dist/scripts/runtime-setup-provider-options.d.ts +4 -0
  13. package/dist/scripts/runtime-setup-provider-options.js +20 -0
  14. package/dist/src/model-gateway/client/contracts.d.ts +3 -0
  15. package/dist/src/model-gateway/client/input-token-count.js +36 -16
  16. package/dist/src/model-gateway/client/message-projection.d.ts +2 -0
  17. package/dist/src/model-gateway/client/message-projection.js +1 -0
  18. package/dist/src/model-gateway/client/options.js +1 -1
  19. package/dist/src/model-gateway/client/raw.js +1 -0
  20. package/dist/src/model-gateway/index.d.ts +1 -1
  21. package/dist/src/model-gateway/observability/input-token-count-diagnostics.d.ts +26 -0
  22. package/dist/src/model-gateway/observability/input-token-count-diagnostics.js +178 -0
  23. package/dist/src/model-gateway/policy/invocation-policy.d.ts +1 -3
  24. package/dist/src/model-gateway/policy/invocation-policy.js +3 -30
  25. package/dist/src/model-gateway/policy/reasoning-mode-budget.d.ts +5 -0
  26. package/dist/src/model-gateway/policy/reasoning-mode-budget.js +13 -0
  27. package/dist/src/model-gateway/policy/reasoning-policy.d.ts +10 -0
  28. package/dist/src/model-gateway/policy/reasoning-policy.js +124 -0
  29. package/dist/src/model-gateway/protocol/openai-embedding-response.d.ts +1 -0
  30. package/dist/src/model-gateway/protocol/openai-embedding-response.js +28 -0
  31. package/dist/src/model-gateway/protocol/sse-data.d.ts +9 -0
  32. package/dist/src/model-gateway/protocol/sse-data.js +67 -0
  33. package/dist/src/model-gateway/providers/envelope-budget.js +10 -1
  34. package/dist/src/model-gateway/providers/llamacpp/adapter.d.ts +2 -0
  35. package/dist/src/model-gateway/providers/llamacpp/adapter.js +79 -0
  36. package/dist/src/model-gateway/providers/llamacpp/connection.d.ts +9 -0
  37. package/dist/src/model-gateway/providers/llamacpp/connection.js +73 -0
  38. package/dist/src/model-gateway/providers/llamacpp/diagnostics.d.ts +2 -0
  39. package/dist/src/model-gateway/providers/llamacpp/diagnostics.js +17 -0
  40. package/dist/src/model-gateway/providers/llamacpp/embeddings.d.ts +2 -0
  41. package/dist/src/model-gateway/providers/llamacpp/embeddings.js +56 -0
  42. package/dist/src/model-gateway/providers/llamacpp/input-token-count.d.ts +3 -0
  43. package/dist/src/model-gateway/providers/llamacpp/input-token-count.js +59 -0
  44. package/dist/src/model-gateway/providers/llamacpp/message-projection.d.ts +2 -0
  45. package/dist/src/model-gateway/providers/llamacpp/message-projection.js +33 -0
  46. package/dist/src/model-gateway/providers/llamacpp/payload.d.ts +2 -0
  47. package/dist/src/model-gateway/providers/llamacpp/payload.js +44 -0
  48. package/dist/src/model-gateway/providers/llamacpp/response-lifetime.d.ts +1 -0
  49. package/dist/src/model-gateway/providers/llamacpp/response-lifetime.js +56 -0
  50. package/dist/src/model-gateway/providers/llamacpp/schema-format.d.ts +2 -0
  51. package/dist/src/model-gateway/providers/llamacpp/schema-format.js +29 -0
  52. package/dist/src/model-gateway/providers/llamacpp/settings.d.ts +9 -0
  53. package/dist/src/model-gateway/providers/llamacpp/settings.js +25 -0
  54. package/dist/src/model-gateway/providers/llamacpp/stream-normalizer.d.ts +10 -0
  55. package/dist/src/model-gateway/providers/llamacpp/stream-normalizer.js +85 -0
  56. package/dist/src/model-gateway/providers/llamacpp/stream.d.ts +9 -0
  57. package/dist/src/model-gateway/providers/llamacpp/stream.js +33 -0
  58. package/dist/src/model-gateway/providers/openai/embeddings.js +2 -29
  59. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +1 -9
  60. package/dist/src/model-gateway/providers/openai/sse-data.js +1 -67
  61. package/dist/src/model-gateway/providers/registry.js +2 -0
  62. package/dist/src/model-gateway/server/input-token-count-handler.js +10 -1
  63. package/dist/src/model-gateway/types.d.ts +11 -1
  64. package/dist/src/runtime/adapters/long-term-memory/onboarding-provider-availability.d.ts +4 -0
  65. package/dist/src/runtime/adapters/long-term-memory/onboarding-provider-availability.js +11 -0
  66. package/dist/src/runtime/adapters/long-term-memory/onboarding-service.js +28 -1
  67. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.d.ts +1 -0
  68. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.js +6 -1
  69. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/contracts.d.ts +1 -0
  70. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.d.ts +1 -0
  71. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +2 -0
  72. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.d.ts +1 -0
  73. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.js +2 -0
  74. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.d.ts +1 -0
  75. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.js +1 -0
  76. package/dist/src/runtime/adapters/registered-tool-worker-capabilities.js +1 -0
  77. package/dist/src/runtime/adapters/scheduler-runtime.js +2 -0
  78. package/dist/src/runtime/automations/agent-step-executor.js +1 -0
  79. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  80. package/dist/src/runtime/automations/catalog.js +2 -0
  81. package/dist/src/runtime/automations/definition-contracts.d.ts +2 -0
  82. package/dist/src/runtime/automations/definition-input.js +3 -1
  83. package/dist/src/runtime/automations/draft-mutations.js +5 -1
  84. package/dist/src/runtime/automations/model-dependency-projection.d.ts +3 -1
  85. package/dist/src/runtime/automations/model-dependency-projection.js +4 -2
  86. package/dist/src/runtime/automations/publication-validation.js +7 -0
  87. package/dist/src/runtime/automations/saved-agent-management.js +1 -0
  88. package/dist/src/runtime/automations/service.d.ts +3 -0
  89. package/dist/src/runtime/capabilities/automation-builder/payload-schema.js +7 -5
  90. package/dist/src/runtime/capabilities/automations/authoring-catalog.d.ts +9 -0
  91. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -0
  92. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +3 -0
  93. package/dist/src/runtime/capabilities/automations/tool-contract.js +3 -2
  94. package/dist/src/runtime/capabilities/automations/tool-module.js +16 -7
  95. package/dist/src/runtime/capabilities/model-reasoning-controls.d.ts +23 -0
  96. package/dist/src/runtime/capabilities/model-reasoning-controls.js +56 -0
  97. package/dist/src/runtime/capabilities/scheduling/create-operations.js +2 -0
  98. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +1 -0
  99. package/dist/src/runtime/capabilities/scheduling/tool-module.js +5 -2
  100. package/dist/src/runtime/capabilities/scheduling/update-operations.js +2 -0
  101. package/dist/src/runtime/config/builders.js +6 -0
  102. package/dist/src/runtime/config/effective-model-config-validation.js +4 -0
  103. package/dist/src/runtime/config/llamacpp-profile-validation.d.ts +3 -0
  104. package/dist/src/runtime/config/llamacpp-profile-validation.js +15 -0
  105. package/dist/src/runtime/config/model-reasoning-schema.d.ts +40 -0
  106. package/dist/src/runtime/config/model-reasoning-schema.js +38 -0
  107. package/dist/src/runtime/config/model-reasoning-validation.d.ts +3 -0
  108. package/dist/src/runtime/config/model-reasoning-validation.js +37 -0
  109. package/dist/src/runtime/config/runner/step-instructions.d.ts +4 -0
  110. package/dist/src/runtime/config/runner/step-instructions.js +10 -6
  111. package/dist/src/runtime/config/schema.js +3 -0
  112. package/dist/src/runtime/config/validation/model-invocation-config-validation.js +14 -0
  113. package/dist/src/runtime/context/compacted-capability-result-receipt.d.ts +2 -0
  114. package/dist/src/runtime/context/compacted-capability-result-receipt.js +8 -7
  115. package/dist/src/runtime/context/execution-compacted-evidence.d.ts +4 -0
  116. package/dist/src/runtime/context/execution-compacted-evidence.js +2 -23
  117. package/dist/src/runtime/context/execution-compaction-checkpoint-selection.d.ts +19 -0
  118. package/dist/src/runtime/context/execution-compaction-checkpoint-selection.js +104 -0
  119. package/dist/src/runtime/context/model-step-compaction-inheritance.d.ts +12 -0
  120. package/dist/src/runtime/context/model-step-compaction-inheritance.js +28 -0
  121. package/dist/src/runtime/context/model-step-compaction-projection.d.ts +12 -0
  122. package/dist/src/runtime/context/model-step-compaction-projection.js +322 -0
  123. package/dist/src/runtime/context/model-step-compaction.d.ts +2 -1
  124. package/dist/src/runtime/context/model-step-compaction.js +25 -316
  125. package/dist/src/runtime/context/operation-supervision-compacted-evidence.js +7 -1
  126. package/dist/src/runtime/context/request-context.d.ts +2 -0
  127. package/dist/src/runtime/context/request-context.js +16 -0
  128. package/dist/src/runtime/context/request-tool-results-checkpoint.d.ts +2 -1
  129. package/dist/src/runtime/context/request-tool-results-checkpoint.js +35 -6
  130. package/dist/src/runtime/context/request-tool-results.js +3 -1
  131. package/dist/src/runtime/context/semantic-compaction/checkpoint-message.d.ts +5 -1
  132. package/dist/src/runtime/context/semantic-compaction/checkpoint-message.js +10 -4
  133. package/dist/src/runtime/context/semantic-compaction/execution-evidence-instructions.d.ts +4 -0
  134. package/dist/src/runtime/context/semantic-compaction/execution-evidence-instructions.js +38 -0
  135. package/dist/src/runtime/context/semantic-compaction/generation-contracts.d.ts +3 -1
  136. package/dist/src/runtime/context/semantic-compaction/generation-input.js +15 -10
  137. package/dist/src/runtime/context/semantic-compaction/inherited-source-digests.d.ts +8 -0
  138. package/dist/src/runtime/context/semantic-compaction/inherited-source-digests.js +76 -0
  139. package/dist/src/runtime/context/semantic-compaction/replacement-budget.js +3 -1
  140. package/dist/src/runtime/context/semantic-compaction/run.js +6 -12
  141. package/dist/src/runtime/knowledge-skills/builtins/computer-use.js +1 -1
  142. package/dist/src/runtime/knowledge-skills/builtins/technical-work.js +20 -2
  143. package/dist/src/runtime/knowledge-skills/builtins/what-can-i-do.d.ts +2 -0
  144. package/dist/src/runtime/knowledge-skills/builtins/what-can-i-do.js +27 -0
  145. package/dist/src/runtime/knowledge-skills/catalog.js +2 -0
  146. package/dist/src/runtime/local-application.d.ts +5 -0
  147. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -1
  148. package/dist/src/runtime/local-host/app-service-dispatch.js +2 -0
  149. package/dist/src/runtime/local-host/client-services.d.ts +5 -0
  150. package/dist/src/runtime/local-host/saved-approvals.js +1 -0
  151. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +5 -7
  152. package/dist/src/runtime/long-term-memory/onboarding/contracts.d.ts +26 -0
  153. package/dist/src/runtime/long-term-memory/onboarding/embedding-profile-id.d.ts +1 -0
  154. package/dist/src/runtime/long-term-memory/onboarding/embedding-profile-id.js +8 -0
  155. package/dist/src/runtime/long-term-memory/onboarding/saved-profiles.d.ts +17 -0
  156. package/dist/src/runtime/long-term-memory/onboarding/saved-profiles.js +77 -0
  157. package/dist/src/runtime/long-term-memory/onboarding/service.js +40 -10
  158. package/dist/src/runtime/model/input-token-count.js +1 -0
  159. package/dist/src/runtime/model/invoke-step.js +12 -0
  160. package/dist/src/runtime/model/invoke-structured-step.d.ts +4 -1
  161. package/dist/src/runtime/model/invoke-structured-step.js +4 -0
  162. package/dist/src/runtime/model/model-catalog.d.ts +3 -0
  163. package/dist/src/runtime/model/model-catalog.js +2 -0
  164. package/dist/src/runtime/model/model-context-budget.d.ts +5 -0
  165. package/dist/src/runtime/model/model-context-budget.js +2 -0
  166. package/dist/src/runtime/model/model-step-port.d.ts +7 -0
  167. package/dist/src/runtime/model/optional-context-admission.d.ts +18 -0
  168. package/dist/src/runtime/model/optional-context-admission.js +23 -0
  169. package/dist/src/runtime/ports.d.ts +3 -1
  170. package/dist/src/runtime/projects/contracts.d.ts +6 -0
  171. package/dist/src/runtime/projects/registry-format.d.ts +3 -0
  172. package/dist/src/runtime/projects/registry-format.js +50 -0
  173. package/dist/src/runtime/projects/repository.d.ts +6 -3
  174. package/dist/src/runtime/projects/repository.js +26 -19
  175. package/dist/src/runtime/projects/service.js +11 -0
  176. package/dist/src/runtime/request/approval-wait/preflight.js +1 -0
  177. package/dist/src/runtime/request/approval-wait/snapshot.d.ts +1 -1
  178. package/dist/src/runtime/request/approval-wait/snapshot.js +1 -0
  179. package/dist/src/runtime/request/contracts.d.ts +5 -1
  180. package/dist/src/runtime/request/execution-facets.js +2 -0
  181. package/dist/src/runtime/request/execution-payload-artifact-policy.d.ts +3 -0
  182. package/dist/src/runtime/request/execution-payload-artifact-policy.js +6 -0
  183. package/dist/src/runtime/request/execution-payload-compacted-evidence.js +1 -0
  184. package/dist/src/runtime/request/execution-scope-surfaces.d.ts +2 -0
  185. package/dist/src/runtime/request/execution-scope-surfaces.js +3 -0
  186. package/dist/src/runtime/request/execution-scope.d.ts +2 -0
  187. package/dist/src/runtime/request/execution-scope.js +2 -0
  188. package/dist/src/runtime/request/input.d.ts +1 -0
  189. package/dist/src/runtime/request/input.js +1 -0
  190. package/dist/src/runtime/request/prepared-execution.d.ts +1 -0
  191. package/dist/src/runtime/request/prepared-execution.js +3 -0
  192. package/dist/src/runtime/request/reasoning-preference.d.ts +10 -0
  193. package/dist/src/runtime/request/reasoning-preference.js +29 -0
  194. package/dist/src/runtime/request/root-reference-action.js +3 -3
  195. package/dist/src/runtime/request/root-skill-read-admission.d.ts +4 -0
  196. package/dist/src/runtime/request/root-skill-read-admission.js +14 -0
  197. package/dist/src/runtime/request/root-skill-read.js +13 -5
  198. package/dist/src/runtime/request/supervisor-skill-selection-window.d.ts +16 -0
  199. package/dist/src/runtime/request/supervisor-skill-selection-window.js +17 -0
  200. package/dist/src/runtime/request/worker-capability-composition.js +2 -0
  201. package/dist/src/runtime/scheduler/contracts.d.ts +7 -1
  202. package/dist/src/runtime/scheduler/job-management.js +7 -1
  203. package/dist/src/runtime/scheduler/run-records.js +2 -0
  204. package/dist/src/runtime/scheduler/schedule-validation.js +2 -0
  205. package/dist/src/runtime/scheduler/scheduler-engine.js +1 -0
  206. package/dist/src/runtime/scheduler/snapshot-validation.js +2 -0
  207. package/dist/src/runtime/steps/auditor-decision/projection.js +2 -0
  208. package/dist/src/runtime/steps/execution-agent/capability-controls-partition.d.ts +9 -0
  209. package/dist/src/runtime/steps/execution-agent/capability-controls-partition.js +29 -0
  210. package/dist/src/runtime/steps/execution-agent/capability-scope.d.ts +17 -0
  211. package/dist/src/runtime/steps/execution-agent/capability-scope.js +54 -0
  212. package/dist/src/runtime/steps/execution-agent/compaction.js +22 -6
  213. package/dist/src/runtime/steps/execution-agent/controls-compacted-evidence.js +2 -0
  214. package/dist/src/runtime/steps/execution-agent/evidence-reuse-instructions.d.ts +6 -0
  215. package/dist/src/runtime/steps/execution-agent/evidence-reuse-instructions.js +13 -0
  216. package/dist/src/runtime/steps/execution-agent/format.js +3 -6
  217. package/dist/src/runtime/steps/execution-agent/input.d.ts +5 -1
  218. package/dist/src/runtime/steps/execution-agent/input.js +10 -36
  219. package/dist/src/runtime/steps/execution-agent/observation-guidance.d.ts +11 -0
  220. package/dist/src/runtime/steps/execution-agent/observation-guidance.js +33 -0
  221. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  222. package/dist/src/runtime/steps/execution-agent/refinement.d.ts +3 -2
  223. package/dist/src/runtime/steps/execution-agent/refinement.js +17 -6
  224. package/dist/src/runtime/steps/execution-agent/run.js +7 -1
  225. package/dist/src/runtime/steps/skill-read-decision.d.ts +1 -0
  226. package/dist/src/runtime/steps/skill-read-decision.js +9 -4
  227. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.d.ts +6 -1
  228. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.js +15 -0
  229. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +1 -1
  230. package/dist/src/runtime/steps/supervisor-decision/contracts.js +2 -0
  231. package/dist/src/runtime/steps/supervisor-decision/decision-phases.d.ts +3 -0
  232. package/dist/src/runtime/steps/supervisor-decision/decision-phases.js +22 -3
  233. package/dist/src/runtime/steps/supervisor-decision/delegation-contract.d.ts +9 -0
  234. package/dist/src/runtime/steps/supervisor-decision/delegation-contract.js +82 -0
  235. package/dist/src/runtime/steps/supervisor-decision/delegation-input.d.ts +7 -0
  236. package/dist/src/runtime/steps/supervisor-decision/delegation-input.js +105 -0
  237. package/dist/src/runtime/steps/supervisor-decision/delegation-prompt.d.ts +7 -0
  238. package/dist/src/runtime/steps/supervisor-decision/delegation-prompt.js +13 -0
  239. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  240. package/dist/src/runtime/steps/supervisor-decision/preparation-input.d.ts +3 -5
  241. package/dist/src/runtime/steps/supervisor-decision/preparation-input.js +5 -21
  242. package/dist/src/runtime/steps/supervisor-decision/preparation.d.ts +4 -1
  243. package/dist/src/runtime/steps/supervisor-decision/preparation.js +58 -6
  244. package/dist/src/runtime/steps/supervisor-decision/procedure-entry.d.ts +22 -0
  245. package/dist/src/runtime/steps/supervisor-decision/procedure-entry.js +61 -0
  246. package/dist/src/runtime/steps/supervisor-decision/procedure-gate.d.ts +39 -0
  247. package/dist/src/runtime/steps/supervisor-decision/procedure-gate.js +146 -0
  248. package/dist/src/runtime/steps/supervisor-decision/procedure-memory.d.ts +9 -0
  249. package/dist/src/runtime/steps/supervisor-decision/procedure-memory.js +100 -0
  250. package/dist/src/runtime/steps/supervisor-decision/procedure-recall.d.ts +10 -0
  251. package/dist/src/runtime/steps/supervisor-decision/procedure-recall.js +52 -0
  252. package/dist/src/runtime/steps/supervisor-decision/prompt.js +3 -16
  253. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +2 -2
  254. package/dist/src/runtime/steps/supervisor-decision/role-guidance.d.ts +3 -0
  255. package/dist/src/runtime/steps/supervisor-decision/role-guidance.js +20 -0
  256. package/dist/src/runtime/steps/supervisor-decision/run.js +50 -7
  257. package/dist/src/runtime/steps/supervisor-decision/skill-read-state.d.ts +10 -0
  258. package/dist/src/runtime/steps/supervisor-decision/skill-read-state.js +45 -0
  259. package/dist/src/runtime/steps/supervisor-decision/skill-selection-candidates.d.ts +15 -0
  260. package/dist/src/runtime/steps/supervisor-decision/skill-selection-candidates.js +25 -0
  261. package/dist/src/runtime/steps/supervisor-decision/skill-selection-catalog.d.ts +3 -0
  262. package/dist/src/runtime/steps/supervisor-decision/skill-selection-catalog.js +15 -0
  263. package/dist/src/runtime/steps/supervisor-decision/skill-selection-continuation.d.ts +10 -0
  264. package/dist/src/runtime/steps/supervisor-decision/skill-selection-continuation.js +65 -0
  265. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.d.ts +3 -1
  266. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.js +20 -22
  267. package/dist/src/runtime/steps/supervisor-decision/skill-selection.d.ts +3 -2
  268. package/dist/src/runtime/steps/supervisor-decision/skill-selection.js +62 -15
  269. package/dist/src/runtime/steps/supervisor-response/prompt.js +18 -4
  270. package/dist/src/shared/model-reasoning-modes.d.ts +5 -0
  271. package/dist/src/shared/model-reasoning-modes.js +20 -0
  272. package/dist/src/shared/model-reasoning-schema.d.ts +38 -0
  273. package/dist/src/shared/model-reasoning-schema.js +29 -0
  274. package/dist/src/shared/model-reasoning.d.ts +35 -0
  275. package/dist/src/shared/model-reasoning.js +100 -0
  276. package/dist/src/web-ui/app/ARCHITECTURE.md +13 -0
  277. package/dist/src/web-ui/app/app-bootstrap.js +9 -12
  278. package/dist/src/web-ui/app/app-dom.js +6 -1
  279. package/dist/src/web-ui/app/app-state.js +1 -0
  280. package/dist/src/web-ui/app/app.js +8 -3
  281. package/dist/src/web-ui/app/appearance-feature.js +28 -0
  282. package/dist/src/web-ui/app/automations-feature.js +20 -11
  283. package/dist/src/web-ui/app/components/appearance-dialog.js +79 -0
  284. package/dist/src/web-ui/app/components/automations/archive-actions.js +5 -3
  285. package/dist/src/web-ui/app/components/automations/authoring-entry.js +26 -7
  286. package/dist/src/web-ui/app/components/automations/confirmation-actions.js +78 -0
  287. package/dist/src/web-ui/app/components/automations/draft-recovery-actions.js +1 -0
  288. package/dist/src/web-ui/app/components/automations/node-inspector.js +5 -1
  289. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +4 -2
  290. package/dist/src/web-ui/app/components/automations/timeline.js +2 -2
  291. package/dist/src/web-ui/app/components/automations/workspace-navigation.js +37 -0
  292. package/dist/src/web-ui/app/components/automations/workspace.js +31 -46
  293. package/dist/src/web-ui/app/components/config-workspace/config-model.js +6 -0
  294. package/dist/src/web-ui/app/components/config-workspace/model-removal.js +4 -2
  295. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +8 -16
  296. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget-edit.js +113 -0
  297. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget.d.ts +16 -0
  298. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget.js +67 -0
  299. package/dist/src/web-ui/app/components/config-workspace/reasoning-mode-budgets.d.ts +7 -0
  300. package/dist/src/web-ui/app/components/config-workspace/reasoning-mode-budgets.js +25 -0
  301. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +15 -7
  302. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +32 -12
  303. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +1 -1
  304. package/dist/src/web-ui/app/components/config-workspace.js +2 -1
  305. package/dist/src/web-ui/app/components/confirmation-dialog.js +88 -0
  306. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  307. package/dist/src/web-ui/app/components/conversation-activity.js +32 -3
  308. package/dist/src/web-ui/app/components/conversation-memory-activity.js +31 -0
  309. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +2 -0
  310. package/dist/src/web-ui/app/components/conversation-role-cards.js +14 -11
  311. package/dist/src/web-ui/app/components/conversation-skill-activity.js +67 -0
  312. package/dist/src/web-ui/app/components/conversation-tools.js +5 -5
  313. package/dist/src/web-ui/app/components/conversation-view.js +6 -0
  314. package/dist/src/web-ui/app/components/dashboard/approvals.js +13 -1
  315. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-dialog.d.ts +38 -0
  316. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-dialog.js +289 -0
  317. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-feature.js +75 -0
  318. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-rendering.js +31 -0
  319. package/dist/src/web-ui/app/components/long-term-memory/manager.js +15 -5
  320. package/dist/src/web-ui/app/components/long-term-memory/saved-embedding-profiles.js +114 -0
  321. package/dist/src/web-ui/app/components/long-term-memory/setup-rendering.js +55 -0
  322. package/dist/src/web-ui/app/components/long-term-memory-setup.js +141 -76
  323. package/dist/src/web-ui/app/components/model-setup/rendering.js +3 -2
  324. package/dist/src/web-ui/app/components/model-setup/validation.js +6 -2
  325. package/dist/src/web-ui/app/components/model-setup/wizard.d.ts +1 -0
  326. package/dist/src/web-ui/app/components/model-setup/wizard.js +28 -5
  327. package/dist/src/web-ui/app/components/passive-learning/memory.js +12 -5
  328. package/dist/src/web-ui/app/components/plugins/manager.js +14 -0
  329. package/dist/src/web-ui/app/components/plugins/removal.js +10 -2
  330. package/dist/src/web-ui/app/components/project-group-actions.js +35 -0
  331. package/dist/src/web-ui/app/components/project-session-groups.js +17 -31
  332. package/dist/src/web-ui/app/components/runtime-setup/commands.js +1 -1
  333. package/dist/src/web-ui/app/components/runtime-setup/connection-form.d.ts +15 -0
  334. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +32 -9
  335. package/dist/src/web-ui/app/components/runtime-setup/connection-input.js +23 -0
  336. package/dist/src/web-ui/app/components/runtime-setup/connection-inspection.js +57 -0
  337. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +18 -4
  338. package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.js +3 -0
  339. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-options.js +54 -0
  340. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-receipt.js +3 -0
  341. package/dist/src/web-ui/app/components/runtime-setup/embedding-rendering.js +22 -22
  342. package/dist/src/web-ui/app/components/runtime-setup/embedding.js +60 -16
  343. package/dist/src/web-ui/app/components/runtime-setup/reasoning-fields.d.ts +17 -0
  344. package/dist/src/web-ui/app/components/runtime-setup/reasoning-fields.js +54 -0
  345. package/dist/src/web-ui/app/components/runtime-setup/validation.js +5 -1
  346. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +9 -3
  347. package/dist/src/web-ui/app/components/runtime-setup-guide.js +20 -29
  348. package/dist/src/web-ui/app/components/schedules/details.js +2 -2
  349. package/dist/src/web-ui/app/components/schedules/form.js +12 -5
  350. package/dist/src/web-ui/app/components/schedules/workspace.js +30 -18
  351. package/dist/src/web-ui/app/components/session-list-viewport.js +49 -0
  352. package/dist/src/web-ui/app/components/session-search-disclosure.js +27 -0
  353. package/dist/src/web-ui/app/components/skills/workspace.js +7 -3
  354. package/dist/src/web-ui/app/components/spark-chat/panel.js +7 -3
  355. package/dist/src/web-ui/app/components/spark-chat/settings.js +57 -15
  356. package/dist/src/web-ui/app/components/tool-approval-card.d.ts +2 -1
  357. package/dist/src/web-ui/app/components/tool-approval-card.js +10 -2
  358. package/dist/src/web-ui/app/components/tool-approval-rejection-input.js +116 -0
  359. package/dist/src/web-ui/app/components/workspace-shell.js +30 -38
  360. package/dist/src/web-ui/app/components/workspace-transitions.js +42 -0
  361. package/dist/src/web-ui/app/configuration-feature.js +34 -4
  362. package/dist/src/web-ui/app/controllers/app-event-bindings.js +45 -29
  363. package/dist/src/web-ui/app/controllers/appearance-controller.js +105 -0
  364. package/dist/src/web-ui/app/controllers/automations-controller.js +9 -1
  365. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +1 -1
  366. package/dist/src/web-ui/app/controllers/composer-feature.js +10 -3
  367. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +1 -1
  368. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +9 -3
  369. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +1 -1
  370. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +8 -2
  371. package/dist/src/web-ui/app/controllers/dashboard-approvals-controller.js +10 -9
  372. package/dist/src/web-ui/app/controllers/environment-transition.js +2 -2
  373. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +9 -7
  374. package/dist/src/web-ui/app/controllers/preference-view-sync.js +35 -0
  375. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +4 -0
  376. package/dist/src/web-ui/app/controllers/projects-controller.js +64 -3
  377. package/dist/src/web-ui/app/controllers/reasoning-budget-controller.d.ts +17 -0
  378. package/dist/src/web-ui/app/controllers/reasoning-budget-controller.js +80 -0
  379. package/dist/src/web-ui/app/controllers/reasoning-budget-menu-events.js +45 -0
  380. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +35 -40
  381. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +6 -1
  382. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +16 -3
  383. package/dist/src/web-ui/app/controllers/session-controller.js +34 -9
  384. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +4 -3
  385. package/dist/src/web-ui/app/controllers/skills-controller.js +33 -16
  386. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +1 -1
  387. package/dist/src/web-ui/app/controllers/spark-handoff-navigation.js +7 -1
  388. package/dist/src/web-ui/app/controllers/tool-approval-controller.d.ts +2 -1
  389. package/dist/src/web-ui/app/controllers/tool-approval-controller.js +36 -3
  390. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +8 -2
  391. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +41 -10
  392. package/dist/src/web-ui/app/index.html +38 -32
  393. package/dist/src/web-ui/app/lib/color-palettes.d.ts +17 -0
  394. package/dist/src/web-ui/app/lib/color-palettes.js +20 -0
  395. package/dist/src/web-ui/app/lib/memory-activity-model.d.ts +12 -0
  396. package/dist/src/web-ui/app/lib/memory-activity-model.js +61 -0
  397. package/dist/src/web-ui/app/lib/navigation-display.d.ts +8 -0
  398. package/dist/src/web-ui/app/lib/navigation-display.js +12 -0
  399. package/dist/src/web-ui/app/lib/reasoning-controls.js +47 -6
  400. package/dist/src/web-ui/app/lib/reasoning-preference.d.ts +9 -0
  401. package/dist/src/web-ui/app/lib/reasoning-preference.js +75 -0
  402. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +4 -0
  403. package/dist/src/web-ui/app/lib/session-composer-queue.js +4 -0
  404. package/dist/src/web-ui/app/lib/session-project-groups.js +28 -0
  405. package/dist/src/web-ui/app/lib/session-sidebar-order.js +7 -5
  406. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +1 -0
  407. package/dist/src/web-ui/app/lib/tool-activity-event.js +1 -0
  408. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +1 -0
  409. package/dist/src/web-ui/app/lib/tool-activity-model.js +1 -0
  410. package/dist/src/web-ui/app/lib/tool-approval-rejection-drafts.js +45 -0
  411. package/dist/src/web-ui/app/lib/tool-skill-activity-fields.js +1 -1
  412. package/dist/src/web-ui/app/notifications-feature.js +10 -2
  413. package/dist/src/web-ui/app/passive-learning-feature.js +2 -2
  414. package/dist/src/web-ui/app/projects-feature.js +40 -10
  415. package/dist/src/web-ui/app/runtime-onboarding-feature.js +1 -0
  416. package/dist/src/web-ui/app/schedules-feature.js +28 -5
  417. package/dist/src/web-ui/app/services/client-preferences.d.ts +4 -1
  418. package/dist/src/web-ui/app/services/client-preferences.js +2 -0
  419. package/dist/src/web-ui/app/services/conversation-reasoning-preferences.d.ts +11 -0
  420. package/dist/src/web-ui/app/services/conversation-reasoning-preferences.js +30 -0
  421. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +6 -4
  422. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +5 -0
  423. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +21 -0
  424. package/dist/src/web-ui/app/services/runtime-web-client/projects.d.ts +2 -1
  425. package/dist/src/web-ui/app/services/runtime-web-client/projects.js +4 -0
  426. package/dist/src/web-ui/app/services/runtime-web-client/tool-approvals.js +2 -0
  427. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +16 -0
  428. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  429. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +33 -13
  430. package/dist/src/web-ui/app/skills-feature.js +2 -3
  431. package/dist/src/web-ui/app/spark-chat-conversation.js +29 -3
  432. package/dist/src/web-ui/app/spark-chat-feature.js +13 -7
  433. package/dist/src/web-ui/app/styles/01-color-palettes.css +90 -0
  434. package/dist/src/web-ui/app/styles/11-product-links.css +6 -2
  435. package/dist/src/web-ui/app/styles/11-workspace-header-width.css +37 -25
  436. package/dist/src/web-ui/app/styles/12-conversation-sidebar.css +56 -22
  437. package/dist/src/web-ui/app/styles/13-projects.css +56 -19
  438. package/dist/src/web-ui/app/styles/19-runtime-setup.css +16 -0
  439. package/dist/src/web-ui/app/styles/22-reasoning-budget.css +39 -0
  440. package/dist/src/web-ui/app/styles/27-conversation-memory.css +45 -0
  441. package/dist/src/web-ui/app/styles/27-conversation-skills.css +96 -0
  442. package/dist/src/web-ui/app/styles/28-tool-approval-card.css +38 -1
  443. package/dist/src/web-ui/app/styles/35-embedding-profiles.css +159 -0
  444. package/dist/src/web-ui/app/styles/54-spark-chat.css +62 -46
  445. package/dist/src/web-ui/app/styles/65-appearance.css +60 -0
  446. package/dist/src/web-ui/app/styles/66-navigation-display.css +30 -0
  447. package/dist/src/web-ui/app/styles/67-confirmation-dialog.css +32 -0
  448. package/dist/src/web-ui/app/styles.css +8 -0
  449. package/dist/src/web-ui/client-state/preference-shapes.js +6 -1
  450. package/dist/src/web-ui/client-state/preferences.js +8 -2
  451. package/dist/src/web-ui/client-state/reasoning-preference-shape.d.ts +1 -0
  452. package/dist/src/web-ui/client-state/reasoning-preference-shape.js +18 -0
  453. package/dist/src/web-ui/local-runtime/api-router.d.ts +1 -0
  454. package/dist/src/web-ui/local-runtime/api-router.js +11 -0
  455. package/dist/src/web-ui/local-runtime/memory-embedding-connection-input.d.ts +7 -0
  456. package/dist/src/web-ui/local-runtime/memory-embedding-connection-input.js +22 -0
  457. package/dist/src/web-ui/local-runtime/memory-embedding-connection-service.d.ts +20 -0
  458. package/dist/src/web-ui/local-runtime/memory-embedding-connection-service.js +47 -0
  459. package/dist/src/web-ui/local-runtime/memory-onboarding-routes.js +32 -0
  460. package/dist/src/web-ui/local-runtime/model-connection-inspection.d.ts +7 -0
  461. package/dist/src/web-ui/local-runtime/model-connection-inspection.js +48 -0
  462. package/dist/src/web-ui/local-runtime/model-setup-catalog.d.ts +2 -1
  463. package/dist/src/web-ui/local-runtime/model-setup-catalog.js +3 -1
  464. package/dist/src/web-ui/local-runtime/model-setup-identity.js +1 -1
  465. package/dist/src/web-ui/local-runtime/model-setup-input.d.ts +5 -2
  466. package/dist/src/web-ui/local-runtime/model-setup-input.js +29 -6
  467. package/dist/src/web-ui/local-runtime/model-setup-provider.d.ts +1 -1
  468. package/dist/src/web-ui/local-runtime/model-setup-provider.js +9 -6
  469. package/dist/src/web-ui/local-runtime/model-setup-retry.js +4 -1
  470. package/dist/src/web-ui/local-runtime/model-setup-service.d.ts +2 -1
  471. package/dist/src/web-ui/local-runtime/pending-tool-approvals.js +4 -1
  472. package/dist/src/web-ui/local-runtime/project-routes.js +10 -2
  473. package/dist/src/web-ui/local-runtime/request-execution.js +1 -0
  474. package/dist/src/web-ui/local-runtime/runtime-setup-auth.d.ts +2 -0
  475. package/dist/src/web-ui/local-runtime/runtime-setup-auth.js +20 -0
  476. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +3 -2
  477. package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.js +6 -1
  478. package/dist/src/web-ui/local-runtime/runtime-setup-input.d.ts +3 -2
  479. package/dist/src/web-ui/local-runtime/runtime-setup-input.js +17 -5
  480. package/dist/src/web-ui/local-runtime/runtime-setup-provider.d.ts +4 -1
  481. package/dist/src/web-ui/local-runtime/runtime-setup-provider.js +6 -2
  482. package/dist/src/web-ui/local-runtime/runtime-setup-routes.d.ts +11 -2
  483. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +11 -2
  484. package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.js +3 -2
  485. package/dist/src/web-ui/local-runtime/runtime-setup-service.d.ts +25 -4
  486. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +19 -9
  487. package/dist/src/web-ui/local-runtime/setup-embedding-input.d.ts +3 -1
  488. package/dist/src/web-ui/local-runtime/setup-embedding-input.js +38 -6
  489. package/dist/src/web-ui/local-runtime/setup-embedding-llamacpp.d.ts +11 -0
  490. package/dist/src/web-ui/local-runtime/setup-embedding-llamacpp.js +53 -0
  491. package/dist/src/web-ui/local-runtime/setup-embedding-provider.js +23 -9
  492. package/dist/src/web-ui/local-runtime/setup-embedding-routes.d.ts +7 -2
  493. package/dist/src/web-ui/local-runtime/setup-embedding-routes.js +5 -3
  494. package/dist/src/web-ui/local-runtime/setup-embedding-service.d.ts +1 -0
  495. package/docs/configuration.md +10 -8
  496. package/docs/installation.md +11 -5
  497. package/docs/llamacpp.md +248 -0
  498. package/docs/long-term-memory.md +12 -0
  499. package/docs/running-locally.md +7 -1
  500. package/package.json +2 -1
  501. package/plugins/project-orientation/source/index.ts +2 -3
  502. package/plugins/project-orientation/source/inspection-failure.ts +1 -1
  503. package/plugins/project-orientation/source/project-target.ts +29 -0
  504. package/plugins/project-orientation/src/index.cjs +21 -2
  505. package/runtime.config.schema.json +140 -0
  506. package/src/runtime/README.md +50 -4
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../confirmation-dialog.js";
1
2
  import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
2
3
  import {
3
4
  readMemoryEditorInput,
@@ -12,7 +13,8 @@ import {
12
13
 
13
14
  export function createLongTermMemoryManager({
14
15
  actions,
15
- confirmDelete = (message) => window.confirm(message),
16
+ getEnvironmentId = () => "",
17
+ confirmDelete = (message) => confirmDialog(message, { title: "Delete memory", confirmLabel: "Delete memory", tone: "danger" }),
16
18
  }) {
17
19
  let root = null;
18
20
  let view = null;
@@ -59,7 +61,7 @@ export function createLongTermMemoryManager({
59
61
  void actions.setOriginFilter(view.originFilter ? "" : "passive_observation");
60
62
  if (action === "previous-page") void actions.changePage(-1);
61
63
  if (action === "next-page") void actions.changePage(1);
62
- if (action === "delete") confirmAndDelete(recordId);
64
+ if (action === "delete") void confirmAndDelete(recordId);
63
65
  }
64
66
 
65
67
  function handleSubmit(event) {
@@ -79,11 +81,19 @@ export function createLongTermMemoryManager({
79
81
  actions.cancelEdit();
80
82
  }
81
83
 
82
- function confirmAndDelete(recordId) {
84
+ async function confirmAndDelete(recordId) {
83
85
  const record = view?.items.find((item) => item.id === recordId);
84
86
  if (!record) return;
85
- if (!confirmDelete(buildMemoryDeleteConfirmation(record))) return;
86
- void actions.deleteMemory(record.id);
87
+ const environmentId = getEnvironmentId();
88
+ const targetRoot = root;
89
+ const updatedAt = record.updatedAt;
90
+ if (!await confirmDelete(buildMemoryDeleteConfirmation(record))) return;
91
+ if (environmentId !== getEnvironmentId() || root !== targetRoot) return;
92
+ const snapshot = actions.snapshot();
93
+ if (snapshot.mutation || snapshot.loading) return;
94
+ const current = snapshot.items.find((item) => item.id === recordId);
95
+ if (current !== record || current.updatedAt !== updatedAt) return;
96
+ await actions.deleteMemory(record.id);
87
97
  }
88
98
 
89
99
  function toggleMemoryContent(button) {
@@ -0,0 +1,114 @@
1
+ import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
2
+
3
+ export function savedEmbeddingProfiles(status) {
4
+ return Array.isArray(status?.embeddingProfiles) ? status.embeddingProfiles : [];
5
+ }
6
+
7
+ export function selectedEmbeddingProfile(state) {
8
+ return savedEmbeddingProfiles(state.status).find((profile) => profile.id === state.selectedProfileId);
9
+ }
10
+
11
+ export function hasSavedEmbeddingProvider(state, profile) {
12
+ return state.status?.providers?.some((provider) => provider.id === profile.providerId) === true;
13
+ }
14
+
15
+ export function hasUnavailableSelectedEmbeddingProfile(state) {
16
+ const profile = selectedEmbeddingProfile(state);
17
+ if (!profile) return false;
18
+ return !hasSavedEmbeddingProvider(state, profile);
19
+ }
20
+
21
+ export function matchingSelectedEmbeddingProfile(state, providerId, model) {
22
+ const profile = selectedEmbeddingProfile(state);
23
+ if (profile?.providerId !== providerId) return undefined;
24
+ if (profile.model !== model) return undefined;
25
+ return profile;
26
+ }
27
+
28
+ export function isConfiguredEmbeddingProfile(state, profileId) {
29
+ return state.status?.profileId === profileId;
30
+ }
31
+
32
+ function renderProfileCard(state, profile, canRemove) {
33
+ const selected = profile.id === state.selectedProfileId;
34
+ const configured = isConfiguredEmbeddingProfile(state, profile.id);
35
+ const available = hasSavedEmbeddingProvider(state, profile);
36
+ const confirming = state.removingProfileId === profile.id;
37
+ const provider = state.status?.providers?.find((entry) => entry.id === profile.providerId);
38
+ const badge = configured ? '<span class="embedding-profile-badge">Configured for memory</span>' : "";
39
+ const remove = canRemove ? `<button type="button" class="embedding-profile-remove"
40
+ data-memory-remove-profile="${escapeAttribute(profile.id)}"
41
+ aria-label="Remove ${escapeAttribute(profile.label)}"
42
+ ${state.busy || configured ? "disabled" : ""}
43
+ title="${configured ? "Choose another memory profile before removing this one." : "Remove this saved profile"}">Remove</button>` : "";
44
+ const confirmation = confirming ? `<div class="embedding-profile-confirm" role="group" aria-label="Confirm profile removal">
45
+ <p>Remove this saved profile? Stored memories and the connection will stay.</p>
46
+ <button type="button" data-memory-confirm-remove="${escapeAttribute(profile.id)}" ${state.busy ? "disabled" : ""}>Remove profile</button>
47
+ <button type="button" data-memory-cancel-remove ${state.busy ? "disabled" : ""}>Cancel</button>
48
+ </div>` : "";
49
+ return `<article class="embedding-profile-card ${selected ? "selected" : ""}">
50
+ <button type="button" class="embedding-profile-select"
51
+ data-memory-saved-profile="${escapeAttribute(profile.id)}" aria-pressed="${selected}"
52
+ ${state.busy || !available ? "disabled" : ""}>
53
+ <span class="embedding-profile-top"><span class="embedding-profile-provider">${escapeHtml(provider?.type || profile.providerId)}</span>${badge}</span>
54
+ <strong>${escapeHtml(profile.label)}</strong>
55
+ <span class="embedding-profile-model">${escapeHtml(profile.model)}</span>
56
+ <span class="embedding-profile-connection">Connection · ${escapeHtml(profile.providerId)}</span>
57
+ ${!available ? '<span class="embedding-profile-unavailable">Connection unavailable</span>' : ""}
58
+ </button>
59
+ <div class="embedding-profile-footer"><span>${selected ? "Selected" : "Saved profile"}</span>${remove}</div>
60
+ ${confirmation}
61
+ </article>`;
62
+ }
63
+
64
+ export function renderSavedEmbeddingProfiles(state, canRemove) {
65
+ const profiles = savedEmbeddingProfiles(state.status);
66
+ return `<section class="embedding-profiles" aria-label="Saved embedding profiles">
67
+ <div class="embedding-profiles-heading"><div><h5>Embedding profiles</h5>
68
+ <p>Save a model and connection, then select it for memory.</p></div>
69
+ <button type="button" data-memory-new-profile ${state.busy ? "disabled" : ""}>+ New profile</button>
70
+ </div>
71
+ <div class="embedding-profile-grid">${profiles.map((profile) => renderProfileCard(state, profile, canRemove)).join("")}</div>
72
+ ${profiles.length ? "" : '<p class="embedding-profile-empty">No saved profiles yet. Create your first one below.</p>'}
73
+ </section>`;
74
+ }
75
+
76
+ export function bindSavedEmbeddingProfiles({ state, onSelected, onRemove, onChange }) {
77
+ state.root.querySelectorAll("[data-memory-saved-profile]").forEach((button) => {
78
+ button.addEventListener("click", () => {
79
+ if (state.busy) return;
80
+ const profile = savedEmbeddingProfiles(state.status).find((entry) => entry.id === button.dataset.memorySavedProfile);
81
+ if (!profile || !hasSavedEmbeddingProvider(state, profile)) return;
82
+ state.selectedProfileId = profile.id;
83
+ state.profileLabel = profile.label;
84
+ state.removingProfileId = "";
85
+ onSelected();
86
+ });
87
+ });
88
+ state.root.querySelector("[data-memory-new-profile]")?.addEventListener("click", () => {
89
+ if (state.busy) return;
90
+ state.selectedProfileId = "";
91
+ state.profileLabel = "";
92
+ state.removingProfileId = "";
93
+ onSelected();
94
+ });
95
+ state.root.querySelector("[data-memory-profile-label]")?.addEventListener?.("input", (event) => {
96
+ state.profileLabel = event.target.value;
97
+ });
98
+ state.root.querySelectorAll("[data-memory-remove-profile]").forEach((button) => {
99
+ button.addEventListener("click", () => {
100
+ if (state.busy || isConfiguredEmbeddingProfile(state, button.dataset.memoryRemoveProfile)) return;
101
+ state.removingProfileId = button.dataset.memoryRemoveProfile;
102
+ onChange();
103
+ });
104
+ });
105
+ state.root.querySelector("[data-memory-cancel-remove]")?.addEventListener("click", () => {
106
+ if (state.busy) return;
107
+ state.removingProfileId = "";
108
+ onChange();
109
+ });
110
+ const confirm = state.root.querySelector("[data-memory-confirm-remove]");
111
+ confirm?.addEventListener("click", () => {
112
+ void onRemove(confirm.dataset.memoryConfirmRemove);
113
+ });
114
+ }
@@ -0,0 +1,55 @@
1
+ import { escapeAttribute, escapeHtml, textOf } from "../../lib/text-format.js";
2
+ import { renderSavedEmbeddingProfiles, selectedEmbeddingProfile } from "./saved-embedding-profiles.js";
3
+
4
+ export function renderMemorySetup({ state, selectedProvider, selectedModel, canSave, canRemove, canAddConnection, emitClientEvents }) {
5
+ const status = state.status || {};
6
+ const providers = Array.isArray(status.providers) ? status.providers : [];
7
+ const enabled = status.enabled === true;
8
+ const profile = selectedEmbeddingProfile(state);
9
+ const savedSelection = canSave && Boolean(profile);
10
+ const fieldsDisabled = state.busy || savedSelection ? "disabled" : "";
11
+ const busy = state.busy ? "disabled" : "";
12
+ const activation = canSave && !profile ? "" : `<button type="button" class="primary-button" data-memory-action="enable" ${busy}>${state.busy === "enable" ? "Testing connection…" : "Test &amp; enable memory"}</button>`;
13
+ return `<section class="memory-setup-card" aria-busy="${Boolean(state.busy)}">
14
+ <div class="memory-setup-heading">
15
+ <div><p class="eyebrow">passive memory</p><h4>Long-term memory</h4>
16
+ <p>Choose the embedding model used to find relevant memories across conversations.</p></div>
17
+ <span class="memory-status ${enabled ? "enabled" : "disabled"}">${enabled ? "Enabled" : "Disabled"}</span>
18
+ </div>
19
+ ${canSave ? renderSavedEmbeddingProfiles(state, canRemove) : ""}
20
+ <section class="embedding-profile-editor" aria-label="${savedSelection ? "Selected profile" : "New embedding profile"}">
21
+ <div class="embedding-editor-heading"><h5>${savedSelection ? "Selected profile" : "New embedding profile"}</h5>
22
+ <p>${savedSelection ? "Test the connection and save this profile as the memory configuration. Apply the configuration separately to use it." : "Save a reusable profile first. Saving does not enable memory or contact the provider."}</p>
23
+ </div>
24
+ <div class="memory-setup-fields">
25
+ ${canSave ? `<label class="embedding-profile-name"><span>Profile name</span><input data-memory-profile-label value="${escapeAttribute(state.profileLabel)}" placeholder="For example: Qwen · local server" ${fieldsDisabled} /></label>` : ""}
26
+ <label><span>Connection</span><select data-memory-provider ${fieldsDisabled}>${providerOptions(providers, selectedProvider)}</select></label>
27
+ <label><span>Embedding model</span><input data-memory-model list="memoryEmbeddingModels" value="${escapeAttribute(selectedModel)}" placeholder="For example: text-embedding-3-small" ${fieldsDisabled} />
28
+ <datalist id="memoryEmbeddingModels">${state.models.map((model) => `<option value="${escapeAttribute(textOf(model))}"></option>`).join("")}</datalist></label>
29
+ ${savedSelection || !canSave ? `<label class="memory-events-toggle"><input data-memory-events type="checkbox" ${emitClientEvents ? "checked" : ""} ${busy} /><span>Show memory activity in conversations</span></label>` : ""}
30
+ </div>
31
+ <div class="memory-setup-actions">
32
+ ${!savedSelection && canSave ? `<button type="button" class="primary-button" data-memory-action="save-profile" ${busy}>${state.busy === "save-profile" ? "Saving…" : "Save profile"}</button>` : ""}
33
+ ${activation}
34
+ ${!savedSelection ? `<button type="button" data-memory-action="discover" ${busy}>Discover models</button>` : ""}
35
+ ${canAddConnection ? `<button type="button" data-memory-action="add-connection" ${busy}>Add connection</button>` : ""}
36
+ ${enabled ? `<button type="button" data-memory-action="disable" ${busy}>Disable memory</button>` : ""}
37
+ </div>
38
+ </section>
39
+ ${feedbackMarkup(state)}
40
+ </section>`;
41
+ }
42
+
43
+ function providerOptions(providers, selectedProvider) {
44
+ const options = providers.map((provider) => `<option value="${escapeAttribute(provider.id)}" ${provider.id === selectedProvider ? "selected" : ""}>${escapeHtml(provider.id)} · ${escapeHtml(provider.type)}</option>`);
45
+ if (!providers.some((provider) => provider.id === selectedProvider)) {
46
+ options.unshift(`<option value="${escapeAttribute(selectedProvider)}" selected>${escapeHtml(selectedProvider || "Choose a connection")}${selectedProvider ? " (unavailable)" : ""}</option>`);
47
+ }
48
+ return options.join("");
49
+ }
50
+
51
+ function feedbackMarkup(state) {
52
+ if (state.error) return `<p class="memory-setup-feedback error-text" role="alert">${escapeHtml(state.error)}</p>`;
53
+ if (state.message) return `<p class="memory-setup-feedback" role="status">${escapeHtml(state.message)}</p>`;
54
+ return "";
55
+ }
@@ -1,19 +1,35 @@
1
- import { escapeAttribute, escapeHtml, textOf } from "../lib/text-format.js";
1
+ import {
2
+ bindSavedEmbeddingProfiles,
3
+ matchingSelectedEmbeddingProfile,
4
+ hasUnavailableSelectedEmbeddingProfile,
5
+ isConfiguredEmbeddingProfile,
6
+ savedEmbeddingProfiles,
7
+ selectedEmbeddingProfile,
8
+ } from "./long-term-memory/saved-embedding-profiles.js";
9
+ import { renderMemorySetup } from "./long-term-memory/setup-rendering.js";
10
+ import { textOf } from "../lib/text-format.js";
2
11
 
3
12
  export function createLongTermMemorySetup({
4
13
  getEnvironmentId = () => "",
5
14
  loadStatus,
6
15
  discoverModels,
7
16
  enableMemory,
17
+ saveProfile,
18
+ removeProfile,
8
19
  disableMemory,
9
20
  recordControlEvent,
10
21
  beginRuntimeMutation = () => true,
11
22
  refreshRuntimeConfig = async () => true,
12
23
  endRuntimeMutation = () => {},
24
+ onAddConnection,
25
+ onEnvironmentChanged = () => {},
13
26
  }) {
14
27
  const state = {
15
28
  root: null,
16
29
  status: null,
30
+ selectedProfileId: "",
31
+ removingProfileId: "",
32
+ profileLabel: "",
17
33
  models: [],
18
34
  discoverySupported: false,
19
35
  busy: "",
@@ -29,20 +45,25 @@ export function createLongTermMemorySetup({
29
45
  render();
30
46
  }
31
47
 
32
- async function load() {
48
+ async function load(options = {}) {
33
49
  const revision = ++state.loadRevision;
34
50
  state.actionRevision += 1;
35
51
  const environmentId = getEnvironmentId();
36
52
  const environmentChanged = state.environmentId !== environmentId;
37
53
  if (environmentChanged) {
54
+ onEnvironmentChanged();
38
55
  state.environmentId = environmentId;
39
56
  state.status = null;
57
+ state.selectedProfileId = "";
58
+ state.removingProfileId = "";
59
+ state.profileLabel = "";
40
60
  state.models = [];
41
61
  state.discoverySupported = false;
42
62
  }
43
63
  state.busy = "status";
44
64
  clearFeedback();
45
- render({ preserveInputs: !environmentChanged });
65
+ const preserveInputs = !environmentChanged && options.preserveInputs !== false;
66
+ render({ preserveInputs });
46
67
  try {
47
68
  const payload = await loadStatus(environmentId);
48
69
  if (
@@ -51,7 +72,12 @@ export function createLongTermMemorySetup({
51
72
  ) {
52
73
  return false;
53
74
  }
75
+ const hadStatus = Boolean(state.status);
54
76
  state.status = payload.status || null;
77
+ if (!preserveInputs || !hadStatus) {
78
+ state.selectedProfileId = state.status?.profileId || "";
79
+ state.profileLabel = selectedEmbeddingProfile(state)?.label || "";
80
+ }
55
81
  return true;
56
82
  } catch (error) {
57
83
  if (
@@ -68,7 +94,7 @@ export function createLongTermMemorySetup({
68
94
  environmentId === getEnvironmentId()
69
95
  ) {
70
96
  state.busy = "";
71
- render();
97
+ render({ preserveInputs });
72
98
  }
73
99
  }
74
100
  }
@@ -93,6 +119,15 @@ export function createLongTermMemorySetup({
93
119
  }
94
120
 
95
121
  async function enable() {
122
+ if (state.busy) return;
123
+ if (saveProfile && !selectedEmbeddingProfile(state)) {
124
+ showError("Save the profile before testing and enabling memory.");
125
+ return;
126
+ }
127
+ if (hasUnavailableSelectedEmbeddingProfile(state)) {
128
+ showError("This saved profile's provider is unavailable. Choose an available profile or connection.");
129
+ return;
130
+ }
96
131
  const providerId = selectedProviderId();
97
132
  const model = textOf(
98
133
  state.root?.querySelector("[data-memory-model]")?.value,
@@ -111,18 +146,50 @@ export function createLongTermMemorySetup({
111
146
  providerId,
112
147
  model,
113
148
  emitClientEvents,
149
+ ...(matchingSelectedEmbeddingProfile(state, providerId, model)
150
+ ? { profileId: state.selectedProfileId }
151
+ : {}),
114
152
  },
115
153
  environmentId,
116
154
  ),
117
155
  (payload) => {
118
156
  state.status = payload.status || null;
157
+ state.selectedProfileId = state.status?.profileId || state.selectedProfileId;
119
158
  state.message =
120
- "Embedding probe passed. Memory is enabled; restart ABot to apply it.";
159
+ "Connection test passed. Memory configuration saved. Apply the configuration to use it.";
121
160
  recordResult("Long-term memory enabled", payload);
122
161
  },
123
162
  );
124
163
  }
125
164
 
165
+ async function saveEmbeddingProfile() {
166
+ if (!saveProfile || state.busy || selectedEmbeddingProfile(state)) return;
167
+ if (hasUnavailableSelectedEmbeddingProfile(state)) {
168
+ showError("This saved profile's provider is unavailable. Choose an available profile or connection.");
169
+ return;
170
+ }
171
+ const providerId = selectedProviderId();
172
+ const model = currentModelValue();
173
+ const label = state.profileLabel.trim();
174
+ if (!providerId || !model || !label) {
175
+ showError("Choose a provider, enter a model ID and give the profile a name.");
176
+ return;
177
+ }
178
+ await runRuntimeMutation(
179
+ "save-profile",
180
+ (environmentId) => saveProfile({ providerId, model, label }, environmentId),
181
+ (payload) => {
182
+ state.status = payload.status || null;
183
+ state.selectedProfileId = payload.profileId || "";
184
+ state.profileLabel = selectedEmbeddingProfile(state)?.label || label;
185
+ state.message = "Embedding profile saved. The active memory configuration has not changed.";
186
+ recordControlEvent({
187
+ type: "control", name: "Embedding profile saved", tone: "done", summary: label,
188
+ });
189
+ },
190
+ );
191
+ }
192
+
126
193
  async function disable() {
127
194
  await runRuntimeMutation(
128
195
  "disable",
@@ -135,6 +202,19 @@ export function createLongTermMemorySetup({
135
202
  );
136
203
  }
137
204
 
205
+ async function addConnection() {
206
+ if (state.busy || !onAddConnection) return;
207
+ try {
208
+ await onAddConnection({
209
+ emitClientEvents:
210
+ state.root?.querySelector("[data-memory-events]")?.checked === true,
211
+ ...(state.status?.profileId ? { profileId: state.status.profileId } : {}),
212
+ });
213
+ } catch {
214
+ showError("Embedding connection setup could not be opened. Try again.");
215
+ }
216
+ }
217
+
138
218
  async function runRuntimeMutation(name, request, applyResult) {
139
219
  if (!beginRuntimeMutation()) {
140
220
  showError(
@@ -198,67 +278,73 @@ export function createLongTermMemorySetup({
198
278
  function render(options = {}) {
199
279
  if (!state.root) return;
200
280
  const status = state.status || {};
201
- const providers = Array.isArray(status.providers) ? status.providers : [];
281
+ const profile = selectedEmbeddingProfile(state);
202
282
  const preserveInputs = options.preserveInputs !== false;
203
- const selectedProvider =
204
- (preserveInputs ? selectedProviderId() : "") ||
205
- status.providerId ||
206
- providers[0]?.id ||
207
- "";
208
- const selectedModel =
209
- (preserveInputs ? currentModelValue() : "") || status.model || "";
210
- const enabled = status.enabled === true;
211
- state.root.innerHTML = `
212
- <section class="memory-setup-card" aria-busy="${state.busy ? "true" : "false"}">
213
- <div class="memory-setup-heading">
214
- <div>
215
- <p class="eyebrow">passive memory</p>
216
- <h4>Long-term memory</h4>
217
- <p>Retrieve relevant memories across sessions while keeping storage and policy in the Runtime core.</p>
218
- </div>
219
- <span class="memory-status ${enabled ? "enabled" : "disabled"}">${enabled ? "Enabled" : "Disabled"}</span>
220
- </div>
221
- <div class="memory-setup-fields">
222
- <label>
223
- <span>Embedding provider</span>
224
- <select data-memory-provider ${state.busy ? "disabled" : ""}>
225
- ${providerOptions(providers, selectedProvider)}
226
- </select>
227
- </label>
228
- <label>
229
- <span>Embedding model</span>
230
- <input data-memory-model list="memoryEmbeddingModels" value="${escapeAttribute(selectedModel)}" placeholder="Enter a provider model ID" ${state.busy ? "disabled" : ""} />
231
- <datalist id="memoryEmbeddingModels">${state.models
232
- .map(
233
- (model) =>
234
- `<option value="${escapeAttribute(textOf(model))}"></option>`,
235
- )
236
- .join("")}</datalist>
237
- </label>
238
- <label class="memory-events-toggle">
239
- <input data-memory-events type="checkbox" ${status.emitClientEvents === true ? "checked" : ""} ${state.busy ? "disabled" : ""} />
240
- <span>Show bounded memory lifecycle events to clients</span>
241
- </label>
242
- </div>
243
- <div class="memory-setup-actions">
244
- <button type="button" data-memory-action="discover" ${state.busy ? "disabled" : ""}>Discover models</button>
245
- <button type="button" data-memory-action="enable" ${state.busy ? "disabled" : ""}>Probe and enable</button>
246
- <button type="button" data-memory-action="disable" ${!enabled || state.busy ? "disabled" : ""}>Disable</button>
247
- </div>
248
- ${feedbackMarkup()}
249
- <p class="memory-setup-note">ABot never chooses or installs an embedding model. Configuration is written only after a real probe succeeds.</p>
250
- </section>
251
- `;
283
+ const defaultProvider = profile?.providerId || status.providerId || status.providers?.[0]?.id || "";
284
+ const defaultModel = profile?.model || (saveProfile ? "" : status.model || "");
285
+ const selectedProvider = preserveInputs && !profile
286
+ ? state.root.querySelector("[data-memory-provider]")?.value ?? defaultProvider
287
+ : defaultProvider;
288
+ const selectedModel = preserveInputs && !profile
289
+ ? state.root.querySelector("[data-memory-model]")?.value ?? defaultModel
290
+ : defaultModel;
291
+ const emitClientEvents = preserveInputs
292
+ ? state.root.querySelector("[data-memory-events]")?.checked ?? status.emitClientEvents === true
293
+ : status.emitClientEvents === true;
294
+ state.root.innerHTML = renderMemorySetup({
295
+ state, selectedProvider, selectedModel, emitClientEvents,
296
+ canSave: Boolean(saveProfile), canRemove: Boolean(removeProfile),
297
+ canAddConnection: Boolean(onAddConnection),
298
+ });
299
+ bindSavedEmbeddingProfiles({
300
+ state,
301
+ onSelected: () => {
302
+ state.models = [];
303
+ clearFeedback();
304
+ render({ preserveInputs: false });
305
+ },
306
+ onChange: render,
307
+ onRemove: removeEmbeddingProfile,
308
+ });
252
309
  bindActions();
253
310
  }
254
311
 
312
+ async function removeEmbeddingProfile(profileId) {
313
+ if (!removeProfile || state.busy) return;
314
+ if (isConfiguredEmbeddingProfile(state, profileId)) {
315
+ showError("Choose another memory profile before removing this one.");
316
+ return;
317
+ }
318
+ const profile = savedEmbeddingProfiles(state.status).find((entry) => entry.id === profileId);
319
+ if (!profile || state.removingProfileId !== profileId) return;
320
+ await runRuntimeMutation(
321
+ "remove-profile",
322
+ (environmentId) => removeProfile({ profileId }, environmentId),
323
+ (payload) => {
324
+ state.status = payload.status || null;
325
+ state.removingProfileId = "";
326
+ if (state.selectedProfileId === profileId) {
327
+ state.selectedProfileId = state.status?.profileId || "";
328
+ state.profileLabel = selectedEmbeddingProfile(state)?.label || "";
329
+ render({ preserveInputs: false });
330
+ }
331
+ state.message = "Profile removed. Stored memories and connections are unchanged.";
332
+ recordControlEvent({
333
+ type: "control", name: "Embedding profile removed", tone: "done", summary: profile.label,
334
+ });
335
+ },
336
+ );
337
+ }
338
+
255
339
  function bindActions() {
256
340
  state.root.querySelectorAll("[data-memory-action]").forEach((button) => {
257
341
  button.addEventListener("click", () => {
258
342
  const action = button.dataset.memoryAction;
259
343
  if (action === "discover") void discover();
260
344
  else if (action === "enable") void enable();
345
+ else if (action === "save-profile") void saveEmbeddingProfile();
261
346
  else if (action === "disable") void disable();
347
+ else if (action === "add-connection") void addConnection();
262
348
  });
263
349
  });
264
350
  }
@@ -294,15 +380,6 @@ export function createLongTermMemorySetup({
294
380
  : "The provider returned no installed models.";
295
381
  }
296
382
 
297
- function feedbackMarkup() {
298
- if (state.error) {
299
- return `<p class="memory-setup-feedback error-text" role="alert">${escapeHtml(state.error)}</p>`;
300
- }
301
- return state.message
302
- ? `<p class="memory-setup-feedback" role="status">${escapeHtml(state.message)}</p>`
303
- : "";
304
- }
305
-
306
383
  function recordResult(name, payload) {
307
384
  recordControlEvent({
308
385
  type: "control",
@@ -317,18 +394,6 @@ export function createLongTermMemorySetup({
317
394
  return { load, mount };
318
395
  }
319
396
 
320
- function providerOptions(providers, selectedProvider) {
321
- if (providers.length === 0) {
322
- return '<option value="">No configured providers</option>';
323
- }
324
- return providers
325
- .map((provider) => {
326
- const selected = provider.id === selectedProvider ? "selected" : "";
327
- return `<option value="${escapeAttribute(provider.id)}" ${selected}>${escapeHtml(provider.id)} · ${escapeHtml(provider.type)}</option>`;
328
- })
329
- .join("");
330
- }
331
-
332
397
  function errorMessage(error) {
333
398
  return error instanceof Error ? error.message : String(error);
334
399
  }
@@ -34,6 +34,7 @@ export function renderModelProviderChoices(state) {
34
34
  description: `${provider.id} · ${provider.type} · existing connection`,
35
35
  }));
36
36
  providers.push(
37
+ { id: "new:llamacpp", label: "New llama.cpp connection", description: "A separately running server with token reasoning controls" },
37
38
  {
38
39
  id: "new:openai",
39
40
  label: "New OpenAI connection",
@@ -50,9 +51,9 @@ export function renderModelProviderChoices(state) {
50
51
 
51
52
  export function renderModelFields(state) {
52
53
  const provider = selectedModelProvider(state);
53
- const credentialConfigured = !requiresModelCredential(state);
54
+ const credentialConfigured = provider?.credentialConfigured === true || state.credentialSavedFor === (provider?.id || state.newProviderId);
54
55
  return `${!provider ? renderConnectionField({ field: "connection-id", label: "Connection ID", value: state.newProviderId, idPrefix: MODEL_SETUP_ID, help: "A unique name for this provider connection." }) : `<p class="runtime-setup-feedback">Using ${escapeHtml(provider.label || provider.id)} · ${escapeHtml(provider.id)}</p>`}
55
- ${renderConnectionFields({ providers: [{ id: state.choice, credentialConfigured }], provider: state.choice, providerType: modelProviderType(state), existingProvider: Boolean(provider), allowCredentialReplacement: false, modelId: state.model, contextWindowTokens: state.contextWindowTokens, baseUrl: state.baseUrl, idPrefix: MODEL_SETUP_ID })}
56
+ ${renderConnectionFields({ ...state, providers: [{ id: state.choice, credentialConfigured, requiresApiKey: requiresModelCredential(state) }], provider: state.choice, providerType: modelProviderType(state), existingProvider: Boolean(provider), allowCredentialReplacement: false, modelId: state.model, contextWindowTokens: state.contextWindowTokens, baseUrl: state.baseUrl, idPrefix: MODEL_SETUP_ID })}
56
57
  ${renderConnectionField({ field: "profile-id", label: "Model profile ID", value: state.profileId, idPrefix: MODEL_SETUP_ID, placeholder: "Suggested from the model ID", help: "A unique name for this model in ABot. Existing model defaults will stay the same." })}`;
57
58
  }
58
59
 
@@ -40,7 +40,7 @@ function validIdentifier(value, provider) {
40
40
 
41
41
  export function validateModelDraft(state) {
42
42
  const provider = selectedModelProvider(state);
43
- if (!provider && !["new:openai", "new:ollama"].includes(state.choice))
43
+ if (!provider && !["new:openai", "new:ollama", "new:llamacpp"].includes(state.choice))
44
44
  return { valid: false, field: "provider", message: "Choose a provider." };
45
45
  if (!provider && !validIdentifier(state.newProviderId, true))
46
46
  return {
@@ -66,6 +66,7 @@ export function validateModelDraft(state) {
66
66
  message: "Use a model ID of up to 256 characters.",
67
67
  };
68
68
  const connection = validateConnectionFields({
69
+ ...state,
69
70
  modelId: state.model,
70
71
  contextWindowTokens: state.contextWindowTokens,
71
72
  providerType: modelProviderType(state),
@@ -94,7 +95,7 @@ export function requiresModelCredential(state) {
94
95
  const configured =
95
96
  provider?.credentialConfigured === true ||
96
97
  state.credentialSavedFor === (provider?.id || state.newProviderId);
97
- return modelProviderType(state) === "openai" && !configured;
98
+ return (modelProviderType(state) === "openai" || provider?.requiresApiKey === true) && !configured;
98
99
  }
99
100
 
100
101
  export function requiresModelSaveCredential(state) {
@@ -110,6 +111,7 @@ export function modelSetupInput(state, validated, apiKey) {
110
111
  newProvider: {
111
112
  id: state.newProviderId,
112
113
  type: modelProviderType(state),
114
+ ...(modelProviderType(state) === "llamacpp" && (apiKey || state.credentialSavedFor === state.newProviderId) ? { useApiKey: true } : {}),
113
115
  ...(validated.input.baseUrl
114
116
  ? { baseUrl: validated.input.baseUrl }
115
117
  : {}),
@@ -119,6 +121,8 @@ export function modelSetupInput(state, validated, apiKey) {
119
121
  profileId: state.profileId,
120
122
  model: validated.input.model,
121
123
  contextWindowTokens: validated.input.contextWindowTokens,
124
+ ...(validated.input.supportsThinking !== undefined ? { supportsThinking: validated.input.supportsThinking } : {}),
125
+ ...(validated.input.reasoningBudget ? { reasoningBudget: validated.input.reasoningBudget } : {}),
122
126
  ...connection,
123
127
  ...(apiKey ? { apiKey } : {}),
124
128
  };
@@ -16,6 +16,7 @@ export type ModelSetupProvider = Readonly<{
16
16
  export interface ModelSetupWizardDependencies {
17
17
  root: HTMLElement;
18
18
  getEnvironmentId?: () => string;
19
+ inspectConnection?: (input: Record<string, unknown>) => Promise<{ connection: { models: readonly string[] } }>;
19
20
  loadSetup: () => Promise<{
20
21
  providers: readonly ModelSetupProvider[];
21
22
  profileIds: readonly string[];