@stigmer/server 3.22.1-dev.20260922095755 → 3.23.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 (330) hide show
  1. package/dist/artifactstorage/artifact-storage.d.ts +29 -31
  2. package/dist/artifactstorage/artifact-storage.d.ts.map +1 -1
  3. package/dist/artifactstorage/artifact-storage.js +5 -7
  4. package/dist/artifactstorage/artifact-storage.js.map +1 -1
  5. package/dist/artifactstorage/r2-storage.d.ts +12 -7
  6. package/dist/artifactstorage/r2-storage.d.ts.map +1 -1
  7. package/dist/artifactstorage/r2-storage.js +6 -14
  8. package/dist/artifactstorage/r2-storage.js.map +1 -1
  9. package/dist/authorization/authorizer.d.ts +8 -4
  10. package/dist/authorization/authorizer.d.ts.map +1 -1
  11. package/dist/authorization/authorizer.js +9 -5
  12. package/dist/authorization/authorizer.js.map +1 -1
  13. package/dist/authorization/derived-tuples.d.ts.map +1 -1
  14. package/dist/authorization/derived-tuples.js +25 -10
  15. package/dist/authorization/derived-tuples.js.map +1 -1
  16. package/dist/authorization/evaluator.d.ts +8 -7
  17. package/dist/authorization/evaluator.d.ts.map +1 -1
  18. package/dist/authorization/evaluator.js +20 -4
  19. package/dist/authorization/evaluator.js.map +1 -1
  20. package/dist/authorization/list-read-scope.d.ts.map +1 -1
  21. package/dist/authorization/list-read-scope.js +9 -5
  22. package/dist/authorization/list-read-scope.js.map +1 -1
  23. package/dist/authorization/model/agent.d.ts.map +1 -1
  24. package/dist/authorization/model/agent.js +5 -4
  25. package/dist/authorization/model/agent.js.map +1 -1
  26. package/dist/authorization/model/agent_instance.d.ts.map +1 -1
  27. package/dist/authorization/model/agent_instance.js +2 -2
  28. package/dist/authorization/model/agent_instance.js.map +1 -1
  29. package/dist/authorization/model/mcp_server.d.ts.map +1 -1
  30. package/dist/authorization/model/mcp_server.js +2 -2
  31. package/dist/authorization/model/mcp_server.js.map +1 -1
  32. package/dist/authorization/model/plugin.d.ts.map +1 -1
  33. package/dist/authorization/model/plugin.js +4 -3
  34. package/dist/authorization/model/plugin.js.map +1 -1
  35. package/dist/authorization/model/rewrite.d.ts +10 -8
  36. package/dist/authorization/model/rewrite.d.ts.map +1 -1
  37. package/dist/authorization/model/rewrite.js +3 -0
  38. package/dist/authorization/model/rewrite.js.map +1 -1
  39. package/dist/authorization/model/skill.d.ts.map +1 -1
  40. package/dist/authorization/model/skill.js +2 -2
  41. package/dist/authorization/model/skill.js.map +1 -1
  42. package/dist/authorization/model/workflow.d.ts.map +1 -1
  43. package/dist/authorization/model/workflow.js +2 -2
  44. package/dist/authorization/model/workflow.js.map +1 -1
  45. package/dist/authorization/model/workflow_instance.d.ts.map +1 -1
  46. package/dist/authorization/model/workflow_instance.js +2 -2
  47. package/dist/authorization/model/workflow_instance.js.map +1 -1
  48. package/dist/authorization/organization-directory.d.ts.map +1 -1
  49. package/dist/authorization/organization-directory.js +3 -2
  50. package/dist/authorization/organization-directory.js.map +1 -1
  51. package/dist/authorization/store-test-kit.d.ts +6 -0
  52. package/dist/authorization/store-test-kit.d.ts.map +1 -1
  53. package/dist/authorization/store-test-kit.js +62 -16
  54. package/dist/authorization/store-test-kit.js.map +1 -1
  55. package/dist/authorization/tuples.d.ts +32 -13
  56. package/dist/authorization/tuples.d.ts.map +1 -1
  57. package/dist/authorization/tuples.js +11 -3
  58. package/dist/authorization/tuples.js.map +1 -1
  59. package/dist/boot/compose.d.ts.map +1 -1
  60. package/dist/boot/compose.js +49 -24
  61. package/dist/boot/compose.js.map +1 -1
  62. package/dist/boot/config.d.ts +4 -3
  63. package/dist/boot/config.d.ts.map +1 -1
  64. package/dist/boot/config.js.map +1 -1
  65. package/dist/boot/skill-transfer-origin.d.ts +52 -0
  66. package/dist/boot/skill-transfer-origin.d.ts.map +1 -0
  67. package/dist/boot/skill-transfer-origin.js +54 -0
  68. package/dist/boot/skill-transfer-origin.js.map +1 -0
  69. package/dist/domain/agent/controller.d.ts.map +1 -1
  70. package/dist/domain/agent/controller.js +4 -4
  71. package/dist/domain/agent/controller.js.map +1 -1
  72. package/dist/domain/agentchannel/controller.d.ts.map +1 -1
  73. package/dist/domain/agentchannel/controller.js +1 -3
  74. package/dist/domain/agentchannel/controller.js.map +1 -1
  75. package/dist/domain/agentexecution/controller.d.ts.map +1 -1
  76. package/dist/domain/agentexecution/controller.js +1 -3
  77. package/dist/domain/agentexecution/controller.js.map +1 -1
  78. package/dist/domain/agentinstance/controller.d.ts.map +1 -1
  79. package/dist/domain/agentinstance/controller.js +4 -3
  80. package/dist/domain/agentinstance/controller.js.map +1 -1
  81. package/dist/domain/agentshare/constants.d.ts +11 -6
  82. package/dist/domain/agentshare/constants.d.ts.map +1 -1
  83. package/dist/domain/agentshare/constants.js +16 -8
  84. package/dist/domain/agentshare/constants.js.map +1 -1
  85. package/dist/domain/agentshare/controller.d.ts.map +1 -1
  86. package/dist/domain/agentshare/controller.js +1 -3
  87. package/dist/domain/agentshare/controller.js.map +1 -1
  88. package/dist/domain/agentshare/steps.d.ts +25 -18
  89. package/dist/domain/agentshare/steps.d.ts.map +1 -1
  90. package/dist/domain/agentshare/steps.js +142 -41
  91. package/dist/domain/agentshare/steps.js.map +1 -1
  92. package/dist/domain/environment/controller.d.ts.map +1 -1
  93. package/dist/domain/environment/controller.js +3 -2
  94. package/dist/domain/environment/controller.js.map +1 -1
  95. package/dist/domain/executioncontext/controller.d.ts.map +1 -1
  96. package/dist/domain/executioncontext/controller.js +1 -2
  97. package/dist/domain/executioncontext/controller.js.map +1 -1
  98. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  99. package/dist/domain/mcpserver/controller.js +4 -3
  100. package/dist/domain/mcpserver/controller.js.map +1 -1
  101. package/dist/domain/plugin/controller.d.ts +3 -7
  102. package/dist/domain/plugin/controller.d.ts.map +1 -1
  103. package/dist/domain/plugin/controller.js +11 -9
  104. package/dist/domain/plugin/controller.js.map +1 -1
  105. package/dist/domain/plugin/push.d.ts +5 -7
  106. package/dist/domain/plugin/push.d.ts.map +1 -1
  107. package/dist/domain/plugin/push.js +14 -8
  108. package/dist/domain/plugin/push.js.map +1 -1
  109. package/dist/domain/schedule/controller.d.ts.map +1 -1
  110. package/dist/domain/schedule/controller.js +1 -3
  111. package/dist/domain/schedule/controller.js.map +1 -1
  112. package/dist/domain/session/controller.d.ts.map +1 -1
  113. package/dist/domain/session/controller.js +2 -3
  114. package/dist/domain/session/controller.js.map +1 -1
  115. package/dist/domain/skill/constants.d.ts +26 -3
  116. package/dist/domain/skill/constants.d.ts.map +1 -1
  117. package/dist/domain/skill/constants.js +26 -3
  118. package/dist/domain/skill/constants.js.map +1 -1
  119. package/dist/domain/skill/controller.d.ts +6 -11
  120. package/dist/domain/skill/controller.d.ts.map +1 -1
  121. package/dist/domain/skill/controller.js +35 -22
  122. package/dist/domain/skill/controller.js.map +1 -1
  123. package/dist/domain/skill/push.d.ts +2 -2
  124. package/dist/domain/skill/push.d.ts.map +1 -1
  125. package/dist/domain/skill/push.js +2 -2
  126. package/dist/domain/skill/push.js.map +1 -1
  127. package/dist/domain/skill/transfer/handler.d.ts +17 -9
  128. package/dist/domain/skill/transfer/handler.d.ts.map +1 -1
  129. package/dist/domain/skill/transfer/handler.js +19 -8
  130. package/dist/domain/skill/transfer/handler.js.map +1 -1
  131. package/dist/domain/skill/transfer/slots.d.ts +26 -41
  132. package/dist/domain/skill/transfer/slots.d.ts.map +1 -1
  133. package/dist/domain/skill/transfer/slots.js +80 -87
  134. package/dist/domain/skill/transfer/slots.js.map +1 -1
  135. package/dist/domain/skill/transfer/staging.d.ts +48 -0
  136. package/dist/domain/skill/transfer/staging.d.ts.map +1 -0
  137. package/dist/domain/skill/transfer/staging.js +127 -0
  138. package/dist/domain/skill/transfer/staging.js.map +1 -0
  139. package/dist/domain/workflow/controller.d.ts.map +1 -1
  140. package/dist/domain/workflow/controller.js +6 -14
  141. package/dist/domain/workflow/controller.js.map +1 -1
  142. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -1
  143. package/dist/domain/workflow/validation/task-config-constraints.d.ts +1 -10
  144. package/dist/domain/workflow/validation/task-config-constraints.d.ts.map +1 -1
  145. package/dist/domain/workflow/validation/task-config-constraints.js +2 -3
  146. package/dist/domain/workflow/validation/task-config-constraints.js.map +1 -1
  147. package/dist/domain/workflowexecution/controller.d.ts.map +1 -1
  148. package/dist/domain/workflowexecution/controller.js +2 -4
  149. package/dist/domain/workflowexecution/controller.js.map +1 -1
  150. package/dist/domain/workflowinstance/controller.d.ts.map +1 -1
  151. package/dist/domain/workflowinstance/controller.js +4 -3
  152. package/dist/domain/workflowinstance/controller.js.map +1 -1
  153. package/dist/extensions/authorization-queries.d.ts +5 -6
  154. package/dist/extensions/authorization-queries.d.ts.map +1 -1
  155. package/dist/extensions/list-read-scope.d.ts +1 -1
  156. package/dist/extensions/resource-authorization.d.ts +2 -3
  157. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  158. package/dist/index.d.ts +3 -1
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +13 -0
  161. package/dist/index.js.map +1 -1
  162. package/dist/pipeline/apiresource-meta.d.ts +3 -12
  163. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  164. package/dist/pipeline/apiresource-meta.js +10 -21
  165. package/dist/pipeline/apiresource-meta.js.map +1 -1
  166. package/dist/pipeline/steps/authorization-tuples.d.ts +3 -9
  167. package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
  168. package/dist/pipeline/steps/authorization-tuples.js +11 -9
  169. package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
  170. package/dist/pipeline/steps/references.d.ts +20 -178
  171. package/dist/pipeline/steps/references.d.ts.map +1 -1
  172. package/dist/pipeline/steps/references.js +43 -344
  173. package/dist/pipeline/steps/references.js.map +1 -1
  174. package/dist/pipeline/steps/resolve-artifact-source.d.ts +11 -8
  175. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -1
  176. package/dist/pipeline/steps/resolve-artifact-source.js +8 -4
  177. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -1
  178. package/dist/pipeline/steps/visibility-gates.d.ts +27 -0
  179. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -0
  180. package/dist/pipeline/steps/visibility-gates.js +139 -0
  181. package/dist/pipeline/steps/visibility-gates.js.map +1 -0
  182. package/dist/query/search/controller.js +1 -0
  183. package/dist/query/search/controller.js.map +1 -1
  184. package/dist/query/search/criteria.d.ts +5 -1
  185. package/dist/query/search/criteria.d.ts.map +1 -1
  186. package/dist/query/search/criteria.js +13 -3
  187. package/dist/query/search/criteria.js.map +1 -1
  188. package/dist/query/search/handler.d.ts +4 -5
  189. package/dist/query/search/handler.d.ts.map +1 -1
  190. package/dist/query/search/handler.js +6 -7
  191. package/dist/query/search/handler.js.map +1 -1
  192. package/dist/query/search/query-store.d.ts.map +1 -1
  193. package/dist/query/search/query-store.js +2 -0
  194. package/dist/query/search/query-store.js.map +1 -1
  195. package/dist/store/interface.d.ts +6 -3
  196. package/dist/store/interface.d.ts.map +1 -1
  197. package/dist/store/interface.js.map +1 -1
  198. package/dist/store/postgres/migrations.d.ts +1 -3
  199. package/dist/store/postgres/migrations.d.ts.map +1 -1
  200. package/dist/store/postgres/migrations.js +1 -35
  201. package/dist/store/postgres/migrations.js.map +1 -1
  202. package/dist/store/postgres/store.d.ts.map +1 -1
  203. package/dist/store/postgres/store.js +9 -4
  204. package/dist/store/postgres/store.js.map +1 -1
  205. package/dist/store/sqlite/migrations.d.ts +1 -3
  206. package/dist/store/sqlite/migrations.d.ts.map +1 -1
  207. package/dist/store/sqlite/migrations.js +1 -36
  208. package/dist/store/sqlite/migrations.js.map +1 -1
  209. package/dist/store/sqlite/store.d.ts.map +1 -1
  210. package/dist/store/sqlite/store.js +8 -4
  211. package/dist/store/sqlite/store.js.map +1 -1
  212. package/package.json +6 -6
  213. package/src/artifactstorage/__tests__/artifact-storage.test.ts +36 -33
  214. package/src/artifactstorage/__tests__/r2-storage.test.ts +11 -13
  215. package/src/artifactstorage/artifact-storage.ts +37 -33
  216. package/src/artifactstorage/r2-storage.ts +6 -15
  217. package/src/authorization/README.md +26 -24
  218. package/src/authorization/__tests__/authorizer.test.ts +9 -10
  219. package/src/authorization/__tests__/derived-tuples.test.ts +11 -4
  220. package/src/authorization/__tests__/evaluator.test.ts +73 -14
  221. package/src/authorization/__tests__/facts.test.ts +2 -2
  222. package/src/authorization/__tests__/fixtures/fga/agent-instance-creation.fga.yaml +185 -0
  223. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +98 -6
  224. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  225. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +61 -4
  226. package/src/authorization/__tests__/fixtures/fga/mcp-server-authoring.fga.yaml +143 -0
  227. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +21 -1
  228. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +25 -1
  229. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  230. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +3 -1
  231. package/src/authorization/__tests__/list-read-scope.test.ts +17 -18
  232. package/src/authorization/__tests__/store-tests.test.ts +8 -1
  233. package/src/authorization/__tests__/tuples.test.ts +11 -12
  234. package/src/authorization/authorizer.ts +9 -4
  235. package/src/authorization/derived-tuples.ts +31 -14
  236. package/src/authorization/evaluator.ts +44 -8
  237. package/src/authorization/list-read-scope.ts +11 -5
  238. package/src/authorization/model/agent.ts +5 -2
  239. package/src/authorization/model/agent_instance.ts +2 -0
  240. package/src/authorization/model/mcp_server.ts +2 -0
  241. package/src/authorization/model/plugin.ts +4 -1
  242. package/src/authorization/model/rewrite.ts +13 -8
  243. package/src/authorization/model/skill.ts +2 -0
  244. package/src/authorization/model/workflow.ts +2 -0
  245. package/src/authorization/model/workflow_instance.ts +2 -0
  246. package/src/authorization/organization-directory.ts +3 -1
  247. package/src/authorization/store-test-kit.ts +75 -16
  248. package/src/authorization/tuples.ts +39 -16
  249. package/src/boot/__tests__/skill-transfer-origin.test.ts +72 -0
  250. package/src/boot/compose.ts +62 -25
  251. package/src/boot/config.ts +4 -3
  252. package/src/boot/skill-transfer-origin.ts +76 -0
  253. package/src/domain/agent/__tests__/agent.test.ts +4 -11
  254. package/src/domain/agent/controller.ts +7 -7
  255. package/src/domain/agentchannel/__tests__/agentchannel.test.ts +48 -223
  256. package/src/domain/agentchannel/controller.ts +1 -6
  257. package/src/domain/agentexecution/controller.ts +1 -6
  258. package/src/domain/agentinstance/controller.ts +12 -6
  259. package/src/domain/agentshare/__tests__/agentshare.test.ts +172 -196
  260. package/src/domain/agentshare/__tests__/create-authorization.test.ts +31 -16
  261. package/src/domain/agentshare/constants.ts +26 -14
  262. package/src/domain/agentshare/controller.ts +1 -6
  263. package/src/domain/agentshare/steps.ts +194 -41
  264. package/src/domain/environment/controller.ts +8 -5
  265. package/src/domain/executioncontext/controller.ts +1 -5
  266. package/src/domain/mcpserver/__tests__/mcpserver.test.ts +28 -115
  267. package/src/domain/mcpserver/__tests__/oauth-handshake.test.ts +18 -53
  268. package/src/domain/mcpserver/controller.ts +12 -6
  269. package/src/domain/plugin/controller.ts +23 -18
  270. package/src/domain/plugin/push.ts +16 -8
  271. package/src/domain/schedule/controller.ts +1 -6
  272. package/src/domain/session/controller.ts +4 -12
  273. package/src/domain/skill/__tests__/skill.test.ts +5 -3
  274. package/src/domain/skill/__tests__/slots.test.ts +113 -60
  275. package/src/domain/skill/__tests__/staging.test.ts +304 -0
  276. package/src/domain/skill/constants.ts +28 -3
  277. package/src/domain/skill/controller.ts +51 -35
  278. package/src/domain/skill/push.ts +3 -3
  279. package/src/domain/skill/transfer/handler.ts +33 -15
  280. package/src/domain/skill/transfer/slots.ts +89 -100
  281. package/src/domain/skill/transfer/staging.ts +191 -0
  282. package/src/domain/workflow/controller.ts +10 -28
  283. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -1
  284. package/src/domain/workflow/validation/task-config-constraints.ts +3 -7
  285. package/src/domain/workflowexecution/controller.ts +2 -7
  286. package/src/domain/workflowinstance/controller.ts +12 -6
  287. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +19 -32
  288. package/src/extensions/__tests__/extension-composition.test.ts +4 -4
  289. package/src/extensions/__tests__/list-read-scope-composed.test.ts +6 -9
  290. package/src/extensions/authorization-queries.ts +5 -6
  291. package/src/extensions/list-read-scope.ts +1 -1
  292. package/src/extensions/resource-authorization.ts +5 -3
  293. package/src/index.ts +14 -0
  294. package/src/pipeline/apiresource-meta.ts +10 -21
  295. package/src/pipeline/steps/__tests__/authorization-tuples.test.ts +31 -18
  296. package/src/pipeline/steps/__tests__/visibility-gates.test.ts +187 -0
  297. package/src/pipeline/steps/authorization-tuples.ts +11 -9
  298. package/src/pipeline/steps/references.ts +70 -578
  299. package/src/pipeline/steps/resolve-artifact-source.ts +20 -13
  300. package/src/pipeline/steps/visibility-gates.ts +174 -0
  301. package/src/query/search/__tests__/criteria.test.ts +4 -0
  302. package/src/query/search/__tests__/query-store.test.ts +40 -11
  303. package/src/query/search/controller.ts +1 -0
  304. package/src/query/search/criteria.ts +14 -0
  305. package/src/query/search/handler.ts +7 -6
  306. package/src/query/search/query-store.ts +2 -0
  307. package/src/store/__tests__/store-contract.ts +51 -6
  308. package/src/store/interface.ts +6 -3
  309. package/src/store/postgres/__tests__/migrations.test.ts +6 -187
  310. package/src/store/postgres/__tests__/store-contract.test.ts +2 -0
  311. package/src/store/postgres/migrations.ts +1 -48
  312. package/src/store/postgres/store.ts +11 -4
  313. package/src/store/sqlite/__tests__/migrations.test.ts +5 -191
  314. package/src/store/sqlite/migrations.ts +1 -45
  315. package/src/store/sqlite/store.ts +10 -4
  316. package/src/transport/registry/__tests__/lanes.test.ts +1 -1
  317. package/dist/domain/workflow/agent-call-references.d.ts +0 -54
  318. package/dist/domain/workflow/agent-call-references.d.ts.map +0 -1
  319. package/dist/domain/workflow/agent-call-references.js +0 -97
  320. package/dist/domain/workflow/agent-call-references.js.map +0 -1
  321. package/dist/store/public-visibility-retired.d.ts +0 -67
  322. package/dist/store/public-visibility-retired.d.ts.map +0 -1
  323. package/dist/store/public-visibility-retired.js +0 -55
  324. package/dist/store/public-visibility-retired.js.map +0 -1
  325. package/src/domain/workflow/__tests__/agent-call-references.test.ts +0 -222
  326. package/src/domain/workflow/agent-call-references.ts +0 -157
  327. package/src/pipeline/__tests__/supports-visibility.test.ts +0 -112
  328. package/src/pipeline/steps/__tests__/references.test.ts +0 -703
  329. package/src/store/__tests__/public-visibility-retired.test.ts +0 -127
  330. package/src/store/public-visibility-retired.ts +0 -119
