@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,6 @@
1
+ import { createConnectionInspection } from "../runtime-setup/connection-inspection.js";
2
+ import { setupReasoningState, updateSetupReasoningField } from "../runtime-setup/reasoning-fields.js";
3
+ import { defaultSetupProviderAddress } from "../runtime-setup/validation.js";
1
4
  import { textOf } from "../../lib/text-format.js";
2
5
  import {
3
6
  clearConnectionSecret,
@@ -34,6 +37,7 @@ export function createModelSetupWizard({
34
37
  root,
35
38
  getEnvironmentId = () => "",
36
39
  loadSetup,
40
+ inspectConnection,
37
41
  saveModel,
38
42
  applySetup,
39
43
  beginRuntimeMutation = () => true,
@@ -53,6 +57,10 @@ export function createModelSetupWizard({
53
57
  let modelForm = null;
54
58
  let formChoice = "";
55
59
  let requestedProviderId = "";
60
+ const connectionInspection = createConnectionInspection({
61
+ state, container: dialog, inspectConnection, getEnvironmentId,
62
+ onChange: () => { formChoice = ""; render(); },
63
+ });
56
64
  const beginOperation = () => ({
57
65
  generation: ++generation,
58
66
  environment: getEnvironmentId(),
@@ -66,9 +74,11 @@ export function createModelSetupWizard({
66
74
  };
67
75
 
68
76
  function reset() {
77
+ connectionInspection.reset();
69
78
  clearSecret();
70
79
  viewState.reset();
71
80
  Object.assign(state, {
81
+ ...setupReasoningState(),
72
82
  providers: [],
73
83
  profileIds: [],
74
84
  choice: "",
@@ -94,7 +104,7 @@ export function createModelSetupWizard({
94
104
  }
95
105
 
96
106
  function close(completed = false) {
97
- if (state.busy) return false;
107
+ if (state.busy || state.checkingConnection) return false;
98
108
  const wasOpen = dialog.open;
99
109
  generation += 1;
100
110
  clearSecret();
@@ -264,7 +274,7 @@ export function createModelSetupWizard({
264
274
  }
265
275
 
266
276
  function next() {
267
- if (state.busy || !state.loaded) return;
277
+ if (state.busy || state.checkingConnection || !state.loaded) return;
268
278
  if (state.step === 0 && state.choice) {
269
279
  state.step = 1;
270
280
  state.error = "";
@@ -284,7 +294,7 @@ export function createModelSetupWizard({
284
294
  }
285
295
 
286
296
  function input(event) {
287
- if (state.busy || state.saved || state.step !== 1) return;
297
+ if (state.busy || state.checkingConnection || state.saved || state.step !== 1) return;
288
298
  const field = event.target.dataset.runtimeSetupField;
289
299
  if (field === "api-key") {
290
300
  event.target.removeAttribute("aria-invalid");
@@ -310,7 +320,14 @@ export function createModelSetupWizard({
310
320
  state.profileEdited = true;
311
321
  }
312
322
  if (field === "connection-id") state.newProviderId = value;
313
- if (field === "ollama-base-url") state.baseUrl = value;
323
+ if (["ollama-base-url", "llamacpp-base-url"].includes(field)) state.baseUrl = value;
324
+ if (updateSetupReasoningField(state, field, event.target.type === "checkbox" ? event.target.checked : value)) {
325
+ const apiKey = readConnectionSecret(modelForm);
326
+ formChoice = "";
327
+ render();
328
+ const keyInput = modelForm.querySelector('[data-runtime-setup-field="api-key"]');
329
+ if (keyInput) keyInput.value = apiKey;
330
+ }
314
331
  const key = modelForm.querySelector('[data-runtime-setup-field="api-key"]');
315
332
  if (key) key.required = requiresModelSaveCredential(state);
316
333
  event.target.removeAttribute("aria-invalid");
@@ -320,6 +337,7 @@ export function createModelSetupWizard({
320
337
  dialog.addEventListener("change", (event) => {
321
338
  if (
322
339
  state.busy ||
340
+ state.checkingConnection ||
323
341
  state.saved ||
324
342
  state.step !== 0 ||
325
343
  event.target.dataset.runtimeSetupField !== "provider"
@@ -333,6 +351,10 @@ export function createModelSetupWizard({
333
351
  const resetSuggestedProfile = providerChanged && !state.profileEdited;
334
352
  if (resetSuggestedProfile) state.profileId = "";
335
353
  state.choice = event.target.value;
354
+ if (providerChanged) {
355
+ state.baseUrl = defaultSetupProviderAddress(state.choice.replace("new:", ""));
356
+ Object.assign(state, setupReasoningState());
357
+ }
336
358
  state.newProviderId = selectedModelProvider(state)
337
359
  ? ""
338
360
  : suggestIdentifier(
@@ -353,7 +375,8 @@ export function createModelSetupWizard({
353
375
  dialog.addEventListener("click", (event) => {
354
376
  const action = event.target.closest?.("[data-model-action]")?.dataset
355
377
  .modelAction;
356
- if (!action || state.busy) return;
378
+ if (!action || state.busy || state.checkingConnection) return;
379
+ if (action === "inspect-model-connection") { void connectionInspection.check(); return; }
357
380
  if (action === "cancel") close();
358
381
  if (action === "reload") void load();
359
382
  if (action === "next") next();
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../confirmation-dialog.js";
1
2
  import { renderCollectionAccess } from "./collection-access.js";
2
3
  import { renderAgent } from "./agent-view.js";
3
4
  import { renderComputerUpdateNotice } from "./computer-update-notice.js";
@@ -27,7 +28,7 @@ const defaultTimeZone = () => Intl.DateTimeFormat().resolvedOptions().timeZone |
27
28
 
28
29
  export function createPassiveLearningMemory({
29
30
  actions, showActivityMemories, openComputerAccess,
30
- confirmDelete = (message) => window.confirm(message),
31
+ confirmDelete = (message) => confirmDialog(message, { title: "Delete pending activity", confirmLabel: "Delete activity", tone: "danger" }),
31
32
  }) {
32
33
  let root = null;
33
34
  let settings;
@@ -89,7 +90,7 @@ export function createPassiveLearningMemory({
89
90
  }
90
91
  const clearPending = event.target.closest("button[data-learning-clear-pending]");
91
92
  if (clearPending && root.contains(clearPending)) {
92
- deletePending();
93
+ void deletePending();
93
94
  return;
94
95
  }
95
96
  const setupButton = event.target.closest("button[data-learning-open-setup]") ??
@@ -116,12 +117,18 @@ export function createPassiveLearningMemory({
116
117
  showActivityMemories();
117
118
  }
118
119
 
119
- function deletePending() {
120
+ async function deletePending() {
120
121
  const snapshot = actions.snapshot();
121
122
  if (!snapshot.status || snapshot.saving) return;
122
123
  if (!hasUnprocessedLearningActivity(snapshot.status)) return;
123
- if (!confirmDelete("Delete all pending activity, including any review in progress? Saved insights are kept. This cannot be undone.")) return;
124
- void actions.clearPending();
124
+ const environmentId = snapshot.environmentId;
125
+ const targetRoot = root;
126
+ const status = JSON.stringify(snapshot.status);
127
+ if (!await confirmDelete("Delete all pending activity, including any review in progress? Saved insights are kept. This cannot be undone.")) return;
128
+ const current = actions.snapshot();
129
+ if (environmentId !== current.environmentId || root !== targetRoot) return;
130
+ if (current.saving || JSON.stringify(current.status) !== status) return;
131
+ await actions.clearPending();
125
132
  }
126
133
 
127
134
 
@@ -68,9 +68,23 @@ export function createPluginManager({
68
68
  render,
69
69
  });
70
70
 
71
+ function capturePluginRemovalTarget(pluginId) {
72
+ const plugin = state.snapshot?.plugins?.find((entry) => entry.id === pluginId);
73
+ return { generation: state.mutationGeneration, plugin: JSON.stringify(plugin) };
74
+ }
75
+ function canRemovePluginTarget(pluginId, target) {
76
+ if (state.busy || installation.state.busy) return false;
77
+ if (state.mutationGeneration !== target.generation) return false;
78
+ const plugin = state.snapshot?.plugins?.find((entry) => entry.id === pluginId);
79
+ if (!plugin?.removable) return false;
80
+ return JSON.stringify(plugin) === target.plugin;
81
+ }
82
+
71
83
  const removal = createPluginRemoval({
72
84
  removePlugin,
73
85
  confirmRemoval,
86
+ captureRemovalTarget: capturePluginRemovalTarget,
87
+ canRemoveTarget: canRemovePluginTarget,
74
88
  getEnvironmentId,
75
89
  beginRuntimeMutation,
76
90
  endRuntimeMutation,
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "../confirmation-dialog.js";
1
2
  function isDefinitiveRemovalRejection(error) {
2
3
  if (!(error.status >= 400 && error.status < 500)) return false;
3
4
  return [
@@ -29,7 +30,9 @@ export function createPluginRemoval({
29
30
  onConfigurationSettled = () => true,
30
31
  onSnapshot,
31
32
  render,
32
- confirmRemoval = (message) => window.confirm(message),
33
+ captureRemovalTarget = () => null,
34
+ canRemoveTarget = () => true,
35
+ confirmRemoval = (message) => confirmDialog(message, { title: "Remove plugin", confirmLabel: "Remove plugin", tone: "danger" }),
33
36
  }) {
34
37
  const state = { busy: false, message: "", error: "" };
35
38
  let environment = getEnvironmentId();
@@ -43,12 +46,17 @@ export function createPluginRemoval({
43
46
  async function remove(pluginId) {
44
47
  resetEnvironment();
45
48
  if (state.busy || !removePlugin) return false;
49
+ const selectedEnvironment = getEnvironmentId();
50
+ const confirmationGeneration = generation;
51
+ const target = captureRemovalTarget(pluginId);
46
52
  if (
47
- !confirmRemoval(
53
+ !await confirmRemoval(
48
54
  `Remove ${pluginId}? This disables the plugin, applies the change when Runtime is idle, and deletes its installed folder. If Runtime is busy, try Remove again after it finishes.`,
49
55
  )
50
56
  )
51
57
  return false;
58
+ if (selectedEnvironment !== getEnvironmentId() || confirmationGeneration !== generation) return false;
59
+ if (state.busy || !canRemoveTarget(pluginId, target)) return false;
52
60
  if (!beginRuntimeMutation("plugin removal")) return false;
53
61
  const request = ++generation;
54
62
  const selected = environment;
@@ -0,0 +1,35 @@
1
+ export function createProjectGroupActions({ group, disabled, onDeleteProject, documentRoot }) {
2
+ const actions = documentRoot.createElement("div");
3
+ actions.className = "session-actions project-group-actions";
4
+ actions.setAttribute("aria-label", "Project settings");
5
+ const button = documentRoot.createElement("button");
6
+ button.className = "session-menu-button";
7
+ button.type = "button";
8
+ button.disabled = disabled;
9
+ button.title = "Settings for " + group.name;
10
+ button.setAttribute("aria-label", button.title);
11
+ button.setAttribute("aria-haspopup", "menu");
12
+ button.setAttribute("aria-expanded", "false");
13
+ const menuId = "project-actions-" + encodeURIComponent(group.id);
14
+ button.setAttribute("aria-controls", menuId);
15
+ button.innerHTML = '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M10 2h4l.6 3.1 1.8 1 3-.9 2 3.5-2.4 2v2.6l2.4 2-2 3.5-3-.9-1.8 1L14 22h-4l-.6-3.1-1.8-1-3 .9-2-3.5 2.4-2v-2.6l-2.4-2 2-3.5 3 .9 1.8-1Z"/><circle cx="12" cy="12" r="3.4"/></svg>';
16
+ const menu = documentRoot.createElement("div");
17
+ menu.id = menuId;
18
+ menu.className = "session-menu";
19
+ menu.setAttribute("role", "menu");
20
+ menu.hidden = true;
21
+ const remove = documentRoot.createElement("button");
22
+ remove.className = "session-action delete-action project-delete-action";
23
+ remove.type = "button";
24
+ remove.disabled = disabled;
25
+ remove.setAttribute("role", "menuitem");
26
+ remove.tabIndex = -1;
27
+ remove.textContent = "Delete project";
28
+ remove.addEventListener("click", () => {
29
+ button.focus();
30
+ void onDeleteProject(group.id, group.name);
31
+ });
32
+ menu.appendChild(remove);
33
+ actions.append(button, menu);
34
+ return actions;
35
+ }
@@ -1,6 +1,8 @@
1
+ import { projectSessionDisplayGroups } from "../lib/session-project-groups.js";
1
2
  import { escapeHtml } from "../lib/text-format.js";
2
3
  import { matchesSessionQuery } from "../ui-behavior.js";
3
4
  import { renderProjectSessionPreview } from "./project-session-preview.js";
5
+ import { createProjectGroupActions } from "./project-group-actions.js";
4
6
 
5
7
  function shouldExpandProjectGroup(projectId, query, collapsedProjectIds) {
6
8
  if (String(query ?? "").trim()) return true;
@@ -9,7 +11,7 @@ function shouldExpandProjectGroup(projectId, query, collapsedProjectIds) {
9
11
 
10
12
  function createProjectGroup({
11
13
  group, query, collapsedProjectIds, busyProjectId,
12
- onToggleGroup, onNewConversation, documentRoot,
14
+ onToggleGroup, onNewConversation, onDeleteProject, documentRoot,
13
15
  }) {
14
16
  const section = documentRoot.createElement("section");
15
17
  section.className = "project-session-group";
@@ -29,15 +31,12 @@ function createProjectGroup({
29
31
  title.dir = "auto";
30
32
  title.textContent = group.name;
31
33
  toggle.appendChild(title);
32
- const chevron = documentRoot.createElement("span");
33
- chevron.className = "project-group-chevron";
34
- chevron.setAttribute("aria-hidden", "true");
35
- toggle.appendChild(chevron);
36
34
  toggle.addEventListener("click", () => {
37
35
  content.hidden = !content.hidden;
38
36
  toggle.setAttribute("aria-expanded", String(!content.hidden));
39
37
  onToggleGroup(group.id, content.hidden);
40
38
  });
39
+ header.appendChild(toggle);
41
40
  const create = documentRoot.createElement("button");
42
41
  create.type = "button";
43
42
  create.className = "project-group-new";
@@ -46,7 +45,12 @@ function createProjectGroup({
46
45
  create.disabled = Boolean(busyProjectId);
47
46
  create.textContent = busyProjectId === group.id ? "…" : "+";
48
47
  create.addEventListener("click", () => void onNewConversation(group.id));
49
- header.append(toggle, create);
48
+ const controls = documentRoot.createElement("div");
49
+ controls.className = "project-group-controls";
50
+ controls.append(create, createProjectGroupActions({
51
+ group, disabled: Boolean(busyProjectId), onDeleteProject, documentRoot,
52
+ }));
53
+ header.appendChild(controls);
50
54
  section.append(header, content);
51
55
  return { section, content };
52
56
  }
@@ -54,13 +58,16 @@ function createProjectGroup({
54
58
  export function renderProjectSessionGroups({
55
59
  root,
56
60
  projects,
61
+ deletedProjectIds = [],
57
62
  sessions,
58
63
  createSessionItem,
64
+ newProjectButton,
59
65
  query,
60
66
  loading,
61
67
  error,
62
68
  busyProjectId,
63
69
  onNewConversation,
70
+ onDeleteProject = () => {},
64
71
  onRetry,
65
72
  collapsedProjectIds = new Set(),
66
73
  expandedProjectSessionIds = new Set(),
@@ -68,31 +75,10 @@ export function renderProjectSessionGroups({
68
75
  onToggleProjectSessions = () => {},
69
76
  documentRoot = document,
70
77
  }) {
71
- const groups = new Map(
72
- projects.map((project) => [project.id, { ...project, sessions: [] }]),
73
- );
74
- const ordinary = [];
75
- for (const session of sessions) {
76
- const projectId = session.projectId || session.project?.id;
77
- if (!projectId) {
78
- ordinary.push(session);
79
- continue;
80
- }
81
- const group = groups.get(projectId) ?? {
82
- id: projectId,
83
- name: session.project?.name || "Project",
84
- directory: session.project?.directory || "",
85
- sessions: [],
86
- };
87
- group.sessions.push(session);
88
- groups.set(projectId, group);
89
- }
78
+ const { groups, ordinary } = projectSessionDisplayGroups(projects, sessions, deletedProjectIds);
90
79
  let index = 0;
91
- const heading = documentRoot.createElement("div");
92
- heading.className = "project-section-heading";
93
- heading.textContent = "Projects";
94
- root.appendChild(heading);
95
- for (const group of groups.values()) {
80
+ if (newProjectButton) root.appendChild(newProjectButton);
81
+ for (const group of groups) {
96
82
  const matchesProject = matchesSessionQuery(
97
83
  [group.name, group.directory],
98
84
  query,
@@ -100,7 +86,7 @@ export function renderProjectSessionGroups({
100
86
  if (!matchesProject && group.sessions.length === 0) continue;
101
87
  const { section, content } = createProjectGroup({
102
88
  group, query, collapsedProjectIds, busyProjectId,
103
- onToggleGroup, onNewConversation, documentRoot,
89
+ onToggleGroup, onNewConversation, onDeleteProject, documentRoot,
104
90
  });
105
91
  renderProjectSessionPreview({
106
92
  content, group, query, documentRoot,
@@ -22,7 +22,7 @@ export function buildRuntimeSetupCommands(
22
22
  const packaged = setupCommandMode === "package";
23
23
  const initPrefix = packaged ? "npx abot init" : "npm run init --";
24
24
  const init = `${initPrefix} --provider ${providerArgument} --model ${modelArgument}${
25
- selectedProvider === "ollama" ? ` --base-url ${baseUrlArgument}` : ""
25
+ ["ollama", "llamacpp"].includes(selectedProvider) ? ` --base-url ${baseUrlArgument}` : ""
26
26
  }`;
27
27
  return {
28
28
  "ollama-pull": `ollama pull ${modelArgument}`,
@@ -0,0 +1,15 @@
1
+ import type { SetupReasoningState } from "./reasoning-fields.js";
2
+ type ConnectionState = SetupReasoningState & {
3
+ providers?: readonly { id: string; label?: string; description?: string; credentialConfigured?: boolean; requiresApiKey?: boolean }[];
4
+ modelId?: string;
5
+ contextWindowTokens?: string | number;
6
+ baseUrl?: string;
7
+ [key: string]: unknown;
8
+ };
9
+ export declare function renderProviderChoices(state: ConnectionState): string;
10
+ export declare function renderConnectionField(options: Record<string, unknown>): string;
11
+ export declare function renderConnectionFields(state: ConnectionState): string;
12
+ export declare function clearConnectionSecret(container: HTMLElement): void;
13
+ export declare function readConnectionSecret(container: HTMLElement): string;
14
+ export declare function validateConnectionFields(state: ConnectionState): { valid: boolean; input?: Record<string, unknown>; field?: string; message?: string };
15
+ export declare function showConnectionFieldError(container: HTMLElement, field: string, messageId?: string, idPrefix?: string): void;
@@ -1,3 +1,5 @@
1
+ import { renderConnectionInspection } from "./connection-inspection.js";
2
+ import { renderSetupReasoningFields, validateSetupReasoningFields } from "./reasoning-fields.js";
1
3
  import { escapeAttribute, escapeHtml, textOf } from "../../lib/text-format.js";
2
4
  import { validateContextWindowTokens } from "./context-window.js";
3
5
  import { canEditSetupConnection } from "./connection-state.js";
@@ -11,7 +13,7 @@ export function renderProviderChoices(state) {
11
13
  .map(
12
14
  (provider) => `<label class="runtime-provider-option">
13
15
  <input type="radio" name="runtimeSetupProvider" value="${escapeAttribute(provider.id)}" data-runtime-setup-field="provider" ${state.provider === provider.id ? "checked" : ""} />
14
- <span><strong>${escapeHtml(provider.label)}</strong><small>${escapeHtml(provider.description || (provider.id === "ollama" ? "A model on your computer or server" : "A hosted model using your API key"))}</small></span>
16
+ <span><strong>${escapeHtml(provider.label)}</strong><small>${escapeHtml(provider.description || (provider.id !== "openai" ? "A model on your computer or server" : "A hosted model using your API key"))}</small></span>
15
17
  </label>`,
16
18
  )
17
19
  .join("");
@@ -66,10 +68,28 @@ export function renderConnectionFields(state) {
66
68
  error: state.contextWindowFeedback?.message,
67
69
  step: "1",
68
70
  readonly: !canEditSetupConnection(state),
69
- help: "Use a value supported by your model. Larger windows need more memory with Ollama. You can change this later in Models.",
71
+ help: "Use a value supported by your model. Larger windows need more memory on local servers. You can change this later in Models.",
70
72
  });
73
+ const reasoning = renderSetupReasoningFields(state, !canEditSetupConnection(state));
74
+ if (providerType === "llamacpp") {
75
+ const address = state.existingProvider ? "" : renderConnectionField({
76
+ idPrefix, field: "llamacpp-base-url", label: "llama.cpp address", type: "url",
77
+ value: state.baseUrl, readonly: !canEditSetupConnection(state),
78
+ placeholder: "http://127.0.0.1:8080",
79
+ help: "Start llama-server separately. Use the origin reachable from the computer running ABot.",
80
+ });
81
+ const preservesExistingNoKeyConnection = state.existingProvider && selectedProvider?.requiresApiKey !== true;
82
+ const keepsConfiguredCredential = credentialConfigured && state.allowCredentialReplacement === false;
83
+ const key = preservesExistingNoKeyConnection || keepsConfiguredCredential ? "" : renderConnectionField({
84
+ idPrefix, field: "api-key", label: "API key (if your server requires one)", type: "password",
85
+ required: selectedProvider?.requiresApiKey === true && !credentialConfigured,
86
+ placeholder: credentialConfigured ? "Leave blank to keep your saved key" : "Optional server API key",
87
+ help: "Saved privately on the ABot server. Leave empty for a server without authentication.",
88
+ });
89
+ return model + address + key + renderConnectionInspection(state) + reasoning;
90
+ }
71
91
  if (providerType === "ollama") {
72
- if (state.existingProvider) return model;
92
+ if (state.existingProvider) return model + reasoning;
73
93
  return (
74
94
  model +
75
95
  renderConnectionField({
@@ -81,11 +101,11 @@ export function renderConnectionFields(state) {
81
101
  readonly: !canEditSetupConnection(state),
82
102
  placeholder: "http://127.0.0.1:11434",
83
103
  help: "Use the address reachable from the computer running ABot.",
84
- })
104
+ }) + reasoning
85
105
  );
86
106
  }
87
107
  if (credentialConfigured && state.allowCredentialReplacement === false)
88
- return model;
108
+ return model + reasoning;
89
109
  return (
90
110
  model +
91
111
  renderConnectionField({
@@ -98,7 +118,7 @@ export function renderConnectionFields(state) {
98
118
  ? "Leave blank to keep your saved key"
99
119
  : "Enter your OpenAI API key",
100
120
  help: "Saved privately on the ABot server. Never stored in this browser.",
101
- })
121
+ }) + reasoning
102
122
  );
103
123
  }
104
124
 
@@ -119,6 +139,7 @@ export function validateConnectionFields({
119
139
  providerType,
120
140
  baseUrl,
121
141
  existingProvider = false,
142
+ supportsThinking, reasoningBudgetMode, reasoningBudgetTokens,
122
143
  }) {
123
144
  const model = validateRuntimeSetupModelId(modelId);
124
145
  if (!model.valid)
@@ -126,17 +147,19 @@ export function validateConnectionFields({
126
147
  const context = validateContextWindowTokens(contextWindowTokens);
127
148
  if (!context.valid) return context;
128
149
  const input = { model: model.value, contextWindowTokens: context.value };
129
- if (providerType === "ollama" && !existingProvider) {
150
+ if (["ollama", "llamacpp"].includes(providerType) && !existingProvider) {
130
151
  const address = validateRuntimeSetupBaseUrl(baseUrl);
131
152
  if (!address.valid)
132
153
  return {
133
154
  valid: false,
134
- field: "ollama-base-url",
155
+ field: providerType + "-base-url",
135
156
  message: address.message,
136
157
  };
137
158
  input.baseUrl = address.value;
138
159
  }
139
- return { valid: true, input };
160
+ const reasoning = validateSetupReasoningFields({ providerType, supportsThinking, reasoningBudgetMode, reasoningBudgetTokens });
161
+ if (!reasoning.valid) return reasoning;
162
+ return { valid: true, input: { ...input, ...reasoning.input } };
140
163
  }
141
164
 
142
165
  export function showConnectionFieldError(
@@ -0,0 +1,23 @@
1
+ import { readConnectionSecret, validateConnectionFields } from "./connection-form.js";
2
+
3
+ /** One connection submission, including private key read only at submission time. */
4
+ export function runtimeSetupConnectionInput(state, container, fieldError) {
5
+ const result = validateConnectionFields({
6
+ ...state, modelId: state.modelId, providerType: state.provider,
7
+ });
8
+ if (!result.valid) {
9
+ fieldError(result.field, result.message);
10
+ return null;
11
+ }
12
+ const input = { provider: state.provider, ...result.input };
13
+ if (state.editableConnection?.revision)
14
+ input.connectionRevision = state.editableConnection.revision;
15
+ if (state.provider === "ollama") return input;
16
+ const apiKey = readConnectionSecret(container);
17
+ const provider = state.providers.find((entry) => entry.id === state.provider);
18
+ if (provider?.requiresApiKey === true && provider?.credentialConfigured !== true && !apiKey) {
19
+ fieldError("api-key", "Enter the API key for this connection.");
20
+ return null;
21
+ }
22
+ return apiKey ? { ...input, apiKey } : input;
23
+ }
@@ -0,0 +1,57 @@
1
+ import { escapeHtml } from "../../lib/text-format.js";
2
+
3
+
4
+ export function renderConnectionInspection(state) {
5
+ return `<div class="runtime-setup-field"><button type="button" class="runtime-setup-secondary" data-runtime-setup-action="inspect-model-connection" data-model-action="inspect-model-connection" ${state.checkingConnection ? "disabled" : ""}>${state.checkingConnection ? "Checking…" : "Check connection"}</button>
6
+ <small role="status" data-connection-inspection-message>${escapeHtml(state.connectionInspectionMessage || "Reads server health and model IDs only. Does not generate a response or save settings.")}</small></div>`;
7
+ }
8
+
9
+ /** Metadata inspection has no authority to infer model capabilities or alter saved setup. */
10
+ export function createConnectionInspection({ state, container, inspectConnection, onChange, getEnvironmentId = () => "" }) {
11
+ let generation = 0;
12
+ const identity = () => JSON.stringify([getEnvironmentId(), state.choice || state.provider, state.baseUrl]);
13
+ function updateInspectionFeedback() {
14
+ const button = container.querySelector('[data-runtime-setup-action="inspect-model-connection"]');
15
+ if (button) {
16
+ button.disabled = state.checkingConnection === true;
17
+ button.textContent = state.checkingConnection ? "Checking…" : "Check connection";
18
+ }
19
+ const message = container.querySelector("[data-connection-inspection-message]");
20
+ if (message) message.textContent = state.connectionInspectionMessage;
21
+ }
22
+ function reset() {
23
+ generation += 1;
24
+ state.checkingConnection = false;
25
+ state.connectionInspectionMessage = "";
26
+ }
27
+ async function check() {
28
+ if (!inspectConnection || state.checkingConnection) return;
29
+ const current = ++generation;
30
+ const target = identity();
31
+ const savedId = state.choice?.startsWith("existing:") ? state.choice.slice(9) : undefined;
32
+ const input = savedId
33
+ ? { providerId: savedId }
34
+ : { provider: "llamacpp", baseUrl: state.baseUrl };
35
+ const apiKey = container.querySelector('[data-runtime-setup-field="api-key"]')?.value?.trim() || "";
36
+ if (apiKey) input.apiKey = apiKey;
37
+ state.checkingConnection = true;
38
+ state.connectionInspectionMessage = "";
39
+ updateInspectionFeedback();
40
+ try {
41
+ const payload = await inspectConnection(input);
42
+ if (current !== generation || target !== identity()) return;
43
+ const models = payload?.connection?.models || [];
44
+ state.connectionInspectionMessage = `Server ready. Available models: ${models.join(", ") || "none reported"}. Thinking support and context capacity still require model configuration.`;
45
+ } catch {
46
+ if (current !== generation || target !== identity()) return;
47
+ state.connectionInspectionMessage = "Connection check failed. Check the server address, authentication and loaded model.";
48
+ } finally {
49
+ delete input.apiKey;
50
+ if (current === generation) {
51
+ state.checkingConnection = false;
52
+ updateInspectionFeedback();
53
+ }
54
+ }
55
+ }
56
+ return { check, reset };
57
+ }
@@ -1,11 +1,16 @@
1
1
  import { textOf } from "../../lib/text-format.js";
2
- import { normalizeProvider } from "./validation.js";
2
+ import { setupReasoningState, updateSetupReasoningField } from "./reasoning-fields.js";
3
+ import { normalizeProvider, defaultSetupProviderAddress } from "./validation.js";
3
4
  import { readSetupContextWindowFeedback } from "./context-window-feedback.js";
4
5
 
5
6
  export function selectSetupProvider(state, value) {
6
7
  const provider = normalizeProvider(value);
7
8
  const providerChanged = state.provider !== provider;
8
- if (providerChanged) state.modelId = "";
9
+ if (providerChanged) {
10
+ state.modelId = "";
11
+ state.baseUrl = defaultSetupProviderAddress(provider);
12
+ Object.assign(state, setupReasoningState());
13
+ }
9
14
  state.provider = provider;
10
15
  }
11
16
 
@@ -21,7 +26,14 @@ export function hasSetupConnectionChanges(state) {
21
26
  if (state.modelId.trim() !== saved.model) return true;
22
27
  if (Number(state.contextWindowTokens) !== saved.contextWindowTokens)
23
28
  return true;
24
- if (state.provider !== "ollama") return false;
29
+ if (state.supportsThinking !== saved.supportsThinking) return true;
30
+ if (state.provider === "llamacpp") {
31
+ const reasoning = setupReasoningState(saved);
32
+ if (state.supportsThinking !== reasoning.supportsThinking) return true;
33
+ if (state.reasoningBudgetMode !== reasoning.reasoningBudgetMode) return true;
34
+ if (state.reasoningBudgetTokens !== reasoning.reasoningBudgetTokens) return true;
35
+ }
36
+ if (!["ollama", "llamacpp"].includes(state.provider)) return false;
25
37
  return state.baseUrl.trim().replace(/\/$/u, "") !== saved.baseUrl;
26
38
  }
27
39
 
@@ -54,12 +66,14 @@ export function updateSetupConnectionField(state, field, value) {
54
66
  if (!canEditSetupConnection(state)) return;
55
67
  if (field === "model-id") state.modelId = value;
56
68
  if (field === "context-window") state.contextWindowTokens = value;
57
- if (field === "ollama-base-url") state.baseUrl = value;
69
+ if (["ollama-base-url", "llamacpp-base-url"].includes(field)) state.baseUrl = value;
70
+ return updateSetupReasoningField(state, field, value);
58
71
  }
59
72
 
60
73
  export function receiveSetupConnection(state, setup) {
61
74
  state.editableConnection = setup?.editableConnection || null;
62
75
  state.existingModel = setup?.existingModel || null;
76
+ Object.assign(state, setupReasoningState(state.existingModel || {}));
63
77
  state.contextWindowTokens = textOf(
64
78
  state.existingModel?.contextWindowTokens ??
65
79
  setup?.defaultContextWindowTokens,
@@ -12,6 +12,9 @@ function withProviderCredentialStatus(provider, catalog) {
12
12
  return {
13
13
  ...projected,
14
14
  credentialConfigured: matched.credentialConfigured === true,
15
+ ...(provider.type === "llamacpp"
16
+ ? { requiresApiKey: matched.requiresApiKey === true }
17
+ : {}),
15
18
  };
16
19
  }
17
20