@abot-ai/runtime 1.9.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +5 -1
  2. package/dist/scripts/add-runtime-model.js +11 -5
  3. package/dist/scripts/init-runtime.js +15 -10
  4. package/dist/scripts/runtime-model-addition.js +6 -1
  5. package/dist/scripts/runtime-setup-command-options.d.ts +11 -0
  6. package/dist/scripts/runtime-setup-command-options.js +41 -0
  7. package/dist/scripts/runtime-setup-files.d.ts +3 -2
  8. package/dist/scripts/runtime-setup-files.js +19 -4
  9. package/dist/scripts/runtime-setup-model-options.d.ts +8 -0
  10. package/dist/scripts/runtime-setup-model-options.js +40 -0
  11. package/dist/scripts/runtime-setup-presentation.js +2 -2
  12. package/dist/scripts/runtime-setup-provider-options.d.ts +4 -0
  13. package/dist/scripts/runtime-setup-provider-options.js +20 -0
  14. package/dist/src/model-gateway/client/contracts.d.ts +3 -0
  15. package/dist/src/model-gateway/client/input-token-count.js +36 -16
  16. package/dist/src/model-gateway/client/message-projection.d.ts +2 -0
  17. package/dist/src/model-gateway/client/message-projection.js +1 -0
  18. package/dist/src/model-gateway/client/options.js +1 -1
  19. package/dist/src/model-gateway/client/raw.js +1 -0
  20. package/dist/src/model-gateway/index.d.ts +1 -1
  21. package/dist/src/model-gateway/observability/input-token-count-diagnostics.d.ts +26 -0
  22. package/dist/src/model-gateway/observability/input-token-count-diagnostics.js +178 -0
  23. package/dist/src/model-gateway/policy/invocation-policy.d.ts +1 -3
  24. package/dist/src/model-gateway/policy/invocation-policy.js +3 -30
  25. package/dist/src/model-gateway/policy/reasoning-mode-budget.d.ts +5 -0
  26. package/dist/src/model-gateway/policy/reasoning-mode-budget.js +13 -0
  27. package/dist/src/model-gateway/policy/reasoning-policy.d.ts +10 -0
  28. package/dist/src/model-gateway/policy/reasoning-policy.js +124 -0
  29. package/dist/src/model-gateway/protocol/openai-embedding-response.d.ts +1 -0
  30. package/dist/src/model-gateway/protocol/openai-embedding-response.js +28 -0
  31. package/dist/src/model-gateway/protocol/sse-data.d.ts +9 -0
  32. package/dist/src/model-gateway/protocol/sse-data.js +67 -0
  33. package/dist/src/model-gateway/providers/envelope-budget.js +10 -1
  34. package/dist/src/model-gateway/providers/llamacpp/adapter.d.ts +2 -0
  35. package/dist/src/model-gateway/providers/llamacpp/adapter.js +79 -0
  36. package/dist/src/model-gateway/providers/llamacpp/connection.d.ts +9 -0
  37. package/dist/src/model-gateway/providers/llamacpp/connection.js +73 -0
  38. package/dist/src/model-gateway/providers/llamacpp/diagnostics.d.ts +2 -0
  39. package/dist/src/model-gateway/providers/llamacpp/diagnostics.js +17 -0
  40. package/dist/src/model-gateway/providers/llamacpp/embeddings.d.ts +2 -0
  41. package/dist/src/model-gateway/providers/llamacpp/embeddings.js +56 -0
  42. package/dist/src/model-gateway/providers/llamacpp/input-token-count.d.ts +3 -0
  43. package/dist/src/model-gateway/providers/llamacpp/input-token-count.js +59 -0
  44. package/dist/src/model-gateway/providers/llamacpp/message-projection.d.ts +2 -0
  45. package/dist/src/model-gateway/providers/llamacpp/message-projection.js +33 -0
  46. package/dist/src/model-gateway/providers/llamacpp/payload.d.ts +2 -0
  47. package/dist/src/model-gateway/providers/llamacpp/payload.js +44 -0
  48. package/dist/src/model-gateway/providers/llamacpp/response-lifetime.d.ts +1 -0
  49. package/dist/src/model-gateway/providers/llamacpp/response-lifetime.js +56 -0
  50. package/dist/src/model-gateway/providers/llamacpp/schema-format.d.ts +2 -0
  51. package/dist/src/model-gateway/providers/llamacpp/schema-format.js +29 -0
  52. package/dist/src/model-gateway/providers/llamacpp/settings.d.ts +9 -0
  53. package/dist/src/model-gateway/providers/llamacpp/settings.js +25 -0
  54. package/dist/src/model-gateway/providers/llamacpp/stream-normalizer.d.ts +10 -0
  55. package/dist/src/model-gateway/providers/llamacpp/stream-normalizer.js +85 -0
  56. package/dist/src/model-gateway/providers/llamacpp/stream.d.ts +9 -0
  57. package/dist/src/model-gateway/providers/llamacpp/stream.js +33 -0
  58. package/dist/src/model-gateway/providers/openai/embeddings.js +2 -29
  59. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +1 -9
  60. package/dist/src/model-gateway/providers/openai/sse-data.js +1 -67
  61. package/dist/src/model-gateway/providers/registry.js +2 -0
  62. package/dist/src/model-gateway/server/input-token-count-handler.js +10 -1
  63. package/dist/src/model-gateway/types.d.ts +11 -1
  64. package/dist/src/runtime/adapters/long-term-memory/onboarding-provider-availability.d.ts +4 -0
  65. package/dist/src/runtime/adapters/long-term-memory/onboarding-provider-availability.js +11 -0
  66. package/dist/src/runtime/adapters/long-term-memory/onboarding-service.js +28 -1
  67. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.d.ts +1 -0
  68. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.js +6 -1
  69. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/contracts.d.ts +1 -0
  70. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.d.ts +1 -0
  71. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +2 -0
  72. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.d.ts +1 -0
  73. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.js +2 -0
  74. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.d.ts +1 -0
  75. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.js +1 -0
  76. package/dist/src/runtime/adapters/registered-tool-worker-capabilities.js +1 -0
  77. package/dist/src/runtime/adapters/scheduler-runtime.js +2 -0
  78. package/dist/src/runtime/automations/agent-step-executor.js +1 -0
  79. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  80. package/dist/src/runtime/automations/catalog.js +2 -0
  81. package/dist/src/runtime/automations/definition-contracts.d.ts +2 -0
  82. package/dist/src/runtime/automations/definition-input.js +3 -1
  83. package/dist/src/runtime/automations/draft-mutations.js +5 -1
  84. package/dist/src/runtime/automations/model-dependency-projection.d.ts +3 -1
  85. package/dist/src/runtime/automations/model-dependency-projection.js +4 -2
  86. package/dist/src/runtime/automations/publication-validation.js +7 -0
  87. package/dist/src/runtime/automations/saved-agent-management.js +1 -0
  88. package/dist/src/runtime/automations/service.d.ts +3 -0
  89. package/dist/src/runtime/capabilities/automation-builder/payload-schema.js +7 -5
  90. package/dist/src/runtime/capabilities/automations/authoring-catalog.d.ts +9 -0
  91. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -0
  92. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +3 -0
  93. package/dist/src/runtime/capabilities/automations/tool-contract.js +3 -2
  94. package/dist/src/runtime/capabilities/automations/tool-module.js +16 -7
  95. package/dist/src/runtime/capabilities/model-reasoning-controls.d.ts +23 -0
  96. package/dist/src/runtime/capabilities/model-reasoning-controls.js +56 -0
  97. package/dist/src/runtime/capabilities/scheduling/create-operations.js +2 -0
  98. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +1 -0
  99. package/dist/src/runtime/capabilities/scheduling/tool-module.js +5 -2
  100. package/dist/src/runtime/capabilities/scheduling/update-operations.js +2 -0
  101. package/dist/src/runtime/config/builders.js +6 -0
  102. package/dist/src/runtime/config/effective-model-config-validation.js +4 -0
  103. package/dist/src/runtime/config/llamacpp-profile-validation.d.ts +3 -0
  104. package/dist/src/runtime/config/llamacpp-profile-validation.js +15 -0
  105. package/dist/src/runtime/config/model-reasoning-schema.d.ts +40 -0
  106. package/dist/src/runtime/config/model-reasoning-schema.js +38 -0
  107. package/dist/src/runtime/config/model-reasoning-validation.d.ts +3 -0
  108. package/dist/src/runtime/config/model-reasoning-validation.js +37 -0
  109. package/dist/src/runtime/config/runner/step-instructions.d.ts +4 -0
  110. package/dist/src/runtime/config/runner/step-instructions.js +10 -6
  111. package/dist/src/runtime/config/schema.js +3 -0
  112. package/dist/src/runtime/config/validation/model-invocation-config-validation.js +14 -0
  113. package/dist/src/runtime/context/compacted-capability-result-receipt.d.ts +2 -0
  114. package/dist/src/runtime/context/compacted-capability-result-receipt.js +8 -7
  115. package/dist/src/runtime/context/execution-compacted-evidence.d.ts +4 -0
  116. package/dist/src/runtime/context/execution-compacted-evidence.js +2 -23
  117. package/dist/src/runtime/context/execution-compaction-checkpoint-selection.d.ts +19 -0
  118. package/dist/src/runtime/context/execution-compaction-checkpoint-selection.js +104 -0
  119. package/dist/src/runtime/context/model-step-compaction-inheritance.d.ts +12 -0
  120. package/dist/src/runtime/context/model-step-compaction-inheritance.js +28 -0
  121. package/dist/src/runtime/context/model-step-compaction-projection.d.ts +12 -0
  122. package/dist/src/runtime/context/model-step-compaction-projection.js +322 -0
  123. package/dist/src/runtime/context/model-step-compaction.d.ts +2 -1
  124. package/dist/src/runtime/context/model-step-compaction.js +25 -316
  125. package/dist/src/runtime/context/operation-supervision-compacted-evidence.js +7 -1
  126. package/dist/src/runtime/context/request-context.d.ts +2 -0
  127. package/dist/src/runtime/context/request-context.js +16 -0
  128. package/dist/src/runtime/context/request-tool-results-checkpoint.d.ts +2 -1
  129. package/dist/src/runtime/context/request-tool-results-checkpoint.js +35 -6
  130. package/dist/src/runtime/context/request-tool-results.js +3 -1
  131. package/dist/src/runtime/context/semantic-compaction/checkpoint-message.d.ts +5 -1
  132. package/dist/src/runtime/context/semantic-compaction/checkpoint-message.js +10 -4
  133. package/dist/src/runtime/context/semantic-compaction/execution-evidence-instructions.d.ts +4 -0
  134. package/dist/src/runtime/context/semantic-compaction/execution-evidence-instructions.js +38 -0
  135. package/dist/src/runtime/context/semantic-compaction/generation-contracts.d.ts +3 -1
  136. package/dist/src/runtime/context/semantic-compaction/generation-input.js +15 -10
  137. package/dist/src/runtime/context/semantic-compaction/inherited-source-digests.d.ts +8 -0
  138. package/dist/src/runtime/context/semantic-compaction/inherited-source-digests.js +76 -0
  139. package/dist/src/runtime/context/semantic-compaction/replacement-budget.js +3 -1
  140. package/dist/src/runtime/context/semantic-compaction/run.js +6 -12
  141. package/dist/src/runtime/knowledge-skills/builtins/computer-use.js +1 -1
  142. package/dist/src/runtime/knowledge-skills/builtins/technical-work.js +20 -2
  143. package/dist/src/runtime/knowledge-skills/builtins/what-can-i-do.d.ts +2 -0
  144. package/dist/src/runtime/knowledge-skills/builtins/what-can-i-do.js +27 -0
  145. package/dist/src/runtime/knowledge-skills/catalog.js +2 -0
  146. package/dist/src/runtime/local-application.d.ts +5 -0
  147. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -1
  148. package/dist/src/runtime/local-host/app-service-dispatch.js +2 -0
  149. package/dist/src/runtime/local-host/client-services.d.ts +5 -0
  150. package/dist/src/runtime/local-host/saved-approvals.js +1 -0
  151. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +5 -7
  152. package/dist/src/runtime/long-term-memory/onboarding/contracts.d.ts +26 -0
  153. package/dist/src/runtime/long-term-memory/onboarding/embedding-profile-id.d.ts +1 -0
  154. package/dist/src/runtime/long-term-memory/onboarding/embedding-profile-id.js +8 -0
  155. package/dist/src/runtime/long-term-memory/onboarding/saved-profiles.d.ts +17 -0
  156. package/dist/src/runtime/long-term-memory/onboarding/saved-profiles.js +77 -0
  157. package/dist/src/runtime/long-term-memory/onboarding/service.js +40 -10
  158. package/dist/src/runtime/model/input-token-count.js +1 -0
  159. package/dist/src/runtime/model/invoke-step.js +12 -0
  160. package/dist/src/runtime/model/invoke-structured-step.d.ts +4 -1
  161. package/dist/src/runtime/model/invoke-structured-step.js +4 -0
  162. package/dist/src/runtime/model/model-catalog.d.ts +3 -0
  163. package/dist/src/runtime/model/model-catalog.js +2 -0
  164. package/dist/src/runtime/model/model-context-budget.d.ts +5 -0
  165. package/dist/src/runtime/model/model-context-budget.js +2 -0
  166. package/dist/src/runtime/model/model-step-port.d.ts +7 -0
  167. package/dist/src/runtime/model/optional-context-admission.d.ts +18 -0
  168. package/dist/src/runtime/model/optional-context-admission.js +23 -0
  169. package/dist/src/runtime/ports.d.ts +3 -1
  170. package/dist/src/runtime/projects/contracts.d.ts +6 -0
  171. package/dist/src/runtime/projects/registry-format.d.ts +3 -0
  172. package/dist/src/runtime/projects/registry-format.js +50 -0
  173. package/dist/src/runtime/projects/repository.d.ts +6 -3
  174. package/dist/src/runtime/projects/repository.js +26 -19
  175. package/dist/src/runtime/projects/service.js +11 -0
  176. package/dist/src/runtime/request/approval-wait/preflight.js +1 -0
  177. package/dist/src/runtime/request/approval-wait/snapshot.d.ts +1 -1
  178. package/dist/src/runtime/request/approval-wait/snapshot.js +1 -0
  179. package/dist/src/runtime/request/contracts.d.ts +5 -1
  180. package/dist/src/runtime/request/execution-facets.js +2 -0
  181. package/dist/src/runtime/request/execution-payload-artifact-policy.d.ts +3 -0
  182. package/dist/src/runtime/request/execution-payload-artifact-policy.js +6 -0
  183. package/dist/src/runtime/request/execution-payload-compacted-evidence.js +1 -0
  184. package/dist/src/runtime/request/execution-scope-surfaces.d.ts +2 -0
  185. package/dist/src/runtime/request/execution-scope-surfaces.js +3 -0
  186. package/dist/src/runtime/request/execution-scope.d.ts +2 -0
  187. package/dist/src/runtime/request/execution-scope.js +2 -0
  188. package/dist/src/runtime/request/input.d.ts +1 -0
  189. package/dist/src/runtime/request/input.js +1 -0
  190. package/dist/src/runtime/request/prepared-execution.d.ts +1 -0
  191. package/dist/src/runtime/request/prepared-execution.js +3 -0
  192. package/dist/src/runtime/request/reasoning-preference.d.ts +10 -0
  193. package/dist/src/runtime/request/reasoning-preference.js +29 -0
  194. package/dist/src/runtime/request/root-reference-action.js +3 -3
  195. package/dist/src/runtime/request/root-skill-read-admission.d.ts +4 -0
  196. package/dist/src/runtime/request/root-skill-read-admission.js +14 -0
  197. package/dist/src/runtime/request/root-skill-read.js +13 -5
  198. package/dist/src/runtime/request/supervisor-skill-selection-window.d.ts +16 -0
  199. package/dist/src/runtime/request/supervisor-skill-selection-window.js +17 -0
  200. package/dist/src/runtime/request/worker-capability-composition.js +2 -0
  201. package/dist/src/runtime/scheduler/contracts.d.ts +7 -1
  202. package/dist/src/runtime/scheduler/job-management.js +7 -1
  203. package/dist/src/runtime/scheduler/run-records.js +2 -0
  204. package/dist/src/runtime/scheduler/schedule-validation.js +2 -0
  205. package/dist/src/runtime/scheduler/scheduler-engine.js +1 -0
  206. package/dist/src/runtime/scheduler/snapshot-validation.js +2 -0
  207. package/dist/src/runtime/steps/auditor-decision/projection.js +2 -0
  208. package/dist/src/runtime/steps/execution-agent/capability-controls-partition.d.ts +9 -0
  209. package/dist/src/runtime/steps/execution-agent/capability-controls-partition.js +29 -0
  210. package/dist/src/runtime/steps/execution-agent/capability-scope.d.ts +17 -0
  211. package/dist/src/runtime/steps/execution-agent/capability-scope.js +54 -0
  212. package/dist/src/runtime/steps/execution-agent/compaction.js +22 -6
  213. package/dist/src/runtime/steps/execution-agent/controls-compacted-evidence.js +2 -0
  214. package/dist/src/runtime/steps/execution-agent/evidence-reuse-instructions.d.ts +6 -0
  215. package/dist/src/runtime/steps/execution-agent/evidence-reuse-instructions.js +13 -0
  216. package/dist/src/runtime/steps/execution-agent/format.js +3 -6
  217. package/dist/src/runtime/steps/execution-agent/input.d.ts +5 -1
  218. package/dist/src/runtime/steps/execution-agent/input.js +10 -36
  219. package/dist/src/runtime/steps/execution-agent/observation-guidance.d.ts +11 -0
  220. package/dist/src/runtime/steps/execution-agent/observation-guidance.js +33 -0
  221. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  222. package/dist/src/runtime/steps/execution-agent/refinement.d.ts +3 -2
  223. package/dist/src/runtime/steps/execution-agent/refinement.js +17 -6
  224. package/dist/src/runtime/steps/execution-agent/run.js +7 -1
  225. package/dist/src/runtime/steps/skill-read-decision.d.ts +1 -0
  226. package/dist/src/runtime/steps/skill-read-decision.js +9 -4
  227. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.d.ts +6 -1
  228. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.js +15 -0
  229. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +1 -1
  230. package/dist/src/runtime/steps/supervisor-decision/contracts.js +2 -0
  231. package/dist/src/runtime/steps/supervisor-decision/decision-phases.d.ts +3 -0
  232. package/dist/src/runtime/steps/supervisor-decision/decision-phases.js +22 -3
  233. package/dist/src/runtime/steps/supervisor-decision/delegation-contract.d.ts +9 -0
  234. package/dist/src/runtime/steps/supervisor-decision/delegation-contract.js +82 -0
  235. package/dist/src/runtime/steps/supervisor-decision/delegation-input.d.ts +7 -0
  236. package/dist/src/runtime/steps/supervisor-decision/delegation-input.js +105 -0
  237. package/dist/src/runtime/steps/supervisor-decision/delegation-prompt.d.ts +7 -0
  238. package/dist/src/runtime/steps/supervisor-decision/delegation-prompt.js +13 -0
  239. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  240. package/dist/src/runtime/steps/supervisor-decision/preparation-input.d.ts +3 -5
  241. package/dist/src/runtime/steps/supervisor-decision/preparation-input.js +5 -21
  242. package/dist/src/runtime/steps/supervisor-decision/preparation.d.ts +4 -1
  243. package/dist/src/runtime/steps/supervisor-decision/preparation.js +58 -6
  244. package/dist/src/runtime/steps/supervisor-decision/procedure-entry.d.ts +22 -0
  245. package/dist/src/runtime/steps/supervisor-decision/procedure-entry.js +61 -0
  246. package/dist/src/runtime/steps/supervisor-decision/procedure-gate.d.ts +39 -0
  247. package/dist/src/runtime/steps/supervisor-decision/procedure-gate.js +146 -0
  248. package/dist/src/runtime/steps/supervisor-decision/procedure-memory.d.ts +9 -0
  249. package/dist/src/runtime/steps/supervisor-decision/procedure-memory.js +100 -0
  250. package/dist/src/runtime/steps/supervisor-decision/procedure-recall.d.ts +10 -0
  251. package/dist/src/runtime/steps/supervisor-decision/procedure-recall.js +52 -0
  252. package/dist/src/runtime/steps/supervisor-decision/prompt.js +3 -16
  253. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +2 -2
  254. package/dist/src/runtime/steps/supervisor-decision/role-guidance.d.ts +3 -0
  255. package/dist/src/runtime/steps/supervisor-decision/role-guidance.js +20 -0
  256. package/dist/src/runtime/steps/supervisor-decision/run.js +50 -7
  257. package/dist/src/runtime/steps/supervisor-decision/skill-read-state.d.ts +10 -0
  258. package/dist/src/runtime/steps/supervisor-decision/skill-read-state.js +45 -0
  259. package/dist/src/runtime/steps/supervisor-decision/skill-selection-candidates.d.ts +15 -0
  260. package/dist/src/runtime/steps/supervisor-decision/skill-selection-candidates.js +25 -0
  261. package/dist/src/runtime/steps/supervisor-decision/skill-selection-catalog.d.ts +3 -0
  262. package/dist/src/runtime/steps/supervisor-decision/skill-selection-catalog.js +15 -0
  263. package/dist/src/runtime/steps/supervisor-decision/skill-selection-continuation.d.ts +10 -0
  264. package/dist/src/runtime/steps/supervisor-decision/skill-selection-continuation.js +65 -0
  265. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.d.ts +3 -1
  266. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.js +20 -22
  267. package/dist/src/runtime/steps/supervisor-decision/skill-selection.d.ts +3 -2
  268. package/dist/src/runtime/steps/supervisor-decision/skill-selection.js +62 -15
  269. package/dist/src/runtime/steps/supervisor-response/prompt.js +18 -4
  270. package/dist/src/shared/model-reasoning-modes.d.ts +5 -0
  271. package/dist/src/shared/model-reasoning-modes.js +20 -0
  272. package/dist/src/shared/model-reasoning-schema.d.ts +38 -0
  273. package/dist/src/shared/model-reasoning-schema.js +29 -0
  274. package/dist/src/shared/model-reasoning.d.ts +35 -0
  275. package/dist/src/shared/model-reasoning.js +100 -0
  276. package/dist/src/web-ui/app/ARCHITECTURE.md +13 -0
  277. package/dist/src/web-ui/app/app-bootstrap.js +9 -12
  278. package/dist/src/web-ui/app/app-dom.js +6 -1
  279. package/dist/src/web-ui/app/app-state.js +1 -0
  280. package/dist/src/web-ui/app/app.js +8 -3
  281. package/dist/src/web-ui/app/appearance-feature.js +28 -0
  282. package/dist/src/web-ui/app/automations-feature.js +20 -11
  283. package/dist/src/web-ui/app/components/appearance-dialog.js +79 -0
  284. package/dist/src/web-ui/app/components/automations/archive-actions.js +5 -3
  285. package/dist/src/web-ui/app/components/automations/authoring-entry.js +26 -7
  286. package/dist/src/web-ui/app/components/automations/confirmation-actions.js +78 -0
  287. package/dist/src/web-ui/app/components/automations/draft-recovery-actions.js +1 -0
  288. package/dist/src/web-ui/app/components/automations/node-inspector.js +5 -1
  289. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +4 -2
  290. package/dist/src/web-ui/app/components/automations/timeline.js +2 -2
  291. package/dist/src/web-ui/app/components/automations/workspace-navigation.js +37 -0
  292. package/dist/src/web-ui/app/components/automations/workspace.js +31 -46
  293. package/dist/src/web-ui/app/components/config-workspace/config-model.js +6 -0
  294. package/dist/src/web-ui/app/components/config-workspace/model-removal.js +4 -2
  295. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +8 -16
  296. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget-edit.js +113 -0
  297. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget.d.ts +16 -0
  298. package/dist/src/web-ui/app/components/config-workspace/reasoning-budget.js +67 -0
  299. package/dist/src/web-ui/app/components/config-workspace/reasoning-mode-budgets.d.ts +7 -0
  300. package/dist/src/web-ui/app/components/config-workspace/reasoning-mode-budgets.js +25 -0
  301. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +15 -7
  302. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +32 -12
  303. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +1 -1
  304. package/dist/src/web-ui/app/components/config-workspace.js +2 -1
  305. package/dist/src/web-ui/app/components/confirmation-dialog.js +88 -0
  306. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  307. package/dist/src/web-ui/app/components/conversation-activity.js +32 -3
  308. package/dist/src/web-ui/app/components/conversation-memory-activity.js +31 -0
  309. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +2 -0
  310. package/dist/src/web-ui/app/components/conversation-role-cards.js +14 -11
  311. package/dist/src/web-ui/app/components/conversation-skill-activity.js +67 -0
  312. package/dist/src/web-ui/app/components/conversation-tools.js +5 -5
  313. package/dist/src/web-ui/app/components/conversation-view.js +6 -0
  314. package/dist/src/web-ui/app/components/dashboard/approvals.js +13 -1
  315. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-dialog.d.ts +38 -0
  316. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-dialog.js +289 -0
  317. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-feature.js +75 -0
  318. package/dist/src/web-ui/app/components/long-term-memory/embedding-connection-rendering.js +31 -0
  319. package/dist/src/web-ui/app/components/long-term-memory/manager.js +15 -5
  320. package/dist/src/web-ui/app/components/long-term-memory/saved-embedding-profiles.js +114 -0
  321. package/dist/src/web-ui/app/components/long-term-memory/setup-rendering.js +55 -0
  322. package/dist/src/web-ui/app/components/long-term-memory-setup.js +141 -76
  323. package/dist/src/web-ui/app/components/model-setup/rendering.js +3 -2
  324. package/dist/src/web-ui/app/components/model-setup/validation.js +6 -2
  325. package/dist/src/web-ui/app/components/model-setup/wizard.d.ts +1 -0
  326. package/dist/src/web-ui/app/components/model-setup/wizard.js +28 -5
  327. package/dist/src/web-ui/app/components/passive-learning/memory.js +12 -5
  328. package/dist/src/web-ui/app/components/plugins/manager.js +14 -0
  329. package/dist/src/web-ui/app/components/plugins/removal.js +10 -2
  330. package/dist/src/web-ui/app/components/project-group-actions.js +35 -0
  331. package/dist/src/web-ui/app/components/project-session-groups.js +17 -31
  332. package/dist/src/web-ui/app/components/runtime-setup/commands.js +1 -1
  333. package/dist/src/web-ui/app/components/runtime-setup/connection-form.d.ts +15 -0
  334. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +32 -9
  335. package/dist/src/web-ui/app/components/runtime-setup/connection-input.js +23 -0
  336. package/dist/src/web-ui/app/components/runtime-setup/connection-inspection.js +57 -0
  337. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +18 -4
  338. package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.js +3 -0
  339. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-options.js +54 -0
  340. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-receipt.js +3 -0
  341. package/dist/src/web-ui/app/components/runtime-setup/embedding-rendering.js +22 -22
  342. package/dist/src/web-ui/app/components/runtime-setup/embedding.js +60 -16
  343. package/dist/src/web-ui/app/components/runtime-setup/reasoning-fields.d.ts +17 -0
  344. package/dist/src/web-ui/app/components/runtime-setup/reasoning-fields.js +54 -0
  345. package/dist/src/web-ui/app/components/runtime-setup/validation.js +5 -1
  346. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +9 -3
  347. package/dist/src/web-ui/app/components/runtime-setup-guide.js +20 -29
  348. package/dist/src/web-ui/app/components/schedules/details.js +2 -2
  349. package/dist/src/web-ui/app/components/schedules/form.js +12 -5
  350. package/dist/src/web-ui/app/components/schedules/workspace.js +30 -18
  351. package/dist/src/web-ui/app/components/session-list-viewport.js +49 -0
  352. package/dist/src/web-ui/app/components/session-search-disclosure.js +27 -0
  353. package/dist/src/web-ui/app/components/skills/workspace.js +7 -3
  354. package/dist/src/web-ui/app/components/spark-chat/panel.js +7 -3
  355. package/dist/src/web-ui/app/components/spark-chat/settings.js +57 -15
  356. package/dist/src/web-ui/app/components/tool-approval-card.d.ts +2 -1
  357. package/dist/src/web-ui/app/components/tool-approval-card.js +10 -2
  358. package/dist/src/web-ui/app/components/tool-approval-rejection-input.js +116 -0
  359. package/dist/src/web-ui/app/components/workspace-shell.js +30 -38
  360. package/dist/src/web-ui/app/components/workspace-transitions.js +42 -0
  361. package/dist/src/web-ui/app/configuration-feature.js +34 -4
  362. package/dist/src/web-ui/app/controllers/app-event-bindings.js +45 -29
  363. package/dist/src/web-ui/app/controllers/appearance-controller.js +105 -0
  364. package/dist/src/web-ui/app/controllers/automations-controller.js +9 -1
  365. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +1 -1
  366. package/dist/src/web-ui/app/controllers/composer-feature.js +10 -3
  367. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +1 -1
  368. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +9 -3
  369. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +1 -1
  370. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +8 -2
  371. package/dist/src/web-ui/app/controllers/dashboard-approvals-controller.js +10 -9
  372. package/dist/src/web-ui/app/controllers/environment-transition.js +2 -2
  373. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +9 -7
  374. package/dist/src/web-ui/app/controllers/preference-view-sync.js +35 -0
  375. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +4 -0
  376. package/dist/src/web-ui/app/controllers/projects-controller.js +64 -3
  377. package/dist/src/web-ui/app/controllers/reasoning-budget-controller.d.ts +17 -0
  378. package/dist/src/web-ui/app/controllers/reasoning-budget-controller.js +80 -0
  379. package/dist/src/web-ui/app/controllers/reasoning-budget-menu-events.js +45 -0
  380. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +35 -40
  381. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +6 -1
  382. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +16 -3
  383. package/dist/src/web-ui/app/controllers/session-controller.js +34 -9
  384. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +4 -3
  385. package/dist/src/web-ui/app/controllers/skills-controller.js +33 -16
  386. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +1 -1
  387. package/dist/src/web-ui/app/controllers/spark-handoff-navigation.js +7 -1
  388. package/dist/src/web-ui/app/controllers/tool-approval-controller.d.ts +2 -1
  389. package/dist/src/web-ui/app/controllers/tool-approval-controller.js +36 -3
  390. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +8 -2
  391. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +41 -10
  392. package/dist/src/web-ui/app/index.html +38 -32
  393. package/dist/src/web-ui/app/lib/color-palettes.d.ts +17 -0
  394. package/dist/src/web-ui/app/lib/color-palettes.js +20 -0
  395. package/dist/src/web-ui/app/lib/memory-activity-model.d.ts +12 -0
  396. package/dist/src/web-ui/app/lib/memory-activity-model.js +61 -0
  397. package/dist/src/web-ui/app/lib/navigation-display.d.ts +8 -0
  398. package/dist/src/web-ui/app/lib/navigation-display.js +12 -0
  399. package/dist/src/web-ui/app/lib/reasoning-controls.js +47 -6
  400. package/dist/src/web-ui/app/lib/reasoning-preference.d.ts +9 -0
  401. package/dist/src/web-ui/app/lib/reasoning-preference.js +75 -0
  402. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +4 -0
  403. package/dist/src/web-ui/app/lib/session-composer-queue.js +4 -0
  404. package/dist/src/web-ui/app/lib/session-project-groups.js +28 -0
  405. package/dist/src/web-ui/app/lib/session-sidebar-order.js +7 -5
  406. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +1 -0
  407. package/dist/src/web-ui/app/lib/tool-activity-event.js +1 -0
  408. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +1 -0
  409. package/dist/src/web-ui/app/lib/tool-activity-model.js +1 -0
  410. package/dist/src/web-ui/app/lib/tool-approval-rejection-drafts.js +45 -0
  411. package/dist/src/web-ui/app/lib/tool-skill-activity-fields.js +1 -1
  412. package/dist/src/web-ui/app/notifications-feature.js +10 -2
  413. package/dist/src/web-ui/app/passive-learning-feature.js +2 -2
  414. package/dist/src/web-ui/app/projects-feature.js +40 -10
  415. package/dist/src/web-ui/app/runtime-onboarding-feature.js +1 -0
  416. package/dist/src/web-ui/app/schedules-feature.js +28 -5
  417. package/dist/src/web-ui/app/services/client-preferences.d.ts +4 -1
  418. package/dist/src/web-ui/app/services/client-preferences.js +2 -0
  419. package/dist/src/web-ui/app/services/conversation-reasoning-preferences.d.ts +11 -0
  420. package/dist/src/web-ui/app/services/conversation-reasoning-preferences.js +30 -0
  421. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +6 -4
  422. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +5 -0
  423. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +21 -0
  424. package/dist/src/web-ui/app/services/runtime-web-client/projects.d.ts +2 -1
  425. package/dist/src/web-ui/app/services/runtime-web-client/projects.js +4 -0
  426. package/dist/src/web-ui/app/services/runtime-web-client/tool-approvals.js +2 -0
  427. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +16 -0
  428. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  429. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +33 -13
  430. package/dist/src/web-ui/app/skills-feature.js +2 -3
  431. package/dist/src/web-ui/app/spark-chat-conversation.js +29 -3
  432. package/dist/src/web-ui/app/spark-chat-feature.js +13 -7
  433. package/dist/src/web-ui/app/styles/01-color-palettes.css +90 -0
  434. package/dist/src/web-ui/app/styles/11-product-links.css +6 -2
  435. package/dist/src/web-ui/app/styles/11-workspace-header-width.css +37 -25
  436. package/dist/src/web-ui/app/styles/12-conversation-sidebar.css +56 -22
  437. package/dist/src/web-ui/app/styles/13-projects.css +56 -19
  438. package/dist/src/web-ui/app/styles/19-runtime-setup.css +16 -0
  439. package/dist/src/web-ui/app/styles/22-reasoning-budget.css +39 -0
  440. package/dist/src/web-ui/app/styles/27-conversation-memory.css +45 -0
  441. package/dist/src/web-ui/app/styles/27-conversation-skills.css +96 -0
  442. package/dist/src/web-ui/app/styles/28-tool-approval-card.css +38 -1
  443. package/dist/src/web-ui/app/styles/35-embedding-profiles.css +159 -0
  444. package/dist/src/web-ui/app/styles/54-spark-chat.css +62 -46
  445. package/dist/src/web-ui/app/styles/65-appearance.css +60 -0
  446. package/dist/src/web-ui/app/styles/66-navigation-display.css +30 -0
  447. package/dist/src/web-ui/app/styles/67-confirmation-dialog.css +32 -0
  448. package/dist/src/web-ui/app/styles.css +8 -0
  449. package/dist/src/web-ui/client-state/preference-shapes.js +6 -1
  450. package/dist/src/web-ui/client-state/preferences.js +8 -2
  451. package/dist/src/web-ui/client-state/reasoning-preference-shape.d.ts +1 -0
  452. package/dist/src/web-ui/client-state/reasoning-preference-shape.js +18 -0
  453. package/dist/src/web-ui/local-runtime/api-router.d.ts +1 -0
  454. package/dist/src/web-ui/local-runtime/api-router.js +11 -0
  455. package/dist/src/web-ui/local-runtime/memory-embedding-connection-input.d.ts +7 -0
  456. package/dist/src/web-ui/local-runtime/memory-embedding-connection-input.js +22 -0
  457. package/dist/src/web-ui/local-runtime/memory-embedding-connection-service.d.ts +20 -0
  458. package/dist/src/web-ui/local-runtime/memory-embedding-connection-service.js +47 -0
  459. package/dist/src/web-ui/local-runtime/memory-onboarding-routes.js +32 -0
  460. package/dist/src/web-ui/local-runtime/model-connection-inspection.d.ts +7 -0
  461. package/dist/src/web-ui/local-runtime/model-connection-inspection.js +48 -0
  462. package/dist/src/web-ui/local-runtime/model-setup-catalog.d.ts +2 -1
  463. package/dist/src/web-ui/local-runtime/model-setup-catalog.js +3 -1
  464. package/dist/src/web-ui/local-runtime/model-setup-identity.js +1 -1
  465. package/dist/src/web-ui/local-runtime/model-setup-input.d.ts +5 -2
  466. package/dist/src/web-ui/local-runtime/model-setup-input.js +29 -6
  467. package/dist/src/web-ui/local-runtime/model-setup-provider.d.ts +1 -1
  468. package/dist/src/web-ui/local-runtime/model-setup-provider.js +9 -6
  469. package/dist/src/web-ui/local-runtime/model-setup-retry.js +4 -1
  470. package/dist/src/web-ui/local-runtime/model-setup-service.d.ts +2 -1
  471. package/dist/src/web-ui/local-runtime/pending-tool-approvals.js +4 -1
  472. package/dist/src/web-ui/local-runtime/project-routes.js +10 -2
  473. package/dist/src/web-ui/local-runtime/request-execution.js +1 -0
  474. package/dist/src/web-ui/local-runtime/runtime-setup-auth.d.ts +2 -0
  475. package/dist/src/web-ui/local-runtime/runtime-setup-auth.js +20 -0
  476. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +3 -2
  477. package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.js +6 -1
  478. package/dist/src/web-ui/local-runtime/runtime-setup-input.d.ts +3 -2
  479. package/dist/src/web-ui/local-runtime/runtime-setup-input.js +17 -5
  480. package/dist/src/web-ui/local-runtime/runtime-setup-provider.d.ts +4 -1
  481. package/dist/src/web-ui/local-runtime/runtime-setup-provider.js +6 -2
  482. package/dist/src/web-ui/local-runtime/runtime-setup-routes.d.ts +11 -2
  483. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +11 -2
  484. package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.js +3 -2
  485. package/dist/src/web-ui/local-runtime/runtime-setup-service.d.ts +25 -4
  486. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +19 -9
  487. package/dist/src/web-ui/local-runtime/setup-embedding-input.d.ts +3 -1
  488. package/dist/src/web-ui/local-runtime/setup-embedding-input.js +38 -6
  489. package/dist/src/web-ui/local-runtime/setup-embedding-llamacpp.d.ts +11 -0
  490. package/dist/src/web-ui/local-runtime/setup-embedding-llamacpp.js +53 -0
  491. package/dist/src/web-ui/local-runtime/setup-embedding-provider.js +23 -9
  492. package/dist/src/web-ui/local-runtime/setup-embedding-routes.d.ts +7 -2
  493. package/dist/src/web-ui/local-runtime/setup-embedding-routes.js +5 -3
  494. package/dist/src/web-ui/local-runtime/setup-embedding-service.d.ts +1 -0
  495. package/docs/configuration.md +10 -8
  496. package/docs/installation.md +11 -5
  497. package/docs/llamacpp.md +248 -0
  498. package/docs/long-term-memory.md +12 -0
  499. package/docs/running-locally.md +7 -1
  500. package/package.json +2 -1
  501. package/plugins/project-orientation/source/index.ts +2 -3
  502. package/plugins/project-orientation/source/inspection-failure.ts +1 -1
  503. package/plugins/project-orientation/source/project-target.ts +29 -0
  504. package/plugins/project-orientation/src/index.cjs +21 -2
  505. package/runtime.config.schema.json +140 -0
  506. package/src/runtime/README.md +50 -4