@@ -0,0 +1,185 @@
1
+ # Pinned copy of stigmer-cloud backend/services/stigmer-server/fga/tests/agent-instance-creation.fga.yaml
2
+ # at commit 4c03c38d2 (the OpenFGA store test the cloud runs against its live model).
3
+ # The body below is byte-identical to the source; the cloud re-runs the LIVE
4
+ # file against this evaluator at the re-pin, so a stale copy is caught there.
5
+ # Store tests for agent-instance creation: two halves, asked together by
6
+ # the create since stigmer#1209 (v3.22.0). The agent half is the agent's
7
+ # can_create_instance (can_execute, so the viewer set: whoever may run the
8
+ # agent may instantiate it). The organization half is
9
+ # can_create_agent_instance: member on the organization the instance is
10
+ # created IN, which is the caller's own, not the agent's: a personal
11
+ # instance of another organization's public agent lives in the caller's
12
+ # organization (the marketplace case), so the agent's permission alone
13
+ # would let a row be planted in any organization named on the request.
14
+ #
15
+ # What these pin: owners, admins and members hold the organization half;
16
+ # a viewer-role account may run an org-visible agent (the agent half) and
17
+ # still lacks the organization half; a guest holds neither; an outsider
18
+ # holds neither; and the marketplace case passes on the caller's own
19
+ # organization while the agent half comes from the public wildcard.
20
+ #
21
+ # Run: fga model test --tests agent-instance-creation.fga.yaml
22
+
23
+ name: agent-instance-creation
24
+ model_file: ../model/fga.mod
25
+
26
+ tuples:
27
+ # Org acme: olivia owns it, oscar administers, dave is a plain member,
28
+ # vera a read-only viewer, greta the share-link guest account.
29
+ - user: identity_account:olivia
30
+ relation: owner
31
+ object: organization:acme
32
+ - user: identity_account:oscar
33
+ relation: admin
34
+ object: organization:acme
35
+ - user: identity_account:dave
36
+ relation: member
37
+ object: organization:acme
38
+ - user: identity_account:vera
39
+ relation: viewer
40
+ object: organization:acme
41
+ - user: identity_account:greta
42
+ relation: guest
43
+ object: organization:acme
44
+
45
+ # Org consumer: mia is a plain member there and holds no role in acme.
46
+ - user: identity_account:mia
47
+ relation: member
48
+ object: organization:consumer
49
+
50
+ # An ORG-visible agent in acme, authored by oscar.
51
+ - user: organization:acme
52
+ relation: organization
53
+ object: agent:team-bot
54
+ - user: identity_account:oscar
55
+ relation: owner
56
+ object: agent:team-bot
57
+ - user: organization:acme#viewer
58
+ relation: viewer
59
+ object: agent:team-bot
60
+
61
+ # A PRIVATE agent in acme, authored by oscar (no visibility tuple).
62
+ - user: organization:acme
63
+ relation: organization
64
+ object: agent:secret-bot
65
+ - user: identity_account:oscar
66
+ relation: owner
67
+ object: agent:secret-bot
68
+
69
+ # A PUBLIC marketplace agent in acme (the conditional wildcard plus the
70
+ # org floor tuple the visibility writer emits).
71
+ - user: organization:acme
72
+ relation: organization
73
+ object: agent:open-bot
74
+ - user: identity_account:oscar
75
+ relation: owner
76
+ object: agent:open-bot
77
+ - user: identity_account:*
78
+ relation: viewer
79
+ object: agent:open-bot
80
+ condition:
81
+ name: allow_public
82
+ context: {}
83
+ - user: organization:acme#viewer
84
+ relation: viewer
85
+ object: agent:open-bot
86
+
87
+ tests:
88
+ - name: owners, admins and members hold the organization half
89
+ check:
90
+ - user: identity_account:olivia
91
+ object: organization:acme
92
+ assertions:
93
+ can_create_agent_instance: true
94
+ - user: identity_account:oscar
95
+ object: organization:acme
96
+ assertions:
97
+ can_create_agent_instance: true
98
+ - user: identity_account:dave
99
+ object: organization:acme
100
+ assertions:
101
+ can_create_agent_instance: true
102
+
103
+ - name: a viewer, a guest and an outsider do not
104
+ check:
105
+ - user: identity_account:vera
106
+ object: organization:acme
107
+ assertions:
108
+ can_create_agent_instance: false
109
+ can_create_session: false
110
+ - user: identity_account:greta
111
+ object: organization:acme
112
+ assertions:
113
+ can_create_agent_instance: false
114
+ can_create_session: true
115
+ - user: identity_account:mia
116
+ object: organization:acme
117
+ assertions:
118
+ can_create_agent_instance: false
119
+
120
+ - name: a member instantiates an org-visible agent, both halves held
121
+ check:
122
+ - user: identity_account:dave
123
+ object: agent:team-bot
124
+ context:
125
+ allow: false
126
+ assertions:
127
+ can_create_instance: true
128
+ can_execute: true
129
+
130
+ - name: a viewer may run the org-visible agent and still cannot instantiate it here
131
+ check:
132
+ - user: identity_account:vera
133
+ object: agent:team-bot
134
+ context:
135
+ allow: false
136
+ assertions:
137
+ can_create_instance: true
138
+ - user: identity_account:vera
139
+ object: organization:acme
140
+ assertions:
141
+ can_create_agent_instance: false
142
+
143
+ - name: a private agent gives the agent half to its author and the admins only
144
+ check:
145
+ - user: identity_account:oscar
146
+ object: agent:secret-bot
147
+ context:
148
+ allow: false
149
+ assertions:
150
+ can_create_instance: true
151
+ - user: identity_account:olivia
152
+ object: agent:secret-bot
153
+ context:
154
+ allow: false
155
+ assertions:
156
+ can_create_instance: true
157
+ - user: identity_account:dave
158
+ object: agent:secret-bot
159
+ context:
160
+ allow: false
161
+ assertions:
162
+ can_create_instance: false
163
+ - user: identity_account:mia
164
+ object: agent:secret-bot
165
+ context:
166
+ allow: false
167
+ assertions:
168
+ can_create_instance: false
169
+
170
+ - name: the marketplace case, the agent half from the wildcard and the organization half at home
171
+ check:
172
+ - user: identity_account:mia
173
+ object: agent:open-bot
174
+ context:
175
+ allow: true
176
+ assertions:
177
+ can_create_instance: true
178
+ - user: identity_account:mia
179
+ object: organization:consumer
180
+ assertions:
181
+ can_create_agent_instance: true
182
+ - user: identity_account:mia
183
+ object: organization:acme
184
+ assertions:
185
+ can_create_agent_instance: false
@@ -1,5 +1,5 @@
1
1
  # Pinned copy of stigmer-cloud backend/services/stigmer-server/fga/tests/blueprint-private-visibility.fga.yaml
