@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
@@ -143,6 +143,7 @@
143
143
  <span class="rail-button-label">System</span>
144
144
  </button>
145
145
  </div>
146
+ <div id="appearanceRoot"></div>
146
147
  <div class="rail-spacer"></div>
147
148
  <div class="rail-runtime">
148
149
  <select
@@ -206,6 +207,10 @@
206
207
  <h1 id="sessionsHeading">Conversations</h1>
207
208
  </div>
208
209
  <div class="sheet-heading-actions">
210
+ <button id="sessionSearchToggleButton" class="icon-button" type="button"
211
+ aria-label="Search conversations" title="Search conversations" aria-controls="sessionSearchField" aria-expanded="false">
212
+ <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="6.5" /><path d="m16 16 4 4" /></svg>
213
+ </button>
209
214
  <button
210
215
  id="refreshSessionsButton"
211
216
  class="icon-button"
@@ -233,7 +238,16 @@
233
238
  </div>
234
239
  </div>
235
240
 
236
- <div class="session-create-row">
241
+ <div class="session-navigation-tools">
242
+ <label id="sessionSearchField" class="session-search" hidden>
243
+ <span class="sr-only">Search conversations</span>
244
+ <input
245
+ id="sessionSearchInput"
246
+ type="search"
247
+ placeholder="Search conversations"
248
+ autocomplete="off"
249
+ />
250
+ </label>
237
251
  <button
238
252
  id="newSessionButton"
239
253
  class="sessions-new-button"
@@ -246,41 +260,25 @@
246
260
  </svg>
247
261
  <span>New chat</span>
248
262
  </button>
249
- <button
250
- id="newProjectButton"
251
- class="sessions-project-button"
252
- type="button"
253
- disabled
254
- aria-label="Create a project"
255
- title="Create a project"
256
- aria-controls="projectCreationRoot"
257
- >
258
- <svg viewBox="0 0 24 24" aria-hidden="true">
259
- <path d="M3 7V5h6l2 2h10v13H3ZM12 10v7M8.5 13.5h7" />
260
- </svg>
261
- <span>New project</span>
262
- </button>
263
263
  </div>
264
264
 
265
265
  <section class="sessions-section" aria-labelledby="sessionsHeading">
266
- <div class="sessions-heading-row">
267
- <span class="sessions-list-label">Recent conversations</span>
268
- <span id="sessionsCount" class="count-badge">0</span>
266
+ <div id="sessionsList" class="sessions-list">
267
+ <button
268
+ id="newProjectButton"
269
+ class="sessions-project-button"
270
+ type="button"
271
+ disabled
272
+ aria-label="Create a project"
273
+ title="Create a project"
274
+ aria-controls="projectCreationRoot"
275
+ >
276
+ <svg viewBox="0 0 24 24" aria-hidden="true">
277
+ <path d="M3 7V5h6l2 2h10v13H3ZM12 10v7M8.5 13.5h7" />
278
+ </svg>
279
+ <span>New project</span>
280
+ </button>
269
281
  </div>
270
- <label class="session-search">
271
- <svg viewBox="0 0 24 24" aria-hidden="true">
272
- <circle cx="11" cy="11" r="6.5" />
273
- <path d="m16 16 4 4" />
274
- </svg>
275
- <span class="sr-only">Search conversations</span>
276
- <input
277
- id="sessionSearchInput"
278
- type="search"
279
- placeholder="Search conversations"
280
- autocomplete="off"
281
- />
282
- </label>
283
- <div id="sessionsList" class="sessions-list"></div>
284
282
  </section>
285
283
  </aside>
286
284
 
@@ -437,6 +435,14 @@
437
435
  </button>
438
436
  <div id="agentModeMenu" class="agent-mode-menu"></div>
439
437
  </div>
438
+ <div id="reasoningBudgetControl" class="control-cluster reasoning-budget-control" hidden>
439
+ <span class="control-label">Budget</span>
440
+ <button id="reasoningBudgetButton" class="agent-mode-button reasoning-budget-button"
441
+ type="button" aria-controls="reasoningBudgetMenu" aria-haspopup="dialog" aria-expanded="false">
442
+ Profile default
443
+ </button>
444
+ <div id="reasoningBudgetMenu" class="agent-mode-menu reasoning-budget-menu" hidden></div>
445
+ </div>
440
446
  <div
441
447
  id="composerContextWindow"
442
448
  class="composer-context-window"
