@abot-ai/runtime 1.1.0 → 1.2.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 (268) hide show
  1. package/README.md +6 -3
  2. package/dist/src/capabilities/tool-types.d.ts +1 -1
  3. package/dist/src/model-gateway/providers/ollama/generation-options.d.ts +1 -3
  4. package/dist/src/model-gateway/providers/ollama/generation-options.js +1 -5
  5. package/dist/src/model-gateway/providers/ollama/payload.js +0 -8
  6. package/dist/src/model-gateway/server/request-body.js +1 -0
  7. package/dist/src/plugin-sdk/index.d.ts +2 -0
  8. package/dist/src/plugin-sdk/index.js +2 -0
  9. package/dist/src/plugin-sdk/tool-availability-brief.d.ts +9 -0
  10. package/dist/src/plugin-sdk/tool-availability-brief.js +48 -0
  11. package/dist/src/plugin-sdk/tool-availability-overview.d.ts +9 -0
  12. package/dist/src/plugin-sdk/tool-availability-overview.js +62 -0
  13. package/dist/src/runtime/adapters/registered-tool-payload-plan.d.ts +0 -9
  14. package/dist/src/runtime/adapters/registered-tool-payload-plan.js +0 -67
  15. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.d.ts +13 -0
  16. package/dist/src/runtime/adapters/registered-tool-payload-related-artifacts.js +84 -0
  17. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/catalog.js +4 -0
  18. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +3 -0
  19. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.d.ts +1 -0
  20. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-lifecycle.js +11 -1
  21. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.d.ts +1 -0
  22. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-stages.js +9 -1
  23. package/dist/src/runtime/capabilities/request-bound-tool-registry.js +1 -24
  24. package/dist/src/runtime/capabilities/tool-availability.d.ts +6 -0
  25. package/dist/src/runtime/capabilities/tool-availability.js +28 -0
  26. package/dist/src/runtime/context/capability-brief.d.ts +25 -0
  27. package/dist/src/runtime/context/capability-brief.js +106 -0
  28. package/dist/src/runtime/context/request-tool-results-message-binding.d.ts +6 -0
  29. package/dist/src/runtime/context/request-tool-results-message-binding.js +30 -0
  30. package/dist/src/runtime/context/request-tool-results-scope.d.ts +3 -0
  31. package/dist/src/runtime/context/request-tool-results-scope.js +8 -0
  32. package/dist/src/runtime/context/request-tool-results.d.ts +8 -4
  33. package/dist/src/runtime/context/request-tool-results.js +49 -38
  34. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +8 -1
  35. package/dist/src/runtime/orchestration/role-calls/child-return.d.ts +4 -0
  36. package/dist/src/runtime/orchestration/role-calls/child-return.js +25 -5
  37. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +8 -3
  38. package/dist/src/runtime/orchestration/role-calls/command-dispatch/child-transitions.d.ts +1 -1
  39. package/dist/src/runtime/orchestration/role-calls/command-dispatch/child-transitions.js +17 -2
  40. package/dist/src/runtime/orchestration/role-calls/command-dispatch.d.ts +1 -1
  41. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +2 -2
  42. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +5 -2
  43. package/dist/src/runtime/orchestration/role-calls/contracts.js +4 -4
  44. package/dist/src/runtime/orchestration/role-calls/dependency-results.d.ts +1 -1
  45. package/dist/src/runtime/orchestration/role-calls/dependency-results.js +1 -0
  46. package/dist/src/runtime/orchestration/role-calls/index.d.ts +5 -1
  47. package/dist/src/runtime/orchestration/role-calls/index.js +5 -1
  48. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +3 -1
  49. package/dist/src/runtime/orchestration/role-calls/ledger.js +9 -2
  50. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  51. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -2
  52. package/dist/src/runtime/orchestration/role-calls/result-receipt.d.ts +49 -0
  53. package/dist/src/runtime/orchestration/role-calls/result-receipt.js +188 -0
  54. package/dist/src/runtime/orchestration/role-calls/return-result-receipt.d.ts +19 -0
  55. package/dist/src/runtime/orchestration/role-calls/return-result-receipt.js +52 -0
  56. package/dist/src/runtime/orchestration/role-calls/transactions.js +1 -0
  57. package/dist/src/runtime/orchestration/role-calls/work-result-lineage.d.ts +34 -0
  58. package/dist/src/runtime/orchestration/role-calls/work-result-lineage.js +185 -0
  59. package/dist/src/runtime/orchestration/role-calls/work-result-receipt.d.ts +36 -0
  60. package/dist/src/runtime/orchestration/role-calls/work-result-receipt.js +187 -0
  61. package/dist/src/runtime/orchestration/role-executors/activation/result-normalization.js +6 -3
  62. package/dist/src/runtime/orchestration/role-executors/child-invocation/transaction.js +1 -0
  63. package/dist/src/runtime/orchestration/role-executors/contracts.d.ts +2 -1
  64. package/dist/src/runtime/orchestration/worker-capabilities/assignment-provenance.d.ts +36 -0
  65. package/dist/src/runtime/orchestration/worker-capabilities/assignment-provenance.js +171 -0
  66. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +32 -1
  67. package/dist/src/runtime/orchestration/worker-capabilities/execution/invocation-preparation.d.ts +2 -1
  68. package/dist/src/runtime/orchestration/worker-capabilities/execution/invocation-preparation.js +3 -0
  69. package/dist/src/runtime/orchestration/worker-capabilities/execution.js +42 -19
  70. package/dist/src/runtime/orchestration/worker-capabilities/index.d.ts +2 -0
  71. package/dist/src/runtime/orchestration/worker-capabilities/index.js +2 -0
  72. package/dist/src/runtime/orchestration/worker-capabilities/payload-assignment-validation.d.ts +3 -0
  73. package/dist/src/runtime/orchestration/worker-capabilities/payload-assignment-validation.js +30 -0
  74. package/dist/src/runtime/orchestration/worker-capabilities/payload-author.js +8 -19
  75. package/dist/src/runtime/orchestration/worker-capabilities/payload-contracts.d.ts +5 -1
  76. package/dist/src/runtime/orchestration/worker-capabilities/payload-instructions.js +1 -1
  77. package/dist/src/runtime/orchestration/worker-capabilities/payload-source-provenance.d.ts +14 -0
  78. package/dist/src/runtime/orchestration/worker-capabilities/payload-source-provenance.js +132 -0
  79. package/dist/src/runtime/request/capability-brief.d.ts +5 -0
  80. package/dist/src/runtime/request/capability-brief.js +24 -0
  81. package/dist/src/runtime/request/execution-scope.d.ts +2 -1
  82. package/dist/src/runtime/request/role-executor-composition.js +1 -1
  83. package/dist/src/runtime/request/worker-capability-composition.d.ts +2 -1
  84. package/dist/src/runtime/request/worker-capability-composition.js +6 -1
  85. package/dist/src/runtime/request/worker-capability-payload.js +11 -8
  86. package/dist/src/runtime/steps/execution-agent/prompt.js +4 -3
  87. package/dist/src/runtime/steps/planner-decision/capability-catalog-context.d.ts +14 -0
  88. package/dist/src/runtime/steps/planner-decision/capability-catalog-context.js +87 -0
  89. package/dist/src/runtime/steps/planner-decision/contracts.d.ts +3 -5
  90. package/dist/src/runtime/steps/planner-decision/contracts.js +3 -3
  91. package/dist/src/runtime/steps/planner-decision/format.d.ts +3 -2
  92. package/dist/src/runtime/steps/planner-decision/format.js +73 -76
  93. package/dist/src/runtime/steps/planner-decision/input.d.ts +4 -3
  94. package/dist/src/runtime/steps/planner-decision/input.js +10 -7
  95. package/dist/src/runtime/steps/planner-decision/parser.d.ts +3 -2
  96. package/dist/src/runtime/steps/planner-decision/parser.js +10 -19
  97. package/dist/src/runtime/steps/planner-decision/plan-parser.js +18 -12
  98. package/dist/src/runtime/steps/planner-decision/prompt.js +33 -28
  99. package/dist/src/runtime/steps/planner-decision/resume.d.ts +1 -1
  100. package/dist/src/runtime/steps/planner-decision/resume.js +38 -1
  101. package/dist/src/runtime/steps/planner-decision/run.d.ts +3 -2
  102. package/dist/src/runtime/steps/reviewer-decision/audit-coverage.d.ts +10 -0
  103. package/dist/src/runtime/steps/reviewer-decision/audit-coverage.js +186 -0
  104. package/dist/src/runtime/steps/reviewer-decision/contracts.d.ts +3 -8
  105. package/dist/src/runtime/steps/reviewer-decision/contracts.js +12 -6
  106. package/dist/src/runtime/steps/reviewer-decision/delegated-context.d.ts +24 -0
  107. package/dist/src/runtime/steps/reviewer-decision/delegated-context.js +70 -0
  108. package/dist/src/runtime/steps/reviewer-decision/diagnostics.js +1 -1
  109. package/dist/src/runtime/steps/reviewer-decision/format.js +37 -24
  110. package/dist/src/runtime/steps/reviewer-decision/input.js +1 -1
  111. package/dist/src/runtime/steps/reviewer-decision/model-context.d.ts +4 -3
  112. package/dist/src/runtime/steps/reviewer-decision/model-context.js +92 -10
  113. package/dist/src/runtime/steps/reviewer-decision/parser.js +19 -1
  114. package/dist/src/runtime/steps/reviewer-decision/projection.js +42 -68
  115. package/dist/src/runtime/steps/reviewer-decision/prompt.js +10 -5
  116. package/dist/src/runtime/steps/reviewer-decision/run.js +12 -3
  117. package/dist/src/runtime/steps/reviewer-decision/verification-coverage.d.ts +14 -0
  118. package/dist/src/runtime/steps/reviewer-decision/verification-coverage.js +52 -0
  119. package/dist/src/runtime/steps/supervisor-decision/capability-brief.d.ts +14 -0
  120. package/dist/src/runtime/steps/supervisor-decision/capability-brief.js +38 -0
  121. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +7 -3
  122. package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
  123. package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +8 -2
  124. package/dist/src/runtime/steps/supervisor-decision/format.js +32 -20
  125. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +4 -1
  126. package/dist/src/runtime/steps/supervisor-decision/input.js +19 -1
  127. package/dist/src/runtime/steps/supervisor-decision/parser.js +62 -59
  128. package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -7
  129. package/dist/src/runtime/steps/supervisor-decision/resume.js +47 -1
  130. package/dist/src/runtime/steps/supervisor-decision/run.js +10 -0
  131. package/dist/src/runtime/steps/supervisor-decision/working-directory.js +2 -1
  132. package/dist/src/runtime/steps/worker-decision/contracts.d.ts +2 -1
  133. package/dist/src/runtime/steps/worker-decision/input/canonical-state.js +8 -1
  134. package/dist/src/runtime/steps/worker-decision/input/diagnostic-projection.js +2 -2
  135. package/dist/src/runtime/steps/worker-decision/input/prompt-context.d.ts +1 -0
  136. package/dist/src/runtime/steps/worker-decision/input/prompt-context.js +4 -1
  137. package/dist/src/runtime/steps/worker-decision/input/reference-context.js +34 -14
  138. package/dist/src/runtime/steps/worker-decision/input/types.d.ts +2 -1
  139. package/dist/src/runtime/steps/worker-decision/input.d.ts +1 -0
  140. package/dist/src/runtime/steps/worker-decision/input.js +1 -0
  141. package/dist/src/runtime/steps/worker-decision/payload-dependency-results.d.ts +8 -0
  142. package/dist/src/runtime/steps/worker-decision/payload-dependency-results.js +19 -0
  143. package/dist/src/runtime/steps/worker-decision/prompt.js +8 -8
  144. package/dist/src/runtime/steps/worker-decision/result-author.js +18 -11
  145. package/dist/src/runtime/steps/worker-decision/run.js +2 -2
  146. package/dist/src/web-ui/app/ARCHITECTURE.md +19 -6
  147. package/dist/src/web-ui/app/app.js +6 -7
  148. package/dist/src/web-ui/app/components/composer-context-window.d.ts +25 -0
  149. package/dist/src/web-ui/app/components/composer-context-window.js +155 -0
  150. package/dist/src/web-ui/app/components/composer-plan.d.ts +9 -0
  151. package/dist/src/web-ui/app/components/composer-plan.js +128 -0
  152. package/dist/src/web-ui/app/components/conversation-activity.d.ts +5 -6
  153. package/dist/src/web-ui/app/components/conversation-activity.js +64 -157
  154. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +23 -0
  155. package/dist/src/web-ui/app/components/conversation-role-cards.js +181 -0
  156. package/dist/src/web-ui/app/components/conversation-sidebar-layout.js +12 -0
  157. package/dist/src/web-ui/app/components/conversation-sources.d.ts +7 -0
  158. package/dist/src/web-ui/app/components/conversation-sources.js +182 -0
  159. package/dist/src/web-ui/app/components/conversation-view.js +34 -6
  160. package/dist/src/web-ui/app/components/model-selector.js +4 -1
  161. package/dist/src/web-ui/app/components/operations-section.js +46 -0
  162. package/dist/src/web-ui/app/components/workspace-shell.js +86 -78
  163. package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
  164. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +55 -90
  165. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +2 -0
  166. package/dist/src/web-ui/app/controllers/session-controller.js +17 -12
  167. package/dist/src/web-ui/app/index.html +209 -210
  168. package/dist/src/web-ui/app/lib/composer-plan-model.d.ts +32 -0
  169. package/dist/src/web-ui/app/lib/composer-plan-model.js +108 -0
  170. package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +19 -0
  171. package/dist/src/web-ui/app/lib/conversation-role-model.js +193 -0
  172. package/dist/src/web-ui/app/lib/event-presentation.js +30 -9
  173. package/dist/src/web-ui/app/lib/source-url-policy.d.ts +2 -0
  174. package/dist/src/web-ui/app/lib/source-url-policy.js +31 -0
  175. package/dist/src/web-ui/app/lib/task-progress.d.ts +53 -0
  176. package/dist/src/web-ui/app/lib/task-progress.js +233 -0
  177. package/dist/src/web-ui/app/lib/tool-invocation-count.d.ts +5 -0
  178. package/dist/src/web-ui/app/lib/tool-invocation-count.js +21 -0
  179. package/dist/src/web-ui/app/lib/web-source-event.d.ts +8 -0
  180. package/dist/src/web-ui/app/lib/web-source-event.js +21 -0
  181. package/dist/src/web-ui/app/lib/web-sources.d.ts +36 -0
  182. package/dist/src/web-ui/app/lib/web-sources.js +177 -0
  183. package/dist/src/web-ui/app/styles/00-tokens-base.css +15 -3
  184. package/dist/src/web-ui/app/styles/10-shell-sessions.css +24 -34
  185. package/dist/src/web-ui/app/styles/12-conversation-sidebar.css +93 -0
  186. package/dist/src/web-ui/app/styles/20-chat-composer.css +55 -472
  187. package/dist/src/web-ui/app/styles/21-composer-controls.css +368 -0
  188. package/dist/src/web-ui/app/styles/22-composer-context-window.css +90 -0
  189. package/dist/src/web-ui/app/styles/23-composer-plan.css +171 -0
  190. package/dist/src/web-ui/app/styles/24-conversation-role-cards.css +205 -0
  191. package/dist/src/web-ui/app/styles/25-conversation-sources.css +141 -0
  192. package/dist/src/web-ui/app/styles/30-inspector-config.css +21 -209
  193. package/dist/src/web-ui/app/styles/35-memory-onboarding.css +8 -8
  194. package/dist/src/web-ui/app/styles/36-memory-management.css +13 -13
  195. package/dist/src/web-ui/app/styles/37-config-operations.css +197 -0
  196. package/dist/src/web-ui/app/styles/40-config-workspace.css +36 -36
  197. package/dist/src/web-ui/app/styles/90-responsive.css +14 -77
  198. package/dist/src/web-ui/app/styles/foundation.css +2 -2
  199. package/dist/src/web-ui/app/styles.css +7 -0
  200. package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
  201. package/dist/src/web-ui/app/ui-behavior.js +1 -1
  202. package/docs/configuration.md +15 -8
  203. package/docs/installation.md +7 -4
  204. package/docs/known-limitations.md +21 -0
  205. package/docs/plugins.md +28 -13
  206. package/docs/runtime-invariant-coverage.md +18 -17
  207. package/docs/runtime-prompt-policy-contracts.md +27 -17
  208. package/package.json +4 -3
  209. package/plugins/capability-brief/source/index.ts +5 -48
  210. package/plugins/capability-brief/src/index.cjs +46 -33
  211. package/plugins/system-probe/plugin.json +1 -0
  212. package/plugins/web/README.md +125 -0
  213. package/plugins/web/plugin.json +1 -1
  214. package/plugins/web/skills/web_fetch_skill/SKILL.md +2 -2
  215. package/plugins/web/skills/web_search_skill/SKILL.md +8 -4
  216. package/plugins/web/source/errors.ts +5 -1
  217. package/plugins/web/source/fetch-presentation.ts +61 -0
  218. package/plugins/web/source/fetch-service.ts +2 -31
  219. package/plugins/web/source/light/config.ts +196 -0
  220. package/plugins/web/source/light/crawl/origin-gate.ts +134 -0
  221. package/plugins/web/source/light/crawl/robots-cache.ts +71 -0
  222. package/plugins/web/source/light/crawl/robots-parser.ts +132 -0
  223. package/plugins/web/source/light/crawl/robots-policy.ts +154 -0
  224. package/plugins/web/source/light/crawl/session-budget.ts +141 -0
  225. package/plugins/web/source/light/crawl/transport.ts +216 -0
  226. package/plugins/web/source/light/discovery/candidate-values.ts +63 -0
  227. package/plugins/web/source/light/discovery/feed-document.ts +127 -0
  228. package/plugins/web/source/light/discovery/html-links.ts +80 -0
  229. package/plugins/web/source/light/discovery/html-robots-directives.ts +29 -0
  230. package/plugins/web/source/light/discovery/markup-tree.ts +145 -0
  231. package/plugins/web/source/light/discovery/origin-dates.ts +71 -0
  232. package/plugins/web/source/light/discovery/sitemap-document.ts +63 -0
  233. package/plugins/web/source/light/documents/cache-policy.ts +28 -0
  234. package/plugins/web/source/light/documents/document-cache.ts +99 -0
  235. package/plugins/web/source/light/documents/document-charset.ts +89 -0
  236. package/plugins/web/source/light/documents/document-contract.ts +20 -0
  237. package/plugins/web/source/light/documents/document-reader.ts +75 -0
  238. package/plugins/web/source/light/documents/extract-document.ts +124 -0
  239. package/plugins/web/source/light/documents/http-cache-freshness.ts +68 -0
  240. package/plugins/web/source/light/documents/response-decoding.ts +120 -0
  241. package/plugins/web/source/light/ranking/document-ranking.ts +114 -0
  242. package/plugins/web/source/light/ranking/query-normalization.ts +69 -0
  243. package/plugins/web/source/light/search-collection.ts +136 -0
  244. package/plugins/web/source/light/search-frontier.ts +246 -0
  245. package/plugins/web/source/light/search-metadata.ts +84 -0
  246. package/plugins/web/source/light/search-service.ts +154 -0
  247. package/plugins/web/source/light/search-unavailable.ts +33 -0
  248. package/plugins/web/source/light/sources/catalog.ts +312 -0
  249. package/plugins/web/source/light/sources/source-definition.ts +9 -0
  250. package/plugins/web/source/light/sources/source-selection.ts +35 -0
  251. package/plugins/web/source/plugin.ts +70 -56
  252. package/plugins/web/source/public-http.ts +10 -1
  253. package/plugins/web/source/search-presentation.ts +63 -63
  254. package/plugins/web/source/search-service-selector.ts +31 -0
  255. package/plugins/web/source/search-service.ts +6 -0
  256. package/plugins/web/source/search-source-presentation.ts +76 -0
  257. package/plugins/web/source/search-types.ts +4 -0
  258. package/plugins/web/source/source-output-receipts.ts +267 -0
  259. package/plugins/web/source/source-receipt-budget.ts +51 -0
  260. package/plugins/web/source/source-receipt-contract.ts +18 -0
  261. package/plugins/web/src/index.cjs +3214 -288
  262. package/src/runtime/README.md +30 -9
  263. package/dist/src/model-gateway/structured-output/budget.d.ts +0 -7
  264. package/dist/src/model-gateway/structured-output/budget.js +0 -20
  265. package/dist/src/model-gateway/structured-output/schema-character-estimator.d.ts +0 -1
  266. package/dist/src/model-gateway/structured-output/schema-character-estimator.js +0 -211
  267. package/dist/src/model-gateway/structured-output-budget.d.ts +0 -1
  268. package/dist/src/model-gateway/structured-output-budget.js +0 -1