2
- # as changed by stigmer-cloud#765 (the OpenFGA store test the cloud runs against its live model).
2
+ # at commit 2ec420161 (the OpenFGA store test the cloud runs against its live model).
3
3
  # The body below is byte-identical to the source; the cloud re-runs the LIVE
4
4
  # file against this evaluator at the re-pin, so a stale copy is caught there.
5
5
  # Store tests for real blueprint privacy (Phase 3 of the visibility model).
@@ -14,6 +14,7 @@
14
14
  # viewers; pre-cloud#257 tuples carried #member, which excluded
15
15
  # viewer-role users — still honored until backfilled, see the
16
16
  # legacy-bot fixture)
17
+ # PUBLIC viewer@identity_account:* (allow_public) + the ORG tuple
17
18
  # PLATFORM platform_viewer@identity_provider:<idp>#platform_user + the ORG tuple
18
19
  #
19
20
  # Read vs spend: an org viewer-role user READS org-visible blueprints (and, at
@@ -22,8 +23,9 @@
22
23
  # can_create_execution_in permissions, which require member-or-guest. The
23
24
  # vera assertions pin both halves of that contract.
24
25
  #
25
- # The ORG tuple rides along on PLATFORM (the "org floor") so a shared
26
- # blueprint stays listable in its own org.
26
+ # The ORG tuple rides along on PUBLIC/PLATFORM (the "org floor") so a shared
27
+ # blueprint stays listable in its own org — org-scoped ListObjects runs with
28
+ # {"allow": false}, which suppresses the public wildcard.
27
29
  #
