@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
@@ -32,7 +32,13 @@
32
32
  *
33
33
  * - No scope composed = the OSS full scan, byte-identical (the four
34
34
  * local conformance rosters pin it; the org argument is then not
35
- * consulted either).
35
+ * consulted either). That is the trusted-local posture. Under the
36
+ * built-in authorization posture (src/authorization/posture.ts — an
37
+ * authentication posture with no unit Authorizer) open source
38
+ * composes its own scope (src/authorization/list-read-scope.ts): the
39
+ * cloud's model, evaluated per candidate over the facts the candidate
40
+ * carries, so a self-host's lists show a person what a `get` would
41
+ * let them read. A unit's registered scope wins in every posture.
36
42
  * - A scope only NARROWS. It never reorders, never adds; sort/filter
37
43
  * tails, per-lane org intersection, and empty-set semantics (empty
38
44
  * list, proto default instance, kind-skipped) stay consumer-owned
@@ -90,40 +96,55 @@
90
96
  * the child's check and shown by the parent's — the row's truth, read
91
97
  * from the field the tuple was derived from, and no widening: nobody
92
98
  * reaches a parent through it who could not create the row in it.
99
+ * - EVERY CANDIDATE CARRIES THE ROW'S AUTHORIZATION FACTS (the
100
+ * built-in scope's entry): the creator stamp, the visibility level
101
+ * and every parent link the tuple lifecycle would have written — the
102
+ * `RowAuthorizationFacts` the row's tuples derive from, read by the
103
+ * one structural resolver the built-in authorizer reads a loaded row
104
+ * through (pipeline/steps/authorization-facts.ts). A driver that
105
+ * evaluates the model over a candidate therefore needs no second
106
+ * read of a row the lane already decoded; a driver that asks an
107
+ * engine ignores the facts and is byte-neutral. The facts are
108
+ * REQUIRED on the candidate, never optional: both are always on the
109
+ * row the helper holds, and an optional field would let a driver
110
+ * silently skip the check.
93
111
  */
94
112
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
113
+ import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
114
+ import type { ApiResourceAudit } from "@stigmer/protos/ai/stigmer/commons/apiresource/status_pb";
95
115
 
96
- // The first VALUE imports from extensions/ into pipeline/ (every other
97
- // crossing is a type): two pure leaf modules that import nothing but
98
- // protos, so there is no cycle. Deliberate — one resolver for the tuple
99
- // writer and the list reader beats a copy in the seam.
100
- import {
101
- getKindEnum,
102
- inheritedAuthorizationParentOf,
103
- } from "../pipeline/apiresource-meta.js";
104
- import { parentIdOf } from "../pipeline/steps/shapes.js";
116
+ // The only VALUE imports from extensions/ into pipeline/ (every other
117
+ // crossing is a type): three pure leaf modules that import nothing but
118
+ // protos and each other, so there is no cycle. Deliberate — one resolver
119
+ // for the tuple writer, the point-check driver and the list reader beats
120
+ // a copy in the seam.
121
+ import { inheritedAuthorizationParentOf } from "../pipeline/apiresource-meta.js";
122
+ import { rowAuthorizationFactsOf } from "../pipeline/steps/authorization-facts.js";
105
123
 
106
124
  import type { CallerIdentity } from "./identity.js";
107
- import type { ResolvedParentLink } from "./resource-authorization.js";
125
+ import type {
126
+ ResolvedParentLink,
127
+ RowAuthorizationFacts,
128
+ } from "./resource-authorization.js";
108
129
 
109
130
  /**
110
- * The candidate metadata a post-scan lane offers the scope — the three
111
- * fields the cloud driver's rules key on (id for the FGA intersection,
112
- * labels for the guest cookie rule; org rides along for symmetry with
113
- * the consumer-owned intersection, so a driver can log or assert on it),
114
- * plus the parent for kinds whose authorization is their parent's.
131
+ * The candidate a post-scan lane offers the scope: the row's authorization
132
+ * facts (the header's last contract line), the labels the cloud driver's
133
+ * guest cookie rule keys on (org rides along in the facts for symmetry
134
+ * with the consumer-owned intersection, so a driver can log or assert on
135
+ * it), and the parent for kinds whose authorization is their parent's.
115
136
  */
