@stigmer/server 3.15.3-dev.20260914121148 → 3.16.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 (680) hide show
  1. package/README.md +3 -3
  2. package/dist/archive/content-store.d.ts +35 -0
  3. package/dist/archive/content-store.d.ts.map +1 -0
  4. package/dist/archive/content-store.js +98 -0
  5. package/dist/archive/content-store.js.map +1 -0
  6. package/dist/archive/inflate.d.ts +22 -0
  7. package/dist/archive/inflate.d.ts.map +1 -0
  8. package/dist/archive/inflate.js +75 -0
  9. package/dist/archive/inflate.js.map +1 -0
  10. package/dist/archive/limits.d.ts +33 -0
  11. package/dist/archive/limits.d.ts.map +1 -0
  12. package/dist/archive/limits.js +31 -0
  13. package/dist/archive/limits.js.map +1 -0
  14. package/dist/archive/open.d.ts +24 -0
  15. package/dist/archive/open.d.ts.map +1 -0
  16. package/dist/archive/open.js +93 -0
  17. package/dist/archive/open.js.map +1 -0
  18. package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
  19. package/dist/archive/prefilter.d.ts.map +1 -0
  20. package/dist/archive/prefilter.js.map +1 -0
  21. package/dist/archive/write.d.ts +8 -0
  22. package/dist/archive/write.d.ts.map +1 -0
  23. package/dist/archive/write.js +44 -0
  24. package/dist/archive/write.js.map +1 -0
  25. package/dist/authorization/authorizer.d.ts +98 -0
  26. package/dist/authorization/authorizer.d.ts.map +1 -0
  27. package/dist/authorization/authorizer.js +156 -0
  28. package/dist/authorization/authorizer.js.map +1 -0
  29. package/dist/authorization/derived-tuples.d.ts +42 -0
  30. package/dist/authorization/derived-tuples.d.ts.map +1 -0
  31. package/dist/authorization/derived-tuples.js +240 -0
  32. package/dist/authorization/derived-tuples.js.map +1 -0
  33. package/dist/authorization/evaluator.d.ts +66 -0
  34. package/dist/authorization/evaluator.d.ts.map +1 -0
  35. package/dist/authorization/evaluator.js +153 -0
  36. package/dist/authorization/evaluator.js.map +1 -0
  37. package/dist/authorization/facts.d.ts +29 -0
  38. package/dist/authorization/facts.d.ts.map +1 -0
  39. package/dist/authorization/facts.js +17 -0
  40. package/dist/authorization/facts.js.map +1 -0
  41. package/dist/authorization/lane-admission.d.ts +50 -0
  42. package/dist/authorization/lane-admission.d.ts.map +1 -0
  43. package/dist/authorization/lane-admission.js +13 -0
  44. package/dist/authorization/lane-admission.js.map +1 -0
  45. package/dist/authorization/list-read-scope.d.ts +18 -0
  46. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  47. package/dist/authorization/list-read-scope.js +155 -0
  48. package/dist/authorization/list-read-scope.js.map +1 -0
  49. package/dist/authorization/model/agent.d.ts +2 -0
  50. package/dist/authorization/model/agent.d.ts.map +1 -0
  51. package/dist/authorization/model/agent.js +42 -0
  52. package/dist/authorization/model/agent.js.map +1 -0
  53. package/dist/authorization/model/agent_channel.d.ts +2 -0
  54. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_channel.js +38 -0
  56. package/dist/authorization/model/agent_channel.js.map +1 -0
  57. package/dist/authorization/model/agent_execution.d.ts +2 -0
  58. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_execution.js +25 -0
  60. package/dist/authorization/model/agent_execution.js.map +1 -0
  61. package/dist/authorization/model/agent_instance.d.ts +2 -0
  62. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_instance.js +47 -0
  64. package/dist/authorization/model/agent_instance.js.map +1 -0
  65. package/dist/authorization/model/agent_share.d.ts +2 -0
  66. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  67. package/dist/authorization/model/agent_share.js +29 -0
  68. package/dist/authorization/model/agent_share.js.map +1 -0
  69. package/dist/authorization/model/api_key.d.ts +2 -0
  70. package/dist/authorization/model/api_key.d.ts.map +1 -0
  71. package/dist/authorization/model/api_key.js +27 -0
  72. package/dist/authorization/model/api_key.js.map +1 -0
  73. package/dist/authorization/model/artifact.d.ts +2 -0
  74. package/dist/authorization/model/artifact.d.ts.map +1 -0
  75. package/dist/authorization/model/artifact.js +27 -0
  76. package/dist/authorization/model/artifact.js.map +1 -0
  77. package/dist/authorization/model/channel_app.d.ts +2 -0
  78. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  79. package/dist/authorization/model/channel_app.js +28 -0
  80. package/dist/authorization/model/channel_app.js.map +1 -0
  81. package/dist/authorization/model/default-of.d.ts +38 -0
  82. package/dist/authorization/model/default-of.d.ts.map +1 -0
  83. package/dist/authorization/model/default-of.js +39 -0
  84. package/dist/authorization/model/default-of.js.map +1 -0
  85. package/dist/authorization/model/environment.d.ts +2 -0
  86. package/dist/authorization/model/environment.d.ts.map +1 -0
  87. package/dist/authorization/model/environment.js +33 -0
  88. package/dist/authorization/model/environment.js.map +1 -0
  89. package/dist/authorization/model/execution_context.d.ts +2 -0
  90. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  91. package/dist/authorization/model/execution_context.js +19 -0
  92. package/dist/authorization/model/execution_context.js.map +1 -0
  93. package/dist/authorization/model/iam_policy.d.ts +2 -0
  94. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  95. package/dist/authorization/model/iam_policy.js +31 -0
  96. package/dist/authorization/model/iam_policy.js.map +1 -0
  97. package/dist/authorization/model/identity_account.d.ts +2 -0
  98. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  99. package/dist/authorization/model/identity_account.js +25 -0
  100. package/dist/authorization/model/identity_account.js.map +1 -0
  101. package/dist/authorization/model/index.d.ts +36 -0
  102. package/dist/authorization/model/index.d.ts.map +1 -0
  103. package/dist/authorization/model/index.js +72 -0
  104. package/dist/authorization/model/index.js.map +1 -0
  105. package/dist/authorization/model/mcp_server.d.ts +2 -0
  106. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  107. package/dist/authorization/model/mcp_server.js +37 -0
  108. package/dist/authorization/model/mcp_server.js.map +1 -0
  109. package/dist/authorization/model/memory.d.ts +2 -0
  110. package/dist/authorization/model/memory.d.ts.map +1 -0
  111. package/dist/authorization/model/memory.js +26 -0
  112. package/dist/authorization/model/memory.js.map +1 -0
  113. package/dist/authorization/model/oauth_app.d.ts +2 -0
  114. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  115. package/dist/authorization/model/oauth_app.js +30 -0
  116. package/dist/authorization/model/oauth_app.js.map +1 -0
  117. package/dist/authorization/model/organization.d.ts +2 -0
  118. package/dist/authorization/model/organization.d.ts.map +1 -0
  119. package/dist/authorization/model/organization.js +54 -0
  120. package/dist/authorization/model/organization.js.map +1 -0
  121. package/dist/authorization/model/plugin.d.ts +2 -0
  122. package/dist/authorization/model/plugin.d.ts.map +1 -0
  123. package/dist/authorization/model/plugin.js +44 -0
  124. package/dist/authorization/model/plugin.js.map +1 -0
  125. package/dist/authorization/model/project.d.ts +2 -0
  126. package/dist/authorization/model/project.d.ts.map +1 -0
  127. package/dist/authorization/model/project.js +32 -0
  128. package/dist/authorization/model/project.js.map +1 -0
  129. package/dist/authorization/model/rewrite.d.ts +127 -0
  130. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  131. package/dist/authorization/model/rewrite.js +82 -0
  132. package/dist/authorization/model/rewrite.js.map +1 -0
  133. package/dist/authorization/model/schedule.d.ts +2 -0
  134. package/dist/authorization/model/schedule.d.ts.map +1 -0
  135. package/dist/authorization/model/schedule.js +29 -0
  136. package/dist/authorization/model/schedule.js.map +1 -0
  137. package/dist/authorization/model/session.d.ts +2 -0
  138. package/dist/authorization/model/session.d.ts.map +1 -0
  139. package/dist/authorization/model/session.js +38 -0
  140. package/dist/authorization/model/session.js.map +1 -0
  141. package/dist/authorization/model/skill.d.ts +2 -0
  142. package/dist/authorization/model/skill.d.ts.map +1 -0
  143. package/dist/authorization/model/skill.js +38 -0
  144. package/dist/authorization/model/skill.js.map +1 -0
  145. package/dist/authorization/model/workflow.d.ts +2 -0
  146. package/dist/authorization/model/workflow.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow.js +38 -0
  148. package/dist/authorization/model/workflow.js.map +1 -0
  149. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  150. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_execution.js +32 -0
  152. package/dist/authorization/model/workflow_execution.js.map +1 -0
  153. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  154. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  155. package/dist/authorization/model/workflow_instance.js +92 -0
  156. package/dist/authorization/model/workflow_instance.js.map +1 -0
  157. package/dist/authorization/organization-directory.d.ts +13 -0
  158. package/dist/authorization/organization-directory.d.ts.map +1 -0
  159. package/dist/authorization/organization-directory.js +83 -0
  160. package/dist/authorization/organization-directory.js.map +1 -0
  161. package/dist/authorization/person.d.ts +42 -0
  162. package/dist/authorization/person.d.ts.map +1 -0
  163. package/dist/authorization/person.js +19 -0
  164. package/dist/authorization/person.js.map +1 -0
  165. package/dist/authorization/posture.d.ts +38 -0
  166. package/dist/authorization/posture.d.ts.map +1 -0
  167. package/dist/authorization/posture.js +7 -0
  168. package/dist/authorization/posture.js.map +1 -0
  169. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  170. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  171. package/dist/authorization/schedule-fire-caller.js +67 -0
  172. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  173. package/dist/authorization/store-test-kit.d.ts +68 -0
  174. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  175. package/dist/authorization/store-test-kit.js +311 -0
  176. package/dist/authorization/store-test-kit.js.map +1 -0
  177. package/dist/authorization/tuples.d.ts +115 -0
  178. package/dist/authorization/tuples.d.ts.map +1 -0
  179. package/dist/authorization/tuples.js +83 -0
  180. package/dist/authorization/tuples.js.map +1 -0
  181. package/dist/boot/compose.d.ts.map +1 -1
  182. package/dist/boot/compose.js +220 -43
  183. package/dist/boot/compose.js.map +1 -1
  184. package/dist/boot/inprocess.d.ts +12 -0
  185. package/dist/boot/inprocess.d.ts.map +1 -1
  186. package/dist/boot/inprocess.js +68 -21
  187. package/dist/boot/inprocess.js.map +1 -1
  188. package/dist/domain/agent/controller.d.ts.map +1 -1
  189. package/dist/domain/agent/controller.js +9 -0
  190. package/dist/domain/agent/controller.js.map +1 -1
  191. package/dist/domain/executioncontext/resolve-values-for-caller.d.ts +33 -14
  192. package/dist/domain/executioncontext/resolve-values-for-caller.d.ts.map +1 -1
  193. package/dist/domain/executioncontext/resolve-values-for-caller.js +32 -8
  194. package/dist/domain/executioncontext/resolve-values-for-caller.js.map +1 -1
  195. package/dist/domain/iampolicy/constants.d.ts +11 -0
  196. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  197. package/dist/domain/iampolicy/constants.js +11 -0
  198. package/dist/domain/iampolicy/constants.js.map +1 -1
  199. package/dist/domain/iampolicy/membership.d.ts +72 -1
  200. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  201. package/dist/domain/iampolicy/membership.js +141 -56
  202. package/dist/domain/iampolicy/membership.js.map +1 -1
  203. package/dist/domain/identityaccount/actor.d.ts +41 -0
  204. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  205. package/dist/domain/identityaccount/actor.js +34 -0
  206. package/dist/domain/identityaccount/actor.js.map +1 -0
  207. package/dist/domain/identityaccount/resolve.d.ts +19 -0
  208. package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
  209. package/dist/domain/identityaccount/resolve.js +12 -0
  210. package/dist/domain/identityaccount/resolve.js.map +1 -1
  211. package/dist/domain/mcpserver/connect-execution-id.d.ts +5 -0
  212. package/dist/domain/mcpserver/connect-execution-id.d.ts.map +1 -0
  213. package/dist/domain/mcpserver/connect-execution-id.js +32 -0
  214. package/dist/domain/mcpserver/connect-execution-id.js.map +1 -0
  215. package/dist/domain/mcpserver/connect.d.ts +28 -2
  216. package/dist/domain/mcpserver/connect.d.ts.map +1 -1
  217. package/dist/domain/mcpserver/connect.js +27 -7
  218. package/dist/domain/mcpserver/connect.js.map +1 -1
  219. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  220. package/dist/domain/mcpserver/controller.js +9 -0
  221. package/dist/domain/mcpserver/controller.js.map +1 -1
  222. package/dist/domain/mcpserver/engine.d.ts +9 -3
  223. package/dist/domain/mcpserver/engine.d.ts.map +1 -1
  224. package/dist/domain/mcpserver/engine.js.map +1 -1
  225. package/dist/domain/mcpserver/start-connect.js +1 -1
  226. package/dist/domain/mcpserver/start-connect.js.map +1 -1
  227. package/dist/domain/platform/controller.d.ts +24 -11
  228. package/dist/domain/platform/controller.d.ts.map +1 -1
  229. package/dist/domain/platform/controller.js.map +1 -1
  230. package/dist/domain/plugin/archive.d.ts +37 -0
  231. package/dist/domain/plugin/archive.d.ts.map +1 -0
  232. package/dist/domain/plugin/archive.js +50 -0
  233. package/dist/domain/plugin/archive.js.map +1 -0
  234. package/dist/domain/plugin/constants.d.ts +38 -0
  235. package/dist/domain/plugin/constants.d.ts.map +1 -0
  236. package/dist/domain/plugin/constants.js +46 -0
  237. package/dist/domain/plugin/constants.js.map +1 -0
  238. package/dist/domain/plugin/controller.d.ts +25 -0
  239. package/dist/domain/plugin/controller.d.ts.map +1 -0
  240. package/dist/domain/plugin/controller.js +493 -0
  241. package/dist/domain/plugin/controller.js.map +1 -0
  242. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  243. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/agent.js +128 -0
  245. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  246. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  247. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  248. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  249. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  250. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  251. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  252. package/dist/domain/plugin/materialize/identity.js +40 -0
  253. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  254. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  255. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  256. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  257. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  258. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  259. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  260. package/dist/domain/plugin/materialize/plan.js +77 -0
  261. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  262. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  263. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  264. package/dist/domain/plugin/materialize/ports.js +2 -0
  265. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  266. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  267. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  268. package/dist/domain/plugin/materialize/skills.js +44 -0
  269. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  270. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  271. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  272. package/dist/domain/plugin/materialize/workflows.js +31 -0
  273. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  274. package/dist/domain/plugin/members.d.ts +42 -0
  275. package/dist/domain/plugin/members.d.ts.map +1 -0
  276. package/dist/domain/plugin/members.js +97 -0
  277. package/dist/domain/plugin/members.js.map +1 -0
  278. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  279. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  280. package/dist/domain/plugin/overlay/documents.js +38 -0
  281. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  282. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  283. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  284. package/dist/domain/plugin/overlay/parse.js +79 -0
  285. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  286. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  287. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  288. package/dist/domain/plugin/overlay/sanitize.js +103 -0
  289. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  290. package/dist/domain/plugin/push.d.ts +133 -0
  291. package/dist/domain/plugin/push.d.ts.map +1 -0
  292. package/dist/domain/plugin/push.js +800 -0
  293. package/dist/domain/plugin/push.js.map +1 -0
  294. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  295. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  296. package/dist/domain/plugin/search-extractor.js +41 -0
  297. package/dist/domain/plugin/search-extractor.js.map +1 -0
  298. package/dist/domain/skill/constants.d.ts +6 -11
  299. package/dist/domain/skill/constants.d.ts.map +1 -1
  300. package/dist/domain/skill/constants.js +6 -11
  301. package/dist/domain/skill/constants.js.map +1 -1
  302. package/dist/domain/skill/controller.d.ts.map +1 -1
  303. package/dist/domain/skill/controller.js +33 -30
  304. package/dist/domain/skill/controller.js.map +1 -1
  305. package/dist/domain/skill/push.d.ts +9 -10
  306. package/dist/domain/skill/push.d.ts.map +1 -1
  307. package/dist/domain/skill/push.js +53 -122
  308. package/dist/domain/skill/push.js.map +1 -1
  309. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  310. package/dist/domain/skill/search-extractor.js.map +1 -1
  311. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  312. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  313. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  314. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  315. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  316. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  317. package/dist/domain/skill/storage/zip-gate.js +56 -126
  318. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  319. package/dist/domain/skill/version-resolution.d.ts +5 -5
  320. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  321. package/dist/domain/skill/version-resolution.js +34 -216
  322. package/dist/domain/skill/version-resolution.js.map +1 -1
  323. package/dist/domain/workflow/controller.d.ts.map +1 -1
  324. package/dist/domain/workflow/controller.js +30 -3
  325. package/dist/domain/workflow/controller.js.map +1 -1
  326. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  327. package/dist/domain/workflowexecution/phases.d.ts +21 -0
  328. package/dist/domain/workflowexecution/phases.d.ts.map +1 -0
  329. package/dist/domain/workflowexecution/phases.js +31 -0
  330. package/dist/domain/workflowexecution/phases.js.map +1 -0
  331. package/dist/extensions/authorizer.d.ts +10 -5
  332. package/dist/extensions/authorizer.d.ts.map +1 -1
  333. package/dist/extensions/drivers.d.ts +4 -1
  334. package/dist/extensions/drivers.d.ts.map +1 -1
  335. package/dist/extensions/list-read-scope.d.ts +47 -20
  336. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  337. package/dist/extensions/list-read-scope.js +20 -24
  338. package/dist/extensions/list-read-scope.js.map +1 -1
  339. package/dist/extensions/organization-directory.d.ts +13 -9
  340. package/dist/extensions/organization-directory.d.ts.map +1 -1
  341. package/dist/extensions/organization-directory.js.map +1 -1
  342. package/dist/extensions/resource-authorization.d.ts +33 -0
  343. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  344. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  345. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  346. package/dist/extensions/schedule-fire-caller.js +12 -1
  347. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  348. package/dist/identity/oidc-verifier.js +8 -1
  349. package/dist/identity/oidc-verifier.js.map +1 -1
  350. package/dist/index.d.ts +10 -0
  351. package/dist/index.d.ts.map +1 -1
  352. package/dist/index.js +8 -0
  353. package/dist/index.js.map +1 -1
  354. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  355. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  356. package/dist/pipeline/apiresource-labels.js +20 -0
  357. package/dist/pipeline/apiresource-labels.js.map +1 -1
  358. package/dist/pipeline/apiresource-meta.d.ts +15 -0
  359. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  360. package/dist/pipeline/apiresource-meta.js +34 -0
  361. package/dist/pipeline/apiresource-meta.js.map +1 -1
  362. package/dist/pipeline/errors.d.ts.map +1 -1
  363. package/dist/pipeline/errors.js.map +1 -1
  364. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  365. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  366. package/dist/pipeline/steps/authorization-facts.js +100 -0
  367. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  368. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  369. package/dist/pipeline/steps/delete.js +1 -1
  370. package/dist/pipeline/steps/delete.js.map +1 -1
  371. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  372. package/dist/pipeline/steps/duplicate.js.map +1 -1
  373. package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
  374. package/dist/pipeline/steps/guard-memory-capture.js +5 -3
  375. package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
  376. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  377. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  378. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  379. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  380. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  381. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  382. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  383. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  384. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  385. package/dist/pipeline/steps/helpers.js.map +1 -1
  386. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  387. package/dist/pipeline/steps/index-search.js.map +1 -1
  388. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  389. package/dist/pipeline/steps/load-existing.js +1 -1
  390. package/dist/pipeline/steps/load-existing.js.map +1 -1
  391. package/dist/pipeline/steps/references.d.ts +16 -0
  392. package/dist/pipeline/steps/references.d.ts.map +1 -1
  393. package/dist/pipeline/steps/references.js +18 -0
  394. package/dist/pipeline/steps/references.js.map +1 -1
  395. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  396. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  397. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  398. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  399. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  400. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  401. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  402. package/dist/pipeline/steps/slug.js.map +1 -1
  403. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  404. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  405. package/dist/pipeline/steps/validate-visibility.js +6 -1
  406. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  407. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  408. package/dist/pipeline/steps/validation.js.map +1 -1
  409. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  410. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  411. package/dist/pipeline/steps/version-archive.js +129 -0
  412. package/dist/pipeline/steps/version-archive.js.map +1 -0
  413. package/dist/pipeline/steps/version-history.d.ts +49 -0
  414. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  415. package/dist/pipeline/steps/version-history.js +229 -0
  416. package/dist/pipeline/steps/version-history.js.map +1 -0
  417. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  418. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  419. package/dist/pipeline/steps/visibility-gates.js +7 -2
  420. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  421. package/dist/query/search/registry.d.ts.map +1 -1
  422. package/dist/query/search/registry.js +2 -0
  423. package/dist/query/search/registry.js.map +1 -1
  424. package/dist/runnerauth/bound-execution.d.ts +27 -0
  425. package/dist/runnerauth/bound-execution.d.ts.map +1 -0
  426. package/dist/runnerauth/bound-execution.js +137 -0
  427. package/dist/runnerauth/bound-execution.js.map +1 -0
  428. package/dist/runnerauth/built-in-runner-credential-provider.d.ts +28 -0
  429. package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -0
  430. package/dist/runnerauth/built-in-runner-credential-provider.js +217 -0
  431. package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -0
  432. package/dist/runnerauth/constants.d.ts +63 -0
  433. package/dist/runnerauth/constants.d.ts.map +1 -0
  434. package/dist/runnerauth/constants.js +63 -0
  435. package/dist/runnerauth/constants.js.map +1 -0
  436. package/dist/runnerauth/dispatch-credential.d.ts +38 -0
  437. package/dist/runnerauth/dispatch-credential.d.ts.map +1 -0
  438. package/dist/runnerauth/dispatch-credential.js +17 -0
  439. package/dist/runnerauth/dispatch-credential.js.map +1 -0
  440. package/dist/runnerauth/runner-credential-provider.d.ts +49 -11
  441. package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
  442. package/dist/runnerauth/runner-credential-provider.js +16 -4
  443. package/dist/runnerauth/runner-credential-provider.js.map +1 -1
  444. package/dist/runnerauth/runner-subject-verifier.d.ts +14 -0
  445. package/dist/runnerauth/runner-subject-verifier.d.ts.map +1 -0
  446. package/dist/runnerauth/runner-subject-verifier.js +115 -0
  447. package/dist/runnerauth/runner-subject-verifier.js.map +1 -0
  448. package/dist/runnerauth/runnerauth.d.ts +33 -4
  449. package/dist/runnerauth/runnerauth.d.ts.map +1 -1
  450. package/dist/runnerauth/runnerauth.js +131 -35
  451. package/dist/runnerauth/runnerauth.js.map +1 -1
  452. package/dist/temporal/agentexecution/engine-client.d.ts +13 -0
  453. package/dist/temporal/agentexecution/engine-client.d.ts.map +1 -1
  454. package/dist/temporal/agentexecution/engine-client.js +10 -2
  455. package/dist/temporal/agentexecution/engine-client.js.map +1 -1
  456. package/dist/temporal/agentexecution/workflow-input.d.ts +13 -0
  457. package/dist/temporal/agentexecution/workflow-input.d.ts.map +1 -1
  458. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.d.ts.map +1 -1
  459. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js +35 -31
  460. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js.map +1 -1
  461. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  462. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  463. package/dist/temporal/schedule/run-starter.js +14 -1
  464. package/dist/temporal/schedule/run-starter.js.map +1 -1
  465. package/dist/temporal/workflowexecution/engine-client.d.ts +24 -0
  466. package/dist/temporal/workflowexecution/engine-client.d.ts.map +1 -1
  467. package/dist/temporal/workflowexecution/engine-client.js +26 -19
  468. package/dist/temporal/workflowexecution/engine-client.js.map +1 -1
  469. package/dist/temporal/workflowexecution/workflow-input.d.ts +14 -0
  470. package/dist/temporal/workflowexecution/workflow-input.d.ts.map +1 -1
  471. package/package.json +5 -4
  472. package/src/archive/__tests__/archive.test.ts +233 -0
  473. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  474. package/src/archive/content-store.ts +132 -0
  475. package/src/archive/inflate.ts +107 -0
  476. package/src/archive/limits.ts +42 -0
  477. package/src/archive/open.ts +131 -0
  478. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  479. package/src/archive/write.ts +54 -0
  480. package/src/authorization/README.md +124 -0
  481. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  482. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  483. package/src/authorization/__tests__/drivers.ts +70 -0
  484. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  485. package/src/authorization/__tests__/facts.test.ts +155 -0
  486. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  487. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  488. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  489. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  490. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  491. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  492. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  493. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  494. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  495. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  496. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  497. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  498. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  499. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  500. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  501. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  502. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  503. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  504. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  505. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  506. package/src/authorization/__tests__/lane-admission.test.ts +115 -0
  507. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  508. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  509. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  510. package/src/authorization/__tests__/person.test.ts +114 -0
  511. package/src/authorization/__tests__/posture.test.ts +25 -0
  512. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  513. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  514. package/src/authorization/__tests__/support.ts +101 -0
  515. package/src/authorization/__tests__/tuples.test.ts +62 -0
  516. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  517. package/src/authorization/authorizer.ts +208 -0
  518. package/src/authorization/derived-tuples.ts +384 -0
  519. package/src/authorization/evaluator.ts +283 -0
  520. package/src/authorization/facts.ts +47 -0
  521. package/src/authorization/lane-admission.ts +73 -0
  522. package/src/authorization/list-read-scope.ts +216 -0
  523. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  524. package/src/authorization/model/agent.ts +64 -0
  525. package/src/authorization/model/agent_channel.ts +49 -0
  526. package/src/authorization/model/agent_execution.ts +33 -0
  527. package/src/authorization/model/agent_instance.ts +66 -0
  528. package/src/authorization/model/agent_share.ts +40 -0
  529. package/src/authorization/model/api_key.ts +28 -0
  530. package/src/authorization/model/artifact.ts +38 -0
  531. package/src/authorization/model/channel_app.ts +39 -0
  532. package/src/authorization/model/default-of.ts +99 -0
  533. package/src/authorization/model/environment.ts +48 -0
  534. package/src/authorization/model/execution_context.ts +20 -0
  535. package/src/authorization/model/iam_policy.ts +42 -0
  536. package/src/authorization/model/identity_account.ts +26 -0
  537. package/src/authorization/model/index.ts +108 -0
  538. package/src/authorization/model/mcp_server.ts +59 -0
  539. package/src/authorization/model/memory.ts +27 -0
  540. package/src/authorization/model/oauth_app.ts +42 -0
  541. package/src/authorization/model/organization.ts +55 -0
  542. package/src/authorization/model/plugin.ts +66 -0
  543. package/src/authorization/model/project.ts +47 -0
  544. package/src/authorization/model/rewrite.ts +213 -0
  545. package/src/authorization/model/schedule.ts +40 -0
  546. package/src/authorization/model/session.ts +50 -0
  547. package/src/authorization/model/skill.ts +60 -0
  548. package/src/authorization/model/workflow.ts +60 -0
  549. package/src/authorization/model/workflow_execution.ts +44 -0
  550. package/src/authorization/model/workflow_instance.ts +122 -0
  551. package/src/authorization/organization-directory.ts +114 -0
  552. package/src/authorization/person.ts +68 -0
  553. package/src/authorization/posture.ts +49 -0
  554. package/src/authorization/schedule-fire-caller.ts +87 -0
  555. package/src/authorization/store-test-kit.ts +454 -0
  556. package/src/authorization/tuples.ts +190 -0
  557. package/src/boot/compose.ts +246 -52
  558. package/src/boot/inprocess.ts +115 -31
  559. package/src/domain/agent/controller.ts +11 -0
  560. package/src/domain/executioncontext/__tests__/executioncontext.test.ts +104 -0
  561. package/src/domain/executioncontext/__tests__/resolve-values-capability.test.ts +33 -4
  562. package/src/domain/executioncontext/resolve-values-for-caller.ts +79 -22
  563. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  564. package/src/domain/iampolicy/constants.ts +12 -0
  565. package/src/domain/iampolicy/membership.ts +221 -66
  566. package/src/domain/identityaccount/__tests__/account-for-stamp.test.ts +111 -0
  567. package/src/domain/identityaccount/actor.ts +84 -0
  568. package/src/domain/identityaccount/resolve.ts +31 -0
  569. package/src/domain/mcpserver/__tests__/connect.test.ts +17 -2
  570. package/src/domain/mcpserver/connect-execution-id.ts +34 -0
  571. package/src/domain/mcpserver/connect.ts +38 -3
  572. package/src/domain/mcpserver/controller.ts +11 -0
  573. package/src/domain/mcpserver/engine.ts +9 -3
  574. package/src/domain/mcpserver/start-connect.ts +1 -1
  575. package/src/domain/platform/controller.ts +24 -11
  576. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  577. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  578. package/src/domain/plugin/__tests__/plugin.test.ts +796 -0
  579. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  580. package/src/domain/plugin/archive.ts +89 -0
  581. package/src/domain/plugin/constants.ts +53 -0
  582. package/src/domain/plugin/controller.ts +913 -0
  583. package/src/domain/plugin/materialize/agent.ts +186 -0
  584. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  585. package/src/domain/plugin/materialize/identity.ts +67 -0
  586. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  587. package/src/domain/plugin/materialize/plan.ts +124 -0
  588. package/src/domain/plugin/materialize/ports.ts +53 -0
  589. package/src/domain/plugin/materialize/skills.ts +68 -0
  590. package/src/domain/plugin/materialize/workflows.ts +51 -0
  591. package/src/domain/plugin/members.ts +180 -0
  592. package/src/domain/plugin/overlay/documents.ts +78 -0
  593. package/src/domain/plugin/overlay/parse.ts +115 -0
  594. package/src/domain/plugin/overlay/sanitize.ts +151 -0
  595. package/src/domain/plugin/push.ts +1062 -0
  596. package/src/domain/plugin/search-extractor.ts +60 -0
  597. package/src/domain/skill/constants.ts +11 -14
  598. package/src/domain/skill/controller.ts +44 -36
  599. package/src/domain/skill/push.ts +61 -156
  600. package/src/domain/skill/search-extractor.ts +3 -1
  601. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  602. package/src/domain/skill/storage/zip-gate.ts +58 -154
  603. package/src/domain/skill/version-resolution.ts +67 -269
  604. package/src/domain/workflow/controller.ts +38 -4
  605. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  606. package/src/domain/workflowexecution/__tests__/phases.test.ts +58 -0
  607. package/src/domain/workflowexecution/phases.ts +33 -0
  608. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  609. package/src/extensions/__tests__/composed-support.ts +32 -1
  610. package/src/extensions/__tests__/extension-composition.test.ts +42 -1
  611. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  612. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  613. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  614. package/src/extensions/authorizer.ts +10 -5
  615. package/src/extensions/drivers.ts +4 -1
  616. package/src/extensions/list-read-scope.ts +67 -45
  617. package/src/extensions/organization-directory.ts +13 -9
  618. package/src/extensions/resource-authorization.ts +34 -0
  619. package/src/extensions/schedule-fire-caller.ts +49 -18
  620. package/src/identity/__tests__/oidc-verifier.test.ts +22 -0
  621. package/src/identity/oidc-verifier.ts +8 -1
  622. package/src/index.ts +51 -1
  623. package/src/pipeline/__tests__/kind-by-id-prefix.test.ts +75 -0
  624. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  625. package/src/pipeline/apiresource-labels.ts +31 -3
  626. package/src/pipeline/apiresource-meta.ts +41 -0
  627. package/src/pipeline/errors.ts +5 -5
  628. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  629. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +58 -44
  630. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  631. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  632. package/src/pipeline/steps/authorization-facts.ts +131 -0
  633. package/src/pipeline/steps/delete.ts +11 -3
  634. package/src/pipeline/steps/duplicate.ts +8 -2
  635. package/src/pipeline/steps/guard-memory-capture.ts +5 -3
  636. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  637. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  638. package/src/pipeline/steps/helpers.ts +4 -1
  639. package/src/pipeline/steps/index-search.ts +28 -15
  640. package/src/pipeline/steps/load-existing.ts +12 -3
  641. package/src/pipeline/steps/references.ts +36 -2
  642. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  643. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  644. package/src/pipeline/steps/slug.ts +7 -2
  645. package/src/pipeline/steps/validate-visibility.ts +9 -2
  646. package/src/pipeline/steps/validation.ts +3 -1
  647. package/src/pipeline/steps/version-archive.ts +225 -0
  648. package/src/pipeline/steps/version-history.ts +362 -0
  649. package/src/pipeline/steps/visibility-gates.ts +12 -9
  650. package/src/query/README.md +1 -1
  651. package/src/query/search/__tests__/criteria.test.ts +6 -7
  652. package/src/query/search/__tests__/query-store.test.ts +9 -2
  653. package/src/query/search/__tests__/registry.test.ts +6 -4
  654. package/src/query/search/registry.ts +6 -1
  655. package/src/runnerauth/__tests__/bound-execution.test.ts +334 -0
  656. package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +516 -0
  657. package/src/runnerauth/__tests__/dispatch-credential.test.ts +94 -0
  658. package/src/runnerauth/__tests__/runner-credential-provider.test.ts +27 -0
  659. package/src/runnerauth/__tests__/runner-subject-composed.test.ts +497 -0
  660. package/src/runnerauth/__tests__/runner-subject-verifier.test.ts +541 -0
  661. package/src/runnerauth/bound-execution.ts +270 -0
  662. package/src/runnerauth/built-in-runner-credential-provider.ts +300 -0
  663. package/src/runnerauth/constants.ts +74 -0
  664. package/src/runnerauth/dispatch-credential.ts +63 -0
  665. package/src/runnerauth/runner-credential-provider.ts +60 -11
  666. package/src/runnerauth/runner-subject-verifier.ts +152 -0
  667. package/src/runnerauth/runnerauth.ts +148 -38
  668. package/src/temporal/agentexecution/__tests__/engine-client.test.ts +107 -38
  669. package/src/temporal/agentexecution/__tests__/invoke-workflow.test.ts +105 -2
  670. package/src/temporal/agentexecution/engine-client.ts +27 -2
  671. package/src/temporal/agentexecution/workflow-input.ts +13 -0
  672. package/src/temporal/agentexecution/workflows/invoke-agent-execution.ts +90 -44
  673. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  674. package/src/temporal/schedule/run-starter.ts +31 -8
  675. package/src/temporal/workflowexecution/__tests__/engine-client.test.ts +139 -33
  676. package/src/temporal/workflowexecution/engine-client.ts +48 -21
  677. package/src/temporal/workflowexecution/workflow-input.ts +14 -0
  678. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  679. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  680. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -0,0 +1,516 @@