28
30
  # T08 exception: org ADMINS (and org owners, via the role hierarchy) are
29
31
  # composed into blueprint `owner` and therefore see, list, and manage
@@ -37,8 +39,8 @@
37
39
  # Scenario: org "acme" has owner-creator carol, org admin oscar, plain
38
40
  # member dave, and read-only viewer vera (the role SSO auto-provisioning
39
41
  # grants by default); mallory belongs to an unrelated org. Carol authors one
40
- # blueprint of each kind at PRIVATE, plus an ORG agent and a legacy ORG
41
- # agent whose tuple still carries the pre-cloud#257 shape.
42
+ # blueprint of each kind at PRIVATE, plus an ORG agent, a PUBLIC agent, and
43
+ # a legacy ORG agent whose tuple still carries the pre-cloud#257 shape.
42
44
  name: blueprint-private-visibility
43
45
  model_file: ../model/fga.mod
44
46
 
@@ -112,6 +114,22 @@ tuples:
112
114
  relation: viewer
113
115
  object: agent:legacy-bot
114
116
 
117
+ # --- PUBLIC agent (wildcard + org floor tuple) ---
118
+ - user: organization:acme
119
+ relation: organization
120
+ object: agent:open-bot
121
+ - user: identity_account:carol
122
+ relation: owner
123
+ object: agent:open-bot
124
+ - user: identity_account:*
125
+ relation: viewer
126
+ object: agent:open-bot
127
+ condition:
128
+ name: allow_public
129
+ - user: organization:acme#viewer
130
+ relation: viewer
131
+ object: agent:open-bot
132
+
115
133
  # --- PRIVATE agent with an explicit individual viewer grant ---
