@stigmer/server 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208

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 (570) hide show
  1. package/README.md +3 -3
  2. package/dist/archive/content-store.d.ts +35 -0
  3. package/dist/archive/content-store.d.ts.map +1 -0
  4. package/dist/archive/content-store.js +98 -0
  5. package/dist/archive/content-store.js.map +1 -0
  6. package/dist/archive/inflate.d.ts +22 -0
  7. package/dist/archive/inflate.d.ts.map +1 -0
  8. package/dist/archive/inflate.js +75 -0
  9. package/dist/archive/inflate.js.map +1 -0
  10. package/dist/archive/limits.d.ts +33 -0
  11. package/dist/archive/limits.d.ts.map +1 -0
  12. package/dist/archive/limits.js +31 -0
  13. package/dist/archive/limits.js.map +1 -0
  14. package/dist/archive/open.d.ts +24 -0
  15. package/dist/archive/open.d.ts.map +1 -0
  16. package/dist/archive/open.js +93 -0
  17. package/dist/archive/open.js.map +1 -0
  18. package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
  19. package/dist/archive/prefilter.d.ts.map +1 -0
  20. package/dist/archive/prefilter.js.map +1 -0
  21. package/dist/archive/write.d.ts +8 -0
  22. package/dist/archive/write.d.ts.map +1 -0
  23. package/dist/archive/write.js +44 -0
  24. package/dist/archive/write.js.map +1 -0
  25. package/dist/authorization/authorizer.d.ts +98 -0
  26. package/dist/authorization/authorizer.d.ts.map +1 -0
  27. package/dist/authorization/authorizer.js +156 -0
  28. package/dist/authorization/authorizer.js.map +1 -0
  29. package/dist/authorization/derived-tuples.d.ts +42 -0
  30. package/dist/authorization/derived-tuples.d.ts.map +1 -0
  31. package/dist/authorization/derived-tuples.js +240 -0
  32. package/dist/authorization/derived-tuples.js.map +1 -0
  33. package/dist/authorization/evaluator.d.ts +66 -0
  34. package/dist/authorization/evaluator.d.ts.map +1 -0
  35. package/dist/authorization/evaluator.js +153 -0
  36. package/dist/authorization/evaluator.js.map +1 -0
  37. package/dist/authorization/facts.d.ts +29 -0
  38. package/dist/authorization/facts.d.ts.map +1 -0
  39. package/dist/authorization/facts.js +17 -0
  40. package/dist/authorization/facts.js.map +1 -0
  41. package/dist/authorization/list-read-scope.d.ts +18 -0
  42. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  43. package/dist/authorization/list-read-scope.js +155 -0
  44. package/dist/authorization/list-read-scope.js.map +1 -0
  45. package/dist/authorization/model/agent.d.ts +2 -0
  46. package/dist/authorization/model/agent.d.ts.map +1 -0
  47. package/dist/authorization/model/agent.js +42 -0
  48. package/dist/authorization/model/agent.js.map +1 -0
  49. package/dist/authorization/model/agent_channel.d.ts +2 -0
  50. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  51. package/dist/authorization/model/agent_channel.js +38 -0
  52. package/dist/authorization/model/agent_channel.js.map +1 -0
  53. package/dist/authorization/model/agent_execution.d.ts +2 -0
  54. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_execution.js +25 -0
  56. package/dist/authorization/model/agent_execution.js.map +1 -0
  57. package/dist/authorization/model/agent_instance.d.ts +2 -0
  58. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_instance.js +47 -0
  60. package/dist/authorization/model/agent_instance.js.map +1 -0
  61. package/dist/authorization/model/agent_share.d.ts +2 -0
  62. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_share.js +29 -0
  64. package/dist/authorization/model/agent_share.js.map +1 -0
  65. package/dist/authorization/model/api_key.d.ts +2 -0
  66. package/dist/authorization/model/api_key.d.ts.map +1 -0
  67. package/dist/authorization/model/api_key.js +27 -0
  68. package/dist/authorization/model/api_key.js.map +1 -0
  69. package/dist/authorization/model/artifact.d.ts +2 -0
  70. package/dist/authorization/model/artifact.d.ts.map +1 -0
  71. package/dist/authorization/model/artifact.js +27 -0
  72. package/dist/authorization/model/artifact.js.map +1 -0
  73. package/dist/authorization/model/channel_app.d.ts +2 -0
  74. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  75. package/dist/authorization/model/channel_app.js +28 -0
  76. package/dist/authorization/model/channel_app.js.map +1 -0
  77. package/dist/authorization/model/default-of.d.ts +38 -0
  78. package/dist/authorization/model/default-of.d.ts.map +1 -0
  79. package/dist/authorization/model/default-of.js +39 -0
  80. package/dist/authorization/model/default-of.js.map +1 -0
  81. package/dist/authorization/model/environment.d.ts +2 -0
  82. package/dist/authorization/model/environment.d.ts.map +1 -0
  83. package/dist/authorization/model/environment.js +33 -0
  84. package/dist/authorization/model/environment.js.map +1 -0
  85. package/dist/authorization/model/execution_context.d.ts +2 -0
  86. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  87. package/dist/authorization/model/execution_context.js +19 -0
  88. package/dist/authorization/model/execution_context.js.map +1 -0
  89. package/dist/authorization/model/iam_policy.d.ts +2 -0
  90. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  91. package/dist/authorization/model/iam_policy.js +31 -0
  92. package/dist/authorization/model/iam_policy.js.map +1 -0
  93. package/dist/authorization/model/identity_account.d.ts +2 -0
  94. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  95. package/dist/authorization/model/identity_account.js +25 -0
  96. package/dist/authorization/model/identity_account.js.map +1 -0
  97. package/dist/authorization/model/index.d.ts +36 -0
  98. package/dist/authorization/model/index.d.ts.map +1 -0
  99. package/dist/authorization/model/index.js +72 -0
  100. package/dist/authorization/model/index.js.map +1 -0
  101. package/dist/authorization/model/mcp_server.d.ts +2 -0
  102. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  103. package/dist/authorization/model/mcp_server.js +37 -0
  104. package/dist/authorization/model/mcp_server.js.map +1 -0
  105. package/dist/authorization/model/memory.d.ts +2 -0
  106. package/dist/authorization/model/memory.d.ts.map +1 -0
  107. package/dist/authorization/model/memory.js +26 -0
  108. package/dist/authorization/model/memory.js.map +1 -0
  109. package/dist/authorization/model/oauth_app.d.ts +2 -0
  110. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  111. package/dist/authorization/model/oauth_app.js +30 -0
  112. package/dist/authorization/model/oauth_app.js.map +1 -0
  113. package/dist/authorization/model/organization.d.ts +2 -0
  114. package/dist/authorization/model/organization.d.ts.map +1 -0
  115. package/dist/authorization/model/organization.js +54 -0
  116. package/dist/authorization/model/organization.js.map +1 -0
  117. package/dist/authorization/model/plugin.d.ts +2 -0
  118. package/dist/authorization/model/plugin.d.ts.map +1 -0
  119. package/dist/authorization/model/plugin.js +44 -0
  120. package/dist/authorization/model/plugin.js.map +1 -0
  121. package/dist/authorization/model/project.d.ts +2 -0
  122. package/dist/authorization/model/project.d.ts.map +1 -0
  123. package/dist/authorization/model/project.js +32 -0
  124. package/dist/authorization/model/project.js.map +1 -0
  125. package/dist/authorization/model/rewrite.d.ts +127 -0
  126. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  127. package/dist/authorization/model/rewrite.js +82 -0
  128. package/dist/authorization/model/rewrite.js.map +1 -0
  129. package/dist/authorization/model/schedule.d.ts +2 -0
  130. package/dist/authorization/model/schedule.d.ts.map +1 -0
  131. package/dist/authorization/model/schedule.js +29 -0
  132. package/dist/authorization/model/schedule.js.map +1 -0
  133. package/dist/authorization/model/session.d.ts +2 -0
  134. package/dist/authorization/model/session.d.ts.map +1 -0
  135. package/dist/authorization/model/session.js +38 -0
  136. package/dist/authorization/model/session.js.map +1 -0
  137. package/dist/authorization/model/skill.d.ts +2 -0
  138. package/dist/authorization/model/skill.d.ts.map +1 -0
  139. package/dist/authorization/model/skill.js +38 -0
  140. package/dist/authorization/model/skill.js.map +1 -0
  141. package/dist/authorization/model/workflow.d.ts +2 -0
  142. package/dist/authorization/model/workflow.d.ts.map +1 -0
  143. package/dist/authorization/model/workflow.js +38 -0
  144. package/dist/authorization/model/workflow.js.map +1 -0
  145. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  146. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow_execution.js +32 -0
  148. package/dist/authorization/model/workflow_execution.js.map +1 -0
  149. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  150. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_instance.js +92 -0
  152. package/dist/authorization/model/workflow_instance.js.map +1 -0
  153. package/dist/authorization/organization-directory.d.ts +13 -0
  154. package/dist/authorization/organization-directory.d.ts.map +1 -0
  155. package/dist/authorization/organization-directory.js +83 -0
  156. package/dist/authorization/organization-directory.js.map +1 -0
  157. package/dist/authorization/person.d.ts +42 -0
  158. package/dist/authorization/person.d.ts.map +1 -0
  159. package/dist/authorization/person.js +19 -0
  160. package/dist/authorization/person.js.map +1 -0
  161. package/dist/authorization/posture.d.ts +38 -0
  162. package/dist/authorization/posture.d.ts.map +1 -0
  163. package/dist/authorization/posture.js +7 -0
  164. package/dist/authorization/posture.js.map +1 -0
  165. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  166. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  167. package/dist/authorization/schedule-fire-caller.js +67 -0
  168. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  169. package/dist/authorization/store-test-kit.d.ts +68 -0
  170. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  171. package/dist/authorization/store-test-kit.js +311 -0
  172. package/dist/authorization/store-test-kit.js.map +1 -0
  173. package/dist/authorization/tuples.d.ts +115 -0
  174. package/dist/authorization/tuples.d.ts.map +1 -0
  175. package/dist/authorization/tuples.js +83 -0
  176. package/dist/authorization/tuples.js.map +1 -0
  177. package/dist/boot/compose.d.ts.map +1 -1
  178. package/dist/boot/compose.js +157 -32
  179. package/dist/boot/compose.js.map +1 -1
  180. package/dist/boot/inprocess.d.ts +12 -0
  181. package/dist/boot/inprocess.d.ts.map +1 -1
  182. package/dist/boot/inprocess.js +62 -20
  183. package/dist/boot/inprocess.js.map +1 -1
  184. package/dist/domain/agent/controller.d.ts.map +1 -1
  185. package/dist/domain/agent/controller.js +9 -0
  186. package/dist/domain/agent/controller.js.map +1 -1
  187. package/dist/domain/iampolicy/constants.d.ts +11 -0
  188. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  189. package/dist/domain/iampolicy/constants.js +11 -0
  190. package/dist/domain/iampolicy/constants.js.map +1 -1
  191. package/dist/domain/iampolicy/membership.d.ts +72 -1
  192. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  193. package/dist/domain/iampolicy/membership.js +141 -56
  194. package/dist/domain/iampolicy/membership.js.map +1 -1
  195. package/dist/domain/identityaccount/actor.d.ts +26 -0
  196. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  197. package/dist/domain/identityaccount/actor.js +17 -0
  198. package/dist/domain/identityaccount/actor.js.map +1 -0
  199. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  200. package/dist/domain/mcpserver/controller.js +9 -0
  201. package/dist/domain/mcpserver/controller.js.map +1 -1
  202. package/dist/domain/plugin/archive.d.ts +37 -0
  203. package/dist/domain/plugin/archive.d.ts.map +1 -0
  204. package/dist/domain/plugin/archive.js +50 -0
  205. package/dist/domain/plugin/archive.js.map +1 -0
  206. package/dist/domain/plugin/constants.d.ts +38 -0
  207. package/dist/domain/plugin/constants.d.ts.map +1 -0
  208. package/dist/domain/plugin/constants.js +46 -0
  209. package/dist/domain/plugin/constants.js.map +1 -0
  210. package/dist/domain/plugin/controller.d.ts +25 -0
  211. package/dist/domain/plugin/controller.d.ts.map +1 -0
  212. package/dist/domain/plugin/controller.js +493 -0
  213. package/dist/domain/plugin/controller.js.map +1 -0
  214. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  215. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  216. package/dist/domain/plugin/materialize/agent.js +128 -0
  217. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  218. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  219. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  220. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  221. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  222. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  223. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  224. package/dist/domain/plugin/materialize/identity.js +40 -0
  225. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  226. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  227. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  228. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  229. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  230. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  231. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  232. package/dist/domain/plugin/materialize/plan.js +77 -0
  233. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  234. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  235. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  236. package/dist/domain/plugin/materialize/ports.js +2 -0
  237. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  238. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  239. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  240. package/dist/domain/plugin/materialize/skills.js +44 -0
  241. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  242. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  243. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/workflows.js +31 -0
  245. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  246. package/dist/domain/plugin/members.d.ts +42 -0
  247. package/dist/domain/plugin/members.d.ts.map +1 -0
  248. package/dist/domain/plugin/members.js +97 -0
  249. package/dist/domain/plugin/members.js.map +1 -0
  250. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  251. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  252. package/dist/domain/plugin/overlay/documents.js +38 -0
  253. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  254. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  255. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  256. package/dist/domain/plugin/overlay/parse.js +79 -0
  257. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  258. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  259. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  260. package/dist/domain/plugin/overlay/sanitize.js +101 -0
  261. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  262. package/dist/domain/plugin/push.d.ts +133 -0
  263. package/dist/domain/plugin/push.d.ts.map +1 -0
  264. package/dist/domain/plugin/push.js +800 -0
  265. package/dist/domain/plugin/push.js.map +1 -0
  266. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  267. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  268. package/dist/domain/plugin/search-extractor.js +41 -0
  269. package/dist/domain/plugin/search-extractor.js.map +1 -0
  270. package/dist/domain/skill/constants.d.ts +6 -11
  271. package/dist/domain/skill/constants.d.ts.map +1 -1
  272. package/dist/domain/skill/constants.js +6 -11
  273. package/dist/domain/skill/constants.js.map +1 -1
  274. package/dist/domain/skill/controller.d.ts.map +1 -1
  275. package/dist/domain/skill/controller.js +33 -30
  276. package/dist/domain/skill/controller.js.map +1 -1
  277. package/dist/domain/skill/push.d.ts +9 -10
  278. package/dist/domain/skill/push.d.ts.map +1 -1
  279. package/dist/domain/skill/push.js +53 -122
  280. package/dist/domain/skill/push.js.map +1 -1
  281. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  282. package/dist/domain/skill/search-extractor.js.map +1 -1
  283. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  284. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  285. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  286. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  287. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  288. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  289. package/dist/domain/skill/storage/zip-gate.js +56 -126
  290. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  291. package/dist/domain/skill/version-resolution.d.ts +5 -5
  292. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  293. package/dist/domain/skill/version-resolution.js +34 -216
  294. package/dist/domain/skill/version-resolution.js.map +1 -1
  295. package/dist/domain/workflow/controller.d.ts.map +1 -1
  296. package/dist/domain/workflow/controller.js +30 -3
  297. package/dist/domain/workflow/controller.js.map +1 -1
  298. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  299. package/dist/extensions/authorizer.d.ts +10 -5
  300. package/dist/extensions/authorizer.d.ts.map +1 -1
  301. package/dist/extensions/drivers.d.ts +4 -1
  302. package/dist/extensions/drivers.d.ts.map +1 -1
  303. package/dist/extensions/list-read-scope.d.ts +75 -11
  304. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  305. package/dist/extensions/list-read-scope.js +40 -7
  306. package/dist/extensions/list-read-scope.js.map +1 -1
  307. package/dist/extensions/organization-directory.d.ts +13 -9
  308. package/dist/extensions/organization-directory.d.ts.map +1 -1
  309. package/dist/extensions/organization-directory.js.map +1 -1
  310. package/dist/extensions/resource-authorization.d.ts +33 -0
  311. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  312. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  313. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  314. package/dist/extensions/schedule-fire-caller.js +12 -1
  315. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  316. package/dist/index.d.ts +10 -0
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +8 -0
  319. package/dist/index.js.map +1 -1
  320. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  321. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  322. package/dist/pipeline/apiresource-labels.js +20 -0
  323. package/dist/pipeline/apiresource-labels.js.map +1 -1
  324. package/dist/pipeline/apiresource-meta.d.ts +21 -0
  325. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  326. package/dist/pipeline/apiresource-meta.js +28 -0
  327. package/dist/pipeline/apiresource-meta.js.map +1 -1
  328. package/dist/pipeline/errors.d.ts.map +1 -1
  329. package/dist/pipeline/errors.js.map +1 -1
  330. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  331. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  332. package/dist/pipeline/steps/authorization-facts.js +100 -0
  333. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  334. package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
  335. package/dist/pipeline/steps/authorization-tuples.js +7 -26
  336. package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
  337. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  338. package/dist/pipeline/steps/delete.js +1 -1
  339. package/dist/pipeline/steps/delete.js.map +1 -1
  340. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  341. package/dist/pipeline/steps/duplicate.js.map +1 -1
  342. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  343. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  344. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  345. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  346. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  347. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  348. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  349. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  350. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  351. package/dist/pipeline/steps/helpers.js.map +1 -1
  352. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  353. package/dist/pipeline/steps/index-search.js.map +1 -1
  354. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  355. package/dist/pipeline/steps/load-existing.js +1 -1
  356. package/dist/pipeline/steps/load-existing.js.map +1 -1
  357. package/dist/pipeline/steps/references.d.ts +16 -0
  358. package/dist/pipeline/steps/references.d.ts.map +1 -1
  359. package/dist/pipeline/steps/references.js +18 -0
  360. package/dist/pipeline/steps/references.js.map +1 -1
  361. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  362. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  363. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  364. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  365. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  366. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  367. package/dist/pipeline/steps/shapes.d.ts +18 -0
  368. package/dist/pipeline/steps/shapes.d.ts.map +1 -1
  369. package/dist/pipeline/steps/shapes.js +29 -0
  370. package/dist/pipeline/steps/shapes.js.map +1 -1
  371. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  372. package/dist/pipeline/steps/slug.js.map +1 -1
  373. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  374. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  375. package/dist/pipeline/steps/validate-visibility.js +6 -1
  376. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  377. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  378. package/dist/pipeline/steps/validation.js.map +1 -1
  379. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  380. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  381. package/dist/pipeline/steps/version-archive.js +129 -0
  382. package/dist/pipeline/steps/version-archive.js.map +1 -0
  383. package/dist/pipeline/steps/version-history.d.ts +49 -0
  384. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  385. package/dist/pipeline/steps/version-history.js +229 -0
  386. package/dist/pipeline/steps/version-history.js.map +1 -0
  387. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  388. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  389. package/dist/pipeline/steps/visibility-gates.js +7 -2
  390. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  391. package/dist/query/search/registry.d.ts.map +1 -1
  392. package/dist/query/search/registry.js +2 -0
  393. package/dist/query/search/registry.js.map +1 -1
  394. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  395. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  396. package/dist/temporal/schedule/run-starter.js +14 -1
  397. package/dist/temporal/schedule/run-starter.js.map +1 -1
  398. package/package.json +5 -4
  399. package/src/archive/__tests__/archive.test.ts +233 -0
  400. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  401. package/src/archive/content-store.ts +132 -0
  402. package/src/archive/inflate.ts +107 -0
  403. package/src/archive/limits.ts +42 -0
  404. package/src/archive/open.ts +131 -0
  405. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  406. package/src/archive/write.ts +54 -0
  407. package/src/authorization/README.md +124 -0
  408. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  409. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  410. package/src/authorization/__tests__/drivers.ts +70 -0
  411. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  412. package/src/authorization/__tests__/facts.test.ts +155 -0
  413. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  414. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  415. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  416. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  417. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  418. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  419. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  420. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  421. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  422. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  423. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  424. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  425. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  426. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  427. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  428. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  429. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  430. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  431. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  432. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  433. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  434. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  435. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  436. package/src/authorization/__tests__/person.test.ts +114 -0
  437. package/src/authorization/__tests__/posture.test.ts +25 -0
  438. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  439. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  440. package/src/authorization/__tests__/support.ts +101 -0
  441. package/src/authorization/__tests__/tuples.test.ts +62 -0
  442. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  443. package/src/authorization/authorizer.ts +208 -0
  444. package/src/authorization/derived-tuples.ts +384 -0
  445. package/src/authorization/evaluator.ts +283 -0
  446. package/src/authorization/facts.ts +47 -0
  447. package/src/authorization/list-read-scope.ts +216 -0
  448. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  449. package/src/authorization/model/agent.ts +64 -0
  450. package/src/authorization/model/agent_channel.ts +49 -0
  451. package/src/authorization/model/agent_execution.ts +33 -0
  452. package/src/authorization/model/agent_instance.ts +66 -0
  453. package/src/authorization/model/agent_share.ts +40 -0
  454. package/src/authorization/model/api_key.ts +28 -0
  455. package/src/authorization/model/artifact.ts +38 -0
  456. package/src/authorization/model/channel_app.ts +39 -0
  457. package/src/authorization/model/default-of.ts +99 -0
  458. package/src/authorization/model/environment.ts +48 -0
  459. package/src/authorization/model/execution_context.ts +20 -0
  460. package/src/authorization/model/iam_policy.ts +42 -0
  461. package/src/authorization/model/identity_account.ts +26 -0
  462. package/src/authorization/model/index.ts +108 -0
  463. package/src/authorization/model/mcp_server.ts +59 -0
  464. package/src/authorization/model/memory.ts +27 -0
  465. package/src/authorization/model/oauth_app.ts +42 -0
  466. package/src/authorization/model/organization.ts +55 -0
  467. package/src/authorization/model/plugin.ts +66 -0
  468. package/src/authorization/model/project.ts +47 -0
  469. package/src/authorization/model/rewrite.ts +213 -0
  470. package/src/authorization/model/schedule.ts +40 -0
  471. package/src/authorization/model/session.ts +50 -0
  472. package/src/authorization/model/skill.ts +60 -0
  473. package/src/authorization/model/workflow.ts +60 -0
  474. package/src/authorization/model/workflow_execution.ts +44 -0
  475. package/src/authorization/model/workflow_instance.ts +122 -0
  476. package/src/authorization/organization-directory.ts +114 -0
  477. package/src/authorization/person.ts +68 -0
  478. package/src/authorization/posture.ts +49 -0
  479. package/src/authorization/schedule-fire-caller.ts +91 -0
  480. package/src/authorization/store-test-kit.ts +454 -0
  481. package/src/authorization/tuples.ts +190 -0
  482. package/src/boot/compose.ts +175 -38
  483. package/src/boot/inprocess.ts +108 -30
  484. package/src/domain/agent/controller.ts +11 -0
  485. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  486. package/src/domain/iampolicy/constants.ts +12 -0
  487. package/src/domain/iampolicy/membership.ts +221 -66
  488. package/src/domain/identityaccount/actor.ts +44 -0
  489. package/src/domain/mcpserver/controller.ts +11 -0
  490. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  491. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  492. package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
  493. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  494. package/src/domain/plugin/archive.ts +89 -0
  495. package/src/domain/plugin/constants.ts +53 -0
  496. package/src/domain/plugin/controller.ts +913 -0
  497. package/src/domain/plugin/materialize/agent.ts +186 -0
  498. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  499. package/src/domain/plugin/materialize/identity.ts +67 -0
  500. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  501. package/src/domain/plugin/materialize/plan.ts +124 -0
  502. package/src/domain/plugin/materialize/ports.ts +53 -0
  503. package/src/domain/plugin/materialize/skills.ts +68 -0
  504. package/src/domain/plugin/materialize/workflows.ts +51 -0
  505. package/src/domain/plugin/members.ts +180 -0
  506. package/src/domain/plugin/overlay/documents.ts +78 -0
  507. package/src/domain/plugin/overlay/parse.ts +115 -0
  508. package/src/domain/plugin/overlay/sanitize.ts +149 -0
  509. package/src/domain/plugin/push.ts +1062 -0
  510. package/src/domain/plugin/search-extractor.ts +60 -0
  511. package/src/domain/skill/constants.ts +11 -14
  512. package/src/domain/skill/controller.ts +44 -36
  513. package/src/domain/skill/push.ts +61 -156
  514. package/src/domain/skill/search-extractor.ts +3 -1
  515. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  516. package/src/domain/skill/storage/zip-gate.ts +58 -154
  517. package/src/domain/skill/version-resolution.ts +67 -269
  518. package/src/domain/workflow/controller.ts +38 -4
  519. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  520. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  521. package/src/extensions/__tests__/composed-support.ts +32 -1
  522. package/src/extensions/__tests__/extension-composition.test.ts +35 -0
  523. package/src/extensions/__tests__/list-read-scope.test.ts +245 -3
  524. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  525. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  526. package/src/extensions/authorizer.ts +10 -5
  527. package/src/extensions/drivers.ts +4 -1
  528. package/src/extensions/list-read-scope.ts +116 -16
  529. package/src/extensions/organization-directory.ts +13 -9
  530. package/src/extensions/resource-authorization.ts +34 -0
  531. package/src/extensions/schedule-fire-caller.ts +49 -18
  532. package/src/index.ts +51 -1
  533. package/src/pipeline/__tests__/inherited-authorization-parent.test.ts +51 -0
  534. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  535. package/src/pipeline/apiresource-labels.ts +31 -3
  536. package/src/pipeline/apiresource-meta.ts +37 -0
  537. package/src/pipeline/errors.ts +5 -5
  538. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  539. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
  540. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  541. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  542. package/src/pipeline/steps/authorization-facts.ts +131 -0
  543. package/src/pipeline/steps/authorization-tuples.ts +7 -28
  544. package/src/pipeline/steps/delete.ts +11 -3
  545. package/src/pipeline/steps/duplicate.ts +8 -2
  546. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  547. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  548. package/src/pipeline/steps/helpers.ts +4 -1
  549. package/src/pipeline/steps/index-search.ts +28 -15
  550. package/src/pipeline/steps/load-existing.ts +12 -3
  551. package/src/pipeline/steps/references.ts +36 -2
  552. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  553. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  554. package/src/pipeline/steps/shapes.ts +31 -0
  555. package/src/pipeline/steps/slug.ts +7 -2
  556. package/src/pipeline/steps/validate-visibility.ts +9 -2
  557. package/src/pipeline/steps/validation.ts +3 -1
  558. package/src/pipeline/steps/version-archive.ts +225 -0
  559. package/src/pipeline/steps/version-history.ts +362 -0
  560. package/src/pipeline/steps/visibility-gates.ts +12 -9
  561. package/src/query/README.md +1 -1
  562. package/src/query/search/__tests__/criteria.test.ts +6 -7
  563. package/src/query/search/__tests__/query-store.test.ts +9 -2
  564. package/src/query/search/__tests__/registry.test.ts +6 -4
  565. package/src/query/search/registry.ts +6 -1
  566. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  567. package/src/temporal/schedule/run-starter.ts +31 -8
  568. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  569. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  570. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Runs the cloud's own OpenFGA store tests against the built-in