@@ -0,0 +1,17 @@
1
+ export const PALETTE_PREFERENCE_KEY: "abot-web.colorPalette";
2
+ export const DEFAULT_PALETTE_ID: "harbor";
3
+ export type ColorPaletteId = "harbor" | "midnight" | "graphite" | "charcoal" | "onyx" | "sand";
4
+ export interface ColorPalette {
5
+ id: ColorPaletteId;
6
+ name: string;
7
+ description: string;
8
+ background: string;
9
+ panel: string;
10
+ accent: string;
11
+ }
12
+ export const COLOR_PALETTES: ColorPalette[];
13
+ export function isColorPaletteId(value: unknown): value is ColorPaletteId;
14
+ export function savedColorPalette(storage: {
15
+ getItem(key: string): string | null;
16
+ snapshot?(): { preferences: Record<string, string> } | null;
17
+ }): ColorPaletteId;
@@ -0,0 +1,20 @@
1
+ export const PALETTE_PREFERENCE_KEY = "abot-web.colorPalette";
2
+ export const DEFAULT_PALETTE_ID = "harbor";
3
+ export const COLOR_PALETTES = [
4
+ { id: "harbor", name: "Harbor", description: "Deep blue · sea glass", background: "#090f17", panel: "#0d151e", accent: "#82d4c2" },
5
+ { id: "midnight", name: "Midnight", description: "Near black · ice blue", background: "#090b10", panel: "#10131b", accent: "#97bdff" },
6
+ { id: "graphite", name: "Graphite", description: "Soft charcoal · lilac", background: "#101012", panel: "#18181c", accent: "#c4b5ed" },
7
+ { id: "charcoal", name: "Onyx Soft", description: "Soft black · silver", background: "#0d0d0d", panel: "#151515", accent: "#c7c7c7" },
8
+ { id: "onyx", name: "Onyx", description: "Pure black · soft white", background: "#070707", panel: "#101010", accent: "#d4d4d4" },
9
+ { id: "sand", name: "Onyx Steel", description: "Cool black · steel", background: "#080b0e", panel: "#101519", accent: "#b5c6d2" },
10
+ ];
11
+
12
+ export function isColorPaletteId(value) {
13
+ return COLOR_PALETTES.some((palette) => palette.id === value);
14
+ }
15
+
16
+ export function savedColorPalette(storage) {
17
+ const acknowledged = storage.snapshot?.();
18
+ const value = acknowledged ? acknowledged.preferences[PALETTE_PREFERENCE_KEY] : storage.getItem(PALETTE_PREFERENCE_KEY);
19
+ return isColorPaletteId(value) ? value : DEFAULT_PALETTE_ID;
20
+ }
@@ -0,0 +1,12 @@
1
+ export type MemoryActivity = {
2
+ state: "active" | "done" | "failed" | "incomplete";
3
+ label: string;
4
+ detail: string;
5
+ };
6
+
7
+ export declare function isMemoryRetrievalEvent(event: unknown): boolean;
8
+ export declare function buildMemoryActivities(input?: {
9
+ requestId?: string;
10
+ events?: Record<string, unknown>[];
11
+ streaming?: boolean;
12
+ }): MemoryActivity[];
@@ -0,0 +1,61 @@
1
+ import { textOf } from "./text-format.js";
2
+
3
+ const RETRIEVAL_STATES = Object.freeze({
4
+ "memory.retrieval.started": "active",
5
+ "memory.retrieval.completed": "done",
6
+ "memory.retrieval.failed": "failed",
7
+ });
8
+
9
+ export function isMemoryRetrievalEvent(event) {
10
+ return Object.hasOwn(RETRIEVAL_STATES, memoryEventName(event));
11
+ }
12
+
13
+ function memoryEventName(event) {
14
+ return textOf(event?.eventName || event?.name || event?.rawType || event?.type);
15
+ }
16
+
17
+ function sequenceOf(event, field) {
18
+ const value = field === "replay" ? event.lastSeqNo ?? event.seqNo : event.eventSequence;
19
+ return Number.isSafeInteger(value) && value > 0 ? value : null;
20
+ }
21
+
22
+ function hasCompleteMemoryOrdering(events, field) {
23
+ return events.every((event) => sequenceOf(event, field) !== null);
24
+ }
25
+
26
+ function orderedMemoryEvents(events) {
27
+ for (const field of ["runtime", "replay"]) {
28
+ if (!hasCompleteMemoryOrdering(events, field)) continue;
29
+ const unique = new Map();
30
+ for (const event of events) {
31
+ const sequence = sequenceOf(event, field);
32
+ if (!unique.has(sequence)) unique.set(sequence, event);
33
+ }
34
+ return [...unique.entries()].sort(([left], [right]) => left - right).map(([, event]) => event);
35
+ }
36
+ return events;
37
+ }
38
+
39
+ function memoryActivity(event, streaming) {
40
+ const recordedState = RETRIEVAL_STATES[memoryEventName(event)];
41
+ const state = recordedState === "active" && !streaming ? "incomplete" : recordedState;
42
+ const labels = {
43
+ active: "Checking memory…",
44
+ done: "Memory checked",
45
+ failed: "Memory retrieval failed",
46
+ incomplete: "Memory check incomplete",
47
+ };
48
+ return {
49
+ state,
50
+ label: labels[state],
51
+ detail: state === "failed" ? textOf(event.summary || event.reason || event.error) : "",
52
+ };
53
+ }
54
+
55
+ /** Show the latest retrieval status for this request; recorded events stay intact. */
56
+ export function buildMemoryActivities({ requestId, events = [], streaming = false } = {}) {
57
+ const scoped = events.filter((event) =>
58
+ textOf(event?.requestId) === requestId && isMemoryRetrievalEvent(event));
59
+ const latest = orderedMemoryEvents(scoped).at(-1);
60
+ return latest ? [memoryActivity(latest, streaming)] : [];
61
+ }
@@ -0,0 +1,8 @@
1
+ export const NAVIGATION_PREFERENCE_KEY: "abot-web.navigationDisplay";
2
+ export const DEFAULT_NAVIGATION_MODE: "labels";
3
+ export type NavigationMode = "labels" | "icons";
4
+ export function isNavigationMode(value: unknown): value is NavigationMode;
5
+ export function savedNavigationMode(storage: {
6
+ getItem(key: string): string | null;
7
+ snapshot?(): { preferences: Record<string, string> } | null;
8
+ }): NavigationMode;
@@ -0,0 +1,12 @@
1
+ export const NAVIGATION_PREFERENCE_KEY = "abot-web.navigationDisplay";
2
+ export const DEFAULT_NAVIGATION_MODE = "labels";
3
+
4
+ export function isNavigationMode(value) {
5
+ return value === "labels" || value === "icons";
6
+ }
7
+
8
+ export function savedNavigationMode(storage) {
9
+ const acknowledged = storage.snapshot?.();
10
+ const value = acknowledged ? acknowledged.preferences[NAVIGATION_PREFERENCE_KEY] : storage.getItem(NAVIGATION_PREFERENCE_KEY);
11
+ return isNavigationMode(value) ? value : DEFAULT_NAVIGATION_MODE;
12
+ }
@@ -1,6 +1,8 @@
1
+ import { reasoningPreferenceLabel, renderReasoningPreferenceField, syncReasoningPreferenceField } from "./reasoning-preference.js";
1
2
  import { escapeHtml } from "./text-format.js";
