@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,113 @@
1
+ import {
2
+ effectiveReasoningBudgetEffort,
3
+ isTokenBudgetModel,
4
+ reasoningBudgetStatusText,
5
+ } from "./reasoning-budget.js";
6
+
7
+ function isReasoningGenerationPath(path) {
8
+ if (!Array.isArray(path)) return false;
9
+ if (path.length === 1) return path[0] === "generation";
10
+ if (path.length !== 3) return false;
11
+ return path[0] === "calibration" && typeof path[1] === "string" &&
12
+ path[2] === "generation";
13
+ }
14
+
15
+ function budgetEditGenerationPath(path) {
16
+ const budgetIndex = path.lastIndexOf("reasoningBudget");
17
+ if (budgetIndex < 0) return undefined;
18
+ const generation = path.slice(0, budgetIndex);
19
+ return isReasoningGenerationPath(generation) ? generation : undefined;
20
+ }
21
+
22
+ function reasoningStatusGenerationPath(element) {
23
+ try {
24
+ const path = JSON.parse(element.dataset.reasoningGenerationPath);
25
+ return isReasoningGenerationPath(path) ? path : undefined;
26
+ } catch {
27
+ return undefined;
28
+ }
29
+ }
30
+
31
+ function generationCalibration(file, path) {
32
+ if (path[0] !== "calibration") return undefined;
33
+ return file.config.calibration?.[path[1]];
34
+ }
35
+
36
+ function hasPositiveReasoningTokenLimit(value) {
37
+ if (!Number.isInteger(value)) return false;
38
+ if (value <= 0) return false;
39
+ return value <= 2147483647;
40
+ }
41
+
42
+ function budgetModeEnablesThinking(value) {
43
+ if (value?.mode === "server-default") return true;
44
+ if (value?.mode !== "tokens") return false;
45
+ return hasPositiveReasoningTokenLimit(value.tokens);
46
+ }
47
+
48
+ function explicitlyEnablesBudget(path, value) {
49
+ if (path.at(-1) === "reasoningBudget")
50
+ return budgetModeEnablesThinking(value);
51
+ if (path.at(-1) !== "tokens" || path.at(-2) !== "reasoningBudget")
52
+ return false;
53
+ return hasPositiveReasoningTokenLimit(value);
54
+ }
55
+
56
+ /** A form budget action enables only the edited generation scope. */
57
+ export function activateEditedReasoningBudget(
58
+ file,
59
+ dashboard,
60
+ path,
61
+ value,
62
+ setConfigPathValue,
63
+ ) {
64
+ if (file.kind !== "model" || !explicitlyEnablesBudget(path, value))
65
+ return undefined;
66
+ const generationPath = budgetEditGenerationPath(path);
67
+ if (!generationPath) return undefined;
68
+ const calibration = generationCalibration(file, generationPath);
69
+ if (!isTokenBudgetModel(file, dashboard, calibration)) return undefined;
70
+ const effort = effectiveReasoningBudgetEffort(
71
+ file,
72
+ dashboard,
73
+ generationPath,
74
+ );
75
+ if (effort !== undefined && effort !== "none") return undefined;
76
+ setConfigPathValue(
77
+ file.config,
78
+ [...generationPath, "reasoningEffort"],
79
+ "medium",
80
+ );
81
+ return generationPath;
82
+ }
83
+
84
+ function matchesReasoningControl(element, file) {
85
+ return element.dataset.kind === file.kind && element.dataset.id === file.id;
86
+ }
87
+
88
+ /** Numeric input keeps focus while the coupled select and status update. */
89
+ export function syncActivatedReasoningBudget(
90
+ root,
91
+ file,
92
+ dashboard,
93
+ generationPath,
94
+ ) {
95
+ const effortPath = JSON.stringify([...generationPath, "reasoningEffort"]);
96
+ for (const element of root.querySelectorAll(
97
+ 'select[data-config-action="field"]',
98
+ )) {
99
+ if (!matchesReasoningControl(element, file)) continue;
100
+ if (element.dataset.path !== effortPath) continue;
101
+ element.value = "medium";
102
+ }
103
+ for (const element of root.querySelectorAll(
104
+ "[data-reasoning-generation-path]",
105
+ )) {
106
+ if (!matchesReasoningControl(element, file)) continue;
107
+ const statusPath = reasoningStatusGenerationPath(element);
108
+ if (!statusPath) continue;
109
+ const calibration = generationCalibration(file, statusPath);
110
+ if (!isTokenBudgetModel(file, dashboard, calibration)) continue;
111
+ element.textContent = reasoningBudgetStatusText(file, dashboard, statusPath);
112
+ }
113
+ }
@@ -0,0 +1,16 @@
1
+ export declare function isTokenBudgetModel(file: { id?: string; config?: Record<string, unknown> }, dashboard: unknown, calibration?: { profileId?: string }): boolean;
2
+ export declare function shouldRefreshReasoningBudgetFields(
3
+ file: { kind: string },
4
+ path: string[],
5
+ valueType?: string,
6
+ ): boolean;
7
+ export declare function parseReasoningBudgetMode(value: string, previous?: { mode: string; tokens?: number }): { mode: string; tokens?: number } | undefined;
8
+ export declare function renderReasoningBudget(
9
+ file: { kind: string; id: string; config: Record<string, unknown> },
10
+ generationPath: string[],
11
+ renderConfigInput: (...args: unknown[]) => string,
12
+ options?: { supported?: boolean; dashboard?: unknown },
13
+ ): string;
14
+ export declare function effectiveReasoningBudgetEffort(file: { config: Record<string, any> }, dashboard: unknown, generationPath: string[]): string | undefined;
15
+ export declare function reasoningBudgetStatusText(file: { config: Record<string, any> }, dashboard: unknown, generationPath: string[]): string;
16
+ export declare function renderReasoningEffort(file: { config: Record<string, any> }, generationPath: string[], renderConfigInput: (...args: unknown[]) => string): string;
@@ -0,0 +1,67 @@
1
+ import { escapeAttribute } from "../../lib/text-format.js";
2
+
3
+ function reasoningBudgetTarget(file, dashboard, calibration) {
4
+ const targetId = calibration?.profileId;
5
+ return targetId && targetId !== file.id
6
+ ? dashboard?.files?.models?.find((model) => model.id === targetId)
7
+ : file;
8
+ }
9
+
10
+ export function isTokenBudgetModel(file, dashboard, calibration) {
11
+ const target = reasoningBudgetTarget(file, dashboard, calibration);
12
+ if (target?.config?.supportsThinking !== true) return false;
13
+ const providerId = target.config.provider;
14
+ return dashboard?.files?.runtime?.config?.models?.providers?.[providerId]?.type === "llamacpp";
15
+ }
16
+
17
+ export function shouldRefreshReasoningBudgetFields(file, path, valueType) {
18
+ if (valueType === "reasoning-budget-mode") return true;
19
+ if (valueType === "reasoning-mode-budgets") return true;
20
+ if (file.kind !== "model") return false;
21
+ if (path.at(-1) === "reasoningEffort") return true;
22
+ if (path.length !== 1) return false;
23
+ return path[0] === "supportsThinking" || path[0] === "provider";
24
+ }
25
+
26
+ export function parseReasoningBudgetMode(value, previous) {
27
+ if (value === "inherit") return undefined;
28
+ if (value === "server-default") return { mode: "server-default" };
29
+ return { mode: "tokens", tokens: previous?.mode === "tokens" ? previous.tokens : 0 };
30
+ }
31
+
32
+ export function effectiveReasoningBudgetEffort(file, dashboard, generationPath) {
33
+ const generation = generationPath.reduce((value, key) => value?.[key], file.config);
34
+ if (generation?.reasoningEffort !== undefined) return generation.reasoningEffort;
35
+ if (generationPath[0] !== "calibration") return undefined;
36
+ const calibration = file.config?.calibration?.[generationPath[1]];
37
+ return reasoningBudgetTarget(file, dashboard, calibration)?.config?.generation?.reasoningEffort;
38
+ }
39
+
40
+ export function reasoningBudgetStatusText(file, dashboard, generationPath) {
41
+ const budget = generationPath.reduce((value, key) => value?.[key], file.config)?.reasoningBudget;
42
+ const savedBudgetIsOff = budget !== undefined &&
43
+ effectiveReasoningBudgetEffort(file, dashboard, generationPath) === "none";
44
+ if (savedBudgetIsOff)
45
+ return "Inactive while reasoning is Off. Choose a positive token limit or Server default to enable thinking.";
46
+ return "Per reasoning segment. Zero disables thinking; a positive budget enables it. Off keeps the saved budget inactive.";
47
+ }
48
+
49
+ export function renderReasoningEffort(file, generationPath, renderConfigInput) {
50
+ return `<label><span>Reasoning effort</span>${renderConfigInput(file, [...generationPath, "reasoningEffort"], {
51
+ type: "select", values: ["", "none", "minimal", "low", "medium", "high", "xhigh"],
52
+ })}<small>Default inherits the profile or request mode. None disables thinking unless a mode token limit or request setting enables it.</small></label>`;
53
+ }
54
+
55
+ export function renderReasoningBudget(file, generationPath, renderConfigInput, { supported = true, dashboard } = {}) {
56
+ const budget = generationPath.reduce((value, key) => value?.[key], file.config)?.reasoningBudget;
57
+ if (!supported && budget === undefined) return "";
58
+ const path = [...generationPath, "reasoningBudget"];
59
+ const mode = budget?.mode || "inherit";
60
+ const attributes = `data-config-action="field" data-kind="${escapeAttribute(file.kind)}" data-id="${escapeAttribute(file.id)}" data-path="${escapeAttribute(JSON.stringify(path))}" data-value-type="reasoning-budget-mode"`;
61
+ return `<label><span>Thinking budget</span><select ${attributes}>
62
+ <option value="inherit" ${mode === "inherit" ? "selected" : ""}>Inherit (no override)</option>
63
+ ${supported ? `<option value="server-default" ${mode === "server-default" ? "selected" : ""}>Server default</option>
64
+ <option value="tokens" ${mode === "tokens" ? "selected" : ""}>Token limit</option>` : `<option value="${escapeAttribute(mode)}" selected disabled>Saved override (unsupported target)</option>`}
65
+ </select><small data-reasoning-generation-path="${escapeAttribute(JSON.stringify(generationPath))}" data-kind="${escapeAttribute(file.kind)}" data-id="${escapeAttribute(file.id)}">${supported ? reasoningBudgetStatusText(file, dashboard, generationPath) : "This target does not support token budgets. Choose Inherit to remove this override."}</small></label>
66
+ ${supported && mode === "tokens" ? `<label><span>Thinking tokens</span>${renderConfigInput(file, [...path, "tokens"], { type: "number", min: "0", step: "1" })}<small>Enter a non-negative whole number; 0 disables thinking. The answer also needs capacity within the total output limit.</small></label>` : ""}`;
67
+ }
@@ -0,0 +1,7 @@
1
+ export declare function parseReasoningModeBudgets(value: string, previous?: Record<string, number>): Record<string, number> | undefined;
2
+ export declare function renderReasoningModeBudgets(
3
+ file: { kind: string; id: string; config: Record<string, any> },
4
+ generationPath: string[],
5
+ renderConfigInput: (...args: any[]) => string,
6
+ options?: { supported?: boolean },
7
+ ): string;
@@ -0,0 +1,25 @@
1
+ import { escapeAttribute } from "../../lib/text-format.js";
2
+
3
+ const REASONING_MODES = [["fast", "Low"], ["reasoning", "Reasoning"], ["deep", "Deep"]];
4
+
5
+ export function parseReasoningModeBudgets(value, previous) {
6
+ if (value === "inherit") return undefined;
7
+ return previous ?? {};
8
+ }
9
+
10
+ export function renderReasoningModeBudgets(file, generationPath, renderConfigInput, { supported = true } = {}) {
11
+ const generation = generationPath.reduce((value, key) => value?.[key], file.config);
12
+ const budgets = generation?.reasoningBudgetByMode;
13
+ if (!supported && budgets === undefined) return "";
14
+ const path = [...generationPath, "reasoningBudgetByMode"];
15
+ const custom = budgets !== undefined;
16
+ const attributes = `data-config-action="field" data-kind="${escapeAttribute(file.kind)}" data-id="${escapeAttribute(file.id)}" data-path="${escapeAttribute(JSON.stringify(path))}" data-value-type="reasoning-mode-budgets"`;
17
+ const selector = `<label><span>Mode token overrides</span><select ${attributes}>
18
+ <option value="inherit" ${custom ? "" : "selected"}>Inherit (no override)</option>
19
+ ${supported ? `<option value="custom" ${custom ? "selected" : ""}>Custom limits by mode</option>` : '<option value="custom" selected disabled>Saved override (unsupported target)</option>'}
20
+ </select><small>${supported
21
+ ? "Optional limits for main model steps. A custom map replaces inherited mode limits; blank entries use the ordinary effort and budget settings."
22
+ : "This target does not support token budgets. Choose Inherit to remove this override."}</small></label>`;
23
+ if (!supported || !custom) return selector;
24
+ return selector + REASONING_MODES.map(([mode, label]) => `<label><span>${label} thinking tokens</span>${renderConfigInput(file, [...path, mode], { type: "number", min: "0", step: "1" })}<small>Optional non-negative integer. Zero disables thinking; positive values enable it for this mode, including Low. Explicit request or invocation Off still wins.</small></label>`).join("");
25
+ }
@@ -1,3 +1,5 @@
1
+ import { activateEditedReasoningBudget, syncActivatedReasoningBudget } from "./reasoning-budget-edit.js";
2
+ import { shouldRefreshReasoningBudgetFields } from "./reasoning-budget.js";
1
3
  import { rememberCalibrationDisclosure } from "./calibration-disclosure.js";
