@abot-ai/runtime 1.8.0 → 1.9.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 (423) hide show
  1. package/README.md +216 -222
  2. package/dist/scripts/runtime-setup-files.js +46 -2
  3. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
  4. package/dist/src/capabilities/tool-types.d.ts +4 -0
  5. package/dist/src/model-gateway/client/chat.js +9 -5
  6. package/dist/src/model-gateway/client/invocation-error.d.ts +9 -0
  7. package/dist/src/model-gateway/client/invocation-error.js +30 -0
  8. package/dist/src/model-gateway/client/stream-consumer.js +9 -2
  9. package/dist/src/model-gateway/client/stream-parser.js +2 -1
  10. package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
  11. package/dist/src/model-gateway/protocol/message-contract.js +1 -1
  12. package/dist/src/model-gateway/server/chat-handler.js +5 -7
  13. package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
  14. package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
  15. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +5 -1
  16. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +15 -1
  17. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/prepared-execution.js +7 -5
  18. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/prepared-snapshot.js +9 -2
  19. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
  20. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
  21. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
  22. package/dist/src/runtime/automations/service.d.ts +1 -1
  23. package/dist/src/runtime/capabilities/automation-builder/tool-module.js +4 -4
  24. package/dist/src/runtime/capabilities/automations/draft-index.d.ts +1 -1
  25. package/dist/src/runtime/capabilities/automations/tool-module.js +4 -4
  26. package/dist/src/runtime/capabilities/core-tool-contracts.d.ts +29 -0
  27. package/dist/src/runtime/capabilities/core-tool-contracts.js +38 -0
  28. package/dist/src/runtime/capabilities/knowledge-skills/read-many.d.ts +4 -0
  29. package/dist/src/runtime/capabilities/knowledge-skills/read-many.js +21 -0
  30. package/dist/src/runtime/capabilities/knowledge-skills/read-targets.d.ts +13 -0
  31. package/dist/src/runtime/capabilities/knowledge-skills/read-targets.js +44 -0
  32. package/dist/src/runtime/capabilities/knowledge-skills/tool-contract.d.ts +141 -0
  33. package/dist/src/runtime/capabilities/knowledge-skills/tool-contract.js +58 -0
  34. package/dist/src/runtime/capabilities/knowledge-skills/tool-module.d.ts +4 -0
  35. package/dist/src/runtime/capabilities/knowledge-skills/tool-module.js +78 -0
  36. package/dist/src/runtime/capabilities/knowledge-skills/tool-output.d.ts +12 -0
  37. package/dist/src/runtime/capabilities/knowledge-skills/tool-output.js +21 -0
  38. package/dist/src/runtime/capabilities/knowledge-skills/write-contract.d.ts +77 -0
  39. package/dist/src/runtime/capabilities/knowledge-skills/write-contract.js +28 -0
  40. package/dist/src/runtime/capabilities/knowledge-skills/write-operations.d.ts +3 -0
  41. package/dist/src/runtime/capabilities/knowledge-skills/write-operations.js +34 -0
  42. package/dist/src/runtime/capabilities/scheduling/tool-module.js +3 -3
  43. package/dist/src/runtime/capabilities/tool-availability.js +6 -0
  44. package/dist/src/runtime/composition.d.ts +5 -0
  45. package/dist/src/runtime/context/capability-brief.d.ts +2 -2
  46. package/dist/src/runtime/context/capability-brief.js +3 -3
  47. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
  48. package/dist/src/runtime/context/capability-descriptions.js +57 -20
  49. package/dist/src/runtime/context/capability-result-compaction-source.d.ts +3 -1
  50. package/dist/src/runtime/context/capability-result-compaction-source.js +13 -1
  51. package/dist/src/runtime/context/core-skill-read-context.d.ts +16 -0
  52. package/dist/src/runtime/context/core-skill-read-context.js +76 -0
  53. package/dist/src/runtime/context/exact-evidence-match.d.ts +3 -0
  54. package/dist/src/runtime/context/exact-evidence-match.js +34 -0
  55. package/dist/src/runtime/context/model-step-compaction.js +20 -6
  56. package/dist/src/runtime/context/semantic-compaction/core-skill-read-source.d.ts +9 -0
  57. package/dist/src/runtime/context/semantic-compaction/core-skill-read-source.js +38 -0
  58. package/dist/src/runtime/context/semantic-compaction/generation-contracts.d.ts +2 -0
  59. package/dist/src/runtime/context/semantic-compaction/prompt.js +7 -7
  60. package/dist/src/runtime/context/semantic-compaction/run.js +10 -3
  61. package/dist/src/runtime/context/semantic-compaction/super-source-integrity.js +33 -3
  62. package/dist/src/runtime/context/session-artifact-paths.d.ts +2 -1
  63. package/dist/src/runtime/context/session-artifact-paths.js +2 -1
  64. package/dist/src/runtime/context/session-memory/model-step-controller.d.ts +2 -2
  65. package/dist/src/runtime/context/super-worker-compaction-failure.d.ts +1 -1
  66. package/dist/src/runtime/context/super-worker-compaction-failure.js +2 -1
  67. package/dist/src/runtime/context/super-worker-compaction-sidecar.d.ts +2 -1
  68. package/dist/src/runtime/context/super-worker-compaction-sidecar.js +9 -3
  69. package/dist/src/runtime/default-environment-adapters.d.ts +2 -1
  70. package/dist/src/runtime/default-environment-adapters.js +5 -1
  71. package/dist/src/runtime/knowledge-skills/available-skills-projection.d.ts +17 -0
  72. package/dist/src/runtime/knowledge-skills/available-skills-projection.js +66 -0
  73. package/dist/src/runtime/knowledge-skills/available-skills.d.ts +7 -0
  74. package/dist/src/runtime/knowledge-skills/available-skills.js +17 -0
  75. package/dist/src/runtime/knowledge-skills/builtins/abot-studio.d.ts +2 -0
  76. package/dist/src/runtime/knowledge-skills/builtins/abot-studio.js +27 -0
  77. package/dist/src/runtime/knowledge-skills/builtins/computer-use.d.ts +2 -0
  78. package/dist/src/runtime/knowledge-skills/builtins/computer-use.js +34 -0
  79. package/dist/src/runtime/knowledge-skills/builtins/skill-creator.d.ts +2 -0
  80. package/dist/src/runtime/knowledge-skills/builtins/skill-creator.js +29 -0
  81. package/dist/src/runtime/knowledge-skills/builtins/technical-work.d.ts +2 -0
  82. package/dist/src/runtime/knowledge-skills/builtins/technical-work.js +27 -0
  83. package/dist/src/runtime/knowledge-skills/catalog.d.ts +2 -0
  84. package/dist/src/runtime/knowledge-skills/catalog.js +12 -0
  85. package/dist/src/runtime/knowledge-skills/personal-contracts.d.ts +48 -0
  86. package/dist/src/runtime/knowledge-skills/personal-contracts.js +29 -0
  87. package/dist/src/runtime/knowledge-skills/personal-documents.d.ts +6 -0
  88. package/dist/src/runtime/knowledge-skills/personal-documents.js +56 -0
  89. package/dist/src/runtime/knowledge-skills/personal-management.d.ts +9 -0
  90. package/dist/src/runtime/knowledge-skills/personal-management.js +64 -0
  91. package/dist/src/runtime/knowledge-skills/personal-repository.d.ts +6 -0
  92. package/dist/src/runtime/knowledge-skills/personal-repository.js +76 -0
  93. package/dist/src/runtime/knowledge-skills/personal-store.d.ts +4 -0
  94. package/dist/src/runtime/knowledge-skills/personal-store.js +33 -0
  95. package/dist/src/runtime/knowledge-skills/read-evidence.d.ts +3 -0
  96. package/dist/src/runtime/knowledge-skills/read-evidence.js +13 -0
  97. package/dist/src/runtime/knowledge-skills/store.d.ts +19 -0
  98. package/dist/src/runtime/knowledge-skills/store.js +41 -0
  99. package/dist/src/runtime/local-application.d.ts +2 -1
  100. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -0
  101. package/dist/src/runtime/local-host/app-service-dispatch.js +5 -0
  102. package/dist/src/runtime/local-host/client-services.d.ts +3 -1
  103. package/dist/src/runtime/local-host/client-services.js +3 -2
  104. package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +7 -1
  105. package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
  106. package/dist/src/runtime/long-term-memory/conversation-authoring/plain-text-context.d.ts +5 -0
  107. package/dist/src/runtime/long-term-memory/conversation-authoring/plain-text-context.js +28 -0
  108. package/dist/src/runtime/long-term-memory/initial-context.d.ts +18 -0
  109. package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
  110. package/dist/src/runtime/long-term-memory/projection.js +1 -1
  111. package/dist/src/runtime/model/context-compaction-admission.d.ts +1 -0
  112. package/dist/src/runtime/model/context-compaction-admission.js +35 -1
  113. package/dist/src/runtime/model/context-compaction-contracts.d.ts +9 -1
  114. package/dist/src/runtime/model/invoke-step.js +6 -2
  115. package/dist/src/runtime/model/provider-failure.d.ts +13 -0
  116. package/dist/src/runtime/model/provider-failure.js +37 -0
  117. package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
  118. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +4 -1
  119. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
  120. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +7 -3
  121. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +3 -0
  122. package/dist/src/runtime/orchestration/role-calls/command-dispatch/skill-read-transition.d.ts +4 -0
  123. package/dist/src/runtime/orchestration/role-calls/command-dispatch/skill-read-transition.js +48 -0
  124. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +3 -0
  125. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +8 -4
  126. package/dist/src/runtime/orchestration/role-calls/contracts.js +3 -3
  127. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
  128. package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
  129. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
  130. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
  131. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
  132. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  133. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
  134. package/dist/src/runtime/orchestration/role-calls/skill-read.d.ts +47 -0
  135. package/dist/src/runtime/orchestration/role-calls/skill-read.js +196 -0
  136. package/dist/src/runtime/orchestration/role-executors/activation/model-output-failure.d.ts +1 -1
  137. package/dist/src/runtime/orchestration/role-executors/activation/model-output-failure.js +4 -2
  138. package/dist/src/runtime/orchestration/worker-capabilities/binding/create-binding.js +4 -1
  139. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +4 -2
  140. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +2 -2
  141. package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +10 -4
  142. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
  143. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
  144. package/dist/src/runtime/orchestration/worker-capabilities/payload-compaction-transport.d.ts +2 -0
  145. package/dist/src/runtime/orchestration/worker-capabilities/payload-compaction-transport.js +7 -2
  146. package/dist/src/runtime/orchestration/worker-capabilities/supervisor-skill-authority.d.ts +19 -0
  147. package/dist/src/runtime/orchestration/worker-capabilities/supervisor-skill-authority.js +43 -0
  148. package/dist/src/runtime/plugins/loader.js +7 -6
  149. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  150. package/dist/src/runtime/request/approval-wait/preflight.js +1 -0
  151. package/dist/src/runtime/request/bound-runtime-handler.js +1 -0
  152. package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
  153. package/dist/src/runtime/request/contracts.d.ts +2 -0
  154. package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
  155. package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +2 -2
  156. package/dist/src/runtime/request/execution-scope-surfaces.d.ts +2 -0
  157. package/dist/src/runtime/request/execution-scope-surfaces.js +7 -0
  158. package/dist/src/runtime/request/execution-scope.d.ts +6 -2
  159. package/dist/src/runtime/request/execution-scope.js +11 -0
  160. package/dist/src/runtime/request/payload-settled-evidence.d.ts +11 -0
  161. package/dist/src/runtime/request/payload-settled-evidence.js +29 -0
  162. package/dist/src/runtime/request/prepared-execution.js +2 -0
  163. package/dist/src/runtime/request/role-call-delegation-events.d.ts +19 -0
  164. package/dist/src/runtime/request/role-call-delegation-events.js +52 -0
  165. package/dist/src/runtime/request/role-call-return-events.d.ts +19 -0
  166. package/dist/src/runtime/request/role-call-return-events.js +63 -0
  167. package/dist/src/runtime/request/role-executor-composition.js +2 -2
  168. package/dist/src/runtime/request/root-capability-binding.d.ts +24 -0
  169. package/dist/src/runtime/request/root-capability-binding.js +57 -0
  170. package/dist/src/runtime/request/root-capability-catalog.d.ts +16 -0
  171. package/dist/src/runtime/request/root-capability-catalog.js +20 -0
  172. package/dist/src/runtime/request/root-contract.d.ts +13 -1
  173. package/dist/src/runtime/request/root-execution-kernel.js +36 -68
  174. package/dist/src/runtime/request/root-reference-action.d.ts +15 -0
  175. package/dist/src/runtime/request/root-reference-action.js +48 -0
  176. package/dist/src/runtime/request/root-skill-read.d.ts +13 -0
  177. package/dist/src/runtime/request/root-skill-read.js +102 -0
  178. package/dist/src/runtime/request/runner.js +19 -3
  179. package/dist/src/runtime/request/super-payload-context-failure.js +13 -4
  180. package/dist/src/runtime/request/supervisor-root-execution.js +54 -1
  181. package/dist/src/runtime/request/supervisor-skill-edit-target.d.ts +9 -0
  182. package/dist/src/runtime/request/supervisor-skill-edit-target.js +25 -0
  183. package/dist/src/runtime/request/supervisor-skill-payload-context.d.ts +21 -0
  184. package/dist/src/runtime/request/supervisor-skill-payload-context.js +91 -0
  185. package/dist/src/runtime/request/supervisor-skill-write-preparation.d.ts +25 -0
  186. package/dist/src/runtime/request/supervisor-skill-write-preparation.js +71 -0
  187. package/dist/src/runtime/request/worker-capability-composition.d.ts +4 -1
  188. package/dist/src/runtime/request/worker-capability-composition.js +4 -1
  189. package/dist/src/runtime/request/worker-capability-payload.d.ts +1 -1
  190. package/dist/src/runtime/request/worker-capability-payload.js +44 -37
  191. package/dist/src/runtime/runtime-environment.d.ts +2 -0
  192. package/dist/src/runtime/runtime-environment.js +12 -1
  193. package/dist/src/runtime/scheduler/contracts.d.ts +4 -0
  194. package/dist/src/runtime/scheduler/run-list-filter.d.ts +11 -0
  195. package/dist/src/runtime/scheduler/run-list-filter.js +56 -0
  196. package/dist/src/runtime/scheduler/run-list-query.d.ts +2 -2
  197. package/dist/src/runtime/scheduler/run-list-query.js +4 -1
  198. package/dist/src/runtime/steps/auditor-decision/contracts.d.ts +2 -0
  199. package/dist/src/runtime/steps/auditor-decision/evidence-representation.d.ts +2 -2
  200. package/dist/src/runtime/steps/auditor-decision/evidence-representation.js +2 -34
  201. package/dist/src/runtime/steps/auditor-decision/input.js +21 -3
  202. package/dist/src/runtime/steps/auditor-decision/projection.js +5 -0
  203. package/dist/src/runtime/steps/auditor-decision/prompt.d.ts +1 -1
  204. package/dist/src/runtime/steps/auditor-decision/prompt.js +14 -3
  205. package/dist/src/runtime/steps/capability-execution-guidance.d.ts +7 -0
  206. package/dist/src/runtime/steps/capability-execution-guidance.js +28 -0
  207. package/dist/src/runtime/steps/capability-execution-instructions.d.ts +0 -2
  208. package/dist/src/runtime/steps/capability-execution-instructions.js +0 -2
  209. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +5 -2
  210. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +22 -3
  211. package/dist/src/runtime/steps/execution-agent/compaction.d.ts +3 -2
  212. package/dist/src/runtime/steps/execution-agent/compaction.js +9 -1
  213. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
  214. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
  215. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
  216. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
  217. package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
  218. package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
  219. package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
  220. package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
  221. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
  222. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
  223. package/dist/src/runtime/steps/execution-agent/format.js +2 -0
  224. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
  225. package/dist/src/runtime/steps/execution-agent/input.js +35 -2
  226. package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
  227. package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
  228. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  229. package/dist/src/runtime/steps/execution-agent/prompt.js +42 -41
  230. package/dist/src/runtime/steps/execution-agent/refinement-input.d.ts +1 -0
  231. package/dist/src/runtime/steps/execution-agent/refinement-prompt.js +4 -1
  232. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  233. package/dist/src/runtime/steps/execution-agent/response-run.js +6 -12
  234. package/dist/src/runtime/steps/execution-agent/run.js +5 -2
  235. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  236. package/dist/src/runtime/steps/execution-agent/state-context.js +3 -40
  237. package/dist/src/runtime/steps/knowledge-skill-instructions.d.ts +3 -0
  238. package/dist/src/runtime/steps/knowledge-skill-instructions.js +3 -0
  239. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +4 -2
  240. package/dist/src/runtime/steps/planner-decision/capability-brief.js +5 -1
  241. package/dist/src/runtime/steps/planner-decision/input.d.ts +2 -2
  242. package/dist/src/runtime/steps/planner-decision/input.js +7 -1
  243. package/dist/src/runtime/steps/planner-decision/prompt.js +29 -49
  244. package/dist/src/runtime/steps/planner-graph/input.d.ts +2 -2
  245. package/dist/src/runtime/steps/planner-graph/input.js +9 -8
  246. package/dist/src/runtime/steps/planner-graph/prompt.js +2 -2
  247. package/dist/src/runtime/steps/planner-graph/run.d.ts +2 -2
  248. package/dist/src/runtime/steps/planner-graph/run.js +5 -5
  249. package/dist/src/runtime/steps/planner-graph/skill-guidance.d.ts +5 -0
  250. package/dist/src/runtime/steps/planner-graph/skill-guidance.js +62 -0
  251. package/dist/src/runtime/steps/reviewer-decision/final-evidence.d.ts +1 -0
  252. package/dist/src/runtime/steps/reviewer-decision/final-evidence.js +3 -1
  253. package/dist/src/runtime/steps/reviewer-decision/input.d.ts +3 -1
  254. package/dist/src/runtime/steps/reviewer-decision/input.js +2 -22
  255. package/dist/src/runtime/steps/reviewer-decision/model-context.d.ts +21 -0
  256. package/dist/src/runtime/steps/reviewer-decision/model-context.js +32 -1
  257. package/dist/src/runtime/steps/reviewer-decision/projection.js +4 -0
  258. package/dist/src/runtime/steps/reviewer-decision/prompt.d.ts +1 -1
  259. package/dist/src/runtime/steps/reviewer-decision/prompt.js +15 -4
  260. package/dist/src/runtime/steps/reviewer-decision/run.d.ts +2 -0
  261. package/dist/src/runtime/steps/reviewer-decision/run.js +6 -0
  262. package/dist/src/runtime/steps/skill-read-decision.d.ts +34 -0
  263. package/dist/src/runtime/steps/skill-read-decision.js +91 -0
  264. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.d.ts +22 -0
  265. package/dist/src/runtime/steps/supervisor-decision/artifact-paths.js +132 -0
  266. package/dist/src/runtime/steps/supervisor-decision/capability-brief.d.ts +2 -0
  267. package/dist/src/runtime/steps/supervisor-decision/capability-brief.js +9 -2
  268. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +12 -3
  269. package/dist/src/runtime/steps/supervisor-decision/contracts.js +3 -0
  270. package/dist/src/runtime/steps/supervisor-decision/decision-phases.d.ts +37 -0
  271. package/dist/src/runtime/steps/supervisor-decision/decision-phases.js +124 -0
  272. package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +5 -1
  273. package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +4 -0
  274. package/dist/src/runtime/steps/supervisor-decision/format.d.ts +1 -0
  275. package/dist/src/runtime/steps/supervisor-decision/format.js +2 -0
  276. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +8 -1
  277. package/dist/src/runtime/steps/supervisor-decision/input.js +35 -11
  278. package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +1 -0
  279. package/dist/src/runtime/steps/supervisor-decision/parser.js +11 -0
  280. package/dist/src/runtime/steps/supervisor-decision/preparation-input.d.ts +26 -0
  281. package/dist/src/runtime/steps/supervisor-decision/preparation-input.js +39 -0
  282. package/dist/src/runtime/steps/supervisor-decision/preparation.d.ts +17 -0
  283. package/dist/src/runtime/steps/supervisor-decision/preparation.js +65 -0
  284. package/dist/src/runtime/steps/supervisor-decision/presentation.d.ts +13 -0
  285. package/dist/src/runtime/steps/supervisor-decision/presentation.js +47 -0
  286. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +5 -0
  287. package/dist/src/runtime/steps/supervisor-decision/prompt.js +97 -106
  288. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +2 -0
  289. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +2 -0
  290. package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +3 -0
  291. package/dist/src/runtime/steps/supervisor-decision/resume.js +20 -0
  292. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +7 -0
  293. package/dist/src/runtime/steps/supervisor-decision/run.js +76 -158
  294. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.d.ts +21 -0
  295. package/dist/src/runtime/steps/supervisor-decision/skill-selection-input.js +29 -0
  296. package/dist/src/runtime/steps/supervisor-decision/skill-selection.d.ts +16 -0
  297. package/dist/src/runtime/steps/supervisor-decision/skill-selection.js +44 -0
  298. package/dist/src/runtime/steps/supervisor-response/input.d.ts +3 -0
  299. package/dist/src/runtime/steps/supervisor-response/input.js +5 -0
  300. package/dist/src/runtime/steps/supervisor-response/prompt.js +2 -0
  301. package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +3 -0
  302. package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +24 -4
  303. package/dist/src/runtime/steps/supervisor-response/run.d.ts +7 -0
  304. package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
  305. package/dist/src/runtime/steps/supervisor-skill-authoring/contract.d.ts +43 -0
  306. package/dist/src/runtime/steps/supervisor-skill-authoring/contract.js +85 -0
  307. package/dist/src/runtime/steps/supervisor-skill-authoring/input.d.ts +35 -0
  308. package/dist/src/runtime/steps/supervisor-skill-authoring/input.js +87 -0
  309. package/dist/src/runtime/steps/supervisor-skill-authoring/run.d.ts +10 -0
  310. package/dist/src/runtime/steps/supervisor-skill-authoring/run.js +35 -0
  311. package/dist/src/runtime/steps/supervisor-skill-instructions.d.ts +4 -0
  312. package/dist/src/runtime/steps/supervisor-skill-instructions.js +4 -0
  313. package/dist/src/runtime/steps/worker-capability-scope-decision.js +14 -1
  314. package/dist/src/runtime/steps/worker-decision/contracts.d.ts +1 -0
  315. package/dist/src/runtime/steps/worker-decision/input/execution-guidance.d.ts +5 -0
  316. package/dist/src/runtime/steps/worker-decision/input/execution-guidance.js +31 -0
  317. package/dist/src/runtime/steps/worker-decision/input/prompt-context.js +2 -25
  318. package/dist/src/runtime/steps/worker-decision/input/reference-context.js +4 -0
  319. package/dist/src/runtime/steps/worker-decision/prompt.js +6 -2
  320. package/dist/src/runtime/steps/worker-decision/result-author.js +6 -0
  321. package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
  322. package/dist/src/web-ui/app/app-bootstrap.js +3 -0
  323. package/dist/src/web-ui/app/app.js +7 -1
  324. package/dist/src/web-ui/app/components/automations/run-history-controls.js +77 -0
  325. package/dist/src/web-ui/app/components/automations/run-history.js +55 -0
  326. package/dist/src/web-ui/app/components/automations/run.js +3 -8
  327. package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
  328. package/dist/src/web-ui/app/components/automations/workspace.js +11 -2
  329. package/dist/src/web-ui/app/components/conversation-role-cards.js +27 -0
  330. package/dist/src/web-ui/app/components/conversation-role-delegations.d.ts +12 -0
  331. package/dist/src/web-ui/app/components/conversation-role-delegations.js +24 -0
  332. package/dist/src/web-ui/app/components/conversation-role-history.d.ts +13 -0
  333. package/dist/src/web-ui/app/components/conversation-role-history.js +81 -0
  334. package/dist/src/web-ui/app/components/conversation-role-returns.d.ts +12 -0
  335. package/dist/src/web-ui/app/components/conversation-role-returns.js +23 -0
  336. package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
  337. package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
  338. package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
  339. package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
  340. package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
  341. package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
  342. package/dist/src/web-ui/app/components/onboarding-workspace-access.js +1 -1
  343. package/dist/src/web-ui/app/components/operations-summary.js +2 -1
  344. package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
  345. package/dist/src/web-ui/app/components/passive-learning/home.js +4 -1
  346. package/dist/src/web-ui/app/components/schedules/details.js +3 -2
  347. package/dist/src/web-ui/app/components/skills/workspace.js +119 -0
  348. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
  349. package/dist/src/web-ui/app/components/spark-chat/settings.js +1 -1
  350. package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
  351. package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
  352. package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
  353. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +1 -1
  354. package/dist/src/web-ui/app/components/system-host/rendering.js +3 -3
  355. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
  356. package/dist/src/web-ui/app/components/workspace-shell.js +11 -1
  357. package/dist/src/web-ui/app/computer-access-feature.js +13 -1
  358. package/dist/src/web-ui/app/configuration-feature.js +2 -0
  359. package/dist/src/web-ui/app/controllers/automation-read-projection.js +8 -4
  360. package/dist/src/web-ui/app/controllers/automation-run-actions.js +3 -1
  361. package/dist/src/web-ui/app/controllers/automation-run-history.js +159 -0
  362. package/dist/src/web-ui/app/controllers/automations-controller.js +27 -11
  363. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +6 -2
  364. package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
  365. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +22 -1
  366. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +1 -1
  367. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +7 -1
  368. package/dist/src/web-ui/app/controllers/skills-controller.js +237 -0
  369. package/dist/src/web-ui/app/dashboard-feature.js +9 -0
  370. package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +5 -0
  371. package/dist/src/web-ui/app/lib/conversation-role-model.js +63 -5
  372. package/dist/src/web-ui/app/lib/event-presentation.js +34 -0
  373. package/dist/src/web-ui/app/lib/reasoning-controls.js +6 -1
  374. package/dist/src/web-ui/app/lib/role-delegation-event.d.ts +18 -0
  375. package/dist/src/web-ui/app/lib/role-delegation-event.js +47 -0
  376. package/dist/src/web-ui/app/lib/role-return-event.d.ts +19 -0
  377. package/dist/src/web-ui/app/lib/role-return-event.js +36 -0
  378. package/dist/src/web-ui/app/lib/tool-activity-event.js +8 -6
  379. package/dist/src/web-ui/app/lib/tool-skill-activity-fields.js +50 -0
  380. package/dist/src/web-ui/app/lib/workspace-route.js +1 -0
  381. package/dist/src/web-ui/app/passive-learning-feature.js +2 -2
  382. package/dist/src/web-ui/app/services/runtime-web-client/automations.d.ts +9 -1
  383. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  384. package/dist/src/web-ui/app/services/runtime-web-client/skills.js +23 -0
  385. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  386. package/dist/src/web-ui/app/skills-feature.js +36 -0
  387. package/dist/src/web-ui/app/styles/24-conversation-role-cards.css +58 -0
  388. package/dist/src/web-ui/app/styles/40-skills.css +34 -0
  389. package/dist/src/web-ui/app/styles/50-automations.css +24 -3
  390. package/dist/src/web-ui/app/styles/95-home-widgets.css +110 -0
  391. package/dist/src/web-ui/app/styles.css +2 -0
  392. package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
  393. package/dist/src/web-ui/app/ui-behavior.js +1 -0
  394. package/dist/src/web-ui/client-state/store.js +3 -2
  395. package/dist/src/web-ui/client-state/transaction-order.d.ts +2 -0
  396. package/dist/src/web-ui/client-state/transaction-order.js +18 -0
  397. package/dist/src/web-ui/local-runtime/api-router.d.ts +1 -0
  398. package/dist/src/web-ui/local-runtime/api-router.js +7 -0
  399. package/dist/src/web-ui/local-runtime/automation-routes.js +2 -1
  400. package/dist/src/web-ui/local-runtime/automation-run-page.d.ts +5 -0
  401. package/dist/src/web-ui/local-runtime/automation-run-page.js +26 -0
  402. package/dist/src/web-ui/local-runtime/skill-management-routes.d.ts +18 -0
  403. package/dist/src/web-ui/local-runtime/skill-management-routes.js +118 -0
  404. package/docs/configuration.md +8 -0
  405. package/docs/plugins.md +37 -32
  406. package/docs/runtime-public-contracts.md +37 -0
  407. package/examples/request-runner.config.example.json +3 -0
  408. package/package.json +1 -1
  409. package/plugins/capability-brief/plugin.json +1 -1
  410. package/plugins/code-outline/plugin.json +1 -1
  411. package/plugins/document-reader/plugin.json +1 -1
  412. package/plugins/exec/plugin.json +1 -1
  413. package/plugins/filesystem/plugin.json +1 -1
  414. package/plugins/json-inspector/plugin.json +1 -1
  415. package/plugins/local-search/plugin.json +1 -1
  416. package/plugins/memory/plugin.json +1 -1
  417. package/plugins/project-orientation/plugin.json +1 -1
  418. package/plugins/system/plugin.json +1 -1
  419. package/plugins/system-probe/plugin.json +1 -1
  420. package/plugins/web/plugin.json +1 -1
  421. package/plugins/web/skills/web_fetch_skill/SKILL.md +1 -2
  422. package/plugins/web/skills/web_search_skill/SKILL.md +3 -7
  423. package/src/runtime/README.md +96 -1