@@ -0,0 +1,187 @@
1
+ import { exactKeys, isRecord } from "../../validation/strict-record.js";
2
+ import { ROLE_CALL_RESULT_MAX_LENGTH, SUPERVISOR_WORKER_V1_AUTHORITY_SNAPSHOT, } from "./contracts.js";
3
+ import { createCanonicalRoleCallWorkResultLineage, projectRoleCallWorkResultLineage, } from "./work-result-lineage.js";
4
+ export const ROLE_CALL_WORK_RESULT_RECEIPT_KIND = "work_result_v1";
5
+ export const ROLE_CALL_WORK_RESULT_FINGERPRINT_PATTERN = /^sha256:[a-f0-9]{64}$/u;
6
+ const ROLE_CALL_WORK_RESULT_REFERENCE_MAX_LENGTH = 256;
7
+ export function normalizeRoleCallWorkResultReceipt(input) {
8
+ if (input === undefined)
9
+ return undefined;
10
+ if (!isRecord(input))
11
+ return null;
12
+ if (!hasExactWorkResultReceiptKeys(input))
13
+ return null;
14
+ if (input.kind !== ROLE_CALL_WORK_RESULT_RECEIPT_KIND)
15
+ return null;
16
+ if (!isBoundedReference(input.producerCallId))
17
+ return null;
18
+ if (!isBoundedReference(input.callerCallId))
19
+ return null;
20
+ if (!isNonNegativeSafeInteger(input.sourceRevision))
21
+ return null;
22
+ if (!isLineageFingerprint(input.lineageFingerprint))
23
+ return null;
24
+ const plannerPlanRef = normalizePlannerPlanReference(input.plannerPlanRef);
25
+ if (plannerPlanRef === null)
26
+ return null;
27
+ const receipt = {
28
+ kind: ROLE_CALL_WORK_RESULT_RECEIPT_KIND,
29
+ producerCallId: input.producerCallId.trim(),
30
+ callerCallId: input.callerCallId.trim(),
31
+ sourceRevision: input.sourceRevision,
32
+ lineageFingerprint: input.lineageFingerprint,
33
+ ...(plannerPlanRef ? { plannerPlanRef } : {}),
34
+ };
35
+ if (JSON.stringify(receipt).length > ROLE_CALL_RESULT_MAX_LENGTH)
36
+ return null;
37
+ return deepFreeze(receipt);
38
+ }
39
+ export function mustIssueSupervisorWorkResultReceipt(input) {
40
+ if (input.child.roleId !== "planner" && input.child.roleId !== "worker") {
41
+ return false;
42
+ }
43
+ const expected = SUPERVISOR_WORKER_V1_AUTHORITY_SNAPSHOT;
44
+ return (input.policy.authority.id === expected.id &&
45
+ input.policy.authority.version === expected.version &&
46
+ input.policy.authority.definitionHash === expected.definitionHash);
47
+ }
48
+ export function createCanonicalRoleCallWorkResultReceipt(input) {
49
+ if (!mustIssueSupervisorWorkResultReceipt(input))
50
+ return null;
51
+ if (!hasCanonicalReturnBinding(input))
52
+ return null;
53
+ const sourceRevision = input.admittedHeadRevision;
54
+ if (sourceRevision === undefined)
55
+ return null;
56
+ const lineage = createCanonicalRoleCallWorkResultLineage({
57
+ state: input.state,
58
+ producer: input.child,
59
+ resultRef: input.resultRef,
60
+ outcome: input.outcome,
61
+ sourceRevision,
62
+ });
63
+ if (!lineage)
64
+ return null;
65
+ const receipt = normalizeRoleCallWorkResultReceipt({
66
+ kind: ROLE_CALL_WORK_RESULT_RECEIPT_KIND,
67
+ producerCallId: input.child.callId,
68
+ callerCallId: input.caller.callId,
69
+ sourceRevision,
70
+ lineageFingerprint: lineage.lineageFingerprint,
71
+ ...(lineage.planner
72
+ ? {
73
+ plannerPlanRef: {
74
+ planId: lineage.planner.planId,
75
+ planVersion: lineage.planner.planVersion,
76
+ },
77
+ }
78
+ : {}),
79
+ });
80
+ return receipt ?? null;
81
+ }
82
+ export function isRoleCallWorkResultReceiptValidForStoredResult(input) {
83
+ const receipt = normalizeRoleCallWorkResultReceipt(input.receipt);
84
+ if (!receipt)
85
+ return false;
86
+ if (!mustIssueSupervisorWorkResultReceipt({
87
+ child: input.producer,
88
+ policy: input.policy,
89
+ })) {
90
+ return false;
91
+ }
92
+ if (!isStoredResultBoundToReceipt(input, receipt))
93
+ return false;
94
+ return projectRoleCallWorkResultLineage({
95
+ state: input.state,
96
+ receipt,
97
+ }) !== null;
98
+ }
99
+ function hasExactWorkResultReceiptKeys(input) {
100
+ return exactKeys(input, [
101
+ "kind",
102
+ "producerCallId",
103
+ "callerCallId",
104
+ "sourceRevision",
105
+ "lineageFingerprint",
106
+ ], ["plannerPlanRef"]);
107
+ }
108
+ function normalizePlannerPlanReference(input) {
109
+ if (input === undefined)
110
+ return undefined;
111
+ if (!isRecord(input))
112
+ return null;
113
+ if (!exactKeys(input, ["planId", "planVersion"]))
114
+ return null;
115
+ if (!isBoundedReference(input.planId))
116
+ return null;
117
+ if (!isPositiveSafeInteger(input.planVersion))
118
+ return null;
119
+ return Object.freeze({
120
+ planId: input.planId.trim(),
121
+ planVersion: input.planVersion,
122
+ });
123
+ }
124
+ function hasCanonicalReturnBinding(input) {
125
+ if (!isNonNegativeSafeInteger(input.admittedHeadRevision))
126
+ return false;
127
+ if (!isBoundedReference(input.resultRef))
128
+ return false;
129
+ if (input.state.phase !== "running")
130
+ return false;
131
+ if (input.state.activeCallId !== input.child.callId)
132
+ return false;
133
+ const canonicalCaller = input.state.calls.find(({ callId }) => callId === input.caller.callId);
134
+ const canonicalChild = input.state.calls.find(({ callId }) => callId === input.child.callId);
135
+ if (canonicalCaller !== input.caller || canonicalChild !== input.child) {
136
+ return false;
137
+ }
138
+ if (input.caller.status !== "waiting_for_child")
139
+ return false;
140
+ if (input.child.status !== "active" || input.child.resultRef !== null) {
141
+ return false;
142
+ }
143
+ if (input.child.parentCallId !== input.caller.callId)
144
+ return false;
145
+ if (!input.caller.childCallIds.includes(input.child.callId))
146
+ return false;
147
+ return input.outcome === "completed" || input.outcome === "failed";
148
+ }
149
+ function isStoredResultBoundToReceipt(input, receipt) {
150
+ if (input.producer.callId !== receipt.producerCallId)
151
+ return false;
152
+ if (input.producer.parentCallId !== receipt.callerCallId)
153
+ return false;
154
+ if (input.producer.status !== "completed")
155
+ return false;
156
+ if (input.producer.resultRef !== input.result.resultRef)
157
+ return false;
158
+ if (input.result.producerCallId !== input.producer.callId)
159
+ return false;
160
+ if (input.result.roleId !== input.producer.roleId)
161
+ return false;
162
+ return input.state.results.includes(input.result);
163
+ }
164
+ function isBoundedReference(input) {
165
+ return (typeof input === "string" &&
166
+ input.trim().length > 0 &&
167
+ input.length <= ROLE_CALL_WORK_RESULT_REFERENCE_MAX_LENGTH);
168
+ }
169
+ function isNonNegativeSafeInteger(input) {
170
+ return Number.isSafeInteger(input) && input >= 0;
171
+ }
172
+ function isPositiveSafeInteger(input) {
173
+ return Number.isSafeInteger(input) && input >= 1;
174
+ }
175
+ function isLineageFingerprint(input) {
176
+ return (typeof input === "string" &&
177
+ ROLE_CALL_WORK_RESULT_FINGERPRINT_PATTERN.test(input));
178
+ }
179
+ function deepFreeze(value) {
180
+ if (typeof value !== "object" || value === null || Object.isFrozen(value)) {
181
+ return value;
182
+ }
183
+ Object.freeze(value);
184
+ for (const child of Object.values(value))
185
+ deepFreeze(child);
186
+ return value;
187
+ }
@@ -1,12 +1,14 @@
1
- import { isRoleCallWorkingDirectoryRoleId, normalizeRoleCallWorkingDirectory, parseRoleCallPlanBinding, parseRoleCallWorkerCapabilityScope, } from "../../role-calls/index.js";
1
+ import { isRoleCallWorkingDirectoryRoleId, normalizeRoleCallWorkingDirectory, normalizeRoleCallResultReceipt, parseRoleCallPlanBinding, parseRoleCallWorkerCapabilityScope, } from "../../role-calls/index.js";
2
2
  import { isRuntimeDelegateRoleId } from "../../roles.js";
