@stigmer/server 3.15.3-dev.20260914121148 → 3.16.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 (680) 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/lane-admission.d.ts +50 -0
  42. package/dist/authorization/lane-admission.d.ts.map +1 -0
  43. package/dist/authorization/lane-admission.js +13 -0
  44. package/dist/authorization/lane-admission.js.map +1 -0
  45. package/dist/authorization/list-read-scope.d.ts +18 -0
  46. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  47. package/dist/authorization/list-read-scope.js +155 -0
  48. package/dist/authorization/list-read-scope.js.map +1 -0
  49. package/dist/authorization/model/agent.d.ts +2 -0
  50. package/dist/authorization/model/agent.d.ts.map +1 -0
  51. package/dist/authorization/model/agent.js +42 -0
  52. package/dist/authorization/model/agent.js.map +1 -0
  53. package/dist/authorization/model/agent_channel.d.ts +2 -0
  54. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_channel.js +38 -0
  56. package/dist/authorization/model/agent_channel.js.map +1 -0
  57. package/dist/authorization/model/agent_execution.d.ts +2 -0
  58. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_execution.js +25 -0
  60. package/dist/authorization/model/agent_execution.js.map +1 -0
  61. package/dist/authorization/model/agent_instance.d.ts +2 -0
  62. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_instance.js +47 -0
  64. package/dist/authorization/model/agent_instance.js.map +1 -0
  65. package/dist/authorization/model/agent_share.d.ts +2 -0
  66. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  67. package/dist/authorization/model/agent_share.js +29 -0
  68. package/dist/authorization/model/agent_share.js.map +1 -0
  69. package/dist/authorization/model/api_key.d.ts +2 -0
  70. package/dist/authorization/model/api_key.d.ts.map +1 -0
  71. package/dist/authorization/model/api_key.js +27 -0
  72. package/dist/authorization/model/api_key.js.map +1 -0
  73. package/dist/authorization/model/artifact.d.ts +2 -0
  74. package/dist/authorization/model/artifact.d.ts.map +1 -0
  75. package/dist/authorization/model/artifact.js +27 -0
  76. package/dist/authorization/model/artifact.js.map +1 -0
  77. package/dist/authorization/model/channel_app.d.ts +2 -0
  78. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  79. package/dist/authorization/model/channel_app.js +28 -0
  80. package/dist/authorization/model/channel_app.js.map +1 -0
  81. package/dist/authorization/model/default-of.d.ts +38 -0
  82. package/dist/authorization/model/default-of.d.ts.map +1 -0
  83. package/dist/authorization/model/default-of.js +39 -0
  84. package/dist/authorization/model/default-of.js.map +1 -0
  85. package/dist/authorization/model/environment.d.ts +2 -0
  86. package/dist/authorization/model/environment.d.ts.map +1 -0
  87. package/dist/authorization/model/environment.js +33 -0
  88. package/dist/authorization/model/environment.js.map +1 -0
  89. package/dist/authorization/model/execution_context.d.ts +2 -0
  90. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  91. package/dist/authorization/model/execution_context.js +19 -0
  92. package/dist/authorization/model/execution_context.js.map +1 -0
  93. package/dist/authorization/model/iam_policy.d.ts +2 -0
  94. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  95. package/dist/authorization/model/iam_policy.js +31 -0
  96. package/dist/authorization/model/iam_policy.js.map +1 -0
  97. package/dist/authorization/model/identity_account.d.ts +2 -0
  98. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  99. package/dist/authorization/model/identity_account.js +25 -0
  100. package/dist/authorization/model/identity_account.js.map +1 -0
  101. package/dist/authorization/model/index.d.ts +36 -0
  102. package/dist/authorization/model/index.d.ts.map +1 -0
  103. package/dist/authorization/model/index.js +72 -0
  104. package/dist/authorization/model/index.js.map +1 -0
  105. package/dist/authorization/model/mcp_server.d.ts +2 -0
  106. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  107. package/dist/authorization/model/mcp_server.js +37 -0
  108. package/dist/authorization/model/mcp_server.js.map +1 -0
  109. package/dist/authorization/model/memory.d.ts +2 -0
  110. package/dist/authorization/model/memory.d.ts.map +1 -0
  111. package/dist/authorization/model/memory.js +26 -0
  112. package/dist/authorization/model/memory.js.map +1 -0
  113. package/dist/authorization/model/oauth_app.d.ts +2 -0
  114. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  115. package/dist/authorization/model/oauth_app.js +30 -0
  116. package/dist/authorization/model/oauth_app.js.map +1 -0
  117. package/dist/authorization/model/organization.d.ts +2 -0
  118. package/dist/authorization/model/organization.d.ts.map +1 -0
  119. package/dist/authorization/model/organization.js +54 -0
  120. package/dist/authorization/model/organization.js.map +1 -0
  121. package/dist/authorization/model/plugin.d.ts +2 -0
  122. package/dist/authorization/model/plugin.d.ts.map +1 -0
  123. package/dist/authorization/model/plugin.js +44 -0
  124. package/dist/authorization/model/plugin.js.map +1 -0
  125. package/dist/authorization/model/project.d.ts +2 -0
  126. package/dist/authorization/model/project.d.ts.map +1 -0
  127. package/dist/authorization/model/project.js +32 -0
  128. package/dist/authorization/model/project.js.map +1 -0
  129. package/dist/authorization/model/rewrite.d.ts +127 -0
  130. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  131. package/dist/authorization/model/rewrite.js +82 -0
  132. package/dist/authorization/model/rewrite.js.map +1 -0
  133. package/dist/authorization/model/schedule.d.ts +2 -0
  134. package/dist/authorization/model/schedule.d.ts.map +1 -0
  135. package/dist/authorization/model/schedule.js +29 -0
  136. package/dist/authorization/model/schedule.js.map +1 -0
  137. package/dist/authorization/model/session.d.ts +2 -0
  138. package/dist/authorization/model/session.d.ts.map +1 -0
  139. package/dist/authorization/model/session.js +38 -0
  140. package/dist/authorization/model/session.js.map +1 -0
  141. package/dist/authorization/model/skill.d.ts +2 -0
  142. package/dist/authorization/model/skill.d.ts.map +1 -0
  143. package/dist/authorization/model/skill.js +38 -0
  144. package/dist/authorization/model/skill.js.map +1 -0
  145. package/dist/authorization/model/workflow.d.ts +2 -0
  146. package/dist/authorization/model/workflow.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow.js +38 -0
  148. package/dist/authorization/model/workflow.js.map +1 -0
  149. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  150. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_execution.js +32 -0
  152. package/dist/authorization/model/workflow_execution.js.map +1 -0
  153. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  154. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  155. package/dist/authorization/model/workflow_instance.js +92 -0
  156. package/dist/authorization/model/workflow_instance.js.map +1 -0
  157. package/dist/authorization/organization-directory.d.ts +13 -0
  158. package/dist/authorization/organization-directory.d.ts.map +1 -0
  159. package/dist/authorization/organization-directory.js +83 -0
  160. package/dist/authorization/organization-directory.js.map +1 -0
  161. package/dist/authorization/person.d.ts +42 -0
  162. package/dist/authorization/person.d.ts.map +1 -0
  163. package/dist/authorization/person.js +19 -0
  164. package/dist/authorization/person.js.map +1 -0
  165. package/dist/authorization/posture.d.ts +38 -0
  166. package/dist/authorization/posture.d.ts.map +1 -0
  167. package/dist/authorization/posture.js +7 -0
  168. package/dist/authorization/posture.js.map +1 -0
  169. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  170. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  171. package/dist/authorization/schedule-fire-caller.js +67 -0
  172. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  173. package/dist/authorization/store-test-kit.d.ts +68 -0
  174. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  175. package/dist/authorization/store-test-kit.js +311 -0
  176. package/dist/authorization/store-test-kit.js.map +1 -0
  177. package/dist/authorization/tuples.d.ts +115 -0
  178. package/dist/authorization/tuples.d.ts.map +1 -0
  179. package/dist/authorization/tuples.js +83 -0
  180. package/dist/authorization/tuples.js.map +1 -0
  181. package/dist/boot/compose.d.ts.map +1 -1
  182. package/dist/boot/compose.js +220 -43
  183. package/dist/boot/compose.js.map +1 -1
  184. package/dist/boot/inprocess.d.ts +12 -0
  185. package/dist/boot/inprocess.d.ts.map +1 -1
  186. package/dist/boot/inprocess.js +68 -21
  187. package/dist/boot/inprocess.js.map +1 -1
  188. package/dist/domain/agent/controller.d.ts.map +1 -1
  189. package/dist/domain/agent/controller.js +9 -0
  190. package/dist/domain/agent/controller.js.map +1 -1
  191. package/dist/domain/executioncontext/resolve-values-for-caller.d.ts +33 -14
  192. package/dist/domain/executioncontext/resolve-values-for-caller.d.ts.map +1 -1
  193. package/dist/domain/executioncontext/resolve-values-for-caller.js +32 -8
  194. package/dist/domain/executioncontext/resolve-values-for-caller.js.map +1 -1
  195. package/dist/domain/iampolicy/constants.d.ts +11 -0
  196. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  197. package/dist/domain/iampolicy/constants.js +11 -0
  198. package/dist/domain/iampolicy/constants.js.map +1 -1
  199. package/dist/domain/iampolicy/membership.d.ts +72 -1
  200. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  201. package/dist/domain/iampolicy/membership.js +141 -56
  202. package/dist/domain/iampolicy/membership.js.map +1 -1
  203. package/dist/domain/identityaccount/actor.d.ts +41 -0
  204. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  205. package/dist/domain/identityaccount/actor.js +34 -0
  206. package/dist/domain/identityaccount/actor.js.map +1 -0
  207. package/dist/domain/identityaccount/resolve.d.ts +19 -0
  208. package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
  209. package/dist/domain/identityaccount/resolve.js +12 -0
  210. package/dist/domain/identityaccount/resolve.js.map +1 -1
  211. package/dist/domain/mcpserver/connect-execution-id.d.ts +5 -0
  212. package/dist/domain/mcpserver/connect-execution-id.d.ts.map +1 -0
  213. package/dist/domain/mcpserver/connect-execution-id.js +32 -0
  214. package/dist/domain/mcpserver/connect-execution-id.js.map +1 -0
  215. package/dist/domain/mcpserver/connect.d.ts +28 -2
  216. package/dist/domain/mcpserver/connect.d.ts.map +1 -1
  217. package/dist/domain/mcpserver/connect.js +27 -7
  218. package/dist/domain/mcpserver/connect.js.map +1 -1
  219. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  220. package/dist/domain/mcpserver/controller.js +9 -0
  221. package/dist/domain/mcpserver/controller.js.map +1 -1
  222. package/dist/domain/mcpserver/engine.d.ts +9 -3
  223. package/dist/domain/mcpserver/engine.d.ts.map +1 -1
  224. package/dist/domain/mcpserver/engine.js.map +1 -1
  225. package/dist/domain/mcpserver/start-connect.js +1 -1
  226. package/dist/domain/mcpserver/start-connect.js.map +1 -1
  227. package/dist/domain/platform/controller.d.ts +24 -11
  228. package/dist/domain/platform/controller.d.ts.map +1 -1
  229. package/dist/domain/platform/controller.js.map +1 -1
  230. package/dist/domain/plugin/archive.d.ts +37 -0
  231. package/dist/domain/plugin/archive.d.ts.map +1 -0
  232. package/dist/domain/plugin/archive.js +50 -0
  233. package/dist/domain/plugin/archive.js.map +1 -0
  234. package/dist/domain/plugin/constants.d.ts +38 -0
  235. package/dist/domain/plugin/constants.d.ts.map +1 -0
  236. package/dist/domain/plugin/constants.js +46 -0
  237. package/dist/domain/plugin/constants.js.map +1 -0
  238. package/dist/domain/plugin/controller.d.ts +25 -0
  239. package/dist/domain/plugin/controller.d.ts.map +1 -0
  240. package/dist/domain/plugin/controller.js +493 -0
  241. package/dist/domain/plugin/controller.js.map +1 -0
  242. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  243. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/agent.js +128 -0
  245. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  246. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  247. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  248. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  249. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  250. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  251. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  252. package/dist/domain/plugin/materialize/identity.js +40 -0
  253. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  254. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  255. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  256. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  257. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  258. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  259. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  260. package/dist/domain/plugin/materialize/plan.js +77 -0
  261. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  262. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  263. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  264. package/dist/domain/plugin/materialize/ports.js +2 -0
  265. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  266. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  267. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  268. package/dist/domain/plugin/materialize/skills.js +44 -0
  269. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  270. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  271. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  272. package/dist/domain/plugin/materialize/workflows.js +31 -0
  273. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  274. package/dist/domain/plugin/members.d.ts +42 -0
  275. package/dist/domain/plugin/members.d.ts.map +1 -0
  276. package/dist/domain/plugin/members.js +97 -0
  277. package/dist/domain/plugin/members.js.map +1 -0
  278. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  279. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  280. package/dist/domain/plugin/overlay/documents.js +38 -0
  281. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  282. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  283. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  284. package/dist/domain/plugin/overlay/parse.js +79 -0
  285. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  286. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  287. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  288. package/dist/domain/plugin/overlay/sanitize.js +103 -0
  289. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  290. package/dist/domain/plugin/push.d.ts +133 -0
  291. package/dist/domain/plugin/push.d.ts.map +1 -0
  292. package/dist/domain/plugin/push.js +800 -0
  293. package/dist/domain/plugin/push.js.map +1 -0
  294. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  295. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  296. package/dist/domain/plugin/search-extractor.js +41 -0
  297. package/dist/domain/plugin/search-extractor.js.map +1 -0
  298. package/dist/domain/skill/constants.d.ts +6 -11
  299. package/dist/domain/skill/constants.d.ts.map +1 -1
  300. package/dist/domain/skill/constants.js +6 -11
  301. package/dist/domain/skill/constants.js.map +1 -1
  302. package/dist/domain/skill/controller.d.ts.map +1 -1
  303. package/dist/domain/skill/controller.js +33 -30
  304. package/dist/domain/skill/controller.js.map +1 -1
  305. package/dist/domain/skill/push.d.ts +9 -10
  306. package/dist/domain/skill/push.d.ts.map +1 -1
  307. package/dist/domain/skill/push.js +53 -122
  308. package/dist/domain/skill/push.js.map +1 -1
  309. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  310. package/dist/domain/skill/search-extractor.js.map +1 -1
  311. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  312. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  313. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  314. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  315. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  316. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  317. package/dist/domain/skill/storage/zip-gate.js +56 -126
  318. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  319. package/dist/domain/skill/version-resolution.d.ts +5 -5
  320. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  321. package/dist/domain/skill/version-resolution.js +34 -216
  322. package/dist/domain/skill/version-resolution.js.map +1 -1
  323. package/dist/domain/workflow/controller.d.ts.map +1 -1
  324. package/dist/domain/workflow/controller.js +30 -3
  325. package/dist/domain/workflow/controller.js.map +1 -1
  326. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  327. package/dist/domain/workflowexecution/phases.d.ts +21 -0
  328. package/dist/domain/workflowexecution/phases.d.ts.map +1 -0
  329. package/dist/domain/workflowexecution/phases.js +31 -0
  330. package/dist/domain/workflowexecution/phases.js.map +1 -0
  331. package/dist/extensions/authorizer.d.ts +10 -5
  332. package/dist/extensions/authorizer.d.ts.map +1 -1
  333. package/dist/extensions/drivers.d.ts +4 -1
  334. package/dist/extensions/drivers.d.ts.map +1 -1
  335. package/dist/extensions/list-read-scope.d.ts +47 -20
  336. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  337. package/dist/extensions/list-read-scope.js +20 -24
  338. package/dist/extensions/list-read-scope.js.map +1 -1
  339. package/dist/extensions/organization-directory.d.ts +13 -9
  340. package/dist/extensions/organization-directory.d.ts.map +1 -1
  341. package/dist/extensions/organization-directory.js.map +1 -1
  342. package/dist/extensions/resource-authorization.d.ts +33 -0
  343. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  344. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  345. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  346. package/dist/extensions/schedule-fire-caller.js +12 -1
  347. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  348. package/dist/identity/oidc-verifier.js +8 -1
  349. package/dist/identity/oidc-verifier.js.map +1 -1
  350. package/dist/index.d.ts +10 -0
  351. package/dist/index.d.ts.map +1 -1
  352. package/dist/index.js +8 -0
  353. package/dist/index.js.map +1 -1
  354. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  355. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  356. package/dist/pipeline/apiresource-labels.js +20 -0
  357. package/dist/pipeline/apiresource-labels.js.map +1 -1
  358. package/dist/pipeline/apiresource-meta.d.ts +15 -0
  359. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  360. package/dist/pipeline/apiresource-meta.js +34 -0
  361. package/dist/pipeline/apiresource-meta.js.map +1 -1
  362. package/dist/pipeline/errors.d.ts.map +1 -1
  363. package/dist/pipeline/errors.js.map +1 -1
  364. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  365. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  366. package/dist/pipeline/steps/authorization-facts.js +100 -0
  367. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  368. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  369. package/dist/pipeline/steps/delete.js +1 -1
  370. package/dist/pipeline/steps/delete.js.map +1 -1
  371. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  372. package/dist/pipeline/steps/duplicate.js.map +1 -1
  373. package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
  374. package/dist/pipeline/steps/guard-memory-capture.js +5 -3
  375. package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
  376. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  377. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  378. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  379. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  380. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  381. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  382. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  383. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  384. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  385. package/dist/pipeline/steps/helpers.js.map +1 -1
  386. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  387. package/dist/pipeline/steps/index-search.js.map +1 -1
  388. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  389. package/dist/pipeline/steps/load-existing.js +1 -1
  390. package/dist/pipeline/steps/load-existing.js.map +1 -1
  391. package/dist/pipeline/steps/references.d.ts +16 -0
  392. package/dist/pipeline/steps/references.d.ts.map +1 -1
  393. package/dist/pipeline/steps/references.js +18 -0
  394. package/dist/pipeline/steps/references.js.map +1 -1
  395. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  396. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  397. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  398. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  399. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  400. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  401. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  402. package/dist/pipeline/steps/slug.js.map +1 -1
  403. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  404. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  405. package/dist/pipeline/steps/validate-visibility.js +6 -1
  406. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  407. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  408. package/dist/pipeline/steps/validation.js.map +1 -1
  409. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  410. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  411. package/dist/pipeline/steps/version-archive.js +129 -0
  412. package/dist/pipeline/steps/version-archive.js.map +1 -0
  413. package/dist/pipeline/steps/version-history.d.ts +49 -0
  414. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  415. package/dist/pipeline/steps/version-history.js +229 -0
  416. package/dist/pipeline/steps/version-history.js.map +1 -0
  417. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  418. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  419. package/dist/pipeline/steps/visibility-gates.js +7 -2
  420. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  421. package/dist/query/search/registry.d.ts.map +1 -1
  422. package/dist/query/search/registry.js +2 -0
  423. package/dist/query/search/registry.js.map +1 -1
  424. package/dist/runnerauth/bound-execution.d.ts +27 -0
  425. package/dist/runnerauth/bound-execution.d.ts.map +1 -0
  426. package/dist/runnerauth/bound-execution.js +137 -0
  427. package/dist/runnerauth/bound-execution.js.map +1 -0
  428. package/dist/runnerauth/built-in-runner-credential-provider.d.ts +28 -0
  429. package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -0
  430. package/dist/runnerauth/built-in-runner-credential-provider.js +217 -0
  431. package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -0
  432. package/dist/runnerauth/constants.d.ts +63 -0
  433. package/dist/runnerauth/constants.d.ts.map +1 -0
  434. package/dist/runnerauth/constants.js +63 -0
  435. package/dist/runnerauth/constants.js.map +1 -0
  436. package/dist/runnerauth/dispatch-credential.d.ts +38 -0
  437. package/dist/runnerauth/dispatch-credential.d.ts.map +1 -0
  438. package/dist/runnerauth/dispatch-credential.js +17 -0
  439. package/dist/runnerauth/dispatch-credential.js.map +1 -0
  440. package/dist/runnerauth/runner-credential-provider.d.ts +49 -11
  441. package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
  442. package/dist/runnerauth/runner-credential-provider.js +16 -4
  443. package/dist/runnerauth/runner-credential-provider.js.map +1 -1
  444. package/dist/runnerauth/runner-subject-verifier.d.ts +14 -0
  445. package/dist/runnerauth/runner-subject-verifier.d.ts.map +1 -0
  446. package/dist/runnerauth/runner-subject-verifier.js +115 -0
  447. package/dist/runnerauth/runner-subject-verifier.js.map +1 -0
  448. package/dist/runnerauth/runnerauth.d.ts +33 -4
  449. package/dist/runnerauth/runnerauth.d.ts.map +1 -1
  450. package/dist/runnerauth/runnerauth.js +131 -35
  451. package/dist/runnerauth/runnerauth.js.map +1 -1
  452. package/dist/temporal/agentexecution/engine-client.d.ts +13 -0
  453. package/dist/temporal/agentexecution/engine-client.d.ts.map +1 -1
  454. package/dist/temporal/agentexecution/engine-client.js +10 -2
  455. package/dist/temporal/agentexecution/engine-client.js.map +1 -1
  456. package/dist/temporal/agentexecution/workflow-input.d.ts +13 -0
  457. package/dist/temporal/agentexecution/workflow-input.d.ts.map +1 -1
  458. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.d.ts.map +1 -1
  459. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js +35 -31
  460. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js.map +1 -1
  461. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  462. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  463. package/dist/temporal/schedule/run-starter.js +14 -1
  464. package/dist/temporal/schedule/run-starter.js.map +1 -1
  465. package/dist/temporal/workflowexecution/engine-client.d.ts +24 -0
  466. package/dist/temporal/workflowexecution/engine-client.d.ts.map +1 -1
  467. package/dist/temporal/workflowexecution/engine-client.js +26 -19
  468. package/dist/temporal/workflowexecution/engine-client.js.map +1 -1
  469. package/dist/temporal/workflowexecution/workflow-input.d.ts +14 -0
  470. package/dist/temporal/workflowexecution/workflow-input.d.ts.map +1 -1
  471. package/package.json +5 -4
  472. package/src/archive/__tests__/archive.test.ts +233 -0
  473. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  474. package/src/archive/content-store.ts +132 -0
  475. package/src/archive/inflate.ts +107 -0
  476. package/src/archive/limits.ts +42 -0
  477. package/src/archive/open.ts +131 -0
  478. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  479. package/src/archive/write.ts +54 -0
  480. package/src/authorization/README.md +124 -0
  481. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  482. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  483. package/src/authorization/__tests__/drivers.ts +70 -0
  484. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  485. package/src/authorization/__tests__/facts.test.ts +155 -0
  486. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  487. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  488. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  489. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  490. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  491. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  492. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  493. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  494. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  495. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  496. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  497. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  498. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  499. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  500. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  501. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  502. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  503. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  504. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  505. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  506. package/src/authorization/__tests__/lane-admission.test.ts +115 -0
  507. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  508. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  509. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  510. package/src/authorization/__tests__/person.test.ts +114 -0
  511. package/src/authorization/__tests__/posture.test.ts +25 -0
  512. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  513. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  514. package/src/authorization/__tests__/support.ts +101 -0
  515. package/src/authorization/__tests__/tuples.test.ts +62 -0
  516. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  517. package/src/authorization/authorizer.ts +208 -0
  518. package/src/authorization/derived-tuples.ts +384 -0
  519. package/src/authorization/evaluator.ts +283 -0
  520. package/src/authorization/facts.ts +47 -0
  521. package/src/authorization/lane-admission.ts +73 -0
  522. package/src/authorization/list-read-scope.ts +216 -0
  523. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  524. package/src/authorization/model/agent.ts +64 -0
  525. package/src/authorization/model/agent_channel.ts +49 -0
  526. package/src/authorization/model/agent_execution.ts +33 -0
  527. package/src/authorization/model/agent_instance.ts +66 -0
  528. package/src/authorization/model/agent_share.ts +40 -0
  529. package/src/authorization/model/api_key.ts +28 -0
  530. package/src/authorization/model/artifact.ts +38 -0
  531. package/src/authorization/model/channel_app.ts +39 -0
  532. package/src/authorization/model/default-of.ts +99 -0
  533. package/src/authorization/model/environment.ts +48 -0
  534. package/src/authorization/model/execution_context.ts +20 -0
  535. package/src/authorization/model/iam_policy.ts +42 -0
  536. package/src/authorization/model/identity_account.ts +26 -0
  537. package/src/authorization/model/index.ts +108 -0
  538. package/src/authorization/model/mcp_server.ts +59 -0
  539. package/src/authorization/model/memory.ts +27 -0
  540. package/src/authorization/model/oauth_app.ts +42 -0
  541. package/src/authorization/model/organization.ts +55 -0
  542. package/src/authorization/model/plugin.ts +66 -0
  543. package/src/authorization/model/project.ts +47 -0
  544. package/src/authorization/model/rewrite.ts +213 -0
  545. package/src/authorization/model/schedule.ts +40 -0
  546. package/src/authorization/model/session.ts +50 -0
  547. package/src/authorization/model/skill.ts +60 -0
  548. package/src/authorization/model/workflow.ts +60 -0
  549. package/src/authorization/model/workflow_execution.ts +44 -0
  550. package/src/authorization/model/workflow_instance.ts +122 -0
  551. package/src/authorization/organization-directory.ts +114 -0
  552. package/src/authorization/person.ts +68 -0
  553. package/src/authorization/posture.ts +49 -0
  554. package/src/authorization/schedule-fire-caller.ts +87 -0
  555. package/src/authorization/store-test-kit.ts +454 -0
  556. package/src/authorization/tuples.ts +190 -0
  557. package/src/boot/compose.ts +246 -52
  558. package/src/boot/inprocess.ts +115 -31
  559. package/src/domain/agent/controller.ts +11 -0
  560. package/src/domain/executioncontext/__tests__/executioncontext.test.ts +104 -0
  561. package/src/domain/executioncontext/__tests__/resolve-values-capability.test.ts +33 -4
  562. package/src/domain/executioncontext/resolve-values-for-caller.ts +79 -22
  563. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  564. package/src/domain/iampolicy/constants.ts +12 -0
  565. package/src/domain/iampolicy/membership.ts +221 -66
  566. package/src/domain/identityaccount/__tests__/account-for-stamp.test.ts +111 -0
  567. package/src/domain/identityaccount/actor.ts +84 -0
  568. package/src/domain/identityaccount/resolve.ts +31 -0
  569. package/src/domain/mcpserver/__tests__/connect.test.ts +17 -2
  570. package/src/domain/mcpserver/connect-execution-id.ts +34 -0
  571. package/src/domain/mcpserver/connect.ts +38 -3
  572. package/src/domain/mcpserver/controller.ts +11 -0
  573. package/src/domain/mcpserver/engine.ts +9 -3
  574. package/src/domain/mcpserver/start-connect.ts +1 -1
  575. package/src/domain/platform/controller.ts +24 -11
  576. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  577. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  578. package/src/domain/plugin/__tests__/plugin.test.ts +796 -0
  579. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  580. package/src/domain/plugin/archive.ts +89 -0
  581. package/src/domain/plugin/constants.ts +53 -0
  582. package/src/domain/plugin/controller.ts +913 -0
  583. package/src/domain/plugin/materialize/agent.ts +186 -0
  584. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  585. package/src/domain/plugin/materialize/identity.ts +67 -0
  586. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  587. package/src/domain/plugin/materialize/plan.ts +124 -0
  588. package/src/domain/plugin/materialize/ports.ts +53 -0
  589. package/src/domain/plugin/materialize/skills.ts +68 -0
  590. package/src/domain/plugin/materialize/workflows.ts +51 -0
  591. package/src/domain/plugin/members.ts +180 -0
  592. package/src/domain/plugin/overlay/documents.ts +78 -0
  593. package/src/domain/plugin/overlay/parse.ts +115 -0
  594. package/src/domain/plugin/overlay/sanitize.ts +151 -0
  595. package/src/domain/plugin/push.ts +1062 -0
  596. package/src/domain/plugin/search-extractor.ts +60 -0
  597. package/src/domain/skill/constants.ts +11 -14
  598. package/src/domain/skill/controller.ts +44 -36
  599. package/src/domain/skill/push.ts +61 -156
  600. package/src/domain/skill/search-extractor.ts +3 -1
  601. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  602. package/src/domain/skill/storage/zip-gate.ts +58 -154
  603. package/src/domain/skill/version-resolution.ts +67 -269
  604. package/src/domain/workflow/controller.ts +38 -4
  605. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  606. package/src/domain/workflowexecution/__tests__/phases.test.ts +58 -0
  607. package/src/domain/workflowexecution/phases.ts +33 -0
  608. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  609. package/src/extensions/__tests__/composed-support.ts +32 -1
  610. package/src/extensions/__tests__/extension-composition.test.ts +42 -1
  611. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  612. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  613. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  614. package/src/extensions/authorizer.ts +10 -5
  615. package/src/extensions/drivers.ts +4 -1
  616. package/src/extensions/list-read-scope.ts +67 -45
  617. package/src/extensions/organization-directory.ts +13 -9
  618. package/src/extensions/resource-authorization.ts +34 -0
  619. package/src/extensions/schedule-fire-caller.ts +49 -18
  620. package/src/identity/__tests__/oidc-verifier.test.ts +22 -0
  621. package/src/identity/oidc-verifier.ts +8 -1
  622. package/src/index.ts +51 -1
  623. package/src/pipeline/__tests__/kind-by-id-prefix.test.ts +75 -0
  624. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  625. package/src/pipeline/apiresource-labels.ts +31 -3
  626. package/src/pipeline/apiresource-meta.ts +41 -0
  627. package/src/pipeline/errors.ts +5 -5
  628. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  629. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +58 -44
  630. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  631. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  632. package/src/pipeline/steps/authorization-facts.ts +131 -0
  633. package/src/pipeline/steps/delete.ts +11 -3
  634. package/src/pipeline/steps/duplicate.ts +8 -2
  635. package/src/pipeline/steps/guard-memory-capture.ts +5 -3
  636. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  637. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  638. package/src/pipeline/steps/helpers.ts +4 -1
  639. package/src/pipeline/steps/index-search.ts +28 -15
  640. package/src/pipeline/steps/load-existing.ts +12 -3
  641. package/src/pipeline/steps/references.ts +36 -2
  642. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  643. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  644. package/src/pipeline/steps/slug.ts +7 -2
  645. package/src/pipeline/steps/validate-visibility.ts +9 -2
  646. package/src/pipeline/steps/validation.ts +3 -1
  647. package/src/pipeline/steps/version-archive.ts +225 -0
  648. package/src/pipeline/steps/version-history.ts +362 -0
  649. package/src/pipeline/steps/visibility-gates.ts +12 -9
  650. package/src/query/README.md +1 -1
  651. package/src/query/search/__tests__/criteria.test.ts +6 -7
  652. package/src/query/search/__tests__/query-store.test.ts +9 -2
  653. package/src/query/search/__tests__/registry.test.ts +6 -4
  654. package/src/query/search/registry.ts +6 -1
  655. package/src/runnerauth/__tests__/bound-execution.test.ts +334 -0
  656. package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +516 -0
  657. package/src/runnerauth/__tests__/dispatch-credential.test.ts +94 -0
  658. package/src/runnerauth/__tests__/runner-credential-provider.test.ts +27 -0
  659. package/src/runnerauth/__tests__/runner-subject-composed.test.ts +497 -0
  660. package/src/runnerauth/__tests__/runner-subject-verifier.test.ts +541 -0
  661. package/src/runnerauth/bound-execution.ts +270 -0
  662. package/src/runnerauth/built-in-runner-credential-provider.ts +300 -0
  663. package/src/runnerauth/constants.ts +74 -0
  664. package/src/runnerauth/dispatch-credential.ts +63 -0
  665. package/src/runnerauth/runner-credential-provider.ts +60 -11
  666. package/src/runnerauth/runner-subject-verifier.ts +152 -0
  667. package/src/runnerauth/runnerauth.ts +148 -38
  668. package/src/temporal/agentexecution/__tests__/engine-client.test.ts +107 -38
  669. package/src/temporal/agentexecution/__tests__/invoke-workflow.test.ts +105 -2
  670. package/src/temporal/agentexecution/engine-client.ts +27 -2
  671. package/src/temporal/agentexecution/workflow-input.ts +13 -0
  672. package/src/temporal/agentexecution/workflows/invoke-agent-execution.ts +90 -44
  673. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  674. package/src/temporal/schedule/run-starter.ts +31 -8
  675. package/src/temporal/workflowexecution/__tests__/engine-client.test.ts +139 -33
  676. package/src/temporal/workflowexecution/engine-client.ts +48 -21
  677. package/src/temporal/workflowexecution/workflow-input.ts +14 -0
  678. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  679. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  680. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -0,0 +1,835 @@
