@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
@@ -17,10 +17,12 @@
17
17
  * Every chain opens with Authorize; create and delete run the shared
18
18
  * tuple-lifecycle steps against the composed lifecycle; getByReference
19
19
  * loads, then authorizes the loaded app exactly as `get` would
20
- * (AuthorizeResolvedTarget). listByOrg does not yet narrow through the
21
- * list read scope, although the model restricts viewing to owners,
22
- * explicit grants and organization admins
23
- * (fga/model/agentic/channel_app.fga, stigmer/stigmer#1384). Per-RPC
20
+ * (AuthorizeResolvedTarget). listByOrg narrows the organization's apps
21
+ * through the composed list read scope to the ones a `get` would return:
22
+ * the model shows a channel app to the organization's admins and explicit
23
+ * grants, never to plain members or viewers, and never to a creator who is
24
+ * no longer an admin (fga/model/agentic/channel_app.fga,
25
+ * stigmer/stigmer#1384, #1409). Per-RPC
24
26
  * posture: docs/authorization-coverage.md §13.
25
27
  *
26
28
  * Proven by channelapp.conformance.test.ts (CONFORMANCE_TARGET=local)
@@ -47,6 +49,8 @@ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/
47
49
 
48
50
  import type { Logger } from "../../boot/logger.js";
49
51
  import type { Authorizer } from "../../extensions/authorizer.js";
52
+ import type { ListReadScope } from "../../extensions/list-read-scope.js";
53
+ import { restrictListByReadScope } from "../../extensions/list-read-scope.js";
50
54
  import type { ResourceAuthorizationLifecycle } from "../../extensions/resource-authorization.js";
51
55
  import type { SecretService } from "../../encryption/encryption.js";
52
56
  import { apiResourceKindKey } from "../../pipeline/interceptors/apiresource.js";
@@ -111,6 +115,8 @@ export interface ChannelAppControllerDeps {
111
115
  /** The composed tuple-lifecycle driver — undefined = the shared steps no-op (C2). */
112
116
  readonly authorizationLifecycle: ResourceAuthorizationLifecycle | undefined;
113
117
  readonly secretService: SecretService;
118
+ /** The composed list read scope — listByOrg narrows through it; undefined = the OSS full scan (stigmer/stigmer#1384). */
119
+ readonly listReadScope: ListReadScope | undefined;
114
120
  }
115
121
 
116
122
  /** Registers both channelapp services on the router (routes stage). */
@@ -394,8 +400,8 @@ async function getByReference(
394
400
  const LIST_RESULT_KEY = "listResult";
395
401
 
396
402
  /**
397
- * ListByOrg — all ChannelApps of an organization, newest-first, every
398
- * entry redacted. No pagination — the set is small by nature (typically
403
+ * ListByOrg — the ChannelApps of an organization the caller may view,
404
+ * newest-first, every entry redacted. No pagination — the set is small by nature (typically
399
405
  * one app per provider per org), the OAuthApp listByOrg posture.
400
406
  */
401
407
  async function listByOrg(
@@ -420,7 +426,7 @@ async function listByOrg(
420
426
  ),
421
427
  )
422
428
  .addStep(newValidateProtoStep())
423
- .addStep(newListByOrgStep(deps.store, deps.logger))
429
+ .addStep(newListByOrgStep(deps.store, deps.listReadScope, deps.logger))
424
430
  .build()
425
431
  .execute(reqCtx);
426
432
 
@@ -436,12 +442,19 @@ async function listByOrg(
436
442
 
437
443
  /**
438
444
  * ListByOrg — Go list_by_org.go's domain step: full scan, malformed rows
439
- * skipped with a warning, org equality filter, per-item redaction, sorted
440
- * by spec-audit created_at descending (seconds then nanos; timestamped
441
- * entries before untimestamped ones).
445
+ * skipped with a warning, org equality filter, narrowed to the caller's
446
+ * apps, per-item redaction, sorted by spec-audit created_at descending
447
+ * (seconds then nanos; timestamped entries before untimestamped ones).
448
+ * The org predicate stays the step's own because with no scope composed
449
+ * the helper returns its input unchanged and never reads the org (the
450
+ * trusted-local full scan); with one, the scope is the last per-row
451
+ * predicate, so a composed driver is asked about the org's apps, never
452
+ * every tenant's, and only the kept apps are redacted (the OAuthApp
453
+ * list's order).
442
454
  */
443
455
  function newListByOrgStep(
444
456
  store: Store,
457
+ listReadScope: ListReadScope | undefined,
445
458
  logger: Logger,
446
459
  ): PipelineStep<typeof ChannelAppQueryController.method.listByOrg.input> {
447
460
  return {
@@ -460,7 +473,7 @@ function newListByOrgStep(
460
473
  throw internalError(error, "failed to list ChannelApps");
461
474
  }
462
475
 
463
- const apps: ChannelApp[] = [];
476
+ const requested: ChannelApp[] = [];
464
477
  for (const bytes of rows) {
465
478
  let app: ChannelApp;
466
479
  try {
@@ -472,8 +485,18 @@ function newListByOrgStep(
472
485
  if ((app.metadata?.org ?? "") !== org) {
473
486
  continue;
474
487
  }
488
+ requested.push(app);
489
+ }
490
+
491
+ const apps = await restrictListByReadScope(
492
+ listReadScope,
493
+ ctx.callerIdentity,
494
+ ApiResourceKind.channel_app,
495
+ requested,
496
+ "",
497
+ );
498
+ for (const app of apps) {
475
499
  redactChannelApp(app);
476
- apps.push(app);
477
500
  }
478
501
 
479
502
  apps.sort((a, b) =>
@@ -38,6 +38,7 @@ import type { ComposedServer } from "../../../boot/compose.js";
38
38
  import { createLogger } from "../../../boot/logger.js";
39
39
  import { ENCRYPTED_PREFIX, isCiphertextShaped } from "../../../encryption/encryption.js";
40
40
  import { REDACTED_MARKER } from "../constants.js";
41
+ import { seedOrganizations } from "../../organization/__tests__/support.js";
41
42
 
42
43
  const silentLogger = createLogger({ level: "error", pretty: false, write: () => {} });
43
44
 
@@ -84,6 +85,18 @@ async function startServer(env: Record<string, string>): Promise<TestServer> {
84
85
  const transport: Transport = createGrpcTransport({
85
86
  baseUrl: `http://127.0.0.1:${port}`,
86
87
  });
88
+ await seedOrganizations(transport, [
89
+ ORG,
90
+ "other-org",
91
+ "personal-org-a",
92
+ "personal-org-b",
93
+ "personal-org-c",
94
+ "personal-org-d",
95
+ "read-org",
96
+ "vis-org-a",
97
+ "vis-org-b",
98
+ "list-org",
99
+ ]);
87
100
  return {
88
101
  server,
89
102
  command: createClient(EnvironmentCommandController, transport),
@@ -61,6 +61,7 @@ import {
61
61
  deleteExecutionContextForExecution,
62
62
  } from "../temporal/delete-execution-context.js";
63
63
  import { executionContextSearchExtractor } from "../search-extractor.js";
64
+ import { seedOrganizations } from "../../organization/__tests__/support.js";
64
65
 
65
66
  const silentLogger = createLogger({
66
67
  level: "error",
@@ -112,6 +113,7 @@ async function startServer(env: Record<string, string>): Promise<TestServer> {
112
113
  const transport: Transport = createGrpcTransport({
113
114
  baseUrl: `http://127.0.0.1:${port}`,
114
115
  });
116
+ await seedOrganizations(transport, [ORG, "test-org"]);
115
117
  return {
116
118
  server,
117
119
  command: createClient(ExecutionContextCommandController, transport),
@@ -229,7 +229,8 @@ export function newLoadByExecutionIdStep(
229
229
  * Ordered before the duplicate check so an unauthorized caller learns
230
230
  * nothing about which execution ids exist.
231
231
  *
232
- * OSS byte-identity: the permissive authorizer allows every check, so the
232
+ * OSS byte-identity: the trusted-local authorizer allows every check on
233
+ * an Organization that exists (trusted-local-authorizer.ts), so the
233
234
  * single-user posture is unchanged (the rosters prove it).
234
235
  */
235
236
  export function newAuthorizeExecutionContextCreateStep(
@@ -350,3 +350,82 @@ describe("buildPrincipalAccessList", () => {
350
350
  ]);
351
351
  });
352
352
  });
353
+
354
+ describe("buildPrincipalAccessList: only the organization's people", () => {
355
+ /** An agent in acme: alice (a member) and dave (no role in acme) each hold a viewer grant. */
356
+ async function sharedAgent() {
357
+ const store = fakeIamPolicyStore();
358
+ await store.save(
359
+ row(
360
+ scopeLink(
361
+ { kind: "agent", id: "a1" },
362
+ { kind: "organization", id: "acme" },
363
+ ),
364
+ ),
365
+ );
366
+ await store.save(row(orgRole("ida_alice", "member", "acme")));
367
+ await store.save(row(orgRole("ida_dave", "member", "globex")));
368
+ for (const account of ["ida_alice", "ida_dave"]) {
369
+ await store.save(
370
+ row(
371
+ triple({ kind: "identity_account", id: account }, "viewer", {
372
+ kind: "agent",
373
+ id: "a1",
374
+ }),
375
+ ),
376
+ );
377
+ }
378
+ await store.save(
379
+ row(
380
+ triple({ kind: "team", id: "tm_1", relation: "member" }, "viewer", {
381
+ kind: "agent",
382
+ id: "a1",
383
+ }),
384
+ ),
385
+ );
386
+ return store;
387
+ }
388
+
389
+ it("leaves out a person who holds no role in the resource's organization, and keeps teams", async () => {
390
+ const store = await sharedAgent();
391
+ const entries = await buildPrincipalAccessList(store, nobody, undefined, [
392
+ { kind: "agent", id: "a1" },
393
+ ]);
394
+ expect(
395
+ entries.map((e) => `${e.principal?.kind}:${e.principal?.id}`),
396
+ ).toEqual(["identity_account:ida_alice", "team:tm_1"]);
397
+ });
398
+
399
+ it("reads the organization from the walked hierarchy the same way", async () => {
400
+ const store = await sharedAgent();
401
+ const entries = await buildPrincipalAccessList(store, nobody, undefined, [
402
+ { kind: "agent", id: "a1" },
403
+ { kind: "organization", id: "acme" },
404
+ ]);
405
+ expect(entries.map((e) => e.principal?.id)).toEqual(["ida_alice", "tm_1"]);
406
+ });
407
+
408
+ it("an organization's own list is its roles and is never filtered", async () => {
409
+ const store = await sharedAgent();
410
+ const entries = await buildPrincipalAccessList(store, nobody, undefined, [
411
+ { kind: "organization", id: "globex" },
412
+ ]);
413
+ expect(entries.map((e) => e.principal?.id)).toEqual(["ida_dave"]);
414
+ });
415
+
416
+ it("a resource no organization holds is listed as its rows say", async () => {
417
+ const store = fakeIamPolicyStore();
418
+ await store.save(
419
+ row(
420
+ triple({ kind: "identity_account", id: "ida_dave" }, "viewer", {
421
+ kind: "agent",
422
+ id: "loose",
423
+ }),
424
+ ),
425
+ );
426
+ const entries = await buildPrincipalAccessList(store, nobody, undefined, [
427
+ { kind: "agent", id: "loose" },
428
+ ]);
429
+ expect(entries.map((e) => e.principal?.id)).toEqual(["ida_dave"]);
430
+ });
431
+ });
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Pins the one definition of an access row and the one conversion from a
3
+ * caller to the actor a change record carries (change.ts). An access row
4
+ * names a person or an audience written as a userset; a row naming a
5
+ * resource with no relation is a structural link and is never recorded.
6
+ * The actor keeps the caller's id and class and drops everything else, so
7
+ * a permission history holds no email, display name or token.
8
+ */
9
+ import { describe, expect, it } from "vitest";
10
+
11
+ import type { CallerIdentity } from "../../../extensions/identity.js";
12
+ import { grantsAccess, policyActorOf } from "../change.js";
13
+ import { triple } from "./support.js";
14
+
15
+ describe("grantsAccess", () => {
16
+ const agent = { kind: "agent", id: "agt_01hzzzzzzzzzzzzzzzzzzzzzzz" };
17
+
18
+ it.each([
19
+ ["a person", { kind: "identity_account", id: "ida_1" }, true],
20
+ [
21
+ "a team's members",
22
+ { kind: "team", id: "tm_1", relation: "member" },
23
+ true,
24
+ ],
25
+ [
26
+ "an organization's viewers",
27
+ { kind: "organization", id: "acme", relation: "viewer" },
28
+ true,
29
+ ],
30
+ [
31
+ "an identity provider's platform users",
32
+ { kind: "identity_provider", id: "idp_1", relation: "platform_user" },
33
+ true,
34
+ ],
35
+ ["a parent organization", { kind: "organization", id: "acme" }, false],
36
+ ["a blueprint (default instance)", { kind: "agent", id: "agt_2" }, false],
37
+ [
38
+ "an identity provider (managed organization)",
39
+ { kind: "identity_provider", id: "idp_1" },
40
+ false,
41
+ ],
42
+ ])("a row naming %s: %s", (_name, principal, expected) => {
43
+ expect(grantsAccess(triple(principal, "viewer", agent))).toBe(expected);
44
+ });
45
+ });
46
+
47
+ describe("policyActorOf", () => {
48
+ it("keeps the caller's id and class and nothing else", () => {
49
+ const caller: CallerIdentity = {
50
+ identityId: "ida_1",
51
+ callerClass: "internal",
52
+ issuer: "https://issuer.example.com",
53
+ rawToken: "secret",
54
+ email: "alice@example.com",
55
+ displayName: "Alice",
56
+ origin: "in-process",
57
+ };
58
+ expect(policyActorOf(caller)).toStrictEqual({
59
+ id: "ida_1",
60
+ callerClass: "internal",
61
+ });
62
+ });
63
+ });
@@ -93,7 +93,12 @@ import {
93
93
  import { registerIamPolicyServices } from "../controller.js";
94
94
  import { newIamPolicyGrantPath } from "../grant-path.js";
95
95
  import { newOrganizationOnlyGrantScope } from "../grant-scope.js";
96
- import { fakeIamPolicyStore, orgRole, triple } from "./support.js";
96
+ import {
97
+ NO_RECORDED_CREATORS,
98
+ fakeIamPolicyStore,
99
+ orgRole,
100
+ triple,
101
+ } from "./support.js";
97
102
 
98
103
  const silent = createLogger({ level: "error", pretty: false, write: () => {} });
99
104
 
@@ -225,6 +230,7 @@ async function harness(options: {
225
230
  const authorizer = recordingAuthorizer();
226
231
  const engine = options.engine === true ? recordingEngine() : undefined;
227
232
  const grantPath = newIamPolicyGrantPath({
233
+ creators: NO_RECORDED_CREATORS,
228
234
  policies,
229
235
  lifecycle: undefined,
230
236
  logger: silent,
@@ -350,6 +356,31 @@ describe("the three system RPCs (Q-OR-7, Q-S5-10)", () => {
350
356
  });
351
357
  });
352
358
 
359
+ describe("each lane hands the store its own door and its caller", () => {
360
+ const member = orgRole(OPERATOR_ID, "member", "acme");
361
+
362
+ it("create records a grant and delete a revoke, both as the chain's caller", async () => {
363
+ const h = await harness({ caller: alice });
364
+ await h.command.create(member);
365
+ await h.command.delete(member);
366
+ const actor = { id: alice.identityId, callerClass: "user" };
367
+ expect(h.policies.changes.map((change) => [change.op, change.record])).toEqual([
368
+ ["save", { actor, cause: "grant", organizationId: "acme" }],
369
+ ["delete", { actor, cause: "revoke", organizationId: "acme" }],
370
+ ]);
371
+ });
372
+
373
+ it("bootstrapPolicy records a structural change and cleanupResourcePolicies a deleted resource", async () => {
374
+ const h = await harness({ caller: machine });
375
+ await h.command.bootstrapPolicy(member);
376
+ await h.command.cleanupResourcePolicies(ref("organization", "acme"));
377
+ expect(h.policies.changes.map((change) => change.record?.cause)).toEqual([
378
+ "structural",
379
+ "resource_deleted",
380
+ ]);
381
+ });
382
+ });
383
+
353
384
  describe("checkMyPermission (Q-OR-8, Q-S5-3)", () => {
354
385
  const platform = ref("platform", "stigmer");
355
386
  const acme = ref("organization", "acme");
@@ -957,9 +988,14 @@ describe("owner is assigned by owners, on the three caller lanes", () => {
957
988
  h: Harness,
958
989
  roles: ReadonlyArray<readonly [string, string]>,
959
990
  ): Promise<void> {
960
- const path = newIamPolicyGrantPath({ policies: h.policies, lifecycle: undefined, logger: silent });
991
+ const path = newIamPolicyGrantPath({
992
+ creators: NO_RECORDED_CREATORS,
993
+ policies: h.policies,
994
+ lifecycle: undefined,
995
+ logger: silent,
996
+ });
961
997
  for (const [account, role] of roles) {
962
- await path.grant(orgRole(account, role, "acme"), internal);
998
+ await path.grant(orgRole(account, role, "acme"), internal, "grant");
963
999
  }
964
1000
  }
965
1001