116
134
  - user: organization:acme
117
135
  relation: organization
@@ -128,6 +146,8 @@ tests:
128
146
  check:
129
147
  - user: identity_account:dave
130
148
  object: agent:secret-bot
149
+ context:
150
+ allow: false
131
151
  assertions:
132
152
  can_view: false
133
153
  can_execute: false
@@ -135,16 +155,22 @@ tests:
135
155
  can_clone: false
136
156
  - user: identity_account:dave
137
157
  object: skill:secret-notes
158
+ context:
159
+ allow: false
138
160
  assertions:
139
161
  can_view: false
140
162
  can_use: false
141
163
  - user: identity_account:dave
142
164
  object: workflow:secret-flow
165
+ context:
166
+ allow: false
143
167
  assertions:
144
168
  can_view: false
145
169
  can_execute: false
146
170
  - user: identity_account:dave
147
171
  object: mcp_server:secret-tools
172
+ context:
173
+ allow: false
148
174
  assertions:
149
175
  can_view: false
150
176
  can_use: false
@@ -154,6 +180,8 @@ tests:
154
180
  check:
155
181
  - user: identity_account:oscar
156
182
  object: agent:secret-bot
183
+ context:
184
+ allow: false
157
185
  assertions:
158
186
  can_view: true
159
187
  can_edit: true