3
+ * evaluator: the documents under fixtures/fga/ are pinned copies of
4
+ * stigmer-cloud's `fga/tests/*.fga.yaml` (each header names its source
5
+ * and commit), written by the model's authors and run against real
6
+ * OpenFGA in the cloud's CI. Every `check` assertion on a kind this
7
+ * edition declares must answer the same here — the proof that "the model
8
+ * evaluated over derived tuples" means the SAME model.
9
+ *
10
+ * What is not run is reported, never dropped: a check that targets a kind
11
+ * this edition does not serve, every `list_objects` assertion (the list
12
+ * scope's proof), and an assertion whose walk read a grant through a
13
+ * type this edition does not declare come back from the kit as a skipped
14
+ * set this file pins entry by entry, so a fixture that gains a scenario
15
+ * is a visible diff here and not a silently smaller proof. The second
16
+ * describe below pins the walk-dependent reason's own behaviour over a
17
+ * throwaway model, so the kit is proven and not only used.
18
+ *
19
+ * The cloud re-runs the LIVE documents through the same kit at the
20
+ * re-pin (the drift test's second table), which is what makes the pinned
21
+ * copies safe to hold.
22
+ */
23
+ import { readdirSync, readFileSync } from "node:fs";
24
+ import { fileURLToPath } from "node:url";
25
+
26
+ import yaml from "js-yaml";
27
+ import { describe, expect, it } from "vitest";
28
+
29
+ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
30
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
31
+
32
+ import { builtInModel, newModel } from "../model/index.js";
33
+ import {
34
+ computed,
35
+ declareKind,
36
+ direct,
37
+ objectOf,
38
+ union,
39
+ usersetOf,
40
+ } from "../model/rewrite.js";
41
+ import type { StoreTestDocument, StoreTestSkip } from "../store-test-kit.js";
42
+ import { parseStoreTestDocument, storeTestCases } from "../store-test-kit.js";
43
+
44
+ const FIXTURES = new URL("./fixtures/fga/", import.meta.url);
45
+
46
+ /**
47
+ * Every document the cloud's `fga/tests/` folder holds, by file name — the
48
+ * fixtures folder is a byte-exact mirror of it; a file added to either
49
+ * without a line here fails.
50
+ */
51
+ const DOCUMENTS = [
52
+ "agent-channel-owner.fga.yaml",
53
+ "agent-share-owner.fga.yaml",
54
+ "artifact-org-and-owner.fga.yaml",
55
+ "blueprint-private-visibility.fga.yaml",
56
+ "channel-app-owner.fga.yaml",
57
+ "channel-participation.fga.yaml",
58
+ "channel-session-visibility.fga.yaml",
59
+ "cross-org-share-creation.fga.yaml",
60
+ "default-instance-inheritance.fga.yaml",
61
+ "memory-subject-only.fga.yaml",
62
+ "org-admin-owner-inheritance.fga.yaml",
63
+ "org-shared-environment.fga.yaml",
64
+ "platform-visibility.fga.yaml",
65
+ "provider-standing-viewer.fga.yaml",
66
+ "public-visibility-setter.fga.yaml",
67
+ "reserved-label-writer.fga.yaml",
68
+ "schedule-owner.fga.yaml",
69
+ "schedule-session-visibility.fga.yaml",
70
+ "session-personal-resource.fga.yaml",
71
+ "workflow-execution-sharing.fga.yaml",
72
+ ] as const;
73
+
74
+ function skipLine(skip: StoreTestSkip): string {
75
+ const relation = skip.relation === undefined ? "" : ` ${skip.relation}`;
76
+ const types = skip.types === undefined ? "" : ` (${skip.types.join(", ")})`;
77
+ return `${skip.document} :: ${skip.test} :: ${skip.subject}${relation} ${skip.object} :: ${skip.reason}${types}`;
78
+ }
79
+
80
+ /**
81
+ * Every assertion the kit did not run, pinned, in the kit's three
82
+ * reasons. `list-objects` lines are the list scope's proof and run when
83
+ * it lands. `undeclared-kind` lines target `platform`, a kind this
84
+ * edition never serves (the driver refuses it before any evaluation).
85
+ * `undeclared-subject-type` lines are the checks whose walk read the
86
+ * cloud's platform-tenancy grant, `identity_provider:<idp>#platform_user`
87
+ * — a userset on a kind this edition does not declare, so the answer here
88
+ * (nobody) is not the oracle's and is not asserted; the cloud runs the
89
+ * same lines over its full model at the re-pin.
90
+ */
91
+ const SKIPPED_PINNED: ReadonlyArray<string> = [
92
+ // list-objects
93
+ "agent-channel-owner :: listing channels reflects ownership and grants, not membership :: identity_account:alice <agent_channel> :: list-objects",
94
+ "agent-channel-owner :: listing channels reflects ownership and grants, not membership :: identity_account:carol <agent_channel> :: list-objects",
95
+ "agent-channel-owner :: listing channels reflects ownership and grants, not membership :: identity_account:mallory <agent_channel> :: list-objects",
96
+ "agent-share-owner :: listing shares reflects ownership and grants, not membership :: identity_account:alice <agent_share> :: list-objects",
97
+ "agent-share-owner :: listing shares reflects ownership and grants, not membership :: identity_account:carol <agent_share> :: list-objects",
98
+ "agent-share-owner :: listing shares reflects ownership and grants, not membership :: identity_account:mallory <agent_share> :: list-objects",
99
+ "artifact-org-and-owner :: listing reflects org inheritance plus creator ownership :: identity_account:acme-guest <artifact> :: list-objects",
100
+ "artifact-org-and-owner :: listing reflects org inheritance plus creator ownership :: identity_account:eve <artifact> :: list-objects",
101
+ "artifact-org-and-owner :: listing reflects org inheritance plus creator ownership :: identity_account:victor <artifact> :: list-objects",
102
+ "blueprint-private-visibility :: org admin's listable agents include private ones (T08) :: identity_account:oscar <agent> :: list-objects",
103
+ "blueprint-private-visibility :: org member's listable agents exclude private ones (wildcard suppressed) :: identity_account:dave <agent> :: list-objects",
104
+ "blueprint-private-visibility :: org viewer's listable agents are exactly the viewer-shaped org-visible ones :: identity_account:vera <agent> :: list-objects",
105
+ "blueprint-private-visibility :: owner's listable agents include everything they authored :: identity_account:carol <agent> :: list-objects",
106
+ "channel-app-owner :: listing channel apps reflects ownership and grants, not membership :: identity_account:alice <channel_app> :: list-objects",
107
+ "channel-app-owner :: listing channel apps reflects ownership and grants, not membership :: identity_account:carol <channel_app> :: list-objects",
108
+ "channel-app-owner :: listing channel apps reflects ownership and grants, not membership :: identity_account:mallory <channel_app> :: list-objects",
109
+ "channel-participation :: list viewable and participable channels resolve per grant (drives listConversations) :: identity_account:carol <agent_channel> :: list-objects",
110
+ "channel-participation :: list viewable and participable channels resolve per grant (drives listConversations) :: identity_account:dave <agent_channel> :: list-objects",
111
+ "channel-participation :: list viewable and participable channels resolve per grant (drives listConversations) :: identity_account:trina <agent_channel> :: list-objects",
112
+ "channel-session-visibility :: list viewable sessions resolves the channel chain (drives listByChannel) :: identity_account:alice <session> :: list-objects",
113
+ "channel-session-visibility :: list viewable sessions resolves the channel chain (drives listByChannel) :: identity_account:bob <session> :: list-objects",
114
+ "channel-session-visibility :: list viewable sessions resolves the channel chain (drives listByChannel) :: identity_account:carol <session> :: list-objects",
115
+ "default-instance-inheritance :: list managed-org member's viewable agent instances resolves the default_of chain :: identity_account:alice <agent_instance> :: list-objects",
116
+ "memory-subject-only :: list-objects returns only the subject's own records :: identity_account:alice <memory> :: list-objects",
117
+ "memory-subject-only :: list-objects returns only the subject's own records :: identity_account:mallory <memory> :: list-objects",
118
+ "org-admin-owner-inheritance :: admin's listable resources include private blueprints, never personal kinds :: identity_account:ana <agent> :: list-objects",
119
+ "org-admin-owner-inheritance :: admin's listable resources include private blueprints, never personal kinds :: identity_account:ana <agent_instance> :: list-objects",
120
+ "org-admin-owner-inheritance :: admin's listable resources include private blueprints, never personal kinds :: identity_account:ana <session> :: list-objects",
121
+ "org-shared-environment :: org-members-can-list-shared-environments-only :: identity_account:dave <environment> :: list-objects",
122
+ "platform-visibility :: list managed-org member's viewable agents includes only the shared one :: identity_account:alice <agent> :: list-objects",
123
+ "schedule-owner :: listing schedules reflects ownership and grants, not membership :: identity_account:alice <schedule> :: list-objects",
124
+ "schedule-owner :: listing schedules reflects ownership and grants, not membership :: identity_account:carol <schedule> :: list-objects",
125
+ "schedule-owner :: listing schedules reflects ownership and grants, not membership :: identity_account:mallory <schedule> :: list-objects",
126
+ "schedule-session-visibility :: list viewable sessions resolves the schedule chain :: identity_account:alice <session> :: list-objects",
127
+ "schedule-session-visibility :: list viewable sessions resolves the schedule chain :: identity_account:bob <session> :: list-objects",
128
+ "schedule-session-visibility :: list viewable sessions resolves the schedule chain :: identity_account:carol <session> :: list-objects",
129
+ "workflow-execution-sharing :: list a teammate's viewable runs reflects both sharing axes :: identity_account:bob <workflow_execution> :: list-objects",
130
+ // undeclared-kind: platform
131
+ "provider-standing-viewer :: operator may view provider standing, tenants may not :: identity_account:mallory platform:stigmer :: undeclared-kind",
132
+ "provider-standing-viewer :: operator may view provider standing, tenants may not :: identity_account:opal platform:stigmer :: undeclared-kind",
133
+ "public-visibility-setter :: operators may set public visibility, tenants may not :: identity_account:machine platform:stigmer :: undeclared-kind",
134
+ "public-visibility-setter :: operators may set public visibility, tenants may not :: identity_account:mallory platform:stigmer :: undeclared-kind",
135
+ "public-visibility-setter :: operators may set public visibility, tenants may not :: identity_account:opal platform:stigmer :: undeclared-kind",
136
+ "reserved-label-writer :: operator may write reserved labels, tenants may not :: identity_account:machine platform:stigmer :: undeclared-kind",
137
+ "reserved-label-writer :: operator may write reserved labels, tenants may not :: identity_account:mallory platform:stigmer :: undeclared-kind",
138
+ // undeclared-subject-type: identity_provider#platform_user
139
+ "default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared agent :: identity_account:alice can_execute agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
140
+ "default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared agent :: identity_account:alice can_view agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
141
+ "default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared workflow :: identity_account:alice can_execute workflow_instance:onboarding-default :: undeclared-subject-type (identity_provider)",
142
+ "default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared workflow :: identity_account:alice can_view workflow_instance:onboarding-default :: undeclared-subject-type (identity_provider)",
143
+ "default-instance-inheritance :: outsiders get nothing from the default_of link :: identity_account:mallory can_execute agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
144
+ "default-instance-inheritance :: outsiders get nothing from the default_of link :: identity_account:mallory can_view agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
145
+ "platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:alice can_create_instance agent:sara :: undeclared-subject-type (identity_provider)",
146
+ "platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:alice can_execute agent:sara :: undeclared-subject-type (identity_provider)",
147
+ "platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:alice can_view agent:sara :: undeclared-subject-type (identity_provider)",
148
+ "platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:bob can_execute agent:sara :: undeclared-subject-type (identity_provider)",
149
+ "platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:bob can_view agent:sara :: undeclared-subject-type (identity_provider)",
150
+ "platform-visibility :: outsiders and unrelated orgs get nothing from platform visibility :: identity_account:mallory can_create_instance agent:sara :: undeclared-subject-type (identity_provider)",
151
+ "platform-visibility :: outsiders and unrelated orgs get nothing from platform visibility :: identity_account:mallory can_execute agent:sara :: undeclared-subject-type (identity_provider)",
152
+ "platform-visibility :: outsiders and unrelated orgs get nothing from platform visibility :: identity_account:mallory can_view agent:sara :: undeclared-subject-type (identity_provider)",
153
+ "platform-visibility :: platform-shared mcp_server is usable by managed-org members :: identity_account:alice can_connect mcp_server:github :: undeclared-subject-type (identity_provider)",
154
+ "platform-visibility :: platform-shared mcp_server is usable by managed-org members :: identity_account:alice can_use mcp_server:github :: undeclared-subject-type (identity_provider)",
155
+ "platform-visibility :: platform-shared mcp_server is usable by managed-org members :: identity_account:alice can_view mcp_server:github :: undeclared-subject-type (identity_provider)",
156
+ "platform-visibility :: platform-shared skill is usable by managed-org members :: identity_account:alice can_use skill:research :: undeclared-subject-type (identity_provider)",
157
+ "platform-visibility :: platform-shared skill is usable by managed-org members :: identity_account:alice can_view skill:research :: undeclared-subject-type (identity_provider)",
158
+ "platform-visibility :: platform-shared workflow is viewable and executable by managed-org members :: identity_account:alice can_execute workflow:onboarding :: undeclared-subject-type (identity_provider)",
159
+ "platform-visibility :: platform-shared workflow is viewable and executable by managed-org members :: identity_account:alice can_view workflow:onboarding :: undeclared-subject-type (identity_provider)",
160
+ ];
161
+
162
+ describe("the cloud's OpenFGA store tests over the built-in evaluator", () => {
163
+ it("the fixtures folder holds exactly the documents this file pins", () => {
164
+ expect(
165
+ readdirSync(FIXTURES)
166
+ .filter((name) => name.endsWith(".fga.yaml"))
167
+ .sort(),
168
+ ).toEqual([...DOCUMENTS]);
169
+ });
170
+
171
+ const kits = DOCUMENTS.map((name) => {
172
+ const document = parseStoreTestDocument(
173
+ yaml.load(readFileSync(fileURLToPath(new URL(name, FIXTURES)), "utf8")),
174
+ name,
175
+ );
176
+ return { document, kit: storeTestCases(document, builtInModel) };
177
+ });
178
+
179
+ for (const { document, kit } of kits) {
180
+ if (kit.cases.length === 0) {
181
+ // Every check targets a kind this edition does not declare (the
182
+ // platform documents); reported as skipped, pinned below.
183
+ it.skip(`${document.name}: no check targets a declared kind`, () => {});
184
+ continue;
185
+ }
186
+ describe(document.name, () => {
187
+ for (const storeTestCase of kit.cases) {
188
+ it(storeTestCase.name, storeTestCase.run);
189
+ }
190
+ });
191
+ }
192
+
193
+ // Declared after every case: a kit's `skipped` is complete once its
194
+ // cases have run (the walk-dependent reason is decided per assertion).
195
+ it("reports every assertion it did not run, and the list is the pinned one", () => {
196
+ const skipped = kits.flatMap(({ kit }) => kit.skipped.map(skipLine));
197
+ expect(skipped.sort()).toEqual([...SKIPPED_PINNED].sort());
198
+ });
199
+ });
200
+
201
+ /**
202
+ * The kit's walk-dependent skip, proven over a throwaway model shaped
203
+ * like a blueprint whose `viewer` line reads, in order, a direct person,
204
+ * `owner`, then a userset on a type the model does not declare — the
205
+ * platform-tenancy shape — so each arm below settles at a different point
206
+ * of the union.
207
+ */
208
+ describe("the kit skips an assertion whose walk read a type the model does not declare", () => {
209
+ const model = newModel([
210
+ declareKind({
211
+ kind: ApiResourceKind.agent,
212
+ schema: AgentSchema,
213
+ source: "fga/model/agentic/agent.fga",
214
+ relations: [
215
+ ["owner", direct(objectOf("identity_account"))],
216
+ [
217
+ "platform_viewer",
218
+ direct(usersetOf("identity_provider", "platform_user")),
219
+ ],
220
+ [
221
+ "viewer",
222
+ union(
223
+ direct(objectOf("identity_account")),
224
+ computed("owner"),
225
+ computed("platform_viewer"),
226
+ ),
227
+ ],
228
+ ["can_view", computed("viewer")],
229
+ ["can_edit", computed("owner")],
230
+ ],
231
+ }),
232
+ ]);
233
+
234
+ const document: StoreTestDocument = {
235
+ name: "throwaway",
236
+ tuples: [
237
+ { user: "identity_account:carol", relation: "owner", object: "agent:a" },
238
+ {
239
+ user: "identity_provider:idp#platform_user",
240
+ relation: "platform_viewer",
241
+ object: "agent:a",
242
+ },
243
+ { user: "identity_account:carol", relation: "owner", object: "agent:b" },
244
+ ],
245
+ tests: [
246
+ {
247
+ name: "arms",
248
+ check: [
249
+ // The owner: `viewer` settles on the direct line; `can_edit` never reads platform_viewer.
250
+ {
251
+ user: "identity_account:carol",
252
+ object: "agent:a",
253
+ assertions: { can_view: true, can_edit: true },
254
+ },
255
+ // A stranger: the union walks to platform_viewer and reads the undeclared userset.
256
+ {
257
+ user: "identity_account:mallory",
258
+ object: "agent:a",
259
+ assertions: { can_view: false, can_edit: false },
260
+ },
261
+ // No such tuple on this object: the same stranger's walk reads nothing undeclared.
262
+ {
263
+ user: "identity_account:mallory",
264
+ object: "agent:b",
265
+ assertions: { can_view: false },
266
+ },
267
+ ],
268
+ list_objects: [],
269
+ },
270
+ ],
271
+ };
272
+
273
+ it("runs the arms the walk settles before the undeclared type, skips exactly the one that read it — whatever it would have answered", async () => {
274
+ const kit = storeTestCases(document, model);
275
+ expect(kit.skipped).toEqual([]);
276
+ for (const storeTestCase of kit.cases) {
277
+ await storeTestCase.run();
278
+ }
279
+ expect(kit.skipped.map(skipLine)).toEqual([
280
+ "throwaway :: arms :: identity_account:mallory can_view agent:a :: undeclared-subject-type (identity_provider)",
281
+ ]);
282
+ });
283
+
284
+ it("asserts the arms it runs: a wrong expectation on a settled arm still fails", async () => {
285
+ const wrong: StoreTestDocument = {
286
+ ...document,
287
+ tests: [
288
+ {
289
+ name: "wrong",
290
+ check: [
291
+ {
292
+ user: "identity_account:carol",
293
+ object: "agent:a",
294
+ assertions: { can_edit: false },
295
+ },
296
+ ],
297
+ list_objects: [],
298
+ },
299
+ ],
300
+ };
301
+ const kit = storeTestCases(wrong, model);
302
+ await expect(kit.cases[0]?.run()).rejects.toThrow(
303
+ /expected false, got true/,
304
+ );
305
+ });
306
+ });
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Fixtures the authorization module's tests share: a stored row of any
3
+ * declared kind with the facts the derivation reads set through the
4
+ * kind's own schema — every resource carries `metadata` of the one shared
5
+ * type and its audit under `status.audit`, so one builder serves every
6
+ * declaration.
7
+ *
8
+ * A row's parent fields are filled from `kind_meta` itself: for the
9
+ * kind's scope parent and every additional parent, the spec field the
10
+ * config names gets `<parentKind>-1`, resolved to the field's generated
11
+ * name through the schema descriptor (the reflection idiom
12
+ * pipeline/steps/shapes.ts documents) so this file keeps no copy of the
13
+ * config and no name transform of its own. A well-formed row for every
14
+ * kind is what the create-time resolver demands (it throws on a missing
15
+ * parent), which is what lets the parity pin run over all of them.
16
+ * `spec` and `status` overrides sit on top for the arms that need a
17
+ * pointer or a level set.
18
+ */
19
+ import { create } from "@bufbuild/protobuf";
20
+ import type { DescMessage, Message } from "@bufbuild/protobuf";
21
+
22
+ import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
23
+
24
+ import {
25
+ getKindEnum,
26
+ getKindMeta,
27
+ kindEnumName,
28
+ } from "../../pipeline/apiresource-meta.js";
29
+ import type { KindDeclaration } from "../model/rewrite.js";
30
+
31
+ export interface FixtureRowFacts {
32
+ readonly id: string;
33
+ readonly org: string;
34
+ readonly visibility: ApiResourceVisibility;
35
+ readonly createdBy: string;
36
+ /** Spec fields set over the parent defaults, by generated field name. */
37
+ readonly spec?: Readonly<Record<string, unknown>>;
38
+ /** Status fields set beside the audit, by generated field name. */
39
+ readonly status?: Readonly<Record<string, unknown>>;
40
+ }
41
+
42
+ /** The id the fixture gives the parent of `parentKind`: `<type>-1`. */
43
+ export function fixtureParentId(parentKind: string): string {
44
+ return `${kindEnumName(getKindEnum(parentKind))}-1`;
45
+ }
46
+
47
+ /** A row of `declaration.kind` carrying exactly the given facts, its parents filled. */
48
+ export function fixtureRow(
49
+ declaration: KindDeclaration,
50
+ facts: FixtureRowFacts,
51
+ ): Message {
52
+ // Typed loosely on purpose: the schema is any declared kind's, and
53
+ // protobuf-es only knows the field set of a concrete schema. Every kind
54
+ // shares these two paths (`metadata`, `status.audit`), which is the
55
+ // premise the derivation itself rests on.
56
+ const init: Record<string, unknown> = {
57
+ metadata: {
58
+ id: facts.id,
59
+ name: facts.id,
60
+ org: facts.org,
61
+ visibility: facts.visibility,
62
+ },
63
+ spec: { ...parentFieldsOf(declaration), ...facts.spec },
64
+ status: {
65
+ audit: { specAudit: { createdBy: { id: facts.createdBy } } },
66
+ ...facts.status,
67
+ },
68
+ };
69
+ return create(declaration.schema, init);
70
+ }
71
+
72
+ /** `kind_meta`'s parent spec fields for the kind, by generated name, each naming `<parentKind>-1`. */
73
+ function parentFieldsOf(declaration: KindDeclaration): Record<string, string> {
74
+ const config = getKindMeta(declaration.kind).authorization;
75
+ const spec = specSchemaOf(declaration.schema);
76
+ const fields: Record<string, string> = {};
77
+ if (config === undefined || spec === undefined) {
78
+ return fields;
79
+ }
80
+ const parents = [
81
+ ...(config.parent === undefined ? [] : [config.parent]),
82
+ ...config.additionalParents,
83
+ ];
84
+ for (const parent of parents) {
85
+ const field = spec.fields.find((f) => f.name === parent.specField);
86
+ if (field === undefined) {
87
+ throw new Error(
88
+ `${declaration.type}: kind_meta names spec field '${parent.specField}', which ${spec.typeName} does not have`,
89
+ );
90
+ }
91
+ fields[field.localName] = fixtureParentId(parent.kind);
92
+ }
93
+ return fields;
94
+ }
95
+
96
+ function specSchemaOf(schema: DescMessage): DescMessage | undefined {
97
+ const spec = schema.fields.find((f) => f.name === "spec");
98
+ return spec !== undefined && spec.fieldKind === "message"
99
+ ? spec.message
100
+ : undefined;
101
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Pins the tuple vocabulary's contract: the string notation the cloud's
3
+ * store tests and the IamPolicy proto share round-trips through parse and
4
+ * format. The person's construction is person.test.ts's.
5
+ */
6
+ import { describe, expect, it } from "vitest";
7
+
8
+ import {
9
+ formatSubject,
10
+ formatTuple,
11
+ parseObjectRef,
12
+ parseSubject,
13
+ } from "../tuples.js";
14
+
15
+ describe("the string notation", () => {
16
+ it("parses an object, a userset and the wildcard, and an id may carry a colon (issuer subjects do)", () => {
17
+ expect(parseObjectRef("agent:agt_1")).toEqual({
18
+ type: "agent",
19
+ id: "agt_1",
20
+ });
21
+ expect(parseObjectRef("identity_account:auth0|c:d")).toEqual({
22
+ type: "identity_account",
23
+ id: "auth0|c:d",
24
+ });
25
+ expect(parseSubject("organization:acme#viewer")).toEqual({
26
+ form: "userset",
27
+ object: { type: "organization", id: "acme" },
28
+ relation: "viewer",
29
+ });
30
+ expect(parseSubject("identity_account:*")).toEqual({
31
+ form: "wildcard",
32
+ type: "identity_account",
33
+ condition: undefined,
34
+ });
35
+ expect(parseSubject("identity_account:ida_x")).toEqual({
36
+ form: "object",
37
+ object: { type: "identity_account", id: "ida_x" },
38
+ });
39
+ });
40
+
41
+ it("refuses text with no type", () => {
42
+ expect(() => parseObjectRef("nonsense")).toThrow("not an object reference");
43
+ expect(() => parseObjectRef(":id")).toThrow("not an object reference");
44
+ });
45
+
46
+ it("formats a tuple in the proto's notation, the condition spelled after `with`", () => {
47
+ expect(
48
+ formatTuple({
49
+ object: parseObjectRef("agent:a"),
50
+ relation: "viewer",
51
+ subject: {
52
+ form: "wildcard",
53
+ type: "identity_account",
54
+ condition: "allow_public",
55
+ },
56
+ }),
57
+ ).toBe("agent:a#viewer@identity_account:* with allow_public");
58
+ expect(formatSubject(parseSubject("organization:acme#member"))).toBe(
59
+ "organization:acme#member",
60
+ );
61
+ });
62
+ });
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Pins that every question the wire can ask this edition's authorizer
3
+ * has a line in the model: for every `rpc.config`-annotated method the
4
+ * open-source server SERVES whose annotation names a static kind this
5
+ * edition serves, the permission is a relation that kind's transcript
6
+ * declares. A relation the kind does not define answers `deny` here
7
+ * (evaluator.ts) — an RPC annotated with such a pair would refuse every
8
+ * caller, green on the permissive `local*` targets and dark only under
9
+ * enforcement, so the gap is caught at the registry instead of on a
10
+ * self-host.
11
+ *
12
+ * Scope follows authorize-annotation-completeness.test.ts: the empty
13
+ * composition's routes, replayed into a recorder, are exactly the methods
14
+ * the OSS Authorize step governs. Outside the pin, each for a stated
15
+ * reason: `is_public` and `is_skip_authorization` methods (the annotation
16
+ * is never resolved); a kind the edition does not serve (`platform`; the
17
+ * driver refuses it before any evaluation, so under the built-in posture
18
+ * nobody holds a platform permission); a kind named by
19
+ * `resource_kind_path` (the IamPolicy lane's — the kind is the request's,
20
+ * and the target's own declaration answers at run time).
21
+ */
22
+ import { mkdtempSync, rmSync } from "node:fs";
23
+ import { tmpdir } from "node:os";
24
+ import path from "node:path";
25
+
26
+ import { getOption, hasOption } from "@bufbuild/protobuf";
27
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
28
+
29
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
30
+ import {
31
+ config as rpcAuthorizationConfig,
32
+ is_public,
33
+ is_skip_authorization,
34
+ } from "@stigmer/protos/ai/stigmer/commons/rpc/method_options_pb";
35
+ import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
36
+ import { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
37
+
38
+ import { loadConfig } from "../../boot/config.js";
39
+ import { composeServer } from "../../boot/compose.js";
40
+ import type { ComposedServer } from "../../boot/compose.js";
41
+ import {
42
+ baseConfig,
43
+ servedServices,
44
+ silentLogger,
45
+ } from "../../extensions/__tests__/composed-support.js";
46
+ import {
47
+ kindEnumName,
48
+ kindServedByEdition,
49
+ } from "../../pipeline/apiresource-meta.js";
50
+ import { declarationFor } from "../model/index.js";
51
+
52
+ /** One annotated, served, statically-targeted method: the question the wire asks. */
53
+ interface WireQuestion {
54
+ readonly method: string;
55
+ readonly kind: ApiResourceKind;
56
+ readonly permission: string;
57
+ }
58
+
59
+ describe("every static (kind, permission) the served RPCs ask about is a declared relation", () => {
60
+ let dir: string;
61
+ let server: ComposedServer;
62
+
63
+ beforeAll(async () => {
64
+ dir = mkdtempSync(path.join(tmpdir(), "wire-permissions-test-"));
65
+ server = await composeServer({
66
+ config: loadConfig(baseConfig(dir)),
67
+ logger: silentLogger,
68
+ portOverride: 0,
69
+ host: "127.0.0.1",
70
+ });
71
+ });
72
+
73
+ afterAll(async () => {
74
+ await server.shutdown();
75
+ rmSync(dir, { recursive: true, force: true });
76
+ });
77
+
78
+ function wireQuestions(): WireQuestion[] {
79
+ const questions: WireQuestion[] = [];
80
+ for (const service of servedServices(server.routes)) {
81
+ for (const method of service.methods) {
82
+ if (
83
+ !hasOption(method, rpcAuthorizationConfig) ||
84
+ getOption(method, is_public) ||
85
+ getOption(method, is_skip_authorization)
86
+ ) {
87
+ continue;
88
+ }
89
+ const config = getOption(method, rpcAuthorizationConfig);
90
+ if (
91
+ config.resourceKind === ApiResourceKind.api_resource_kind_unknown ||
92
+ !kindServedByEdition(config.resourceKind, ServerEdition.oss)
93
+ ) {
94
+ continue;
95
+ }
96
+ questions.push({
97
+ method: `${service.typeName}/${method.name}`,
98
+ kind: config.resourceKind,
99
+ permission: IamPermission[config.permission] ?? "",
100
+ });
101
+ }
102
+ }
103
+ return questions;
104
+ }
105
+
106
+ it("names a declared relation for every question, with none undeclared", () => {
107
+ const questions = wireQuestions();
108
+ expect(questions.length).toBeGreaterThan(60);
109
+ const undeclared = questions
110
+ .filter(
111
+ (q) => declarationFor(q.kind)?.relations.has(q.permission) !== true,
112
+ )
113
+ .map(
114
+ (q) =>
115
+ `${q.method} asks ${q.permission} on ${kindEnumName(q.kind)}, which its transcript does not declare`,
116
+ );
117
+ expect(undeclared).toEqual([]);
118
+ });
119
+
120
+ it("asks about every served kind the model declares except the two no RPC targets statically", () => {
121
+ // iam_policy's RPCs target the policy's RESOURCE (`resource_kind_path`
122
+ // or the load-then-authorize `get`); execution_context's RPCs are
123
+ // `is_skip_authorization` lanes (or unannotated) whose handlers gate on
124
+ // the runner's execution-scoped token. Every other declared kind is
125
+ // asked about by at least one static annotation.
126
+ const asked = new Set(wireQuestions().map((q) => kindEnumName(q.kind)));
127
+ expect([...asked].sort()).toEqual(
128
+ [
129
+ "agent",
130
+ "agent_channel",
131
+ "agent_execution",
132
+ "agent_instance",
133
+ "agent_share",
134
+ "api_key",
135
+ "artifact",
136
+ "channel_app",
137
+ "environment",
138
+ "identity_account",
139
+ "mcp_server",
140
+ "memory",
141
+ "oauth_app",
142
+ "organization",
143
+ "plugin",
144
+ "project",
145
+ "schedule",
146
+ "session",
147
+ "skill",
148
+ "workflow",
149
+ "workflow_execution",
150
+ "workflow_instance",
151
+ ].sort(),
152
+ );
153
+ });
154
+ });