@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,54 @@
1
+ export function embeddingProviderOptions(providers) {
2
+ const choices = providers.map((provider) => ({
3
+ id: provider.id,
4
+ label: `${provider.id} · ${provider.type}`,
5
+ }));
6
+ const labels = { openai: "OpenAI", ollama: "Ollama", llamacpp: "llama.cpp" };
7
+ for (const type of Object.keys(labels)) {
8
+ if (
9
+ type !== "llamacpp" &&
10
+ providers.some((provider) => provider.type === type)
11
+ )
12
+ continue;
13
+ choices.push({
14
+ id: `new:${type}`,
15
+ label: `${labels[type]} · new connection`,
16
+ });
17
+ }
18
+ return choices;
19
+ }
20
+
21
+ export function isNewEmbeddingProviderChoice(choice, providers) {
22
+ return embeddingProviderOptions(providers).some(
23
+ (option) => option.id === choice && choice.startsWith("new:"),
24
+ );
25
+ }
26
+
27
+ export function suggestEmbeddingConnectionId(providers) {
28
+ const occupied = new Set(providers.map((provider) => provider.id));
29
+ let id = "llamacpp-embedding";
30
+ for (let suffix = 2; occupied.has(id); suffix += 1)
31
+ id = `llamacpp-embedding-${suffix}`;
32
+ return id;
33
+ }
34
+
35
+ export function isValidEmbeddingConnectionId(id) {
36
+ return (
37
+ typeof id === "string" &&
38
+ id.length <= 128 &&
39
+ /^[A-Za-z][A-Za-z0-9._-]*$/.test(id) &&
40
+ !["__proto__", "prototype", "constructor"].includes(id)
41
+ );
42
+ }
43
+
44
+ export function embeddingProviderHasAddress(type) {
45
+ return type === "ollama" || type === "llamacpp";
46
+ }
47
+
48
+ export function embeddingProviderAcceptsCredential(type, provider) {
49
+ if (type === "openai") return true;
50
+ if (type !== "llamacpp") return false;
51
+ if (!provider) return true;
52
+ if (provider.credentialConfigured === true) return true;
53
+ return provider.requiresApiKey !== false;
54
+ }
@@ -8,6 +8,7 @@ function isSavedEmbeddingProviderReceipt(payload, selection) {
8
8
  if (typeof receipt.type !== "string" || !receipt.type.trim()) return false;
9
9
  if (receipt.type !== selection.type) return false;
10
10
  if (selection.providerId) return receipt.id === selection.providerId;
11
+ if (selection.newProviderId) return receipt.id === selection.newProviderId;
11
12
  return true;
12
13
  }
13
14
 