@@ -161,11 +189,15 @@ tests:
161
189
  can_execute: true
162
190
  - user: identity_account:oscar
163
191
  object: skill:secret-notes
192
+ context:
193
+ allow: false
164
194
  assertions:
165
195
  can_view: true
166
196
  can_edit: true
167
197
  - user: identity_account:oscar
168
198
  object: workflow:secret-flow
199
+ context:
200
+ allow: false
169
201
  assertions:
170
202
  can_view: true
171
203
  can_edit: true
@@ -173,6 +205,8 @@ tests:
173
205
  # four private-blueprint kinds are pinned to the same rule.
174
206
  - user: identity_account:oscar
175
207
  object: mcp_server:secret-tools
208
+ context:
209
+ allow: false
176
210
  assertions:
177
211
  can_view: true
178
212
  can_edit: true
@@ -181,17 +215,22 @@ tests:
181
215
  list_objects:
182
216
  - user: identity_account:oscar
183
217
  type: agent
218
+ context:
219
+ allow: false
184
220
  assertions:
185
221
  can_view:
186
222
  - agent:secret-bot
187
223
  - agent:team-bot
188
224
  - agent:legacy-bot
225
+ - agent:open-bot
189
226
  - agent:shared-secret
190
227
 
191
228
  - name: owner retains full access to private blueprints