3
3
  export function normalizeRoleExecutorActivationResult(input, maxSummaryLength, maxObjectiveLength) {
4
4
  if (!isPlainRecord(input)) {
5
5
  return { ok: false, issueCode: "result_not_object" };
6
6
  }
7
7
  if (input.kind === "terminal") {
8
- if (!hasExactKeys(input, ["kind", "outcome", "summary"], ["value"]) ||
9
- (input.outcome !== "completed" && input.outcome !== "failed")) {
8
+ const receipt = normalizeRoleCallResultReceipt(input.receipt);
9
+ if (!hasExactKeys(input, ["kind", "outcome", "summary"], ["receipt", "value"]) ||
10
+ (input.outcome !== "completed" && input.outcome !== "failed") ||
11
+ receipt === null) {
10
12
  return { ok: false, issueCode: "terminal_shape_invalid" };
11
13
  }
12
14
  if (typeof input.summary !== "string" ||
@@ -20,6 +22,7 @@ export function normalizeRoleExecutorActivationResult(input, maxSummaryLength, m
20
22
  kind: "terminal",
21
23
  outcome: input.outcome,
22
24
  summary: input.summary.trim(),
25
+ ...(receipt ? { receipt } : {}),
23
26
  ...(input.value !== undefined ? { value: input.value } : {}),
24
27
  }),
25
28
  };
@@ -169,6 +169,7 @@ export class ChildInvocationTransaction {
169
169
  childCallId: openedChild.call.callId,
170
170
  outcome: execution.outcome,
171
171
  summary: execution.summary,
172
+ ...(execution.receipt ? { receipt: execution.receipt } : {}),
172
173
  });
173
174
  if (!returnedResult.ok) {
174
175
  this.rejectChild({
@@ -1,10 +1,11 @@
1
- import type { RoleCallChildReturnCommit, RoleCallFrame, RoleCallLedger, RoleCallLedgerHead, RoleCallOperationSupervisionInterventionCommit, RoleCallPlanBinding, RoleCallWorkerCapabilityScope } from "../role-calls/index.js";
1
+ import type { RoleCallChildReturnCommit, RoleCallFrame, RoleCallLedger, RoleCallLedgerHead, RoleCallOperationSupervisionInterventionCommit, RoleCallPlanBinding, RoleCallResultReceipt, RoleCallWorkerCapabilityScope } from "../role-calls/index.js";
2
2
  import type { RuntimeDelegateRoleId } from "../roles.js";
3
3
  export type RoleExecutionOutcome = "completed" | "failed";
4
4
  export type RoleExecutionResult<TValue = unknown> = Readonly<{
5
5
  kind: "terminal";
6
6
  outcome: RoleExecutionOutcome;
7
7
  summary: string;
8
+ receipt?: RoleCallResultReceipt;
8
9
  value?: TValue;
9
10
  }>;
10
11
  export type RoleChildInvocationResult<TValue = unknown> = Readonly<{
@@ -0,0 +1,36 @@
1
+ import type { RoleCallFrame, RoleCallLedgerHead } from "../role-calls/contracts.js";
2
+ import type { WorkerCapabilityAssignmentProvenance } from "./contracts.js";
3
+ type WorkerCapabilityAssignmentIdentity = RoleCallFrame | Readonly<{
4
+ callId: string;
5
+ parentCallId: string | null;
6
+ depth: number;
7
+ objective: string;
8
+ invocationAttempt: number;
9
+ }>;
10
+ export type WorkerCapabilityDependencyArtifactReceipt = Readonly<{
11
+ sourceExecutionId: string;
12
+ targetPath: string;
13
+ }>;
14
+ export type WorkerCapabilityPlannerItemBinding = Readonly<{
15
+ plannerCallId: string;
16
+ planId: string;
17
+ itemId: string;
18
+ workerCallId: string;
19
+ }>;
20
+ /** Resolves one direct Planner-item binding from the canonical ledger head. */
21
+ export declare function projectWorkerCapabilityPlannerItemBinding(head: RoleCallLedgerHead, call: RoleCallFrame): WorkerCapabilityPlannerItemBinding | undefined;
22
+ /** Projects the canonical proof that one Worker owns one bound Planner item. */
23
+ export declare function projectWorkerCapabilityAssignmentProvenance(params: Readonly<{
24
+ head: RoleCallLedgerHead;
25
+ call: RoleCallFrame;
26
+ }>): WorkerCapabilityAssignmentProvenance | undefined;
27
+ /** Validates the canonical receipt against the exact consuming Worker call. */
28
+ export declare function isWorkerCapabilityAssignmentProvenanceValid(provenance: WorkerCapabilityAssignmentProvenance | undefined, identity: WorkerCapabilityAssignmentIdentity, requestId: string): boolean;
29
+ /** Resolves model-visible request scope only from a verified runtime receipt. */
30
+ export declare function projectWorkerRequestSourceProjection(provenance: WorkerCapabilityAssignmentProvenance | undefined, identity: WorkerCapabilityAssignmentIdentity, requestId: string): "full_request" | "assignment_only";
31
+ /**
32
+ * Resolves only successful artifact references produced by the exact direct
33
+ * sibling results canonically attached to one Planner-bound Worker.
34
+ */
35
+ export declare function projectWorkerCapabilityDependencyArtifactReceipts(provenance: WorkerCapabilityAssignmentProvenance | undefined, call: RoleCallFrame): readonly WorkerCapabilityDependencyArtifactReceipt[];
36
+ export {};
@@ -0,0 +1,171 @@
1
+ import { projectRoleCallDependencyResults } from "../role-calls/dependency-results.js";
2
+ const WORKER_ASSIGNMENT_AUTHORITY = Symbol("workerAssignmentAuthority");
3
+ const EMPTY_DEPENDENCY_ARTIFACT_RECEIPTS = Object.freeze([]);
4
+ /** Resolves one direct Planner-item binding from the canonical ledger head. */
5
+ export function projectWorkerCapabilityPlannerItemBinding(head, call) {
6
+ const canonicalCall = head.state.calls.find(({ callId }) => callId === call.callId);
7
+ if (canonicalCall !== call) {
8
+ throw new Error("worker_assignment_provenance_authority_invalid");
9
+ }
10
+ if (call.roleId !== "worker" || call.parentCallId === null)
11
+ return undefined;
12
+ const parent = head.state.calls.find(({ callId }) => callId === call.parentCallId);
13
+ if (!parent || parent.depth !== call.depth - 1) {
14
+ throw new Error("worker_assignment_provenance_parent_invalid");
15
+ }
16
+ if (parent.roleId !== "planner")
17
+ return undefined;
18
+ const plan = head.state.plans.find(({ definition }) => definition.plannerCallId === parent.callId);
19
+ const boundItems = plan?.itemStates.filter(({ childCallId }) => childCallId === call.callId);
20
+ if (!plan || !boundItems) {
21
+ throw new Error("worker_assignment_provenance_plan_binding_invalid");
22
+ }
23
+ if (boundItems.length !== 1) {
24
+ throw new Error("worker_assignment_provenance_plan_binding_invalid");
25
+ }
26
+ return Object.freeze({
27
+ plannerCallId: parent.callId,
28
+ planId: plan.definition.planId,
29
+ itemId: boundItems[0].itemId,
30
+ workerCallId: call.callId,
31
+ });
32
+ }
33
+ /** Projects the canonical proof that one Worker owns one bound Planner item. */
34
+ export function projectWorkerCapabilityAssignmentProvenance(params) {
35
+ const canonicalCall = params.head.state.calls.find(({ callId }) => callId === params.call.callId);
36
+ if (canonicalCall !== params.call || canonicalCall.roleId !== "worker") {
37
+ throw new Error("worker_assignment_provenance_authority_invalid");
38
+ }
39
+ const binding = projectWorkerCapabilityPlannerItemBinding(params.head, canonicalCall);
40
+ if (!binding)
41
+ return undefined;
42
+ assertPlannerItemIsActive(params.head, binding);
43
+ const provenance = {
44
+ kind: "planner_plan_item_v1",
45
+ requestId: params.head.state.requestId,
46
+ sourceRevision: params.head.revision,
47
+ ...binding,
48
+ invocationAttempt: canonicalCall.activationCount,
49
+ };
50
+ const authority = Object.freeze({
51
+ receipt: provenance,
52
+ requestId: params.head.state.requestId,
53
+ head: params.head,
54
+ call: canonicalCall,
55
+ });
56
+ Object.defineProperty(provenance, WORKER_ASSIGNMENT_AUTHORITY, {
57
+ value: authority,
58
+ enumerable: false,
59
+ configurable: false,
60
+ writable: false,
61
+ });
62
+ return Object.freeze(provenance);
63
+ }
64
+ /** Validates the canonical receipt against the exact consuming Worker call. */
65
+ export function isWorkerCapabilityAssignmentProvenanceValid(provenance, identity, requestId) {
66
+ if (provenance === undefined)
67
+ return true;
68
+ const authority = readWorkerAssignmentAuthority(provenance);
69
+ if (!authority)
70
+ return false;
71
+ if (authority.requestId !== requestId)
72
+ return false;
73
+ if (!Object.isFrozen(provenance))
74
+ return false;
75
+ if (provenance.kind !== "planner_plan_item_v1")
76
+ return false;
77
+ if (provenance.requestId !== requestId)
78
+ return false;
79
+ if (provenance.workerCallId !== identity.callId)
80
+ return false;
81
+ if (provenance.plannerCallId !== identity.parentCallId)
82
+ return false;
83
+ const invocationAttempt = "activationCount" in identity
84
+ ? identity.activationCount
85
+ : identity.invocationAttempt;
86
+ if (provenance.invocationAttempt !== invocationAttempt)
87
+ return false;
88
+ if ("activationCount" in identity) {
89
+ return identity.roleId === "worker" && authority.call === identity;
90
+ }
91
+ return (authority.call.depth === identity.depth &&
92
+ authority.call.objective === identity.objective);
93
+ }
94
+ /** Resolves model-visible request scope only from a verified runtime receipt. */
95
+ export function projectWorkerRequestSourceProjection(provenance, identity, requestId) {
96
+ if (!isWorkerCapabilityAssignmentProvenanceValid(provenance, identity, requestId)) {
97
+ throw new Error("worker_assignment_provenance_receipt_invalid");
98
+ }
99
+ return provenance ? "assignment_only" : "full_request";
100
+ }
101
+ /**
102
+ * Resolves only successful artifact references produced by the exact direct
103
+ * sibling results canonically attached to one Planner-bound Worker.
104
+ */
105
+ export function projectWorkerCapabilityDependencyArtifactReceipts(provenance, call) {
106
+ if (!provenance)
107
+ return EMPTY_DEPENDENCY_ARTIFACT_RECEIPTS;
108
+ if (!isWorkerCapabilityAssignmentProvenanceValid(provenance, call, provenance.requestId)) {
109
+ throw new Error("worker_assignment_provenance_receipt_invalid");
110
+ }
111
+ const authority = readWorkerAssignmentAuthority(provenance);
112
+ if (!authority || authority.head.revision !== provenance.sourceRevision) {
113
+ throw new Error("worker_assignment_provenance_receipt_invalid");
114
+ }
115
+ const dependencies = projectRoleCallDependencyResults(authority.head, call);
116
+ const receipts = dependencies.flatMap((dependency) => {
117
+ if (dependency.roleId !== "worker" || dependency.outcome !== "completed") {
118
+ return [];
119
+ }
120
+ return projectDependencyProducerArtifactReceipts(authority.head, dependency.producerCallId);
121
+ });
122
+ return Object.freeze(receipts);
123
+ }
124
+ function projectDependencyProducerArtifactReceipts(head, producerCallId) {
125
+ const receipts = [];
126
+ for (const execution of head.state.capabilityExecutions) {
127
+ if (execution.callId !== producerCallId)
128
+ continue;
129
+ if (execution.status !== "settled" || execution.outcome !== "succeeded") {
130
+ continue;
131
+ }
132
+ for (const reference of execution.references ?? []) {
133
+ receipts.push(Object.freeze({
134
+ sourceExecutionId: execution.executionId,
135
+ targetPath: reference.target,
136
+ }));
137
+ }
138
+ }
139
+ return receipts;
140
+ }
141
+ function assertPlannerItemIsActive(head, binding) {
142
+ const plan = head.state.plans.find(({ definition }) => definition.planId === binding.planId);
143
+ if (!plan) {
144
+ throw new Error("worker_assignment_provenance_plan_binding_invalid");
145
+ }
146
+ const item = plan?.itemStates.find(({ itemId }) => itemId === binding.itemId);
147
+ if (!item || item.childCallId !== binding.workerCallId) {
148
+ throw new Error("worker_assignment_provenance_plan_binding_invalid");
149
+ }
150
+ if (item.status !== "in_progress") {
151
+ throw new Error("worker_assignment_provenance_plan_binding_invalid");
152
+ }
153
+ }
154
+ function readWorkerAssignmentAuthority(provenance) {
155
+ if (typeof provenance !== "object" || provenance === null)
156
+ return undefined;
157
+ const descriptor = Object.getOwnPropertyDescriptor(provenance, WORKER_ASSIGNMENT_AUTHORITY);
158
+ if (!descriptor ||
159
+ descriptor.enumerable ||
160
+ descriptor.configurable ||
161
+ descriptor.writable) {
162
+ return undefined;
163
+ }
164
+ const authority = descriptor.value;
165
+ if (typeof authority !== "object" || authority === null)
166
+ return undefined;
167
+ if (!Object.isFrozen(authority))
168
+ return undefined;
169
+ const candidate = authority;
170
+ return candidate.receipt === provenance ? candidate : undefined;
171
+ }
@@ -1,5 +1,5 @@
1
1
  import { type RoleCallFrame, type RoleCallDependencyResult, type RoleCallLedger, type RoleCallOperationSupervisionInterventionCommit, type RoleCapabilityEffect, type RoleCapabilityDeclaredEffect, type RoleCapabilityExecutionOutcome, type RoleCapabilityObservedEffect, type RoleCapabilityResultReference } from "../role-calls/index.js";
2
- import type { ToolCatalogGroup } from "../../../capabilities/tool-types.js";
2
+ import type { ToolCatalogGroup, ToolDevelopmentRole, ToolRoutingCapability } from "../../../capabilities/tool-types.js";
3
3
  import type { CapabilityAdapterResult } from "../capability-adapters/result.js";
4
4
  export declare const WORKER_CAPABILITY_ID_MAX_LENGTH = 128;
5
5
  /** Client-facing capability narration; never an execution objective or payload. */
@@ -16,6 +16,30 @@ export declare const WORKER_CAPABILITY_CONTROL_ENUM_VALUE_MAX_LENGTH = 256;
16
16
  export declare const WORKER_CAPABILITY_CONTROL_ARRAY_MAX_ITEMS = 64;
17
17
  export type WorkerCapabilityEffect = RoleCapabilityDeclaredEffect;
18
18
  export type WorkerCapabilityObservedEffect = RoleCapabilityObservedEffect;
19
+ declare const WORKER_CAPABILITY_ASSIGNMENT_PROVENANCE_BRAND: unique symbol;
20
+ export type WorkerCapabilityAssignmentProvenance = Readonly<{
21
+ kind: "planner_plan_item_v1";
22
+ requestId: string;
23
+ sourceRevision: number;
24
+ plannerCallId: string;
25
+ planId: string;
26
+ itemId: string;
27
+ workerCallId: string;
28
+ invocationAttempt: number;
29
+ readonly [WORKER_CAPABILITY_ASSIGNMENT_PROVENANCE_BRAND]: true;
30
+ }>;
31
+ declare const WORKER_CAPABILITY_REQUEST_PROVENANCE_BRAND: unique symbol;
32
+ export type WorkerCapabilityRequestScopedProvenance = Readonly<{
33
+ kind: "request_scoped_worker_v1";
34
+ requestId: string;
35
+ sourceRevision: number;
36
+ callerCallId: string;
37
+ workerCallId: string;
38
+ invocationAttempt: number;
39
+ readonly [WORKER_CAPABILITY_REQUEST_PROVENANCE_BRAND]: true;
40
+ }>;
41
+ /** Runtime-issued request-source authority for one Worker payload. */
42
+ export type WorkerCapabilityPayloadSourceProvenance = WorkerCapabilityAssignmentProvenance | WorkerCapabilityRequestScopedProvenance;
19
43
  export type WorkerCapabilityBoundedStringControl = Readonly<{
20
44
  type: "string";
21
45
  minLength: number;
@@ -65,6 +89,10 @@ export type WorkerCapabilityDescriptor = Readonly<{
65
89
  controlsRefinement?: "mechanical_when_complete";
66
90
  /** Manifest-owned routing metadata projected only in capability selection. */
67
91
  catalogGroups?: readonly ToolCatalogGroup[];
92
+ /** Manifest-owned semantic routing class for this capability. */
93
+ routingCapability?: ToolRoutingCapability;
94
+ /** Manifest-owned development phases served by this capability. */
95
+ developmentRoles?: readonly ToolDevelopmentRole[];
68
96
  /** Canonical payload contract requires a Worker authoring receipt. */
69
97
  requiresPayloadAuthoringObjective?: true;
70
98
  }>;
@@ -110,6 +138,8 @@ export type WorkerCapabilityAdapterResult = Readonly<{
110
138
  export type WorkerCapabilityAdapterExecutionInput<TContext> = Readonly<{
111
139
  context: TContext;
112
140
  call: RoleCallFrame;
141
+ /** Runtime-only proof of the exact request source allowed for this payload. */
142
+ assignmentProvenance?: WorkerCapabilityPayloadSourceProvenance;
113
143
  executionId: string;
114
144
  /** Client-facing presentation metadata for lifecycle events only. */
115
145
  intent: string;
@@ -219,3 +249,4 @@ export type WorkerCapabilityBinding<TContext> = Readonly<{
219
249
  }>[];
220
250
  }>): Promise<WorkerCapabilityBatchAttemptReference>;
221
251
  }>;
252
+ export {};
@@ -1,5 +1,5 @@
1
1
  import { type RoleCallDependencyResult, type RoleCallFrame } from "../../role-calls/index.js";
2
- import type { WorkerCapabilityAdapter, WorkerCapabilityControls, WorkerCapabilityExecutionFreshness, WorkerCapabilityPreparedExecution, WorkerSettledCapabilityResult } from "../contracts.js";
2
+ import type { WorkerCapabilityAdapter, WorkerCapabilityControls, WorkerCapabilityExecutionFreshness, WorkerCapabilityPayloadSourceProvenance, WorkerCapabilityPreparedExecution, WorkerSettledCapabilityResult } from "../contracts.js";
3
3
  export type PreparedBoundInvocation<TContext> = Readonly<{
4
4
  adapter: WorkerCapabilityAdapter<TContext>;
5
5
  intent: string;
@@ -10,6 +10,7 @@ export type PreparedBoundInvocation<TContext> = Readonly<{
10
10
  type BoundInvocationPreparationParams<TContext> = Readonly<{
11
11
  context: TContext;
12
12
  call: RoleCallFrame;
13
+ assignmentProvenance?: WorkerCapabilityPayloadSourceProvenance;
13
14
  adapter: WorkerCapabilityAdapter<TContext>;
14
15
  intent: string;
15
16
  authoringObjective?: string;
@@ -6,6 +6,9 @@ export async function prepareBoundInvocation(params) {
6
6
  const common = Object.freeze({
7
7
  context: params.context,
8
8
  call: params.call,
9
+ ...(params.assignmentProvenance
10
+ ? { assignmentProvenance: params.assignmentProvenance }
11
+ : {}),
9
12
  intent: params.intent,
10
13
  ...(params.authoringObjective
11
14
  ? { authoringObjective: params.authoringObjective }
@@ -1,6 +1,7 @@
1
1
  import { assertExecutionCapabilityScope, projectExecutionSettledCapabilityResults, } from "./execution/context-projection.js";
2
2
  import { createPreparationId, deduplicatePreparedInvocations, prepareBoundInvocation, } from "./execution/invocation-preparation.js";
3
3
  import { beginAndSettlePreparedBatch, beginAndSettlePreparedSingle, } from "./execution/ledger-transaction.js";
4
+ import { projectWorkerCapabilityPayloadSourceProvenance } from "./payload-source-provenance.js";
4
5
  export async function executeBoundWorkerCapability(params) {
5
6
  assertExecutionCapabilityScope(params.capabilityScope, params.adapter.descriptor, params.diagnostic);
6
7
  const settledCapabilityResults = projectExecutionSettledCapabilityResults({
@@ -10,9 +11,11 @@ export async function executeBoundWorkerCapability(params) {
10
11
  descriptors: [params.adapter.descriptor],
11
12
  diagnostic: params.diagnostic,
12
13
  });
14
+ const assignmentProvenance = projectPayloadSourceProvenance(params);
13
15
  const prepared = await prepareBoundInvocation({
14
16
  context: params.context,
15
17
  call: params.call,
18
+ ...(assignmentProvenance ? { assignmentProvenance } : {}),
16
19
  adapter: params.adapter,
17
20
  intent: params.intent,
18
21
  ...(params.authoringObjective
@@ -61,27 +64,36 @@ export async function executeBoundWorkerCapabilityBatch(params) {
61
64
  descriptors: params.invocations.map(({ adapter }) => adapter.descriptor),
62
65
  diagnostic: params.diagnostic,
63
66
  });
64
- const preparedInvocations = await Promise.all(params.invocations.map(async (invocation, index) => Object.freeze({
65
- ...invocation,
66
- prepared: await prepareBoundInvocation({
67
- context: params.context,
67
+ const preparedInvocations = await Promise.all(params.invocations.map(async (invocation, index) => {
68
+ const assignmentProvenance = projectPayloadSourceProvenance({
69
+ ledger: params.ledger,
70
+ currentHead: params.currentHead,
68
71
  call: params.call,
69
72
  adapter: invocation.adapter,
70
- intent: invocation.intent,
71
- ...(invocation.authoringObjective
72
- ? { authoringObjective: invocation.authoringObjective }
73
- : {}),
74
- controls: invocation.controls,
75
- preparationId: createPreparationId(params.call, index),
76
- settledCapabilityResults,
77
- ...(params.dependencyResults
78
- ? { dependencyResults: params.dependencyResults }
79
- : {}),
80
- ...(params.executionFreshness
81
- ? { executionFreshness: params.executionFreshness }
82
- : {}),
83
- }),
84
- })));
73
+ });
74
+ return Object.freeze({
75
+ ...invocation,
76
+ prepared: await prepareBoundInvocation({
77
+ context: params.context,
78
+ call: params.call,
79
+ ...(assignmentProvenance ? { assignmentProvenance } : {}),
80
+ adapter: invocation.adapter,
81
+ intent: invocation.intent,
82
+ ...(invocation.authoringObjective
83
+ ? { authoringObjective: invocation.authoringObjective }
84
+ : {}),
85
+ controls: invocation.controls,
86
+ preparationId: createPreparationId(params.call, index),
87
+ settledCapabilityResults,
88
+ ...(params.dependencyResults
89
+ ? { dependencyResults: params.dependencyResults }
90
+ : {}),
91
+ ...(params.executionFreshness
92
+ ? { executionFreshness: params.executionFreshness }
93
+ : {}),
94
+ }),
95
+ });
96
+ }));
85
97
  const uniqueInvocations = deduplicatePreparedInvocations(preparedInvocations);
86
98
  return settlePreparedInvocationBatch({
87
99
  currentHead: params.currentHead,
@@ -94,6 +106,17 @@ export async function executeBoundWorkerCapabilityBatch(params) {
94
106
  : {}),
95
107
  });
96
108
  }
109
+ function projectPayloadSourceProvenance(params) {
110
+ if (params.call.roleId !== "worker" ||
111
+ params.adapter?.descriptor.requiresPayloadAuthoringObjective !== true) {
112
+ return undefined;
113
+ }
114
+ return projectWorkerCapabilityPayloadSourceProvenance({
115
+ ledger: params.ledger,
116
+ head: params.currentHead,
117
+ call: params.call,
118
+ });
119
+ }
97
120
  async function settlePreparedInvocationBatch(params) {
98
121
  if (params.invocations.length === 1) {
99
122
  return settleCollapsedPreparedBatch(params);
@@ -2,10 +2,12 @@ export * from "./batch-selection.js";
2
2
  export * from "./binding.js";
3
3
  export * from "./controls.js";
4
4
  export * from "./contracts.js";
5
+ export * from "./assignment-provenance.js";
5
6
  export * from "./errors.js";
6
7
  export * from "./outcome-fingerprint.js";
7
8
  export * from "./payload-author.js";
8
9
  export * from "./payload-contracts.js";
10
+ export { isWorkerCapabilityPayloadSourceProvenanceValid, projectWorkerPayloadPlannerItemProvenance, projectWorkerPayloadRequestSourceProjection, } from "./payload-source-provenance.js";
9
11
  export * from "./scope.js";
10
12
  export * from "./selection-controls.js";
11
13
  export * from "./settled-results.js";
@@ -2,10 +2,12 @@ export * from "./batch-selection.js";
2
2
  export * from "./binding.js";
3
3
  export * from "./controls.js";
4
4
  export * from "./contracts.js";
5
+ export * from "./assignment-provenance.js";
5
6
  export * from "./errors.js";
6
7
  export * from "./outcome-fingerprint.js";
7
8
  export * from "./payload-author.js";
8
9
  export * from "./payload-contracts.js";
10
+ export { isWorkerCapabilityPayloadSourceProvenanceValid, projectWorkerPayloadPlannerItemProvenance, projectWorkerPayloadRequestSourceProjection, } from "./payload-source-provenance.js";
9
11
  export * from "./scope.js";
10
12
  export * from "./selection-controls.js";
11
13
  export * from "./settled-results.js";
@@ -0,0 +1,3 @@
1
+ import type { WorkerCapabilityPayloadAuthor } from "./payload-contracts.js";
2
+ /** Validates payload assignment ownership before any model boundary is built. */
3
+ export declare function isWorkerCapabilityPayloadAssignmentValid(input: Parameters<WorkerCapabilityPayloadAuthor["author"]>[0], principalKind: "worker" | "root", requestId: string): boolean;