2
4
  import { textOf } from "../../lib/text-format.js";
3
5
  import { resolveModelExecutionRoute } from "./config-model.js";
@@ -72,10 +74,17 @@ export function createConfigWorkspaceEvents({
72
74
  action === "step-value"
73
75
  ? element.value
74
76
  : parseConfigInputValue(element, file, path);
75
- mutateConfigFile(element.dataset.kind, element.dataset.id, (config) =>
76
- applyConfigFieldValue(config, element, path, value),
77
- );
77
+ let activatedGeneration;
78
+ mutateConfigFile(element.dataset.kind, element.dataset.id, (config) => {
79
+ applyConfigFieldValue(config, element, path, value);
80
+ activatedGeneration = activateEditedReasoningBudget(
81
+ file, state.configDashboard, path, value, setConfigPathValue,
82
+ );
83
+ });
84
+ if (activatedGeneration)
85
+ syncActivatedReasoningBudget(dom.configDashboard, file, state.configDashboard, activatedGeneration);
78
86
  syncExecutionRouteDescription(element);
87
+ if (shouldRefreshReasoningBudgetFields(file, path, element.dataset.valueType)) renderConfigDashboard();
79
88
  }
80
89
 
81
90
  function handleDashboardInput(event) {
@@ -90,8 +99,7 @@ export function createConfigWorkspaceEvents({
90
99
  if (dashboardIsBusy()) return;
91
100
  const element = event.target;
92
101
  if (element?.id === "configRawFileSelect") {
93
- changeRawFile(element.value, element);
94
- return;
102
+ return changeRawFile(element.value, element);
95
103
  }
96
104
  const actionElement = element?.closest?.("[data-config-action]");
97
105
  if (!actionElement) return;
@@ -273,9 +281,9 @@ export function createConfigWorkspaceEvents({
273
281
  function bind() {
274
282
  if (state.bound) return;
275
283
  state.bound = true;
276
- dom.refreshConfigButton.addEventListener("click", () => {
284
+ dom.refreshConfigButton.addEventListener("click", async () => {
277
285
  if (dashboardIsBusy()) return;
278
- if (!confirmDiscardChanges("refresh configuration")) return;
286
+ if (!await confirmDiscardChanges("refresh configuration")) return;
279
287
  void loadRuntimeConfig({ protectUnsaved: false });
280
288
  });
281
289
  dom.configDashboard.addEventListener("click", handleDashboardClick);
@@ -29,6 +29,8 @@ export function createConfigWorkspaceMutations({
29
29
  setWorkspaceStatus,
30
30
  syncDirtyPresentation,
31
31
  }) {
32
+ let discardRequest = 0;
33
+
32
34
  function mutateConfigFile(kind, id, mutator, options = {}) {
33
35
  const file = findConfigFile(kind, id);
34
36
  if (!file) return;
@@ -79,7 +81,8 @@ export function createConfigWorkspaceMutations({
79
81
  renderConfigDashboard();
80
82
  }
81
83
 
82
- function prepareDiscardChanges(reason = "leave configuration") {
84
+ async function prepareDiscardChanges(reason = "leave configuration") {
85
+ discardRequest += 1;
83
86
  if (state.externalRuntimeMutationInFlight) {
84
87
  setWorkspaceStatus(
85
88
  `Wait for the current Runtime update before you ${reason}.`,
@@ -97,13 +100,14 @@ export function createConfigWorkspaceMutations({
97
100
  const changed = dirtyFiles();
98
101
  if (!changed.length) return prepareConfigDiscardCommit(false);
99
102
  const count = changed.length;
100
- const confirmed = confirmDiscard(
103
+ const discard = prepareConfigDiscardCommit(true);
104
+ const confirmed = await confirmDiscard(
101
105
  `Discard unsaved changes in ${count} config ${
102
106
  count === 1 ? "file" : "files"
103
107
  } and ${reason}?`,
104
108
  );
105
- if (!confirmed) return null;
106
- return prepareConfigDiscardCommit(true);
109
+ if (!confirmed || !discard.canCommit()) return null;
110
+ return discard;
107
111
  }
108
112
 
109
113
  function configDraftFingerprint() {
@@ -114,10 +118,16 @@ export function createConfigWorkspaceMutations({
114
118
  }
115
119
 
116
120
  function prepareConfigDiscardCommit(hasChanges) {
121
+ const request = discardRequest;
117
122
  const dashboard = state.configDashboard;
118
123
  const fingerprint = configDraftFingerprint();
119
- const commit = () => { if (hasChanges) discardAllChanges(); };
124
+ const commit = () => {
125
+ if (!commit.canCommit()) return false;
126
+ if (hasChanges) discardAllChanges();
127
+ return true;
128
+ };
120
129
  commit.canCommit = () => {
130
+ if (request !== discardRequest) return false;
121
131
  if (state.externalRuntimeMutationInFlight) return false;
122
132
  if (state.savingKeys.size > 0) return false;
123
133
  if (state.configDashboard !== dashboard) return false;
@@ -126,9 +136,9 @@ export function createConfigWorkspaceMutations({
126
136
  return commit;
127
137
  }
128
138
 
129
- function confirmDiscardChanges(reason = "leave configuration") {
130
- const discardChanges = prepareDiscardChanges(reason);
131
- if (!discardChanges) return false;
139
+ async function confirmDiscardChanges(reason = "leave configuration") {
140
+ const discardChanges = await prepareDiscardChanges(reason);
141
+ if (!discardChanges || !discardChanges.canCommit()) return false;
132
142
  discardChanges();
133
143
  return true;
134
144
  }
@@ -197,13 +207,16 @@ export function createConfigWorkspaceMutations({
197
207
  }
198
208
  }
199
209
 
200
- function keepOrDiscardCurrentRawDraft(currentFile, select) {
210
+ async function keepOrDiscardCurrentRawDraft(currentFile, select) {
211
+ discardRequest += 1;
201
212
  if (!currentFile || !hasRawDraftChanges(currentFile)) return true;
202
- const confirmed = confirmDiscard(
213
+ const original = prepareConfigDiscardCommit(false);
214
+ const confirmed = await confirmDiscard(
203
215
  `Discard the unapplied raw draft for ${textOf(
204
216
  currentFile.label || currentFile.id,
205
217
  )}?`,
206
218
  );
219
+ if (!original.canCommit()) return false;
207
220
  if (!confirmed) {
208
221
  select.value = state.selectedRawConfigKey;
209
222
  return false;
@@ -217,9 +230,16 @@ export function createConfigWorkspaceMutations({
217
230
  return true;
218
231
  }
219
232
 
220
- function changeRawFile(nextKey, select) {
233
+ async function changeRawFile(nextKey, select) {
221
234
  const currentFile = selectedRawConfigFile();
222
- if (!keepOrDiscardCurrentRawDraft(currentFile, select)) return;
235
+ const dashboard = state.configDashboard;
236
+ const currentKey = state.selectedRawConfigKey;
237
+ const pending = keepOrDiscardCurrentRawDraft(currentFile, select);
238
+ const request = discardRequest;
239
+ if (!await pending) return;
240
+ if (request !== discardRequest) return;
241
+ if (dashboard !== state.configDashboard) return;
242
+ if (currentKey !== state.selectedRawConfigKey) return;
223
243
  state.selectedRawConfigKey = nextKey;
224
244
  syncDirtyPresentation({ syncRawEditor: true });
225
245
  }
@@ -78,7 +78,7 @@ export function createConfigWorkspacePersistence({
78
78
 
79
79
  async function loadRuntimeConfig(options = {}) {
80
80
  const protectUnsaved = options.protectUnsaved !== false;
81
- if (protectUnsaved && !confirmDiscardChanges("refresh configuration")) {
81
+ if (protectUnsaved && !await confirmDiscardChanges("refresh configuration")) {
82
82
  return false;
83
83
  }
84
84
  if (options.clearBeforeLoad === true) {
@@ -1,3 +1,4 @@
1
+ import { confirmDialog } from "./confirmation-dialog.js";
1
2
  import { createModelPluginViewState } from "./config-workspace/model-plugin-view-state.js";
2
3
  import { createConfigCalibrationDisclosure } from "./config-workspace/calibration-disclosure.js";
3
4
  import { createConfigDashboardRendering } from "./config-workspace/dashboard-rendering.js";
@@ -33,7 +34,7 @@ export function createConfigWorkspace({
33
34
  onRemoveModel,
34
35
  onNavigationChange = () => {},
35
36
  recordControlEvent,
36
- confirmDiscard = (message) => window.confirm(message),
37
+ confirmDiscard = (message) => confirmDialog(message, { title: "Discard configuration changes", confirmLabel: "Discard changes", tone: "danger" }),
37
38
  eventTarget = window,
38
39
  }) {
39
40
  const workspaceModel = createConfigWorkspaceModel();
@@ -0,0 +1,88 @@
1
+ const dialogs = new WeakMap();
2
+ let nextDialogId = 0;
3
+
4
+ /** Shared, non-blocking confirmation. Overlapping requests fail closed. */
5
+ export function createConfirmationDialog({ documentRoot = globalThis.document } = {}) {
6
+ const dialog = documentRoot.createElement("dialog");
7
+ const id = `confirmation-${++nextDialogId}`;
8
+ dialog.className = "confirmation-dialog";
9
+ dialog.setAttribute("aria-labelledby", `${id}-title`);
10
+ dialog.setAttribute("aria-describedby", `${id}-description`);
11
+ dialog.innerHTML = `<div class="confirmation-content">
12
+ <header class="confirmation-heading"><h2 id="${id}-title"></h2>
13
+ <button type="button" class="confirmation-close" aria-label="Close confirmation">×</button></header>
14
+ <p id="${id}-description" class="confirmation-description"></p>
15
+ <footer class="confirmation-actions"><button type="button" data-confirmation-cancel>Cancel</button>
16
+ <button type="button" data-confirmation-accept>Continue</button></footer>
17
+ </div>`;
18
+ documentRoot.body.append(dialog);
19
+ const heading = dialog.querySelector("h2");
20
+ const description = dialog.querySelector(".confirmation-description");
21
+ const cancel = dialog.querySelector("[data-confirmation-cancel]");
22
+ const accept = dialog.querySelector("[data-confirmation-accept]");
23
+ let pending;
24
+ let returnFocus;
25
+ let destroyed = false;
26
+
27
+ function finish(approved) {
28
+ if (!pending) return;
29
+ const resolve = pending;
30
+ pending = undefined;
31
+ if (dialog.open) dialog.close();
32
+ if (returnFocus?.isConnected && !returnFocus.closest("[hidden], [inert]")) returnFocus.focus();
33
+ returnFocus = undefined;
34
+ resolve(approved);
35
+ }
36
+ cancel.addEventListener("click", () => finish(false));
37
+ dialog.querySelector(".confirmation-close").addEventListener("click", () => finish(false));
38
+ accept.addEventListener("click", () => finish(true));
39
+ dialog.addEventListener("keydown", (event) => {
40
+ if (event.key !== "Escape" || event.isComposing) return;
41
+ event.preventDefault();
42
+ event.stopPropagation();
43
+ finish(false);
44
+ });
45
+ dialog.addEventListener("cancel", (event) => { event.preventDefault(); finish(false); });
46
+ // A delayed close event from the previous request must not cancel a newly opened one.
47
+ dialog.addEventListener("close", () => { if (!dialog.open) finish(false); });
48
+ const onPageHide = () => finish(false);
49
+ documentRoot.defaultView?.addEventListener("pagehide", onPageHide);
50
+
51
+ return {
52
+ confirm(message, { title = "Confirm action", confirmLabel = "Continue", tone = "default" } = {}) {
53
+ if (pending || destroyed) return Promise.resolve(false);
54
+ heading.textContent = title;
55
+ description.textContent = message;
56
+ accept.textContent = confirmLabel;
57
+ dialog.dataset.tone = tone === "danger" ? "danger" : "default";
58
+ returnFocus = documentRoot.activeElement;
59
+ return new Promise((resolve) => {
60
+ pending = resolve;
61
+ try {
62
+ dialog.showModal();
63
+ cancel.focus();
64
+ } catch {
65
+ finish(false);
66
+ }
67
+ });
68
+ },
69
+ cancel() { finish(false); },
70
+ destroy() {
71
+ destroyed = true;
72
+ finish(false);
73
+ documentRoot.defaultView?.removeEventListener("pagehide", onPageHide);
74
+ dialog.remove();
75
+ },
76
+ };
77
+ }
78
+
79
+ export function confirmDialog(message, options) {
80
+ const documentRoot = globalThis.document;
81
+ if (!documentRoot?.body) return Promise.resolve(false);
82
+ let instance = dialogs.get(documentRoot);
83
+ if (!instance) {
84
+ instance = createConfirmationDialog({ documentRoot });
85
+ dialogs.set(documentRoot, instance);
86
+ }
87
+ return instance.confirm(message, options);
88
+ }
@@ -1,3 +1,4 @@
1
+ import type { MemoryActivity } from "../lib/memory-activity-model.js";
1
2
  import type { ContextWindowDisplay } from "../lib/context-window-state.js";
2
3
  import type { ConversationFileReference } from "../lib/conversation-file-reference.js";
3
4
  import type { buildConversationRoleCards } from "../lib/conversation-role-model.js";
@@ -25,6 +26,7 @@ export declare function buildConversationActivityModel(
25
26
  ): {
26
27
  requestId: string;
27
28
  events: ConversationActivityEvent[];
29
+ memoryActivities: MemoryActivity[];
28
30
  roleCards: ReturnType<typeof buildConversationRoleCards>;
29
31
  sources: ConversationSourcesGroup[];
30
32
  toolActions: ConversationToolAction[];
@@ -16,6 +16,8 @@ import {
16
16
  summarizeConversationTools,
17
17
  } from "../lib/tool-activity-model.js";
18
18
  import { isNonToolTimelineEvent } from "../lib/tool-timeline.js";
19
+ import { buildMemoryActivities, isMemoryRetrievalEvent } from "../lib/memory-activity-model.js";
20
+ import { createConversationMemoryActivity } from "./conversation-memory-activity.js";
19
21
 
20
22
  function textOf(value, fallback = "") {
21
23
  return typeof value === "string" ? value : fallback;
@@ -113,6 +115,7 @@ export function buildConversationActivityModel({
113
115
  return {
114
116
  requestId: "",
115
117
  events: [],
118
+ memoryActivities: [],
116
119
  roleCards: [],
117
120
  sources: [],
118
121
  toolActions: [],
@@ -134,7 +137,12 @@ export function buildConversationActivityModel({
134
137
  .map(presentEvent)
135
138
  : [];
136
139
  const toolCount = countToolInvocations(scopedEvents);
137
- const timeline = buildEventTimelineEntries(scopedEvents);
140
+ const memoryActivities = buildMemoryActivities({
141
+ requestId: normalizedRequestId, events: scopedEvents, streaming,
142
+ });
143
+ const timeline = buildEventTimelineEntries(scopedEvents.filter(
144
+ (event) => !isMemoryRetrievalEvent(event),
145
+ ));
138
146
  const progress = normalizeProgress(taskProgress, normalizedRequestId);
139
147
  const contextWindowModel = projectContextWindowDisplay(
140
148
  contextWindow,
@@ -155,6 +163,7 @@ export function buildConversationActivityModel({
155
163
  return {
156
164
  requestId: normalizedRequestId,
157
165
  events: timeline,
166
+ memoryActivities,
158
167
  roleCards: buildConversationRoleCards({
159
168
  requestId: normalizedRequestId,
160
169
  events: scopedEvents,
@@ -179,7 +188,7 @@ export function buildConversationActivityModel({
179
188
  "Working"
180
189
  : "",
181
190
  openByDefault: Boolean(streaming),
182
- hasContent: Boolean(progress || timeline.length > 0),
191
+ hasContent: Boolean(progress || timeline.length > 0 || memoryActivities.length > 0),
183
192
  };
184
193
  }
185
194
 
@@ -263,6 +272,25 @@ export function createConversationActivity({
263
272
  function createNode(input = {}) {
264
273
  const model = buildConversationActivityModel(input);
265
274
  if (!model.hasContent) return null;
275
+ if (model.roleCards.length > 0) return createActivityNode(model);
276
+ const memory = createConversationMemoryActivity({
277
+ documentRoot, activities: model.memoryActivities,
278
+ });
279
+ const bubble = documentRoot.createElement("div");
280
+ bubble.className = "conversation-role-message conversation-memory-bubble";
281
+ bubble.dataset.requestId = model.requestId;
282
+ if (memory) bubble.appendChild(memory);
283
+ if (!model.events.length && !model.progress) return bubble;
284
+ const activity = createActivityNode(model);
285
+ if (!memory) return activity;
286
+ const group = documentRoot.createElement("div");
287
+ group.className = "conversation-activity-group";
288
+ group.dataset.requestId = model.requestId;
289
+ group.append(bubble, activity);
290
+ return group;
291
+ }
292
+
293
+ function createActivityNode(model) {
266
294
  const hasFailures = model.failureCount > 0;
267
295
  const hasRoleCards = model.roleCards.length > 0;
268
296
 
@@ -352,12 +380,13 @@ export function createConversationActivity({
352
380
 
353
381
  const body = documentRoot.createElement("div");
354
382
  body.className = "conversation-activity-body";
355
- if (model.events.length > 0) {
383
+ if (model.events.length > 0 || hasRoleCards) {
356
384
  const timelineEvents = model.events.filter(isNonToolTimelineEvent);
357
385
  body.appendChild(
358
386
  roleCards.createNode({
359
387
  requestId: model.requestId,
360
388
  cards: model.roleCards,
389
+ memoryActivities: model.memoryActivities,
361
390
  heading: summary,
362
391
  timeline: renderTimeline(documentRoot, timelineEvents),
363
392
  hasTimeline: timelineEvents.length > 0,
@@ -0,0 +1,31 @@
1
+ export function createConversationMemoryActivity({
2
+ documentRoot = document,
3
+ activities = [],
4
+ } = {}) {
5
+ if (activities.length === 0) return null;
6
+ const section = documentRoot.createElement("section");
7
+ section.className = "conversation-memory-activity";
8
+ section.setAttribute("aria-label", "Memory activity");
9
+ for (const activity of activities) {
10
+ const row = documentRoot.createElement("div");
11
+ row.className = "conversation-memory-row";
12
+ row.dataset.state = activity.state;
13
+ const icon = documentRoot.createElement("span");
14
+ icon.className = "conversation-memory-icon";
15
+ icon.setAttribute("aria-hidden", "true");
16
+ icon.innerHTML = '<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.35" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="10" cy="4.5" rx="6" ry="2.5"/><path d="M4 4.5v10c0 1.4 2.7 2.5 6 2.5s6-1.1 6-2.5v-10M4 9.5c0 1.4 2.7 2.5 6 2.5s6-1.1 6-2.5"/></svg>';
17
+ const label = documentRoot.createElement("span");
18
+ label.className = "conversation-memory-label";
19
+ label.textContent = activity.label;
20
+ row.append(icon, label);
21
+ if (activity.detail) {
22
+ const detail = documentRoot.createElement("span");
23
+ detail.className = "conversation-memory-detail";
24
+ detail.setAttribute("dir", "auto");
25
+ detail.textContent = activity.detail;
26
+ row.appendChild(detail);
27
+ }
28
+ section.appendChild(row);
29
+ }
30
+ return section;
31
+ }
@@ -1,5 +1,6 @@
1
1
  import type { ConversationFileReference } from "../lib/conversation-file-reference.js";
2
2
  import type { buildConversationRoleCards } from "../lib/conversation-role-model.js";
3
+ import type { MemoryActivity } from "../lib/memory-activity-model.js";
3
4
 
4
5
  export declare function createConversationRoleCards(options?: {
5
6
  documentRoot?: Document;
@@ -12,6 +13,7 @@ export declare function createConversationRoleCards(options?: {
12
13
  createNode(input: {
13
14
  requestId: string;
14
15
  cards: ReturnType<typeof buildConversationRoleCards>;
16
+ memoryActivities?: MemoryActivity[];
15
17
  heading?: HTMLElement;
16
18
  timeline: HTMLElement;
17
19
  hasTimeline: boolean;