@@ -0,0 +1,77 @@
1
+ import { revealSelectedAutomationRun } from "./run-history.js";
2
+
3
+ function readFilterFields(form) {
4
+ return Object.fromEntries(["status", "from", "to"].map((name) =>
5
+ [name, form.querySelector(`[name="${name}"]`)?.value || ""]));
6
+ }
7
+
8
+ function canScrollForMore(snapshot, list) {
9
+ if (!snapshot.runsNextCursor || snapshot.runsLoading || snapshot.runsError) return false;
10
+ if (list.clientHeight <= 0) return false;
11
+ return list.scrollHeight - list.scrollTop - list.clientHeight <= 80;
12
+ }
13
+
14
+ export function createAutomationRunHistoryControls({ root, actions }) {
15
+ let current = {};
16
+ let appliedKey = "";
17
+ let filterDraft = null;
18
+ let pendingLoad = null;
19
+ let resetScroll = false;
20
+
21
+ async function loadMore() {
22
+ if (pendingLoad || current.runsLoading) return;
23
+ const pending = {};
24
+ pendingLoad = pending;
25
+ try {
26
+ if (current.runsError) await actions.retryRunHistory();
27
+ else await actions.loadMoreRuns();
28
+ } finally { if (pendingLoad === pending) pendingLoad = null; }
29
+ }
30
+
31
+ function captureFilters(event) {
32
+ const form = event.target.closest("[data-run-history-filters]");
33
+ if (form) filterDraft = readFilterFields(form);
34
+ }
35
+ root.addEventListener("input", captureFilters);
36
+ root.addEventListener("change", captureFilters);
37
+ root.addEventListener("submit", (event) => {
38
+ const form = event.target.closest("[data-run-history-filters]");
39
+ if (!form) return;
40
+ event.preventDefault();
41
+ filterDraft = readFilterFields(form);
42
+ resetScroll = true;
43
+ void actions.setRunFilters(filterDraft);
44
+ });
45
+ root.addEventListener("click", (event) => {
46
+ if (event.target.closest("[data-load-more-runs]")) void loadMore();
47
+ if (event.target.closest("[data-reset-run-history]")) {
48
+ filterDraft = null;
49
+ resetScroll = true;
50
+ void actions.resetRunHistory();
51
+ }
52
+ });
53
+ root.addEventListener("scroll", (event) => {
54
+ const list = root.querySelector("#automation-run-history-list");
55
+ if (event.target !== list || !list) return;
56
+ if (canScrollForMore(current, list)) void loadMore();
57
+ }, true);
58
+
59
+ function sync(snapshot, { viewChanged = false, focus = false } = {}) {
60
+ current = snapshot;
61
+ const nextKey = JSON.stringify([snapshot.selectedAutomationId, snapshot.runsFilters || {}]);
62
+ const filtersChanged = nextKey !== appliedKey;
63
+ if (filtersChanged) { filterDraft = null; pendingLoad = null; appliedKey = nextKey; }
64
+ const form = root.querySelector("[data-run-history-filters]");
65
+ if (form && filterDraft) {
66
+ for (const [name, value] of Object.entries(filterDraft)) {
67
+ const input = form.querySelector(`[name="${name}"]`);
68
+ if (input) input.value = value;
69
+ }
70
+ }
71
+ const list = root.querySelector("#automation-run-history-list");
72
+ if (list && (filtersChanged || resetScroll)) list.scrollTop = 0;
73
+ resetScroll = false;
74
+ if (viewChanged) revealSelectedAutomationRun(root, { focus });
75
+ }
76
+ return { sync };
77
+ }
@@ -0,0 +1,55 @@
1
+ import { escapeHtml, formatTime } from "../../lib/text-format.js";
2
+
3
+ const RUN_STATUSES = ["pending", "running", "stopping", "succeeded", "completed_with_skips", "failed", "cancelled", "interrupted", "missed"];
4
+
5
+ function renderHistoryFilters(snapshot) {
6
+ const filters = snapshot.runsFilters || {};
7
+ return `<form class="automation-run-filters" data-run-history-filters id="automation-run-history-filters">
8
+ <label>Status<select name="status" id="automation-run-status-filter"><option value="">All statuses</option>${RUN_STATUSES.map((status) => `<option value="${status}"${filters.status === status ? " selected" : ""}>${escapeHtml(status.replaceAll("_", " "))}</option>`).join("")}</select></label>
9
+ <label>Scheduled from<input type="date" name="from" id="automation-run-date-from" value="${escapeHtml(filters.from || "")}" aria-describedby="automation-run-date-help"></label>
10
+ <label>Through<input type="date" name="to" id="automation-run-date-to" value="${escapeHtml(filters.to || "")}" aria-describedby="automation-run-date-help"></label>
11
+ <button type="submit"${snapshot.runsLoading ? " disabled" : ""}>Apply</button>
12
+ <button type="button" data-reset-run-history${snapshot.runsLoading ? " disabled" : ""}>Newest</button>
13
+ <small id="automation-run-date-help">Scheduled dates in your local time.</small>
14
+ </form>`;
15
+ }
16
+
17
+ function renderHistoryRow(run, selectedRunId) {
18
+ const status = run.status || "unknown";
19
+ return `<button type="button" data-select-run="${escapeHtml(run.id)}" data-run-id="${escapeHtml(run.id)}" aria-current="${run.id === selectedRunId}">
20
+ <span class="automation-run-time">${escapeHtml(formatTime(run.scheduledAt || run.startedAt || run.createdAt) || "Run")}</span>
21
+ <span class="automation-run-status" data-status="${escapeHtml(status)}">${escapeHtml(status.replaceAll("_", " "))}</span>
22
+ </button>`;
23
+ }
24
+
25
+ export function renderAutomationRunHistory(snapshot) {
26
+ const runs = Array.isArray(snapshot.runs) ? snapshot.runs : [];
27
+ const filtered = Object.values(snapshot.runsFilters || {}).some(Boolean);
28
+ const empty = snapshot.runsLoading ? "Loading runs…" : filtered ? "No runs match these filters." : "No runs yet.";
29
+ const canLoadMore = snapshot.runsNextCursor || snapshot.runsError;
30
+ return `<section class="automation-run-history" aria-labelledby="automation-run-history-heading">
31
+ <h4 id="automation-run-history-heading">Run history <span>${runs.length} loaded</span></h4>
32
+ ${renderHistoryFilters(snapshot)}
33
+ ${snapshot.runsFilterError ? `<p class="automation-run-history-error" role="alert">${escapeHtml(snapshot.runsFilterError)}</p>` : ""}
34
+ <div class="automation-run-choices" id="automation-run-history-list" aria-busy="${Boolean(snapshot.runsLoading)}">${runs.map((run) => renderHistoryRow(run, snapshot.selectedRunId)).join("") || `<p class="automation-muted">${empty}</p>`}</div>
35
+ ${snapshot.selectedRunId && !runs.some((run) => run.id === snapshot.selectedRunId) ? `<p class="automation-muted">The selected report is outside these results and remains open below.</p>` : ""}
36
+ <div class="automation-run-history-footer">
37
+ <span role="status">${snapshot.runsLoading ? "Loading…" : snapshot.runsNextCursor ? "Scroll for older runs" : runs.length ? "All matching runs loaded" : ""}</span>
38
+ ${canLoadMore ? `<button type="button" data-load-more-runs${snapshot.runsLoading ? " disabled" : ""}>${snapshot.runsError ? "Retry" : "Load more"}</button>` : ""}
39
+ </div>
40
+ ${snapshot.runsError ? `<p class="automation-run-history-error" role="alert">${escapeHtml(snapshot.runsError)}</p>` : ""}
41
+ </section>`;
42
+ }
43
+
44
+ export function revealSelectedAutomationRun(root, { focus = false } = {}) {
45
+ const list = root.querySelector("#automation-run-history-list");
46
+ const selected = list?.querySelector('[aria-current="true"]');
47
+ if (!selected) return;
48
+ if (focus) selected.focus({ preventScroll: true });
49
+ const viewport = list.getBoundingClientRect();
50
+ const row = selected.getBoundingClientRect();
51
+ const top = viewport.top + list.clientTop;
52
+ const bottom = top + list.clientHeight;
53
+ if (row.top < top) list.scrollTop += row.top - top;
54
+ else if (row.bottom > bottom) list.scrollTop += row.bottom - bottom;
55
+ }
@@ -1,18 +1,13 @@
1
- import { escapeHtml, formatTime } from "../../lib/text-format.js";
1
+ import { escapeHtml } from "../../lib/text-format.js";
2
2
  import { findAutomationNode, renderAutomationNodeDetails, renderAutomationTimeline } from "./timeline.js";