1
+ /**
2
+ * Pins the built-in RunnerCredentialProvider — the OSS execution-scoped
3
+ * default plus the capabilities an ENFORCING self-host needs, composed
4
+ * under the built-in authorization posture beside the runner-subject
5
+ * verifier (the cloud's shape: one provider object carries the edition's
6
+ * whole credential story). Mint and verify stay byte-identical to the
7
+ * default provider; what this file pins is the two capabilities and the
8
+ * ONE reading of a runner's binding they both read:
9
+ *
10
+ * - `runnerBindingOf(caller)`: what the caller's credential is bound to
11
+ * — an agent execution, a workflow execution (the kind read off the
12
+ * bound id's prefix), an MCP connect (its own predicate), or nothing
13
+ * (a person; a token that is not ours; a forged one). One HMAC, no
14
+ * store read; the lane-admission decorator asks the same question. A
15
+ * connect binding is answered BY NAME by every capability: it vouches
16
+ * nothing, captures nothing, and the exchange mints nothing for it.
17
+ * - `vouchRunnerLineageLabels`: a WORKFLOW-bound runner vouches the two
18
+ * lineage keys for its own workflow execution and REFUSES (the
19
+ * cloud's byte-pinned copy, transcribed) a stamp naming another; an
20
+ * agent-bound runner and a person vouch nothing. Without this a
21
+ * self-host with sign-in on cannot run any workflow that calls an
22
+ * agent: GuardReservedLabels refuses the child create.
23
+ * - `authorizeMemoryCapture`: an AGENT-bound runner is ADMITTED with
24
+ * the human's account id as the memory's subject (the row's one
25
+ * principal under the model — without it every memory an enforcing
26
+ * self-host writes is nobody's) and the run's SESSION as the proved
27
+ * provenance, read off the execution row (the cloud reads it off its
28
+ * session-scoped token; ours names only the execution); a capture
29
+ * addressed to an org that is not the run's is refused with the
30
+ * cloud's copy; a workflow-bound runner is refused (the cloud refuses
31
+ * every non-session lane); a person is no-opinion (the gate's own
32
+ * logic applies).
33
+ * - `exchangeScopedToken` (2026-09-16, the mint gate): the execution
34
+ * arms mint the RUN credential (no `exp`, expiresInSeconds 0) for
35
+ * the run's own person and nobody else — a missing row is NOT_FOUND
36
+ * with the load-first copy, any other caller (a run stamped by nobody
37
+ * included) is PERMISSION_DENIED with one sentence; the kind read is
38
+ * the id's, not the arm's; pool-claim, renewal and unset answer
39
+ * not-minted; so does keyless. Under trusted-local the controller's
40
+ * own arms mint for anyone, and this capability does not exist.
41
+ *
42
+ * Written failing on 2026-09-16, before src/runnerauth/built-in-runner-credential-provider.ts
43
+ * existed; the module turned it green.
44
+ */
45
+ import { randomBytes } from "node:crypto";
46
+
47
+ import { create } from "@bufbuild/protobuf";
48
+ import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
49
+ import { Code, ConnectError } from "@connectrpc/connect";
50
+ import { describe, expect, it } from "vitest";
51
+
52
+ import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
53
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
54
+ import { ExecutionContextSchema } from "@stigmer/protos/ai/stigmer/agentic/executioncontext/v1/api_pb";
55
+ import { WorkflowExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
56
+ import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
57
+ import { IdentityAccountSchema } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/api_pb";
58
+ import type { IdentityAccount } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/api_pb";
59
+
60
+ import type { AccountsByCaller } from "../../domain/identityaccount/resolve.js";
61
+ import { newConnectExecutionId } from "../../domain/mcpserver/connect-execution-id.js";
62
+ import type { CallerIdentity } from "../../extensions/identity.js";
63
+ import { ResourceNotFoundError } from "../../store/interface.js";
64
+ import type { BoundExecutionStore } from "../bound-execution.js";
65
+ import {
66
+ newBuiltInRunnerCredentialProvider,
67
+ runnerBindingOf,
68
+ } from "../built-in-runner-credential-provider.js";
69
+ import {
70
+ MEMORY_CAPTURE_ORG_MISMATCH_MESSAGE,
71
+ RUN_CREDENTIAL_NOT_RUNS_PERSON_MESSAGE,
72
+ WORKFLOW_LINEAGE_BINDING_MISMATCH_MESSAGE,
73
+ } from "../constants.js";
74
+ import type { RunnerScopedTokenExchange } from "../runner-credential-provider.js";
75
+ import {
76
+ isClockedToken,
77
+ RunnerAuthService,
78
+ TOKEN_TYPE_EXECUTION_SCOPED,
79
+ } from "../runnerauth.js";
80
+
81
+ const KEY = randomBytes(32);
82
+ const service = RunnerAuthService.create(KEY);
83
+
84
+ const HUMAN = "ida_carol";
85
+ const OTHER = "ida_bruce";
86
+
87
+ /** The creator stamp as the store writes it (status.audit.spec_audit.created_by.id). */
88
+ function stampedBy(id: string) {
89
+ return { audit: { specAudit: { createdBy: { id } } } };
90
+ }
91
+
92
+ /** The one agent execution the capture arms read: Carol's run in `acme`, on session `ses_carol`. */
93
+ const AGENT_RUN = create(AgentExecutionSchema, {
94
+ metadata: { id: "aex_agent_run", name: "aex_agent_run", org: "acme" },
95
+ spec: { sessionId: "ses_carol" },
96
+ status: { phase: ExecutionPhase.EXECUTION_IN_PROGRESS, ...stampedBy(HUMAN) },
97
+ });
98
+
99
+ /** Carol's workflow execution — the exchange's workflow arm reads it. */
100
+ const WORKFLOW_RUN = create(WorkflowExecutionSchema, {
101
+ metadata: { id: "wex_carols_flow", name: "wex_carols_flow", org: "acme" },
102
+ status: { ...stampedBy(HUMAN) },
103
+ });
104
+
105
+ /** A run created before sign-in was on: its stamp names nobody the server recognizes. */
106
+ const NOBODYS_RUN = create(AgentExecutionSchema, {
107
+ metadata: { id: "aex_nobodys_run", name: "aex_nobodys_run", org: "acme" },
108
+ spec: { sessionId: "ses_old" },
109
+ status: {
110
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
111
+ ...stampedBy("system"),
112
+ },
113
+ });
114
+
115
+ const ROWS: Record<string, unknown> = {
116
+ aex_agent_run: AGENT_RUN,
117
+ wex_carols_flow: WORKFLOW_RUN,
118
+ aex_nobodys_run: NOBODYS_RUN,
119
+ };
120
+
121
+ /** Carol's connect: the ephemeral EC the connect lane created as her, keyed by the connect's execution id. */
122
+ const CONNECT_ID = newConnectExecutionId("mcps_carols_server");
123
+ const CONNECT_CONTEXT = create(ExecutionContextSchema, {
124
+ metadata: { id: "ectx_carol", name: `exec-ctx-${CONNECT_ID}`, org: "acme" },
125
+ spec: { executionId: CONNECT_ID },
126
+ status: { ...stampedBy(HUMAN) },
127
+ });
128
+
129
+ /** A store that knows three rows and one connect EC, and answers the typed not-found for everything else. */
130
+ const store: BoundExecutionStore = {
131
+ getResource<Desc extends DescMessage>(
132
+ kind: ApiResourceKind,
133
+ id: string,
134
+ _schema: Desc,
135
+ ): Promise<MessageShape<Desc>> {
136
+ const row = ROWS[id];
137
+ if (row === undefined) {
138
+ return Promise.reject(new ResourceNotFoundError(`${kind}/${id}`));
139
+ }
140
+ return Promise.resolve(row as MessageShape<Desc>);
141
+ },
142
+ findByField<Desc extends DescMessage>(
143
+ kind: ApiResourceKind,
144
+ fieldPath: string,
145
+ value: string,
146
+ _schema: Desc,
147
+ ): Promise<MessageShape<Desc>> {
148
+ if (fieldPath === "spec.executionId" && value === CONNECT_ID) {
149
+ return Promise.resolve(CONNECT_CONTEXT as unknown as MessageShape<Desc>);
150
+ }
151
+ return Promise.reject(new ResourceNotFoundError(`${kind}/${value}`));
152
+ },
153
+ };
154
+
155
+ /** Two accounts by id; nothing resolves by raw subject (the pre-3.15.0 shape is not exercised here). */
156
+ const accounts: AccountsByCaller = {
157
+ async findById(id: string): Promise<IdentityAccount | undefined> {
158
+ return id === HUMAN || id === OTHER
159
+ ? create(IdentityAccountSchema, { metadata: { id, name: id } })
160
+ : undefined;
161
+ },
162
+ async findDirectByIdpId(): Promise<IdentityAccount | undefined> {
163
+ return undefined;
164
+ },
165
+ };
166
+
167
+ const provider = newBuiltInRunnerCredentialProvider({
168
+ service,
169
+ store,
170
+ accounts,
171
+ });
172
+
173
+ /** The identity the runner-subject verifier mints for a run credential. */
174
+ function runnerCaller(rawToken: string): CallerIdentity {
175
+ return {
176
+ identityId: HUMAN,
177
+ callerClass: "runner",
178
+ issuer: "",
179
+ rawToken,
180
+ email: "carol@example.com",
181
+ displayName: "Carol Danvers",
182
+ };
183
+ }
184
+
185
+ /** A person on the wire — the OIDC or API-key verifier's identity. */
186
+ const person: CallerIdentity = {
187
+ identityId: HUMAN,
188
+ callerClass: "user",
189
+ issuer: "https://issuer.example.com/",
190
+ rawToken: "eyJ.person.token",
191
+ };
192
+
193
+ const agentBound = runnerCaller(service.mintRunCredential("aex_agent_run"));
194
+ const workflowBound = runnerCaller(
195
+ service.mintRunCredential("wex_workflow_run"),
196
+ );
197
+ /** The connect lane's runner: the clocked token bound to Carol's connect EC (connect.ts `prepareConnect`). */
198
+ const connectBound = runnerCaller(service.mint(CONNECT_ID, 300).token);
199
+
200
+ describe("the default lane is byte-identical", () => {
201
+ it("mints and verifies on execution_scoped exactly as the default provider", () => {
202
+ const minted = provider.mint(TOKEN_TYPE_EXECUTION_SCOPED, "aex_prov", 0);
203
+ expect(provider.verify(TOKEN_TYPE_EXECUTION_SCOPED, minted.token)).toBe(
204
+ "aex_prov",
205
+ );
206
+ expect(provider.isEnabled(TOKEN_TYPE_EXECUTION_SCOPED)).toBe(true);
207
+ expect(provider.isEnabled("sandbox")).toBe(false);
208
+ });
209
+
210
+ it("carries the default's run-credential capability unchanged — the dispatch mints through it", () => {
211
+ const token = provider.mintRunCredential!("aex_dispatch");
212
+ expect(provider.verify(TOKEN_TYPE_EXECUTION_SCOPED, token)).toBe(
213
+ "aex_dispatch",
214
+ );
215
+ expect(isClockedToken(token)).toBe(false);
216
+ });
217
+
218
+ it("does NOT take over the bootstrap, the sandbox mint or the decrypt decision — those stay the OSS arms", () => {
219
+ expect(provider.bootstrapCredentials).toBeUndefined();
220
+ expect(provider.mintSandboxCredential).toBeUndefined();
221
+ expect(provider.authorizeExecutionContextRead).toBeUndefined();
222
+ });
223
+ });
224
+
225
+ describe("exchangeScopedToken — the mint gate", () => {
226
+ const exchange = (
227
+ request: Parameters<NonNullable<typeof provider.exchangeScopedToken>>[0],
228
+ caller: CallerIdentity,
229
+ ): Promise<RunnerScopedTokenExchange> =>
230
+ provider.exchangeScopedToken!(request, caller);
231
+
232
+ const carol: CallerIdentity = {
233
+ identityId: HUMAN,
234
+ callerClass: "user",
235
+ issuer: "https://issuer.example.com/",
236
+ rawToken: "eyJ.carol.token",
237
+ };
238
+ const bruce: CallerIdentity = {
239
+ ...carol,
240
+ identityId: OTHER,
241
+ rawToken: "eyJ.bruce.token",
242
+ };
243
+
244
+ async function refusal(promise: Promise<unknown>): Promise<ConnectError> {
245
+ const failure = await promise.then(
246
+ () => undefined,
247
+ (error: unknown) => error,
248
+ );
249
+ expect(failure).toBeInstanceOf(ConnectError);
250
+ return failure as ConnectError;
251
+ }
252
+
253
+ it("mints the RUN credential for the run's own person: bound to the execution, no clock, no expiry on the wire", async () => {
254
+ const minted = await exchange(
255
+ { arm: "agent-execution", executionId: "aex_agent_run" },
256
+ carol,
257
+ );
258
+ expect(minted.minted).toBe(true);
259
+ if (!minted.minted) throw new Error("unreachable");
260
+ expect(service.verify(minted.token)).toBe("aex_agent_run");
261
+ expect(isClockedToken(minted.token)).toBe(false);
262
+ expect(minted.expiresInSeconds).toBe(0);
263
+ });
264
+
265
+ it("the workflow-execution arm mints the same way for the workflow's person", async () => {
266
+ const minted = await exchange(
267
+ { arm: "workflow-execution", executionId: "wex_carols_flow" },
268
+ carol,
269
+ );
270
+ expect(minted.minted).toBe(true);
271
+ if (!minted.minted) throw new Error("unreachable");
272
+ expect(service.verify(minted.token)).toBe("wex_carols_flow");
273
+ });
274
+
275
+ it("another signed-in person is refused with one sentence — the impersonation path this gate closes", async () => {
276
+ const failure = await refusal(
277
+ exchange({ arm: "agent-execution", executionId: "aex_agent_run" }, bruce),
278
+ );
279
+ expect(failure.code).toBe(Code.PermissionDenied);
280
+ expect(failure.rawMessage).toBe(RUN_CREDENTIAL_NOT_RUNS_PERSON_MESSAGE);
281
+ expect(RUN_CREDENTIAL_NOT_RUNS_PERSON_MESSAGE).toBe(
282
+ "a run credential is minted only for the person whose run it is",
283
+ );
284
+ });
285
+
286
+ it("a run whose creator stamp names nobody is nobody's to hold — refused with the same sentence", async () => {
287
+ const failure = await refusal(
288
+ exchange(
289
+ { arm: "agent-execution", executionId: "aex_nobodys_run" },
290
+ carol,
291
+ ),
292
+ );
293
+ expect(failure.code).toBe(Code.PermissionDenied);
294
+ expect(failure.rawMessage).toBe(RUN_CREDENTIAL_NOT_RUNS_PERSON_MESSAGE);
295
+ });
296
+
297
+ it("a run that does not exist is NOT_FOUND with the load-first copy — what a `get` on that id answers", async () => {
298
+ const failure = await refusal(
299
+ exchange({ arm: "agent-execution", executionId: "aex_missing" }, carol),
300
+ );
301
+ expect(failure.code).toBe(Code.NotFound);
302
+ expect(failure.rawMessage).toBe("AgentExecution not found: aex_missing");
303
+
304
+ const workflowFailure = await refusal(
305
+ exchange(
306
+ { arm: "workflow-execution", executionId: "wex_missing" },
307
+ carol,
308
+ ),
309
+ );
310
+ expect(workflowFailure.rawMessage).toBe(
311
+ "WorkflowExecution not found: wex_missing",
312
+ );
313
+ });
314
+
315
+ it("a connect binding is NOT_FOUND under either arm — the exchange mints run credentials, and a connect is not a run", async () => {
316
+ const failure = await refusal(
317
+ exchange({ arm: "agent-execution", executionId: CONNECT_ID }, carol),
318
+ );
319
+ expect(failure.code).toBe(Code.NotFound);
320
+ expect(failure.rawMessage).toBe(`AgentExecution not found: ${CONNECT_ID}`);
321
+ });
322
+
323
+ it("the id decides which execution is read, never the arm — an agent id under the workflow arm mints for the agent run", async () => {
324
+ const minted = await exchange(
325
+ { arm: "workflow-execution", executionId: "aex_agent_run" },
326
+ carol,
327
+ );
328
+ expect(minted.minted).toBe(true);
329
+ if (!minted.minted) throw new Error("unreachable");
330
+ expect(service.verify(minted.token)).toBe("aex_agent_run");
331
+ });
332
+
333
+ it("a runner already acting as the person may hold a credential for that person's other run (the credential's reach, pinned as a known fact)", async () => {
334
+ const minted = await exchange(
335
+ { arm: "agent-execution", executionId: "aex_agent_run" },
336
+ runnerCaller(service.mintRunCredential("wex_carols_flow")),
337
+ );
338
+ expect(minted.minted).toBe(true);
339
+ });
340
+
341
+ it.each([
342
+ ["pool-claim", { arm: "pool-claim", sessionId: "ses_x" } as const],
343
+ ["renewal", { arm: "renewal" } as const],
344
+ ["unset", { arm: "unset" } as const],
345
+ [
346
+ "an empty execution id",
347
+ { arm: "agent-execution", executionId: "" } as const,
348
+ ],
349
+ ])(
350
+ "%s answers not-minted — the controller's arms, verbatim",
351
+ async (_label, request) => {
352
+ expect(await exchange(request, carol)).toEqual({ minted: false });
353
+ },
354
+ );
355
+
356
+ it("keyless answers not-minted — degraded, never an error", async () => {
357
+ const keyless = newBuiltInRunnerCredentialProvider({
358
+ service: RunnerAuthService.create(undefined),
359
+ store,
360
+ accounts,
361
+ });
362
+ expect(
363
+ await keyless.exchangeScopedToken!(
364
+ { arm: "agent-execution", executionId: "aex_agent_run" },
365
+ carol,
366
+ ),
367
+ ).toEqual({ minted: false });
368
+ });
369
+ });
370
+
371
+ describe("runnerBindingOf — the one reading of what a runner is bound to", () => {
372
+ it("an agent-bound run credential", () => {
373
+ expect(runnerBindingOf(service, agentBound)).toEqual({
374
+ kind: "agent-execution",
375
+ executionId: "aex_agent_run",
376
+ });
377
+ });
378
+
379
+ it("a workflow-bound run credential", () => {
380
+ expect(runnerBindingOf(service, workflowBound)).toEqual({
381
+ kind: "workflow-execution",
382
+ executionId: "wex_workflow_run",
383
+ });
384
+ });
385
+
386
+ it("the exchange lane's clocked token binds the same way", () => {
387
+ const clocked = runnerCaller(service.mint("aex_clocked", 300).token);
388
+ expect(runnerBindingOf(service, clocked)?.executionId).toBe("aex_clocked");
389
+ });
390
+
391
+ it("the connect lane's token IS a runner binding, named — every capability answers it by kind, none by accident", () => {
392
+ expect(runnerBindingOf(service, connectBound)).toEqual({
393
+ kind: "mcp-connect",
394
+ executionId: CONNECT_ID,
395
+ });
396
+ });
397
+
398
+ it.each([
399
+ ["a person", person],
400
+ ["a runner-class caller holding no token", { ...agentBound, rawToken: "" }],
401
+ [
402
+ "a runner-class caller holding a token this server did not sign",
403
+ runnerCaller(
404
+ RunnerAuthService.create(randomBytes(32)).mintRunCredential(
405
+ "aex_other",
406
+ ),
407
+ ),
408
+ ],
409
+ [
410
+ "a token bound to an id whose prefix names no execution kind",
411
+ runnerCaller(service.mintRunCredential("ses_not_an_execution")),
412
+ ],
413
+ ])(
414
+ "%s is not a runner binding (undefined) — never a throw",
415
+ (_label, caller) => {
416
+ expect(runnerBindingOf(service, caller)).toBeUndefined();
417
+ },
418
+ );
419
+ });
420
+
421
+ describe("vouchRunnerLineageLabels", () => {
422
+ const vouch = provider.vouchRunnerLineageLabels!;
423
+
424
+ it("a workflow-bound runner vouches the lineage keys for ITS workflow execution", () => {
425
+ expect(vouch(workflowBound, "wex_workflow_run")).toBe(true);
426
+ });
427
+
428
+ it("a workflow-bound runner vouches when the request stamped only the task label (no binding to check)", () => {
429
+ expect(vouch(workflowBound, "")).toBe(true);
430
+ });
431
+
432
+ it("a workflow-bound runner naming ANOTHER workflow's lineage is refused with the cloud's copy — a workflow sandbox cannot stamp another workflow's lineage", () => {
433
+ let failure: unknown;
434
+ try {
435
+ vouch(workflowBound, "wex_someone_elses");
436
+ } catch (error) {
437
+ failure = error;
438
+ }
439
+ expect(failure).toBeInstanceOf(ConnectError);
440
+ expect((failure as ConnectError).code).toBe(Code.InvalidArgument);
441
+ expect((failure as ConnectError).rawMessage).toBe(
442
+ WORKFLOW_LINEAGE_BINDING_MISMATCH_MESSAGE,
443
+ );
444
+ expect(WORKFLOW_LINEAGE_BINDING_MISMATCH_MESSAGE).toBe(
445
+ "workflow lineage label names a workflow execution this runner credential is not bound to",
446
+ );
447
+ });
448
+
449
+ it("an agent-bound runner vouches nothing — a subagent create carrying lineage keys stays subject to the guard", () => {
450
+ expect(vouch(agentBound, "wex_workflow_run")).toBe(false);
451
+ });
452
+
453
+ it("a connect-bound runner vouches nothing — a discovery creates no execution", () => {
454
+ expect(vouch(connectBound, "wex_workflow_run")).toBe(false);
455
+ });
456
+
457
+ it("a person vouches nothing", () => {
458
+ expect(vouch(person, "wex_workflow_run")).toBe(false);
459
+ });
460
+ });
461
+
462
+ describe("authorizeMemoryCapture", () => {
463
+ const decide = (caller: CallerIdentity, org: string) =>
464
+ Promise.resolve(provider.authorizeMemoryCapture!(caller, org));
465
+
466
+ it("an agent-bound runner is admitted: the memory's subject is the human the verifier resolved, the proved session is the run's", async () => {
467
+ expect(await decide(agentBound, "acme")).toEqual({
468
+ verdict: "admit",
469
+ subjectIdentityAccountId: HUMAN,
470
+ provedSessionId: "ses_carol",
471
+ });
472
+ });
473
+
474
+ it("an empty capture org is admitted — the org-required refusal belongs to the defaults step (the cloud's check order)", async () => {
475
+ expect((await decide(agentBound, "")).verdict).toBe("admit");
476
+ });
477
+
478
+ it("a capture addressed to an org that is not the run's is refused with the cloud's copy — a forged address, not a routing choice", async () => {
479
+ const failure = await decide(agentBound, "someone-elses-org").then(
480
+ () => undefined,
481
+ (error: unknown) => error,
482
+ );
483
+ expect(failure).toBeInstanceOf(ConnectError);
484
+ expect((failure as ConnectError).code).toBe(Code.PermissionDenied);
485
+ expect((failure as ConnectError).rawMessage).toBe(
486
+ MEMORY_CAPTURE_ORG_MISMATCH_MESSAGE,
487
+ );
488
+ expect(MEMORY_CAPTURE_ORG_MISMATCH_MESSAGE).toBe(
489
+ "memory capture is scoped to the session's organization",
490
+ );
491
+ });
492
+
493
+ it("a workflow-bound runner is refused — the cloud refuses every non-session lane", async () => {
494
+ expect(await decide(workflowBound, "acme")).toEqual({ verdict: "refuse" });
495
+ });
496
+
497
+ it("a connect-bound runner is refused — a discovery has no session to capture for", async () => {
498
+ expect(await decide(connectBound, "acme")).toEqual({ verdict: "refuse" });
499
+ });
500
+
501
+ it("an agent-bound runner whose run has vanished is refused — a memory the server cannot attribute is not written as nobody's", async () => {
502
+ const orphan = runnerCaller(service.mintRunCredential("aex_vanished"));
503
+ expect(await decide(orphan, "acme")).toEqual({ verdict: "refuse" });
504
+ });
505
+
506
+ it("a person is no-opinion — the gate's own eligibility logic applies unchanged", async () => {
507
+ expect(await decide(person, "acme")).toEqual({ verdict: "no-opinion" });
508
+ });
509
+
510
+ it("a runner-class caller whose token this server did not sign is no-opinion, never a throw — the gate then applies its own logic", async () => {
511
+ const stranger = runnerCaller(
512
+ RunnerAuthService.create(randomBytes(32)).mintRunCredential("aex_other"),
513
+ );
514
+ expect(await decide(stranger, "acme")).toEqual({ verdict: "no-opinion" });
515
+ });
516
+ });
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Pins the dispatch reader's three answers (dispatch-credential.ts): the
3
+ * minted credential when the provider defines the capability; "" with
4
+ * nothing logged when the capability is absent (an edition credentialed
5
+ * another way) or answers ""; and "" with exactly one warning when the
6
+ * capability throws — a dispatch never fails on a mint. Also pins WHAT
7
+ * the warning carries: the execution id and the error's message, never
8
+ * the credential or the provider.
9
+ */
10
+ import { randomBytes } from "node:crypto";
11
+
12
+ import { describe, expect, it } from "vitest";
13
+
14
+ import { createLogger } from "../../boot/logger.js";
15
+ import type { LogEntry } from "../../boot/logger.js";
16
+ import { runCredentialForDispatch } from "../dispatch-credential.js";
17
+ import type { RunCredentialMint } from "../dispatch-credential.js";
18
+ import { newExecutionScopedRunnerCredentialProvider } from "../runner-credential-provider.js";
19
+ import {
20
+ RunnerAuthService,
21
+ TOKEN_TYPE_EXECUTION_SCOPED,
22
+ } from "../runnerauth.js";
23
+
24
+ function capturingLogger() {
25
+ const entries: LogEntry[] = [];
26
+ const logger = createLogger({
27
+ level: "debug",
28
+ pretty: false,
29
+ write: () => {},
30
+ sink: (entry) => entries.push(entry),
31
+ });
32
+ return { logger, entries };
33
+ }
34
+
35
+ describe("runCredentialForDispatch", () => {
36
+ it("answers the provider's run credential, bound to the execution", () => {
37
+ const service = RunnerAuthService.create(randomBytes(32));
38
+ const provider = newExecutionScopedRunnerCredentialProvider(service);
39
+ const { logger, entries } = capturingLogger();
40
+
41
+ const token = runCredentialForDispatch(provider, "aex_dispatch", logger);
42
+
43
+ expect(provider.verify(TOKEN_TYPE_EXECUTION_SCOPED, token)).toBe(
44
+ "aex_dispatch",
45
+ );
46
+ expect(entries).toEqual([]);
47
+ });
48
+
49
+ it('answers "" silently when the capability is absent — the edition\'s runner is credentialed another way', () => {
50
+ const withoutCapability: RunCredentialMint = {};
51
+ const { logger, entries } = capturingLogger();
52
+
53
+ expect(runCredentialForDispatch(withoutCapability, "aex_1", logger)).toBe(
54
+ "",
55
+ );
56
+ expect(entries).toEqual([]);
57
+ });
58
+
59
+ it('answers "" silently when the capability answers "" (keyless)', () => {
60
+ const keyless = newExecutionScopedRunnerCredentialProvider(
61
+ RunnerAuthService.create(undefined),
62
+ );
63
+ const { logger, entries } = capturingLogger();
64
+
65
+ expect(runCredentialForDispatch(keyless, "aex_1", logger)).toBe("");
66
+ expect(entries).toEqual([]);
67
+ });
68
+
69
+ it('a throwing capability degrades to "" with one warning that names the execution and never the credential', () => {
70
+ const throwing: RunCredentialMint = {
71
+ mintRunCredential(): string {
72
+ throw new Error("signing key unreadable");
73
+ },
74
+ };
75
+ const { logger, entries } = capturingLogger();
76
+
77
+ expect(runCredentialForDispatch(throwing, "aex_fault", logger)).toBe("");
78
+
79
+ expect(entries).toHaveLength(1);
80
+ const [warning] = entries;
81
+ expect(warning!.level).toBe("warn");
82
+ expect(warning!.message).toMatch(/dispatching without it/);
83
+ // The field set is the contract: an id and a message, nothing that
84
+ // could be a credential.
85
+ expect(Object.keys(warning!.fields ?? {}).sort()).toEqual([
86
+ "error",
87
+ "execution_id",
88
+ ]);
89
+ expect(warning!.fields).toMatchObject({
90
+ execution_id: "aex_fault",
91
+ error: "signing key unreadable",
92
+ });
93
+ });
94
+ });
@@ -5,6 +5,11 @@
5
5
  * fails CLOSED (InvalidTokenError — callers fall back to redaction), mint
6
6
  * fails LOUD (a plain Error naming the lane — a composition bug, not a
7
7
  * runtime condition), isEnabled answers the honest false.
8
+ *
9
+ * Also pins the one capability the default DEFINES: `mintRunCredential`,
10
+ * the clockless run credential a dispatch carries — minted on the
11
+ * execution_scoped lane with no `exp`, and "" (never a throw) when the
12
+ * service is keyless, so a dispatch degrades instead of failing.
8
13
  */
9
14
  import { randomBytes } from "node:crypto";
10
15
 
@@ -14,6 +19,7 @@ import { newExecutionScopedRunnerCredentialProvider } from "../runner-credential
14
19
  import {
15
20
  DEFAULT_TTL_SECONDS,
16
21
  InvalidTokenError,
22
+ isClockedToken,
17
23
  MintingDisabledError,
18
24
  RunnerAuthService,
19
25
  TOKEN_TYPE_EXECUTION_SCOPED,
@@ -61,6 +67,23 @@ describe("execution-scoped provider over a keyed service", () => {
61
67
  provider.verify(TOKEN_TYPE_EXECUTION_SCOPED, "not-a-token"),
62
68
  ).toThrow(InvalidTokenError);
63
69
  });
70
+
71
+ it("mintRunCredential mints the clockless run credential, bound to the execution, on the provided lane", () => {
72
+ const token = provider.mintRunCredential!("aex_dispatch");
73
+ expect(token).not.toBe("");
74
+ expect(provider.verify(TOKEN_TYPE_EXECUTION_SCOPED, token)).toBe(
75
+ "aex_dispatch",
76
+ );
77
+ // No `exp`: the credential's validity is the row's liveness, never a
78
+ // clock (the run credential's defining property).
79
+ expect(isClockedToken(token)).toBe(false);
80
+ });
81
+
82
+ it("mintRunCredential refuses an empty execution id loudly — a programming error, not a degrade", () => {
83
+ expect(() => provider.mintRunCredential!("")).toThrowError(
84
+ /execution id is required/,
85
+ );
86
+ });
64
87
  });
65
88
 
66
89
  describe("execution-scoped provider over a keyless service", () => {
@@ -83,4 +106,8 @@ describe("execution-scoped provider over a keyless service", () => {
83
106
  provider.verify(TOKEN_TYPE_EXECUTION_SCOPED, "any-token"),
84
107
  ).toThrow(InvalidTokenError);
85
108
  });
109
+
110
+ it('mintRunCredential answers "" — the dispatch goes without, never fails', () => {
111
+ expect(provider.mintRunCredential!("aex_keyless")).toBe("");
112
+ });
86
113
  });