@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
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Pins who a workflow-forwarded HITL decision names (stigmer#1385), over a
3
+ * real boot: a composition verifier and no require-authentication, so the
4
+ * posture stays trusted-local while a presented token is a signed-in
5
+ * person. One boot then holds both identities the forward could carry:
6
+ *
7
+ * - Erin decides through the workflow with her token. The workflow chain
8
+ * forwards over the in-process transport as the server acting for her,
9
+ * so the child agent execution records HER as the approver and the
10
+ * file reviewer — not the in-process default, which is the
11
+ * trusted-local operator and is what every forward named before this
12
+ * fix (the workflow API promises the caller identity propagates).
13
+ * - A tokenless decision on an agent run directly is the laptop's
14
+ * operator, recorded as its audit actor is (the trusted-local arm).
15
+ *
16
+ * The child's authorization is not re-run as Erin — the forward stays the
17
+ * server's own act — so the seeded child needs no session she owns. The
18
+ * direct-call arms (every action, APPROVE_ALL's co-pending calls, both
19
+ * file-decision scopes) are pinned in
20
+ * domain/agentexecution/__tests__/agentexecution.test.ts.
21
+ */
22
+ import { mkdtempSync, rmSync } from "node:fs";
23
+ import { tmpdir } from "node:os";
24
+ import path from "node:path";
25
+
26
+ import { create } from "@bufbuild/protobuf";
27
+ import type { MessageInitShape } from "@bufbuild/protobuf";
28
+ import { createClient } from "@connectrpc/connect";
29
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
30
+
31
+ import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
32
+ import type {
33
+ AgentExecution,
34
+ AgentExecutionStatusSchema,
35
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
36
+ import { AgentExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/command_pb";
37
+ import {
38
+ ApprovalAction,
39
+ ExecutionPhase as AgentExecutionPhase,
40
+ FileDecisionAction,
41
+ FileDecisionScope,
42
+ ToolCallStatus,
43
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
44
+ import {
45
+ WorkflowExecutionSchema,
46
+ WorkflowPendingApprovalSchema,
47
+ WorkflowPendingFileReviewSchema,
48
+ } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
49
+ import type { WorkflowExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
50
+ import { WorkflowExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/command_pb";
51
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
52
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
53
+
54
+ import { loadConfig } from "../../../boot/config.js";
55
+ import { composeServer } from "../../../boot/compose.js";
56
+ import type { ComposedServer } from "../../../boot/compose.js";
57
+ import type { ServerExtension } from "../../../extensions/registry.js";
58
+ import {
59
+ baseConfig,
60
+ fakeJwt,
61
+ fakeVerifier,
62
+ silentLogger,
63
+ transportFor,
64
+ } from "../../../extensions/__tests__/composed-support.js";
65
+ import { trustedLocalIdentity } from "../../../pipeline/interceptors/auth.js";
66
+ import { fileReviewSeed } from "../../agentexecution/__tests__/file-review-seed.js";
67
+
68
+ const ERIN = "fake|erin";
69
+ const ORG = "forward-attribution-org";
70
+
71
+ describe("a workflow-forwarded decision names the person who made it (composed server)", () => {
72
+ let dir: string;
73
+ let server: ComposedServer;
74
+ let port: number;
75
+ let counter = 0;
76
+
77
+ const asErin = () =>
78
+ createClient(
79
+ WorkflowExecutionCommandController,
80
+ transportFor(port, fakeJwt(ERIN, "erin@example.com")),
81
+ );
82
+
83
+ beforeAll(async () => {
84
+ dir = mkdtempSync(path.join(tmpdir(), "wfexec-forward-attribution-"));
85
+ // A verifier and nothing else: no require-authentication and no
86
+ // Authorizer, so the posture is trusted-local and tokenless requests
87
+ // still reach the laptop's operator.
88
+ const unit: ServerExtension = {
89
+ name: "fake-verifier-only",
90
+ identityVerifiers: [fakeVerifier],
91
+ };
92
+ server = await composeServer({
93
+ config: loadConfig(baseConfig(dir)),
94
+ logger: silentLogger,
95
+ extensions: [unit],
96
+ portOverride: 0,
97
+ host: "127.0.0.1",
98
+ });
99
+ port = await server.start();
100
+ });
101
+
102
+ afterAll(async () => {
103
+ await server.shutdown();
104
+ rmSync(dir, { recursive: true, force: true });
105
+ });
106
+
107
+ function nextId(prefix: string): string {
108
+ counter += 1;
109
+ return `${prefix}_${counter}`;
110
+ }
111
+
112
+ async function saveChild(
113
+ id: string,
114
+ status: MessageInitShape<typeof AgentExecutionStatusSchema>,
115
+ ): Promise<void> {
116
+ const slug = id.replaceAll("_", "-");
117
+ await server.store.saveResource(
118
+ ApiResourceKind.agent_execution,
119
+ id,
120
+ AgentExecutionSchema,
121
+ create(AgentExecutionSchema, {
122
+ apiVersion: "agentic.stigmer.ai/v1",
123
+ kind: "AgentExecution",
124
+ metadata: { id, name: slug, slug, org: ORG },
125
+ spec: { message: "Say hello." },
126
+ status,
127
+ }),
128
+ );
129
+ }
130
+
131
+ async function saveParent(
132
+ status: MessageInitShape<typeof WorkflowExecutionStatusSchema>,
133
+ ): Promise<string> {
134
+ const id = nextId("wfexec_fwd");
135
+ const slug = id.replaceAll("_", "-");
136
+ await server.store.saveResource(
137
+ ApiResourceKind.workflow_execution,
138
+ id,
139
+ WorkflowExecutionSchema,
140
+ create(WorkflowExecutionSchema, {
141
+ apiVersion: "agentic.stigmer.ai/v1",
142
+ kind: "WorkflowExecution",
143
+ metadata: { id, name: slug, slug, org: ORG },
144
+ spec: { workflowId: `wf_${id}`, workflowInstanceId: `wfi_${id}` },
145
+ status,
146
+ }),
147
+ );
148
+ return id;
149
+ }
150
+
151
+ async function loadChild(id: string): Promise<AgentExecution> {
152
+ return server.store.getResource(
153
+ ApiResourceKind.agent_execution,
154
+ id,
155
+ AgentExecutionSchema,
156
+ );
157
+ }
158
+
159
+ it("an approval forwarded through the workflow records the person on the child", async () => {
160
+ const childId = nextId("aexec_fwd_gated");
161
+ await saveChild(childId, {
162
+ phase: AgentExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
163
+ messages: [
164
+ {
165
+ toolCalls: [
166
+ {
167
+ id: "tc-fwd",
168
+ name: "Write",
169
+ status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
170
+ requiresApproval: true,
171
+ },
172
+ ],
173
+ },
174
+ ],
175
+ });
176
+ const parentId = await saveParent({
177
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
178
+ pendingApprovals: [
179
+ create(WorkflowPendingApprovalSchema, {
180
+ approval: { toolCallId: "tc-fwd", toolName: "Write" },
181
+ childAgentExecutionId: childId,
182
+ }),
183
+ ],
184
+ });
185
+
186
+ await asErin().submitApproval({
187
+ executionId: parentId,
188
+ toolCallId: "tc-fwd",
189
+ action: ApprovalAction.APPROVE,
190
+ });
191
+
192
+ const child = await loadChild(childId);
193
+ const tc = child.status?.messages[0]?.toolCalls[0];
194
+ expect(tc?.approvalAction).toBe(ApprovalAction.APPROVE);
195
+ expect(tc?.approvedBy, "the person, not the in-process default").toBe(ERIN);
196
+ const decided = (child.status?.approvalEventStream?.events ?? []).find(
197
+ (ev) =>
198
+ ev.approvalRequestId === "tc-fwd" && ev.payload.case === "decided",
199
+ );
200
+ expect(
201
+ decided?.payload.case === "decided"
202
+ ? decided.payload.value.decidedBy
203
+ : undefined,
204
+ ).toBe(ERIN);
205
+ });
206
+
207
+ it("a file decision forwarded through the workflow records the person as the reviewer", async () => {
208
+ const childId = nextId("aexec_fwd_review");
209
+ const changeSetId = nextId("cs_fwd");
210
+ const { status, aggregate } = fileReviewSeed(childId, changeSetId);
211
+ await saveChild(childId, status);
212
+ const parentId = await saveParent({
213
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
214
+ pendingFileReviews: [
215
+ create(WorkflowPendingFileReviewSchema, {
216
+ childAgentExecutionId: childId,
217
+ changeSetId: [changeSetId],
218
+ }),
219
+ ],
220
+ });
221
+
222
+ await asErin().submitFileDecision({
223
+ executionId: parentId,
224
+ childAgentExecutionId: childId,
225
+ changeSetId,
226
+ scope: FileDecisionScope.CHANGE_SET,
227
+ action: FileDecisionAction.APPROVE,
228
+ expectedDigest: aggregate,
229
+ });
230
+
231
+ const child = await loadChild(childId);
232
+ const decisions =
233
+ child.status?.fileChangeSets.find((cs) => cs.id === changeSetId)
234
+ ?.decisions ?? [];
235
+ expect(decisions).toHaveLength(1);
236
+ expect(decisions[0]?.reviewerId).toBe(ERIN);
237
+ });
238
+
239
+ it("a tokenless decision on the agent run is the laptop's operator", async () => {
240
+ const childId = nextId("aexec_local");
241
+ await saveChild(childId, {
242
+ phase: AgentExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
243
+ messages: [
244
+ {
245
+ toolCalls: [
246
+ {
247
+ id: "tc-local",
248
+ name: "Write",
249
+ status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
250
+ requiresApproval: true,
251
+ },
252
+ ],
253
+ },
254
+ ],
255
+ });
256
+
257
+ const result = await createClient(
258
+ AgentExecutionCommandController,
259
+ transportFor(port),
260
+ ).submitApproval({
261
+ agentExecutionId: childId,
262
+ toolCallId: "tc-local",
263
+ action: ApprovalAction.APPROVE,
264
+ });
265
+
266
+ expect(result.status?.messages[0]?.toolCalls[0]?.approvedBy).toBe(
267
+ trustedLocalIdentity().identityId,
268
+ );
269
+ });
270
+ });
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Pins who a workflow human_input decision names (stigmer#1415): the
3
+ * reviewer and reviewer_actor that submitWorkflowTaskApproval puts on the
4
+ * relay signal are the caller the chain authorized, never the client's
5
+ * `reviewer` field. One arm per caller shape the editions produce — a
6
+ * person with and without a client-supplied name, a PlatformClient user
7
+ * token (a person spoken for by a third-party client), and a composition's
8
+ * own lane class — each read from the payload the stub engine recorded.
9
+ * The validation and phase arms, and the engineless refusal, are pinned
10
+ * over the wire in workflowexecution.test.ts.
11
+ */
12
+ import { newPermissiveSingleTeamAuthorizer } from "../../../pipeline/steps/authorize.js";
13
+ import { testCallerIdentity } from "../../../pipeline/__tests__/support.js";
14
+ import { mkdtempSync, rmSync } from "node:fs";
15
+ import { tmpdir } from "node:os";
16
+ import path from "node:path";
17
+
18
+ import { create } from "@bufbuild/protobuf";
19
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
20
+
21
+ import { WorkflowExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
22
+ import {
23
+ ExecutionPhase,
24
+ WorkflowTaskStatus,
25
+ WorkflowTaskType,
26
+ } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
27
+ import { SubmitWorkflowTaskApprovalInputSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/io_pb";
28
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
29
+
30
+ import { createLogger } from "../../../boot/logger.js";
31
+ import type { CallerIdentity } from "../../../extensions/identity.js";
32
+ import { SqliteStore } from "../../../store/sqlite/store.js";
33
+
34
+ import {
35
+ HUMAN_INPUT_SIGNAL_PREFIX,
36
+ RELAY_SIGNAL_CHANNEL_NAME,
37
+ } from "../constants.js";
38
+ import { submitWorkflowTaskApproval } from "../submit-workflow-task-approval.js";
39
+ import { stubConnectedEngine } from "./engine-stub.js";
40
+
41
+ const GATE = "manager_approval";
42
+
43
+ const silentLogger = createLogger({
44
+ level: "error",
45
+ pretty: false,
46
+ write: () => {},
47
+ });
48
+
49
+ let dir: string;
50
+ let store: SqliteStore;
51
+ let counter = 0;
52
+
53
+ beforeAll(() => {
54
+ dir = mkdtempSync(path.join(tmpdir(), "wfexec-task-approval-"));
55
+ store = SqliteStore.open(path.join(dir, "test.db"));
56
+ });
57
+
58
+ afterAll(async () => {
59
+ await store.close();
60
+ rmSync(dir, { recursive: true, force: true });
61
+ });
62
+
63
+ /** A running execution whose one task is a human_input gate awaiting a decision. */
64
+ async function seedGate(): Promise<string> {
65
+ counter += 1;
66
+ const id = `wfx_gate_${counter}`;
67
+ await store.saveResource(
68
+ ApiResourceKind.workflow_execution,
69
+ id,
70
+ WorkflowExecutionSchema,
71
+ create(WorkflowExecutionSchema, {
72
+ metadata: { id, name: id, org: "acme" },
73
+ spec: {
74
+ workflowId: `wf_${counter}`,
75
+ workflowInstanceId: `wfi_${counter}`,
76
+ },
77
+ status: {
78
+ phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
79
+ temporalWorkflowId: `temporal_${counter}`,
80
+ tasks: [
81
+ {
82
+ taskName: GATE,
83
+ taskType: WorkflowTaskType.WORKFLOW_TASK_APPROVAL,
84
+ status: WorkflowTaskStatus.WORKFLOW_TASK_WAITING_APPROVAL,
85
+ },
86
+ ],
87
+ },
88
+ }),
89
+ );
90
+ return id;
91
+ }
92
+
93
+ /** Submits a decision as `caller` and returns the human_input payload the engine was handed. */
94
+ async function decide(
95
+ caller: CallerIdentity,
96
+ clientReviewer = "",
97
+ ): Promise<Record<string, unknown>> {
98
+ const engine = stubConnectedEngine();
99
+ await submitWorkflowTaskApproval(
100
+ {
101
+ store,
102
+ logger: silentLogger,
103
+ authorizer: newPermissiveSingleTeamAuthorizer(),
104
+ engineState: () => engine.state,
105
+ },
106
+ create(SubmitWorkflowTaskApprovalInputSchema, {
107
+ executionId: await seedGate(),
108
+ taskName: GATE,
109
+ outcome: "approve",
110
+ reviewer: clientReviewer,
111
+ }),
112
+ caller,
113
+ );
114
+
115
+ const starts = engine.calls.filter(
116
+ (call) => call.method === "signalWithStart",
117
+ );
118
+ expect(starts).toHaveLength(1);
119
+ const [, channel, envelope] = starts[0]!.args as [
120
+ unknown,
121
+ string,
122
+ { signalName: string; payload: Record<string, unknown> },
123
+ ];
124
+ expect(channel).toBe(RELAY_SIGNAL_CHANNEL_NAME);
125
+ expect(envelope.signalName).toBe(HUMAN_INPUT_SIGNAL_PREFIX + GATE);
126
+ return envelope.payload;
127
+ }
128
+
129
+ describe("submitWorkflowTaskApproval reviewer attribution (stigmer#1415)", () => {
130
+ it("a person who names no reviewer is recorded as themselves, with their display snapshot", async () => {
131
+ const payload = await decide(
132
+ testCallerIdentity({
133
+ identityId: "ia_erin",
134
+ email: "erin@example.com",
135
+ displayName: "Erin Example",
136
+ }),
137
+ );
138
+
139
+ expect(payload["outcome"]).toBe("approve");
140
+ expect(payload["reviewer"]).toBe("ia_erin");
141
+ expect(payload["reviewer_actor"]).toEqual({
142
+ id: "ia_erin",
143
+ display_name: "Erin Example",
144
+ email: "erin@example.com",
145
+ avatar: "",
146
+ });
147
+ });
148
+
149
+ it("a person who names someone else is still recorded as themselves", async () => {
150
+ const payload = await decide(
151
+ testCallerIdentity({ identityId: "ia_erin", email: "erin@example.com" }),
152
+ "ia_someone_else",
153
+ );
154
+
155
+ expect(payload["reviewer"]).toBe("ia_erin");
156
+ expect(payload["reviewer_actor"]).toEqual({
157
+ id: "ia_erin",
158
+ display_name: "",
159
+ email: "erin@example.com",
160
+ avatar: "",
161
+ });
162
+ });
163
+
164
+ it("a PlatformClient user token records the end user it names, not the client", async () => {
165
+ const payload = await decide(
166
+ testCallerIdentity({
167
+ identityId: "ia_end_user",
168
+ email: "user@partner.example",
169
+ platformClientId: "pcl_partner",
170
+ }),
171
+ );
172
+
173
+ expect(payload["reviewer"]).toBe("ia_end_user");
174
+ expect(payload["reviewer_actor"]).toEqual({
175
+ id: "ia_end_user",
176
+ display_name: "",
177
+ email: "user@partner.example",
178
+ avatar: "",
179
+ });
180
+ });
181
+
182
+ it("a composition's own lane class is attributed to its principal, whatever it sends", async () => {
183
+ const payload = await decide(
184
+ testCallerIdentity({ identityId: "ia_broker", callerClass: "channel" }),
185
+ "U_SLACK_USER",
186
+ );
187
+
188
+ expect(payload["reviewer"]).toBe("ia_broker");
189
+ expect(payload["reviewer_actor"]).toEqual({
190
+ id: "ia_broker",
191
+ display_name: "",
192
+ email: "",
193
+ avatar: "",
194
+ });
195
+ });
196
+ });
@@ -41,14 +41,9 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
41
41
  import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
42
42
  import {
43
43
  ApprovalAction,
44
- DiffCompleteness,
45
- ExecutionPhase as AgentExecutionPhase,
46
- FileChangeKind,
47
44
  FileDecisionAction,
48
45
  FileDecisionScope,
49
- FileReviewEventType,
50
46
  } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
51
- import { CapturedFileChangeSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
52
47
  import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
53
48
  import {
54
49
  WorkflowExecutionSchema,
@@ -77,10 +72,7 @@ import { loadConfig } from "../../../boot/config.js";
77
72
  import { composeServer } from "../../../boot/compose.js";
78
73
  import type { ComposedServer } from "../../../boot/compose.js";
79
74
  import { createLogger } from "../../../boot/logger.js";
80
- import {
81
- aggregateDigest,
82
- fileDigest,
83
- } from "../../agentexecution/filereview/digest.js";
75
+ import { fileReviewSeed } from "../../agentexecution/__tests__/file-review-seed.js";
84
76
  import type { WorkflowExecutionEventRecord } from "../../../store/interface.js";
85
77
 
86
78
  const silentLogger = createLogger({
@@ -1254,20 +1246,6 @@ describe("submitApproval over the wire (forwarding through the REAL in-process e
1254
1246
  });
1255
1247
 
1256
1248
  describe("submitFileDecision over the wire (propagation through the REAL in-process edge)", () => {
1257
- function buildChange() {
1258
- const change = create(CapturedFileChangeSchema, {
1259
- id: "fc-1",
1260
- pathBefore: "src/a.ts",
1261
- pathAfter: "src/a.ts",
1262
- kind: FileChangeKind.MODIFY,
1263
- beforeSha256: "a".repeat(64),
1264
- afterSha256: "b".repeat(64),
1265
- diffComplete: true,
1266
- });
1267
- change.fileDigest = fileDigest(change);
1268
- return change;
1269
- }
1270
-
1271
1249
  async function seedChildWithLedger(): Promise<{
1272
1250
  childId: string;
1273
1251
  changeSetId: string;
@@ -1276,8 +1254,7 @@ describe("submitFileDecision over the wire (propagation through the REAL in-proc
1276
1254
  counter += 1;
1277
1255
  const childId = `aexec_wf_child_${counter}`;
1278
1256
  const changeSetId = `cs_wf_${counter}`;
1279
- const change = buildChange();
1280
- const aggregate = aggregateDigest([change]);
1257
+ const { status, aggregate } = fileReviewSeed(childId, changeSetId);
1281
1258
  await server.store.saveResource(
1282
1259
  ApiResourceKind.agent_execution,
1283
1260
  childId,
@@ -1292,38 +1269,7 @@ describe("submitFileDecision over the wire (propagation through the REAL in-proc
1292
1269
  org: ORG,
1293
1270
  },
1294
1271
  spec: { message: "Say hello." },
1295
- status: {
1296
- phase: AgentExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
1297
- fileReviewEventStream: {
1298
- executionId: childId,
1299
- events: [
1300
- {
1301
- eventId: `${changeSetId}:${changeSetId}:BASELINE`,
1302
- changeSetId,
1303
- eventType: FileReviewEventType.BASELINE_CAPTURED,
1304
- actor: "runner",
1305
- payload: {
1306
- case: "baselineCaptured",
1307
- value: { turnId: "turn-1", harnessId: "harness-1" },
1308
- },
1309
- },
1310
- {
1311
- eventId: `${changeSetId}:${changeSetId}:CANDIDATE`,
1312
- changeSetId,
1313
- eventType: FileReviewEventType.CANDIDATE_CAPTURED,
1314
- actor: "runner",
1315
- payload: {
1316
- case: "candidateCaptured",
1317
- value: {
1318
- changes: [change],
1319
- aggregateDigest: aggregate,
1320
- diffCompleteness: DiffCompleteness.COMPLETE,
1321
- },
1322
- },
1323
- },
1324
- ],
1325
- },
1326
- },
1272
+ status,
1327
1273
  }),
1328
1274
  );
1329
1275
  return { childId, changeSetId, aggregate };
@@ -45,10 +45,16 @@ import type { Store } from "../../store/interface.js";
45
45
  * The narrow agentexecution forwarding edge (Go
46
46
  * AgentExecutionApprovalClient) — method-segregated from the
47
47
  * file-decision edge so each handler depends only on the RPC it uses;
48
- * the in-process agentexecution controller satisfies both.
48
+ * the in-process agentexecution controller satisfies both. `caller` is
49
+ * the identity this chain authorized: the child records it as the
50
+ * decider (stigmer/stigmer#1385), so a decision made through a workflow
51
+ * names the same person as one made on the agent run directly.
49
52
  */
50
53
  export interface AgentExecutionApprovalForwarder {
51
- submitApproval(input: AgentSubmitApprovalInput): Promise<AgentExecution>;
54
+ submitApproval(
55
+ input: AgentSubmitApprovalInput,
56
+ caller: CallerIdentity,
57
+ ): Promise<AgentExecution>;
52
58
  }
53
59
  export type AgentExecutionApprovalForwarderProvider =
54
60
  () => AgentExecutionApprovalForwarder;
@@ -159,6 +165,7 @@ export async function submitApproval(
159
165
  action: ctx.input.action,
160
166
  comment: ctx.input.comment,
161
167
  }),
168
+ ctx.callerIdentity,
162
169
  );
163
170
  } catch (error) {
164
171
  // Flattened to Unavailable; Go's %v embeds the child's grpc-go
@@ -42,11 +42,15 @@ import type { Store } from "../../store/interface.js";
42
42
  /**
43
43
  * The narrow agentexecution file-decision edge (Go
44
44
  * AgentExecutionFileDecisionClient) — method-segregated from the approval
45
- * edge; the in-process agentexecution controller satisfies both.
45
+ * edge; the in-process agentexecution controller satisfies both. `caller`
46
+ * is the identity this chain authorized, which the child records as the
47
+ * reviewer (the contract on SubmitWorkflowFileDecisionInput: the caller
48
+ * identity propagates; stigmer/stigmer#1385).
46
49
  */
47
50
  export interface AgentExecutionFileDecisionForwarder {
48
51
  submitFileDecision(
49
52
  input: AgentSubmitFileDecisionInput,
53
+ caller: CallerIdentity,
50
54
  ): Promise<AgentExecution>;
51
55
  }
52
56
  export type AgentExecutionFileDecisionForwarderProvider =
@@ -154,6 +158,7 @@ export async function submitFileDecision(
154
158
  reason: ctx.input.reason,
155
159
  acknowledgeUnreviewable: ctx.input.acknowledgeUnreviewable,
156
160
  }),
161
+ ctx.callerIdentity,
157
162
  );
158
163
  } catch (error) {
159
164
  // Propagate the child's STATUS unchanged (code + message) — its
@@ -10,10 +10,17 @@
10
10
  * carries status.temporal_workflow_id (NOT spec.workflow_id — every other
11
11
  * sender passes the spec reference).
12
12
  *
13
- * Reviewer attribution: OSS is single-user; an explicit client-supplied
14
- * reviewer is honored, otherwise it stays empty ("Empty when not
15
- * attributed"). Cloud attributes server-side from the authenticated
16
- * caller.
13
+ * Reviewer attribution (stigmer#1415): the decision names the principal
14
+ * the chain authorized, the id `auditActorFor` stamps as `created_by.id`,
15
+ * with that caller's display snapshot as `reviewer_actor`, in every
16
+ * edition and for every caller class. The client-supplied
17
+ * `SubmitWorkflowTaskApprovalInput.reviewer` is never read: a person's
18
+ * value is spoofable, and no caller in either edition decides on someone
19
+ * else's behalf, so delegated attribution waits for the lane that needs it
20
+ * and is keyed on that lane's own class (the io.proto field comment). On a
21
+ * laptop the reviewer is the trusted-local operator, exactly as every
22
+ * laptop resource's `created_by` is. The runner carries both keys opaquely
23
+ * into the task output and the approval_resolved event.
17
24
  */
18
25
  import type { JsonValue } from "@bufbuild/protobuf";
19
26
 
@@ -38,6 +45,7 @@ import {
38
45
  import { newPipeline } from "../../pipeline/pipeline.js";
39
46
  import type { Authorizer } from "../../extensions/authorizer.js";
40
47
  import { newAuthorizeStep } from "../../pipeline/steps/authorize.js";
48
+ import { auditActorFor } from "../../pipeline/steps/defaults.js";
41
49
  import type { CallerIdentity } from "../../extensions/identity.js";
42
50
  import { RequestContext } from "../../pipeline/request-context.js";
43
51
  import { ResourceNotFoundError } from "../../store/interface.js";
@@ -160,9 +168,18 @@ export async function submitWorkflowTaskApproval(
160
168
  const humanInputSignalName =
161
169
  HUMAN_INPUT_SIGNAL_PREFIX + ctx.input.taskName;
162
170
 
171
+ const reviewer = auditActorFor(ctx.callerIdentity);
163
172
  const signalPayload: Record<string, JsonValue> = {
164
173
  outcome: ctx.input.outcome,
165
- reviewer: ctx.input.reviewer,
174
+ reviewer: reviewer.id,
175
+ // The runner's HumanInputReviewerActor keys (snake_case, as the
176
+ // rest of the payload); the actor's platform_client_id has no slot.
177
+ reviewer_actor: {
178
+ id: reviewer.id,
179
+ display_name: reviewer.displayName,
180
+ email: reviewer.email,
181
+ avatar: reviewer.avatar,
182
+ },
166
183
  // Go time.Now().UTC().Format(time.RFC3339): seconds precision.
167
184
  responded_at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
168
185
  };
@@ -204,6 +221,7 @@ export async function submitWorkflowTaskApproval(
204
221
  executionId,
205
222
  taskName: ctx.input.taskName,
206
223
  outcome: ctx.input.outcome,
224
+ reviewer: reviewer.id,
207
225
  signalName: humanInputSignalName,
208
226
  },
209
227
  );