@stigmer/server 3.21.0 → 3.22.1-dev.20260922095755

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 (383) hide show
  1. package/dist/authorization/authorizer.d.ts +4 -8
  2. package/dist/authorization/authorizer.d.ts.map +1 -1
  3. package/dist/authorization/authorizer.js +5 -9
  4. package/dist/authorization/authorizer.js.map +1 -1
  5. package/dist/authorization/derived-tuples.d.ts.map +1 -1
  6. package/dist/authorization/derived-tuples.js +10 -25
  7. package/dist/authorization/derived-tuples.js.map +1 -1
  8. package/dist/authorization/evaluator.d.ts +13 -8
  9. package/dist/authorization/evaluator.d.ts.map +1 -1
  10. package/dist/authorization/evaluator.js +4 -20
  11. package/dist/authorization/evaluator.js.map +1 -1
  12. package/dist/authorization/list-read-scope.d.ts.map +1 -1
  13. package/dist/authorization/list-read-scope.js +24 -20
  14. package/dist/authorization/list-read-scope.js.map +1 -1
  15. package/dist/authorization/model/agent.d.ts.map +1 -1
  16. package/dist/authorization/model/agent.js +4 -5
  17. package/dist/authorization/model/agent.js.map +1 -1
  18. package/dist/authorization/model/agent_instance.d.ts.map +1 -1
  19. package/dist/authorization/model/agent_instance.js +2 -2
  20. package/dist/authorization/model/agent_instance.js.map +1 -1
  21. package/dist/authorization/model/mcp_server.d.ts.map +1 -1
  22. package/dist/authorization/model/mcp_server.js +2 -2
  23. package/dist/authorization/model/mcp_server.js.map +1 -1
  24. package/dist/authorization/model/organization.d.ts.map +1 -1
  25. package/dist/authorization/model/organization.js +2 -0
  26. package/dist/authorization/model/organization.js.map +1 -1
  27. package/dist/authorization/model/plugin.d.ts.map +1 -1
  28. package/dist/authorization/model/plugin.js +3 -4
  29. package/dist/authorization/model/plugin.js.map +1 -1
  30. package/dist/authorization/model/rewrite.d.ts +8 -10
  31. package/dist/authorization/model/rewrite.d.ts.map +1 -1
  32. package/dist/authorization/model/rewrite.js +0 -3
  33. package/dist/authorization/model/rewrite.js.map +1 -1
  34. package/dist/authorization/model/skill.d.ts.map +1 -1
  35. package/dist/authorization/model/skill.js +2 -2
  36. package/dist/authorization/model/skill.js.map +1 -1
  37. package/dist/authorization/model/workflow.d.ts.map +1 -1
  38. package/dist/authorization/model/workflow.js +2 -2
  39. package/dist/authorization/model/workflow.js.map +1 -1
  40. package/dist/authorization/model/workflow_instance.d.ts.map +1 -1
  41. package/dist/authorization/model/workflow_instance.js +2 -2
  42. package/dist/authorization/model/workflow_instance.js.map +1 -1
  43. package/dist/authorization/organization-directory.d.ts.map +1 -1
  44. package/dist/authorization/organization-directory.js +2 -3
  45. package/dist/authorization/organization-directory.js.map +1 -1
  46. package/dist/authorization/store-test-kit.d.ts +0 -6
  47. package/dist/authorization/store-test-kit.d.ts.map +1 -1
  48. package/dist/authorization/store-test-kit.js +16 -62
  49. package/dist/authorization/store-test-kit.js.map +1 -1
  50. package/dist/authorization/tuples.d.ts +13 -32
  51. package/dist/authorization/tuples.d.ts.map +1 -1
  52. package/dist/authorization/tuples.js +3 -11
  53. package/dist/authorization/tuples.js.map +1 -1
  54. package/dist/domain/agent/controller.d.ts.map +1 -1
  55. package/dist/domain/agent/controller.js +6 -4
  56. package/dist/domain/agent/controller.js.map +1 -1
  57. package/dist/domain/agentchannel/controller.d.ts.map +1 -1
  58. package/dist/domain/agentchannel/controller.js +9 -2
  59. package/dist/domain/agentchannel/controller.js.map +1 -1
  60. package/dist/domain/agentchannel/steps.d.ts +19 -0
  61. package/dist/domain/agentchannel/steps.d.ts.map +1 -1
  62. package/dist/domain/agentchannel/steps.js +32 -0
  63. package/dist/domain/agentchannel/steps.js.map +1 -1
  64. package/dist/domain/agentexecution/controller.d.ts.map +1 -1
  65. package/dist/domain/agentexecution/controller.js +3 -1
  66. package/dist/domain/agentexecution/controller.js.map +1 -1
  67. package/dist/domain/agentinstance/controller.d.ts +5 -5
  68. package/dist/domain/agentinstance/controller.d.ts.map +1 -1
  69. package/dist/domain/agentinstance/controller.js +9 -5
  70. package/dist/domain/agentinstance/controller.js.map +1 -1
  71. package/dist/domain/agentinstance/steps.d.ts +43 -8
  72. package/dist/domain/agentinstance/steps.d.ts.map +1 -1
  73. package/dist/domain/agentinstance/steps.js +71 -8
  74. package/dist/domain/agentinstance/steps.js.map +1 -1
  75. package/dist/domain/agentshare/constants.d.ts +6 -11
  76. package/dist/domain/agentshare/constants.d.ts.map +1 -1
  77. package/dist/domain/agentshare/constants.js +8 -16
  78. package/dist/domain/agentshare/constants.js.map +1 -1
  79. package/dist/domain/agentshare/controller.d.ts.map +1 -1
  80. package/dist/domain/agentshare/controller.js +10 -2
  81. package/dist/domain/agentshare/controller.js.map +1 -1
  82. package/dist/domain/agentshare/steps.d.ts +61 -10
  83. package/dist/domain/agentshare/steps.d.ts.map +1 -1
  84. package/dist/domain/agentshare/steps.js +121 -117
  85. package/dist/domain/agentshare/steps.js.map +1 -1
  86. package/dist/domain/artifact/controller.js +21 -25
  87. package/dist/domain/artifact/controller.js.map +1 -1
  88. package/dist/domain/channelapp/controller.d.ts.map +1 -1
  89. package/dist/domain/channelapp/controller.js +2 -0
  90. package/dist/domain/channelapp/controller.js.map +1 -1
  91. package/dist/domain/environment/controller.d.ts.map +1 -1
  92. package/dist/domain/environment/controller.js +4 -3
  93. package/dist/domain/environment/controller.js.map +1 -1
  94. package/dist/domain/executioncontext/controller.d.ts.map +1 -1
  95. package/dist/domain/executioncontext/controller.js +4 -1
  96. package/dist/domain/executioncontext/controller.js.map +1 -1
  97. package/dist/domain/executioncontext/steps.d.ts.map +1 -1
  98. package/dist/domain/executioncontext/steps.js +2 -1
  99. package/dist/domain/executioncontext/steps.js.map +1 -1
  100. package/dist/domain/mcpserver/connect.d.ts.map +1 -1
  101. package/dist/domain/mcpserver/connect.js +8 -7
  102. package/dist/domain/mcpserver/connect.js.map +1 -1
  103. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  104. package/dist/domain/mcpserver/controller.js +5 -4
  105. package/dist/domain/mcpserver/controller.js.map +1 -1
  106. package/dist/domain/mcpserver/start-connect.d.ts.map +1 -1
  107. package/dist/domain/mcpserver/start-connect.js +8 -7
  108. package/dist/domain/mcpserver/start-connect.js.map +1 -1
  109. package/dist/domain/memory/controller.d.ts.map +1 -1
  110. package/dist/domain/memory/controller.js +6 -1
  111. package/dist/domain/memory/controller.js.map +1 -1
  112. package/dist/domain/memory/steps.d.ts +23 -0
  113. package/dist/domain/memory/steps.d.ts.map +1 -1
  114. package/dist/domain/memory/steps.js +35 -0
  115. package/dist/domain/memory/steps.js.map +1 -1
  116. package/dist/domain/oauthapp/controller.d.ts.map +1 -1
  117. package/dist/domain/oauthapp/controller.js +2 -0
  118. package/dist/domain/oauthapp/controller.js.map +1 -1
  119. package/dist/domain/plugin/controller.d.ts.map +1 -1
  120. package/dist/domain/plugin/controller.js +6 -27
  121. package/dist/domain/plugin/controller.js.map +1 -1
  122. package/dist/domain/plugin/push.d.ts +7 -5
  123. package/dist/domain/plugin/push.d.ts.map +1 -1
  124. package/dist/domain/plugin/push.js +8 -14
  125. package/dist/domain/plugin/push.js.map +1 -1
  126. package/dist/domain/schedule/controller.d.ts.map +1 -1
  127. package/dist/domain/schedule/controller.js +10 -2
  128. package/dist/domain/schedule/controller.js.map +1 -1
  129. package/dist/domain/schedule/steps.d.ts +19 -0
  130. package/dist/domain/schedule/steps.d.ts.map +1 -1
  131. package/dist/domain/schedule/steps.js +32 -0
  132. package/dist/domain/schedule/steps.js.map +1 -1
  133. package/dist/domain/session/controller.d.ts.map +1 -1
  134. package/dist/domain/session/controller.js +3 -2
  135. package/dist/domain/session/controller.js.map +1 -1
  136. package/dist/domain/session/steps.d.ts +8 -9
  137. package/dist/domain/session/steps.d.ts.map +1 -1
  138. package/dist/domain/session/steps.js +17 -21
  139. package/dist/domain/session/steps.js.map +1 -1
  140. package/dist/domain/skill/controller.d.ts.map +1 -1
  141. package/dist/domain/skill/controller.js +8 -19
  142. package/dist/domain/skill/controller.js.map +1 -1
  143. package/dist/domain/workflow/agent-call-references.d.ts +54 -0
  144. package/dist/domain/workflow/agent-call-references.d.ts.map +1 -0
  145. package/dist/domain/workflow/agent-call-references.js +97 -0
  146. package/dist/domain/workflow/agent-call-references.js.map +1 -0
  147. package/dist/domain/workflow/controller.d.ts.map +1 -1
  148. package/dist/domain/workflow/controller.js +44 -113
  149. package/dist/domain/workflow/controller.js.map +1 -1
  150. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -1
  151. package/dist/domain/workflow/validation/task-config-constraints.d.ts +10 -1
  152. package/dist/domain/workflow/validation/task-config-constraints.d.ts.map +1 -1
  153. package/dist/domain/workflow/validation/task-config-constraints.js +3 -2
  154. package/dist/domain/workflow/validation/task-config-constraints.js.map +1 -1
  155. package/dist/domain/workflow/version-resolution.d.ts +5 -0
  156. package/dist/domain/workflow/version-resolution.d.ts.map +1 -0
  157. package/dist/domain/workflow/version-resolution.js +113 -0
  158. package/dist/domain/workflow/version-resolution.js.map +1 -0
  159. package/dist/domain/workflowexecution/controller.d.ts.map +1 -1
  160. package/dist/domain/workflowexecution/controller.js +4 -2
  161. package/dist/domain/workflowexecution/controller.js.map +1 -1
  162. package/dist/domain/workflowinstance/controller.d.ts.map +1 -1
  163. package/dist/domain/workflowinstance/controller.js +9 -5
  164. package/dist/domain/workflowinstance/controller.js.map +1 -1
  165. package/dist/domain/workflowinstance/steps.d.ts +20 -0
  166. package/dist/domain/workflowinstance/steps.d.ts.map +1 -1
  167. package/dist/domain/workflowinstance/steps.js +39 -0
  168. package/dist/domain/workflowinstance/steps.js.map +1 -1
  169. package/dist/extensions/authorization-queries.d.ts +6 -5
  170. package/dist/extensions/authorization-queries.d.ts.map +1 -1
  171. package/dist/extensions/identity.d.ts +19 -0
  172. package/dist/extensions/identity.d.ts.map +1 -1
  173. package/dist/extensions/identity.js +22 -3
  174. package/dist/extensions/identity.js.map +1 -1
  175. package/dist/extensions/list-read-scope.d.ts +42 -8
  176. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  177. package/dist/extensions/list-read-scope.js +13 -2
  178. package/dist/extensions/list-read-scope.js.map +1 -1
  179. package/dist/extensions/resource-authorization.d.ts +3 -2
  180. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  181. package/dist/index.d.ts +1 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js.map +1 -1
  184. package/dist/pipeline/apiresource-meta.d.ts +12 -3
  185. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  186. package/dist/pipeline/apiresource-meta.js +21 -10
  187. package/dist/pipeline/apiresource-meta.js.map +1 -1
  188. package/dist/pipeline/steps/authorization-tuples.d.ts +9 -3
  189. package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
  190. package/dist/pipeline/steps/authorization-tuples.js +9 -11
  191. package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
  192. package/dist/pipeline/steps/authorize-resolved-target.d.ts +88 -0
  193. package/dist/pipeline/steps/authorize-resolved-target.d.ts.map +1 -0
  194. package/dist/pipeline/steps/authorize-resolved-target.js +36 -0
  195. package/dist/pipeline/steps/authorize-resolved-target.js.map +1 -0
  196. package/dist/pipeline/steps/authorize.d.ts +27 -0
  197. package/dist/pipeline/steps/authorize.d.ts.map +1 -1
  198. package/dist/pipeline/steps/authorize.js +49 -10
  199. package/dist/pipeline/steps/authorize.js.map +1 -1
  200. package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
  201. package/dist/pipeline/steps/guard-memory-capture.js +2 -1
  202. package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
  203. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  204. package/dist/pipeline/steps/guard-reserved-labels.js +6 -7
  205. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  206. package/dist/pipeline/steps/helpers.d.ts +9 -5
  207. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  208. package/dist/pipeline/steps/helpers.js +11 -15
  209. package/dist/pipeline/steps/helpers.js.map +1 -1
  210. package/dist/pipeline/steps/references.d.ts +178 -20
  211. package/dist/pipeline/steps/references.d.ts.map +1 -1
  212. package/dist/pipeline/steps/references.js +344 -43
  213. package/dist/pipeline/steps/references.js.map +1 -1
  214. package/dist/pipeline/steps/version-history.d.ts +11 -0
  215. package/dist/pipeline/steps/version-history.d.ts.map +1 -1
  216. package/dist/pipeline/steps/version-history.js +26 -0
  217. package/dist/pipeline/steps/version-history.js.map +1 -1
  218. package/dist/query/search/controller.js +0 -1
  219. package/dist/query/search/controller.js.map +1 -1
  220. package/dist/query/search/criteria.d.ts +1 -5
  221. package/dist/query/search/criteria.d.ts.map +1 -1
  222. package/dist/query/search/criteria.js +3 -13
  223. package/dist/query/search/criteria.js.map +1 -1
  224. package/dist/query/search/handler.d.ts +5 -4
  225. package/dist/query/search/handler.d.ts.map +1 -1
  226. package/dist/query/search/handler.js +7 -6
  227. package/dist/query/search/handler.js.map +1 -1
  228. package/dist/query/search/query-store.d.ts.map +1 -1
  229. package/dist/query/search/query-store.js +0 -2
  230. package/dist/query/search/query-store.js.map +1 -1
  231. package/dist/store/interface.d.ts +3 -6
  232. package/dist/store/interface.d.ts.map +1 -1
  233. package/dist/store/interface.js.map +1 -1
  234. package/dist/store/postgres/migrations.d.ts +3 -1
  235. package/dist/store/postgres/migrations.d.ts.map +1 -1
  236. package/dist/store/postgres/migrations.js +35 -1
  237. package/dist/store/postgres/migrations.js.map +1 -1
  238. package/dist/store/postgres/store.d.ts.map +1 -1
  239. package/dist/store/postgres/store.js +4 -9
  240. package/dist/store/postgres/store.js.map +1 -1
  241. package/dist/store/public-visibility-retired.d.ts +67 -0
  242. package/dist/store/public-visibility-retired.d.ts.map +1 -0
  243. package/dist/store/public-visibility-retired.js +55 -0
  244. package/dist/store/public-visibility-retired.js.map +1 -0
  245. package/dist/store/sqlite/migrations.d.ts +3 -1
  246. package/dist/store/sqlite/migrations.d.ts.map +1 -1
  247. package/dist/store/sqlite/migrations.js +36 -1
  248. package/dist/store/sqlite/migrations.js.map +1 -1
  249. package/dist/store/sqlite/store.d.ts.map +1 -1
  250. package/dist/store/sqlite/store.js +4 -8
  251. package/dist/store/sqlite/store.js.map +1 -1
  252. package/package.json +6 -6
  253. package/src/authorization/README.md +24 -26
  254. package/src/authorization/__tests__/authorizer.test.ts +10 -9
  255. package/src/authorization/__tests__/derived-tuples.test.ts +4 -11
  256. package/src/authorization/__tests__/evaluator.test.ts +14 -73
  257. package/src/authorization/__tests__/facts.test.ts +2 -2
  258. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +6 -98
  259. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +4 -61
  260. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +1 -21
  261. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +1 -25
  262. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +1 -3
  263. package/src/authorization/__tests__/list-read-scope.test.ts +41 -29
  264. package/src/authorization/__tests__/skip-lane-inventory.test.ts +160 -0
  265. package/src/authorization/__tests__/store-tests.test.ts +1 -6
  266. package/src/authorization/__tests__/tuples.test.ts +12 -11
  267. package/src/authorization/__tests__/wire-permissions.test.ts +5 -5
  268. package/src/authorization/authorizer.ts +4 -9
  269. package/src/authorization/derived-tuples.ts +14 -31
  270. package/src/authorization/evaluator.ts +15 -44
  271. package/src/authorization/list-read-scope.ts +27 -22
  272. package/src/authorization/model/__tests__/registry.test.ts +2 -0
  273. package/src/authorization/model/agent.ts +2 -5
  274. package/src/authorization/model/agent_instance.ts +0 -2
  275. package/src/authorization/model/mcp_server.ts +0 -2
  276. package/src/authorization/model/organization.ts +2 -0
  277. package/src/authorization/model/plugin.ts +1 -4
  278. package/src/authorization/model/rewrite.ts +8 -13
  279. package/src/authorization/model/skill.ts +0 -2
  280. package/src/authorization/model/workflow.ts +0 -2
  281. package/src/authorization/model/workflow_instance.ts +0 -2
  282. package/src/authorization/organization-directory.ts +1 -3
  283. package/src/authorization/store-test-kit.ts +16 -75
  284. package/src/authorization/tuples.ts +16 -39
  285. package/src/domain/agent/__tests__/agent.test.ts +11 -4
  286. package/src/domain/agent/controller.ts +17 -7
  287. package/src/domain/agentchannel/__tests__/agentchannel.test.ts +223 -48
  288. package/src/domain/agentchannel/__tests__/create-authorization.test.ts +58 -0
  289. package/src/domain/agentchannel/controller.ts +25 -1
  290. package/src/domain/agentchannel/steps.ts +40 -0
  291. package/src/domain/agentexecution/controller.ts +6 -1
  292. package/src/domain/agentinstance/__tests__/create-authorization.composed.test.ts +243 -0
  293. package/src/domain/agentinstance/__tests__/create-authorization.test.ts +144 -0
  294. package/src/domain/agentinstance/controller.ts +30 -17
  295. package/src/domain/agentinstance/steps.ts +82 -8
  296. package/src/domain/agentshare/__tests__/agentshare.test.ts +196 -172
  297. package/src/domain/agentshare/__tests__/create-authorization.test.ts +71 -0
  298. package/src/domain/agentshare/__tests__/member-audience.test.ts +113 -0
  299. package/src/domain/agentshare/constants.ts +14 -26
  300. package/src/domain/agentshare/controller.ts +27 -1
  301. package/src/domain/agentshare/steps.ts +168 -155
  302. package/src/domain/artifact/controller.ts +18 -22
  303. package/src/domain/channelapp/controller.ts +10 -0
  304. package/src/domain/environment/controller.ts +15 -8
  305. package/src/domain/executioncontext/__tests__/executioncontext.test.ts +1 -0
  306. package/src/domain/executioncontext/controller.ts +15 -1
  307. package/src/domain/executioncontext/steps.ts +2 -1
  308. package/src/domain/mcpserver/__tests__/mcpserver.test.ts +115 -28
  309. package/src/domain/mcpserver/__tests__/oauth-handshake.test.ts +53 -18
  310. package/src/domain/mcpserver/connect.ts +11 -10
  311. package/src/domain/mcpserver/controller.ts +19 -13
  312. package/src/domain/mcpserver/start-connect.ts +17 -11
  313. package/src/domain/memory/__tests__/create-authorization.test.ts +59 -0
  314. package/src/domain/memory/controller.ts +11 -0
  315. package/src/domain/memory/steps.ts +41 -0
  316. package/src/domain/oauthapp/controller.ts +10 -0
  317. package/src/domain/plugin/controller.ts +23 -44
  318. package/src/domain/plugin/push.ts +8 -16
  319. package/src/domain/schedule/__tests__/create-authorization.test.ts +58 -0
  320. package/src/domain/schedule/controller.ts +26 -1
  321. package/src/domain/schedule/steps.ts +45 -2
  322. package/src/domain/session/controller.ts +12 -4
  323. package/src/domain/session/steps.ts +24 -32
  324. package/src/domain/skill/controller.ts +24 -30
  325. package/src/domain/workflow/__tests__/agent-call-references.test.ts +222 -0
  326. package/src/domain/workflow/agent-call-references.ts +157 -0
  327. package/src/domain/workflow/controller.ts +86 -155
  328. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -1
  329. package/src/domain/workflow/validation/task-config-constraints.ts +7 -3
  330. package/src/domain/workflow/version-resolution.ts +166 -0
  331. package/src/domain/workflowexecution/controller.ts +7 -2
  332. package/src/domain/workflowinstance/__tests__/create-authorization.test.ts +109 -0
  333. package/src/domain/workflowinstance/controller.ts +25 -12
  334. package/src/domain/workflowinstance/steps.ts +49 -1
  335. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +32 -19
  336. package/src/extensions/__tests__/composed-support.ts +38 -4
  337. package/src/extensions/__tests__/extension-composition.test.ts +4 -4
  338. package/src/extensions/__tests__/identity.test.ts +44 -1
  339. package/src/extensions/__tests__/list-read-scope-composed.test.ts +96 -7
  340. package/src/extensions/__tests__/list-read-scope.test.ts +63 -0
  341. package/src/extensions/authorization-queries.ts +6 -5
  342. package/src/extensions/identity.ts +23 -5
  343. package/src/extensions/list-read-scope.ts +48 -8
  344. package/src/extensions/resource-authorization.ts +3 -5
  345. package/src/index.ts +0 -1
  346. package/src/pipeline/__tests__/supports-visibility.test.ts +112 -0
  347. package/src/pipeline/apiresource-meta.ts +21 -10
  348. package/src/pipeline/steps/__tests__/authorization-tuples.test.ts +18 -31
  349. package/src/pipeline/steps/__tests__/authorize-resolved-target.test.ts +285 -0
  350. package/src/pipeline/steps/__tests__/references.test.ts +703 -0
  351. package/src/pipeline/steps/authorization-tuples.ts +9 -11
  352. package/src/pipeline/steps/authorize-resolved-target.ts +129 -0
  353. package/src/pipeline/steps/authorize.ts +70 -13
  354. package/src/pipeline/steps/guard-memory-capture.ts +2 -1
  355. package/src/pipeline/steps/guard-reserved-labels.ts +6 -9
  356. package/src/pipeline/steps/helpers.ts +11 -15
  357. package/src/pipeline/steps/references.ts +578 -70
  358. package/src/pipeline/steps/version-history.ts +34 -0
  359. package/src/query/search/__tests__/criteria.test.ts +0 -4
  360. package/src/query/search/__tests__/query-store.test.ts +11 -40
  361. package/src/query/search/controller.ts +0 -1
  362. package/src/query/search/criteria.ts +0 -14
  363. package/src/query/search/handler.ts +6 -7
  364. package/src/query/search/query-store.ts +0 -2
  365. package/src/store/__tests__/public-visibility-retired.test.ts +127 -0
  366. package/src/store/__tests__/store-contract.ts +6 -51
  367. package/src/store/interface.ts +3 -6
  368. package/src/store/postgres/__tests__/migrations.test.ts +187 -6
  369. package/src/store/postgres/__tests__/store-contract.test.ts +0 -2
  370. package/src/store/postgres/migrations.ts +48 -1
  371. package/src/store/postgres/store.ts +4 -11
  372. package/src/store/public-visibility-retired.ts +119 -0
  373. package/src/store/sqlite/__tests__/migrations.test.ts +191 -5
  374. package/src/store/sqlite/migrations.ts +45 -1
  375. package/src/store/sqlite/store.ts +4 -10
  376. package/dist/pipeline/steps/visibility-gates.d.ts +0 -27
  377. package/dist/pipeline/steps/visibility-gates.d.ts.map +0 -1
  378. package/dist/pipeline/steps/visibility-gates.js +0 -139
  379. package/dist/pipeline/steps/visibility-gates.js.map +0 -1
  380. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +0 -98
  381. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +0 -52
  382. package/src/pipeline/steps/__tests__/visibility-gates.test.ts +0 -187
  383. package/src/pipeline/steps/visibility-gates.ts +0 -174
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Pins the AuthorizeResolvedTarget step's contract: a thin shell around the
3
+ * shared evaluation over the questions a PURE resolver names. Every target
4
+ * reaches the Authorizer as exactly the three fields of a check (never the
5
+ * copy); the questions are asked in the resolver's order and the first
6
+ * refusal answers; an empty list asks nothing; a throwing resolver surfaces
7
+ * as the chain's Internal, never as an admitted request; deny carries the
8
+ * target's copy, not-found the load-first NOT_FOUND, unavailable INTERNAL;
9
+ * the `internal` class alone skips, and a propagated in-process caller does
10
+ * not (that arm is a resolver's to model, never the step's). The step runs
11
+ * under the shared name by default and under a caller-supplied frozen name
12
+ * for the lanes that predate it.
13
+ *
14
+ * Also pins `loadedTargetAsMethod`: the reads' resolver asks the sibling
15
+ * `get` annotation about the LOADED row's id — the `get`'s kind,
16
+ * permission and byte-pinned copy, the loader's id — and is a no-op when
17
+ * that `get` is itself a skip, so a read by reference is never stricter
18
+ * than the read by id and never laxer. A missing loaded row is a thrown
19
+ * invariant, not an empty answer.
20
+ */
21
+ import { describe, expect, it } from "vitest";
22
+ import { create } from "@bufbuild/protobuf";
23
+ import { Code, ConnectError } from "@connectrpc/connect";
24
+
25
+ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
26
+ import { AgentQueryController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/query_pb";
27
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
28
+ import { ApiResourceReferenceSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
29
+ import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
30
+
31
+ import type {
32
+ Authorizer,
33
+ AuthzCheck,
34
+ AuthzDecision,
35
+ } from "../../../extensions/authorizer.js";
36
+ import { testCallerIdentity } from "../../__tests__/support.js";
37
+ import { RequestContext } from "../../request-context.js";
38
+ import {
39
+ AUTHORIZATION_UNAVAILABLE_MESSAGE,
40
+ type AuthorizationTarget,
41
+ } from "../authorize.js";
42
+ import {
43
+ AUTHORIZE_RESOLVED_TARGET_STEP,
44
+ loadedTargetAsMethod,
45
+ newAuthorizeResolvedTargetStep,
46
+ } from "../authorize-resolved-target.js";
47
+ import { TARGET_RESOURCE_KEY } from "../load-target.js";
48
+
49
+ function fakeAuthorizer(decide: (check: AuthzCheck) => AuthzDecision): {
50
+ authorizer: Authorizer;
51
+ checks: AuthzCheck[];
52
+ } {
53
+ const checks: AuthzCheck[] = [];
54
+ return {
55
+ checks,
56
+ authorizer: {
57
+ authorize(_caller, check) {
58
+ checks.push(check);
59
+ return Promise.resolve(decide(check));
60
+ },
61
+ },
62
+ };
63
+ }
64
+
65
+ const allow = (): AuthzDecision => ({ kind: "allow" });
66
+
67
+ async function captureError(
68
+ run: () => void | Promise<void>,
69
+ ): Promise<ConnectError> {
70
+ try {
71
+ await run();
72
+ } catch (error) {
73
+ return ConnectError.from(error);
74
+ }
75
+ throw new Error("expected the step to reject");
76
+ }
77
+
78
+ const ORG_QUESTION: AuthorizationTarget = {
79
+ permission: IamPermission.can_create_agent_instance,
80
+ resourceKind: ApiResourceKind.organization,
81
+ resourceId: "acme",
82
+ deniedMessage: "unauthorized to create agent instance in this organization",
83
+ };
84
+
85
+ const PARENT_QUESTION: AuthorizationTarget = {
86
+ permission: IamPermission.can_create_instance,
87
+ resourceKind: ApiResourceKind.agent,
88
+ resourceId: "agt_01parent",
89
+ deniedMessage: "You don't have permission to create instances of this agent",
90
+ };
91
+
92
+ function agentCtx(caller = testCallerIdentity()) {
93
+ return new RequestContext(
94
+ AgentSchema,
95
+ create(AgentSchema, { metadata: { name: "a", org: "acme" } }),
96
+ caller,
97
+ ApiResourceKind.agent,
98
+ );
99
+ }
100
+
101
+ describe("AuthorizeResolvedTarget — the step shell", () => {
102
+ it("runs under the shared name by default and under a frozen name when a folded lane supplies one", () => {
103
+ const { authorizer } = fakeAuthorizer(allow);
104
+ expect(newAuthorizeResolvedTargetStep(authorizer, () => []).name).toBe(
105
+ AUTHORIZE_RESOLVED_TARGET_STEP,
106
+ );
107
+ expect(
108
+ newAuthorizeResolvedTargetStep(
109
+ authorizer,
110
+ () => [],
111
+ "AuthorizeResolvedPlugin",
112
+ ).name,
113
+ ).toBe("AuthorizeResolvedPlugin");
114
+ });
115
+
116
+ it("asks nothing when the resolver answers an empty list", async () => {
117
+ const { authorizer, checks } = fakeAuthorizer(() => ({
118
+ kind: "deny",
119
+ reason: "would have refused",
120
+ }));
121
+ await newAuthorizeResolvedTargetStep(authorizer, () => []).execute(
122
+ agentCtx(),
123
+ );
124
+ expect(checks).toEqual([]);
125
+ });
126
+
127
+ it("asks each question in the resolver's order, as a bare check without the copy", async () => {
128
+ const { authorizer, checks } = fakeAuthorizer(allow);
129
+ await newAuthorizeResolvedTargetStep(authorizer, () => [
130
+ ORG_QUESTION,
131
+ PARENT_QUESTION,
132
+ ]).execute(agentCtx());
133
+ expect(checks).toEqual([
134
+ {
135
+ permission: IamPermission.can_create_agent_instance,
136
+ resourceKind: ApiResourceKind.organization,
137
+ resourceId: "acme",
138
+ },
139
+ {
140
+ permission: IamPermission.can_create_instance,
141
+ resourceKind: ApiResourceKind.agent,
142
+ resourceId: "agt_01parent",
143
+ },
144
+ ]);
145
+ });
146
+
147
+ it("the first refusal answers, with THAT question's copy, and later questions are never asked", async () => {
148
+ const { authorizer, checks } = fakeAuthorizer((check) =>
149
+ check.resourceKind === ApiResourceKind.organization
150
+ ? { kind: "deny", reason: "" }
151
+ : allow(),
152
+ );
153
+ const error = await captureError(() =>
154
+ newAuthorizeResolvedTargetStep(authorizer, () => [
155
+ ORG_QUESTION,
156
+ PARENT_QUESTION,
157
+ ]).execute(agentCtx()),
158
+ );
159
+ expect(error.code).toBe(Code.PermissionDenied);
160
+ expect(error.rawMessage).toBe(ORG_QUESTION.deniedMessage);
161
+ expect(checks).toHaveLength(1);
162
+ });
163
+
164
+ it("not-found answers the load-first NOT_FOUND for the target", async () => {
165
+ const { authorizer } = fakeAuthorizer(() => ({ kind: "not-found" }));
166
+ const error = await captureError(() =>
167
+ newAuthorizeResolvedTargetStep(authorizer, () => [
168
+ PARENT_QUESTION,
169
+ ]).execute(agentCtx()),
170
+ );
171
+ expect(error.code).toBe(Code.NotFound);
172
+ expect(error.rawMessage).toContain("agt_01parent");
173
+ });
174
+
175
+ it("unavailable is INTERNAL with the sanitized copy", async () => {
176
+ const { authorizer } = fakeAuthorizer(() => ({
177
+ kind: "unavailable",
178
+ cause: new Error("backend down"),
179
+ }));
180
+ const error = await captureError(() =>
181
+ newAuthorizeResolvedTargetStep(authorizer, () => [
182
+ PARENT_QUESTION,
183
+ ]).execute(agentCtx()),
184
+ );
185
+ expect(error.code).toBe(Code.Internal);
186
+ expect(error.rawMessage).toBe(AUTHORIZATION_UNAVAILABLE_MESSAGE);
187
+ });
188
+
189
+ it("a resolver that throws surfaces its error; a broken chain invariant never admits the request", async () => {
190
+ const { authorizer, checks } = fakeAuthorizer(allow);
191
+ await expect(
192
+ newAuthorizeResolvedTargetStep(authorizer, () => {
193
+ throw new Error("parent not found in context");
194
+ }).execute(agentCtx()),
195
+ ).rejects.toThrow("parent not found in context");
196
+ expect(checks).toEqual([]);
197
+ });
198
+
199
+ it("the internal class alone skips; a propagated in-process caller is still asked", async () => {
200
+ const denying = fakeAuthorizer(() => ({ kind: "deny", reason: "" }));
201
+ await newAuthorizeResolvedTargetStep(denying.authorizer, () => [
202
+ PARENT_QUESTION,
203
+ ]).execute(agentCtx(testCallerIdentity({ callerClass: "internal" })));
204
+ expect(denying.checks).toEqual([]);
205
+
206
+ const error = await captureError(() =>
207
+ newAuthorizeResolvedTargetStep(denying.authorizer, () => [
208
+ PARENT_QUESTION,
209
+ ]).execute(
210
+ agentCtx(
211
+ testCallerIdentity({ callerClass: "user", origin: "in-process" }),
212
+ ),
213
+ ),
214
+ );
215
+ expect(error.code).toBe(Code.PermissionDenied);
216
+ });
217
+ });
218
+
219
+ function referenceCtx(loaded?: unknown) {
220
+ const ctx = new RequestContext(
221
+ ApiResourceReferenceSchema,
222
+ create(ApiResourceReferenceSchema, { org: "acme", slug: "helper" }),
223
+ testCallerIdentity(),
224
+ ApiResourceKind.agent,
225
+ );
226
+ if (loaded !== undefined) {
227
+ ctx.set(TARGET_RESOURCE_KEY, loaded);
228
+ }
229
+ return ctx;
230
+ }
231
+
232
+ describe("loadedTargetAsMethod — a read by reference asks what its get asks", () => {
233
+ it("names the get annotation's kind, permission and copy on the LOADED row's id", async () => {
234
+ const { authorizer, checks } = fakeAuthorizer(() => ({
235
+ kind: "deny",
236
+ reason: "",
237
+ }));
238
+ const loaded = create(AgentSchema, {
239
+ metadata: { id: "agt_01loaded", name: "helper", org: "acme" },
240
+ });
241
+ const error = await captureError(() =>
242
+ newAuthorizeResolvedTargetStep(
243
+ authorizer,
244
+ loadedTargetAsMethod(AgentQueryController.method.get),
245
+ ).execute(referenceCtx(loaded)),
246
+ );
247
+ expect(checks).toEqual([
248
+ {
249
+ permission: IamPermission.can_view,
250
+ resourceKind: ApiResourceKind.agent,
251
+ resourceId: "agt_01loaded",
252
+ },
253
+ ]);
254
+ expect(error.code).toBe(Code.PermissionDenied);
255
+ expect(error.rawMessage).toBe("unauthorized to get agent");
256
+ });
257
+
258
+ it("is a no-op when the method it is keyed on is itself a skip — never stricter than the annotation it mirrors", async () => {
259
+ // Keyed on a skip descriptor (the reference RPC's own), the resolver
260
+ // answers nothing: the annotation, not the step, owns the skip arms.
261
+ const { authorizer, checks } = fakeAuthorizer(() => ({
262
+ kind: "deny",
263
+ reason: "",
264
+ }));
265
+ const loaded = create(AgentSchema, {
266
+ metadata: { id: "agt_01loaded", name: "helper", org: "acme" },
267
+ });
268
+ await newAuthorizeResolvedTargetStep(
269
+ authorizer,
270
+ loadedTargetAsMethod(AgentQueryController.method.getByReference),
271
+ ).execute(referenceCtx(loaded));
272
+ expect(checks).toEqual([]);
273
+ });
274
+
275
+ it("a missing loaded row is a thrown invariant, never an empty answer", async () => {
276
+ const { authorizer, checks } = fakeAuthorizer(allow);
277
+ await expect(
278
+ newAuthorizeResolvedTargetStep(
279
+ authorizer,
280
+ loadedTargetAsMethod(AgentQueryController.method.get),
281
+ ).execute(referenceCtx()),
282
+ ).rejects.toThrow(TARGET_RESOURCE_KEY);
283
+ expect(checks).toEqual([]);
284
+ });
285
+ });