2
3
 
3
- export function displayReasoningMode(mode) {
4
+ export function displayReasoningMode(mode, preference) {
5
+ if (preference) return `${agentModeMeta(mode).label} · ${reasoningPreferenceLabel(preference)}`;
4
6
  if (mode === "fast") return "Low";
5
7
  return mode;
6
8
  }
@@ -16,10 +18,34 @@ export function reasoningModeOptions(mode, enabled, modes = ["fast", "reasoning"
16
18
  return modes.map((value) => `<option value="${escapeHtml(value)}"${value === mode ? " selected" : ""}>${escapeHtml(labels[value] || value)}</option>`).join("");
17
19
  }
18
20
 
19
- export function renderReasoningModeField(mode, profile, modes) {
21
+ export function agentModeMeta(mode) {
22
+ const modes = {
23
+ auto: { label: "Auto", description: "Lets the agent choose", icon: "*" },
24
+ fast: { label: "Low", description: "Shorter and quicker", icon: "!" },
25
+ reasoning: { label: "Reasoning", description: "Balanced speed and thinking", icon: "R" },
26
+ deep: { label: "Deep", description: "More careful responses", icon: "D" },
27
+ };
28
+ return modes[mode] || modes.reasoning;
29
+ }
30
+
31
+ export function renderReasoningModeButtons(mode, modes, disabled = false) {
32
+ return modes.map((value) => {
33
+ const item = agentModeMeta(value);
34
+ const selected = value === mode;
35
+ return `<button class="agent-mode-option ${selected ? "selected" : ""}" type="button"
36
+ role="menuitemradio" aria-checked="${selected}" tabindex="${selected ? "0" : "-1"}"
37
+ data-mode="${escapeHtml(value)}" ${disabled ? "disabled" : ""}>
38
+ <span class="agent-mode-option-icon">${escapeHtml(item.icon)}</span>
39
+ <span><strong>${escapeHtml(item.label)}</strong><small>${escapeHtml(item.description)}</small></span>
40
+ </button>`;
41
+ }).join("");
42
+ }
43
+
44
+ export function renderReasoningModeField(mode, profile, modes, preference) {
20
45
  const enabled = canChooseReasoning(profile);
21
- return `<label>Reasoning depth<select name="agentMode" data-reasoning-mode${enabled ? "" : " disabled"}>${reasoningModeOptions(mode, enabled, modes)}</select>
22
- <small data-reasoning-mode-note${enabled ? " hidden" : ""}>Uses the provider default. Enable reasoning controls for this model in Models.</small></label>`;
46
+ return `<label data-legacy-reasoning>Reasoning depth<select name="agentMode" data-reasoning-mode data-retained-mode="${escapeHtml(mode || "reasoning")}"${enabled ? "" : " disabled"}>${reasoningModeOptions(mode, enabled, modes)}</select>
47
+ <small data-reasoning-mode-note${enabled ? " hidden" : ""}>Uses the provider default. Enable reasoning controls for this model in Models.</small>
48
+ <small data-reasoning-default-note${enabled ? "" : " hidden"}>Sets the default depth; model profile and calibration settings may override it. Token budgets are separate. Changing the mode turns Thinking Off back on.</small></label>${renderReasoningPreferenceField(profile, preference)}`;
23
49
  }
24
50
 
25
51
  export function syncReasoningModeField(form, profiles, modes) {
@@ -28,13 +54,28 @@ export function syncReasoningModeField(form, profiles, modes) {
28
54
  const profileId = form.querySelector('[name="modelProfileId"]')?.value;
29
55
  const profile = profiles?.find((item) => item.id === profileId);
30
56
  const enabled = canChooseReasoning(profile);
31
- const mode = select.value;
57
+ syncReasoningPreferenceField(form, profile);
58
+ const mode = select.value || select.dataset.retainedMode || "reasoning";
59
+ select.dataset.retainedMode = mode;
32
60
  select.innerHTML = reasoningModeOptions(mode, enabled, modes);
33
61
  select.disabled = !enabled;
34
62
  const note = form.querySelector("[data-reasoning-mode-note]");
35
63
  if (note) note.hidden = enabled;
64
+ const defaultNote = form.querySelector("[data-reasoning-default-note]");
65
+ if (defaultNote) defaultNote.hidden = !enabled;
66
+ }
67
+
68
+ export function clearReasoningOffForMode(form, profiles, modes) {
69
+ const select = form.querySelector("[data-reasoning-mode]");
70
+ if (!select?.value || select.disabled) return;
71
+ select.dataset.retainedMode = select.value;
72
+ const preferenceMode = form.querySelector("[data-reasoning-preference-mode]");
73
+ if (preferenceMode?.value !== "off") return;
74
+ preferenceMode.value = "inherit";
75
+ syncReasoningModeField(form, profiles, modes);
36
76
  }
37
77
 
38
78
  export function retainedReasoningMode(form, fallback) {
39
- return form.querySelector("[data-reasoning-mode]")?.value || fallback;
79
+ const select = form.querySelector("[data-reasoning-mode]");
80
+ return select?.value || select?.dataset.retainedMode || fallback;
40
81
  }
@@ -0,0 +1,9 @@
1
+ import type { ModelReasoningPreference } from "../../../shared/model-reasoning.js";
2
+ export type ReasoningProfile = { id?: string; supportsThinking?: boolean; reasoningControls?: { budgetTokens: boolean } };
3
+ export declare const MAX_REASONING_BUDGET_TOKENS: number;
4
+ export declare function canChooseReasoningBudget(profile: ReasoningProfile | null | undefined): boolean;
5
+ export declare function isReasoningPreference(value: unknown): value is ModelReasoningPreference;
6
+ export declare function reasoningPreferenceLabel(preference?: ModelReasoningPreference): string;
7
+ export declare function renderReasoningPreferenceField(profile?: ReasoningProfile | null, preference?: ModelReasoningPreference): string;
8
+ export declare function syncReasoningPreferenceField(form: ParentNode, profile?: ReasoningProfile | null): void;
9
+ export declare function readReasoningPreferenceField(form: ParentNode): ModelReasoningPreference | undefined;
@@ -0,0 +1,75 @@
1
+ import { escapeHtml } from "./text-format.js";
2
+
3
+ export const MAX_REASONING_BUDGET_TOKENS = 2147483647;
4
+ export function canChooseReasoningBudget(profile) {
5
+ return profile?.supportsThinking === true && profile?.reasoningControls?.budgetTokens === true;
6
+ }
7
+ export function isReasoningPreference(value) {
8
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
9
+ if (typeof value.profileId !== "string" || !value.profileId.trim()) return false;
10
+ if (!["off", "budget", "server-default"].includes(value.mode)) return false;
11
+ const fields = value.mode === "budget" ? ["profileId", "mode", "budgetTokens"] : ["profileId", "mode"];
12
+ if (Object.keys(value).some((key) => !fields.includes(key))) return false;
13
+ return value.mode !== "budget" || (Number.isInteger(value.budgetTokens)
14
+ && value.budgetTokens >= 0 && value.budgetTokens <= MAX_REASONING_BUDGET_TOKENS);
15
+ }
16
+ export function reasoningPreferenceLabel(preference) {
17
+ const zeroBudgetDisablesThinking = preference?.mode === "budget" && preference.budgetTokens === 0;
18
+ if (zeroBudgetDisablesThinking) return "Thinking off";
19
+ if (preference?.mode === "budget") return `${preference.budgetTokens} thinking tokens`;
20
+ if (preference?.mode === "off") return "Thinking off";
21
+ if (preference?.mode === "server-default") return "Server thinking default";
22
+ return "Profile default";
23
+ }
24
+ export function renderReasoningPreferenceField(profile, preference) {
25
+ const available = canChooseReasoningBudget(profile);
26
+ const mode = preference?.mode || "inherit";
27
+ const profileId = profile?.id || preference?.profileId || "";
28
+ return `<div data-reasoning-preference data-profile-id="${escapeHtml(profileId)}" data-budget-available="${available}"${available || preference ? "" : " hidden"}>
29
+ <label>Thinking budget<select name="reasoningPreferenceMode" data-reasoning-preference-mode>
30
+ ${[["inherit", "Profile default"], ["off", "Off"], ["budget", "Custom token budget"], ["server-default", "Server default"]].map(([value, label]) => `<option value="${value}"${value === mode ? " selected" : ""}${!available && value !== "inherit" ? " disabled" : ""}>${label}</option>`).join("")}
31
+ </select></label>
32
+ <label data-reasoning-budget-label${mode === "budget" ? "" : " hidden"}>Thinking tokens<input name="reasoningBudgetTokens" data-reasoning-budget type="number" min="0" max="${MAX_REASONING_BUDGET_TOKENS}" step="1" inputmode="numeric" value="${preference?.mode === "budget" ? escapeHtml(String(preference.budgetTokens)) : ""}"${mode === "budget" ? " required" : " disabled"}></label>
33
+ <small data-reasoning-preference-note>${available ? "The token limit is independent of reasoning depth and counts toward the total output limit. Off or a token limit of 0 disables thinking." : "This model cannot use the saved thinking budget. Choose Profile default to clear it."}</small>
34
+ </div><small data-reasoning-model-change-note hidden>Changing the model reset the thinking budget to Profile default.</small>`;
35
+ }
36
+ export function syncReasoningPreferenceField(form, profile) {
37
+ const field = form?.querySelector("[data-reasoning-preference]");
38
+ if (!field) return;
39
+ const changed = field.dataset.profileId !== (profile?.id || "");
40
+ const mode = field.querySelector("[data-reasoning-preference-mode]");
41
+ const notice = form.querySelector("[data-reasoning-model-change-note]");
42
+ if (changed) {
43
+ if (notice) notice.hidden = mode.value === "inherit";
44
+ field.dataset.profileId = profile?.id || "";
45
+ mode.value = "inherit";
46
+ field.querySelector("[data-reasoning-budget]").value = "";
47
+ }
48
+ const available = canChooseReasoningBudget(profile);
49
+ field.dataset.budgetAvailable = String(available);
50
+ field.hidden = !available && mode.value === "inherit";
51
+ for (const option of mode.querySelectorAll("option")) option.disabled = !available && option.value !== "inherit";
52
+ if (!changed && mode.value !== "inherit" && notice) notice.hidden = true;
53
+ const custom = mode.value === "budget";
54
+ field.querySelector("[data-reasoning-budget-label]").hidden = !custom;
55
+ const input = field.querySelector("[data-reasoning-budget]");
56
+ input.disabled = !custom; input.required = custom;
57
+ }
58
+ function readReasoningBudgetTokens(field) {
59
+ const raw = field.querySelector("[data-reasoning-budget]").value;
60
+ if (raw.trim() === "") return NaN;
61
+ return Number(raw);
62
+ }
63
+
64
+ export function readReasoningPreferenceField(form) {
65
+ const field = form?.querySelector("[data-reasoning-preference]");
66
+ const mode = field?.querySelector("[data-reasoning-preference-mode]")?.value || "inherit";
67
+ if (mode === "inherit") return undefined;
68
+ if (field.dataset.budgetAvailable !== "true")
69
+ throw new Error("This model does not support thinking budgets. Choose Profile default.");
70
+ const preference = { profileId: field.dataset.profileId, mode };
71
+ if (mode === "budget") preference.budgetTokens = readReasoningBudgetTokens(field);
72
+ if (!isReasoningPreference(preference))
73
+ throw new Error(`Enter a whole thinking token budget from 0 to ${MAX_REASONING_BUDGET_TOKENS}; 0 disables thinking.`);
74
+ return preference;
75
+ }
@@ -1,3 +1,5 @@
1
+ import type { ModelReasoningPreference } from "../../../shared/model-reasoning.js";
2
+
1
3
  export interface SessionComposerQueueScope {
2
4
  environmentId: string;
3
5
  sessionId: string;
@@ -10,6 +12,7 @@ export interface SessionComposerQueueItem {
10
12
  waitForRequestId: string;
11
13
  text: string;
12
14
  attachments: SessionComposerAttachmentRef[];
15
+ reasoningPreference?: ModelReasoningPreference;
13
16
  agentMode: string;
14
17
  toolPermissionMode: string;
15
18
  modelPreference: SessionComposerModelPreference | null;
@@ -19,6 +22,7 @@ export interface SessionComposerQueueItemInput {
19
22
  waitForRequestId: string;
20
23
  text: string;
21
24
  attachments: SessionComposerAttachmentRef[];
25
+ reasoningPreference?: ModelReasoningPreference;
22
26
  agentMode: string;
23
27
  toolPermissionMode: string;
24
28
  modelPreference?: SessionComposerModelPreference | null;
@@ -1,3 +1,4 @@
1
+ import { isReasoningPreference } from "./reasoning-preference.js";
1
2
  import { hasValidQueueOwnership, canUpdateBlockedRelease, canBindBlockedRelease, createQueueOwnership } from "./session-composer-queue-ownership.js";
2
3
 
3
4
  export const SESSION_COMPOSER_QUEUE_STORAGE_KEY =
@@ -53,6 +54,8 @@ function isQueueItem(value) {
53
54
  value.attachments.every(isAttachmentRef) &&
54
55
  isNonEmptyString(value.agentMode) &&
55
56
  isNonEmptyString(value.toolPermissionMode) &&
57
+ (value.reasoningPreference === undefined || (isReasoningPreference(value.reasoningPreference)
58
+ && value.reasoningPreference.profileId === value.modelPreference?.profileId)) &&
56
59
  (value.modelPreference === null ||
57
60
  (isRecord(value.modelPreference) && isJsonValue(value.modelPreference))),
58
61
  );
@@ -114,6 +117,7 @@ function snapshotQueueItem(item) {
114
117
  agentMode: item?.agentMode,
115
118
  toolPermissionMode: item?.toolPermissionMode,
116
119
  modelPreference: item?.modelPreference ?? null,
120
+ ...(item?.reasoningPreference !== undefined ? { reasoningPreference: item.reasoningPreference } : {}),
117
121
  };
118
122
  if (!isQueueItem(snapshot)) {
119
123
  throw new TypeError("Invalid session composer queue item");
@@ -0,0 +1,28 @@
1
+ export function sessionProjectId(session, deletedProjectIds = []) {
2
+ const projectId = session.projectId || session.project?.id;
3
+ if (deletedProjectIds.includes(projectId)) return undefined;
4
+ return projectId;
5
+ }
6
+
7
+ /** Group by actual project identity without changing session workspace bindings. */
8
+ export function projectSessionDisplayGroups(projects, sessions, deletedProjectIds = []) {
9
+ const deletedProjects = new Set(deletedProjectIds);
10
+ const groups = new Map(projects.filter((project) => !deletedProjects.has(project.id))
11
+ .map((project) => [project.id, { ...project, sessions: [] }]));
12
+ const ordinary = [];
13
+ for (const session of sessions) {
14
+ const projectId = sessionProjectId(session);
15
+ const isOrdinarySession = !projectId || deletedProjects.has(projectId);
16
+ if (isOrdinarySession) {
17
+ ordinary.push(session);
18
+ continue;
19
+ }
20
+ const group = groups.get(projectId) ?? {
21
+ id: projectId, name: session.project?.name || "Project",
22
+ directory: session.project?.directory || "", sessions: [],
23
+ };
24
+ group.sessions.push(session);
25
+ groups.set(projectId, group);
26
+ }
27
+ return { groups: [...groups.values()], ordinary };
28
+ }
@@ -1,15 +1,17 @@
1
- export function sessionSidebarGroup(session, pinnedSessionIds) {
1
+ import { sessionProjectId } from "./session-project-groups.js";
2
+
3
+ export function sessionSidebarGroup(session, pinnedSessionIds, deletedProjectIds = []) {
2
4
  if (pinnedSessionIds.includes(session.id)) return "pinned";
3
- const projectId = session.projectId || session.project?.id;
5
+ const projectId = sessionProjectId(session, deletedProjectIds);
4
6
  if (projectId) return `project:${projectId}`;
5
7
  return "ordinary";
6
8
  }
7
9
 
8
- export function canReorderSidebarSessions(source, target, pinnedSessionIds) {
10
+ export function canReorderSidebarSessions(source, target, pinnedSessionIds, deletedProjectIds = []) {
9
11
  if (!source || !target) return false;
10
12
  if (source.id === target.id) return false;
11
- return sessionSidebarGroup(source, pinnedSessionIds) ===
12
- sessionSidebarGroup(target, pinnedSessionIds);
13
+ return sessionSidebarGroup(source, pinnedSessionIds, deletedProjectIds) ===
14
+ sessionSidebarGroup(target, pinnedSessionIds, deletedProjectIds);
13
15
  }
14
16
 
15
17
  export function orderSidebarSessions(sessions, pinnedSessionIds, orderedSessionIds) {
@@ -3,6 +3,7 @@ import type { ToolActivityField } from "./tool-activity-model.js";
3
3
 
4
4
  export interface ToolActivityEvent {
5
5
  fileReference?: ConversationFileReference;
6
+ skillRead?: true;
6
7
  name: string;
7
8
  tool: string;
8
9
  activityTitle?: string;
@@ -198,6 +198,7 @@ export function projectToolActivityEvent(message) {
198
198
  const activity = skill ?? automationActivityFields(meta, tool);
199
199
  return {
200
200
  ...(fileReference ? { fileReference } : {}),
201
+ ...(skill?.skillRead ? { skillRead: true } : {}),
201
202
  ...(activity?.activityTitle ? { activityTitle: activity.activityTitle } : {}),
202
203
  name,
203
204
  tool,
@@ -6,6 +6,7 @@ export interface ToolActivityField {
6
6
 
7
7
  export interface ConversationToolAction {
8
8
  fileReference?: ConversationFileReference;
9
+ skillRead?: true;
9
10
  id: string;
10
11
  tool: string;
11
12
  executorRole?: string;
@@ -95,6 +95,7 @@ function applyPhase(action, evidence) {
95
95
 
96
96
  function applyEvidence(action, evidence) {
97
97
  if (evidence.activityTitle) action.title = evidence.activityTitle;
98
+ if (evidence.skillRead) action.skillRead = true;
98
99
  if (isSettledToolEvent(evidence)) delete action.fileReference;
99
100
  if (evidence.fileReference) action.fileReference = evidence.fileReference;
100
101
  if (evidence.executorRole) action.executorRole = evidence.executorRole;
@@ -0,0 +1,45 @@
1
+ /** Window-local drafts belong to the exact action, never to a conversation outbox. */
2
+ export function approvalRejectionIdentity(approval) {
3
+ return JSON.stringify([
4
+ approval.environmentId,
5
+ approval.sessionId,
6
+ approval.requestId,
7
+ approval.approvalId,
8
+ approval.generation,
9
+ approval.waitId,
10
+ ]);
11
+ }
12
+
13
+ export function createApprovalRejectionDrafts() {
14
+ const drafts = new Map();
15
+
16
+ function get(approval) {
17
+ const key = approvalRejectionIdentity(approval);
18
+ if (!drafts.has(key)) drafts.set(key, { text: "", expanded: false });
19
+ return drafts.get(key);
20
+ }
21
+
22
+ function promoteBoundApprovalDraft(approval) {
23
+ const key = approvalRejectionIdentity(approval);
24
+ if (drafts.has(key)) return;
25
+ const liveKey = approvalRejectionIdentity({
26
+ ...approval,
27
+ generation: undefined,
28
+ waitId: undefined,
29
+ });
30
+ const liveDraft = drafts.get(liveKey);
31
+ if (!liveDraft) return;
32
+ drafts.set(key, liveDraft);
33
+ drafts.delete(liveKey);
34
+ }
35
+
36
+ function retain(approvals) {
37
+ for (const approval of approvals) promoteBoundApprovalDraft(approval);
38
+ const pending = new Set(approvals.map(approvalRejectionIdentity));
39
+ for (const key of drafts.keys()) {
40
+ if (!pending.has(key)) drafts.delete(key);
41
+ }
42
+ }
43
+
44
+ return { get, retain, clear: () => drafts.clear() };
45
+ }
@@ -46,5 +46,5 @@ export function skillActivityFields(meta, tool, completed, ok) {
46
46
  ? boundedSkillText(meta.skillTitle, 160)
47
47
  : "";
48
48
  if (skillId) sent.push({ label: action === "read_skills" ? "Skill references" : referenceLabel, value: skillId });
49
- return { activityTitle, target: skillTitle || boundedSkillText(meta.skillName, 160) || skillId, sent };
49
+ return { activityTitle, target: skillTitle || boundedSkillText(meta.skillName, 160) || skillId, sent, skillRead: readAction };
50
50
  }
@@ -17,8 +17,13 @@ export function createNotificationsFeature({ dom, state, client, shell, getEnvir
17
17
  let environmentRevision = 0;
18
18
  const homeEntry = createHomeNotificationsEntry({
19
19
  homePanel: dom.homeWorkspacePanel,
20
- onOpen: () => {
21
- if (!shell.activateWorkspace("notifications")) return;
20
+ onOpen: async () => {
21
+ const environment = getEnvironmentId();
22
+ const revision = environmentRevision;
23
+ const activate = await shell.prepareWorkspaceActivation("notifications");
24
+ if (!activate || revision !== environmentRevision) return;
25
+ if (environment !== getEnvironmentId()) return;
26
+ if (!activate()) return;
22
27
  controller.setFilter("unread");
23
28
  },
24
29
  });
@@ -53,14 +58,17 @@ export function createNotificationsFeature({ dom, state, client, shell, getEnvir
53
58
  if (!source) return;
54
59
  const environmentVersion = environmentRevision;
55
60
  const navigationVersion = shell.navigationRevision();
61
+ const navigationRequest = shell.navigationRequestRevision?.();
56
62
  await controller.markRead(item.id, true);
57
63
  if (!canOpenNotificationSource(item)) return;
58
64
  if (environmentVersion !== environmentRevision) return;
59
65
  if (navigationVersion !== shell.navigationRevision()) return;
66
+ if (navigationRequest !== shell.navigationRequestRevision?.()) return;
60
67
  if (await openCompanionSource(item, source)) return;
61
68
  if (!canOpenNotificationSource(item)) return;
62
69
  if (environmentVersion !== environmentRevision) return;
63
70
  if (navigationVersion !== shell.navigationRevision()) return;
71
+ if (navigationRequest !== shell.navigationRequestRevision?.()) return;
64
72
  window.location.assign(source);
65
73
  }
66
74
  function refreshAvailability() {
@@ -47,8 +47,8 @@ export function createPassiveLearningFeature({
47
47
  home = createPassiveLearningHome({
48
48
  actions,
49
49
  openLearning,
50
- openSetup: () => {
51
- if (openLearning() === false) return;
50
+ openSetup: async () => {
51
+ if (await openLearning() === false) return;
52
52
  if (learningRoot) selectLearningView(learningRoot, "settings");
53
53
  },
54
54
  });