@@ -20,6 +21,8 @@ export function applySavedEmbeddingProviderReceipt(state, payload, selection) {
20
21
  typeof payload.savedProvider.credentialConfigured === "boolean";
21
22
  if (hasCredentialStatus)
22
23
  receipt.credentialConfigured = payload.savedProvider.credentialConfigured;
24
+ if (typeof payload.savedProvider.requiresApiKey === "boolean")
25
+ receipt.requiresApiKey = payload.savedProvider.requiresApiKey;
23
26
  const existing = state.providers.find((provider) => provider.id === id);
24
27
  const providers = state.providers.map((provider) =>
25
28
  provider.id === id ? { ...provider, ...receipt } : provider,
@@ -1,3 +1,8 @@
1
+ import {
2
+ embeddingProviderOptions,
3
+ embeddingProviderHasAddress,
4
+ embeddingProviderAcceptsCredential,
5
+ } from "./embedding-provider-options.js";
1
6
  import { escapeAttribute, escapeHtml } from "../../lib/text-format.js";
2
7
 
3
8
  function field(
@@ -11,16 +16,23 @@ function field(
11
16
  return `<label class="runtime-setup-field"><span>${label}</span><input data-runtime-setup-field="${field}" type="${type}" value="${escapeAttribute(value)}" placeholder="${escapeAttribute(placeholder)}" autocomplete="${type === "password" ? "new-password" : "off"}" spellcheck="false" ${field === "embedding-model" ? 'list="runtimeEmbeddingModels"' : ""} />${help ? `<small>${help}</small>` : ""}</label>`;
12
17
  }
13
18
 
14
- function renderEmbeddingCredential(provider) {
19
+ function renderEmbeddingCredential(provider, providerType) {
15
20
  const credentialConfigured = provider?.credentialConfigured === true;
21
+ let help =
22
+ "Saved privately on the ABot server. Leave blank to keep a configured key.";
23
+ if (providerType === "llamacpp" && !provider)
24
+ help =
25
+ "Optional for a server without authentication. Saved privately on the ABot server.";
26
+ if (credentialConfigured)
27
+ help = "API key already saved. Leave blank to use it.";
16
28
  return field(
17
29
  "embedding-key",
18
- "API key (optional if already saved)",
30
+ providerType === "llamacpp" && !provider
31
+ ? "API key (optional)"
32
+ : "API key (optional if already saved)",
19
33
  "",
20
34
  "password",
21
- credentialConfigured
22
- ? "API key already saved. Leave blank to use it."
23
- : "Saved privately on the ABot server. Leave blank to keep a configured key.",
35
+ help,
24
36
  credentialConfigured ? "••••••••" : "",
25
37
  );
26
38
  }
@@ -28,28 +40,16 @@ function renderEmbeddingCredential(provider) {
28
40
  export function renderEmbeddingSetup(state, providerType, configuredProvider) {
29
41
  if (!state.loaded)
30
42
  return `<p class="runtime-setup-feedback" role="${state.error ? "alert" : "status"}">${escapeHtml(state.error || "Loading embedding options…")}</p>${state.error ? '<button type="button" class="runtime-setup-inline-action" data-runtime-setup-action="embedding-reload">Try again</button>' : ""}`;
31
- const providers = [
32
- ...state.providers.map((provider) => ({
33
- id: provider.id,
34
- label: `${provider.id} · ${provider.type}`,
35
- })),
36
- ...["openai", "ollama"]
37
- .filter(
38
- (type) => !state.providers.some((provider) => provider.type === type),
39
- )
40
- .map((type) => ({
41
- id: `new:${type}`,
42
- label: `${type === "openai" ? "OpenAI" : "Ollama"} · new connection`,
43
- })),
44
- ];
43
+ const providers = embeddingProviderOptions(state.providers);
45
44
  return `<div class="runtime-embedding-fields">
46
45
  ${state.status?.enabled ? '<p class="runtime-setup-feedback">Memory is already configured. You can keep it or test and save changes.</p>' : ""}
47
46
  <label class="runtime-setup-field"><span>Embedding provider</span><select data-runtime-setup-field="embedding-provider">${providers.map((provider) => `<option value="${escapeAttribute(provider.id)}" ${state.provider === provider.id ? "selected" : ""}>${escapeHtml(provider.label)}</option>`).join("")}</select></label>
47
+ ${providerType === "llamacpp" && !configuredProvider ? field("embedding-connection-id", "Connection ID", state.newProviderId, "text", "A separate connection keeps your chat server settings unchanged.") : ""}
48
48
  ${field("embedding-model", "Embedding model ID", state.model, "text", "Choose a model that supports embeddings. ABot will not install or select one for you.")}
49
49
  <datalist id="runtimeEmbeddingModels">${state.models.map((model) => `<option value="${escapeAttribute(model)}"></option>`).join("")}</datalist>
50
- ${providerType === "openai" ? renderEmbeddingCredential(configuredProvider) : ""}
51
- ${providerType === "ollama" && !configuredProvider ? field("embedding-url", "Ollama address", state.baseUrl, "url", "Use the address reachable from the computer running ABot.") : ""}
52
- ${configuredProvider ? '<button type="button" class="runtime-setup-inline-action" data-runtime-setup-action="embedding-discover"><svg aria-hidden="true" viewBox="0 0 24 24"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 4.5 4.5"/></svg><span>Discover models</span></button>' : ""}
50
+ ${embeddingProviderAcceptsCredential(providerType, configuredProvider) ? renderEmbeddingCredential(configuredProvider, providerType) : ""}
51
+ ${embeddingProviderHasAddress(providerType) && !configuredProvider ? field("embedding-url", providerType === "llamacpp" ? "llama.cpp address" : "Ollama address", state.baseUrl, "url", "Use the address reachable from the computer running ABot.") : ""}
52
+ ${configuredProvider && providerType !== "llamacpp" ? '<button type="button" class="runtime-setup-inline-action" data-runtime-setup-action="embedding-discover"><svg aria-hidden="true" viewBox="0 0 24 24"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 4.5 4.5"/></svg><span>Discover models</span></button>' : ""}
53
53
  <p class="runtime-setup-feedback">Test and save sends one embedding request to your provider. You can also configure this later in Settings.</p>
54
54
  ${state.error ? `<p class="runtime-setup-feedback error" role="alert">${escapeHtml(state.error)}</p>` : state.message ? `<p class="runtime-setup-feedback" role="status">${escapeHtml(state.message)}</p>` : ""}
55
55
  ${state.busy ? '<p class="runtime-setup-feedback" role="status">Checking embedding settings…</p>' : ""}
@@ -1,8 +1,16 @@
1
+ import {
2
+ embeddingProviderAcceptsCredential,
3
+ embeddingProviderHasAddress,
4
+ isNewEmbeddingProviderChoice,
5
+ isValidEmbeddingConnectionId,
6
+ suggestEmbeddingConnectionId,
7
+ } from "./embedding-provider-options.js";
1
8
  import { applySavedEmbeddingProviderReceipt } from "./embedding-provider-receipt.js";
2
9
  import { textOf } from "../../lib/text-format.js";
3
10
  import { renderEmbeddingSetup } from "./embedding-rendering.js";
4
11
  import {
5
12
  DEFAULT_OLLAMA_BASE_URL,
13
+ defaultSetupProviderAddress,
6
14
  validateRuntimeSetupBaseUrl,
7
15
  validateRuntimeSetupModelId,
8
16
  } from "./validation.js";
@@ -22,6 +30,8 @@ export function createEmbeddingSetupStep({
22
30
  providers: [],
23
31
  provider: "",
24
32
  model: "",
33
+ newProviderId: "",
34
+ useApiKey: false,
25
35
  baseUrl: DEFAULT_OLLAMA_BASE_URL,
26
36
  models: [],
27
37
  busy: false,
@@ -60,6 +70,8 @@ export function createEmbeddingSetupStep({
60
70
  providers: [],
61
71
  provider: "",
62
72
  model: "",
73
+ newProviderId: "",
74
+ useApiKey: false,
63
75
  baseUrl: DEFAULT_OLLAMA_BASE_URL,
64
76
  models: [],
65
77
  busy: false,
@@ -70,28 +82,22 @@ export function createEmbeddingSetupStep({
70
82
  }
71
83
 
72
84
  function invalidateConnection() {
73
- const { provider, model, baseUrl } = state;
85
+ const { provider, model, baseUrl, newProviderId, useApiKey } = state;
74
86
  const connectionProviderChanged =
75
87
  loadedConnectionProvider !== getPreferredProvider();
76
88
  reset();
77
89
  preferConnectionProvider = connectionProviderChanged;
78
90
  state.baseUrl = baseUrl;
79
91
  if (connectionProviderChanged) return;
80
- Object.assign(state, { provider, model });
92
+ Object.assign(state, { provider, model, newProviderId, useApiKey });
81
93
  }
82
94
 
83
95
  function retainedEmbeddingProvider() {
84
96
  const configured = selectedProvider();
85
97
  if (configured) return configured.id;
86
- const isNewProviderChoice = ["new:openai", "new:ollama"].includes(
87
- state.provider,
88
- );
89
- if (!isNewProviderChoice) return "";
90
- const hasConfiguredType = state.providers.some(
91
- (provider) => provider.type === state.provider.slice(4),
92
- );
93
- if (hasConfiguredType) return "";
94
- return state.provider;
98
+ return isNewEmbeddingProviderChoice(state.provider, state.providers)
99
+ ? state.provider
100
+ : "";
95
101
  }
96
102
 
97
103
  function initialEmbeddingProvider(connectionProvider) {
@@ -164,7 +170,12 @@ export function createEmbeddingSetupStep({
164
170
  }
165
171
 
166
172
  async function discover() {
167
- if (state.busy || !selectedProvider()) return;
173
+ if (
174
+ state.busy ||
175
+ !selectedProvider() ||
176
+ selectedProviderType() === "llamacpp"
177
+ )
178
+ return;
168
179
  await run(
169
180
  () => discoverModels(state.provider),
170
181
  (payload) => {
@@ -181,7 +192,13 @@ export function createEmbeddingSetupStep({
181
192
  }
182
193
 
183
194
  function apiKeyValue() {
184
- if (selectedProviderType() !== "openai") return "";
195
+ if (
196
+ !embeddingProviderAcceptsCredential(
197
+ selectedProviderType(),
198
+ selectedProvider(),
199
+ )
200
+ )
201
+ return "";
185
202
  return textOf(
186
203
  container.querySelector('[data-runtime-setup-field="embedding-key"]')
187
204
  ?.value,
@@ -207,7 +224,10 @@ export function createEmbeddingSetupStep({
207
224
  const input = selectedProvider()
208
225
  ? { providerId: state.provider, model: model.value }
209
226
  : { provider: selectedProviderType(), model: model.value };
210
- if (!selectedProvider() && selectedProviderType() === "ollama") {
227
+ if (
228
+ !selectedProvider() &&
229
+ embeddingProviderHasAddress(selectedProviderType())
230
+ ) {
211
231
  const address = validateRuntimeSetupBaseUrl(state.baseUrl);
212
232
  if (!address.valid) {
213
233
  state.error = address.message;
@@ -216,10 +236,22 @@ export function createEmbeddingSetupStep({
216
236
  }
217
237
  input.baseUrl = address.value;
218
238
  }
219
- if (selectedProviderType() === "openai" && apiKey) input.apiKey = apiKey;
239
+ if (state.provider === "new:llamacpp") {
240
+ if (!isValidEmbeddingConnectionId(state.newProviderId)) {
241
+ state.error =
242
+ "Enter a connection ID starting with a letter, using letters, numbers, dots, underscores or hyphens.";
243
+ onChange();
244
+ return;
245
+ }
246
+ state.useApiKey = state.useApiKey || Boolean(apiKey);
247
+ input.newProviderId = state.newProviderId;
248
+ input.useApiKey = state.useApiKey;
249
+ }
250
+ if (apiKey) input.apiKey = apiKey;
220
251
  const providerSelection = {
221
252
  type: selectedProviderType(),
222
253
  providerId: input.providerId,
254
+ newProviderId: input.newProviderId,
223
255
  };
224
256
  let saved = false;
225
257
  try {
@@ -247,7 +279,14 @@ export function createEmbeddingSetupStep({
247
279
  function input(field, value) {
248
280
  if (state.busy) return;
249
281
  if (field === "embedding-model") state.model = value;
250
- if (field === "embedding-url") state.baseUrl = value;
282
+ if (field === "embedding-url") {
283
+ if (state.baseUrl !== value) state.useApiKey = false;
284
+ state.baseUrl = value;
285
+ }
286
+ if (field === "embedding-connection-id") {
287
+ if (state.newProviderId !== value) state.useApiKey = false;
288
+ state.newProviderId = value;
289
+ }
251
290
  const action = container.querySelector(
252
291
  '.runtime-setup-action[type="submit"]',
253
292
  );
@@ -258,6 +297,11 @@ export function createEmbeddingSetupStep({
258
297
  if (state.busy || field !== "embedding-provider") return;
259
298
  clearSecret();
260
299
  state.provider = value;
300
+ state.useApiKey = false;
301
+ if (value.startsWith("new:"))
302
+ state.baseUrl = defaultSetupProviderAddress(selectedProviderType());
303
+ if (value === "new:llamacpp")
304
+ state.newProviderId = suggestEmbeddingConnectionId(state.providers);
261
305
  state.models = [];
262
306
  state.message = "";
263
307
  state.error = "";
@@ -0,0 +1,17 @@
1
+ import type { ModelReasoningBudget } from "../../../../shared/model-reasoning.js";
2
+ export type SetupReasoningState = {
3
+ provider?: string;
4
+ providerType?: string;
5
+ supportsThinking?: boolean;
6
+ reasoningBudgetMode?: string;
7
+ reasoningBudgetTokens?: string;
8
+ };
9
+ export declare function setupReasoningState(model?: { supportsThinking?: boolean; reasoningBudget?: ModelReasoningBudget }): SetupReasoningState;
10
+ export declare function updateSetupReasoningField(state: SetupReasoningState, field: string, value: string | boolean): boolean;
11
+ export declare function renderSetupReasoningFields(state: SetupReasoningState, readonly?: boolean): string;
12
+ export declare function validateSetupReasoningFields(state: SetupReasoningState): {
13
+ valid: boolean;
14
+ input?: { supportsThinking?: boolean; reasoningBudget?: ModelReasoningBudget };
15
+ field?: string;
16
+ message?: string;
17
+ };
@@ -0,0 +1,54 @@
1
+ import { escapeAttribute } from "../../lib/text-format.js";
2
+
3
+ export function setupReasoningState(model = {}) {
4
+ return {
5
+ supportsThinking: model.supportsThinking,
6
+ reasoningBudgetMode: model.reasoningBudget?.mode || "inherit",
7
+ reasoningBudgetTokens: model.reasoningBudget?.tokens?.toString() || "",
8
+ };
9
+ }
10
+
11
+ export function updateSetupReasoningField(state, field, value) {
12
+ if (field === "supports-thinking") state.supportsThinking = value === true;
13
+ if (field === "reasoning-budget-mode") state.reasoningBudgetMode = value;
14
+ if (field === "reasoning-budget-tokens") state.reasoningBudgetTokens = value;
15
+ return ["supports-thinking", "reasoning-budget-mode"].includes(field);
16
+ }
17
+
18
+ export function renderSetupReasoningFields(state, readonly = false) {
19
+ const hasTokenBudget = (state.providerType || state.provider) === "llamacpp";
20
+ const disabled = readonly ? "disabled" : "";
21
+ const mode = state.reasoningBudgetMode || "inherit";
22
+ const supportsThinking = state.supportsThinking === true;
23
+ return `<label class="runtime-setup-field runtime-setup-reasoning-toggle"><span class="runtime-setup-reasoning-toggle-label"><input type="checkbox" data-runtime-setup-field="supports-thinking" ${supportsThinking ? "checked" : ""} ${disabled} /> This model supports thinking</span><small>Enable only for a model and chat template that support reasoning. Connection readiness does not verify this.</small></label>
24
+ ${supportsThinking && hasTokenBudget ? `<label class="runtime-setup-field"><span>Default thinking budget</span><select data-runtime-setup-field="reasoning-budget-mode" ${disabled}>
25
+ <option value="inherit" ${mode === "inherit" ? "selected" : ""}>Inherit (no override)</option>
26
+ <option value="server-default" ${mode === "server-default" ? "selected" : ""}>Server default</option>
27
+ <option value="tokens" ${mode === "tokens" ? "selected" : ""}>Token limit</option>
28
+ </select><small>Applies to each reasoning segment. It is not a time limit or a total request budget.</small></label>
29
+ ${mode === "tokens" ? `<label class="runtime-setup-field"><span>Thinking tokens</span><input type="number" min="0" max="2147483647" step="1" data-runtime-setup-field="reasoning-budget-tokens" value="${escapeAttribute(state.reasoningBudgetTokens ?? "")}" ${disabled} required /><small>Zero disables thinking. The server forces the reasoning segment to close at a positive limit; the answer still needs output capacity.</small></label>` : ""}` : ""}`;
30
+ }
31
+
32
+ function isSetupReasoningTokenBudget(state, mode, tokens) {
33
+ if (mode !== "tokens") return false;
34
+ if (String(state.reasoningBudgetTokens ?? "").trim() === "") return false;
35
+ if (!Number.isSafeInteger(tokens)) return false;
36
+ if (tokens < 0) return false;
37
+ return tokens <= 2147483647;
38
+ }
39
+
40
+ export function validateSetupReasoningFields(state) {
41
+ if (state.providerType !== "llamacpp")
42
+ return { valid: true, input: state.supportsThinking === undefined ? {} : { supportsThinking: state.supportsThinking === true } };
43
+ const supportsThinking = state.supportsThinking === true;
44
+ const input = { supportsThinking };
45
+ if (!supportsThinking) return { valid: true, input };
46
+ const mode = state.reasoningBudgetMode || "inherit";
47
+ if (mode === "inherit") return { valid: true, input };
48
+ if (mode === "server-default")
49
+ return { valid: true, input: { ...input, reasoningBudget: { mode } } };
50
+ const tokens = Number(state.reasoningBudgetTokens);
51
+ if (!isSetupReasoningTokenBudget(state, mode, tokens))
52
+ return { valid: false, field: "reasoning-budget-tokens", message: "Enter a whole number of thinking tokens from 0 to 2147483647; 0 disables thinking." };
53
+ return { valid: true, input: { ...input, reasoningBudget: { mode, tokens } } };
54
+ }
@@ -1,10 +1,14 @@
1
1
  import { textOf } from "../../lib/text-format.js";
2
2
 
3
- const PROVIDERS = new Set(["ollama", "openai"]);
3
+ const PROVIDERS = new Set(["ollama", "openai", "llamacpp"]);
4
4
  const SAFE_MODEL_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_@+.:/=-]*$/;
5
5
  const SAFE_ORIGIN_HOST_PATTERN =
6
6
  /^(?:\[[0-9A-Fa-f:.]+\]|[A-Za-z0-9._-]+)(?::[0-9]+)?$/;
7
7
  export const DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434";
8
+ export const DEFAULT_LLAMACPP_BASE_URL = "http://127.0.0.1:8080";
9
+ export function defaultSetupProviderAddress(provider) {
10
+ return provider === "llamacpp" ? DEFAULT_LLAMACPP_BASE_URL : DEFAULT_OLLAMA_BASE_URL;
11
+ }
8
12
 
9
13
  export function normalizeProvider(value) {
10
14
  const provider = textOf(value).trim().toLowerCase();
@@ -1,3 +1,4 @@
1
+ import type { ModelReasoningBudget } from "../../../shared/model-reasoning.js";
1
2
  import type { SetupEmbeddingInput } from "../../local-runtime/setup-embedding-input.js";
2
3
 
3
4
  export type RuntimeSetupValidation = Readonly<{
@@ -12,7 +13,7 @@ export type RuntimeSetupCommands = Readonly<{
12
13
  "web-ui": string;
13
14
  }>;
14
15
  export type RuntimeSetupProvider = Readonly<{
15
- id: "openai" | "ollama";
16
+ id: "openai" | "ollama" | "llamacpp";
16
17
  label: string;
17
18
  requiresApiKey: boolean;
18
19
  credentialConfigured: boolean;
@@ -26,16 +27,20 @@ export type RuntimeSetupSnapshot = Readonly<{
26
27
  defaultContextWindowTokens: number;
27
28
  editableConnection?: { revision: string };
28
29
  existingModel?: {
29
- provider: "openai" | "ollama";
30
+ provider: "openai" | "ollama" | "llamacpp";
30
31
  model: string;
31
32
  contextWindowTokens?: number;
33
+ supportsThinking?: boolean;
34
+ reasoningBudget?: ModelReasoningBudget;
32
35
  baseUrl?: string;
33
36
  };
34
37
  }>;
35
38
  export type RuntimeSetupInput = {
36
- provider: "openai" | "ollama";
39
+ provider: "openai" | "ollama" | "llamacpp";
37
40
  model: string;
38
41
  contextWindowTokens?: number;
42
+ supportsThinking?: boolean;
43
+ reasoningBudget?: ModelReasoningBudget;
39
44
  baseUrl?: string;
40
45
  apiKey?: string;
41
46
  deferActivation?: boolean;
@@ -49,6 +54,7 @@ export type RuntimeSetupResponse = {
49
54
  export interface RuntimeSetupGuideDependencies {
50
55
  readonly container: HTMLElement;
51
56
  readonly conversationRegion: HTMLElement;
57
+ readonly inspectConnection?: (input: Record<string, unknown>) => Promise<{ connection: { models: readonly string[] } }>;
52
58
  readonly loadSetup: () => Promise<{ setup: RuntimeSetupSnapshot }>;
53
59
  readonly applySetup: () => Promise<{
54
60
  activation: RuntimeSetupResponse["activation"];
@@ -1,3 +1,6 @@
1
+ import { runtimeSetupConnectionInput } from "./runtime-setup/connection-input.js";
2
+ import { createConnectionInspection } from "./runtime-setup/connection-inspection.js";
3
+ import { setupReasoningState } from "./runtime-setup/reasoning-fields.js";
1
4
  import { textOf } from "../lib/text-format.js";
2
5
  import { renderRuntimeSetup } from "./runtime-setup/rendering.js";
3
6
  import { createSetupOptionalSteps } from "./runtime-setup/optional-steps.js";
@@ -20,7 +23,6 @@ import {
20
23
  import {
21
24
  clearConnectionSecret,
22
25
  readConnectionSecret,
23
- validateConnectionFields,
24
26
  showConnectionFieldError,
25
27
  } from "./runtime-setup/connection-form.js";
26
28
  import {
@@ -42,6 +44,7 @@ export function createRuntimeSetupGuide({
42
44
  container,
43
45
  conversationRegion,
44
46
  loadSetup,
47
+ inspectConnection,
45
48
  saveSetup,
46
49
  applySetup,
47
50
  loadEmbeddingStatus,
@@ -60,6 +63,7 @@ export function createRuntimeSetupGuide({
60
63
  openConfiguration = () => {},
61
64
  }) {
62
65
  const state = {
66
+ ...setupReasoningState(),
63
67
  providers: [],
64
68
  provider: "",
65
69
  modelId: "",
@@ -84,6 +88,7 @@ export function createRuntimeSetupGuide({
84
88
  let onCheckAgain = () => {};
85
89
  let onApplied = () => {};
86
90
  const viewState = createSetupViewState(container);
91
+ const connectionInspection = createConnectionInspection({ state, container, inspectConnection, onChange: paint, getEnvironmentId });
87
92
  const optionalSteps = createSetupOptionalSteps({
88
93
  container, getEnvironmentId, getPreferredProvider: () => state.provider,
89
94
  loadEmbeddingStatus, discoverEmbeddingModels, saveEmbedding, loadPlugins,
@@ -106,13 +111,15 @@ export function createRuntimeSetupGuide({
106
111
  }
107
112
 
108
113
  function reset() {
114
+ connectionInspection.reset();
109
115
  clearSetupContextWindowFeedback(state, container);
110
116
  revision += 1;
111
117
  optionalSteps.reset();
112
118
  viewState.reset();
113
119
  clearSecret();
114
120
  Object.assign(state, {
115
- providers: [],
121
+ ...setupReasoningState(),
122
+ providers: [],
116
123
  provider: "",
117
124
  modelId: "",
118
125
  contextWindowTokens: "",
@@ -196,31 +203,7 @@ export function createRuntimeSetupGuide({
196
203
  showConnectionFieldError(container, field);
197
204
  }
198
205
 
199
- function connectionInput() {
200
- const result = validateConnectionFields({
201
- modelId: state.modelId,
202
- contextWindowTokens: state.contextWindowTokens,
203
- providerType: state.provider,
204
- baseUrl: state.baseUrl,
205
- });
206
- if (!result.valid) {
207
- fieldError(result.field, result.message);
208
- return null;
209
- }
210
- const input = { provider: state.provider, ...result.input };
211
- if (state.editableConnection?.revision)
212
- input.connectionRevision = state.editableConnection.revision;
213
- if (state.provider === "ollama") return input;
214
- const apiKey = readConnectionSecret(container);
215
- const provider = state.providers.find(
216
- (entry) => entry.id === state.provider,
217
- );
218
- if (provider?.credentialConfigured !== true && !apiKey) {
219
- fieldError("api-key", "Enter your OpenAI API key.");
220
- return null;
221
- }
222
- return apiKey ? { ...input, apiKey } : input;
223
- }
206
+ const connectionInput = () => runtimeSetupConnectionInput(state, container, fieldError);
224
207
 
225
208
  async function submitConnection() {
226
209
  const input = connectionInput();
@@ -307,6 +290,7 @@ export function createRuntimeSetupGuide({
307
290
  function controlsAreBusy() {
308
291
  if (requiresConfigurationRecovery(availability)) return true;
309
292
  if (
293
+ state.checkingConnection ||
310
294
  state.loading ||
311
295
  state.saving ||
312
296
  state.applying ||
@@ -354,6 +338,7 @@ export function createRuntimeSetupGuide({
354
338
  return;
355
339
  }
356
340
  if (!action || controlsAreBusy()) return;
341
+ if (action === "inspect-model-connection" && state.step === 1) { void connectionInspection.check(); return; }
357
342
  const setupWasApplied =
358
343
  state.finishAttempted && state.activation?.status === "ready";
359
344
  if (setupWasApplied && action !== "check") return;
@@ -404,11 +389,17 @@ export function createRuntimeSetupGuide({
404
389
  }
405
390
  clearSetupContextWindowFeedback(state, container);
406
391
  field.removeAttribute?.("aria-invalid");
407
- updateSetupConnectionField(
392
+ const rerender = updateSetupConnectionField(
408
393
  state,
409
394
  field.dataset.runtimeSetupField,
410
- textOf(field.value),
395
+ field.type === "checkbox" ? field.checked : textOf(field.value),
411
396
  );
397
+ if (rerender) {
398
+ const key = readConnectionSecret(container);
399
+ paint();
400
+ const input = container.querySelector('[data-runtime-setup-field="api-key"]');
401
+ if (input) input.value = key;
402
+ }
412
403
  const action = container.querySelector(
413
404
  '.runtime-setup-action[type="submit"]',
414
405
  );
@@ -34,7 +34,7 @@ function runMarkup(run) {
34
34
  return `<article class="schedule-run" data-run-id="${escapeHtml(run.id)}">
35
35
  <div class="schedule-run-heading"><strong>${scheduleTimeLabel(run.scheduledAt, timeZone)}</strong><span class="schedule-badge" data-state="${escapeHtml(run.status)}">${escapeHtml(run.status)}</span></div>
36
36
  <div class="schedule-run-meta">${run.trigger === "manual" ? "Manual run" : "Scheduled run"}${run.startedAt ? ` · Started ${scheduleTimeLabel(run.startedAt, timeZone)}` : ""}${run.finishedAt ? ` · Finished ${scheduleTimeLabel(run.finishedAt, timeZone)}` : ""}</div>
37
- <dl class="schedule-run-settings">${fact("Model", run.modelProfileId)}${fact("Mode", displayReasoningMode(run.agentMode))}${fact("Tool access", toolPermissionModeMeta(run.toolPermissionMode).label)}${fact("Time zone", run.timeZone)}${fact("Job revision", String(run.jobRevision ?? "—"))}</dl>
37
+ <dl class="schedule-run-settings">${fact("Model", run.modelProfileId)}${fact("Mode", displayReasoningMode(run.agentMode, run.reasoningPreference))}${fact("Tool access", toolPermissionModeMeta(run.toolPermissionMode).label)}${fact("Time zone", run.timeZone)}${fact("Job revision", String(run.jobRevision ?? "—"))}</dl>
38
38
  ${run.error ? `<p class="schedule-error" dir="auto">${escapeHtml(run.error)}</p>` : ""}
39
39
  ${run.resultText ? `<details class="schedule-result" data-disclosure-id="result:${escapeHtml(run.id)}"><summary>View result</summary><pre dir="auto">${escapeHtml(run.resultText)}</pre></details>` : ""}
40
40
  <details class="schedule-prompt-disclosure" data-disclosure-id="run:${escapeHtml(run.id)}"><summary>View invocation prompt</summary><pre dir="auto">${escapeHtml(run.prompt)}</pre></details>
@@ -68,7 +68,7 @@ export function renderScheduleDetails({ root, snapshot, actions }) {
68
68
  const conversationLabel = scheduleConversationLabel(job.sessionId, snapshot.sessions);
69
69
  const markup = `<div class="schedule-detail-heading"><span class="schedule-eyebrow">Scheduled task</span><h3 dir="auto">${escapeHtml(job.title)}</h3><span class="schedule-badge" data-state="${job.state}">${job.state}</span></div>
70
70
  <div class="schedule-action-row">${actionsMarkup(job, snapshot.mutation)}</div>
71
- <dl class="schedule-facts">${fact("Schedule", scheduleDescription(job))}${fact("Next run", scheduleTimeLabel(job.nextRunAt, job.timeZone))}${fact("Time zone", job.timeZone)}${fact("Model", job.modelProfileId)}${fact("Mode", displayReasoningMode(job.agentMode))}${fact("Tool access", toolPermissionModeMeta(job.toolPermissionMode).label)}${fact("Created", scheduleTimeLabel(job.createdAt, job.timeZone))}${fact("Updated", scheduleTimeLabel(job.updatedAt, job.timeZone))}</dl>
71
+ <dl class="schedule-facts">${fact("Schedule", scheduleDescription(job))}${fact("Next run", scheduleTimeLabel(job.nextRunAt, job.timeZone))}${fact("Time zone", job.timeZone)}${fact("Model", job.modelProfileId)}${fact("Mode", displayReasoningMode(job.agentMode, job.reasoningPreference))}${fact("Tool access", toolPermissionModeMeta(job.toolPermissionMode).label)}${fact("Created", scheduleTimeLabel(job.createdAt, job.timeZone))}${fact("Updated", scheduleTimeLabel(job.updatedAt, job.timeZone))}</dl>
72
72
  <button type="button" class="schedule-conversation-link" data-open-conversation>↗ <span dir="auto">${escapeHtml(conversationLabel)}</span></button>
73
73
  <details class="schedule-prompt-disclosure" data-disclosure-id="job:${escapeHtml(job.id)}"><summary>View task prompt</summary><pre dir="auto">${escapeHtml(job.prompt)}</pre></details>
74
74
  <small class="schedule-id">Job ${escapeHtml(job.id)} · Revision ${job.revision}</small>
@@ -1,4 +1,5 @@
1
- import { renderReasoningModeField, syncReasoningModeField, retainedReasoningMode } from "../../lib/reasoning-controls.js";
1
+ import { readReasoningPreferenceField } from "../../lib/reasoning-preference.js";
2
+ import { clearReasoningOffForMode, renderReasoningModeField, syncReasoningModeField, retainedReasoningMode } from "../../lib/reasoning-controls.js";
2
3
  import { escapeHtml } from "../../lib/text-format.js";
3
4
  import { SCHEDULE_WEEKDAYS } from "../../lib/schedule-presentation.js";
4
5
  import { scheduleErrorMessage } from "../../lib/schedule-errors.js";
@@ -89,7 +90,7 @@ export function createScheduleForm({
89
90
  <label>Task prompt<textarea name="prompt" rows="5" required dir="auto" placeholder="What should ABot do when this schedule runs?">${escapeHtml(values.prompt || "")}</textarea></label>
90
91
  <div class="schedule-form-grid">${scheduleFields(values)}</div>
91
92
  <div class="schedule-form-grid"><label>Model<select name="modelProfileId" required><option value="">Choose a model</option>${options(modelOptions, values.modelProfileId)}</select></label>
92
- ${renderReasoningModeField(values.agentMode || "reasoning", models.find((model) => model.id === values.modelProfileId), modes.filter((mode) => mode !== "auto"))}</div>
93
+ ${renderReasoningModeField(values.agentMode || "reasoning", models.find((model) => model.id === values.modelProfileId), modes.filter((mode) => mode !== "auto"), values.reasoningPreference)}</div>
93
94
  <label>Tool access<select name="toolPermissionMode">${options(
94
95
  [
95
96
  { value: "full_access", label: "Full" },
@@ -112,12 +113,18 @@ export function createScheduleForm({
112
113
  }
113
114
  }
114
115
 
115
- const readInput = () => {
116
+ const readInput = (initial = false) => {
116
117
  const data = new FormData(form);
117
118
  data.set("agentMode", retainedReasoningMode(form, values.agentMode || "reasoning"));
118
- return scheduleFormInput(data, job?.schedule);
119
+ const input = scheduleFormInput(data, job?.schedule);
120
+ const preference = initial ? values.reasoningPreference : readReasoningPreferenceField(form);
121
+ if (preference) input.reasoningPreference = preference;
122
+ else if (job?.reasoningPreference) input.reasoningPreference = null;
123
+ return input;
119
124
  };
120
125
  fields.namedItem("modelProfileId").addEventListener("change", () => syncReasoningModeField(form, models, modes.filter((mode) => mode !== "auto")));
126
+ form.querySelector("[data-reasoning-mode]")?.addEventListener("change", () => clearReasoningOffForMode(form, models, modes.filter((mode) => mode !== "auto")));
127
+ form.querySelector("[data-reasoning-preference-mode]")?.addEventListener("change", () => syncReasoningModeField(form, models, modes.filter((mode) => mode !== "auto")));
121
128
  let initialInput;
122
129
  form.querySelector("[data-cancel]").addEventListener("click", onCancel);
123
130
  fields.namedItem("kind").addEventListener("change", syncKind);
@@ -139,7 +146,7 @@ export function createScheduleForm({
139
146
  }
140
147
  });
141
148
  syncKind();
142
- if (job) initialInput = readInput();
149
+ if (job) initialInput = readInput(true);
143
150
  const initialFields = JSON.stringify([...new FormData(form)]);
144
151
  function trackScheduleDraft() {
145
152
  form.dataset.dirty = String(