@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,913 @@
1
+ /**
2
+ * Plugin controller — the Plugin kind's command and query sides. A plugin
3
+ * is the unit of install: `push` reads an Agent Plugins archive and
4
+ * materialises skills, MCP servers, an agent and workflows in the
5
+ * organization as the installing caller (push.ts holds the steps and the
6
+ * install discipline); `delete` removes them through their own chains;
7
+ * `updateVisibility` moves the plugin and every member together;
8
+ * `listMembers` derives membership from the label on the children;
9
+ * `getByReference` and `listVersions` are the shared content-addressed
10
+ * version steps bound to the plugin's digest and manifest version.
11
+ *
12
+ * Wiring mirrors the skill controller's: the store and the archive store
13
+ * are required; the transfer lane is an OPTIONAL modelled state (absent,
14
+ * createArtifactUploadUrl answers FailedPrecondition and push accepts
15
+ * inline bytes only); the materializer is a lazy provider because the
16
+ * in-process clients it rides exist only after the routes this controller
17
+ * is registered in.
18
+ *
19
+ * Proven by __tests__/plugin.test.ts (composed-server round-trips) and
20
+ * plugin.conformance.test.ts (CONFORMANCE_TARGET=local, local-postgres).
21
+ */
22
+ import { create, fromBinary } from "@bufbuild/protobuf";
23
+ import type { ConnectRouter, HandlerContext } from "@connectrpc/connect";
24
+
25
+ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
26
+ import { PluginSchema } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/api_pb";
27
+ import type { Plugin } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/api_pb";
28
+ import { PluginCommandController } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/command_pb";
29
+ import {
30
+ ListPluginMembersResponseSchema,
31
+ ListPluginVersionsResponseSchema,
32
+ PluginArtifactUploadUrlSchema,
33
+ PluginMemberSchema,
34
+ PluginVersionEntrySchema,
35
+ PushPluginRequestSchema,
36
+ } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/io_pb";
37
+ import type {
38
+ CreatePluginArtifactUploadUrlRequest,
39
+ ListPluginMembersResponse,
40
+ ListPluginVersionsInput,
41
+ ListPluginVersionsResponse,
42
+ PluginArtifactUploadUrl,
43
+ PluginId,
44
+ PluginVersionEntry,
45
+ PushPluginRequest,
46
+ } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/io_pb";
47
+ import { PluginQueryController } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/query_pb";
48
+ import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
49
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
50
+ import type {
51
+ ApiResourceReference,
52
+ UpdateVisibilityInput,
53
+ } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
54
+ import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
55
+
56
+ import type { ContentAddressedArchiveStore } from "../../archive/content-store.js";
57
+ import { MAX_ZIP_SIZE } from "../../archive/limits.js";
58
+ import type { Logger } from "../../boot/logger.js";
59
+ import type { Authorizer } from "../../extensions/authorizer.js";
60
+ import type { ResourceAuthorizationLifecycle } from "../../extensions/resource-authorization.js";
61
+ import {
62
+ failedPreconditionError,
63
+ internalError,
64
+ invalidArgumentError,
65
+ notFoundError,
66
+ } from "../../pipeline/errors.js";
67
+ import { apiResourceKindKey } from "../../pipeline/interceptors/apiresource.js";
68
+ import { callerIdentityOf } from "../../pipeline/interceptors/auth.js";
69
+ import { newPipeline } from "../../pipeline/pipeline.js";
70
+ import type { PipelineStep } from "../../pipeline/pipeline.js";
71
+ import { RequestContext } from "../../pipeline/request-context.js";
72
+ import {
73
+ newCleanupIamPoliciesStep,
74
+ newRecordVisibilityBeforeUpdateStep,
75
+ newUpdateVisibilityTuplesStep,
76
+ } from "../../pipeline/steps/authorization-tuples.js";
77
+ import {
78
+ authorizeResolvedResource,
79
+ newAuthorizeStep,
80
+ } from "../../pipeline/steps/authorize.js";
81
+ import { setAuditFieldsForUpdate } from "../../pipeline/steps/defaults.js";
82
+ import {
83
+ newDeleteResourceStep,
84
+ newExtractResourceIdStep,
85
+ newLoadExistingForDeleteStep,
86
+ } from "../../pipeline/steps/delete.js";
87
+ import { newDeleteSearchIndexStep } from "../../pipeline/steps/index-search.js";
88
+ import { EXISTING_RESOURCE_KEY } from "../../pipeline/steps/load-existing.js";
89
+ import {
90
+ TARGET_RESOURCE_KEY,
91
+ newLoadTargetStep,
92
+ } from "../../pipeline/steps/load-target.js";
93
+ import { collectSpecReferences } from "../../pipeline/steps/references.js";
94
+ import { newResolveArtifactSourceStep } from "../../pipeline/steps/resolve-artifact-source.js";
95
+ import { newValidateProtoStep } from "../../pipeline/steps/validation.js";
96
+ import { newValidateVisibilityUpdateStep } from "../../pipeline/steps/validate-visibility.js";
97
+ import { newDeleteVersionArchivesStep } from "../../pipeline/steps/version-archive.js";
98
+ import {
99
+ LIST_VERSIONS_RESOURCE_ID_KEY,
100
+ LIST_VERSIONS_RESPONSE_KEY,
101
+ newLoadAndMapVersionsStep,
102
+ newLoadByReferenceWithVersionStep,
103
+ newResolveBySlugForVersionsStep,
104
+ } from "../../pipeline/steps/version-history.js";
105
+ import type { VersionHistoryBinding } from "../../pipeline/steps/version-history.js";
106
+ import { newAuthorizeVisibilityTransitionStep } from "../../pipeline/steps/visibility-gates.js";
107
+ import { metadataOf } from "../../pipeline/steps/shapes.js";
108
+ import type { Store } from "../../store/interface.js";
109
+ import { uploadUrl } from "../skill/transfer/handler.js";
110
+ import type { UploadSlots } from "../skill/transfer/slots.js";
111
+ import { TRANSFER_LANE_NOT_CONFIGURED } from "./constants.js";
112
+ import type { PluginMaterializerProvider } from "./materialize/ports.js";
113
+ import { findMembers } from "./members.js";
114
+ import type { Member } from "./members.js";
115
+ import {
116
+ PLUGIN_CONVERGED_KEY,
117
+ PLUGIN_KEY,
118
+ EXISTING_PLUGIN_KEY,
119
+ newArchiveCurrentPluginStep,
120
+ newBuildInitialPluginStep,
121
+ newCheckAndStoreArtifactStep,
122
+ newFinalizePluginStatusStep,
123
+ newFindExistingPluginBySlugStep,
124
+ newGateAndHashArchiveStep,
125
+ newGeneratePluginIdIfNeededStep,
126
+ newGuardPluginVisibilityStep,
127
+ newIndexPluginSearchStep,
128
+ newMaterializeMembersStep,
129
+ newParseOverlayDocumentsStep,
130
+ newPlanMaterializationStep,
131
+ newPluginPushAuthorizationTuplesStep,
132
+ newPopulatePluginFieldsStep,
133
+ newReadPluginPackageStep,
134
+ newRemoveDroppedMembersStep,
135
+ newResolveConvergenceStep,
136
+ newSanitizePluginMetadataStep,
137
+ newStorePluginStep,
138
+ orderForDeletion,
139
+ pluginLiveTag,
140
+ } from "./push.js";
141
+ import { pluginSearchExtractor } from "./search-extractor.js";
142
+
143
+ /** The transfer lane's controller-side pair; the slots are the skill lane's (one upload surface). */
144
+ export interface PluginTransferLaneDeps {
145
+ readonly slots: UploadSlots;
146
+ readonly baseUrl: string;
147
+ }
148
+
149
+ export interface PluginControllerDeps {
150
+ readonly store: Store;
151
+ readonly logger: Logger;
152
+ readonly authorizer: Authorizer;
153
+ readonly authorizationLifecycle: ResourceAuthorizationLifecycle | undefined;
154
+ readonly artifactStorage: ContentAddressedArchiveStore;
155
+ readonly materializerProvider: PluginMaterializerProvider;
156
+ readonly transferLane?: PluginTransferLaneDeps;
157
+ }
158
+
159
+ /** Registers both plugin services on the router (routes stage). */
160
+ export function registerPluginServices(
161
+ router: ConnectRouter,
162
+ deps: PluginControllerDeps,
163
+ ): void {
164
+ router.service(PluginCommandController, {
165
+ push: (req, ctx) => push(deps, req, ctx),
166
+ createArtifactUploadUrl: (req, ctx) =>
167
+ createArtifactUploadUrl(deps, req, ctx),
168
+ updateVisibility: (input, ctx) => updateVisibility(deps, input, ctx),
169
+ delete: (id, ctx) => deletePlugin(deps, id, ctx),
170
+ });
171
+ router.service(PluginQueryController, {
172
+ get: (id, ctx) => get(deps, id, ctx),
173
+ getByReference: (ref, ctx) => getByReference(deps, ref, ctx),
174
+ listMembers: (id, ctx) => listMembers(deps, id, ctx),
175
+ listVersions: (req, ctx) => listVersions(deps, req, ctx),
176
+ });
177
+ }
178
+
179
+ function kindOf(ctx: HandlerContext): ApiResourceKind {
180
+ return ctx.values.get(apiResourceKindKey);
181
+ }
182
+
183
+ // ─── push ────────────────────────────────────────────────────────────────
184
+
185
+ /**
186
+ * Push — the plan chain, then the install chain unless the plan found the
187
+ * stored plugin already converged (push.ts holds the shape). Returns the
188
+ * head from context: the pipeline's message type is the request.
189
+ */
190
+ async function push(
191
+ deps: PluginControllerDeps,
192
+ req: PushPluginRequest,
193
+ ctx: HandlerContext,
194
+ ): Promise<Plugin> {
195
+ const reqCtx = new RequestContext(
196
+ PushPluginRequestSchema,
197
+ req,
198
+ callerIdentityOf(ctx),
199
+ kindOf(ctx),
200
+ );
201
+ await newPipeline<typeof PushPluginRequestSchema>(
202
+ "plugin-push-plan",
203
+ deps.logger,
204
+ )
205
+ .addStep(
206
+ newAuthorizeStep(PluginCommandController.method.push, deps.authorizer),
207
+ )
208
+ .addStep(newValidateProtoStep())
209
+ .addStep(
210
+ newResolveArtifactSourceStep<typeof PushPluginRequestSchema>(
211
+ deps.transferLane?.slots,
212
+ {
213
+ source: (input) => ({
214
+ artifact: input.artifact,
215
+ artifactUploadRef: input.artifactUploadRef,
216
+ }),
217
+ laneNotConfigured: TRANSFER_LANE_NOT_CONFIGURED,
218
+ },
219
+ ),
220
+ )
221
+ .addStep(newGateAndHashArchiveStep())
222
+ .addStep(newReadPluginPackageStep())
223
+ .addStep(newBuildInitialPluginStep())
224
+ .addStep(newFindExistingPluginBySlugStep(deps.store))
225
+ .addStep(newGeneratePluginIdIfNeededStep())
226
+ .addStep(newParseOverlayDocumentsStep())
227
+ .addStep(newSanitizePluginMetadataStep(deps.authorizer))
228
+ .addStep(newPlanMaterializationStep(deps.store, deps.authorizer))
229
+ .addStep(newGuardPluginVisibilityStep(deps.authorizer))
230
+ .addStep(newResolveConvergenceStep())
231
+ .build()
232
+ .execute(reqCtx);
233
+
234
+ if (reqCtx.get(PLUGIN_CONVERGED_KEY) === true) {
235
+ return reqCtx.get(EXISTING_PLUGIN_KEY) as Plugin;
236
+ }
237
+
238
+ await newPipeline<typeof PushPluginRequestSchema>(
239
+ "plugin-push-install",
240
+ deps.logger,
241
+ )
242
+ .addStep(newCheckAndStoreArtifactStep(deps.artifactStorage))
243
+ .addStep(newPopulatePluginFieldsStep())
244
+ .addStep(newArchiveCurrentPluginStep(deps.store, deps.logger))
245
+ .addStep(newStorePluginStep(deps.store, "StorePlugin"))
246
+ .addStep(
247
+ newMaterializeMembersStep(
248
+ deps.store,
249
+ deps.materializerProvider,
250
+ deps.logger,
251
+ ),
252
+ )
253
+ .addStep(
254
+ newRemoveDroppedMembersStep(
255
+ deps.store,
256
+ deps.materializerProvider,
257
+ deps.logger,
258
+ ),
259
+ )
260
+ .addStep(newFinalizePluginStatusStep())
261
+ .addStep(newStorePluginStep(deps.store, "StorePluginReady"))
262
+ .addStep(
263
+ newPluginPushAuthorizationTuplesStep(
264
+ deps.authorizationLifecycle,
265
+ deps.logger,
266
+ ),
267
+ )
268
+ .addStep(newIndexPluginSearchStep(deps.store, deps.logger))
269
+ .build()
270
+ .execute(reqCtx);
271
+ return reqCtx.get(PLUGIN_KEY) as Plugin;
272
+ }
273
+
274
+ // ─── createArtifactUploadUrl ─────────────────────────────────────────────
275
+
276
+ /**
277
+ * Mints a short-lived, single-use upload URL over the shared slots; an
278
+ * over-limit declaration is refused with the limit BEFORE any bytes move.
279
+ */
280
+ async function createArtifactUploadUrl(
281
+ deps: PluginControllerDeps,
282
+ req: CreatePluginArtifactUploadUrlRequest,
283
+ ctx: HandlerContext,
284
+ ): Promise<PluginArtifactUploadUrl> {
285
+ const lane = deps.transferLane;
286
+ if (lane === undefined) {
287
+ throw failedPreconditionError(TRANSFER_LANE_NOT_CONFIGURED);
288
+ }
289
+ const reqCtx = new RequestContext(
290
+ PluginCommandController.method.createArtifactUploadUrl.input,
291
+ req,
292
+ callerIdentityOf(ctx),
293
+ kindOf(ctx),
294
+ );
295
+ await newPipeline<
296
+ typeof PluginCommandController.method.createArtifactUploadUrl.input
297
+ >("plugin-create-artifact-upload-url", deps.logger)
298
+ .addStep(
299
+ newAuthorizeStep(
300
+ PluginCommandController.method.createArtifactUploadUrl,
301
+ deps.authorizer,
302
+ ),
303
+ )
304
+ .addStep(newValidateProtoStep())
305
+ .build()
306
+ .execute(reqCtx);
307
+
308
+ if (req.sizeBytes > BigInt(MAX_ZIP_SIZE)) {
309
+ throw invalidArgumentError(
310
+ `plugin archive size ${req.sizeBytes} bytes exceeds the ${MAX_ZIP_SIZE}-byte (100MB) archive limit`,
311
+ );
312
+ }
313
+ let minted: { ref: string; ttlMs: number };
314
+ try {
315
+ minted = lane.slots.mint(Number(req.sizeBytes));
316
+ } catch (error) {
317
+ throw internalError(error, "failed to mint upload reference");
318
+ }
319
+ return create(PluginArtifactUploadUrlSchema, {
320
+ url: uploadUrl(lane.baseUrl, minted.ref),
321
+ artifactUploadRef: minted.ref,
322
+ ttlSeconds: Math.trunc(minted.ttlMs / 1000),
323
+ });
324
+ }
325
+
326
+ // ─── updateVisibility ────────────────────────────────────────────────────
327
+
328
+ const UPDATE_VISIBILITY_PLUGIN_KEY = "updateVisibilityPlugin";
329
+ type UpdateVisibilityDesc =
330
+ typeof PluginCommandController.method.updateVisibility.input;
331
+
332
+ /**
333
+ * A targeted metadata update on the plugin, then the same level on every
334
+ * member through its kind's own updateVisibility door, in-process as the
335
+ * caller. Load runs before level validation so NOT_FOUND wins.
336
+ */
337
+ async function updateVisibility(
338
+ deps: PluginControllerDeps,
339
+ input: UpdateVisibilityInput,
340
+ ctx: HandlerContext,
341
+ ): Promise<Plugin> {
342
+ const reqCtx = new RequestContext(
343
+ PluginCommandController.method.updateVisibility.input,
344
+ input,
345
+ callerIdentityOf(ctx),
346
+ kindOf(ctx),
347
+ );
348
+ await newPipeline<UpdateVisibilityDesc>(
349
+ "plugin-update-visibility",
350
+ deps.logger,
351
+ )
352
+ .addStep(
353
+ newAuthorizeStep(
354
+ PluginCommandController.method.updateVisibility,
355
+ deps.authorizer,
356
+ ),
357
+ )
358
+ .addStep(newValidateProtoStep())
359
+ .addStep(newLoadPluginByIdStep(deps.store, UPDATE_VISIBILITY_PLUGIN_KEY))
360
+ .addStep(newRecordVisibilityBeforeUpdateStep(UPDATE_VISIBILITY_PLUGIN_KEY))
361
+ .addStep(newValidateVisibilityUpdateStep())
362
+ .addStep(
363
+ newAuthorizeVisibilityTransitionStep(
364
+ UPDATE_VISIBILITY_PLUGIN_KEY,
365
+ deps.authorizer,
366
+ ),
367
+ )
368
+ .addStep(newSetPluginVisibilityStep())
369
+ .addStep(
370
+ newPersistPluginStep(
371
+ deps.store,
372
+ UPDATE_VISIBILITY_PLUGIN_KEY,
373
+ "PersistPluginForVisibilityUpdate",
374
+ ),
375
+ )
376
+ .addStep(
377
+ newUpdateVisibilityTuplesStep(
378
+ deps.authorizationLifecycle,
379
+ UPDATE_VISIBILITY_PLUGIN_KEY,
380
+ ),
381
+ )
382
+ .addStep(
383
+ newFanOutVisibilityToMembersStep(deps.store, deps.materializerProvider),
384
+ )
385
+ .addStep(
386
+ newIndexPluginStep(
387
+ deps.store,
388
+ deps.logger,
389
+ UPDATE_VISIBILITY_PLUGIN_KEY,
390
+ "IndexPluginAfterVisibilityUpdate",
391
+ ),
392
+ )
393
+ .build()
394
+ .execute(reqCtx);
395
+ return reqCtx.get(UPDATE_VISIBILITY_PLUGIN_KEY) as Plugin;
396
+ }
397
+
398
+ /** Loads the plugin by resource_id; ANY load failure → NotFound. */
399
+ function newLoadPluginByIdStep(
400
+ store: Store,
401
+ key: string,
402
+ ): PipelineStep<UpdateVisibilityDesc> {
403
+ return {
404
+ name: "LoadPluginForVisibilityUpdate",
405
+ async execute(ctx: RequestContext<UpdateVisibilityDesc>): Promise<void> {
406
+ let plugin: Plugin;
407
+ try {
408
+ plugin = await store.getResource(
409
+ ctx.apiResourceKind,
410
+ ctx.input.resourceId,
411
+ PluginSchema,
412
+ );
413
+ } catch {
414
+ throw notFoundError("plugin", ctx.input.resourceId);
415
+ }
416
+ ctx.set(key, plugin);
417
+ },
418
+ };
419
+ }
420
+
421
+ /** Sets metadata.visibility and stamps the StatusAudit slot (#540). */
422
+ function newSetPluginVisibilityStep(): PipelineStep<UpdateVisibilityDesc> {
423
+ return {
424
+ name: "SetPluginVisibility",
425
+ execute(ctx: RequestContext<UpdateVisibilityDesc>): void {
426
+ const plugin = ctx.get(UPDATE_VISIBILITY_PLUGIN_KEY) as Plugin;
427
+ if (plugin.metadata !== undefined) {
428
+ plugin.metadata.visibility = ctx.input.visibility;
429
+ }
430
+ setAuditFieldsForUpdate(
431
+ PluginSchema,
432
+ plugin,
433
+ "status_audit",
434
+ ctx.callerIdentity,
435
+ );
436
+ },
437
+ };
438
+ }
439
+
440
+ /** The plugin's level, applied to every member through its own door. */
441
+ function newFanOutVisibilityToMembersStep(
442
+ store: Store,
443
+ materializerProvider: PluginMaterializerProvider,
444
+ ): PipelineStep<UpdateVisibilityDesc> {
445
+ return {
446
+ name: "FanOutVisibilityToMembers",
447
+ async execute(ctx: RequestContext<UpdateVisibilityDesc>): Promise<void> {
448
+ const plugin = ctx.get(UPDATE_VISIBILITY_PLUGIN_KEY) as Plugin;
449
+ const members = await membersOf(store, plugin);
450
+ const materializer = materializerProvider();
451
+ for (const member of members) {
452
+ await materializer.updateVisibility(
453
+ member.kind,
454
+ member.id,
455
+ ctx.input.visibility,
456
+ ctx.callerIdentity,
457
+ );
458
+ }
459
+ },
460
+ };
461
+ }
462
+
463
+ // ─── delete ──────────────────────────────────────────────────────────────
464
+
465
+ type DeleteDesc = typeof PluginCommandController.method.delete.input;
466
+ const DELETE_MEMBERS_KEY = "deletePluginMembers";
467
+
468
+ /**
469
+ * Delete — refuses while a resource outside the plugin references a
470
+ * member, then removes members through their own chains (agent first,
471
+ * then the rest in reverse materialisation order), then the head.
472
+ * Children first so a failure leaves a plugin whose remaining members are
473
+ * still listed; a retry converges. Returns the deleted plugin.
474
+ */
475
+ async function deletePlugin(
476
+ deps: PluginControllerDeps,
477
+ id: PluginId,
478
+ ctx: HandlerContext,
479
+ ): Promise<Plugin> {
480
+ const reqCtx = new RequestContext(
481
+ PluginCommandController.method.delete.input,
482
+ id,
483
+ callerIdentityOf(ctx),
484
+ kindOf(ctx),
485
+ );
486
+ await newPipeline<DeleteDesc>("plugin-delete", deps.logger)
487
+ .addStep(
488
+ newAuthorizeStep(PluginCommandController.method.delete, deps.authorizer),
489
+ )
490
+ .addStep(newValidateProtoStep())
491
+ .addStep(newExtractResourceIdStep())
492
+ .addStep(newLoadExistingForDeleteStep(deps.store, PluginSchema))
493
+ .addStep(newGuardMembersUnreferencedStep(deps.store))
494
+ .addStep(
495
+ newCascadeDeleteMembersStep(deps.materializerProvider, deps.logger),
496
+ )
497
+ .addStep(
498
+ newDeleteVersionArchivesStep(deps.store, deps.logger, {
499
+ stepName: "DeletePluginArchives",
500
+ noun: "plugin",
501
+ }),
502
+ )
503
+ .addStep(newDeleteResourceStep(deps.store))
504
+ .addStep(
505
+ newCleanupIamPoliciesStep(deps.authorizationLifecycle, deps.logger),
506
+ )
507
+ .addStep(newDeleteSearchIndexStep(deps.store, deps.logger))
508
+ .build()
509
+ .execute(reqCtx);
510
+ const deleted = reqCtx.get(EXISTING_RESOURCE_KEY);
511
+ if (deleted === undefined) {
512
+ throw internalError(
513
+ new Error("deleted plugin not found in context"),
514
+ "deleted plugin not found in context",
515
+ );
516
+ }
517
+ return deleted as Plugin;
518
+ }
519
+
520
+ /**
521
+ * GuardMembersUnreferenced — a user's own agent or workflow that
522
+ * references a member blocks the uninstall, naming the referrers: a
523
+ * dangling `skill_ref` found at the next session is the worse outcome.
524
+ * Members referencing each other are the plugin's business and pass.
525
+ */
526
+ function newGuardMembersUnreferencedStep(
527
+ store: Store,
528
+ ): PipelineStep<DeleteDesc> {
529
+ return {
530
+ name: "GuardMembersUnreferenced",
531
+ async execute(ctx: RequestContext<DeleteDesc>): Promise<void> {
532
+ const plugin = ctx.get(EXISTING_RESOURCE_KEY) as Plugin;
533
+ const members = await membersOf(store, plugin);
534
+ ctx.set(DELETE_MEMBERS_KEY, members);
535
+ if (members.length === 0) {
536
+ return;
537
+ }
538
+ const org = plugin.metadata?.org ?? "";
539
+ const memberKeys = new Set(
540
+ members.map((member) => `${member.kind}:${member.slug}`),
541
+ );
542
+ const memberIds = new Set(members.map((member) => member.id));
543
+ const referrers: string[] = [];
544
+ for (const { kind, schema, noun } of [
545
+ { kind: ApiResourceKind.agent, schema: AgentSchema, noun: "agent" },
546
+ {
547
+ kind: ApiResourceKind.workflow,
548
+ schema: WorkflowSchema,
549
+ noun: "workflow",
550
+ },
551
+ ]) {
552
+ let rows: Uint8Array[];
553
+ try {
554
+ rows = await store.listResources(kind);
555
+ } catch (error) {
556
+ throw internalError(
557
+ error,
558
+ `failed to list ${noun}s for the plugin reference check`,
559
+ );
560
+ }
561
+ for (const raw of rows) {
562
+ const resource = fromBinary(schema, raw);
563
+ const metadata = metadataOf(resource);
564
+ if (
565
+ metadata === undefined ||
566
+ metadata.org !== org ||
567
+ memberIds.has(metadata.id)
568
+ ) {
569
+ continue;
570
+ }
571
+ const hit = collectSpecReferences(schema, resource).some(
572
+ (ref) =>
573
+ (ref.org === "" || ref.org === org) &&
574
+ memberKeys.has(`${ref.kind}:${ref.slug}`),
575
+ );
576
+ if (hit) {
577
+ referrers.push(`${noun} '${metadata.slug}'`);
578
+ }
579
+ }
580
+ }
581
+ if (referrers.length > 0) {
582
+ throw failedPreconditionError(
583
+ `plugin '${plugin.metadata?.slug ?? ""}' is still used by ${referrers.sort().join(", ")}; ` +
584
+ "detach them from the plugin's skills and servers first",
585
+ );
586
+ }
587
+ },
588
+ };
589
+ }
590
+
591
+ /** CascadeDeleteMembers — every member through its own delete chain, agent first. */
592
+ function newCascadeDeleteMembersStep(
593
+ materializerProvider: PluginMaterializerProvider,
594
+ logger: Logger,
595
+ ): PipelineStep<DeleteDesc> {
596
+ return {
597
+ name: "CascadeDeleteMembers",
598
+ async execute(ctx: RequestContext<DeleteDesc>): Promise<void> {
599
+ const plugin = ctx.get(EXISTING_RESOURCE_KEY) as Plugin;
600
+ const members = ctx.get(DELETE_MEMBERS_KEY) as Member[];
601
+ const materializer = materializerProvider();
602
+ for (const member of orderForDeletion(members)) {
603
+ await materializer.deleteByKind(
604
+ member.kind,
605
+ member.id,
606
+ ctx.callerIdentity,
607
+ );
608
+ }
609
+ if (members.length > 0) {
610
+ logger.info("Deleted plugin members", {
611
+ pluginId: plugin.metadata?.id ?? "",
612
+ members: members.map(
613
+ (member) => `${ApiResourceKind[member.kind]}:${member.slug}`,
614
+ ),
615
+ });
616
+ }
617
+ },
618
+ };
619
+ }
620
+
621
+ // ─── queries ─────────────────────────────────────────────────────────────
622
+
623
+ async function get(
624
+ deps: PluginControllerDeps,
625
+ id: PluginId,
626
+ ctx: HandlerContext,
627
+ ): Promise<Plugin> {
628
+ const reqCtx = new RequestContext(
629
+ PluginQueryController.method.get.input,
630
+ id,
631
+ callerIdentityOf(ctx),
632
+ kindOf(ctx),
633
+ );
634
+ await newPipeline<typeof PluginQueryController.method.get.input>(
635
+ "plugin-get",
636
+ deps.logger,
637
+ )
638
+ .addStep(
639
+ newAuthorizeStep(PluginQueryController.method.get, deps.authorizer),
640
+ )
641
+ .addStep(newValidateProtoStep())
642
+ .addStep(newLoadTargetStep(deps.store, PluginSchema))
643
+ .build()
644
+ .execute(reqCtx);
645
+ return reqCtx.get(TARGET_RESOURCE_KEY) as Plugin;
646
+ }
647
+
648
+ type ListVersionsDesc = typeof PluginQueryController.method.listVersions.input;
649
+
650
+ /** Where a plugin keeps its hash and its tag, and how its history renders. */
651
+ const pluginVersionBinding: VersionHistoryBinding<
652
+ typeof PluginSchema,
653
+ ListVersionsDesc,
654
+ PluginVersionEntry,
655
+ ListPluginVersionsResponse
656
+ > = {
657
+ kind: ApiResourceKind.plugin,
658
+ schema: PluginSchema,
659
+ noun: "plugin",
660
+ headHashOf: (plugin) => plugin.status?.digest ?? "",
661
+ liveTagOf: pluginLiveTag,
662
+ input: (req) => req,
663
+ mapEntry: (plugin, isCurrent, tag) => {
664
+ const entry = create(PluginVersionEntrySchema, { isCurrent, tag });
665
+ if (plugin.status !== undefined) {
666
+ entry.digest = plugin.status.digest;
667
+ entry.artifactStorageKey = plugin.status.artifactStorageKey;
668
+ const specAudit = plugin.status.audit?.specAudit;
669
+ if (specAudit !== undefined) {
670
+ entry.pushedAt = specAudit.updatedAt ?? specAudit.createdAt;
671
+ entry.pushedBy = specAudit.updatedBy ?? specAudit.createdBy;
672
+ }
673
+ }
674
+ if (plugin.metadata?.version !== undefined) {
675
+ entry.message = plugin.metadata.version.message;
676
+ }
677
+ return entry;
678
+ },
679
+ response: (versions, nextPageToken, totalCount) =>
680
+ create(ListPluginVersionsResponseSchema, {
681
+ versions,
682
+ nextPageToken,
683
+ totalCount,
684
+ }),
685
+ };
686
+
687
+ /**
688
+ * GetByReference — slug + org with the version ladder, then can_view on
689
+ * the RESOLVED plugin (the input carries no id, so the annotation skips
690
+ * and the handler authorizes mid-chain, the ListVersions pattern).
691
+ */
692
+ async function getByReference(
693
+ deps: PluginControllerDeps,
694
+ ref: ApiResourceReference,
695
+ ctx: HandlerContext,
696
+ ): Promise<Plugin> {
697
+ const reqCtx = new RequestContext(
698
+ PluginQueryController.method.getByReference.input,
699
+ ref,
700
+ callerIdentityOf(ctx),
701
+ kindOf(ctx),
702
+ );
703
+ await newPipeline<typeof PluginQueryController.method.getByReference.input>(
704
+ "plugin-get-by-reference",
705
+ deps.logger,
706
+ )
707
+ .addStep(
708
+ newAuthorizeStep(
709
+ PluginQueryController.method.getByReference,
710
+ deps.authorizer,
711
+ ),
712
+ )
713
+ .addStep(newValidateProtoStep())
714
+ .addStep(
715
+ newLoadByReferenceWithVersionStep(
716
+ deps.store,
717
+ pluginVersionBinding,
718
+ "LoadPluginByReference",
719
+ ),
720
+ )
721
+ .addStep({
722
+ name: "AuthorizeResolvedPlugin",
723
+ async execute(stepCtx): Promise<void> {
724
+ const resolved = stepCtx.get(TARGET_RESOURCE_KEY) as Plugin;
725
+ await authorizeResolvedResource(
726
+ deps.authorizer,
727
+ stepCtx.callerIdentity,
728
+ {
729
+ permission: IamPermission.can_view,
730
+ resourceKind: ApiResourceKind.plugin,
731
+ resourceId: resolved.metadata?.id ?? "",
732
+ },
733
+ "unauthorized to get plugin",
734
+ );
735
+ },
736
+ })
737
+ .build()
738
+ .execute(reqCtx);
739
+ return reqCtx.get(TARGET_RESOURCE_KEY) as Plugin;
740
+ }
741
+
742
+ const LIST_MEMBERS_RESPONSE_KEY = "listMembersResponse";
743
+
744
+ /** ListMembers — the four label scans, in materialisation order. */
745
+ async function listMembers(
746
+ deps: PluginControllerDeps,
747
+ id: PluginId,
748
+ ctx: HandlerContext,
749
+ ): Promise<ListPluginMembersResponse> {
750
+ const reqCtx = new RequestContext(
751
+ PluginQueryController.method.listMembers.input,
752
+ id,
753
+ callerIdentityOf(ctx),
754
+ kindOf(ctx),
755
+ );
756
+ await newPipeline<typeof PluginQueryController.method.listMembers.input>(
757
+ "plugin-list-members",
758
+ deps.logger,
759
+ )
760
+ .addStep(
761
+ newAuthorizeStep(
762
+ PluginQueryController.method.listMembers,
763
+ deps.authorizer,
764
+ ),
765
+ )
766
+ .addStep(newValidateProtoStep())
767
+ .addStep(newLoadTargetStep(deps.store, PluginSchema))
768
+ .addStep({
769
+ name: "ListPluginMembers",
770
+ async execute(stepCtx): Promise<void> {
771
+ const plugin = stepCtx.get(TARGET_RESOURCE_KEY) as Plugin;
772
+ const members = await membersOf(deps.store, plugin);
773
+ stepCtx.set(
774
+ LIST_MEMBERS_RESPONSE_KEY,
775
+ create(ListPluginMembersResponseSchema, {
776
+ members: members.map((member) =>
777
+ create(PluginMemberSchema, {
778
+ kind: member.kind,
779
+ id: member.id,
780
+ slug: member.slug,
781
+ name: member.name,
782
+ }),
783
+ ),
784
+ }),
785
+ );
786
+ },
787
+ })
788
+ .build()
789
+ .execute(reqCtx);
790
+ return reqCtx.get(LIST_MEMBERS_RESPONSE_KEY) as ListPluginMembersResponse;
791
+ }
792
+
793
+ /** ListVersions — resolve by slug, authorize the resolved plugin, map audit records, paginate. */
794
+ async function listVersions(
795
+ deps: PluginControllerDeps,
796
+ req: ListPluginVersionsInput,
797
+ ctx: HandlerContext,
798
+ ): Promise<ListPluginVersionsResponse> {
799
+ const reqCtx = new RequestContext(
800
+ PluginQueryController.method.listVersions.input,
801
+ req,
802
+ callerIdentityOf(ctx),
803
+ kindOf(ctx),
804
+ );
805
+ await newPipeline<ListVersionsDesc>("plugin-list-versions", deps.logger)
806
+ .addStep(
807
+ newAuthorizeStep(
808
+ PluginQueryController.method.listVersions,
809
+ deps.authorizer,
810
+ ),
811
+ )
812
+ .addStep(newValidateProtoStep())
813
+ .addStep(
814
+ newResolveBySlugForVersionsStep(
815
+ deps.store,
816
+ pluginVersionBinding,
817
+ "ResolvePluginBySlug",
818
+ ),
819
+ )
820
+ .addStep({
821
+ name: "AuthorizeResolvedPlugin",
822
+ async execute(stepCtx): Promise<void> {
823
+ await authorizeResolvedResource(
824
+ deps.authorizer,
825
+ stepCtx.callerIdentity,
826
+ {
827
+ permission: IamPermission.can_view,
828
+ resourceKind: ApiResourceKind.plugin,
829
+ resourceId: stepCtx.get(LIST_VERSIONS_RESOURCE_ID_KEY) as string,
830
+ },
831
+ "unauthorized to view plugin version history",
832
+ );
833
+ },
834
+ })
835
+ .addStep(
836
+ newLoadAndMapVersionsStep(
837
+ deps.store,
838
+ pluginVersionBinding,
839
+ "LoadAndMapVersions",
840
+ ),
841
+ )
842
+ .build()
843
+ .execute(reqCtx);
844
+ return reqCtx.get(LIST_VERSIONS_RESPONSE_KEY) as ListPluginVersionsResponse;
845
+ }
846
+
847
+ // ─── shared helpers ──────────────────────────────────────────────────────
848
+
849
+ async function membersOf(store: Store, plugin: Plugin): Promise<Member[]> {
850
+ try {
851
+ return await findMembers(
852
+ store,
853
+ plugin.metadata?.id ?? "",
854
+ plugin.metadata?.org ?? "",
855
+ );
856
+ } catch (error) {
857
+ throw internalError(error, "failed to list plugin members");
858
+ }
859
+ }
860
+
861
+ function newPersistPluginStep<Desc extends UpdateVisibilityDesc>(
862
+ store: Store,
863
+ key: string,
864
+ stepName: string,
865
+ ): PipelineStep<Desc> {
866
+ return {
867
+ name: stepName,
868
+ async execute(ctx: RequestContext<Desc>): Promise<void> {
869
+ const plugin = ctx.get(key) as Plugin;
870
+ try {
871
+ await store.saveResource(
872
+ ctx.apiResourceKind,
873
+ plugin.metadata?.id ?? "",
874
+ PluginSchema,
875
+ plugin,
876
+ );
877
+ } catch (error) {
878
+ throw internalError(error, "failed to save plugin");
879
+ }
880
+ },
881
+ };
882
+ }
883
+
884
+ /** Re-indexes after a change (visibility is indexed); best-effort. */
885
+ function newIndexPluginStep<Desc extends UpdateVisibilityDesc>(
886
+ store: Store,
887
+ logger: Logger,
888
+ key: string,
889
+ stepName: string,
890
+ ): PipelineStep<Desc> {
891
+ return {
892
+ name: stepName,
893
+ async execute(ctx: RequestContext<Desc>): Promise<void> {
894
+ const plugin = ctx.get(key) as Plugin;
895
+ const entry = pluginSearchExtractor.getSearchIndexEntry(plugin);
896
+ if (entry === undefined) {
897
+ return;
898
+ }
899
+ try {
900
+ await store.upsertSearchIndex(
901
+ ctx.apiResourceKind,
902
+ plugin.metadata?.id ?? "",
903
+ entry,
904
+ );
905
+ } catch (error) {
906
+ logger.warn(`${stepName}: failed (best-effort)`, {
907
+ id: plugin.metadata?.id ?? "",
908
+ error: error instanceof Error ? error.message : String(error),
909
+ });
910
+ }
911
+ },
912
+ };
913
+ }