192
229
  check:
193
230
  - user: identity_account:carol
194
231
  object: agent:secret-bot
232
+ context:
233
+ allow: false
195
234
  assertions:
196
235
  can_view: true
197
236
  can_execute: true
@@ -200,6 +239,8 @@ tests:
200
239
  can_delete: true
201
240
  - user: identity_account:carol
202
241
  object: workflow:secret-flow
242
+ context:
243
+ allow: false
203
244
  assertions:
204
245
  can_view: true
205
246
  can_execute: true
@@ -209,6 +250,8 @@ tests:
209
250
  check:
210
251
  - user: identity_account:dave
211
252
  object: agent:team-bot
253
+ context:
254
+ allow: false
212
255
  assertions:
213
256
  can_view: true
214
257
  can_execute: true
@@ -217,10 +260,33 @@ tests:
217
260
  can_delete: false
218
261
  - user: identity_account:mallory
219
262
  object: agent:team-bot
263
+ context:
264
+ allow: false
220
265
  assertions:
221
266
  can_view: false
222
267
  can_execute: false
223
268
 
269
+ - name: public agent is reachable by everyone with allow context, and by org members without it
270
+ check:
271
+ # Outsider resolves through the conditional wildcard ({"allow": true}).
272
+ - user: identity_account:mallory
273
+ object: agent:open-bot
274
+ context:
275
+ allow: true
276
+ assertions:
277
+ can_view: true
278
+ can_execute: true
279
+ # Org member resolves through the org floor tuple even with the
280
+ # wildcard suppressed — this is what keeps public blueprints in
281
+ # org-scoped listings.
282
+ - user: identity_account:dave
283
+ object: agent:open-bot
284
+ context:
285
+ allow: false
286
+ assertions:
287
+ can_view: true
288
+ can_execute: true
289
+
224
290
  - name: explicit individual viewer grant on a private agent conveys view and run
225
291
  check:
226
292
  # Run-what-you-can-read: can_execute derives from viewer, so an
@@ -228,30 +294,38 @@ tests:
228
294
  # which checks can_view).
229
295
  - user: identity_account:dave
230
296
  object: agent:shared-secret
297
+ context:
298
+ allow: false
231
299
  assertions:
232
300
  can_view: true
233
301
  can_execute: true
234
302
  can_edit: false
235
303
 
236
- - name: org member's listable agents exclude private ones
304
+ - name: org member's listable agents exclude private ones (wildcard suppressed)
237
305
  list_objects:
238
306
  - user: identity_account:dave
239
307
  type: agent
308
+ context:
309
+ allow: false
240
310
  assertions:
241
311
  can_view:
242
312
  - agent:team-bot
243
313
  - agent:legacy-bot
314
+ - agent:open-bot
244
315
  - agent:shared-secret
245
316
 
246
317
  - name: owner's listable agents include everything they authored
247
318
  list_objects:
248
319
  - user: identity_account:carol
249
320
  type: agent
321
+ context:
322
+ allow: false
250
323
  assertions:
251
324
  can_view:
252
325
  - agent:secret-bot
253
326
  - agent:team-bot
254
327
  - agent:legacy-bot
328
+ - agent:open-bot
255
329
  - agent:shared-secret
256
330
 
257
331
  # ── cloud#257: the viewer-role cell (previously untested) ──────────────
@@ -262,16 +336,27 @@ tests:
262
336
  # spend refusal is pinned separately on the org permissions below.
263
337
  - user: identity_account:vera