@@ -0,0 +1,22 @@
1
+ import { parseSetupEmbeddingInput, } from "./setup-embedding-input.js";
2
+ import { RuntimeSetupError } from "./runtime-setup-input.js";
3
+ import { readEmbeddingProfileId } from "../../runtime/long-term-memory/onboarding/embedding-profile-id.js";
4
+ /** Settings keep their existing memory options while sharing provider validation. */
5
+ export function parseMemoryEmbeddingConnectionInput(body) {
6
+ const { profileId, emitClientEvents, ...connection } = body;
7
+ const hasUnsupportedProfileId = profileId !== undefined && typeof profileId !== "string";
8
+ if (hasUnsupportedProfileId)
9
+ throw new RuntimeSetupError("invalid_embedding_profile", "Enter a valid embedding profile ID.");
10
+ const hasUnsupportedMemoryEvents = emitClientEvents !== undefined && typeof emitClientEvents !== "boolean";
11
+ if (hasUnsupportedMemoryEvents)
12
+ throw new RuntimeSetupError("invalid_memory_events", "The memory events choice must be true or false.");
13
+ const input = parseSetupEmbeddingInput(connection);
14
+ const requestedProfileId = profileId?.trim();
15
+ return {
16
+ ...input,
17
+ ...(requestedProfileId
18
+ ? { profileId: readEmbeddingProfileId(requestedProfileId) }
19
+ : {}),
20
+ ...(emitClientEvents === undefined ? {} : { emitClientEvents }),
21
+ };
22
+ }
@@ -0,0 +1,20 @@
1
+ import type { ModelProviderAdapterRegistry } from "../../model-gateway/index.js";
2
+ /** Adds an embedding connection without applying onboarding's plugin policy. */
3
+ export declare class MemoryEmbeddingConnectionService {
4
+ private readonly options;
5
+ constructor(options: {
6
+ rootDir: string;
7
+ getConfigPath: () => string | undefined;
8
+ providerAdapters: ModelProviderAdapterRegistry;
9
+ });
10
+ enable(body: Record<string, unknown>, abortSignal: AbortSignal): Promise<Readonly<{
11
+ status: import("../../runtime/index.js").LongTermMemoryOnboardingStatus;
12
+ restartRequired: boolean;
13
+ configPath: string;
14
+ backupPath?: string;
15
+ probe?: Readonly<{
16
+ modelFingerprint: string;
17
+ dimensions: number;
18
+ }>;
19
+ }>>;
20
+ }
@@ -0,0 +1,47 @@
1
+ import { createLocalLongTermMemoryOnboardingService } from "../../runtime/adapters/long-term-memory/onboarding-service.js";
2
+ import { parseMemoryEmbeddingConnectionInput } from "./memory-embedding-connection-input.js";
3
+ import { prepareSetupEmbeddingProvider, } from "./setup-embedding-provider.js";
4
+ import { SetupEmbeddingFailure } from "./setup-embedding-service.js";
5
+ import { RuntimeSetupError } from "./runtime-setup-input.js";
6
+ /** Adds an embedding connection without applying onboarding's plugin policy. */
7
+ export class MemoryEmbeddingConnectionService {
8
+ options;
9
+ constructor(options) {
10
+ this.options = options;
11
+ }
12
+ async enable(body, abortSignal) {
13
+ const input = parseMemoryEmbeddingConnectionInput(body);
14
+ abortSignal.throwIfAborted();
15
+ const options = {
16
+ rootDir: this.options.rootDir,
17
+ configPath: this.options.getConfigPath(),
18
+ };
19
+ let savedProvider;
20
+ try {
21
+ const prepared = await prepareSetupEmbeddingProvider(options, input);
22
+ savedProvider = prepared.savedProvider;
23
+ abortSignal.throwIfAborted();
24
+ const service = createLocalLongTermMemoryOnboardingService({
25
+ ...options,
26
+ providerAdapters: this.options.providerAdapters,
27
+ });
28
+ const current = await service.status();
29
+ return await service.enable({
30
+ providerId: prepared.providerId,
31
+ model: input.model,
32
+ profileId: input.profileId ?? current.profileId,
33
+ emitClientEvents: input.emitClientEvents ?? current.emitClientEvents,
34
+ abortSignal,
35
+ });
36
+ }
37
+ catch (error) {
38
+ if (error instanceof RuntimeSetupError)
39
+ throw error;
40
+ const providerSaved = savedProvider !== undefined;
41
+ const message = providerSaved
42
+ ? "The provider connection is saved, but the embedding check or memory save failed. Memory settings were not changed. Check the model and try again."
43
+ : "The embedding connection could not be saved. Memory settings were not changed.";
44
+ throw new SetupEmbeddingFailure(providerSaved, 400, message, savedProvider);
45
+ }
46
+ }
47
+ }
@@ -63,6 +63,38 @@ export class LongTermMemoryOnboardingRoutes {
63
63
  sendJson(params.response, 200, { ok: true, ...result });
64
64
  return true;
65
65
  }
