@stigmer/server 3.40.0 → 3.41.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 (528) hide show
  1. package/dist/authorization/authorizer.d.ts +16 -10
  2. package/dist/authorization/authorizer.d.ts.map +1 -1
  3. package/dist/authorization/authorizer.js +17 -9
  4. package/dist/authorization/authorizer.js.map +1 -1
  5. package/dist/authorization/derived-tuples.d.ts +7 -3
  6. package/dist/authorization/derived-tuples.d.ts.map +1 -1
  7. package/dist/authorization/derived-tuples.js +62 -6
  8. package/dist/authorization/derived-tuples.js.map +1 -1
  9. package/dist/authorization/evaluator.d.ts +11 -7
  10. package/dist/authorization/evaluator.d.ts.map +1 -1
  11. package/dist/authorization/evaluator.js +16 -10
  12. package/dist/authorization/evaluator.js.map +1 -1
  13. package/dist/authorization/list-read-scope.d.ts +4 -0
  14. package/dist/authorization/list-read-scope.d.ts.map +1 -1
  15. package/dist/authorization/list-read-scope.js +1 -0
  16. package/dist/authorization/list-read-scope.js.map +1 -1
  17. package/dist/authorization/model/data/authorization-model.json +830 -67
  18. package/dist/authorization/model/execution-viewer.d.ts.map +1 -1
  19. package/dist/authorization/model/execution-viewer.js +26 -24
  20. package/dist/authorization/model/execution-viewer.js.map +1 -1
  21. package/dist/authorization/model/index.d.ts +4 -1
  22. package/dist/authorization/model/index.d.ts.map +1 -1
  23. package/dist/authorization/model/index.js +4 -1
  24. package/dist/authorization/model/index.js.map +1 -1
  25. package/dist/authorization/model/rewrite.d.ts +5 -3
  26. package/dist/authorization/model/rewrite.d.ts.map +1 -1
  27. package/dist/authorization/organization-directory.d.ts +44 -0
  28. package/dist/authorization/organization-directory.d.ts.map +1 -1
  29. package/dist/authorization/organization-directory.js +1 -0
  30. package/dist/authorization/organization-directory.js.map +1 -1
  31. package/dist/authorization/person.d.ts +14 -1
  32. package/dist/authorization/person.d.ts.map +1 -1
  33. package/dist/authorization/person.js +16 -0
  34. package/dist/authorization/person.js.map +1 -1
  35. package/dist/authorization/policy-check.d.ts +52 -0
  36. package/dist/authorization/policy-check.d.ts.map +1 -0
  37. package/dist/authorization/policy-check.js +35 -0
  38. package/dist/authorization/policy-check.js.map +1 -0
  39. package/dist/authorization/posture.d.ts +30 -4
  40. package/dist/authorization/posture.d.ts.map +1 -1
  41. package/dist/authorization/posture.js +58 -0
  42. package/dist/authorization/posture.js.map +1 -1
  43. package/dist/authorization/resource-creators.d.ts +4 -0
  44. package/dist/authorization/resource-creators.d.ts.map +1 -0
  45. package/dist/authorization/resource-creators.js +44 -0
  46. package/dist/authorization/resource-creators.js.map +1 -0
  47. package/dist/authorization/trusted-local-authorizer.d.ts +9 -0
  48. package/dist/authorization/trusted-local-authorizer.d.ts.map +1 -0
  49. package/dist/authorization/trusted-local-authorizer.js +70 -0
  50. package/dist/authorization/trusted-local-authorizer.js.map +1 -0
  51. package/dist/authorization/tuples.d.ts +12 -0
  52. package/dist/authorization/tuples.d.ts.map +1 -1
  53. package/dist/authorization/tuples.js +3 -0
  54. package/dist/authorization/tuples.js.map +1 -1
  55. package/dist/boot/compose.d.ts.map +1 -1
  56. package/dist/boot/compose.js +133 -43
  57. package/dist/boot/compose.js.map +1 -1
  58. package/dist/boot/config.d.ts +22 -7
  59. package/dist/boot/config.d.ts.map +1 -1
  60. package/dist/boot/config.js +2 -1
  61. package/dist/boot/config.js.map +1 -1
  62. package/dist/boot/inprocess.d.ts.map +1 -1
  63. package/dist/boot/inprocess.js +10 -4
  64. package/dist/boot/inprocess.js.map +1 -1
  65. package/dist/boot/list-indexes.d.ts.map +1 -1
  66. package/dist/boot/list-indexes.js +6 -1
  67. package/dist/boot/list-indexes.js.map +1 -1
  68. package/dist/boot/logger.d.ts +3 -1
  69. package/dist/boot/logger.d.ts.map +1 -1
  70. package/dist/boot/logger.js +3 -1
  71. package/dist/boot/logger.js.map +1 -1
  72. package/dist/boot/oauth-redirect-uri.d.ts +33 -12
  73. package/dist/boot/oauth-redirect-uri.d.ts.map +1 -1
  74. package/dist/boot/oauth-redirect-uri.js +43 -14
  75. package/dist/boot/oauth-redirect-uri.js.map +1 -1
  76. package/dist/boot/skill-transfer-origin.d.ts +46 -14
  77. package/dist/boot/skill-transfer-origin.d.ts.map +1 -1
  78. package/dist/boot/skill-transfer-origin.js +53 -13
  79. package/dist/boot/skill-transfer-origin.js.map +1 -1
  80. package/dist/domain/agentchannel/steps.d.ts +8 -6
  81. package/dist/domain/agentchannel/steps.d.ts.map +1 -1
  82. package/dist/domain/agentchannel/steps.js +9 -7
  83. package/dist/domain/agentchannel/steps.js.map +1 -1
  84. package/dist/domain/agentexecution/controller.d.ts +7 -0
  85. package/dist/domain/agentexecution/controller.d.ts.map +1 -1
  86. package/dist/domain/agentexecution/controller.js +1 -1
  87. package/dist/domain/agentexecution/controller.js.map +1 -1
  88. package/dist/domain/agentexecution/create-steps.d.ts +26 -12
  89. package/dist/domain/agentexecution/create-steps.d.ts.map +1 -1
  90. package/dist/domain/agentexecution/create-steps.js +61 -43
  91. package/dist/domain/agentexecution/create-steps.js.map +1 -1
  92. package/dist/domain/agentexecution/submit-approval.d.ts.map +1 -1
  93. package/dist/domain/agentexecution/submit-approval.js +9 -6
  94. package/dist/domain/agentexecution/submit-approval.js.map +1 -1
  95. package/dist/domain/agentexecution/submit-file-decision.d.ts.map +1 -1
  96. package/dist/domain/agentexecution/submit-file-decision.js +5 -4
  97. package/dist/domain/agentexecution/submit-file-decision.js.map +1 -1
  98. package/dist/domain/agentshare/steps.d.ts +5 -3
  99. package/dist/domain/agentshare/steps.d.ts.map +1 -1
  100. package/dist/domain/agentshare/steps.js +6 -4
  101. package/dist/domain/agentshare/steps.js.map +1 -1
  102. package/dist/domain/apikey/verifier.d.ts +7 -0
  103. package/dist/domain/apikey/verifier.d.ts.map +1 -1
  104. package/dist/domain/apikey/verifier.js +34 -1
  105. package/dist/domain/apikey/verifier.js.map +1 -1
  106. package/dist/domain/channelapp/controller.d.ts +9 -4
  107. package/dist/domain/channelapp/controller.d.ts.map +1 -1
  108. package/dist/domain/channelapp/controller.js +19 -9
  109. package/dist/domain/channelapp/controller.js.map +1 -1
  110. package/dist/domain/executioncontext/steps.d.ts +2 -1
  111. package/dist/domain/executioncontext/steps.d.ts.map +1 -1
  112. package/dist/domain/executioncontext/steps.js +2 -1
  113. package/dist/domain/executioncontext/steps.js.map +1 -1
  114. package/dist/domain/iampolicy/access-lists.d.ts.map +1 -1
  115. package/dist/domain/iampolicy/access-lists.js +57 -2
  116. package/dist/domain/iampolicy/access-lists.js.map +1 -1
  117. package/dist/domain/iampolicy/change.d.ts +53 -0
  118. package/dist/domain/iampolicy/change.d.ts.map +1 -0
  119. package/dist/domain/iampolicy/change.js +44 -0
  120. package/dist/domain/iampolicy/change.js.map +1 -0
  121. package/dist/domain/iampolicy/constants.d.ts +6 -0
  122. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  123. package/dist/domain/iampolicy/constants.js +6 -0
  124. package/dist/domain/iampolicy/constants.js.map +1 -1
  125. package/dist/domain/iampolicy/controller.d.ts.map +1 -1
  126. package/dist/domain/iampolicy/controller.js +9 -5
  127. package/dist/domain/iampolicy/controller.js.map +1 -1
  128. package/dist/domain/iampolicy/grant-path.d.ts +31 -13
  129. package/dist/domain/iampolicy/grant-path.d.ts.map +1 -1
  130. package/dist/domain/iampolicy/grant-path.js +216 -19
  131. package/dist/domain/iampolicy/grant-path.js.map +1 -1
  132. package/dist/domain/iampolicy/membership.d.ts +11 -3
  133. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  134. package/dist/domain/iampolicy/membership.js +18 -13
  135. package/dist/domain/iampolicy/membership.js.map +1 -1
  136. package/dist/domain/iampolicy/resource-store.d.ts.map +1 -1
  137. package/dist/domain/iampolicy/resource-store.js +4 -0
  138. package/dist/domain/iampolicy/resource-store.js.map +1 -1
  139. package/dist/domain/iampolicy/role-lifecycle.d.ts.map +1 -1
  140. package/dist/domain/iampolicy/role-lifecycle.js +2 -2
  141. package/dist/domain/iampolicy/role-lifecycle.js.map +1 -1
  142. package/dist/domain/iampolicy/roles.d.ts.map +1 -1
  143. package/dist/domain/iampolicy/roles.js +7 -0
  144. package/dist/domain/iampolicy/roles.js.map +1 -1
  145. package/dist/domain/iampolicy/steps.d.ts +4 -3
  146. package/dist/domain/iampolicy/steps.d.ts.map +1 -1
  147. package/dist/domain/iampolicy/steps.js +7 -7
  148. package/dist/domain/iampolicy/steps.js.map +1 -1
  149. package/dist/domain/iampolicy/store-contract.d.ts.map +1 -1
  150. package/dist/domain/iampolicy/store-contract.js +22 -1
  151. package/dist/domain/iampolicy/store-contract.js.map +1 -1
  152. package/dist/domain/iampolicy/store.d.ts +18 -5
  153. package/dist/domain/iampolicy/store.d.ts.map +1 -1
  154. package/dist/domain/iampolicy/store.js.map +1 -1
  155. package/dist/domain/identityaccount/constants.d.ts +15 -0
  156. package/dist/domain/identityaccount/constants.d.ts.map +1 -1
  157. package/dist/domain/identityaccount/constants.js +17 -0
  158. package/dist/domain/identityaccount/constants.js.map +1 -1
  159. package/dist/domain/identityaccount/controller.d.ts.map +1 -1
  160. package/dist/domain/identityaccount/controller.js +17 -6
  161. package/dist/domain/identityaccount/controller.js.map +1 -1
  162. package/dist/domain/identityaccount/resolve.d.ts +47 -0
  163. package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
  164. package/dist/domain/identityaccount/resolve.js +38 -1
  165. package/dist/domain/identityaccount/resolve.js.map +1 -1
  166. package/dist/domain/identityaccount/resource-store.d.ts.map +1 -1
  167. package/dist/domain/identityaccount/resource-store.js +11 -1
  168. package/dist/domain/identityaccount/resource-store.js.map +1 -1
  169. package/dist/domain/identityaccount/steps.d.ts +2 -1
  170. package/dist/domain/identityaccount/steps.d.ts.map +1 -1
  171. package/dist/domain/identityaccount/steps.js +4 -3
  172. package/dist/domain/identityaccount/steps.js.map +1 -1
  173. package/dist/domain/identityaccount/store-contract.js +2 -2
  174. package/dist/domain/identityaccount/store-contract.js.map +1 -1
  175. package/dist/domain/identityaccount/store.d.ts +6 -1
  176. package/dist/domain/identityaccount/store.d.ts.map +1 -1
  177. package/dist/domain/mcpserver/connect-sandbox.d.ts +67 -0
  178. package/dist/domain/mcpserver/connect-sandbox.d.ts.map +1 -0
  179. package/dist/domain/mcpserver/connect-sandbox.js +64 -0
  180. package/dist/domain/mcpserver/connect-sandbox.js.map +1 -0
  181. package/dist/domain/mcpserver/connect.d.ts +42 -10
  182. package/dist/domain/mcpserver/connect.d.ts.map +1 -1
  183. package/dist/domain/mcpserver/connect.js +147 -40
  184. package/dist/domain/mcpserver/connect.js.map +1 -1
  185. package/dist/domain/mcpserver/controller.js +4 -2
  186. package/dist/domain/mcpserver/controller.js.map +1 -1
  187. package/dist/domain/mcpserver/engine.d.ts +26 -7
  188. package/dist/domain/mcpserver/engine.d.ts.map +1 -1
  189. package/dist/domain/mcpserver/engine.js.map +1 -1
  190. package/dist/domain/mcpserver/start-connect.d.ts +5 -0
  191. package/dist/domain/mcpserver/start-connect.d.ts.map +1 -1
  192. package/dist/domain/mcpserver/start-connect.js +38 -15
  193. package/dist/domain/mcpserver/start-connect.js.map +1 -1
  194. package/dist/domain/memory/controller.js +2 -1
  195. package/dist/domain/memory/controller.js.map +1 -1
  196. package/dist/domain/memory/list-index.d.ts +2 -0
  197. package/dist/domain/memory/list-index.d.ts.map +1 -0
  198. package/dist/domain/memory/list-index.js +31 -0
  199. package/dist/domain/memory/list-index.js.map +1 -0
  200. package/dist/domain/memory/queries.d.ts +10 -0
  201. package/dist/domain/memory/queries.d.ts.map +1 -0
  202. package/dist/domain/memory/queries.js +54 -0
  203. package/dist/domain/memory/queries.js.map +1 -0
  204. package/dist/domain/memory/steps.d.ts +13 -11
  205. package/dist/domain/memory/steps.d.ts.map +1 -1
  206. package/dist/domain/memory/steps.js +26 -57
  207. package/dist/domain/memory/steps.js.map +1 -1
  208. package/dist/domain/organization/steps.d.ts.map +1 -1
  209. package/dist/domain/organization/steps.js +1 -1
  210. package/dist/domain/organization/steps.js.map +1 -1
  211. package/dist/domain/platformclient/mint.d.ts.map +1 -1
  212. package/dist/domain/platformclient/mint.js +2 -2
  213. package/dist/domain/platformclient/mint.js.map +1 -1
  214. package/dist/domain/platformclient/verifier.d.ts.map +1 -1
  215. package/dist/domain/platformclient/verifier.js +6 -3
  216. package/dist/domain/platformclient/verifier.js.map +1 -1
  217. package/dist/domain/plugin/push.d.ts.map +1 -1
  218. package/dist/domain/plugin/push.js +1 -0
  219. package/dist/domain/plugin/push.js.map +1 -1
  220. package/dist/domain/schedule/steps.d.ts +3 -1
  221. package/dist/domain/schedule/steps.d.ts.map +1 -1
  222. package/dist/domain/schedule/steps.js +3 -1
  223. package/dist/domain/schedule/steps.js.map +1 -1
  224. package/dist/domain/skill/push.d.ts.map +1 -1
  225. package/dist/domain/skill/push.js +1 -0
  226. package/dist/domain/skill/push.js.map +1 -1
  227. package/dist/domain/workflow/registry/data/task-kind-registry.json +27 -1
  228. package/dist/domain/workflowexecution/submit-approval.d.ts +5 -2
  229. package/dist/domain/workflowexecution/submit-approval.d.ts.map +1 -1
  230. package/dist/domain/workflowexecution/submit-approval.js +1 -1
  231. package/dist/domain/workflowexecution/submit-approval.js.map +1 -1
  232. package/dist/domain/workflowexecution/submit-file-decision.d.ts +5 -2
  233. package/dist/domain/workflowexecution/submit-file-decision.d.ts.map +1 -1
  234. package/dist/domain/workflowexecution/submit-file-decision.js +1 -1
  235. package/dist/domain/workflowexecution/submit-file-decision.js.map +1 -1
  236. package/dist/domain/workflowexecution/submit-workflow-task-approval.d.ts.map +1 -1
  237. package/dist/domain/workflowexecution/submit-workflow-task-approval.js +12 -1
  238. package/dist/domain/workflowexecution/submit-workflow-task-approval.js.map +1 -1
  239. package/dist/domain/workflowinstance/controller.d.ts +6 -3
  240. package/dist/domain/workflowinstance/controller.d.ts.map +1 -1
  241. package/dist/domain/workflowinstance/controller.js +12 -7
  242. package/dist/domain/workflowinstance/controller.js.map +1 -1
  243. package/dist/domain/workflowinstance/steps.d.ts +31 -0
  244. package/dist/domain/workflowinstance/steps.d.ts.map +1 -1
  245. package/dist/domain/workflowinstance/steps.js +88 -1
  246. package/dist/domain/workflowinstance/steps.js.map +1 -1
  247. package/dist/extensions/composed-services.d.ts +56 -0
  248. package/dist/extensions/composed-services.d.ts.map +1 -0
  249. package/dist/extensions/composed-services.js +2 -0
  250. package/dist/extensions/composed-services.js.map +1 -0
  251. package/dist/extensions/drivers.d.ts +32 -1
  252. package/dist/extensions/drivers.d.ts.map +1 -1
  253. package/dist/extensions/identity.d.ts +4 -1
  254. package/dist/extensions/identity.d.ts.map +1 -1
  255. package/dist/extensions/identity.js +4 -1
  256. package/dist/extensions/identity.js.map +1 -1
  257. package/dist/extensions/registry.d.ts +37 -0
  258. package/dist/extensions/registry.d.ts.map +1 -1
  259. package/dist/extensions/registry.js +50 -0
  260. package/dist/extensions/registry.js.map +1 -1
  261. package/dist/extensions/resource-authorization.d.ts +78 -0
  262. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  263. package/dist/extensions/resource-row-reader.d.ts +43 -0
  264. package/dist/extensions/resource-row-reader.d.ts.map +1 -0
  265. package/dist/extensions/resource-row-reader.js +2 -0
  266. package/dist/extensions/resource-row-reader.js.map +1 -0
  267. package/dist/extensions/visitor-classifier.d.ts +41 -0
  268. package/dist/extensions/visitor-classifier.d.ts.map +1 -0
  269. package/dist/extensions/visitor-classifier.js +2 -0
  270. package/dist/extensions/visitor-classifier.js.map +1 -0
  271. package/dist/identity/oidc-userinfo.d.ts +6 -1
  272. package/dist/identity/oidc-userinfo.d.ts.map +1 -1
  273. package/dist/identity/oidc-userinfo.js.map +1 -1
  274. package/dist/identity/oidc-verifier.d.ts.map +1 -1
  275. package/dist/identity/oidc-verifier.js +37 -8
  276. package/dist/identity/oidc-verifier.js.map +1 -1
  277. package/dist/index.d.ts +14 -6
  278. package/dist/index.d.ts.map +1 -1
  279. package/dist/index.js +25 -9
  280. package/dist/index.js.map +1 -1
  281. package/dist/pipeline/errors.d.ts +8 -0
  282. package/dist/pipeline/errors.d.ts.map +1 -1
  283. package/dist/pipeline/errors.js +25 -16
  284. package/dist/pipeline/errors.js.map +1 -1
  285. package/dist/pipeline/interceptors/auth.d.ts +17 -9
  286. package/dist/pipeline/interceptors/auth.d.ts.map +1 -1
  287. package/dist/pipeline/interceptors/auth.js +17 -9
  288. package/dist/pipeline/interceptors/auth.js.map +1 -1
  289. package/dist/pipeline/steps/authorization-tuples.d.ts +23 -1
  290. package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
  291. package/dist/pipeline/steps/authorization-tuples.js +42 -0
  292. package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
  293. package/dist/pipeline/steps/authorize.d.ts +6 -5
  294. package/dist/pipeline/steps/authorize.d.ts.map +1 -1
  295. package/dist/pipeline/steps/authorize.js +6 -5
  296. package/dist/pipeline/steps/authorize.js.map +1 -1
  297. package/dist/pipeline/steps/defaults.d.ts +12 -0
  298. package/dist/pipeline/steps/defaults.d.ts.map +1 -1
  299. package/dist/pipeline/steps/defaults.js +42 -7
  300. package/dist/pipeline/steps/defaults.js.map +1 -1
  301. package/dist/pipeline/steps/guard-memory-capture.d.ts +13 -15
  302. package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
  303. package/dist/pipeline/steps/guard-memory-capture.js +2 -3
  304. package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
  305. package/dist/runnerauth/built-in-runner-credential-provider.d.ts +0 -2
  306. package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -1
  307. package/dist/runnerauth/built-in-runner-credential-provider.js +8 -17
  308. package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -1
  309. package/dist/runnerauth/runner-credential-provider.d.ts +17 -7
  310. package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
  311. package/dist/runnerauth/runner-credential-provider.js.map +1 -1
  312. package/dist/sandbox/docker.d.ts.map +1 -1
  313. package/dist/sandbox/docker.js +3 -0
  314. package/dist/sandbox/docker.js.map +1 -1
  315. package/dist/sandbox/kubernetes.d.ts.map +1 -1
  316. package/dist/sandbox/kubernetes.js +3 -0
  317. package/dist/sandbox/kubernetes.js.map +1 -1
  318. package/dist/sandbox/local-process.d.ts.map +1 -1
  319. package/dist/sandbox/local-process.js +4 -0
  320. package/dist/sandbox/local-process.js.map +1 -1
  321. package/dist/sandbox/provisioner.d.ts +18 -6
  322. package/dist/sandbox/provisioner.d.ts.map +1 -1
  323. package/dist/sandbox/provisioner.js.map +1 -1
  324. package/dist/temporal/manager.d.ts +5 -0
  325. package/dist/temporal/manager.d.ts.map +1 -1
  326. package/dist/temporal/manager.js +9 -0
  327. package/dist/temporal/manager.js.map +1 -1
  328. package/dist/temporal/mcpserver/engine-client.d.ts +2 -2
  329. package/dist/temporal/mcpserver/engine-client.d.ts.map +1 -1
  330. package/dist/temporal/mcpserver/engine-client.js +6 -4
  331. package/dist/temporal/mcpserver/engine-client.js.map +1 -1
  332. package/dist/temporal/mcpserver/names.d.ts +13 -2
  333. package/dist/temporal/mcpserver/names.d.ts.map +1 -1
  334. package/dist/temporal/mcpserver/names.js +15 -2
  335. package/dist/temporal/mcpserver/names.js.map +1 -1
  336. package/dist/temporal/sdk-logger.d.ts +74 -0
  337. package/dist/temporal/sdk-logger.d.ts.map +1 -0
  338. package/dist/temporal/sdk-logger.js +143 -0
  339. package/dist/temporal/sdk-logger.js.map +1 -0
  340. package/package.json +6 -6
  341. package/src/authorization/README.md +18 -6
  342. package/src/authorization/__tests__/authorizer.test.ts +5 -1
  343. package/src/authorization/__tests__/derived-tuples.test.ts +26 -0
  344. package/src/authorization/__tests__/evaluator.test.ts +4 -0
  345. package/src/authorization/__tests__/list-read-scope.test.ts +11 -5
  346. package/src/authorization/__tests__/store-tests.test.ts +3 -1
  347. package/src/authorization/__tests__/trusted-local-authorizer.test.ts +155 -0
  348. package/src/authorization/__tests__/unit-owned-kinds.test.ts +420 -0
  349. package/src/authorization/__tests__/wire-permissions.test.ts +31 -2
  350. package/src/authorization/authorizer.ts +21 -10
  351. package/src/authorization/derived-tuples.ts +92 -18
  352. package/src/authorization/evaluator.ts +30 -15
  353. package/src/authorization/list-read-scope.ts +4 -0
  354. package/src/authorization/model/__tests__/registry.test.ts +23 -0
  355. package/src/authorization/model/data/authorization-model.json +830 -67
  356. package/src/authorization/model/execution-viewer.ts +32 -27
  357. package/src/authorization/model/index.ts +4 -1
  358. package/src/authorization/model/rewrite.ts +5 -3
  359. package/src/authorization/organization-directory.ts +4 -0
  360. package/src/authorization/person.ts +32 -1
  361. package/src/authorization/policy-check.ts +105 -0
  362. package/src/authorization/posture.ts +45 -4
  363. package/src/authorization/resource-creators.ts +48 -0
  364. package/src/authorization/trusted-local-authorizer.ts +91 -0
  365. package/src/authorization/tuples.ts +17 -0
  366. package/src/boot/__tests__/compose.test.ts +120 -4
  367. package/src/boot/__tests__/list-indexes.test.ts +4 -0
  368. package/src/boot/__tests__/oauth-redirect-uri.test.ts +121 -10
  369. package/src/boot/__tests__/skill-transfer-origin.test.ts +96 -25
  370. package/src/boot/compose.ts +154 -61
  371. package/src/boot/config.ts +28 -12
  372. package/src/boot/inprocess.ts +18 -4
  373. package/src/boot/list-indexes.ts +6 -1
  374. package/src/boot/logger.ts +3 -1
  375. package/src/boot/oauth-redirect-uri.ts +62 -17
  376. package/src/boot/skill-transfer-origin.ts +71 -16
  377. package/src/domain/agent/__tests__/agent.test.ts +42 -1
  378. package/src/domain/agentchannel/__tests__/agentchannel.test.ts +9 -0
  379. package/src/domain/agentchannel/__tests__/channel-runtime.test.ts +2 -0
  380. package/src/domain/agentchannel/__tests__/create-authorization.test.ts +7 -6
  381. package/src/domain/agentchannel/steps.ts +9 -7
  382. package/src/domain/agentexecution/__tests__/agentexecution.test.ts +148 -56
  383. package/src/domain/agentexecution/__tests__/create-steps.test.ts +175 -12
  384. package/src/domain/agentexecution/__tests__/file-review-seed.ts +91 -0
  385. package/src/domain/agentexecution/controller.ts +8 -0
  386. package/src/domain/agentexecution/create-steps.ts +74 -44
  387. package/src/domain/agentexecution/submit-approval.ts +9 -6
  388. package/src/domain/agentexecution/submit-file-decision.ts +5 -4
  389. package/src/domain/agentinstance/__tests__/agentinstance.test.ts +2 -0
  390. package/src/domain/agentshare/__tests__/agentshare.test.ts +17 -0
  391. package/src/domain/agentshare/__tests__/create-authorization.test.ts +5 -4
  392. package/src/domain/agentshare/steps.ts +6 -4
  393. package/src/domain/apikey/__tests__/verifier.test.ts +73 -1
  394. package/src/domain/apikey/verifier.ts +45 -1
  395. package/src/domain/artifact/__tests__/artifact.test.ts +13 -24
  396. package/src/domain/channelapp/__tests__/channelapp.test.ts +7 -0
  397. package/src/domain/channelapp/controller.ts +35 -12
  398. package/src/domain/environment/__tests__/environment.test.ts +13 -0
  399. package/src/domain/executioncontext/__tests__/executioncontext.test.ts +2 -0
  400. package/src/domain/executioncontext/steps.ts +2 -1
  401. package/src/domain/iampolicy/__tests__/access-lists.test.ts +79 -0
  402. package/src/domain/iampolicy/__tests__/change.test.ts +63 -0
  403. package/src/domain/iampolicy/__tests__/controller.test.ts +39 -3
  404. package/src/domain/iampolicy/__tests__/grant-path.test.ts +595 -27
  405. package/src/domain/iampolicy/__tests__/iampolicy.test.ts +33 -2
  406. package/src/domain/iampolicy/__tests__/membership.test.ts +47 -5
  407. package/src/domain/iampolicy/__tests__/resource-store.test.ts +1 -0
  408. package/src/domain/iampolicy/__tests__/role-lifecycle.test.ts +41 -8
  409. package/src/domain/iampolicy/__tests__/roles.test.ts +3 -2
  410. package/src/domain/iampolicy/__tests__/steps.test.ts +75 -6
  411. package/src/domain/iampolicy/__tests__/support.ts +68 -4
  412. package/src/domain/iampolicy/access-lists.ts +70 -2
  413. package/src/domain/iampolicy/change.ts +109 -0
  414. package/src/domain/iampolicy/constants.ts +8 -0
  415. package/src/domain/iampolicy/controller.ts +17 -3
  416. package/src/domain/iampolicy/grant-path.ts +349 -31
  417. package/src/domain/iampolicy/membership.ts +32 -12
  418. package/src/domain/iampolicy/resource-store.ts +4 -0
  419. package/src/domain/iampolicy/role-lifecycle.ts +2 -0
  420. package/src/domain/iampolicy/roles.ts +8 -0
  421. package/src/domain/iampolicy/steps.ts +15 -5
  422. package/src/domain/iampolicy/store-contract.ts +37 -1
  423. package/src/domain/iampolicy/store.ts +19 -5
  424. package/src/domain/identityaccount/__tests__/resolve.test.ts +246 -2
  425. package/src/domain/identityaccount/__tests__/resource-store.test.ts +1 -1
  426. package/src/domain/identityaccount/constants.ts +20 -0
  427. package/src/domain/identityaccount/controller.ts +20 -5
  428. package/src/domain/identityaccount/resolve.ts +80 -1
  429. package/src/domain/identityaccount/resource-store.ts +14 -1
  430. package/src/domain/identityaccount/steps.ts +4 -3
  431. package/src/domain/identityaccount/store-contract.ts +4 -4
  432. package/src/domain/identityaccount/store.ts +6 -1
  433. package/src/domain/mcpserver/__tests__/connect-authorization.test.ts +1 -0
  434. package/src/domain/mcpserver/__tests__/connect.test.ts +358 -15
  435. package/src/domain/mcpserver/__tests__/mcpserver.test.ts +2 -0
  436. package/src/domain/mcpserver/__tests__/oauth-handshake.test.ts +2 -0
  437. package/src/domain/mcpserver/__tests__/store-faults.test.ts +2 -0
  438. package/src/domain/mcpserver/connect-sandbox.ts +135 -0
  439. package/src/domain/mcpserver/connect.ts +226 -56
  440. package/src/domain/mcpserver/controller.ts +8 -2
  441. package/src/domain/mcpserver/engine.ts +24 -6
  442. package/src/domain/mcpserver/start-connect.ts +49 -10
  443. package/src/domain/memory/__tests__/memory.test.ts +92 -22
  444. package/src/domain/memory/__tests__/queries.test.ts +173 -0
  445. package/src/domain/memory/controller.ts +2 -1
  446. package/src/domain/memory/list-index.ts +32 -0
  447. package/src/domain/memory/queries.ts +72 -0
  448. package/src/domain/memory/steps.ts +26 -63
  449. package/src/domain/oauthapp/__tests__/oauthapp.test.ts +14 -0
  450. package/src/domain/organization/__tests__/support.ts +41 -0
  451. package/src/domain/organization/steps.ts +1 -0
  452. package/src/domain/platformclient/mint.ts +6 -2
  453. package/src/domain/platformclient/verifier.ts +6 -3
  454. package/src/domain/plugin/__tests__/plugin.test.ts +11 -24
  455. package/src/domain/plugin/push.ts +1 -0
  456. package/src/domain/schedule/__tests__/schedule.composed.test.ts +2 -0
  457. package/src/domain/schedule/steps.ts +3 -1
  458. package/src/domain/session/__tests__/session.test.ts +2 -0
  459. package/src/domain/skill/__tests__/skill.test.ts +7 -25
  460. package/src/domain/skill/push.ts +1 -0
  461. package/src/domain/workflow/__tests__/workflow.test.ts +2 -0
  462. package/src/domain/workflow/registry/data/task-kind-registry.json +27 -1
  463. package/src/domain/workflowexecution/__tests__/forward-attribution-composed.test.ts +270 -0
  464. package/src/domain/workflowexecution/__tests__/submit-workflow-task-approval.test.ts +196 -0
  465. package/src/domain/workflowexecution/__tests__/workflowexecution.test.ts +3 -57
  466. package/src/domain/workflowexecution/submit-approval.ts +9 -2
  467. package/src/domain/workflowexecution/submit-file-decision.ts +6 -1
  468. package/src/domain/workflowexecution/submit-workflow-task-approval.ts +23 -5
  469. package/src/domain/workflowinstance/controller.ts +27 -9
  470. package/src/domain/workflowinstance/steps.ts +123 -1
  471. package/src/extensions/__tests__/apikey-before-sign-in-composed.test.ts +172 -0
  472. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +80 -1
  473. package/src/extensions/__tests__/composed-services-composed.test.ts +236 -0
  474. package/src/extensions/__tests__/extension-composition.test.ts +229 -16
  475. package/src/extensions/__tests__/identity-account-composed.test.ts +84 -4
  476. package/src/extensions/__tests__/list-read-scope-composed.test.ts +41 -1
  477. package/src/extensions/__tests__/registry.test.ts +147 -1
  478. package/src/extensions/__tests__/secret-cleanup-composed.test.ts +2 -0
  479. package/src/extensions/__tests__/visitor-classifier-points.test.ts +42 -0
  480. package/src/extensions/composed-services.ts +61 -0
  481. package/src/extensions/drivers.ts +33 -1
  482. package/src/extensions/identity.ts +4 -1
  483. package/src/extensions/registry.ts +105 -0
  484. package/src/extensions/resource-authorization.ts +87 -0
  485. package/src/extensions/resource-row-reader.ts +43 -0
  486. package/src/extensions/visitor-classifier.ts +41 -0
  487. package/src/identity/__tests__/oidc-verifier.test.ts +38 -12
  488. package/src/identity/oidc-userinfo.ts +6 -1
  489. package/src/identity/oidc-verifier.ts +42 -8
  490. package/src/index.ts +61 -6
  491. package/src/pipeline/__tests__/steps.test.ts +31 -4
  492. package/src/pipeline/errors.ts +30 -16
  493. package/src/pipeline/interceptors/auth.ts +17 -9
  494. package/src/pipeline/steps/__tests__/authorization-tuples.test.ts +20 -0
  495. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +72 -15
  496. package/src/pipeline/steps/authorization-tuples.ts +54 -0
  497. package/src/pipeline/steps/authorize.ts +6 -5
  498. package/src/pipeline/steps/defaults.ts +52 -7
  499. package/src/pipeline/steps/guard-memory-capture.ts +15 -20
  500. package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +1 -1
  501. package/src/runnerauth/__tests__/runner-subject-composed.test.ts +13 -0
  502. package/src/runnerauth/bound-execution.ts +2 -2
  503. package/src/runnerauth/built-in-runner-credential-provider.ts +8 -21
  504. package/src/runnerauth/runner-credential-provider.ts +17 -7
  505. package/src/sandbox/__tests__/docker.integration.test.ts +4 -0
  506. package/src/sandbox/__tests__/kubernetes.test.ts +18 -1
  507. package/src/sandbox/__tests__/local-process.integration.test.ts +4 -0
  508. package/src/sandbox/__tests__/provisioner.test.ts +1 -0
  509. package/src/sandbox/docker.ts +3 -0
  510. package/src/sandbox/kubernetes.ts +3 -0
  511. package/src/sandbox/local-process.ts +4 -0
  512. package/src/sandbox/provisioner.ts +18 -6
  513. package/src/store/postgres/__tests__/support.ts +11 -2
  514. package/src/temporal/README.md +1 -0
  515. package/src/temporal/__tests__/manager.test.ts +56 -4
  516. package/src/temporal/__tests__/sdk-log-workflows.ts +26 -0
  517. package/src/temporal/__tests__/sdk-logger.e2e.test.ts +150 -0
  518. package/src/temporal/__tests__/sdk-logger.test.ts +238 -0
  519. package/src/temporal/manager.ts +9 -0
  520. package/src/temporal/mcpserver/engine-client.ts +8 -3
  521. package/src/temporal/mcpserver/names.ts +16 -2
  522. package/src/temporal/sdk-logger.ts +173 -0
  523. package/dist/authorization/lane-admission.d.ts +0 -50
  524. package/dist/authorization/lane-admission.d.ts.map +0 -1
  525. package/dist/authorization/lane-admission.js +0 -13
  526. package/dist/authorization/lane-admission.js.map +0 -1
  527. package/src/authorization/__tests__/lane-admission.test.ts +0 -115
  528. package/src/authorization/lane-admission.ts +0 -73