3
3
  import { renderAutomationReport, renderAutomationStepEvidence } from "./run-report-view.js";
4
4
  import { renderAutomationRunSteps } from "./run-steps-view.js";
5
+ import { renderAutomationRunHistory } from "./run-history.js";
5
6
 
6
7
  function runIsActive(run) {
7
8
  return ["running", "stopping", "pending"].includes(run?.status);
8
9
  }
9
10
 
10
- function renderRunChoices(snapshot) {
11
- const runs = Array.isArray(snapshot.runs) ? snapshot.runs : [];
12
- if (!runs.length) return `<p class="automation-muted">No runs yet.</p>`;
13
- return `<div class="automation-run-choices" aria-label="Recent runs">${runs.map((run) => `<button type="button" data-select-run="${escapeHtml(run.id)}" aria-current="${run.id === snapshot.selectedRunId}">${escapeHtml(formatTime(run.startedAt || run.createdAt) || "Run")} · ${escapeHtml(run.status || "Unknown")}</button>`).join("")}</div>`;
14
- }
15
-
16
11
  export function renderAutomationRun(snapshot, { locked = false } = {}) {
17
12
  const run = snapshot.run;
18
13
  const current = snapshot.automations.find((item) => item.id === snapshot.selectedAutomationId);
@@ -26,7 +21,7 @@ export function renderAutomationRun(snapshot, { locked = false } = {}) {
26
21
  <div class="automation-heading"><div><button type="button" class="automation-text-button" data-action="${locked ? "return-studio" : "editor"}">← ${locked ? "ABot Studio" : "Editor"}</button><h3 dir="auto">${escapeHtml(title)}</h3><p>${run ? `Read-only run${definitionRevision ? ` · Revision ${escapeHtml(definitionRevision)}` : ""}` : "Select a saved run"}</p></div>
27
22
  <div class="automation-actions">${!locked && run ? `<button type="button" data-action="open-chat-run">Open read-only view</button>` : ""}${runIsActive(run) && run?.status !== "stopping" ? `<button type="button" class="automation-stop" data-action="stop">Stop run</button>` : ""}${!locked && run && !runIsActive(run) && current?.status !== "archived" ? `<button type="button" data-action="rerun"${rerunDisabled ? " disabled" : ""}${runPending ? ' aria-busy="true"' : ""}>${runPending ? "Starting…" : "Run again"}</button>` : ""}</div></div>
28
23
  <p class="automation-feedback" role="status" aria-live="polite" data-tone="${snapshot.error ? "error" : ""}">${escapeHtml(snapshot.error || snapshot.feedback || (run ? "Run details loaded." : "Open a run to see its timeline and report."))}</p>
29
- ${locked ? "" : `<div class="automation-tabs" role="tablist"><button type="button" role="tab" aria-selected="false" data-action="editor">Editor</button><button type="button" role="tab" aria-selected="true">Runs</button></div>${renderRunChoices(snapshot)}`}
24
+ ${locked ? "" : `<div class="automation-tabs" role="tablist"><button type="button" role="tab" aria-selected="false" data-action="editor">Editor</button><button type="button" role="tab" aria-selected="true">Runs</button></div>${renderAutomationRunHistory(snapshot)}`}
30
25
  ${run ? `${renderAutomationReport(run)}
31
26
  <div class="automation-run-explorer">${renderAutomationRunSteps(run, snapshot.selectedNodeId, detailId)}
32
27
  ${selectedNode ? `<section class="automation-run-detail" id="${escapeHtml(detailId)}" data-selected-step-result tabindex="-1" aria-label="Selected step result">
@@ -1,3 +1,4 @@
1
+ import { displayReasoningMode } from "../../lib/reasoning-controls.js";
1
2
  import { escapeHtml } from "../../lib/text-format.js";
2
3
  import { renderAutomationToolIdentity } from "./tool-identity.js";
3
4
  import { renderAutomationFailure } from "./failure-presentation.js";
@@ -45,7 +46,7 @@ function nodeIsRunning(node, run) {
45
46
 
46
47
  function nodeMetadata(node) {
47
48
  if (node.kind === "agent") {
48
- return [node.modelProfileId || "Model not selected", node.agentMode || ""].filter(Boolean).join(" · ");
49
+ return [node.modelProfileId || "Model not selected", displayReasoningMode(node.agentMode) || ""].filter(Boolean).join(" · ");
49
50
  }
50
51
  return [node.operation?.toolName, node.operation?.operationId].filter(Boolean).join(" · ") || "Operation not selected";
51
52
  }
@@ -127,7 +128,7 @@ export function renderAutomationNodeDetails(node, run = null) {
127
128
  const record = nodeRunState(run, node.id);
128
129
  const operation = node.kind === "tool"
129
130
  ? `<dt>Operation</dt><dd>${escapeHtml(nodeMetadata(node))}</dd>`
130
- : `<dt>Model</dt><dd>${escapeHtml(node.modelProfileId || "Not selected")}</dd><dt>Role</dt><dd>${escapeHtml(node.agentMode || "Not selected")}</dd>`;
131
+ : `<dt>Model</dt><dd>${escapeHtml(node.modelProfileId || "Not selected")}</dd><dt>Role</dt><dd>${escapeHtml(displayReasoningMode(node.agentMode) || "Not selected")}</dd>`;
131
132
  const prompt = node.kind === "agent" && node.prompt
132
133
  ? `<div class="automation-inspector-prompt"><strong>Prompt</strong><p dir="auto">${escapeHtml(node.prompt)}</p></div>`
133
134
  : "";
@@ -7,6 +7,7 @@ import { readAutomationDefinitionPatch, renderAutomationEditor, renderAutomation
7
7
  import { createAutomationStepEditorDialog } from "./step-editor-dialog.js";
8
8
  import { focusSelectedAutomationStep } from "./run-steps-view.js";
9
9
  import { renderAutomationRun } from "./run.js";
10
+ import { createAutomationRunHistoryControls } from "./run-history-controls.js";
10
11
  import { findAutomationPosition } from "../../lib/automation-graph-position.js";
11
12
  import { canWrapAutomationSequence } from "../../lib/automation-parallel-depth.js";
12
13
  import { createAutomationTimelineCamera } from "./timeline-camera.js";
@@ -70,6 +71,7 @@ export function createAutomationsWorkspace({
70
71
  isEditing: () => Boolean(current.selectedNodeId) || stepEditor.isOpen(),
71
72
  });
72
73
  const liveView = createAutomationLiveView(root);
74
+ const runHistory = createAutomationRunHistoryControls({ root, actions });
73
75
 
74
76
  function isDirty() { return definitionDirty || stepEditor.isDirty(); }
75
77
 
@@ -132,7 +134,9 @@ export function createAutomationsWorkspace({
132
134
  const previousNodeId = renderedNodeId;
133
135
  const viewIdentity = `${snapshot.selectedAutomationId}/${snapshot.selectedRunId || "editor"}`;
134
136
  const sameEditor = snapshot.selectedAutomationId === current.selectedAutomationId && !snapshot.selectedRunId;
135
- if (!liveView.isCurrent(viewIdentity)) { paletteQuery = ""; paletteSelectedTool = ""; insertion = null; detailsCollapsed = false; camera.resetState(); }
137
+ const viewChanged = !liveView.isCurrent(viewIdentity);
138
+ const historyHadFocus = documentRoot.activeElement?.matches?.("[data-select-run]");
139
+ if (viewChanged) { paletteQuery = ""; paletteSelectedTool = ""; insertion = null; detailsCollapsed = false; camera.resetState(); }
136
140
  else camera.capture();
137
141
  const retainedDefinition = definitionDirty && sameEditor
138
142
  ? root.querySelector("[data-automation-definition-form]") : null;
@@ -144,6 +148,7 @@ export function createAutomationsWorkspace({
144
148
  : renderAutomationEditor(snapshot, { query: paletteQuery, selectedToolName: paletteSelectedTool });
145
149
  const changed = liveView.update(viewIdentity, renderAutomationLibraryTabs(snapshot, markup, activeLibraryTab));
146
150
  if (changed && retainedDefinition) root.querySelector("[data-automation-definition-form]")?.replaceWith(retainedDefinition);
151
+ runHistory.sync(snapshot, { viewChanged, focus: historyHadFocus });
147
152
  markInsertion();
148
153
  updateDetailsVisibility();
149
154
  camera.restore();
@@ -314,7 +319,11 @@ export function createAutomationsWorkspace({
314
319
  run: () => { if (requireSavedGraph()) return actions.startRun(); },
315
320
  "toggle-active": () => current.automations.find((item) => item.id === current.selectedAutomationId)?.status === "active"
316
321
  ? actions.setActive(false) : openPermissionDialog("activate"),
317
- "show-runs": () => { if (prepareLeave()) return current.runs[0] ? actions.openRun(current.runs[0].id) : notify("No runs yet."); },
322
+ "show-runs": () => {
323
+ if (!prepareLeave()) return;
324
+ const runId = current.runs[0]?.id || current.lastViewedRunId;
325
+ return runId ? actions.openRun(runId) : notify("No runs yet.");
326
+ },
318
327
  editor: () => { if (prepareLeave()) return actions.openRoute(current.selectedAutomationId, ""); },
319
328
  stop: () => actions.stopRun(),
320
329
  rerun: () => current.run &&
@@ -1,4 +1,6 @@
1
1
  import { createConversationTools } from "./conversation-tools.js";
2
+ import { createConversationRoleDelegations } from "./conversation-role-delegations.js";
3
+ import { createConversationRoleReturns } from "./conversation-role-returns.js";
2
4
 
3
5
  const ROLE_INITIALS = {
4
6
  supervisor: "S",
@@ -16,6 +18,8 @@ export function createConversationRoleCards({
16
18
  const timelineRequests = new Set();
17
19
  const timelineToggles = new Map();
18
20
  const toolsByRequest = new Map();
21
+ const delegations = createConversationRoleDelegations({ documentRoot });
22
+ const returns = createConversationRoleReturns({ documentRoot });
19
23
  let panelSequence = 0;
20
24
 
21
25
  function element(tag, className, text = "") {
@@ -97,6 +101,25 @@ export function createConversationRoleCards({
97
101
  }
98
102
  content.appendChild(header);
99
103
  const message = element("div", "conversation-role-message");
104
+ for (const activity of card.skillActivities || []) {
105
+ const skill = textElement(
106
+ "p",
107
+ "conversation-role-summary conversation-role-skill-activity",
108
+ activity.summary,
109
+ );
110
+ skill.dataset.tone = activity.tone;
111
+ message.appendChild(skill);
112
+ }
113
+ if (card.role === "supervisor") {
114
+ const history = delegations.createNode({
115
+ requestId, delegations: card.delegations || [],
116
+ });
117
+ if (history) message.appendChild(history);
118
+ }
119
+ if (card.role === "planner") {
120
+ const history = returns.createNode({ requestId, returns: card.returns || [] });
121
+ if (history) message.appendChild(history);
122
+ }
100
123
  if (card.summary) {
101
124
  const summary = element("p", "conversation-role-summary");
102
125
  summary.append(
@@ -187,6 +210,8 @@ export function createConversationRoleCards({
187
210
  }
188
211
 
189
212
  function forget(requestId) {
213
+ delegations.forget(requestId);
214
+ returns.forget(requestId);
190
215
  timelineRequests.delete(requestId);
191
216
  timelineToggles.delete(requestId);
192
217
  const tools = toolsByRequest.get(requestId);
@@ -195,6 +220,8 @@ export function createConversationRoleCards({
195
220
  }
196
221
 
197
222
  function reset() {
223
+ delegations.reset();
224
+ returns.reset();
198
225
  timelineRequests.clear();
199
226
  timelineToggles.clear();
200
227
  for (const tools of toolsByRequest.values()) {
@@ -0,0 +1,12 @@
1
+ import type { RoleDelegation } from "../lib/role-delegation-event.js";
2
+
3
+ export declare function createConversationRoleDelegations(options?: {
4
+ documentRoot?: Document;
5
+ }): {
6
+ createNode(input: {
7
+ requestId: string;
8
+ delegations?: RoleDelegation[];
9
+ }): HTMLElement | null;
10
+ forget(requestId: string): void;
11
+ reset(): void;
12
+ };
@@ -0,0 +1,24 @@
1
+ import { titleCaseEventValue } from "../lib/event-presentation.js";
2
+ import { createConversationRoleHistory } from "./conversation-role-history.js";
3
+
4
+ export function createConversationRoleDelegations({ documentRoot = document } = {}) {
5
+ const history = createConversationRoleHistory({
6
+ documentRoot,
7
+ kind: "delegation",
8
+ textClassName: "conversation-role-delegation-objective",
9
+ ariaLabel: "Delegated work",
10
+ });
11
+
12
+ function createNode({ requestId, delegations = [] }) {
13
+ return history.createNode({
14
+ requestId,
15
+ items: delegations.map((delegation) => ({
16
+ id: delegation.id,
17
+ label: `Delegated to ${titleCaseEventValue(delegation.childRole)}`,
18
+ text: delegation.objective,
19
+ })),
20
+ });
21
+ }
22
+
23
+ return { createNode, forget: history.forget, reset: history.reset };
24
+ }
@@ -0,0 +1,13 @@
1
+ export declare function createConversationRoleHistory(options: {
2
+ documentRoot?: Document;
3
+ kind: "delegation" | "return";
4
+ textClassName: string;
5
+ ariaLabel: string;
6
+ }): {
7
+ createNode(input: {
8
+ requestId: string;
9
+ items?: { id: string; label: string; text: string }[];
10
+ }): HTMLElement | null;
11
+ forget(requestId: string): void;
12
+ reset(): void;
13
+ };
@@ -0,0 +1,81 @@
1
+ export function createConversationRoleHistory({
2
+ documentRoot = document,
3
+ kind,
4
+ textClassName,
5
+ ariaLabel,
6
+ }) {
7
+ const requests = new Map();
8
+ const prefix = `conversation-role-${kind}`;
9
+
10
+ function element(tag, className, text = "") {
11
+ const node = documentRoot.createElement(tag);
12
+ node.className = className;
13
+ node.textContent = text;
14
+ return node;
15
+ }
16
+
17
+ function requestState(requestId) {
18
+ const existing = requests.get(requestId);
19
+ if (existing) return existing;
20
+ const state = { expanded: new Set(), nodes: new Map() };
21
+ requests.set(requestId, state);
22
+ return state;
23
+ }
24
+
25
+ function isCurrentDisclosure(requestId, state, id, node) {
26
+ if (requests.get(requestId) !== state) return false;
27
+ return state.nodes.get(id) === node;
28
+ }
29
+
30
+ function historyRow(requestId, state, item) {
31
+ const row = element("li", `${prefix}-row`);
32
+ const details = element("details", `conversation-role-history-item ${prefix}`);
33
+ details.dataset[`${kind}Id`] = item.id;
34
+ details.open = state.expanded.has(item.id);
35
+ state.nodes.set(item.id, details);
36
+ const summary = element("summary", `conversation-role-history-toggle ${prefix}-toggle`);
37
+ const label = element("span", `conversation-role-history-label ${prefix}-label`, item.label);
38
+ const chevron = element("span", `conversation-role-history-chevron ${prefix}-chevron`, "⌄");
39
+ chevron.setAttribute("aria-hidden", "true");
40
+ const text = element("span", `conversation-role-history-text ${textClassName}`, item.text);
41
+ text.setAttribute("dir", "auto");
42
+ summary.append(label, chevron, text);
43
+ details.appendChild(summary);
44
+ details.addEventListener("toggle", () => {
45
+ if (!isCurrentDisclosure(requestId, state, item.id, details)) return;
46
+ if (details.open) {
47
+ state.expanded.add(item.id);
48
+ return;
49
+ }
50
+ state.expanded.delete(item.id);
51
+ });
52
+ row.appendChild(details);
53
+ return row;
54
+ }
55
+
56
+ function createNode({ requestId, items = [] }) {
57
+ requests.get(requestId)?.nodes.clear();
58
+ if (items.length === 0) return null;
59
+ const state = requestState(requestId);
60
+ const identities = new Set(items.map((item) => item.id));
61
+ for (const id of state.expanded) {
62
+ if (!identities.has(id)) state.expanded.delete(id);
63
+ }
64
+ const list = element("ol", `conversation-role-history ${prefix}s`);
65
+ list.setAttribute("aria-label", ariaLabel);
66
+ for (const item of items) {
67
+ list.appendChild(historyRow(requestId, state, item));
68
+ }
69
+ return list;
70
+ }
71
+
72
+ function forget(requestId) {
73
+ requests.delete(requestId);
74
+ }
75
+
76
+ function reset() {
77
+ requests.clear();
78
+ }
79
+
80
+ return { createNode, forget, reset };
81
+ }
@@ -0,0 +1,12 @@
1
+ import type { RoleReturn } from "../lib/role-return-event.js";
2
+
3
+ export declare function createConversationRoleReturns(options?: {
4
+ documentRoot?: Document;
5
+ }): {
6
+ createNode(input: {
7
+ requestId: string;
8
+ returns?: RoleReturn[];
9
+ }): HTMLElement | null;
10
+ forget(requestId: string): void;
11
+ reset(): void;
12
+ };
@@ -0,0 +1,23 @@
1
+ import { createConversationRoleHistory } from "./conversation-role-history.js";
2
+
3
+ export function createConversationRoleReturns({ documentRoot = document } = {}) {
4
+ const history = createConversationRoleHistory({
5
+ documentRoot,
6
+ kind: "return",
7
+ textClassName: "conversation-role-return-summary",
8
+ ariaLabel: "Planner results",
9
+ });
10
+
11
+ function createNode({ requestId, returns = [] }) {
12
+ return history.createNode({
13
+ requestId,
14
+ items: returns.map((receipt) => ({
15
+ id: receipt.id,
16
+ label: receipt.outcome === "failed" ? "Planner failed" : "Returned result",
17
+ text: receipt.summary,
18
+ })),
19
+ });
20
+ }
21
+
22
+ return { createNode, forget: history.forget, reset: history.reset };
23
+ }
@@ -0,0 +1,137 @@
1
+ import { createHomeWidgetCard } from "./widget-card.js";
2
+ import { createHomeWidgetDialog } from "./widget-dialog.js";
3
+
4
+ export const HOME_WIDGET_MEDIA_QUERY = "(max-width: 1440px)";
5
+ const widgetOrder = ["learning", "conversations", "approvals", "activity", "automations", "computer"];
6
+
7
+ /** Home-only presentation; component owners keep their data, DOM and actions. */
8
+ export function createCompactHomeLayout({
9
+ root, content, homeRegion = root.parentElement,
10
+ viewport = root.ownerDocument.defaultView,
11
+ }) {
12
+ const media = viewport?.matchMedia?.(HOME_WIDGET_MEDIA_QUERY);
13
+ const entries = new Map();
14
+ let enabled = false;
15
+ let workspace = "home";
16
+ let compact = false;
17
+ let grid;
18
+ let dialog;
19
+
20
+ function canShowCompactHome() {
21
+ if (!enabled) return false;
22
+ return media?.matches === true;
23
+ }
24
+
25
+ function canOpenWidget(entry) {
26
+ if (!compact || workspace !== "home") return false;
27
+ return Boolean(entry?.isAvailable());
28
+ }
29
+
30
+ function ensureSurface() {
31
+ if (grid || !media) return;
32
+ grid = root.ownerDocument.createElement("div");
33
+ grid.className = "home-widget-grid";
34
+ grid.setAttribute("aria-label", "Home overview");
35
+ grid.hidden = true;
36
+ content.appendChild(grid);
37
+ dialog = createHomeWidgetDialog({
38
+ root,
39
+ onClosed(entry, restoreFocus) {
40
+ if (restoreFocus && canOpenWidget(entry)) entry.button.focus({ preventScroll: true });
41
+ },
42
+ });
43
+ }
44
+
45
+ function open(id) {
46
+ const entry = entries.get(id);
47
+ if (!canOpenWidget(entry)) return false;
48
+ dialog.open(entry);
49
+ entry.onOpen?.();
50
+ dialog.refresh();
51
+ return true;
52
+ }
53
+
54
+ function refresh() {
55
+ for (const entry of entries.values()) {
56
+ const available = entry.isAvailable();
57
+ entry.button.hidden = !available;
58
+ if (!available && dialog.isExpanded(entry.element)) dialog.close({ restoreFocus: false });
59
+ const summary = entry.getSummary();
60
+ entry.render(summary);
61
+ }
62
+ dialog?.refresh();
63
+ }
64
+
65
+ function reconcileViewport() {
66
+ const next = canShowCompactHome();
67
+ if (next === compact) return;
68
+ const focused = root.ownerDocument.activeElement;
69
+ const focusedEntry = [...entries.values()].find((entry) => entry.element.contains(focused) || entry.button === focused);
70
+ const expandedEntry = [...entries.values()].find((entry) => dialog?.isExpanded(entry.element));
71
+ dialog?.close({ restoreFocus: false });
72
+ compact = next;
73
+ homeRegion?.classList.toggle("home-widgets-compact", compact);
74
+ if (grid) grid.hidden = !compact;
75
+ refresh();
76
+ if (!enabled || workspace !== "home") return;
77
+ if (compact && focusedEntry?.isAvailable()) {
78
+ focusedEntry.button.focus({ preventScroll: true });
79
+ return;
80
+ }
81
+ if (compact) return;
82
+ if (focusedEntry?.element.contains(focused) && !focusedEntry.element.hidden) {
83
+ focused.focus({ preventScroll: true });
84
+ return;
85
+ }
86
+ const returnEntry = focusedEntry || expandedEntry;
87
+ if (returnEntry) focusDesktopContent(returnEntry);
88
+ }
89
+
90
+ function focusDesktopContent(entry) {
91
+ const controls = [...entry.element.querySelectorAll("button, summary, input, textarea")];
92
+ const control = controls.find((node) => !node.disabled && !node.closest("[hidden]"));
93
+ const target = control || root.querySelector("textarea");
94
+ target?.focus({ preventScroll: true });
95
+ }
96
+
97
+ function register({ id, label, icon = "neutral", element, getSummary,
98
+ isAvailable = () => true, emptyMessage, onOpen, getReturnParent }) {
99
+ if (!media || !element) return () => {};
100
+ ensureSurface();
101
+ const { button, render } = createHomeWidgetCard({ documentRoot: root.ownerDocument, id, label, icon });
102
+ const entry = { id, label, element, getSummary, isAvailable, emptyMessage, onOpen, getReturnParent, button, render };
103
+ entries.set(id, entry);
104
+ element.classList.add("home-widget-source");
105
+ const position = widgetOrder.indexOf(id);
106
+ const following = [...entries.values()].find((candidate) => widgetOrder.indexOf(candidate.id) > position);
107
+ grid.insertBefore(button, following?.button || null);
108
+ button.addEventListener("click", () => open(id));
109
+ refresh();
110
+ return () => {
111
+ if (dialog.isExpanded(element)) dialog.close({ restoreFocus: false });
112
+ element.classList.remove("home-widget-source");
113
+ button.remove();
114
+ entries.delete(id);
115
+ };
116
+ }
117
+
118
+ media?.addEventListener("change", reconcileViewport);
119
+ return {
120
+ register, refresh, open,
121
+ isExpanded: (element) => dialog?.isExpanded(element) === true,
122
+ close: (options) => dialog?.close(options),
123
+ setEnabled(value) { enabled = value; reconcileViewport(); },
124
+ setWorkspace(value) {
125
+ workspace = value;
126
+ if (value !== "home") dialog?.close({ restoreFocus: false });
127
+ },
128
+ dispose() {
129
+ dialog?.dispose();
130
+ for (const entry of entries.values()) entry.element.classList.remove("home-widget-source");
131
+ entries.clear();
132
+ grid?.remove();
133
+ homeRegion?.classList.remove("home-widgets-compact");
134
+ media?.removeEventListener("change", reconcileViewport);
135
+ },
136
+ };
137
+ }
@@ -1,4 +1,9 @@
1
1
  const paths = {
2
+ unread: '<rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 6 9 7 9-7"/>',
3
+ collecting: '<path d="M2 12h5l3-8 4 16 3-8h5"/>',
4
+ paused: '<path d="M9 5v14M15 5v14"/>',
5
+ unknown: '<circle cx="12" cy="12" r="9"/><path d="M9 9a3 3 0 0 1 6 0c0 2-3 2-3 4m0 4h.01"/>',
6
+ computer: '<rect x="5" y="3" width="14" height="13" rx="2"/><path d="M5 16 2 21h20l-3-5"/>',
2
7
  upload: '<path d="M12 16V4m-4 4 4-4 4 4"/><path d="M4 16v4h16v-4"/>',
3
8
  job: '<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M16 3v4M8 3v4M3 11h18m-9 3v4m-2-2h4"/>',
4
9
  conversations: