@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
@@ -5,6 +5,14 @@ import {
5
5
  titleCaseEventValue,
6
6
  } from "./event-presentation.js";
7
7
  import { textOf } from "./text-format.js";
8
+ import {
9
+ isRoleDelegationEvent,
10
+ projectRoleDelegationEvent,
11
+ } from "./role-delegation-event.js";
12
+ import {
13
+ isRoleReturnEvent,
14
+ projectRoleReturnEvent,
15
+ } from "./role-return-event.js";
8
16
  import { countToolInvocations } from "./tool-invocation-count.js";
9
17
  import { projectToolActivityEvent } from "./tool-activity-event.js";
10
18
  import { correlateToolApprovalActivity } from "./tool-approval-activity.js";
@@ -32,13 +40,16 @@ const ROLE_RESPONSIBILITIES = Object.freeze({
32
40
  });
33
41
 
34
42
  function latestRoleAction(group) {
43
+ if (group.summarySupersededByReturn) return "";
44
+ if (!group.latestEvent) return "";
35
45
  if (group.toolActions.some((action) => !action.legacy)) {
36
- return group.latestRoleEvent
46
+ return group.latestRoleEvent && !isSupervisorSkillActivity(group.latestRoleEvent)
37
47
  ? roleActivitySummary(group.latestRoleEvent)
38
48
  : "";
39
49
  }
40
50
  const toolEvent = group.toolEvents.at(-1);
41
- return roleActivitySummary(toolEvent || group.latestEvent);
51
+ const event = toolEvent || group.latestEvent;
52
+ return isSupervisorSkillActivity(event) ? "" : roleActivitySummary(event);
42
53
  }
43
54
 
44
55
  function belongsToRoleRequest(event, requestId) {
@@ -64,14 +75,20 @@ function orderedRequestActivity(events, requestId) {
64
75
  for (const event of events) {
65
76
  if (!belongsToRoleRequest(event, requestId)) continue;
66
77
  const position = activityPosition(event);
67
- if (!position) {
78
+ const delegation = projectRoleDelegationEvent(event);
79
+ const receipt = projectRoleReturnEvent(event);
80
+ if (!position && !delegation && !receipt) {
68
81
  unique.push({ event, position });
69
82
  continue;
70
83
  }
71
- const identity = `${position.domain}:${position.value}`;
84
+ let identity;
85
+ if (receipt) identity = `return:${receipt.id}`;
86
+ else if (delegation) identity = `delegation:${delegation.id}`;
87
+ else identity = `${position.domain}:${position.value}`;
72
88
  if (seen.has(identity)) continue;
73
89
  seen.add(identity);
74
90
  unique.push({ event, position });
91
+ if (!position) continue;
75
92
  const domain = domains.get(position.domain) || { events: [], next: 0 };
76
93
  domain.events.push({ event, position });
77
94
  domains.set(position.domain, domain);
@@ -104,8 +121,14 @@ function isToolActivityEvent(event) {
104
121
  return activityEventName(event).startsWith("tool.");
105
122
  }
106
123
 
124
+ function isSupervisorSkillActivity(event) {
125
+ return event.stage === "supervisor" && event.phase === "skills"
126
+ && !isToolActivityEvent(event);
127
+ }
128
+
107
129
  function roleActivityStage(event) {
108
130
  if (isToolActivityEvent(event)) return "";
131
+ if (isRoleDelegationEvent(event) || isRoleReturnEvent(event)) return "";
109
132
  return textOf(event.stage).trim();
110
133
  }
111
134
 
@@ -114,6 +137,7 @@ function hasSupportedRoleStage(stage) {
114
137
  }
115
138
 
116
139
  function isFailedRoleActivity(event) {
140
+ if (!event) return false;
117
141
  if (isToolActivityEvent(event)) return false;
118
142
  return (textOf(event.tone) || eventTone(event)) === "failed";
119
143
  }
@@ -134,6 +158,10 @@ function createRoleGroup(role, event) {
134
158
  latestRoleEvent: null,
135
159
  toolEvents: [],
136
160
  toolActions: [],
161
+ skillActivities: [],
162
+ delegations: [],
163
+ returns: [],
164
+ summarySupersededByReturn: false,
137
165
  };
138
166
  }
139
167
 
@@ -153,6 +181,7 @@ function buildRoleCard(group, activeRole, streaming) {
153
181
  const active = isActiveRoleActivity(group, activeRole, streaming);
154
182
  const toolCount = countToolInvocations(group.toolEvents);
155
183
  const toolSummary = summarizeConversationTools(group.toolActions);
184
+ const roleIdentityRecorded = group.latestRoleEvent || group.delegations[0];
156
185
  let tone = "recorded";
157
186
  if (active) tone = "active";
158
187
  if (failed) tone = "failed";
@@ -160,12 +189,17 @@ function buildRoleCard(group, activeRole, streaming) {
160
189
  id: group.role,
161
190
  role: group.role,
162
191
  title:
163
- group.role === "supervisor" && !group.latestRoleEvent
192
+ group.role === "supervisor" && !roleIdentityRecorded
164
193
  ? "Root agent"
165
194
  : ROLE_TITLES[group.role],
166
195
  responsibility: ROLE_RESPONSIBILITIES[group.role],
167
196
  phaseLabel: titleCaseEventValue(group.phase),
168
197
  summary: latestRoleAction(group),
198
+ ...(group.skillActivities.length > 0
199
+ ? { skillActivities: group.skillActivities }
200
+ : {}),
201
+ ...(group.delegations.length > 0 ? { delegations: group.delegations } : {}),
202
+ ...(group.returns.length > 0 ? { returns: group.returns } : {}),
169
203
  toolActions: group.toolActions,
170
204
  facts: toolSummary
171
205
  ? [toolSummary]
@@ -203,6 +237,23 @@ export function buildConversationRoleCards({
203
237
  continue;
204
238
  }
205
239
 
240
+ const delegation = projectRoleDelegationEvent(event);
241
+ if (delegation) {
242
+ const group = groups.get("supervisor") || createRoleGroup("supervisor", null);
243
+ group.delegations.push(delegation);
244
+ groups.set("supervisor", group);
245
+ continue;
246
+ }
247
+
248
+ const receipt = projectRoleReturnEvent(event);
249
+ if (receipt) {
250
+ const group = groups.get("planner") || createRoleGroup("planner", null);
251
+ group.returns.push(receipt);
252
+ group.summarySupersededByReturn = true;
253
+ groups.set("planner", group);
254
+ continue;
255
+ }
256
+
206
257
  const stage = roleActivityStage(event);
207
258
  if (stage) {
208
259
  activeRole = "";
@@ -212,6 +263,13 @@ export function buildConversationRoleCards({
212
263
  group.phase = textOf(event.phase);
213
264
  group.latestEvent = event;
214
265
  group.latestRoleEvent = event;
266
+ group.summarySupersededByReturn = false;
267
+ if (isSupervisorSkillActivity(event)) {
268
+ group.skillActivities.push({
269
+ summary: roleActivitySummary(event),
270
+ tone: textOf(event.tone) || eventTone(event),
271
+ });
272
+ }
215
273
  groups.set(stage, group);
216
274
  }
217
275
  }
@@ -1,8 +1,19 @@
1
1
  import { textOf } from "./text-format.js";
2
2
  import { isStopResult } from "./request-stop-state.js";
3
+ import {
4
+ isRoleDelegationEvent,
5
+ projectRoleDelegationEvent,
6
+ } from "./role-delegation-event.js";
7
+
8
+ import {
9
+ isRoleReturnEvent,
10
+ projectRoleReturnEvent,
11
+ } from "./role-return-event.js";
3
12
 
4
13
  function canMergeEventTimelineEntries(previous, event, name, summary) {
5
14
  if (!previous) return false;
15
+ if (isRoleDelegationEvent(previous) || isRoleDelegationEvent(event)) return false;
16
+ if (isRoleReturnEvent(previous) || isRoleReturnEvent(event)) return false;
6
17
  if (previous.name !== name) return false;
7
18
  if (previous.summary !== summary) return false;
8
19
  if (previous.tone !== event.tone) return false;
@@ -119,7 +130,22 @@ export function getPlanItemPayload(message) {
119
130
  };
120
131
  }
121
132
 
133
+ function isMissingSkillLookup(message) {
134
+ if (message.type !== "event") return false;
135
+ if (message.stage !== "supervisor") return false;
136
+ if (message.phase !== "skills") return false;
137
+ // Runtime-owned status text, before or after event enrichment.
138
+ const name = textOf(message.name || message.rawType);
139
+ const status = textOf(message.message || name);
140
+ return (name === "runtime.state" || name === status)
141
+ && status === "Skill lookup failed: knowledge_skill_not_found";
142
+ }
143
+
122
144
  export function formatEventLabel(message) {
145
+ const receipt = projectRoleReturnEvent(message);
146
+ if (receipt) return receipt.outcome === "failed" ? "Planner failed" : "Returned result";
147
+ const delegation = projectRoleDelegationEvent(message);
148
+ if (delegation) return `Delegated to ${titleCaseEventValue(delegation.childRole)}`;
123
149
  const name = textOf(message.name || message.rawType || message.type);
124
150
  const status = textOf(message.status);
125
151
  const phase = textOf(message.phase);
@@ -155,6 +181,7 @@ export function formatEventLabel(message) {
155
181
  if (name === "request.failed" || message.type === "failed") {
156
182
  return isStopResult(message) ? "Response stopped" : "Response failed";
157
183
  }
184
+ if (isMissingSkillLookup(message)) return "Skill not found";
158
185
  if (name === "runtime.state") {
159
186
  return status || textOf(message.output) || "Runtime state";
160
187
  }
@@ -180,6 +207,11 @@ function uncompletedToolLabel(message, name) {
180
207
  }
181
208
 
182
209
  export function formatEventDetail(message) {
210
+ const receipt = projectRoleReturnEvent(message);
211
+ if (receipt) return receipt.summary;
212
+ const delegation = projectRoleDelegationEvent(message);
213
+ if (delegation) return delegation.objective;
214
+ if (isMissingSkillLookup(message)) return "";
183
215
  if (isStopResult(message)) return "Stopped by you.";
184
216
  const parts = [];
185
217
  const name = textOf(message.name || message.rawType || message.type);
@@ -209,10 +241,12 @@ export function formatEventDetail(message) {
209
241
  }
210
242
 
211
243
  export function eventTone(message) {
244
+ if (isRoleReturnEvent(message)) return "neutral";
212
245
  const name = textOf(message.name || message.type);
213
246
  const normalized = name.toLowerCase();
214
247
  if (isStopResult(message)) return "neutral";
215
248
  if (isUncompletedToolEvent(message)) return "neutral";
249
+ if (isMissingSkillLookup(message)) return "neutral";
216
250
  if (
217
251
  message.ok === false ||
218
252
  textOf(message.status).toLowerCase() === "failed" ||
@@ -1,5 +1,10 @@
1
1
  import { escapeHtml } from "./text-format.js";
2
2
 
3
+ export function displayReasoningMode(mode) {
4
+ if (mode === "fast") return "Low";
5
+ return mode;
6
+ }
7
+
3
8
  export function canChooseReasoning(profile) {
4
9
  return profile?.supportsThinking === true;
5
10
  }
@@ -7,7 +12,7 @@ export function canChooseReasoning(profile) {
7
12
  /** Keep the stored mode for compatibility while showing the effective provider default. */
8
13
  export function reasoningModeOptions(mode, enabled, modes = ["fast", "reasoning", "deep"]) {
9
14
  if (!enabled) return `<option value="${escapeHtml(mode || "reasoning")}">Provider default</option>`;
10
- const labels = { fast: "Fast", reasoning: "Reasoning", deep: "Deep", auto: "Auto" };
15
+ const labels = { fast: "Low", reasoning: "Reasoning", deep: "Deep", auto: "Auto" };
11
16
  return modes.map((value) => `<option value="${escapeHtml(value)}"${value === mode ? " selected" : ""}>${escapeHtml(labels[value] || value)}</option>`).join("");
12
17
  }
13
18
 
@@ -0,0 +1,18 @@
1
+ export interface RoleDelegation {
2
+ id: string;
3
+ generation: string;
4
+ callerCallId: string;
5
+ callerRole: "supervisor";
6
+ childCallId: string;
7
+ childRole: "planner" | "worker" | "researcher" | "reviewer";
8
+ objective: string;
9
+ }
10
+
11
+ export declare function isRoleDelegationEvent(event: unknown): boolean;
12
+ export declare function projectRoleDelegationEvent(
13
+ event: Record<string, unknown>,
14
+ ): RoleDelegation | null;
15
+ export declare function hasRecordedRoleDelegation(
16
+ events: Record<string, unknown>[],
17
+ delegation: RoleDelegation,
18
+ ): boolean;
@@ -0,0 +1,47 @@
1
+ const DELEGATED_ROLES = new Set([
2
+ "planner", "worker", "researcher", "reviewer",
3
+ ]);
4
+
5
+ export function isRoleDelegationEvent(event) {
6
+ return (event?.eventName || event?.name || event?.rawType || event?.type)
7
+ === "role.delegated";
8
+ }
9
+
10
+ function hasDelegationIdentity(value) {
11
+ if (typeof value !== "string") return false;
12
+ return value.trim().length > 0;
13
+ }
14
+
15
+ function hasDelegationObjective(value) {
16
+ if (typeof value !== "string") return false;
17
+ if (value.length > 8_192) return false;
18
+ return value.trim().length > 0;
19
+ }
20
+
21
+ /** Explicit committed delegation evidence, without inferred role or objective data. */
22
+ export function projectRoleDelegationEvent(event) {
23
+ if (!isRoleDelegationEvent(event)) return null;
24
+ const source = event.roleDelegation || event;
25
+ if (source.callerRole !== "supervisor") return null;
26
+ if (!DELEGATED_ROLES.has(source.childRole)) return null;
27
+ if (!hasDelegationIdentity(event.requestId)) return null;
28
+ if (!hasDelegationIdentity(source.callerCallId)) return null;
29
+ if (!hasDelegationIdentity(source.childCallId)) return null;
30
+ if (!hasDelegationObjective(source.objective)) return null;
31
+ if (source.generation !== undefined && typeof source.generation !== "string")
32
+ return null;
33
+ const generation = source.generation || "";
34
+ return {
35
+ id: JSON.stringify([event.requestId, generation, source.childCallId]),
36
+ generation,
37
+ callerCallId: source.callerCallId,
38
+ callerRole: source.callerRole,
39
+ childCallId: source.childCallId,
40
+ childRole: source.childRole,
41
+ objective: source.objective,
42
+ };
43
+ }
44
+
45
+ export function hasRecordedRoleDelegation(events, delegation) {
46
+ return events.some((event) => event.roleDelegation?.id === delegation.id);
47
+ }
@@ -0,0 +1,19 @@
1
+ export interface RoleReturn {
2
+ id: string;
3
+ generation: string;
4
+ callerCallId: string;
5
+ callerRole: "supervisor";
6
+ childCallId: string;
7
+ childRole: "planner";
8
+ outcome: "completed" | "failed";
9
+ summary: string;
10
+ }
11
+
12
+ export declare function isRoleReturnEvent(event: unknown): boolean;
13
+ export declare function projectRoleReturnEvent(
14
+ event: Record<string, unknown>,
15
+ ): RoleReturn | null;
16
+ export declare function hasRecordedRoleReturn(
17
+ events: Record<string, unknown>[],
18
+ receipt: RoleReturn,
19
+ ): boolean;
@@ -0,0 +1,36 @@
1
+ export function isRoleReturnEvent(event) {
2
+ return (event?.eventName || event?.name || event?.rawType || event?.type)
3
+ === "role.returned";
4
+ }
5
+
6
+ function hasReturnIdentity(value) {
7
+ return typeof value === "string" && value.trim().length > 0;
8
+ }
9
+
10
+ export function projectRoleReturnEvent(event) {
11
+ if (!isRoleReturnEvent(event)) return null;
12
+ const source = event.roleReturn || event;
13
+ if (source.callerRole !== "supervisor") return null;
14
+ if (source.childRole !== "planner") return null;
15
+ if (source.outcome !== "completed" && source.outcome !== "failed") return null;
16
+ if (!hasReturnIdentity(event.requestId)) return null;
17
+ if (!hasReturnIdentity(source.callerCallId)) return null;
18
+ if (!hasReturnIdentity(source.childCallId)) return null;
19
+ if (typeof source.summary !== "string" || !source.summary.trim()) return null;
20
+ if (source.generation !== undefined && typeof source.generation !== "string") return null;
21
+ const generation = source.generation || "";
22
+ return {
23
+ id: JSON.stringify([event.requestId, generation, source.childCallId]),
24
+ generation,
25
+ callerCallId: source.callerCallId,
26
+ callerRole: source.callerRole,
27
+ childCallId: source.childCallId,
28
+ childRole: source.childRole,
29
+ outcome: source.outcome,
30
+ summary: source.summary,
31
+ };
32
+ }
33
+
34
+ export function hasRecordedRoleReturn(events, receipt) {
35
+ return events.some((event) => event.roleReturn?.id === receipt.id);
36
+ }
@@ -2,6 +2,7 @@ import { getRecord, titleCaseEventValue } from "./event-presentation.js";
2
2
  import { projectConversationFileReference } from "./conversation-file-reference.js";
3
3
  import { computerInputFields } from "./tool-computer-activity-fields.js";
4
4
  import { automationActivityFields } from "./tool-automation-activity-fields.js";
5
+ import { skillActivityFields } from "./tool-skill-activity-fields.js";
5
6
  import {
6
7
  processInputFields,
7
8
  processResultFields,
@@ -193,10 +194,11 @@ export function projectToolActivityEvent(message) {
193
194
  const params = getRecord(meta.params);
194
195
  const inputMeta = { ...meta, params };
195
196
  const fileReference = projectConversationFileReference(message);
196
- const automation = automationActivityFields(meta, tool);
197
+ const skill = skillActivityFields(meta, tool, completed, message.ok);
198
+ const activity = skill ?? automationActivityFields(meta, tool);
197
199
  return {
198
200
  ...(fileReference ? { fileReference } : {}),
199
- ...(automation?.activityTitle ? { activityTitle: automation.activityTitle } : {}),
201
+ ...(activity?.activityTitle ? { activityTitle: activity.activityTitle } : {}),
200
202
  name,
201
203
  tool,
202
204
  executionId: boundedText(message.executionId, 200).trim(),
@@ -206,7 +208,7 @@ export function projectToolActivityEvent(message) {
206
208
  beforeExternalExecution: message.stage === "before_external_execution",
207
209
  intent: boundedText(message.intent || meta.intent),
208
210
  target: boundedText(
209
- automation?.target ||
211
+ activity?.target ||
210
212
  meta.source ||
211
213
  meta.displayTarget ||
212
214
  meta.path ||
@@ -215,10 +217,10 @@ export function projectToolActivityEvent(message) {
215
217
  meta.id ||
216
218
  meta.savedId,
217
219
  ),
218
- sent: [...inputFields(inputMeta, completed, tool), ...(automation?.sent || [])],
220
+ sent: [...inputFields(inputMeta, completed, tool), ...(activity?.sent || [])],
219
221
  received: terminal ? resultFields(meta, tool, message.ok) : [],
220
- preview: terminal ? boundedText(meta.outputPreview, 1_200) : "",
221
- previewTruncated: terminal && hasClippedPreview(meta),
222
+ preview: terminal && !skill ? boundedText(meta.outputPreview, 1_200) : "",
223
+ previewTruncated: terminal && !skill && hasClippedPreview(meta),
222
224
  partial: terminal && hasPartialSource(meta),
223
225
  outcome: completedOutcome(meta),
224
226
  ok: typeof message.ok === "boolean" ? message.ok : null,
@@ -0,0 +1,50 @@
1
+ const ACTION_TITLES = Object.freeze({
2
+ list_skills: "List skills",
3
+ read_skill: "Read skill",
4
+ read_skills: "Read skills",
5
+ create_skill: "Create skill",
6
+ update_skill: "Edit skill",
7
+ });
8
+
9
+ function boundedSkillText(value, limit) {
10
+ if (typeof value !== "string") return "";
11
+ const text = value.trim();
12
+ if (text.length <= limit) return text;
13
+ return `${text.slice(0, limit - 1)}…`;
14
+ }
15
+
16
+ function isSkillReadAction(action) {
17
+ return action === "read_skill" || action === "read_skills";
18
+ }
19
+
20
+ function hasSuccessfulSkillResult(action, completed, ok) {
21
+ if (action === "list_skills" || !Object.hasOwn(ACTION_TITLES, action)) return false;
22
+ if (!completed) return false;
23
+ return ok === true;
24
+ }
25
+
26
+ /** Decode declared display metadata only; never inspect a Skill body or tool output. */
27
+ export function skillActivityFields(meta, tool, completed, ok) {
28
+ if (tool !== "abot_skills") return null;
29
+ const action = boundedSkillText(meta.skillAction, 128);
30
+ const activityTitle = Object.hasOwn(ACTION_TITLES, action)
31
+ ? ACTION_TITLES[action]
32
+ : "";
33
+ const sent = [];
34
+ if (activityTitle) sent.push({ label: "Action", value: activityTitle });
35
+ if (action === "list_skills" || !activityTitle) return { activityTitle, target: "", sent };
36
+
37
+ const readAction = isSkillReadAction(action);
38
+ const referenceLimit = readAction ? 160 : 128;
39
+ const referenceLabel = readAction ? "Skill reference" : "Skill ID";
40
+ const skillId = action === "read_skills"
41
+ ? boundedSkillText(Array.isArray(meta.skillIds)
42
+ ? meta.skillIds.slice(0, 8).map((id) => boundedSkillText(id, referenceLimit)).filter(Boolean).join(", ")
43
+ : "", 160)
44
+ : boundedSkillText(meta.skillId, referenceLimit) || (completed && ok === true ? boundedSkillText(meta.savedSkillId, 128) : "");
45
+ const skillTitle = hasSuccessfulSkillResult(action, completed, ok)
46
+ ? boundedSkillText(meta.skillTitle, 160)
47
+ : "";
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 };
50
+ }
@@ -8,6 +8,7 @@ const WORKSPACE_PATHS = Object.freeze({
8
8
  automations: "/automations",
9
9
  learning: "/learning",
10
10
  memory: "/memory",
11
+ skills: "/skills",
11
12
  models: "/models",
12
13
  plugins: "/plugins",
13
14
  config: "/system",
@@ -77,8 +77,8 @@ export function createPassiveLearningFeature({
77
77
  macConsent.cancel();
78
78
  controller.environmentChanged();
79
79
  },
80
- mountHome: (root) => {
81
- home.mount(root);
80
+ mountHome: (root, onRendered) => {
81
+ home.mount(root, onRendered);
82
82
  home.render(controller.snapshot());
83
83
  },
84
84
  });
@@ -6,6 +6,14 @@ export type AutomationDraftResponse = Readonly<{
6
6
  validation?: Record<string, unknown> | null;
7
7
  }>;
8
8
 
9
+ export type AutomationRunHistoryQuery = Readonly<{
10
+ limit?: number;
11
+ cursor?: string;
12
+ status?: string;
13
+ from?: string;
14
+ to?: string;
15
+ }>;
16
+
9
17
  export type AutomationRequests = Readonly<{
10
18
  supportsAutomations(): boolean;
11
19
  listAutomations(environmentId?: string): Promise<{ automations: Record<string, unknown>[] }>;
@@ -22,7 +30,7 @@ export type AutomationRequests = Readonly<{
22
30
  setAutomationPermission(automationId: string, input: { expectedGrantRevision: number; mode: "full_access" | "full_plus"; operations: OperationRef[] }, environmentId?: string): Promise<Record<string, unknown>>;
23
31
  getAutomationCatalog(automationId: string, environmentId?: string): Promise<Record<string, unknown>>;
24
32
  startAutomationRun(automationId: string, idempotencyKey: string, environmentId?: string): Promise<Record<string, unknown>>;
25
- listAutomationRuns(automationId: string, environmentId?: string): Promise<Record<string, unknown>>;
33
+ listAutomationRuns(automationId: string, environmentId?: string, query?: AutomationRunHistoryQuery): Promise<Record<string, unknown>>;
26
34
  getAutomationRun(runId: string, environmentId?: string): Promise<Record<string, unknown>>;
27
35
  getAutomationStepEvidence(runId: string, nodeId: string, environmentId?: string, full?: boolean): Promise<Record<string, unknown>>;
28
36
  stopAutomationRun(runId: string, environmentId?: string): Promise<Record<string, unknown>>;
@@ -14,6 +14,14 @@ export function createAutomationRequests({ requestApi, getEnvironmentId, getConf
14
14
  const post = (url, input) => requestAutomation(url, {
15
15
  method: "POST", body: JSON.stringify(input),
16
16
  });
17
+ const historyPath = (automationId, environmentId, query) => {
18
+ const params = new URLSearchParams();
19
+ for (const key of ["limit", "cursor", "status", "from", "to"])
20
+ if (query[key] !== undefined && query[key] !== null && query[key] !== "")
21
+ params.set(key, String(query[key]));
22
+ const suffix = params.size ? `&${params}` : "";
23
+ return `${path(`/${encodeURIComponent(automationId)}/runs`, environmentId)}${suffix}`;
24
+ };
17
25
  return {
18
26
  supportsAutomations,
19
27
  listAutomations: (environmentId) => requestAutomation(path("", environmentId)),
@@ -59,8 +67,8 @@ export function createAutomationRequests({ requestApi, getEnvironmentId, getConf
59
67
  },
60
68
  startAutomationRun: (automationId, idempotencyKey, environmentId) =>
61
69
  post(path(`/${encodeURIComponent(automationId)}/run`, environmentId), { idempotencyKey }),
62
- listAutomationRuns: (automationId, environmentId) =>
63
- requestAutomation(path(`/${encodeURIComponent(automationId)}/runs`, environmentId)),
70
+ listAutomationRuns: (automationId, environmentId, query = {}) =>
71
+ requestAutomation(historyPath(automationId, environmentId, query)),
64
72
  getAutomationRun: (runId, environmentId) => requestAutomation(runPath(runId, environmentId)),
65
73
  getAutomationStepEvidence: (runId, nodeId, environmentId, full = false) => requestAutomation(
66
74
  `/automation-runs/${encodeURIComponent(runId)}/steps/${encodeURIComponent(nodeId)}?environment=${encodeURIComponent(environmentId || getEnvironmentId())}${full ? "&full=1" : ""}`),
@@ -0,0 +1,23 @@
1
+ export function createSkillRequests({ requestApi, getEnvironmentId, getConfig }) {
2
+ const supportsSkills = () => getConfig()?.backend === "runtime";
3
+ const path = (suffix, environmentId) =>
4
+ `/runtime/skills${suffix}?environment=${encodeURIComponent(environmentId)}`;
5
+ function request(suffix, environmentId, options) {
6
+ if (!supportsSkills()) throw new Error("Skills require the local Runtime backend.");
7
+ return requestApi(path(suffix, environmentId), options);
8
+ }
9
+ const identity = (id) => `/${encodeURIComponent(id)}`;
10
+ return {
11
+ supportsSkills,
12
+ createPersonalSkill: ({ name, description, content }, environmentId = getEnvironmentId()) =>
13
+ request("", environmentId, { method: "POST", body: JSON.stringify({ name, description, content }) }),
14
+ listPersonalSkills: (environmentId = getEnvironmentId()) => request("", environmentId),
15
+ readPersonalSkill: (id, environmentId = getEnvironmentId()) => request(identity(id), environmentId),
16
+ updatePersonalSkill: (id, content, expectedRevision, environmentId = getEnvironmentId()) =>
17
+ request(identity(id), environmentId, { method: "PATCH", body: JSON.stringify({ content, expectedRevision }) }),
18
+ archivePersonalSkill: (id, expectedRevision, environmentId = getEnvironmentId()) =>
19
+ request(`${identity(id)}/archive`, environmentId, { method: "POST", body: JSON.stringify({ expectedRevision }) }),
20
+ restorePersonalSkill: (id, expectedRevision, environmentId = getEnvironmentId()) =>
21
+ request(`${identity(id)}/restore`, environmentId, { method: "POST", body: JSON.stringify({ expectedRevision }) }),
22
+ };
23
+ }
@@ -1,3 +1,4 @@
1
+ import { createSkillRequests } from "./runtime-web-client/skills.js";
1
2
  import { createNotificationRequests } from "./runtime-web-client/notifications.js";
2
3
  import { createSparkChatRequests } from "./runtime-web-client/spark-chat.js";
3
4
  import { createProjectRequests } from "./runtime-web-client/projects.js";
@@ -380,6 +381,7 @@ export function createRuntimeWebClient({
380
381
  ...createProjectRequests({ requestApi, getEnvironmentId, getConfig }),
381
382
  ...createToolApprovalRequests({ requestApi, getEnvironmentId, getConfig }),
382
383
  ...createNotificationRequests({ requestApi, getEnvironmentId, getConfig }),
384
+ ...createSkillRequests({ requestApi, getEnvironmentId, getConfig }),
383
385
  ...createSparkChatRequests({ requestApi, getEnvironmentId, getConfig }),
384
386
  };
385
387
  }
@@ -0,0 +1,36 @@
1
+ import { createSkillsController } from "./controllers/skills-controller.js";
2
+ import { mountSkillsWorkspace, createSkillsWorkspace } from "./components/skills/workspace.js";
3
+
4
+ export function createSkillsFeature({ dom, client, shell, getEnvironmentId,
5
+ documentRoot = document, viewport = window }) {
6
+ mountSkillsWorkspace(dom, documentRoot);
7
+ let view;
8
+ const controller = createSkillsController({ client, getEnvironmentId,
9
+ confirmDiscard: (message) => viewport.confirm(message), render: (snapshot) => view?.render(snapshot) });
10
+ view = createSkillsWorkspace({ root: dom.skillsRoot, actions: controller,
11
+ confirmArchive: (message) => viewport.confirm(message) });
12
+ view.render(controller.snapshot());
13
+ shell.addWorkspaceGuard(({ from, to }) => {
14
+ if (from !== "skills" || to === "skills") return true;
15
+ return controller.prepareLeave();
16
+ });
17
+ shell.subscribeWorkspaceChange((workspace) => controller.setActive(workspace === "skills"));
18
+ function bind() {
19
+ // Bind after the canonical transition: rejected raw changes never clear drafts.
20
+ dom.environmentSelect.addEventListener("change", () => controller.environmentChanged());
21
+ viewport.addEventListener("beforeunload", (event) => {
22
+ if (!controller.isDirty()) return;
23
+ event.preventDefault();
24
+ event.returnValue = "";
25
+ });
26
+ }
27
+ function refreshAvailability() {
28
+ const available = client.supportsSkills();
29
+ dom.skillsWorkspaceButton.hidden = !available;
30
+ dom.skillsWorkspaceButton.disabled = !available || dom.skillsWorkspaceButton.dataset.onboardingBlocked === "true";
31
+ if (!available) controller.setActive(false);
32
+ }
33
+ shell.subscribeRuntimeAvailabilityChange(refreshAvailability);
34
+ return { bind, refreshAvailability, prepareEnvironmentChange: controller.prepareLeave,
35
+ isWorkspaceAvailable: (destination) => destination !== "skills" || client.supportsSkills() };
36
+ }