264
338
  object: agent:team-bot
339
+ context:
340
+ allow: false
265
341
  assertions:
266
342
  can_view: true
267
343
  can_clone: true
268
344
  can_execute: true
269
345
  can_edit: false
270
346
  can_delete: false
347
+ # The org floor of a PUBLIC blueprint reaches viewers the same way.
348
+ - user: identity_account:vera
349
+ object: agent:open-bot
350
+ context:
351
+ allow: false
352
+ assertions:
353
+ can_view: true
271
354
  # Private stays private — the viewer role grants nothing beyond the
272
355
  # explicit visibility tuples.
273
356
  - user: identity_account:vera
274
357
  object: agent:secret-bot
358
+ context:
359
+ allow: false
275
360
  assertions:
276
361
  can_view: false
277
362
  can_execute: false
@@ -297,6 +382,8 @@ tests:
297
382
  check:
298
383
  - user: identity_account:dave
299
384
  object: agent:legacy-bot
385
+ context:
386
+ allow: false
300
387
  assertions:
301
388
  can_view: true
302
389
  can_execute: true
@@ -305,6 +392,8 @@ tests:
305
392
  # organization#member. The boot backfill converges these tuples.
306
393
  - user: identity_account:vera
307
394
  object: agent:legacy-bot
395
+ context:
396
+ allow: false
308
397
  assertions:
309
398
  can_view: false
310
399
  can_execute: false
@@ -313,6 +402,9 @@ tests:
313
402
  list_objects:
314
403
  - user: identity_account:vera
315
404
  type: agent
405
+ context:
406
+ allow: false
316
407
  assertions:
317
408
  can_view:
318
409
  - agent:team-bot
410
+ - agent:open-bot
@@ -0,0 +1,98 @@
1
+ # Pinned copy of stigmer-cloud backend/services/stigmer-server/fga/tests/cross-org-share-creation.fga.yaml
2
+ # at commit 2ec420161 (the OpenFGA store test the cloud runs against its live model).
3
+ # The body below is byte-identical to the source; the cloud re-runs the LIVE
4
+ # file against this evaluator at the re-pin, so a stale copy is caught there.
5
+ # Cross-org share creation, the FGA half of the decision 013 D2 consent
6
+ # bar. Creating a share of ANOTHER org's marketplace-public agent requires:
7
+ #
8
+ # 1. can_execute on the agent — granted to every authenticated account by
9
+ # the allow_public wildcard when the agent is public (checked here),
10
+ # and to nobody cross-org when it is not.
11
+ # 2. can_create_agent_share on the SHARE's own org — admin-level: a
12
+ # public share spends the org's credits on the open internet. The
13
+ # per-kind can_create_* pattern, one more row.
14
+ #
15
+ # The same-org bar (agent can_edit) is untouched and pinned by
16
+ # agent-share-owner.fga.yaml; the app-level halves of the contract
17
+ # (visibility check, audience rule, dependency sweep, agent-id pin) are
18
+ # handler logic outside FGA, pinned by the Java and Go unit tests.
19
+
20
+ name: cross-org-share-creation
21
+ model_file: ../model/fga.mod
22
+
23
+ tuples:
24
+ # provider-org publishes a marketplace-public agent (the conditional
25
+ # wildcard viewer tuple visibility_public writes).
26
+ - user: organization:provider-org
27
+ relation: organization
28
+ object: agent:public-helper
29
+ - user: identity_account:paula
30
+ relation: owner
31
+ object: agent:public-helper
32
+ - user: identity_account:*
33
+ relation: viewer
34
+ object: agent:public-helper
35
+ condition:
36
+ name: allow_public
37
+ context: {}
38
+
39
+ # A private agent in the same provider org — the wildcard is absent.
40
+ - user: organization:provider-org
41
+ relation: organization
42
+ object: agent:private-helper
43
+ - user: identity_account:paula
44
+ relation: owner
45
+ object: agent:private-helper
46
+
47
+ # consumer-org: an admin and a plain member.
48
+ - user: identity_account:adam
49
+ relation: admin
50
+ object: organization:consumer-org
51
+ - user: identity_account:mia
52
+ relation: member
53
+ object: organization:consumer-org
54
+
55
+ tests:
56
+ - name: consumer-org admin holds both halves of the cross-org bar
57
+ check:
58
+ - user: identity_account:adam
59
+ object: agent:public-helper
60
+ context:
61
+ allow: true
62
+ assertions:
63
+ can_execute: true
64
+ can_edit: false
65
+ - user: identity_account:adam
66
+ object: organization:consumer-org
67
+ assertions:
68
+ can_create_agent_share: true
69
+
70
+ - name: plain member lacks the org-side bar (spending is admin-level)
71
+ check:
72
+ - user: identity_account:mia
73
+ object: agent:public-helper
74
+ context:
75
+ allow: true
76
+ assertions:
77
+ can_execute: true
78
+ - user: identity_account:mia
79
+ object: organization:consumer-org
80
+ assertions:
81
+ can_create_agent_share: false
82
+
83
+ - name: nobody cross-org can execute a private agent
84
+ check:
85
+ - user: identity_account:adam
86
+ object: agent:private-helper
87
+ context:
88
+ allow: true
89
+ assertions:
90
+ can_execute: false
91
+ can_view: false
92
+
93
+ - name: the org-side bar does not leak across orgs
94
+ check:
95
+ - user: identity_account:paula
96
+ object: organization:consumer-org
97
+ assertions:
98
+ can_create_agent_share: false