66
+ if (params.method === "POST" && params.route === "runtime/memory/profiles") {
67
+ if (!acceptConfigMutationRequest(params.request, params.response))
68
+ return true;
69
+ const result = await withHttpRequestAbortSignal({
70
+ request: params.request,
71
+ response: params.response,
72
+ reason: "memory_profile_save_request_aborted",
73
+ run: (abortSignal) => this.currentService().saveProfile({
74
+ providerId: getString(params.body?.providerId),
75
+ model: getString(params.body?.model),
76
+ label: getString(params.body?.label),
77
+ abortSignal,
78
+ }),
79
+ });
80
+ sendJson(params.response, 200, { ok: true, ...result });
81
+ return true;
82
+ }
83
+ if (params.method === "DELETE" && params.route === "runtime/memory/profiles") {
84
+ if (!acceptConfigMutationRequest(params.request, params.response))
85
+ return true;
86
+ const result = await withHttpRequestAbortSignal({
87
+ request: params.request,
88
+ response: params.response,
89
+ reason: "memory_profile_remove_request_aborted",
90
+ run: (abortSignal) => this.currentService().removeProfile({
91
+ profileId: getString(params.body?.profileId),
92
+ abortSignal,
93
+ }),
94
+ });
95
+ sendJson(params.response, 200, { ok: true, ...result });
96
+ return true;
97
+ }
66
98
  if (params.method === "POST" && params.route === "runtime/memory/disable") {
67
99
  if (!acceptConfigMutationRequest(params.request, params.response))
68
100
  return true;
@@ -0,0 +1,7 @@
1
+ /** Explicit inspection reads metadata only and never saves settings or invokes a model. */
2
+ export declare function inspectModelSetupConnection(options: {
3
+ rootDir: string;
4
+ configPath?: string;
5
+ }, body: Record<string, unknown>, signal: AbortSignal): Promise<{
6
+ models: readonly string[];
7
+ }>;
@@ -0,0 +1,48 @@
1
+ import { parseBaseUrl } from "../../../scripts/runtime-setup-files.js";
2
+ import { inspectLlamaCppConnection } from "../../model-gateway/providers/llamacpp/connection.js";
3
+ import { inspectRuntimeConfigFileWithMeta } from "../../runtime/config/loader.js";
4
+ import { isRecord } from "../../runtime/config/utils.js";
5
+ import { RuntimeSetupError } from "./runtime-setup-input.js";
6
+ import { readRuntimeSetupCredential } from "./runtime-setup-credentials.js";
7
+ function inputText(value) {
8
+ return typeof value === "string" ? value.trim() : "";
9
+ }
10
+ function requiresSafeInspectionCredential(value) {
11
+ if (value.length <= 4096 && !/[\u0000-\u0020\u007f'"`]/u.test(value))
12
+ return;
13
+ throw new RuntimeSetupError("invalid_connection_credential", "The API key contains unsupported characters.");
14
+ }
15
+ /** Explicit inspection reads metadata only and never saves settings or invokes a model. */
16
+ export async function inspectModelSetupConnection(options, body, signal) {
17
+ const source = inspectRuntimeConfigFileWithMeta(options.rootDir, options.configPath);
18
+ const models = isRecord(source.config.models) ? source.config.models : {};
19
+ const providers = isRecord(models.providers) ? models.providers : {};
20
+ const providerId = inputText(body.providerId);
21
+ const configured = providers[providerId || "llamacpp"];
22
+ const saved = isRecord(configured) ? configured : undefined;
23
+ if (providerId && saved?.type !== "llamacpp")
24
+ throw new RuntimeSetupError("unsupported_connection_inspection", "Choose a saved llama.cpp connection.");
25
+ if (!providerId && body.provider !== "llamacpp")
26
+ throw new RuntimeSetupError("unsupported_connection_inspection", "Connection inspection is available for llama.cpp.");
27
+ let baseUrl;
28
+ try {
29
+ baseUrl = parseBaseUrl(inputText(providerId ? saved?.baseUrl : body.baseUrl));
30
+ }
31
+ catch {
32
+ throw new RuntimeSetupError("invalid_connection_address", "Enter an HTTP or HTTPS origin without a path or credentials.");
33
+ }
34
+ const suppliedKey = inputText(body.apiKey);
35
+ requiresSafeInspectionCredential(suppliedKey);
36
+ const canReuseSavedCredential = saved?.type === "llamacpp" && saved.baseUrl === baseUrl;
37
+ const apiKeyEnv = canReuseSavedCredential && typeof saved.apiKeyEnv === "string"
38
+ ? saved.apiKeyEnv : undefined;
39
+ const apiKey = suppliedKey || (apiKeyEnv ? readRuntimeSetupCredential(options.rootDir, apiKeyEnv) : "");
40
+ if (apiKeyEnv && !apiKey)
41
+ throw new RuntimeSetupError("connection_credential_required", "Enter the API key configured for this connection.");
42
+ try {
43
+ return await inspectLlamaCppConnection({ baseUrl, ...(apiKey ? { apiKey } : {}), signal });
44
+ }
45
+ catch {
46
+ throw new RuntimeSetupError("model_connection_unavailable", "Could not inspect this llama.cpp server. Check its address, authentication and whether its model is loaded.", 502);
47
+ }
48
+ }
@@ -6,11 +6,12 @@ export declare function readModelSetupSource(options: ModelSetupOptions): import
6
6
  export declare function modelConfigMap(value: unknown): Record<string, unknown>;
7
7
  export declare function getModelSetupCatalog(options: ModelSetupOptions): Promise<{
8
8
  providers: {
9
+ credentialConfigured: boolean;
10
+ supportsOptionalApiKey?: boolean | undefined;
9
11
  id: string;
10
12
  type: string;
11
13
  label: string;
12
14
  requiresApiKey: boolean;
13
- credentialConfigured: boolean;
14
15
  }[];
15
16
  defaultContextWindowTokens: number;
16
17
  profileIds: string[];
@@ -1,3 +1,4 @@
1
+ import { requiresProviderCredential } from "./runtime-setup-auth.js";
1
2
  import { readDefaultContextWindowTokens } from "../../../scripts/runtime-setup-files.js";
2
3
  import { getConfigDashboardSnapshot } from "../config-dashboard-backend.js";
3
4
  import { inspectRuntimeConfigFileWithMeta } from "../../runtime/config/loader.js";
@@ -21,7 +22,7 @@ export async function getModelSetupCatalog(options) {
21
22
  const providers = await Promise.all(Object.entries(modelConfigMap(models.providers)).map(async ([id, value]) => {
22
23
  const provider = modelConfigMap(value);
23
24
  const type = String(provider.type);
24
- const requiresApiKey = type === "openai";
25
+ const requiresApiKey = requiresProviderCredential(provider);
25
26
  const apiKeyEnv = typeof provider.apiKeyEnv === "string"
26
27
  ? provider.apiKeyEnv
27
28
  : "OPENAI_API_KEY";
@@ -30,6 +31,7 @@ export async function getModelSetupCatalog(options) {
30
31
  type,
31
32
  label: id,
32
33
  requiresApiKey,
34
+ ...(type === "llamacpp" ? { supportsOptionalApiKey: true } : {}),
33
35
  credentialConfigured: requiresApiKey &&
34
36
  (await hasRuntimeSetupCredential(options.rootDir, apiKeyEnv)),
35
37
  };
@@ -3,7 +3,7 @@ import { buildModelConfig, readJsonObject, resolveRuntimePackageRoot, } from "..
3
3
  export async function buildModelSetupProfile(provider, input) {
4
4
  const template = await readJsonObject(join(resolveRuntimePackageRoot(import.meta.dirname), "examples/models/default.config.json"));
5
5
  return {
6
- ...buildModelConfig(template, String(provider.config.type), input.model, input.contextWindowTokens),
6
+ ...buildModelConfig(template, String(provider.config.type), input.model, input.contextWindowTokens, input),
7
7
  provider: provider.id,
8
8
  };
9
9
  }
@@ -1,9 +1,12 @@
1
+ import { type SetupModelOptions } from "../../../scripts/runtime-setup-model-options.js";
1
2
  export type NewModelProvider = Readonly<{
2
3
  id: string;
3
- type: "openai" | "ollama";
4
+ type: "openai" | "ollama" | "llamacpp";
5
+ apiKeyEnv?: string;
6
+ useApiKey?: boolean;
4
7
  baseUrl?: string;
5
8
  }>;
6
- export type ModelSetupInput = Readonly<{
9
+ export type ModelSetupInput = SetupModelOptions & Readonly<{
7
10
  profileId: string;
8
11
  model: string;
9
12
  contextWindowTokens?: number;
@@ -1,5 +1,7 @@
1
1
  import { parseRuntimeModelProfileId } from "../../../scripts/runtime-model-addition.js";
2
2
  import { parseBaseUrl, parseContextWindowTokens, } from "../../../scripts/runtime-setup-files.js";
3
+ import { parseSetupModelOptions } from "../../../scripts/runtime-setup-model-options.js";
4
+ import { supportsProviderAddress, parseProviderCredentialEnvironment } from "../../../scripts/runtime-setup-provider-options.js";
3
5
  import { isRecord } from "../../runtime/config/utils.js";
4
6
  export class ModelSetupError extends Error {
5
7
  code;
@@ -51,14 +53,14 @@ function requirePortableModelProfileId(value) {
51
53
  function readNewProvider(value) {
52
54
  if (!isRecord(value))
53
55
  throw new ModelSetupError("invalid_model_provider", "Choose a configured provider or add a new provider.");
54
- requireAllowedFields(value, ["id", "type", "baseUrl"]);
56
+ requireAllowedFields(value, ["id", "type", "baseUrl", "apiKeyEnv", "useApiKey"]);
55
57
  const id = requireIdentifier(inputString(value, "id"), "provider");
56
58
  const type = inputString(value, "type");
57
- if (type !== "openai" && type !== "ollama")
58
- throw new ModelSetupError("invalid_model_provider", "A new provider must use OpenAI or Ollama.");
59
+ if (type !== "openai" && type !== "ollama" && type !== "llamacpp")
60
+ throw new ModelSetupError("invalid_model_provider", "A new provider must use OpenAI, Ollama or llama.cpp.");
59
61
  const address = inputString(value, "baseUrl", true);
60
- if (address && type !== "ollama")
61
- throw new ModelSetupError("invalid_model_address", "A custom address is available for a new Ollama provider.");
62
+ if (address && !supportsProviderAddress(type))
63
+ throw new ModelSetupError("invalid_model_address", "A custom address is available for a new Ollama or llama.cpp provider.");
62
64
  let baseUrl;
63
65
  try {
64
66
  baseUrl = address ? parseBaseUrl(address) : undefined;
@@ -66,7 +68,18 @@ function readNewProvider(value) {
66
68
  catch {
67
69
  throw new ModelSetupError("invalid_model_address", "Enter an HTTP or HTTPS origin without a path or credentials.");
68
70
  }
69
- return { id, type, ...(baseUrl ? { baseUrl } : {}) };
71
+ if (value.useApiKey !== undefined && (type !== "llamacpp" || typeof value.useApiKey !== "boolean"))
72
+ throw new ModelSetupError("invalid_model_credential", "An optional API key choice is available for llama.cpp.");
73
+ let apiKeyEnv;
74
+ try {
75
+ apiKeyEnv = parseProviderCredentialEnvironment(value.apiKeyEnv);
76
+ }
77
+ catch (error) {
78
+ throw new ModelSetupError("invalid_model_credential", error.message);
79
+ }
80
+ if (apiKeyEnv && type !== "llamacpp")
81
+ throw new ModelSetupError("invalid_model_credential", "A custom key environment is available for llama.cpp.");
82
+ return { id, type, ...(baseUrl ? { baseUrl } : {}), ...(apiKeyEnv ? { apiKeyEnv } : {}), ...(value.useApiKey !== undefined ? { useApiKey: value.useApiKey } : {}) };
70
83
  }
71
84
  function requireModelIdentifier(model) {
72
85
  if (model.length > 256 || /[\u0000-\u0020\u007f]/u.test(model))
@@ -83,10 +96,19 @@ export function parseModelSetupInput(body) {
83
96
  "profileId",
84
97
  "model",
85
98
  "contextWindowTokens",
99
+ "supportsThinking",
100
+ "reasoningBudget",
86
101
  "providerId",
87
102
  "newProvider",
88
103
  "apiKey",
89
104
  ]);
105
+ let modelOptions;
106
+ try {
107
+ modelOptions = parseSetupModelOptions(body);
108
+ }
109
+ catch (error) {
110
+ throw new ModelSetupError("invalid_model_reasoning", error.message);
111
+ }
90
112
  const profileId = requirePortableModelProfileId(inputString(body, "profileId"));
91
113
  let contextWindowTokens;
92
114
  try {
@@ -107,6 +129,7 @@ export function parseModelSetupInput(body) {
107
129
  ? { providerId }
108
130
  : { newProvider: readNewProvider(body.newProvider) };
109
131
  return {
132
+ ...modelOptions,
110
133
  profileId,
111
134
  model,
112
135
  ...(contextWindowTokens !== undefined ? { contextWindowTokens } : {}),
@@ -1,6 +1,6 @@
1
1
  import { type ModelSetupInput, type NewModelProvider } from "./model-setup-input.js";
2
2
  import type { ModelSetupOptions } from "./model-setup-catalog.js";
3
- export declare function buildNewModelProvider(selection: NewModelProvider): {
3
+ export declare function buildNewModelProvider(selection: NewModelProvider, apiKey?: string): {
4
4
  id: string;
5
5
  config: import("../../../scripts/runtime-setup-files.js").JsonObject;
6
6
  };
@@ -1,11 +1,14 @@
1
+ import { requiresProviderCredential } from "./runtime-setup-auth.js";
1
2
  import { RuntimeSetupError } from "./runtime-setup-input.js";
2
3
  import { hasProviderCredentialBinding, isolatedProviderCredentialName, } from "./provider-credential-identity.js";
3
4
  import { buildProviderConfig } from "../../../scripts/runtime-setup-files.js";
4
5
  import { isRecord } from "../../runtime/config/utils.js";
5
6
  import { readRuntimeSetupCredential, assertRuntimeSetupCredentialFile, persistRuntimeSetupCredentials, } from "./runtime-setup-credentials.js";
6
7
  import { ModelSetupError, } from "./model-setup-input.js";
7
- export function buildNewModelProvider(selection) {
8
- const config = buildProviderConfig(selection.type, selection.baseUrl);
8
+ export function buildNewModelProvider(selection, apiKey) {
9
+ const apiKeyEnv = selection.apiKeyEnv ??
10
+ (selection.type === "llamacpp" && (apiKey || selection.useApiKey) ? isolatedProviderCredentialName(selection.id) : undefined);
11
+ const config = buildProviderConfig(selection.type, selection.baseUrl, apiKeyEnv);
9
12
  const needsIsolatedCredentialBinding = selection.type === "openai";
10
13
  if (needsIsolatedCredentialBinding)
11
14
  config.apiKeyEnv = isolatedProviderCredentialName(selection.id);
@@ -23,7 +26,7 @@ export function planModelProvider(providers, input) {
23
26
  const selection = input.newProvider;
24
27
  if (Object.hasOwn(providers, selection.id))
25
28
  throw new ModelSetupError("model_provider_exists", "That provider ID already exists. Choose its saved connection or use another ID.", 409);
26
- const provider = buildNewModelProvider(selection);
29
+ const provider = buildNewModelProvider(selection, input.apiKey);
27
30
  const apiKeyEnv = provider.config.apiKeyEnv;
28
31
  const hasNewProviderCredentialCollision = typeof apiKeyEnv === "string" &&
29
32
  hasProviderCredentialBinding(providers, apiKeyEnv);
@@ -32,10 +35,10 @@ export function planModelProvider(providers, input) {
32
35
  return provider;
33
36
  }
34
37
  export async function prepareModelCredential(options, provider, apiKey) {
35
- const requiresApiKey = provider.type === "openai";
38
+ const requiresApiKey = requiresProviderCredential(provider);
36
39
  if (!requiresApiKey) {
37
40
  if (apiKey)
38
- throw new ModelSetupError("invalid_model_credential", "Only an OpenAI connection accepts an API key here.");
41
+ throw new ModelSetupError("invalid_model_credential", "This connection does not have an API key binding.");
39
42
  return undefined;
40
43
  }
41
44
  const apiKeyEnv = typeof provider.apiKeyEnv === "string"
@@ -46,7 +49,7 @@ export async function prepareModelCredential(options, provider, apiKey) {
46
49
  if (savedKey && apiKey && savedKey !== apiKey)
47
50
  throw new ModelSetupError("credential_already_configured", "That provider already has a saved API key. Its credential was preserved.", 409);
48
51
  if (!savedKey && !apiKey)
49
- throw new ModelSetupError("model_credential_required", "Enter an API key for this OpenAI connection.");
52
+ throw new ModelSetupError("model_credential_required", "Enter an API key for this connection.");
50
53
  return { apiKeyEnv, ...(savedKey ? {} : { apiKey }) };
51
54
  }
52
55
  export async function saveModelCredential(options, credential) {
@@ -12,7 +12,10 @@ function rejectModelProfileCollision() {
12
12
  function committedRetryProvider(providers, input) {
13
13
  if (input.providerId !== undefined)
14
14
  return planModelProvider(providers, input);
15
- return buildNewModelProvider(input.newProvider);
15
+ const saved = modelConfigMap(providers[input.newProvider.id]);
16
+ const apiKeyEnv = input.newProvider.apiKeyEnv ??
17
+ (saved.type === "llamacpp" && typeof saved.apiKeyEnv === "string" ? saved.apiKeyEnv : undefined);
18
+ return buildNewModelProvider({ ...input.newProvider, ...(apiKeyEnv ? { apiKeyEnv } : {}) }, input.apiKey);
16
19
  }
17
20
  async function requireUnchangedRetryConfiguration(options, expectedRevision) {
18
21
  const current = await readConfigFileSnapshot(options.configPath);
@@ -7,11 +7,12 @@ export declare class ModelSetupService {
7
7
  private sourceOptions;
8
8
  catalog(): Promise<{
9
9
  providers: {
10
+ credentialConfigured: boolean;
11
+ supportsOptionalApiKey?: boolean | undefined;
10
12
  id: string;
11
13
  type: string;
12
14
  label: string;
13
15
  requiresApiKey: boolean;
14
- credentialConfigured: boolean;
15
16
  }[];
16
17
  defaultContextWindowTokens: number;
17
18
  profileIds: string[];
@@ -86,7 +86,10 @@ export class PendingToolApprovals {
86
86
  const active = this.activeRequest(decision.requestId);
87
87
  if (!canResolvePendingApproval(pending, active, decision))
88
88
  return false;
89
- pending.resolve({ approved: decision.approved });
89
+ pending.resolve({
90
+ approved: decision.approved,
91
+ ...(decision.reason !== undefined ? { reason: decision.reason } : {}),
92
+ });
90
93
  return true;
91
94
  }
92
95
  resolveRealtime(message) {
@@ -13,8 +13,11 @@ function isProjectSessionCreation(segments) {
13
13
  return false;
14
14
  return segments[2] === "sessions";
15
15
  }
16
+ function isProjectDeletion(segments) {
17
+ return segments.length === 2;
18
+ }
16
19
  function isProjectMutationRequest(method) {
17
- return method === "POST";
20
+ return ["POST", "DELETE"].includes(method);
18
21
  }
19
22
  function acceptProjectRequest(request) {
20
23
  if (!isProjectMutationRequest(request.method))
@@ -64,7 +67,12 @@ export class ProjectRoutes {
64
67
  async dispatch(request, service) {
65
68
  const { method, segments, body, response } = request;
66
69
  if (method === "GET" && isProjectCollection(segments)) {
67
- sendJson(response, 200, { ok: true, projects: await service.list() });
70
+ sendJson(response, 200, { ok: true, ...(await service.catalog()) });
71
+ return;
72
+ }
73
+ if (method === "DELETE" && isProjectDeletion(segments)) {
74
+ await service.delete(segments[1]);
75
+ sendJson(response, 200, { ok: true });
68
76
  return;
69
77
  }
70
78
  if (method === "POST" && isProjectCollection(segments)) {
@@ -101,6 +101,7 @@ export class LocalRequestExecution {
101
101
  text,
102
102
  agentMode: body.agentMode,
103
103
  modelPreference: body.modelPreference,
104
+ reasoningPreference: body.reasoningPreference,
104
105
  toolPermissionMode: body.toolPermissionMode,
105
106
  attachments: Array.isArray(body.attachments) ? body.attachments : [],
106
107
  };
@@ -0,0 +1,2 @@
1
+ export declare function resolveRuntimeSetupCredentialEnvironment(provider: string, savedProvider: unknown, apiKey?: string): string | undefined;
2
+ export declare function requiresProviderCredential(provider: unknown): boolean;
@@ -0,0 +1,20 @@
1
+ import { isolatedProviderCredentialName } from "./provider-credential-identity.js";
2
+ import { isRecord } from "../../runtime/config/utils.js";
3
+ export function resolveRuntimeSetupCredentialEnvironment(provider, savedProvider, apiKey) {
4
+ if (provider === "ollama")
5
+ return undefined;
6
+ if (isRecord(savedProvider) && typeof savedProvider.apiKeyEnv === "string")
7
+ return savedProvider.apiKeyEnv;
8
+ if (provider === "openai")
9
+ return "OPENAI_API_KEY";
10
+ if (provider === "llamacpp" && apiKey)
11
+ return isolatedProviderCredentialName(provider);
12
+ return undefined;
13
+ }
14
+ export function requiresProviderCredential(provider) {
15
+ if (!isRecord(provider))
16
+ return false;
17
+ if (provider.type === "openai")
18
+ return true;
19
+ return provider.type === "llamacpp" && typeof provider.apiKeyEnv === "string";
20
+ }
@@ -1,3 +1,4 @@
1
+ import { resolveRuntimeSetupCredentialEnvironment } from "./runtime-setup-auth.js";
1
2
  import { commitRuntimeSetupEdit } from "./runtime-setup-edit-transaction.js";
2
3
  import { withPlannedRuntimeSetupCredentials, } from "./runtime-setup-credentials.js";
3
4
  import { randomUUID } from "node:crypto";
@@ -32,7 +33,7 @@ export async function editRuntimeSetupConnection(params) {
32
33
  const models = setupConfigMap(source.config.models);
33
34
  const providers = setupConfigMap(models.providers);
34
35
  const providerId = params.input.provider;
35
- const provider = buildProviderConfig(providerId, params.input.baseUrl);
36
+ const provider = buildProviderConfig(providerId, params.input.baseUrl, resolveRuntimeSetupCredentialEnvironment(providerId, providers[providerId], params.input.apiKey));
36
37
  const existing = providers[providerId];
37
38
  const owned = Object.hasOwn(params.draft.ownedProviders, providerId);
38
39
  preserveExistingProvider(existing, provider, owned);
@@ -48,7 +49,7 @@ export async function editRuntimeSetupConnection(params) {
48
49
  params.draft.modelConfig.contextWindowTokens;
49
50
  const modelConfig = buildModelConfig(modelTemplate, providerId, params.input.model, typeof contextWindowTokens === "number"
50
51
  ? contextWindowTokens
51
- : undefined);
52
+ : undefined, params.input);
52
53
  const memory = setupConfigMap(source.config.longTermMemory);
53
54
  const retained = retainSetupConnectionProviders({
54
55
  providers,
@@ -1,3 +1,4 @@
1
+ import { isDeepStrictEqual } from "node:util";
1
2
  import { readRuntimeSetupCredential } from "./runtime-setup-credentials.js";
2
3
  /** A revisionless retry can fill a missing credential, never edit its connection. */
3
4
  export function canCompleteMissingRuntimeSetupCredential(existing, input, rootDir) {
@@ -5,7 +6,7 @@ export function canCompleteMissingRuntimeSetupCredential(existing, input, rootDi
5
6
  return false;
6
7
  if (input.connectionRevision !== undefined)
7
8
  return false;
8
- if (existing.provider !== "openai")
9
+ if (!existing.requiresApiKey)
9
10
  return false;
10
11
  if (input.provider !== existing.provider)
11
12
  return false;
@@ -14,6 +15,10 @@ export function canCompleteMissingRuntimeSetupCredential(existing, input, rootDi
14
15
  const requestedContext = input.contextWindowTokens ?? existing.contextWindowTokens;
15
16
  if (requestedContext !== existing.contextWindowTokens)
16
17
  return false;
18
+ if (input.supportsThinking !== undefined && input.supportsThinking !== existing.supportsThinking)
19
+ return false;
20
+ if (input.reasoningBudget !== undefined && !isDeepStrictEqual(input.reasoningBudget, existing.reasoningBudget))
21
+ return false;
17
22
  // Both projections already normalize addresses to origins.
18
23
  if ((existing.baseUrl ?? "") !== (input.baseUrl ?? ""))
19
24
  return false;
@@ -1,10 +1,11 @@
1
+ import { type SetupModelOptions } from "../../../scripts/runtime-setup-model-options.js";
1
2
  export declare class RuntimeSetupError extends Error {
2
3
  readonly code: string;
3
4
  readonly statusCode: number;
4
5
  constructor(code: string, message: string, statusCode?: number);
5
6
  }
6
- export type RuntimeSetupInput = Readonly<{
7
- provider: "openai" | "ollama";
7
+ export type RuntimeSetupInput = SetupModelOptions & Readonly<{
8
+ provider: "openai" | "ollama" | "llamacpp";
8
9
  model: string;
9
10
  contextWindowTokens?: number;
10
11
  baseUrl?: string;
@@ -1,4 +1,6 @@
1
1
  import { parseBaseUrl, parseContextWindowTokens, } from "../../../scripts/runtime-setup-files.js";
2
+ import { parseSetupModelOptions } from "../../../scripts/runtime-setup-model-options.js";
3
+ import { defaultProviderAddress, supportsProviderAddress } from "../../../scripts/runtime-setup-provider-options.js";
2
4
  export class RuntimeSetupError extends Error {
3
5
  code;
4
6
  statusCode;
@@ -42,10 +44,19 @@ export function parseRuntimeSetupInput(body) {
42
44
  catch {
43
45
  throw new RuntimeSetupError("invalid_context_window", "Context window must be a positive whole number of tokens.");
44
46
  }
47
+ let modelOptions;
48
+ try {
49
+ modelOptions = parseSetupModelOptions(body ?? {});
50
+ }
51
+ catch (error) {
52
+ throw new RuntimeSetupError("invalid_setup_reasoning", error.message);
53
+ }
45
54
  const provider = readSetupString(body?.provider);
46
- if (provider !== "openai" && provider !== "ollama") {
47
- throw new RuntimeSetupError("invalid_setup_provider", "Choose OpenAI or Ollama.");
55
+ if (provider !== "openai" && provider !== "ollama" && provider !== "llamacpp") {
56
+ throw new RuntimeSetupError("invalid_setup_provider", "Choose OpenAI, Ollama or llama.cpp.");
48
57
  }
58
+ if (modelOptions.reasoningBudget && provider !== "llamacpp")
59
+ throw new RuntimeSetupError("invalid_setup_reasoning", "A token reasoning budget requires llama.cpp.");
49
60
  const model = readSetupString(body?.model);
50
61
  if (!isUsableModelIdentifier(model)) {
51
62
  throw new RuntimeSetupError("invalid_setup_model", "Enter a model ID without spaces or control characters.");
@@ -59,18 +70,19 @@ export function parseRuntimeSetupInput(body) {
59
70
  }
60
71
  const requestedBaseUrl = readSetupString(body?.baseUrl);
61
72
  if (provider === "openai" && requestedBaseUrl) {
62
- throw new RuntimeSetupError("unexpected_setup_base_url", "A custom address is available for Ollama.");
73
+ throw new RuntimeSetupError("unexpected_setup_base_url", "A custom address is available for Ollama or llama.cpp.");
63
74
  }
64
75
  let baseUrl;
65
- if (provider === "ollama") {
76
+ if (supportsProviderAddress(provider)) {
66
77
  try {
67
- baseUrl = parseBaseUrl(requestedBaseUrl || "http://127.0.0.1:11434");
78
+ baseUrl = parseBaseUrl(requestedBaseUrl || defaultProviderAddress(provider));
68
79
  }
69
80
  catch {
70
81
  throw new RuntimeSetupError("invalid_setup_base_url", "Enter an HTTP or HTTPS origin without a path or credentials.");
71
82
  }
72
83
  }
73
84
  return {
85
+ ...modelOptions,
74
86
  provider,
75
87
  model,
76
88
  ...(contextWindowTokens !== undefined ? { contextWindowTokens } : {}),
@@ -5,7 +5,10 @@ export declare function configuredSetupModel(source: InspectedRuntimeConfigFile)
5
5
  provider: string;
6
6
  model: string;
7
7
  contextWindowTokens: number | undefined;
8
- apiKeyEnv: string;
8
+ supportsThinking: boolean | undefined;
9
+ reasoningBudget: import("../../shared/model-reasoning.js").ModelReasoningBudget | undefined;
10
+ requiresApiKey: boolean;
11
+ apiKeyEnv: string | undefined;
9
12
  baseUrl: string | undefined;
10
13
  } | undefined;
11
14
  export declare function requiresConfiguredCredential(source: InspectedRuntimeConfigFile, rootDir: string): boolean;