1
+ /**
2
+ * Pins the built-in AUTHORIZER end to end: under the require-authentication
3
+ * posture, when no unit
4
+ * registers an Authorizer, open source composes one that evaluates the
5
+ * cloud's authorization model over the tuples it would have written,
6
+ * derived from the row. The roles 2b records stop being decorative.
7
+ *
8
+ * Three postures, proven by BEHAVIOUR over real boots, never by the
9
+ * identity of the composed object:
10
+ * - OIDC with no unit Authorizer (the self-host's shape): the built-in
11
+ * drivers install. A private agent is visible to its owner and the
12
+ * organization's admins and to nobody else; a member reads an
13
+ * org-visible agent and may not edit it, and may not create one
14
+ * (`can_create_agent` is `admin`); a target that does not exist
15
+ * answers NOT_FOUND before any permission question (stigmer#224); an
16
+ * outsider on an EXISTING resource hears PERMISSION_DENIED, the
17
+ * cloud's answer; `findMyOrganizations` lists what a person may view
18
+ * and `find` refuses enumeration; `checkMyPermission` tells the truth;
19
+ * nobody sets public visibility; an unprovisioned subject
20
+ * writes nothing until provisioned. The LIST lanes are a member's
21
+ * lists: an outsider lists nothing of an organization they hold no
22
+ * row in; environments and API keys are their owner's even to the
23
+ * organization's owner; the library (a search) omits a private agent
24
+ * for a member; the enumeration lanes answer through the scope; an
25
+ * unprovisioned subject's lists are empty and become theirs once
26
+ * provisioned.
27
+ * - trusted-local: the permissive default stays (one caller,
28
+ * nothing to separate; the laptop's rows are stamped `"system"`):
29
+ * tokenless reads, public visibility and organization enumeration all
30
+ * keep working.
31
+ * - a unit's own Authorizer: nothing built in is installed; the unit's
32
+ * answer stands even against the founder.
33
+ *
34
+ * Written RED at S1 (2026-09-15), before src/authorization/ existed, and
35
+ * turned green by slice 3 (the drivers and the composition root). Every
36
+ * negative assertion sits beside a positive one (the owner's own read and
37
+ * edit succeed) so the file cannot pass vacuously. The per-module proofs
38
+ * (the evaluator, the model tables, the drivers) live in
39
+ * src/authorization/__tests__; this file is the entry's definition of
40
+ * done at the wire.
41
+ *
42
+ * Why agents and not sessions: a session create needs an engine and an
43
+ * instance; the blueprint kinds exercise the visibility axis (the
44
+ * `organization#viewer` userset tuple — cloud#257's shape — is written for
45
+ * `visibility_org` only) and the admin-edits / member-reads split with no
46
+ * engine. The agent kind defaults unspecified visibility to org
47
+ * (`defaults_to_org_visibility`), so the private arm sets
48
+ * `visibility_private` explicitly. The outsider: 2b's membership rules
49
+ * run at a person's FIRST provisioning only, so an organization the
50
+ * founder creates AFTER the member provisioned has no row for the member
51
+ * — a two-organization server with an outsider, no revoke needed.
52
+ */
53
+ import { mkdtempSync, rmSync } from "node:fs";
54
+ import { tmpdir } from "node:os";
55
+ import path from "node:path";
56
+
57
+ import { fromBinary } from "@bufbuild/protobuf";
58
+ import { Code, ConnectError, createClient } from "@connectrpc/connect";
59
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
60
+
61
+ import { ActivityQueryController } from "@stigmer/protos/ai/stigmer/activity/v1/query_pb";
62
+ import { AgentCommandController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/command_pb";
63
+ import { AgentQueryController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/query_pb";
64
+ import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
65
+ import { AgentExecutionQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/query_pb";
66
+ import { EnvironmentCommandController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/command_pb";
67
+ import { EnvironmentQueryController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/query_pb";
68
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
69
+ import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
70
+ import { ApiKeyCommandController } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/command_pb";
71
+ import { ApiKeyQueryController } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/query_pb";
72
+ import { IamPolicyQueryController } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/query_pb";
73
+ import { IdentityAccountCommandController } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/command_pb";
74
+ import { SearchService } from "@stigmer/protos/ai/stigmer/search/v1/query_pb";
75
+ import { OrganizationCommandController } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/command_pb";
76
+ import { OrganizationQueryController } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/query_pb";
77
+
78
+ import { builtInModel } from "../../authorization/model/index.js";
79
+ import { loadConfig } from "../../boot/config.js";
80
+ import { composeServer } from "../../boot/compose.js";
81
+ import type { ComposedServer } from "../../boot/compose.js";
82
+ import { metadataOf } from "../../pipeline/steps/shapes.js";
83
+ import { PUBLIC_VISIBILITY_DENY_MESSAGE } from "../../pipeline/steps/visibility-gates.js";
84
+ import type { Store } from "../../store/interface.js";
85
+ import type { Authorizer } from "../authorizer.js";
86
+ import type { ListReadScope } from "../list-read-scope.js";
87
+ import type { ServerExtension } from "../registry.js";
88
+ import {
89
+ baseConfig,
90
+ fakeJwt,
91
+ fakeVerifier,
92
+ silentLogger,
93
+ transportFor,
94
+ } from "./composed-support.js";
95
+
96
+ const FOUNDER = "fake|founder";
97
+ const MEMBER = "fake|member";
98
+ const STRANGER = "fake|stranger";
99
+ /** Provisioned inside the list-lane arms only, so its before/after is one arm's. */
100
+ const VISITOR = "fake|visitor";
101
+ const ORG = "built-in-org";
102
+ /** Founded AFTER the member provisioned: the member holds no row on it. */
103
+ const OTHER_ORG = "built-in-other-org";
104
+
105
+ function apiKeyInput(name: string) {
106
+ return {
107
+ apiVersion: "iam.stigmer.ai/v1",
108
+ kind: "ApiKey",
109
+ metadata: { name, org: ORG },
110
+ spec: {},
111
+ };
112
+ }
113
+
114
+ function environmentInput(name: string, org: string = ORG) {
115
+ return {
116
+ apiVersion: "agentic.stigmer.ai/v1",
117
+ kind: "Environment",
118
+ metadata: { name, org },
119
+ spec: {
120
+ description: name,
121
+ data: { PLAIN_KEY: { value: "plain", isSecret: false, description: "" } },
122
+ },
123
+ };
124
+ }
125
+
126
+ function organizationInput(slug: string) {
127
+ return {
128
+ apiVersion: "tenancy.stigmer.ai/v1",
129
+ kind: "Organization",
130
+ metadata: { name: slug, slug, org: "" },
131
+ spec: { description: slug },
132
+ };
133
+ }
134
+
135
+ function agentInput(
136
+ name: string,
137
+ visibility: ApiResourceVisibility,
138
+ org: string = ORG,
139
+ ) {
140
+ return {
141
+ apiVersion: "agentic.stigmer.ai/v1",
142
+ kind: "Agent",
143
+ metadata: { name, org, visibility },
144
+ spec: { instructions: "a conformant instruction body" },
145
+ };
146
+ }
147
+
148
+ async function codeOf(promise: Promise<unknown>): Promise<Code | undefined> {
149
+ try {
150
+ await promise;
151
+ return undefined;
152
+ } catch (error) {
153
+ expect(error).toBeInstanceOf(ConnectError);
154
+ return (error as ConnectError).code;
155
+ }
156
+ }
157
+
158
+ async function failureOf(promise: Promise<unknown>): Promise<ConnectError> {
159
+ try {
160
+ await promise;
161
+ } catch (error) {
162
+ expect(error).toBeInstanceOf(ConnectError);
163
+ return error as ConnectError;
164
+ }
165
+ throw new Error("expected the call to fail");
166
+ }
167
+
168
+ describe("built-in authorizer (composed server, OIDC with no unit Authorizer: the model is enforced)", () => {
169
+ let dir: string;
170
+ let server: ComposedServer;
171
+ let port: number;
172
+ let privateAgent: Agent;
173
+ let orgAgent: Agent;
174
+ let otherOrgAgent: Agent;
175
+
176
+ const asFounder = () =>
177
+ transportFor(port, fakeJwt(FOUNDER, "founder@example.com"));
178
+ const asMember = () =>
179
+ transportFor(port, fakeJwt(MEMBER, "member@example.com"));
180
+ const asStranger = () =>
181
+ transportFor(port, fakeJwt(STRANGER, "stranger@example.com"));
182
+ const asVisitor = () =>
183
+ transportFor(port, fakeJwt(VISITOR, "visitor@example.com"));
184
+
185
+ beforeAll(async () => {
186
+ dir = mkdtempSync(path.join(tmpdir(), "built-in-authorizer-oidc-"));
187
+ // The unit vouches for tokens and declares the posture and registers
188
+ // NO Authorizer — the open-source OIDC self-host's shape.
189
+ const unit: ServerExtension = {
190
+ name: "fake-oidc-only",
191
+ requireAuthentication: true,
192
+ identityVerifiers: [fakeVerifier],
193
+ };
194
+ server = await composeServer({
195
+ config: loadConfig(baseConfig(dir)),
196
+ logger: silentLogger,
197
+ extensions: [unit],
198
+ portOverride: 0,
199
+ host: "127.0.0.1",
200
+ });
201
+ port = await server.start();
202
+
203
+ // The founder provisions, founds the organization (owner row, 2b's
204
+ // lifecycle), and the member provisions afterwards (member row, 2b's
205
+ // membership rules). Both blueprints are the founder's.
206
+ const founderAccounts = createClient(
207
+ IdentityAccountCommandController,
208
+ asFounder(),
209
+ );
210
+ await founderAccounts.provisionMyAccount({});
211
+ await createClient(OrganizationCommandController, asFounder()).create(
212
+ organizationInput(ORG),
213
+ );
214
+ await createClient(
215
+ IdentityAccountCommandController,
216
+ asMember(),
217
+ ).provisionMyAccount({});
218
+
219
+ const founderAgents = createClient(AgentCommandController, asFounder());
220
+ privateAgent = await founderAgents.create(
221
+ agentInput("Private Agent", ApiResourceVisibility.visibility_private),
222
+ );
223
+ orgAgent = await founderAgents.create(
224
+ agentInput("Org Agent", ApiResourceVisibility.visibility_org),
225
+ );
226
+
227
+ // The second organization, founded AFTER the member provisioned: the
228
+ // founder is its owner (2b's lifecycle); the member holds no row on
229
+ // it — an outsider, on a real two-organization server.
230
+ await createClient(OrganizationCommandController, asFounder()).create(
231
+ organizationInput(OTHER_ORG),
232
+ );
233
+ otherOrgAgent = await founderAgents.create(
234
+ agentInput(
235
+ "Other Org Agent",
236
+ ApiResourceVisibility.visibility_org,
237
+ OTHER_ORG,
238
+ ),
239
+ );
240
+ });
241
+
242
+ afterAll(async () => {
243
+ await server.shutdown();
244
+ rmSync(dir, { recursive: true, force: true });
245
+ });
246
+
247
+ it("the owner reads both of their agents and the member reads the organization", async () => {
248
+ const founderQuery = createClient(AgentQueryController, asFounder());
249
+ expect(
250
+ (await founderQuery.get({ value: privateAgent.metadata!.id })).metadata
251
+ ?.id,
252
+ ).toBe(privateAgent.metadata!.id);
253
+ expect(
254
+ (await founderQuery.get({ value: orgAgent.metadata!.id })).metadata?.id,
255
+ ).toBe(orgAgent.metadata!.id);
256
+ // `can_view` on the organization is `viewer`, which a member holds.
257
+ expect(
258
+ (
259
+ await createClient(OrganizationQueryController, asMember()).get({
260
+ value: ORG,
261
+ })
262
+ ).metadata?.id,
263
+ ).toBe(ORG);
264
+ });
265
+
266
+ it("a member reads an org-visible agent", async () => {
267
+ const read = await createClient(AgentQueryController, asMember()).get({
268
+ value: orgAgent.metadata!.id,
269
+ });
270
+ expect(read.metadata?.id).toBe(orgAgent.metadata!.id);
271
+ });
272
+
273
+ it("a member may not read another member's PRIVATE agent — `agent.viewer` has the organization only through the `visibility_org` tuple", async () => {
274
+ expect(
275
+ await codeOf(
276
+ createClient(AgentQueryController, asMember()).get({
277
+ value: privateAgent.metadata!.id,
278
+ }),
279
+ ),
280
+ ).toBe(Code.PermissionDenied);
281
+ });
282
+
283
+ it("a member may not edit an org-visible agent — `can_edit` is `owner`, which is the creator or an admin of the organization", async () => {
284
+ const memberEdit = createClient(AgentCommandController, asMember()).update({
285
+ ...orgAgent,
286
+ spec: { ...orgAgent.spec!, instructions: "edited by a member" },
287
+ });
288
+ expect(await codeOf(memberEdit)).toBe(Code.PermissionDenied);
289
+
290
+ // The positive beside the negative: the owner's own edit succeeds.
291
+ const ownerEdit = await createClient(
292
+ AgentCommandController,
293
+ asFounder(),
294
+ ).update({
295
+ ...orgAgent,
296
+ spec: { ...orgAgent.spec!, instructions: "edited by the owner" },
297
+ });
298
+ expect(ownerEdit.spec?.instructions).toBe("edited by the owner");
299
+ });
300
+
301
+ it("a target that does not exist answers NOT_FOUND before any permission question (stigmer#224)", async () => {
302
+ expect(
303
+ await codeOf(
304
+ createClient(AgentQueryController, asMember()).get({
305
+ value: "agt_does_not_exist",
306
+ }),
307
+ ),
308
+ ).toBe(Code.NotFound);
309
+ });
310
+
311
+ it("an outsider on an EXISTING organization and its agent hears PERMISSION_DENIED — the cloud's answer; NOT_FOUND is for what does not exist", async () => {
312
+ expect(
313
+ await codeOf(
314
+ createClient(OrganizationQueryController, asMember()).get({
315
+ value: OTHER_ORG,
316
+ }),
317
+ ),
318
+ ).toBe(Code.PermissionDenied);
319
+ expect(
320
+ await codeOf(
321
+ createClient(AgentQueryController, asMember()).get({
322
+ value: otherOrgAgent.metadata!.id,
323
+ }),
324
+ ),
325
+ ).toBe(Code.PermissionDenied);
326
+ // The positive beside the negative: the founder, its owner, reads it.
327
+ expect(
328
+ (
329
+ await createClient(AgentQueryController, asFounder()).get({
330
+ value: otherOrgAgent.metadata!.id,
331
+ })
332
+ ).metadata?.id,
333
+ ).toBe(otherOrgAgent.metadata!.id);
334
+ });
335
+
336
+ it("findMyOrganizations lists what a person may view — the member one, the founder both — and `find` refuses enumeration", async () => {
337
+ const mine = await createClient(
338
+ OrganizationQueryController,
339
+ asMember(),
340
+ ).findMyOrganizations({});
341
+ expect(mine.entries.map((o) => o.metadata?.id)).toEqual([ORG]);
342
+ const founders = await createClient(
343
+ OrganizationQueryController,
344
+ asFounder(),
345
+ ).findMyOrganizations({});
346
+ expect(founders.entries.map((o) => o.metadata?.id).sort()).toEqual(
347
+ [ORG, OTHER_ORG].sort(),
348
+ );
349
+ expect(
350
+ await codeOf(
351
+ createClient(OrganizationQueryController, asMember()).find({
352
+ org: ORG,
353
+ }),
354
+ ),
355
+ ).toBe(Code.Unimplemented);
356
+ });
357
+
358
+ it("checkMyPermission tells the truth through the built-in authorizer (2b's arm 3)", async () => {
359
+ const ask = (transport: ReturnType<typeof asMember>) =>
360
+ createClient(IamPolicyQueryController, transport).checkMyPermission({
361
+ relation: "can_edit",
362
+ resource: { kind: "agent", id: orgAgent.metadata!.id },
363
+ });
364
+ expect((await ask(asMember())).isAuthorized).toBe(false);
365
+ expect((await ask(asFounder())).isAuthorized).toBe(true);
366
+ });
367
+
368
+ it("a member may not create an agent (`can_create_agent` is `admin`) — the annotation's copy is the wire", async () => {
369
+ const failure = await failureOf(
370
+ createClient(AgentCommandController, asMember()).create(
371
+ agentInput("Member Agent", ApiResourceVisibility.visibility_org),
372
+ ),
373
+ );
374
+ expect(failure.code).toBe(Code.PermissionDenied);
375
+ expect(failure.rawMessage).toBe(
376
+ "unauthorized to create agent in this organization",
377
+ );
378
+ });
379
+
380
+ it("nobody sets PUBLIC visibility on an enforcing self-host — the platform gate denies the founder with the policy copy", async () => {
381
+ const failure = await failureOf(
382
+ createClient(AgentCommandController, asFounder()).create(
383
+ agentInput("Public Agent", ApiResourceVisibility.visibility_public),
384
+ ),
385
+ );
386
+ expect(failure.code).toBe(Code.PermissionDenied);
387
+ expect(failure.rawMessage).toBe(PUBLIC_VISIBILITY_DENY_MESSAGE);
388
+ });
389
+
390
+ describe("the list lanes (the built-in ListReadScope)", () => {
391
+ let founderKey: string;
392
+ let memberKey: string;
393
+ let founderEnvironment: string;
394
+ let memberEnvironment: string;
395
+ let otherOrgEnvironment: string;
396
+
397
+ beforeAll(async () => {
398
+ founderKey = (
399
+ await createClient(ApiKeyCommandController, asFounder()).create(
400
+ apiKeyInput("founder key"),
401
+ )
402
+ ).metadata!.id;
403
+ memberKey = (
404
+ await createClient(ApiKeyCommandController, asMember()).create(
405
+ apiKeyInput("member key"),
406
+ )
407
+ ).metadata!.id;
408
+ const founderEnvironments = createClient(
409
+ EnvironmentCommandController,
410
+ asFounder(),
411
+ );
412
+ founderEnvironment = (
413
+ await founderEnvironments.create(environmentInput("founder env"))
414
+ ).metadata!.id;
415
+ otherOrgEnvironment = (
416
+ await founderEnvironments.create(
417
+ environmentInput("other org env", OTHER_ORG),
418
+ )
419
+ ).metadata!.id;
420
+ // `can_create_environment` is `member`: a member's own credential
421
+ // store, the organization's admins never read it.
422
+ memberEnvironment = (
423
+ await createClient(EnvironmentCommandController, asMember()).create(
424
+ environmentInput("member env"),
425
+ )
426
+ ).metadata!.id;
427
+ });
428
+
429
+ it("an OUTSIDER lists nothing of an organization they hold no row in — the empty list, never an error", async () => {
430
+ const list = await createClient(
431
+ EnvironmentQueryController,
432
+ asMember(),
433
+ ).list({ org: OTHER_ORG });
434
+ expect(list.items).toEqual([]);
435
+ // The positive beside the negative: the founder, its owner, lists it.
436
+ const founders = await createClient(
437
+ EnvironmentQueryController,
438
+ asFounder(),
439
+ ).list({ org: OTHER_ORG });
440
+ expect(founders.items.map((e) => e.metadata?.id)).toEqual([
441
+ otherOrgEnvironment,
442
+ ]);
443
+ });
444
+
445
+ it("environments are their owner's: the founder — the organization's owner — does NOT list a member's, and the member does not list the founder's", async () => {
446
+ const founders = await createClient(
447
+ EnvironmentQueryController,
448
+ asFounder(),
449
+ ).list({ org: ORG });
450
+ expect(founders.items.map((e) => e.metadata?.id)).toEqual([
451
+ founderEnvironment,
452
+ ]);
453
+ const members = await createClient(
454
+ EnvironmentQueryController,
455
+ asMember(),
456
+ ).list({ org: ORG });
457
+ expect(members.items.map((e) => e.metadata?.id)).toEqual([
458
+ memberEnvironment,
459
+ ]);
460
+ });
461
+
462
+ it("ApiKey.findAll — skip-authorization, list-scoped — hands each person their own keys and nobody else's", async () => {
463
+ expect(
464
+ (
465
+ await createClient(ApiKeyQueryController, asFounder()).findAll({})
466
+ ).entries.map((k) => k.metadata?.id),
467
+ ).toEqual([founderKey]);
468
+ expect(
469
+ (
470
+ await createClient(ApiKeyQueryController, asMember()).findAll({})
471
+ ).entries.map((k) => k.metadata?.id),
472
+ ).toEqual([memberKey]);
473
+ });
474
+
475
+ it("the library is a search: a member's search omits the private agent and keeps the org-visible one; the founder's has both", async () => {
476
+ const memberSearch = await createClient(SearchService, asMember()).search(
477
+ { kinds: [ApiResourceKind.agent], org: ORG },
478
+ );
479
+ expect(memberSearch.entries.map((e) => e.id).sort()).toEqual([
480
+ orgAgent.metadata!.id,
481
+ ]);
482
+ const founderSearch = await createClient(
483
+ SearchService,
484
+ asFounder(),
485
+ ).search({ kinds: [ApiResourceKind.agent], org: ORG });
486
+ expect(founderSearch.entries.map((e) => e.id).sort()).toEqual(
487
+ [privateAgent.metadata!.id, orgAgent.metadata!.id].sort(),
488
+ );
489
+ });
490
+
491
+ it("the enumeration lanes answer through the scope without fault: recent activity and the execution summary for a member with no runs", async () => {
492
+ const recents = await createClient(
493
+ ActivityQueryController,
494
+ asMember(),
495
+ ).listRecentActivity({ pageSize: 10 });
496
+ expect(recents.entries).toEqual([]);
497
+ const summary = await createClient(
498
+ AgentExecutionQueryController,
499
+ asMember(),
500
+ ).getExecutionSummary({ org: ORG });
501
+ expect(summary.activeCount).toBe(0);
502
+ expect(summary.phaseCounts).toEqual({});
503
+ });
504
+
505
+ it("an unprovisioned subject's lists are empty, and become theirs after `provisionMyAccount`", async () => {
506
+ const visitorEnvironments = createClient(
507
+ EnvironmentQueryController,
508
+ asVisitor(),
509
+ );
510
+ expect((await visitorEnvironments.list({ org: ORG })).items).toEqual([]);
511
+ await createClient(
512
+ IdentityAccountCommandController,
513
+ asVisitor(),
514
+ ).provisionMyAccount({});
515
+ const own = await createClient(
516
+ EnvironmentCommandController,
517
+ asVisitor(),
518
+ ).create(environmentInput("visitor env"));
519
+ expect(
520
+ (await visitorEnvironments.list({ org: ORG })).items.map(
521
+ (e) => e.metadata?.id,
522
+ ),
523
+ ).toEqual([own.metadata!.id]);
524
+ });
525
+ });
526
+
527
+ it("an unprovisioned subject writes nothing until provisioned — then they are a member and still may not author a blueprint", async () => {
528
+ const strangerAgents = createClient(AgentCommandController, asStranger());
529
+ const before = await failureOf(
530
+ strangerAgents.create(
531
+ agentInput("Stranger Agent", ApiResourceVisibility.visibility_org),
532
+ ),
533
+ );
534
+ expect(before.code).toBe(Code.PermissionDenied);
535
+
536
+ await createClient(
537
+ IdentityAccountCommandController,
538
+ asStranger(),
539
+ ).provisionMyAccount({});
540
+ // A member now (2b's arm 5): reads the org-visible agent, and
541
+ // `can_create_agent` still says `admin`.
542
+ expect(
543
+ (
544
+ await createClient(AgentQueryController, asStranger()).get({
545
+ value: orgAgent.metadata!.id,
546
+ })
547
+ ).metadata?.id,
548
+ ).toBe(orgAgent.metadata!.id);
549
+ expect(
550
+ await codeOf(
551
+ strangerAgents.create(
552
+ agentInput("Stranger Agent", ApiResourceVisibility.visibility_org),
553
+ ),
554
+ ),
555
+ ).toBe(Code.PermissionDenied);
556
+ });
557
+ });
558
+
559
+ describe("built-in authorizer (composed server, trusted-local: the permissive default stays)", () => {
560
+ let dir: string;
561
+ let server: ComposedServer;
562
+ let port: number;
563
+
564
+ beforeAll(async () => {
565
+ dir = mkdtempSync(path.join(tmpdir(), "built-in-authorizer-local-"));
566
+ server = await composeServer({
567
+ config: loadConfig(baseConfig(dir)),
568
+ logger: silentLogger,
569
+ extensions: [],
570
+ portOverride: 0,
571
+ host: "127.0.0.1",
572
+ });
573
+ port = await server.start();
574
+ });
575
+
576
+ afterAll(async () => {
577
+ await server.shutdown();
578
+ rmSync(dir, { recursive: true, force: true });
579
+ });
580
+
581
+ it("a private agent created tokenless is read tokenless — one caller, nothing to separate", async () => {
582
+ const anonymous = transportFor(port);
583
+ await createClient(OrganizationCommandController, anonymous).create(
584
+ organizationInput(ORG),
585
+ );
586
+ const created = await createClient(
587
+ AgentCommandController,
588
+ anonymous,
589
+ ).create(
590
+ agentInput("Laptop Agent", ApiResourceVisibility.visibility_private),
591
+ );
592
+ const read = await createClient(AgentQueryController, anonymous).get({
593
+ value: created.metadata!.id,
594
+ });
595
+ expect(read.metadata?.id).toBe(created.metadata!.id);
596
+ });
597
+
598
+ it("the laptop keeps public visibility and organization enumeration — no directory, no platform gate that bites", async () => {
599
+ const anonymous = transportFor(port);
600
+ const publicAgent = await createClient(
601
+ AgentCommandController,
602
+ anonymous,
603
+ ).create(
604
+ agentInput(
605
+ "Public Laptop Agent",
606
+ ApiResourceVisibility.visibility_public,
607
+ ),
608
+ );
609
+ expect(publicAgent.metadata?.visibility).toBe(
610
+ ApiResourceVisibility.visibility_public,
611
+ );
612
+ const all = await createClient(OrganizationQueryController, anonymous).find(
613
+ { org: ORG },
614
+ );
615
+ expect(all.entries.map((o) => o.metadata?.id)).toContain(ORG);
616
+ });
617
+
618
+ it("the laptop's lists are the full scan — no scope composed, the rows stamped `system` included", async () => {
619
+ const anonymous = transportFor(port);
620
+ const environments = createClient(EnvironmentCommandController, anonymous);
621
+ await environments.create(environmentInput("laptop env one"));
622
+ await environments.create(environmentInput("laptop env two"));
623
+ const list = await createClient(EnvironmentQueryController, anonymous).list(
624
+ { org: ORG },
625
+ );
626
+ expect(list.items.map((e) => e.metadata?.name).sort()).toEqual([
627
+ "laptop env one",
628
+ "laptop env two",
629
+ ]);
630
+ const search = await createClient(SearchService, anonymous).search({
631
+ kinds: [ApiResourceKind.agent],
632
+ org: ORG,
633
+ });
634
+ expect(search.entries.length).toBeGreaterThanOrEqual(2);
635
+ });
636
+ });
637
+
638
+ /**
639
+ * C4 (the plan's claim check): for the sole person on a server, the four
640
+ * enumeration consumers and the restrict lanes answer byte-for-byte what
641
+ * they answered before any scope was composed. Two boots of the OIDC
642
+ * posture on one seed; the only variable is the scope — the built-in one,
643
+ * or a unit's pass-through (every offered id kept, every id enumerated:
644
+ * the branch's own state between slices 3 and 4, and the `??` proving
645
+ * that a unit's driver still wins over the built-in one).
646
+ */
647
+ describe("built-in list scope (C4: two boots, one seed — the scope is the only variable)", () => {
648
+ interface Boot {
649
+ readonly dir: string;
650
+ readonly server: ComposedServer;
651
+ readonly port: number;
652
+ }
653
+
654
+ /** What the founder sees through every list-shaped lane, by NAME (ids differ per boot). */
655
+ interface Readout {
656
+ readonly search: string[];
657
+ readonly keys: string[];
658
+ readonly environments: string[];
659
+ readonly recents: string[];
660
+ readonly summaryActive: number;
661
+ }
662
+
663
+ const boots: Boot[] = [];
664
+
665
+ async function boot(scope: ListReadScope | undefined): Promise<Boot> {
666
+ const dir = mkdtempSync(path.join(tmpdir(), "built-in-list-scope-c4-"));
667
+ const unit: ServerExtension = {
668
+ name: "fake-oidc-only",
669
+ requireAuthentication: true,
670
+ identityVerifiers: [fakeVerifier],
671
+ ...(scope === undefined ? {} : { drivers: { listReadScope: scope } }),
672
+ };
673
+ const server = await composeServer({
674
+ config: loadConfig(baseConfig(dir)),
675
+ logger: silentLogger,
676
+ extensions: [unit],
677
+ portOverride: 0,
678
+ host: "127.0.0.1",
679
+ });
680
+ const port = await server.start();
681
+ const opened = { dir, server, port };
682
+ boots.push(opened);
683
+ return opened;
684
+ }
685
+
686
+ async function seedFounder(port: number): Promise<void> {
687
+ const founder = transportFor(port, fakeJwt(FOUNDER, "founder@example.com"));
688
+ await createClient(
689
+ IdentityAccountCommandController,
690
+ founder,
691
+ ).provisionMyAccount({});
692
+ await createClient(OrganizationCommandController, founder).create(
693
+ organizationInput(ORG),
694
+ );
695
+ const agents = createClient(AgentCommandController, founder);
696
+ await agents.create(
697
+ agentInput("C4 Private Agent", ApiResourceVisibility.visibility_private),
698
+ );
699
+ await agents.create(
700
+ agentInput("C4 Org Agent", ApiResourceVisibility.visibility_org),
701
+ );
702
+ await createClient(ApiKeyCommandController, founder).create(
703
+ apiKeyInput("c4 key"),
704
+ );
705
+ await createClient(EnvironmentCommandController, founder).create(
706
+ environmentInput("c4 env"),
707
+ );
708
+ }
709
+
710
+ async function readout(port: number): Promise<Readout> {
711
+ const founder = transportFor(port, fakeJwt(FOUNDER, "founder@example.com"));
712
+ const search = await createClient(SearchService, founder).search({
713
+ kinds: [ApiResourceKind.agent],
714
+ org: ORG,
715
+ });
716
+ const keys = await createClient(ApiKeyQueryController, founder).findAll({});
717
+ const environments = await createClient(
718
+ EnvironmentQueryController,
719
+ founder,
720
+ ).list({ org: ORG });
721
+ const recents = await createClient(
722
+ ActivityQueryController,
723
+ founder,
724
+ ).listRecentActivity({ pageSize: 10 });
725
+ const summary = await createClient(
726
+ AgentExecutionQueryController,
727
+ founder,
728
+ ).getExecutionSummary({ org: ORG });
729
+ return {
730
+ search: search.entries.map((e) => e.name).sort(),
731
+ keys: keys.entries.map((k) => k.metadata?.name ?? "").sort(),
732
+ environments: environments.items
733
+ .map((e) => e.metadata?.name ?? "")
734
+ .sort(),
735
+ recents: recents.entries.map((e) => e.id).sort(),
736
+ summaryActive: summary.activeCount,
737
+ };
738
+ }
739
+
740
+ afterAll(async () => {
741
+ for (const opened of boots) {
742
+ await opened.server.shutdown();
743
+ rmSync(opened.dir, { recursive: true, force: true });
744
+ }
745
+ });
746
+
747
+ it("the founder's readout is identical with the built-in scope and with a pass-through unit scope", async () => {
748
+ // The pass-through enumerates every id of the kind from the server's
749
+ // own store (bound after boot: the unit is composed before the store
750
+ // exists), so the enumeration consumers see the unscoped answer.
751
+ let unscopedStore: Store | undefined;
752
+ const passThrough: ListReadScope = {
753
+ async authorizedResourceIds(_caller, kind) {
754
+ const declaration = builtInModel.byKind(kind);
755
+ if (unscopedStore === undefined || declaration === undefined) {
756
+ throw new Error("the pass-through is bound to a booted server");
757
+ }
758
+ const rows = await unscopedStore.listResources(kind);
759
+ return new Set(
760
+ rows.map(
761
+ (bytes) =>
762
+ metadataOf(fromBinary(declaration.schema, bytes))?.id ?? "",
763
+ ),
764
+ );
765
+ },
766
+ restrictListEntries: (_caller, _kind, entries) =>
767
+ Promise.resolve(new Set(entries.map((entry) => entry.id))),
768
+ };
769
+ const before = await boot(passThrough);
770
+ unscopedStore = before.server.store;
771
+ const after = await boot(undefined);
772
+ await seedFounder(before.port);
773
+ await seedFounder(after.port);
774
+ const beforeReadout = await readout(before.port);
775
+ const afterReadout = await readout(after.port);
776
+ expect(afterReadout).toEqual(beforeReadout);
777
+ // Not vacuous: the seed is visible through every lane read.
778
+ expect(afterReadout.search).toEqual(["C4 Org Agent", "C4 Private Agent"]);
779
+ expect(afterReadout.keys).toEqual(["c4 key"]);
780
+ expect(afterReadout.environments).toEqual(["c4 env"]);
781
+ });
782
+ });
783
+
784
+ describe("built-in authorizer (composed server, a unit's own Authorizer: nothing built in is installed)", () => {
785
+ let dir: string;
786
+ let server: ComposedServer;
787
+ let port: number;
788
+ let unitCalls = 0;
789
+
790
+ /** Denies everything and counts — the proof the unit's answer, not the built-in one, is on the wire. */
791
+ const denyingAuthorizer: Authorizer = {
792
+ authorize: () => {
793
+ unitCalls += 1;
794
+ return Promise.resolve({ kind: "deny", reason: "the unit says no" });
795
+ },
796
+ };
797
+
798
+ beforeAll(async () => {
799
+ dir = mkdtempSync(path.join(tmpdir(), "built-in-authorizer-unit-"));
800
+ const unit: ServerExtension = {
801
+ name: "fake-unit",
802
+ requireAuthentication: true,
803
+ identityVerifiers: [fakeVerifier],
804
+ authorizer: denyingAuthorizer,
805
+ };
806
+ server = await composeServer({
807
+ config: loadConfig(baseConfig(dir)),
808
+ logger: silentLogger,
809
+ extensions: [unit],
810
+ portOverride: 0,
811
+ host: "127.0.0.1",
812
+ });
813
+ port = await server.start();
814
+ });
815
+
816
+ afterAll(async () => {
817
+ await server.shutdown();
818
+ rmSync(dir, { recursive: true, force: true });
819
+ });
820
+
821
+ it("the founder is refused by the unit's Authorizer on their own organization — the built-in one never ran", async () => {
822
+ const founder = transportFor(port, fakeJwt(FOUNDER, "founder@example.com"));
823
+ // Organization create is `is_skip_authorization` by annotation; the
824
+ // read that follows is annotated `can_view` and meets the unit.
825
+ await createClient(OrganizationCommandController, founder).create(
826
+ organizationInput(ORG),
827
+ );
828
+ expect(
829
+ await codeOf(
830
+ createClient(OrganizationQueryController, founder).get({ value: ORG }),
831
+ ),
832
+ ).toBe(Code.PermissionDenied);
833
+ expect(unitCalls, "the unit's Authorizer was consulted").toBeGreaterThan(0);
834
+ });
835
+ });