package/src/index.ts CHANGED
@@ -66,8 +66,13 @@ export type {
66
66
  ExtensionServiceRegistration,
67
67
  ResolvedExtensions,
68
68
  ResolvedServiceRegistration,
69
+ ResolvedUnitHook,
69
70
  ServerExtension,
70
71
  } from "./extensions/registry.js";
72
+ // What the composition hands a unit (ServerExtension.onComposed): its one
73
+ // Authorizer, list read scope, policy check, tuple lifecycle and
74
+ // in-process transport, whichever posture built them.
75
+ export type { ComposedServices } from "./extensions/composed-services.js";
71
76
  export type {
72
77
  CallerClass,
73
78
  CallerIdentity,
@@ -107,6 +112,9 @@ export type { ResolvedExtensionDrivers } from "./extensions/registry.js";
107
112
  // tests pin against.
108
113
  export type {
109
114
  DefaultInstanceLinkedEvent,
115
+ ExecutionAudienceShape,
116
+ ExecutionVisibilityChangedEvent,
117
+ OrganizationAffiliationEvent,
110
118
  PolicyGrantedEvent,
111
119
  PolicyRevokedEvent,
112
120
  ResourceAuthorizationLifecycle,
@@ -156,6 +164,16 @@ export type {
156
164
  IdentityAccountStoreContractFixture,
157
165
  } from "./domain/identityaccount/store-contract.js";
158
166
  export { identityAccountStoreContract } from "./domain/identityaccount/store-contract.js";
167
+ // The runner every kit is built on, for a composition whose own ports need
168
+ // kits of the same shape: a fresh fixture per case, the body over it, the
169
+ // cleanup after, and a failing body reported over a failing cleanup.
170
+ export type {
171
+ PortContractBody,
172
+ PortContractCase,
173
+ PortContractDeclaration,
174
+ PortContractFixture,
175
+ } from "./store/port-contract.js";
176
+ export { portContractCases } from "./store/port-contract.js";
159
177
  // The 20260913.01 IamPolicy seams (Q-OR-1, Q-OR-10): the store PORT a
160
178
  // composition drives the domain's grant path through (drivers.iamPolicyStore;
161
179
  // a driver throws DuplicatePolicyError for a held id) and its vitest-free
@@ -167,6 +185,14 @@ export { identityAccountStoreContract } from "./domain/identityaccount/store-con
167
185
  // composition reaches it as in-process RPCs, the doctrine.
168
186
  export type { IamPolicyStore } from "./domain/iampolicy/store.js";
169
187
  export { DuplicatePolicyError } from "./domain/iampolicy/store.js";
188
+ // What the grant path hands the store beside every access row it writes or
189
+ // deletes (who, through which door, in which organization), so an edition
190
+ // that keeps a permission history writes it atomically with the row.
191
+ export type {
192
+ PolicyActor,
193
+ PolicyChangeCause,
194
+ PolicyChangeRecord,
195
+ } from "./domain/iampolicy/change.js";
170
196
  export type {
171
197
  IamPolicyStoreContractCase,
172
198
  IamPolicyStoreContractFixture,
@@ -182,9 +208,16 @@ export type { AuthorizationQueryEngine } from "./extensions/authorization-querie
182
208
  // How an access list names a grantee that is not a person
183
209
  // (drivers.principalDisplay): a team, in the editions that serve teams.
184
210
  export type { PrincipalDisplay } from "./extensions/principal-display.js";
211
+ // Where the built-in authorizer reads the rows of a kind a unit keeps in a
212
+ // store of its own (drivers.resourceRowReaders).
213
+ export type { ResourceRowReader } from "./extensions/resource-row-reader.js";
185
214
  export type { IdentityFederation } from "./extensions/identity-federation.js";
186
215
  export type { AccountsBySubject } from "./domain/identityaccount/resolve.js";
187
216
  export { identityIdForSubject } from "./domain/identityaccount/resolve.js";
217
+ // The derived id of the account under a subject. An edition's own per-org
218
+ // system accounts take the id of their own subject, so the primary key holds
219
+ // one row per subject there as it does for every account the library mints.
220
+ export { accountIdFor } from "./domain/identityaccount/constants.js";
188
221
  // The PlatformClient seams: the store PORT a composition drives the domain
189
222
  // through (drivers.platformClientStore; a driver throws
190
223
  // DuplicatePlatformClientError for a held id, slug or client_id) and its
@@ -276,6 +309,10 @@ export { ScheduleFireCallerRefusedError } from "./extensions/schedule-fire-calle
276
309
  // through the REAL boundary mechanism, never a re-derivation.
277
310
  export type { VisitorErrorPolicy } from "./pipeline/interceptors/error-boundary.js";
278
311
  export { createErrorBoundaryInterceptor } from "./pipeline/interceptors/error-boundary.js";
312
+ // Which callers are visitors (drivers.visitorClassifier): admitted to the
313
+ // organization's agents without belonging to it, so their runs never carry
314
+ // the organization's standing context (stigmer/stigmer#1401).
315
+ export type { VisitorClassifier } from "./extensions/visitor-classifier.js";
279
316
  // The tuple lifecycle's resolution, for a kind a composition serves outside
280
317
  // the generic chains (a cloud-served create): `resolveResourceCreatedEvent`
281
318
  // derives the creation event from the kind's `kind_meta` exactly as the
@@ -283,6 +320,7 @@ export { createErrorBoundaryInterceptor } from "./pipeline/interceptors/error-bo
283
320
  // whichever chain created the row.
284
321
  export {
285
322
  diffVisibilityShapes,
323
+ executionAudienceShapes,
286
324
  resolveResourceCreatedEvent,
287
325
  visibilityShapesFor,
288
326
  } from "./pipeline/steps/authorization-tuples.js";
@@ -299,6 +337,7 @@ export {
299
337
  internalError,
300
338
  invalidArgumentError,
301
339
  notFoundError,
340
+ unauthenticatedWithReasonError,
302
341
  unavailableError,
303
342
  } from "./pipeline/errors.js";
304
343
  export type { RefusalReason } from "./pipeline/errors.js";
@@ -311,9 +350,14 @@ export { generateSlug } from "./pipeline/steps/slug.js";
311
350
  // composing requests through the in-process transport AS a caller rides
312
351
  // the same header the OSS asCaller adapters use. (callerIdentityOf and
313
352
  // callerIdentityKey ride the request-idiom export block below.)
353
+ // serverActingFor is the one construction of "the server acting for" a
354
+ // principal: an extension that writes on a person's behalf (an invitation,
355
+ // a deleted team's cleanup) sends it so the write names that person while
356
+ // the server's own admission rules apply.
314
357
  export {
315
358
  encodeInProcessCaller,
316
359
  IN_PROCESS_CALLER_HEADER,
360
+ serverActingFor,
317
361
  } from "./pipeline/interceptors/auth.js";
318
362
 
319
363
  // The request idiom for extension-REGISTERED services (C4 Stage 4): a
@@ -352,10 +396,10 @@ export {
352
396
  } from "./pipeline/interceptors/auth.js";
353
397
  export { newPipeline } from "./pipeline/pipeline.js";
354
398
  export { newAuthorizeStep } from "./pipeline/steps/authorize.js";
355
- // The run gate's check set (P1 sp.run-gate): an edition's Authorizer keys
356
- // its lane admission on this predicate — the runtime lanes it mints (a
357
- // guest share, a channel, a schedule fire, a workflow sandbox) were
358
- // admitted upstream by their own gate steps and are not re-asked here.
399
+ // The run gate's check set: an edition's Authorizer keys its lane
400
+ // admission on this predicate — the runtime lanes it mints (a guest
401
+ // share, a channel, a schedule fire) were admitted upstream by their own
402
+ // gate steps and are not re-asked here.
359
403
  // OSS defines the gate, so OSS defines which checks are the gate; a
360
404
  // composition never re-derives the set.
361
405
  export { isRunGateCheck } from "./pipeline/steps/authorize-run-target.js";
@@ -370,8 +414,15 @@ export { newValidateProtoStep } from "./pipeline/steps/validation.js";
370
414
  // constructor argument) for BuildNewState to pick the id prefix.
371
415
  // CheckDuplicate is deliberately not here: it reads this server's Store,
372
416
  // and a composition's own table answers that question in a step of the
373
- // same name over its own repo.
374
- export { newBuildNewStateStep } from "./pipeline/steps/defaults.js";
417
+ // same name over its own repo. BuildNewState replaces any id a request
418
+ // carries (stigmer/stigmer#1266); a composition step that derives a
419
+ // create's id before it runs claims that id with assignServerId, the one
420
+ // way an id survives the step.
421
+ export {
422
+ assignServerId,
423
+ newBuildNewStateStep,
424
+ SERVER_ASSIGNED_ID_KEY,
425
+ } from "./pipeline/steps/defaults.js";
375
426
  export { newResolveSlugStep } from "./pipeline/steps/slug.js";
376
427
  // The update and reference-read steps for the same kinds, on the same
377
428
  // terms. An update runs BuildUpdateState after the composition's own
@@ -409,6 +460,10 @@ export type {
409
460
  OrganizationSlugStore,
410
461
  } from "./store/interface.js";
411
462
  export { ORGANIZATION_SLUG_RESERVED } from "./domain/organization/slug-ledger.js";
463
+ // The API-key verifier's refusal of a key created before sign-in was
464
+ // turned on (stigmer/stigmer#1169): a client branches on the reason, not
465
+ // the copy.
466
+ export { API_KEY_CREATED_BEFORE_SIGN_IN } from "./domain/apikey/verifier.js";
412
467
  // The list index's read shapes, which `Store.queryResources` speaks
413
468
  // (store/list-index.ts). Declaring an index stays internal: the list is
414
469
  // the composition root's (boot/list-indexes.ts), one per server.
@@ -2,7 +2,8 @@
2
2
  * Pins the shared steps against their Go references (steps/*_test.go,
3
3
  * translated): slug generation (cloud-Java-identical, no truncation),
4
4
  * duplicate checking with the byte-pinned AlreadyExists copy, create/update
5
- * state building (status clearing, ULID minting, audit slots #540,
5
+ * state building (status clearing, ULID minting that replaces any id the
6
+ * request carried unless an earlier step claimed it #1266, audit slots #540,
6
7
  * visibility default + oss#573 immutability), the loaders' error copy, the
7
8
  * best-effort search indexing, visibility validation with cloud-identical
8
9
  * copy, reference normalization/validation, operator identity (#400), and
@@ -31,8 +32,10 @@ import type { SearchIndexEntry } from "../../store/interface.js";
31
32
  import { SqliteStore } from "../../store/sqlite/store.js";
32
33
  import { RequestContext } from "../request-context.js";
33
34
  import {
35
+ assignServerId,
34
36
  newBuildNewStateStep,
35
37
  generateId,
38
+ SERVER_ASSIGNED_ID_KEY,
36
39
  setOperatorIdentity,
37
40
  resetOperatorIdentityForTests,
38
41
  auditActorFor,
@@ -213,15 +216,39 @@ describe("BuildNewState", () => {
213
216
  );
214
217
  });
215
218
 
216
- it("keeps a client-provided id and explicit visibility (idempotent)", async () => {
217
- const ctx = orgCtx(org({ id: "acme" }));
219
+ it("replaces a client-provided id and keeps an explicit visibility", async () => {
220
+ const ctx = orgCtx(org({ id: "org_chosen" }));
218
221
  ctx.newState.metadata!.visibility = ApiResourceVisibility.visibility_org;
219
222
  await newBuildNewStateStep<typeof OrganizationSchema>().execute(ctx);
220
- expect(ctx.newState.metadata?.id).toBe("acme");
223
+ expect(ctx.newState.metadata?.id).toMatch(/^org_[0-9a-hjkmnp-tv-z]{26}$/);
224
+ expect(ctx.newState.metadata?.id).not.toBe("org_chosen");
221
225
  expect(ctx.newState.metadata?.visibility).toBe(
222
226
  ApiResourceVisibility.visibility_org,
223
227
  );
224
228
  });
229
+
230
+ it("keeps an id an earlier step claimed through assignServerId", async () => {
231
+ const ctx = orgCtx(org({ id: "org_chosen" }));
232
+ assignServerId(ctx, "org_derived");
233
+ await newBuildNewStateStep<typeof OrganizationSchema>().execute(ctx);
234
+ expect(ctx.newState.metadata?.id).toBe("org_derived");
235
+ expect(ctx.get(SERVER_ASSIGNED_ID_KEY)).toBe("org_derived");
236
+ });
237
+
238
+ it("re-mints a claimed id a later step rewrote: a claim names one value", async () => {
239
+ const ctx = orgCtx(org());
240
+ assignServerId(ctx, "org_derived");
241
+ ctx.newState.metadata!.id = "org_rewritten";
242
+ await newBuildNewStateStep<typeof OrganizationSchema>().execute(ctx);
243
+ expect(ctx.newState.metadata?.id).toMatch(/^org_[0-9a-hjkmnp-tv-z]{26}$/);
244
+ });
245
+
246
+ it("mints for an empty id even when the claim recorded an empty one", async () => {
247
+ const ctx = orgCtx(org());
248
+ assignServerId(ctx, "");
249
+ await newBuildNewStateStep<typeof OrganizationSchema>().execute(ctx);
250
+ expect(ctx.newState.metadata?.id).toMatch(/^org_[0-9a-hjkmnp-tv-z]{26}$/);
251
+ });
225
252
  });
226
253
 
227
254
  describe("generateId", () => {
@@ -65,14 +65,7 @@ export function alreadyExistsWithReasonError(
65
65
  reason: RefusalReason,
66
66
  ): ConnectError {
67
67
  return new ConnectError(message, Code.AlreadyExists, undefined, [
68
- {
69
- desc: ErrorInfoSchema,
70
- value: create(ErrorInfoSchema, {
71
- reason: reason.reason,
72
- domain: ERROR_REASON_DOMAIN,
73
- metadata: { ...reason.metadata },
74
- }),
75
- },
68
+ reasonDetail(reason),
76
69
  ]);
77
70
  }
78
71
 
@@ -89,17 +82,38 @@ export function failedPreconditionError(
89
82
  return new ConnectError(message, Code.FailedPrecondition);
90
83
  }
91
84
  return new ConnectError(message, Code.FailedPrecondition, undefined, [
92
- {
93
- desc: ErrorInfoSchema,
94
- value: create(ErrorInfoSchema, {
95
- reason: reason.reason,
96
- domain: ERROR_REASON_DOMAIN,
97
- metadata: { ...reason.metadata },
98
- }),
99
- },
85
+ reasonDetail(reason),
100
86
  ]);
101
87
  }
102
88
 
89
+ /**
90
+ * An Unauthenticated refusal a client acts on without parsing text: a
91
+ * credential that was recognised but authenticates nobody, for a reason
92
+ * the caller can fix (stigmer/stigmer#1169, a key created before sign-in
93
+ * was turned on). The code stays Unauthenticated, so a client that keys on
94
+ * the code alone still treats it as a sign-in problem.
95
+ */
96
+ export function unauthenticatedWithReasonError(
97
+ message: string,
98
+ reason: RefusalReason,
99
+ ): ConnectError {
100
+ return new ConnectError(message, Code.Unauthenticated, undefined, [
101
+ reasonDetail(reason),
102
+ ]);
103
+ }
104
+
105
+ /** The ErrorInfo detail every reasoned refusal carries beside its message. */
106
+ function reasonDetail(reason: RefusalReason) {
107
+ return {
108
+ desc: ErrorInfoSchema,
109
+ value: create(ErrorInfoSchema, {
110
+ reason: reason.reason,
111
+ domain: ERROR_REASON_DOMAIN,
112
+ metadata: { ...reason.metadata },
113
+ }),
114
+ };
115
+ }
116
+
103
117
  /** Go AbortedError — retryable conflict (e.g. an in-flight dedupe claim). */
104
118
  export function abortedError(message: string): ConnectError {
105
119
  return new ConnectError(message, Code.Aborted);
@@ -219,15 +219,23 @@ export function trustedLocalIdentityFor(operator: {
219
219
  /**
220
220
  * The server acting for a principal it has authenticated some other way —
221
221
  * the one construction of an `internal` caller outside the in-process
222
- * transport's own stamp. Its consumer is the PlatformClient mint
223
- * (domain/platformclient/mint.ts): the request is public and tokenless
224
- * (so the chain stamped the trusted-local operator), the client proved
225
- * itself with its secret, and the end-user account and role the mint
226
- * creates must name the CLIENT as their actor, never the operator.
227
- * `internal` because the server is the one acting — the create path's
228
- * Authorize skips it, as for every server-composed request — and never
229
- * reachable from the wire: no verifier produces it, and the serving
230
- * chassis overwrites position 1 on every request.
222
+ * transport's own stamp. Two consumers:
223
+ *
224
+ * - The PlatformClient mint (domain/platformclient/mint.ts): the
225
+ * request is public and tokenless (so the chain stamped the
226
+ * trusted-local operator), the client proved itself with its secret,
227
+ * and the end-user account and role the mint creates must name the
228
+ * CLIENT as their actor, never the operator.
229
+ * - The workflow HITL forwarding edges (boot/inprocess.ts): the
230
+ * workflow chain authorized the person deciding, and the child
231
+ * agent execution records them as its decider or reviewer
232
+ * (stigmer/stigmer#1385) without authorizing them a second time
233
+ * against a session they need not own.
234
+ *
235
+ * `internal` because the server is the one acting — Authorize skips it,
236
+ * as for every server-composed request — and never reachable from the
237
+ * wire: no verifier produces it, and the serving chassis overwrites
238
+ * position 1 on every request.
231
239
  */
232
240
  export function serverActingFor(principalId: string): CallerIdentity {
233
241
  if (principalId === "") {
@@ -2,6 +2,7 @@
2
2
  * Pins the edition-neutral half of the C2 tuple-lifecycle seam
3
3
  * (20260827.10, ruling Q2): the visibility shape policy and its set-diff
4
4
  * (re-pinning the Java VisibilityTupleReconcilerTest transition matrix),
5
+ * the run-audience policy of a workflow instance's execution visibility,
5
6
  * and the config-driven creation-event resolution
6
7
  * (CreateAuthorizationTuplesStepV2's scope/owner/parent semantics,
7
8
  * including every failure arm). The driver-facing behavior of the steps
@@ -16,6 +17,7 @@ import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentex
16
17
  import { AgentInstanceSchema } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/api_pb";
17
18
  import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
18
19
  import { MemorySchema } from "@stigmer/protos/ai/stigmer/agentic/memory/v1/api_pb";
20
+ import { WorkflowExecutionVisibility } from "@stigmer/protos/ai/stigmer/agentic/workflowinstance/v1/spec_pb";
19
21
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
20
22
  import { OwnerAttributionType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
21
23
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
@@ -25,6 +27,7 @@ import { createLogger } from "../../../boot/logger.js";
25
27
  import type { CallerIdentity } from "../../../extensions/identity.js";
26
28
  import {
27
29
  diffVisibilityShapes,
30
+ executionAudienceShapes,
28
31
  resolveResourceCreatedEvent,
29
32
  visibilityShapesFor,
30
33
  } from "../authorization-tuples.js";
@@ -85,6 +88,23 @@ describe("visibilityShapesFor (the reconciler's level→shape policy)", () => {
85
88
  });
86
89
  });
87
90
 
91
+ describe("executionAudienceShapes (a workflow instance's run audience)", () => {
92
+ it("ORGANIZATION names the organization's viewers", () => {
93
+ expect([
94
+ ...executionAudienceShapes(WorkflowExecutionVisibility.organization),
95
+ ]).toEqual(["org-viewer"]);
96
+ });
97
+
98
+ it("PRIVATE and the unset level name nobody, so each run stays its triggerer's", () => {
99
+ expect([
100
+ ...executionAudienceShapes(WorkflowExecutionVisibility.private),
101
+ ]).toEqual([]);
102
+ expect([
103
+ ...executionAudienceShapes(WorkflowExecutionVisibility.unspecified),
104
+ ]).toEqual([]);
105
+ });
106
+ });
107
+
88
108
  describe("diffVisibilityShapes (the reconciler's transition matrix, re-pinned)", () => {
89
109
  const agent = ApiResourceKind.agent;
90
110
 
@@ -3,14 +3,16 @@
3
3
  * stigmer-cloud#564): the authorizeMemoryCapture capability's three
4
4
  * verdicts (admit stashes the proved claims, refuse answers the
5
5
  * byte-pinned PERMISSION_DENIED copy, no-opinion falls through to the
6
- * gate's own machine/platform_client_id logic), the capture org handed to
7
- * the capability, the org-mismatch throw propagating untouched, and the
8
- * absent-capability posture staying byte-identical to the pre-seam gate
9
- * (trusted-local and OIDC callers admit; machine and
10
- * platform_client_id-carrying callers refuse). The claim counts only on a
11
- * platform token (stigmer#1312): the refusing cases carry tokens signed by
12
- * the envelope every Stigmer lane mints through, and another issuer's
13
- * token carrying the same claim is admitted.
6
+ * first-party allow-list), the capture org handed to the capability, the
7
+ * org-mismatch throw propagating untouched, and the allow-list itself
8
+ * (stigmer#1406): trusted-local and OIDC callers admit; machine,
9
+ * PlatformClient-token and every other caller class — runner, the hosted
10
+ * edition's guest / channel / schedule lanes, a class no edition has
11
+ * named yet — refuse, with the capability absent or answering
12
+ * no-opinion. The claim counts only on a platform token (stigmer#1312):
13
+ * the refusing cases carry tokens signed by the envelope every Stigmer
14
+ * lane mints through, and another issuer's token carrying the same claim
15
+ * is admitted.
14
16
  */
15
17
  import { generateKeyPairSync } from "node:crypto";
16
18
 
@@ -43,6 +45,20 @@ const LOCAL_USER: CallerIdentity = {
43
45
  rawToken: "",
44
46
  };
45
47
 
48
+ /**
49
+ * Every caller class that is not a person at the console, CLI or SDK:
50
+ * the OSS runner and machine classes, the hosted edition's minted lanes
51
+ * (their class is their token_type), and a class no edition names yet.
52
+ */
53
+ const NON_PERSON_CLASSES = [
54
+ "machine",
55
+ "runner",
56
+ "guest",
57
+ "channel",
58
+ "schedule",
59
+ "a_lane_added_later",
60
+ ];
61
+
46
62
  /** A cloud-shaped caller whose class is its token_type (sandbox lane). */
47
63
  const SANDBOX_CALLER: CallerIdentity = {
48
64
  identityId: "ida_human",
@@ -182,7 +198,11 @@ describe("GuardMemoryCapture with the capability composed", () => {
182
198
  return { verdict: "no-opinion" };
183
199
  }),
184
200
  );
185
- await step.execute(memoryCtx(SANDBOX_CALLER, "org_zeta"));
201
+ // No opinion on a caller that is not a person: the allow-list refuses
202
+ // it after the capability has seen the request.
203
+ await expect(
204
+ step.execute(memoryCtx(SANDBOX_CALLER, "org_zeta")),
205
+ ).rejects.toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
186
206
  expect(observed).toEqual([{ caller: SANDBOX_CALLER, org: "org_zeta" }]);
187
207
  });
188
208
 
@@ -216,6 +236,23 @@ describe("GuardMemoryCapture with the capability composed", () => {
216
236
  );
217
237
  });
218
238
 
239
+ it.each(NON_PERSON_CLASSES)(
240
+ "no-opinion falls through: a %s caller is refused, with or without the claim",
241
+ async (callerClass) => {
242
+ const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
243
+ providerWith(() => ({ verdict: "no-opinion" })),
244
+ );
245
+ for (const rawToken of [
246
+ "",
247
+ mintedToken({ platform_client_id: "pc_1" }),
248
+ ]) {
249
+ await expect(
250
+ step.execute(memoryCtx({ ...LOCAL_USER, callerClass, rawToken })),
251
+ ).rejects.toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
252
+ }
253
+ },
254
+ );
255
+
219
256
  it("no-opinion falls through: another issuer's platform_client_id claim is admitted", async () => {
220
257
  // Both editions' capabilities answer no-opinion for a person, so this
221
258
  // is the path an OIDC login takes in production.
@@ -243,7 +280,7 @@ describe("GuardMemoryCapture with the capability composed", () => {
243
280
  });
244
281
  });
245
282
 
246
- describe("GuardMemoryCapture without the capability (the pre-seam gate)", () => {
283
+ describe("GuardMemoryCapture without the capability (the allow-list alone)", () => {
247
284
  it("admits trusted-local and OIDC callers", async () => {
248
285
  const step = newGuardMemoryCaptureStep<typeof MemorySchema>(providerWith());
249
286
  await step.execute(memoryCtx(LOCAL_USER));
@@ -288,11 +325,31 @@ describe("GuardMemoryCapture without the capability (the pre-seam gate)", () =>
288
325
  );
289
326
  });
290
327
 
291
- it("admits a runner-shaped caller — the recorded pre-fix posture", async () => {
292
- // With no capability composed the gate cannot classify runner
293
- // credentials — the single-user OSS posture admits them (the #564
294
- // narrowing is CLOUD policy, shipped in the cloud capability).
328
+ it("refuses a runner-shaped caller no capability classifies", async () => {
329
+ // A runner acting for a person captures only through a provider that
330
+ // proves whose run it is (the capability's admit). Unclassified, it is
331
+ // not the person, so the allow-list refuses it (stigmer#1406) — the
332
+ // trusted-local laptop's runner is not this caller: no verifier claims
333
+ // its token there, so it arrives as the operator (pipeline/interceptors/auth.ts).
295
334
  const step = newGuardMemoryCaptureStep<typeof MemorySchema>(providerWith());
296
- await step.execute(memoryCtx(SANDBOX_CALLER));
335
+ await expect(step.execute(memoryCtx(SANDBOX_CALLER))).rejects.toThrowError(
336
+ MEMORY_CAPTURE_CALLER_MESSAGE,
337
+ );
297
338
  });
339
+
340
+ it.each(NON_PERSON_CLASSES)(
341
+ "refuses a %s caller, with or without the claim",
342
+ async (callerClass) => {
343
+ const step =
344
+ newGuardMemoryCaptureStep<typeof MemorySchema>(providerWith());
345
+ for (const rawToken of [
346
+ "",
347
+ mintedToken({ platform_client_id: "pc_1" }),
348
+ ]) {
349
+ await expect(
350
+ step.execute(memoryCtx({ ...LOCAL_USER, callerClass, rawToken })),
351
+ ).rejects.toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
352
+ }
353
+ },
354
+ );
298
355
  });
@@ -27,12 +27,16 @@
27
27
  * - visibility: a driver throw fails the request as Internal — after
28
28
  * persist; retrying the same transition converges (set-diff
29
29
  * idempotency).
30
+ * - execution visibility (a workflow instance's run audience): the same,
31
+ * through `notifyExecutionVisibilityChanged`; the event is the target
32
+ * audience, so a retry converges without the old level.
30
33
  * - the PLATFORM scope arm is dead config in BOTH editions (no kind
31
34
  * uses it; Java's switch falls through to a warn) — ported as the
32
35
  * same conscious warn, never an implementation.
33
36
  */
34
37
  import type { DescMessage, Message } from "@bufbuild/protobuf";
35
38
 
39
+ import { WorkflowExecutionVisibility } from "@stigmer/protos/ai/stigmer/agentic/workflowinstance/v1/spec_pb";
36
40
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
37
41
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
38
42
  import {
@@ -48,6 +52,8 @@ import type { Logger } from "../../boot/logger.js";
48
52
  import type { CallerIdentity } from "../../extensions/identity.js";
49
53
  import type {
50
54
  DefaultInstanceLinkedEvent,
55
+ ExecutionAudienceShape,
56
+ ExecutionVisibilityChangedEvent,
51
57
  ResolvedParentLink,
52
58
  ResourceAuthorizationLifecycle,
53
59
  ResourceCreatedEvent,
@@ -72,6 +78,29 @@ export async function notifyDefaultInstanceLinked(
72
78
  }
73
79
  await lifecycle.onDefaultInstanceLinked(event);
74
80
  }
81
+
82
+ /**
83
+ * Fires the driver's run-audience event for a workflow instance whose
84
+ * `spec.execution_visibility` just persisted. No driver (or a driver
85
+ * without the optional method) = no-op — the OSS posture, where the
86
+ * relation is derived from the row at check time. A driver throw fails
87
+ * the request as Internal with `failureMessage`, after persist; the event
88
+ * is the whole target audience, so the retry converges.
89
+ */
90
+ export async function notifyExecutionVisibilityChanged(
91
+ lifecycle: ResourceAuthorizationLifecycle | undefined,
92
+ event: ExecutionVisibilityChangedEvent,
93
+ failureMessage: string,
94
+ ): Promise<void> {
95
+ if (lifecycle?.onExecutionVisibilityChanged === undefined) {
96
+ return;
97
+ }
98
+ try {
99
+ await lifecycle.onExecutionVisibilityChanged(event);
100
+ } catch (error) {
101
+ throw internalError(error, failureMessage);
102
+ }
103
+ }
75
104
  import { getKindEnum, getKindMeta, getKindName } from "../apiresource-meta.js";
76
105
  import { internalError } from "../errors.js";
77
106
  import type { PipelineStep } from "../pipeline.js";
@@ -153,6 +182,30 @@ export function diffVisibilityShapes(
153
182
  };
154
183
  }
155
184
 
185
+ /**
186
+ * The run audience a workflow instance's execution visibility names — the
187
+ * one mapping both editions read: open source's check-time derivation
188
+ * (authorization/model/execution-viewer.ts) turns it into the tuple the
189
+ * check walks, and the lifecycle event hands it to an edition that stores
190
+ * tuples. ORGANIZATION names the organization's viewers; PRIVATE and the
191
+ * unset level name nobody, so each run stays its triggerer's.
192
+ */
193
+ export function executionAudienceShapes(
194
+ level: WorkflowExecutionVisibility,
195
+ ): ReadonlySet<ExecutionAudienceShape> {
196
+ switch (level) {
197
+ case WorkflowExecutionVisibility.organization:
198
+ return new Set<ExecutionAudienceShape>(["org-viewer"]);
199
+ case WorkflowExecutionVisibility.private:
200
+ case WorkflowExecutionVisibility.unspecified:
201
+ return new Set<ExecutionAudienceShape>();
202
+ default: {
203
+ const exhaustive: never = level;
204
+ throw new Error(`unknown execution visibility: ${String(exhaustive)}`);
205
+ }
206
+ }
207
+ }
208
+
156
209
  // ---------------------------------------------------------------------------
157
210
  // Parent-id resolution — the ParentIdExtractorRegistry port. The spec-field
158
211
  // read itself is shapes.ts's `parentIdOf`, shared with the list read scope
@@ -437,6 +490,7 @@ export function newUpdateVisibilityTuplesStep<Desc extends DescMessage>(
437
490
  kind: ctx.apiResourceKind,
438
491
  resourceId: metadata.id,
439
492
  orgId: metadata.org,
493
+ caller: ctx.callerIdentity,
440
494
  shapesToCreate,
441
495
  shapesToDelete,
442
496
  });
@@ -100,11 +100,12 @@ export const AUTHORIZATION_UNAVAILABLE_MESSAGE =
100
100
  export const AUTHORIZATION_DENIED_FALLBACK_MESSAGE = "permission denied";
101
101
 
102
102
  /**
103
- * The OSS default Authorizer: the permissive single-team posture (DD-007
104
- * §3) — one trust domain, every authenticated caller may do everything,
105
- * exactly the pre-O2 behavior. Installed by the composition root when no
106
- * extension registers an Authorizer (the default lives with the consumer
107
- * that defines its semantics — registry.ts contract).
103
+ * The permissive single-team Authorizer (DD-007 §3): one trust domain,
104
+ * every check allowed, exactly the pre-O2 behavior. Kept for the suites
105
+ * that need an Authorizer with no opinion at all; no posture composes it.
106
+ * A server without sign-in composes the trusted-local driver
107
+ * (authorization/trusted-local-authorizer.ts), which is this plus the
108
+ * not-found arm for an Organization that does not exist (stigmer#1163).
108
109
  */
109
110
  export function newPermissiveSingleTeamAuthorizer(): Authorizer {
110
111
  return {