116
- export interface ListEntryMeta {
117
- readonly id: string;
118
- readonly org: string;
137
+ export interface ListEntryMeta extends RowAuthorizationFacts {
119
138
  readonly labels: Readonly<Record<string, string>>;
120
139
  /**
121
140
  * OPTIONAL (added 20260913.04 T04): the parent this row's authorization
122
141
  * IS — present only for a kind whose `kind_meta` is PARENT scope with
123
- * INHERITED owner (the header's last contract line), the same
124
- * `ResolvedParentLink` the tuple lifecycle wrote for the row. Absent for
125
- * every other kind, and absent when the row's spec does not name its
126
- * parent — a driver then asks about the row itself, never drops it.
142
+ * INHERITED owner (the header's contract line), the same
143
+ * `ResolvedParentLink` the tuple lifecycle wrote for the row and one of
144
+ * the candidate's own `parentLinks`, named again as the designation a
145
+ * driver may answer in place of the child. Absent for every other kind,
146
+ * and absent when the row's spec does not name its parent — a driver
147
+ * then asks about the row itself, never drops it.
127
148
  */
128
149
  readonly authorizationParent?: ResolvedParentLink;
129
150
  }
@@ -157,18 +178,21 @@ export interface ListReadScope {
157
178
 
158
179
  /**
159
180
  * The shape every stored API resource message presents to the shared
160
- * helper — the metadata fields the scope's candidates are built from, and
161
- * the spec the parent is read from (structurally, by `kind_meta`'s
181
+ * helper — the metadata fields the scope's candidates are built from, the
182
+ * spec the parents are read from (structurally, by `kind_meta`'s
162
183
  * `spec_field`; typed loosely because the field differs per kind and the
163
- * read is `parentIdOf`'s).
184
+ * read is `parentIdOf`'s), and the audit the creator stamp is read from
185
+ * (the one generated type every kind's status carries it as).
164
186
  */
165
187
  export interface ScopedListResource {
166
188
  metadata?: {
167
189
  id?: string;
168
190
  org?: string;
169
191
  labels?: Record<string, string>;
192
+ visibility?: ApiResourceVisibility;
170
193
  };
171
194
  spec?: object;
195
+ status?: { audit?: ApiResourceAudit };
172
196
  }
173
197
 
174
198
  /**
@@ -187,9 +211,11 @@ export interface ScopedListResource {
187
211
  * ids. The same set either way (both are per-row predicates); the
188
212
  * order is the header's second-to-last contract line: the scope sees
189
213
  * the org's rows, not the kind's;
190
- * - the candidates of a kind whose authorization is its parent's carry
191
- * `authorizationParent` (the header's last line), resolved once per
192
- * call from `kind_meta` and once per row from the spec.
214
+ * - every candidate carries the row's authorization facts, and the
215
+ * candidates of a kind whose authorization is its parent's name that
216
+ * parent again as `authorizationParent` — one of the facts' parent
217
+ * links, picked by the relation `kind_meta` declares, resolved once
218
+ * per call and read once per row.
193
219
  */
194
220
  export async function restrictListByReadScope<T extends ScopedListResource>(
195
221
  scope: ListReadScope | undefined,
@@ -208,11 +234,10 @@ export async function restrictListByReadScope<T extends ScopedListResource>(
208
234
  const parentOf = authorizationParentReader(kind);
209
235
  const entries: ListEntryMeta[] = offered.map((resource) => {
210
236
  const entry: ListEntryMeta = {
211
- id: resource.metadata?.id ?? "",
212
- org: resource.metadata?.org ?? "",
237
+ ...rowAuthorizationFactsOf(kind, resource),
213
238
  labels: resource.metadata?.labels ?? {},
214
239
  };
215
- const authorizationParent = parentOf(resource);
240
+ const authorizationParent = parentOf(entry.parentLinks);
216
241
  return authorizationParent === undefined
217
242
  ? entry
218
243
  : { ...entry, authorizationParent };
@@ -222,25 +247,22 @@ export async function restrictListByReadScope<T extends ScopedListResource>(
222
247
  }
223
248
 
224
249
  /**
225
- * The per-row parent reader for `kind`: a constant `undefined` for the 27
250
+ * The per-row parent picker for `kind`: a constant `undefined` for the 27
226
251
  * kinds whose authorization is their own, and for the kind whose
227
- * authorization is its parent's, the `ResolvedParentLink` the tuple
228
- * lifecycle wrote — or undefined for a row whose spec does not name it
229
- * (never a throw: a list is not a create). `kind_meta` is consulted once
230
- * per call, not once per row.
252
+ * authorization is its parent's, the link among the row's own parent
253
+ * links that carries the declared relation — or undefined for a row whose
254
+ * spec does not name it (never a throw: a list is not a create).
255
+ * `kind_meta` is consulted once per call, not once per row.
231
256
  */
232
257
  function authorizationParentReader(
233
258
  kind: ApiResourceKind,
234
- ): (resource: ScopedListResource) => ResolvedParentLink | undefined {
259
+ ): (
260
+ parentLinks: ReadonlyArray<ResolvedParentLink>,
261
+ ) => ResolvedParentLink | undefined {
235
262
  const parent = inheritedAuthorizationParentOf(kind);
236
263
  if (parent === undefined) {
237
264
  return () => undefined;
238
265
  }
239
- const parentKind = getKindEnum(parent.kind);
240
- return (resource) => {
241
- const parentId = parentIdOf(resource, parent.specField);
242
- return parentId === ""
243
- ? undefined
244
- : { relation: parent.relation, parentKind, parentId };
245
- };
266
+ return (parentLinks) =>
267
+ parentLinks.find((link) => link.relation === parent.relation);
246
268
  }
@@ -5,19 +5,23 @@
5
5
  * conformance capability flags, and this port is their ONE seam:
6
6
  *
7
7
  * - `find` (org enumeration; capability `organizationEnumeration`):
8
- * single-tenant OSS enumerates freely; the cloud refuses with
9
- * UNIMPLEMENTED (tenant isolation — no caller may list orgs it does
10
- * not belong to).
11
- * - `findMyOrganizations` (capability `multiTenant`): OSS answers ALL
12
- * organizations (single-user semantics); the cloud filters to the
13
- * caller's authorized set.
8
+ * the trusted-local laptop enumerates freely; the cloud — and open
9
+ * source under the built-in authorization posture — refuses with
10
+ * UNIMPLEMENTED (no caller may list organizations they hold no role
11
+ * in; `find` is skip-authorization by annotation, so the refusal is
12
+ * the only thing standing between a member and every row).
13
+ * - `findMyOrganizations` (capability `multiTenant`): the trusted-local
14
+ * laptop answers ALL organizations (single-user semantics); the cloud
15
+ * and the built-in directory filter to what the caller may view.
14
16
  * - `getByExternalOrgId` (capability `externalOrgLookup`): deliberately
15
17
  * absent from the OSS partial registration (UNIMPLEMENTED by
16
18
  * construction); the cloud resolves external IdP org ids.
17
19
  *
18
- * No directory composed = the controller's OSS behavior, byte-identical.
19
- * The controller stays the ONE owner of its chains — the directory
20
- * answers policy questions and id lookups; it never handles RPCs.
20
+ * No directory composed = the trusted-local behavior, byte-identical; the
21
+ * built-in directory (authorization/organization-directory.ts) composes
22
+ * under the built-in posture, a unit's under its own. The controller stays
23
+ * the ONE owner of its chains — the directory answers policy questions
24
+ * and id lookups; it never handles RPCs.
21
25
  */
22
26
  import type { CallerIdentity } from "./identity.js";
23
27
 
@@ -55,6 +55,7 @@
55
55
  */
56
56
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
57
57
  import type { OwnerAttributionType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
58
+ import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
58
59
  import type { IamPolicy } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/api_pb";
59
60
  import type { IamPolicySpec } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/spec_pb";
60
61
 
@@ -90,6 +91,39 @@ export interface ResolvedParentLink {
90
91
  readonly parentId: string;
91
92
  }
92
93
 
94
+ /**
95
+ * The facts a stored row carries that its authorization tuples derive
96
+ * from — the row-side vocabulary of `kind_meta.authorization`, read back
97
+ * from a row rather than resolved at its create. The lifecycle derives a
98
+ * `ResourceCreatedEvent` from the same facts on the way in; a list lane
99
+ * offers them on every candidate (`ListEntryMeta`, list-read-scope.ts);
100
+ * the built-in authorizer derives a loaded row's tuples from them. One
101
+ * shape, read by one structural resolver
102
+ * (pipeline/steps/authorization-facts.ts), so a driver that evaluates the
103
+ * model over a candidate needs no second read of the row.
104
+ *
105
+ * Read-side facts are lenient where the create-time resolution is strict:
106
+ * a legacy row that names no organization or no parent carries none (an
107
+ * empty `org`, a link absent from `parentLinks`) and a stamp that names
108
+ * nobody is the empty string — a fact about the row, never a fault of the
109
+ * read.
110
+ */
111
+ export interface RowAuthorizationFacts {
112
+ readonly id: string;
113
+ /** `metadata.org`; "" for kinds outside organization scope and for legacy rows that never named one. */
114
+ readonly org: string;
115
+ /** `metadata.visibility` as stored; unspecified when the row never set one. */
116
+ readonly visibility: ApiResourceVisibility;
117
+ /** `status.audit.spec_audit.created_by.id` as stamped; "" when absent. Classified by the reader, not here. */
118
+ readonly createdBy: string;
119
+ /**
120
+ * The scope link and every configured additional parent, in the tuple
121
+ * lifecycle's order, from the row's own fields; a parent the row does
122
+ * not name is absent, never a fault.
123
+ */
124
+ readonly parentLinks: ReadonlyArray<ResolvedParentLink>;
125
+ }
126
+
93
127
  /** Fired synchronously after a resource row is first persisted. */
94
128
  export interface ResourceCreatedEvent {
95
129
  readonly kind: ApiResourceKind;
@@ -2,32 +2,63 @@
2
2
  * The schedule-fire caller seam (stigmer-cloud#572) — WHO a schedule fire
3
3
  * acts as when the RunStarter re-enters the execution create pipeline.
4
4
  *
5
- * OSS deliberately has no caller identity on this lane (DD-015 D-G: the
6
- * single-user edition has no tokens to carry one), so with no driver
7
- * composed every fire enters as the in-process `internal` class — today's
8
- * behavior, byte-identical. The cloud edition's Java baseline instead
9
- * mints a schedule JWT per fire (sub = the org's system-schedule account,
10
- * claim = the firing Schedule id) so the created session and execution
11
- * carry real attribution and the schedule's viewer set reaches the run
12
- * (the FGA model's session#schedule link — "without it a scheduled run is
13
- * invisible to every human, including the schedule's owner"). This seam
14
- * lets a composition supply that identity; the fire then propagates it
15
- * through the R5 caller-propagation header exactly like the other
16
- * request-origin in-process creates.
5
+ * With no driver composed a fire enters as the in-process `internal`
6
+ * class — the trusted-local laptop's lane, where the one caller is the
7
+ * server's operator and attribution has nobody to separate. Under an
8
+ * authentication posture that lane is wrong: the internal class carries
9
+ * the operator's email or `"system"`, which no enforcing evaluator
10
+ * recognizes as a person, so the fired session would belong to nobody
11
+ * (the FGA model's own words — "without it a scheduled run is invisible
12
+ * to every human, including the schedule's owner"). Two drivers answer
13
+ * it: the cloud edition mints a schedule JWT per fire (sub = the org's
14
+ * system-schedule account, claim = the firing Schedule id) so the run
15
+ * reaches the schedule's viewer set through the session#schedule link;
16
+ * open source, under the built-in authorization posture, makes the fire
17
+ * act as the schedule's CREATOR (authorization/schedule-fire-caller.ts),
18
+ * so the run and its session are that person's. The fire then propagates
19
+ * the identity through the R5 caller-propagation header exactly like the
20
+ * other request-origin in-process creates.
17
21
  *
18
22
  * Single-instance point. The mint is per fire — the schedule id is a
19
- * claim of the minted credential, never a cached field — and a mint
20
- * failure is an infrastructure fault: the RunStarter lets it propagate,
21
- * so the tick activity retries (the deterministic execution name absorbs
22
- * the retry) and a manual trigger surfaces the failure to its caller.
23
+ * claim of the minted credential, never a cached field. Two failure
24
+ * shapes, and the RunStarter tells them apart by type, the store-fault
25
+ * precedent (`ResourceNotFoundError` is checked with `instanceof`; every
26
+ * other fault is infrastructure):
27
+ *
28
+ * - any other thrown error is an INFRASTRUCTURE fault: the RunStarter
29
+ * lets it propagate, so the tick activity retries (the deterministic
30
+ * execution name absorbs the retry) and a manual trigger surfaces
31
+ * the failure to its caller;
32
+ * - `ScheduleFireCallerRefusedError` is a DETERMINISTIC refusal — this
33
+ * fire can act as nobody, and no retry will change that (a schedule
34
+ * stamped by no person this server knows). The RunStarter answers
35
+ * the `refused` outcome the way it answers a launch gate's refusal:
36
+ * the failure streak counts it and pauses the schedule with the
37
+ * reason, so the person who scheduled it sees why in the console
38
+ * instead of a tick failing quietly forever.
23
39
  */
24
40
  import type { CallerIdentity } from "./identity.js";
25
41
 
26
42
  export interface ScheduleFireCallerMint {
27
43
  /**
28
44
  * Mints the caller identity one fire acts as. `rawToken` must carry the
29
- * edition's verifiable credential for the identity (compositions read
30
- * fire-scoped claims — e.g. the schedule id — from it downstream).
45
+ * edition's verifiable credential for the identity when the edition
46
+ * reads fire-scoped claims from it downstream (the cloud does — the
47
+ * schedule id); an edition that propagates the identity in-process and
48
+ * reads nothing off the token leaves it empty (open source does).
31
49
  */
32
50
  mintFireCaller(org: string, scheduleId: string): Promise<CallerIdentity>;
33
51
  }
52
+
53
+ /**
54
+ * The mint's deterministic refusal (the module header): thrown by a
55
+ * driver when the fire can act as nobody and retrying cannot help. The
56
+ * message is the reason the schedule's status carries, so it is written
57
+ * for the person who scheduled the run.
58
+ */
59
+ export class ScheduleFireCallerRefusedError extends Error {
60
+ constructor(reason: string) {
61
+ super(reason);
62
+ this.name = "ScheduleFireCallerRefusedError";
63
+ }
64
+ }
@@ -218,6 +218,28 @@ describe("the byte-pinned classifyAuthError arms", () => {
218
218
  expect(ConnectError.from(error).code).toBe(Code.Unauthenticated);
219
219
  expect(ConnectError.from(error).rawMessage).toBe(INVALID_TOKEN_MESSAGE);
220
220
  });
221
+
222
+ it("a JWT whose algorithm the JWKS cannot serve (HS256 against RS256 keys) → 'invalid token', a CREDENTIAL rejection, never a plain error the chassis maps INTERNAL", async () => {
223
+ // The shape the server's own execution-scoped runner token has
224
+ // (runnerauth.ts). Whether this verifier should ever SEE it is the
225
+ // chain order's business (the runner verifier claims it first); that
226
+ // it must not answer INTERNAL when it does is this arm's. Until
227
+ // 2026-09-16 it threw jose's JOSENotSupported unclassified, and a
228
+ // self-host with sign-in on failed every agent execution with
229
+ // "internal server error" (stigmer#1137).
230
+ const segment = (value: unknown): string =>
231
+ Buffer.from(JSON.stringify(value)).toString("base64url");
232
+ const hs256 = `${segment({ alg: "HS256", typ: "JWT" })}.${segment({
233
+ token_type: "execution_scoped",
234
+ execution_id: "aex_1",
235
+ iat: 1,
236
+ exp: 4102444800,
237
+ })}.${segment("a-mac-this-verifier-cannot-check")}`;
238
+ const error = await rejectionOf(verifier().verify(hs256));
239
+ expect(error).toBeInstanceOf(ConnectError);
240
+ expect(ConnectError.from(error).code).toBe(Code.Unauthenticated);
241
+ expect(ConnectError.from(error).rawMessage).toBe(INVALID_TOKEN_MESSAGE);
242
+ });
221
243
  });
222
244
 
223
245
  describe("subject → account resolution (20260911.11 Q-IA-2, A1)", () => {
@@ -159,7 +159,14 @@ function classifyJoseError(error: unknown): unknown {
159
159
  }
160
160
  if (
161
161
  error instanceof joseErrors.JWTInvalid ||
162
- error instanceof joseErrors.JWSInvalid
162
+ error instanceof joseErrors.JWSInvalid ||
163
+ // A JWT whose algorithm the issuer's key set cannot serve (an HS256
164
+ // token against an RS256 JWKS): a credential this verifier recognizes
165
+ // but cannot verify, so a credential rejection — never the
166
+ // infrastructure arm. Until 2026-09-16 it fell through to INTERNAL,
167
+ // and a self-host with sign-in on failed every agent execution on its
168
+ // own runner token (stigmer#1137).
169
+ error instanceof joseErrors.JOSENotSupported
163
170
  ) {
164
171
  return new ConnectError(INVALID_TOKEN_MESSAGE, Code.Unauthenticated);
165
172
  }
package/src/index.ts CHANGED
@@ -148,14 +148,64 @@ export type { AuthorizationQueryEngine } from "./extensions/authorization-querie
148
148
  export type { IdentityFederation } from "./extensions/identity-federation.js";
149
149
  export type { AccountsBySubject } from "./domain/identityaccount/resolve.js";
150
150
  export { identityIdForSubject } from "./domain/identityaccount/resolve.js";
151
+ // The built-in authorizer's model seams: the kind
152
+ // declarations (transcripts of the cloud's `.fga` files), the evaluator,
153
+ // and the OpenFGA store-test kit — exported so the cloud's drift test
154
+ // compares the live model against the transcripts and runs its live
155
+ // store tests through the evaluator, both from the published package.
156
+ // The drivers themselves are composed by the root and are not exported.
157
+ export type {
158
+ DerivedRelation,
159
+ KindDeclaration,
160
+ Rewrite,
161
+ SubjectType,
162
+ } from "./authorization/model/rewrite.js";
163
+ export type { Model } from "./authorization/model/index.js";
164
+ export {
165
+ builtInModel,
166
+ declarationFor,
167
+ newModel,
168
+ } from "./authorization/model/index.js";
169
+ export type {
170
+ CheckContext,
171
+ ObjectRef,
172
+ Person,
173
+ Subject,
174
+ Tuple,
175
+ TupleSource,
176
+ } from "./authorization/tuples.js";
177
+ export type { EvaluationFault } from "./authorization/evaluator.js";
178
+ export {
179
+ AuthorizationEvaluationError,
180
+ MAX_RESOLUTION_DEPTH,
181
+ checkRelation,
182
+ } from "./authorization/evaluator.js";
183
+ export type {
184
+ StoreTestCase,
185
+ StoreTestDocument,
186
+ StoreTestKit,
187
+ StoreTestSkip,
188
+ StoreTestSkipReason,
189
+ } from "./authorization/store-test-kit.js";
190
+ export {
191
+ parseStoreTestDocument,
192
+ storeTestCases,
193
+ } from "./authorization/store-test-kit.js";
194
+ // The kinds whose missing row the built-in authorizer denies instead of
195
+ // answering not-found — the cloud's probe exemption over the open-source
196
+ // tier; exported so the cloud's drift test pins the two sets equal.
197
+ export { NOT_FOUND_EXEMPT_KINDS } from "./authorization/authorizer.js";
151
198
  export type {
152
199
  ListReadScope,
153
200
  ListEntryMeta,
154
201
  } from "./extensions/list-read-scope.js";
155
202
  // The stigmer-cloud#572 seam: the identity a schedule fire acts as
156
203
  // (drivers.scheduleFireCaller) — the composition mints it per fire; the
157
- // RunStarter propagates it through the R5 in-process header.
204
+ // RunStarter propagates it through the R5 in-process header. A mint that
205
+ // can act as nobody throws the seam's typed refusal, which the RunStarter
206
+ // counts against the schedule instead of retrying.
158
207
  export type { ScheduleFireCallerMint } from "./extensions/schedule-fire-caller.js";
208
+ export { ScheduleFireCallerRefusedError } from "./extensions/schedule-fire-caller.js";
159
209
  // The 20260830.03 seam: the visitor-sanitization policy the serving
160
210
  // chain's error boundary consumes (drivers.visitorErrorPolicy) — the
161
211
  // composition supplies WHO is on the anonymous surface and WHAT copy
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Pins `kindByIdPrefix` (pipeline/apiresource-meta.ts), the inverse of
3
+ * `getIdPrefix` over the ids the server mints (`<prefix>_<ulid>`,
4
+ * pipeline/steps/defaults.ts). The runner-credential lane reads it to
5
+ * learn which execution kind a token's binding names — an agent
6
+ * execution (`aex_`) or a workflow execution (`wex_`) — without a second
7
+ * claim on the token or a guess.
8
+ *
9
+ * Two properties are load-bearing:
10
+ *
11
+ * - NEVER a throw. The id arrives inside a credential; the caller
12
+ * refuses with its own sentence, so anything that is not a known
13
+ * prefix followed by an underscore is the unknown kind.
14
+ * - Every `id_prefix` in the contract is UNIQUE. The lookup is a Map
15
+ * over the `kind_meta` table; a duplicate prefix would silently win
16
+ * for one kind and lose for the other. The pin below turns a future
17
+ * duplicate into a reviewed change.
18
+ */
19
+ import { describe, expect, it } from "vitest";
20
+
21
+ import {
22
+ ApiResourceKind,
23
+ ApiResourceKindSchema,
24
+ kind_meta,
25
+ } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
26
+ import { getOption, hasOption } from "@bufbuild/protobuf";
27
+
28
+ import { getIdPrefix, kindByIdPrefix } from "../apiresource-meta.js";
29
+
30
+ describe("kindByIdPrefix — a minted id names its kind by prefix", () => {
31
+ it.each([
32
+ ["aex_01m2mp45efcjvq2z1e1yn4cyz7", ApiResourceKind.agent_execution],
33
+ ["wex_01m2mp45efcjvq2z1e1yn4cyz7", ApiResourceKind.workflow_execution],
34
+ ["ses_x", ApiResourceKind.session],
35
+ ["ida_carol", ApiResourceKind.identity_account],
36
+ ])("%s is %s", (id, kind) => {
37
+ expect(kindByIdPrefix(id)).toBe(kind);
38
+ });
39
+
40
+ it.each([
41
+ ["zzz_unknown_kind", "an unknown prefix"],
42
+ ["aex", "a prefix with no underscore"],
43
+ ["_aex", "a leading underscore names no prefix"],
44
+ ["", "empty"],
45
+ ["AEX_upper", "prefixes are lowercase in the contract"],
46
+ ["stk_notajwt", "an API key's prefix is not a kind"],
47
+ ])("%s is the unknown kind (%s) — never a throw", (id) => {
48
+ expect(kindByIdPrefix(id)).toBe(ApiResourceKind.api_resource_kind_unknown);
49
+ });
50
+
51
+ it("round-trips with getIdPrefix over every kind the contract declares", () => {
52
+ for (const value of ApiResourceKindSchema.values) {
53
+ if (!hasOption(value, kind_meta)) continue;
54
+ const kind = value.number as ApiResourceKind;
55
+ expect(kindByIdPrefix(`${getIdPrefix(kind)}_01anyulid`), value.name).toBe(
56
+ kind,
57
+ );
58
+ }
59
+ });
60
+
61
+ it("every id_prefix in the contract is unique — the table pin a duplicate must change", () => {
62
+ const seen = new Map<string, string>();
63
+ for (const value of ApiResourceKindSchema.values) {
64
+ if (!hasOption(value, kind_meta)) continue;
65
+ const prefix = getOption(value, kind_meta).idPrefix;
66
+ expect(prefix, `${value.name} declares no id_prefix`).not.toBe("");
67
+ const holder = seen.get(prefix);
68
+ expect(
69
+ holder,
70
+ `id_prefix '${prefix}' is declared by both ${holder} and ${value.name}`,
71
+ ).toBeUndefined();
72
+ seen.set(prefix, value.name);
73
+ }
74
+ });
75
+ });
@@ -157,9 +157,7 @@ describe("R5: caller propagation through the in-process transport", () => {
157
157
  },
158
158
  },
159
159
  );
160
- expect(seen).toEqual([
161
- { ...caller, origin: "in-process" },
162
- ]);
160
+ expect(seen).toEqual([{ ...caller, origin: "in-process" }]);
163
161
  });
164
162
 
165
163
  it("mints the internal class when nothing was propagated (the daemon default)", async () => {
@@ -8,9 +8,12 @@
8
8
  * instances) but never to GRANT anything. Where a grant-shaped decision is
9
9
  * needed, key it on server-owned state instead (e.g. the parent blueprint's
10
10
  * status.default_instance_id, written only by the create/self-heal flows).
11
- * The cloud edition additionally guards the whole reserved namespace at its
12
- * write boundaries (GuardReservedLabelsStep); OSS has no such guard, which
13
- * is one of the reasons OSS predicates must not trust these labels alone.
11
+ * Every write boundary runs GuardReservedLabels over the namespace
12
+ * (pipeline/steps/guard-reserved-labels.ts), but the open-source
13
+ * authorizer's permissive default ALLOWS reserved-label writes by design
14
+ * (the self-hosted operator owns the store), which is why a restrict-shaped
15
+ * predicate here still pairs the label with server-owned state: the
16
+ * plugin-managed guard refuses only beside an existing plugin row.
14
17
  */
15
18
  import type { ApiResourceMetadata } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
16
19
 
@@ -44,6 +47,31 @@ export const SYSTEM_MANAGED_LABEL = `${RESERVED_LABEL_PREFIX}system-managed`;
44
47
  */
45
48
  export const RESERVED_LABEL_TRUE = "true";
46
49
 
50
+ /**
51
+ * The plugin that materialised a resource: the label's value is the
52
+ * plugin's id (`plg_...`), never its slug, because `findAllByLabel` is
53
+ * org-agnostic and two organizations may both install `thermos`. Written
54
+ * only by the plugin controller (in-process, as the installing caller);
55
+ * membership is derived on read from it and stored nowhere else.
56
+ */
57
+ export const PLUGIN_LABEL = `${RESERVED_LABEL_PREFIX}plugin`;
58
+
59
+ /**
60
+ * The archive digest a member was last materialised from — the per-child
61
+ * convergence marker. A re-push compares every member's value with the
62
+ * head's digest before deciding it has nothing to do, so a member another
63
+ * lane deleted or an older install left behind is re-materialised.
64
+ */
65
+ export const PLUGIN_VERSION_LABEL = `${RESERVED_LABEL_PREFIX}plugin-version`;
66
+
67
+ /** The plugin id a resource's labels claim, or undefined when unlabelled. */
68
+ export function pluginIdOf(
69
+ metadata: ApiResourceMetadata | undefined,
70
+ ): string | undefined {
71
+ const value = metadata?.labels[PLUGIN_LABEL];
72
+ return value === undefined || value === "" ? undefined : value;
73
+ }
74
+
47
75
  /**
48
76
  * Whether the metadata carries the DEFAULT_INSTANCE_LABEL marker
49
77
  * (undefined-safe) — Go IsDefaultInstance.
@@ -351,3 +351,44 @@ function kindsByEnumName(): Map<string, ApiResourceKind> {
351
351
  }
352
352
  return enumNameCache;
353
353
  }
354
+
355
+ /**
356
+ * The kind a minted resource id belongs to, read off its prefix — the
357
+ * inverse of `getIdPrefix` over the ids `generateId` mints
358
+ * (`<prefix>_<ulid>`, pipeline/steps/defaults.ts). The one consumer today
359
+ * is the runner-credential lane, whose token binds an execution by id and
360
+ * must know whether that id names an agent execution or a workflow
361
+ * execution without a second claim or a guess. Anything that is not
362
+ * `<known prefix>_<rest>` — no underscore, an unknown prefix, the empty
363
+ * string — is `api_resource_kind_unknown`; never a throw, because the id
364
+ * arrived inside a credential and the caller refuses with its own
365
+ * sentence. Every `id_prefix` in the contract is unique; the table pin in
366
+ * __tests__ makes a future duplicate a reviewed change, since this lookup
367
+ * would otherwise resolve it silently to one of the two.
368
+ */
369
+ export function kindByIdPrefix(id: string): ApiResourceKind {
370
+ const separator = id.indexOf("_");
371
+ if (separator <= 0) {
372
+ return ApiResourceKind.api_resource_kind_unknown;
373
+ }
374
+ return (
375
+ kindsByIdPrefix().get(id.slice(0, separator)) ??
376
+ ApiResourceKind.api_resource_kind_unknown
377
+ );
378
+ }
379
+
380
+ let idPrefixCache: Map<string, ApiResourceKind> | undefined;
381
+
382
+ function kindsByIdPrefix(): Map<string, ApiResourceKind> {
383
+ if (idPrefixCache === undefined) {
384
+ idPrefixCache = new Map(
385
+ ApiResourceKindSchema.values
386
+ .filter((value) => hasOption(value, kind_meta))
387
+ .map((value) => [
388
+ getOption(value, kind_meta).idPrefix,
389
+ value.number as ApiResourceKind,
390
+ ]),
391
+ );
392
+ }
393
+ return idPrefixCache;
394
+ }