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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/README.md +3 -3
  2. package/dist/archive/content-store.d.ts +35 -0
  3. package/dist/archive/content-store.d.ts.map +1 -0
  4. package/dist/archive/content-store.js +98 -0
  5. package/dist/archive/content-store.js.map +1 -0
  6. package/dist/archive/inflate.d.ts +22 -0
  7. package/dist/archive/inflate.d.ts.map +1 -0
  8. package/dist/archive/inflate.js +75 -0
  9. package/dist/archive/inflate.js.map +1 -0
  10. package/dist/archive/limits.d.ts +33 -0
  11. package/dist/archive/limits.d.ts.map +1 -0
  12. package/dist/archive/limits.js +31 -0
  13. package/dist/archive/limits.js.map +1 -0
  14. package/dist/archive/open.d.ts +24 -0
  15. package/dist/archive/open.d.ts.map +1 -0
  16. package/dist/archive/open.js +93 -0
  17. package/dist/archive/open.js.map +1 -0
  18. package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
  19. package/dist/archive/prefilter.d.ts.map +1 -0
  20. package/dist/archive/prefilter.js.map +1 -0
  21. package/dist/archive/write.d.ts +8 -0
  22. package/dist/archive/write.d.ts.map +1 -0
  23. package/dist/archive/write.js +44 -0
  24. package/dist/archive/write.js.map +1 -0
  25. package/dist/authorization/authorizer.d.ts +98 -0
  26. package/dist/authorization/authorizer.d.ts.map +1 -0
  27. package/dist/authorization/authorizer.js +156 -0
  28. package/dist/authorization/authorizer.js.map +1 -0
  29. package/dist/authorization/derived-tuples.d.ts +42 -0
  30. package/dist/authorization/derived-tuples.d.ts.map +1 -0
  31. package/dist/authorization/derived-tuples.js +240 -0
  32. package/dist/authorization/derived-tuples.js.map +1 -0
  33. package/dist/authorization/evaluator.d.ts +66 -0
  34. package/dist/authorization/evaluator.d.ts.map +1 -0
  35. package/dist/authorization/evaluator.js +153 -0
  36. package/dist/authorization/evaluator.js.map +1 -0
  37. package/dist/authorization/facts.d.ts +29 -0
  38. package/dist/authorization/facts.d.ts.map +1 -0
  39. package/dist/authorization/facts.js +17 -0
  40. package/dist/authorization/facts.js.map +1 -0
  41. package/dist/authorization/list-read-scope.d.ts +18 -0
  42. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  43. package/dist/authorization/list-read-scope.js +155 -0
  44. package/dist/authorization/list-read-scope.js.map +1 -0
  45. package/dist/authorization/model/agent.d.ts +2 -0
  46. package/dist/authorization/model/agent.d.ts.map +1 -0
  47. package/dist/authorization/model/agent.js +42 -0
  48. package/dist/authorization/model/agent.js.map +1 -0
  49. package/dist/authorization/model/agent_channel.d.ts +2 -0
  50. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  51. package/dist/authorization/model/agent_channel.js +38 -0
  52. package/dist/authorization/model/agent_channel.js.map +1 -0
  53. package/dist/authorization/model/agent_execution.d.ts +2 -0
  54. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_execution.js +25 -0
  56. package/dist/authorization/model/agent_execution.js.map +1 -0
  57. package/dist/authorization/model/agent_instance.d.ts +2 -0
  58. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_instance.js +47 -0
  60. package/dist/authorization/model/agent_instance.js.map +1 -0
  61. package/dist/authorization/model/agent_share.d.ts +2 -0
  62. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_share.js +29 -0
  64. package/dist/authorization/model/agent_share.js.map +1 -0
  65. package/dist/authorization/model/api_key.d.ts +2 -0
  66. package/dist/authorization/model/api_key.d.ts.map +1 -0
  67. package/dist/authorization/model/api_key.js +27 -0
  68. package/dist/authorization/model/api_key.js.map +1 -0
  69. package/dist/authorization/model/artifact.d.ts +2 -0
  70. package/dist/authorization/model/artifact.d.ts.map +1 -0
  71. package/dist/authorization/model/artifact.js +27 -0
  72. package/dist/authorization/model/artifact.js.map +1 -0
  73. package/dist/authorization/model/channel_app.d.ts +2 -0
  74. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  75. package/dist/authorization/model/channel_app.js +28 -0
  76. package/dist/authorization/model/channel_app.js.map +1 -0
  77. package/dist/authorization/model/default-of.d.ts +38 -0
  78. package/dist/authorization/model/default-of.d.ts.map +1 -0
  79. package/dist/authorization/model/default-of.js +39 -0
  80. package/dist/authorization/model/default-of.js.map +1 -0
  81. package/dist/authorization/model/environment.d.ts +2 -0
  82. package/dist/authorization/model/environment.d.ts.map +1 -0
  83. package/dist/authorization/model/environment.js +33 -0
  84. package/dist/authorization/model/environment.js.map +1 -0
  85. package/dist/authorization/model/execution_context.d.ts +2 -0
  86. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  87. package/dist/authorization/model/execution_context.js +19 -0
  88. package/dist/authorization/model/execution_context.js.map +1 -0
  89. package/dist/authorization/model/iam_policy.d.ts +2 -0
  90. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  91. package/dist/authorization/model/iam_policy.js +31 -0
  92. package/dist/authorization/model/iam_policy.js.map +1 -0
  93. package/dist/authorization/model/identity_account.d.ts +2 -0
  94. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  95. package/dist/authorization/model/identity_account.js +25 -0
  96. package/dist/authorization/model/identity_account.js.map +1 -0
  97. package/dist/authorization/model/index.d.ts +36 -0
  98. package/dist/authorization/model/index.d.ts.map +1 -0
  99. package/dist/authorization/model/index.js +72 -0
  100. package/dist/authorization/model/index.js.map +1 -0
  101. package/dist/authorization/model/mcp_server.d.ts +2 -0
  102. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  103. package/dist/authorization/model/mcp_server.js +37 -0
  104. package/dist/authorization/model/mcp_server.js.map +1 -0
  105. package/dist/authorization/model/memory.d.ts +2 -0
  106. package/dist/authorization/model/memory.d.ts.map +1 -0
  107. package/dist/authorization/model/memory.js +26 -0
  108. package/dist/authorization/model/memory.js.map +1 -0
  109. package/dist/authorization/model/oauth_app.d.ts +2 -0
  110. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  111. package/dist/authorization/model/oauth_app.js +30 -0
  112. package/dist/authorization/model/oauth_app.js.map +1 -0
  113. package/dist/authorization/model/organization.d.ts +2 -0
  114. package/dist/authorization/model/organization.d.ts.map +1 -0
  115. package/dist/authorization/model/organization.js +54 -0
  116. package/dist/authorization/model/organization.js.map +1 -0
  117. package/dist/authorization/model/plugin.d.ts +2 -0
  118. package/dist/authorization/model/plugin.d.ts.map +1 -0
  119. package/dist/authorization/model/plugin.js +44 -0
  120. package/dist/authorization/model/plugin.js.map +1 -0
  121. package/dist/authorization/model/project.d.ts +2 -0
  122. package/dist/authorization/model/project.d.ts.map +1 -0
  123. package/dist/authorization/model/project.js +32 -0
  124. package/dist/authorization/model/project.js.map +1 -0
  125. package/dist/authorization/model/rewrite.d.ts +127 -0
  126. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  127. package/dist/authorization/model/rewrite.js +82 -0
  128. package/dist/authorization/model/rewrite.js.map +1 -0
  129. package/dist/authorization/model/schedule.d.ts +2 -0
  130. package/dist/authorization/model/schedule.d.ts.map +1 -0
  131. package/dist/authorization/model/schedule.js +29 -0
  132. package/dist/authorization/model/schedule.js.map +1 -0
  133. package/dist/authorization/model/session.d.ts +2 -0
  134. package/dist/authorization/model/session.d.ts.map +1 -0
  135. package/dist/authorization/model/session.js +38 -0
  136. package/dist/authorization/model/session.js.map +1 -0
  137. package/dist/authorization/model/skill.d.ts +2 -0
  138. package/dist/authorization/model/skill.d.ts.map +1 -0
  139. package/dist/authorization/model/skill.js +38 -0
  140. package/dist/authorization/model/skill.js.map +1 -0
  141. package/dist/authorization/model/workflow.d.ts +2 -0
  142. package/dist/authorization/model/workflow.d.ts.map +1 -0
  143. package/dist/authorization/model/workflow.js +38 -0
  144. package/dist/authorization/model/workflow.js.map +1 -0
  145. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  146. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow_execution.js +32 -0
  148. package/dist/authorization/model/workflow_execution.js.map +1 -0
  149. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  150. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_instance.js +92 -0
  152. package/dist/authorization/model/workflow_instance.js.map +1 -0
  153. package/dist/authorization/organization-directory.d.ts +13 -0
  154. package/dist/authorization/organization-directory.d.ts.map +1 -0
  155. package/dist/authorization/organization-directory.js +83 -0
  156. package/dist/authorization/organization-directory.js.map +1 -0
  157. package/dist/authorization/person.d.ts +42 -0
  158. package/dist/authorization/person.d.ts.map +1 -0
  159. package/dist/authorization/person.js +19 -0
  160. package/dist/authorization/person.js.map +1 -0
  161. package/dist/authorization/posture.d.ts +38 -0
  162. package/dist/authorization/posture.d.ts.map +1 -0
  163. package/dist/authorization/posture.js +7 -0
  164. package/dist/authorization/posture.js.map +1 -0
  165. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  166. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  167. package/dist/authorization/schedule-fire-caller.js +67 -0
  168. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  169. package/dist/authorization/store-test-kit.d.ts +68 -0
  170. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  171. package/dist/authorization/store-test-kit.js +311 -0
  172. package/dist/authorization/store-test-kit.js.map +1 -0
  173. package/dist/authorization/tuples.d.ts +115 -0
  174. package/dist/authorization/tuples.d.ts.map +1 -0
  175. package/dist/authorization/tuples.js +83 -0
  176. package/dist/authorization/tuples.js.map +1 -0
  177. package/dist/boot/compose.d.ts.map +1 -1
  178. package/dist/boot/compose.js +157 -32
  179. package/dist/boot/compose.js.map +1 -1
  180. package/dist/boot/inprocess.d.ts +12 -0
  181. package/dist/boot/inprocess.d.ts.map +1 -1
  182. package/dist/boot/inprocess.js +62 -20
  183. package/dist/boot/inprocess.js.map +1 -1
  184. package/dist/domain/agent/controller.d.ts.map +1 -1
  185. package/dist/domain/agent/controller.js +9 -0
  186. package/dist/domain/agent/controller.js.map +1 -1
  187. package/dist/domain/iampolicy/constants.d.ts +11 -0
  188. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  189. package/dist/domain/iampolicy/constants.js +11 -0
  190. package/dist/domain/iampolicy/constants.js.map +1 -1
  191. package/dist/domain/iampolicy/membership.d.ts +72 -1
  192. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  193. package/dist/domain/iampolicy/membership.js +141 -56
  194. package/dist/domain/iampolicy/membership.js.map +1 -1
  195. package/dist/domain/identityaccount/actor.d.ts +26 -0
  196. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  197. package/dist/domain/identityaccount/actor.js +17 -0
  198. package/dist/domain/identityaccount/actor.js.map +1 -0
  199. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  200. package/dist/domain/mcpserver/controller.js +9 -0
  201. package/dist/domain/mcpserver/controller.js.map +1 -1
  202. package/dist/domain/plugin/archive.d.ts +37 -0
  203. package/dist/domain/plugin/archive.d.ts.map +1 -0
  204. package/dist/domain/plugin/archive.js +50 -0
  205. package/dist/domain/plugin/archive.js.map +1 -0
  206. package/dist/domain/plugin/constants.d.ts +38 -0
  207. package/dist/domain/plugin/constants.d.ts.map +1 -0
  208. package/dist/domain/plugin/constants.js +46 -0
  209. package/dist/domain/plugin/constants.js.map +1 -0
  210. package/dist/domain/plugin/controller.d.ts +25 -0
  211. package/dist/domain/plugin/controller.d.ts.map +1 -0
  212. package/dist/domain/plugin/controller.js +493 -0
  213. package/dist/domain/plugin/controller.js.map +1 -0
  214. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  215. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  216. package/dist/domain/plugin/materialize/agent.js +128 -0
  217. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  218. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  219. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  220. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  221. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  222. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  223. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  224. package/dist/domain/plugin/materialize/identity.js +40 -0
  225. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  226. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  227. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  228. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  229. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  230. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  231. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  232. package/dist/domain/plugin/materialize/plan.js +77 -0
  233. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  234. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  235. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  236. package/dist/domain/plugin/materialize/ports.js +2 -0
  237. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  238. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  239. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  240. package/dist/domain/plugin/materialize/skills.js +44 -0
  241. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  242. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  243. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/workflows.js +31 -0
  245. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  246. package/dist/domain/plugin/members.d.ts +42 -0
  247. package/dist/domain/plugin/members.d.ts.map +1 -0
  248. package/dist/domain/plugin/members.js +97 -0
  249. package/dist/domain/plugin/members.js.map +1 -0
  250. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  251. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  252. package/dist/domain/plugin/overlay/documents.js +38 -0
  253. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  254. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  255. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  256. package/dist/domain/plugin/overlay/parse.js +79 -0
  257. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  258. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  259. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  260. package/dist/domain/plugin/overlay/sanitize.js +101 -0
  261. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  262. package/dist/domain/plugin/push.d.ts +133 -0
  263. package/dist/domain/plugin/push.d.ts.map +1 -0
  264. package/dist/domain/plugin/push.js +800 -0
  265. package/dist/domain/plugin/push.js.map +1 -0
  266. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  267. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  268. package/dist/domain/plugin/search-extractor.js +41 -0
  269. package/dist/domain/plugin/search-extractor.js.map +1 -0
  270. package/dist/domain/skill/constants.d.ts +6 -11
  271. package/dist/domain/skill/constants.d.ts.map +1 -1
  272. package/dist/domain/skill/constants.js +6 -11
  273. package/dist/domain/skill/constants.js.map +1 -1
  274. package/dist/domain/skill/controller.d.ts.map +1 -1
  275. package/dist/domain/skill/controller.js +33 -30
  276. package/dist/domain/skill/controller.js.map +1 -1
  277. package/dist/domain/skill/push.d.ts +9 -10
  278. package/dist/domain/skill/push.d.ts.map +1 -1
  279. package/dist/domain/skill/push.js +53 -122
  280. package/dist/domain/skill/push.js.map +1 -1
  281. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  282. package/dist/domain/skill/search-extractor.js.map +1 -1
  283. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  284. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  285. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  286. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  287. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  288. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  289. package/dist/domain/skill/storage/zip-gate.js +56 -126
  290. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  291. package/dist/domain/skill/version-resolution.d.ts +5 -5
  292. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  293. package/dist/domain/skill/version-resolution.js +34 -216
  294. package/dist/domain/skill/version-resolution.js.map +1 -1
  295. package/dist/domain/workflow/controller.d.ts.map +1 -1
  296. package/dist/domain/workflow/controller.js +30 -3
  297. package/dist/domain/workflow/controller.js.map +1 -1
  298. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  299. package/dist/extensions/authorizer.d.ts +10 -5
  300. package/dist/extensions/authorizer.d.ts.map +1 -1
  301. package/dist/extensions/drivers.d.ts +4 -1
  302. package/dist/extensions/drivers.d.ts.map +1 -1
  303. package/dist/extensions/list-read-scope.d.ts +47 -20
  304. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  305. package/dist/extensions/list-read-scope.js +20 -24
  306. package/dist/extensions/list-read-scope.js.map +1 -1
  307. package/dist/extensions/organization-directory.d.ts +13 -9
  308. package/dist/extensions/organization-directory.d.ts.map +1 -1
  309. package/dist/extensions/organization-directory.js.map +1 -1
  310. package/dist/extensions/resource-authorization.d.ts +33 -0
  311. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  312. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  313. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  314. package/dist/extensions/schedule-fire-caller.js +12 -1
  315. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  316. package/dist/index.d.ts +10 -0
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +8 -0
  319. package/dist/index.js.map +1 -1
  320. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  321. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  322. package/dist/pipeline/apiresource-labels.js +20 -0
  323. package/dist/pipeline/apiresource-labels.js.map +1 -1
  324. package/dist/pipeline/errors.d.ts.map +1 -1
  325. package/dist/pipeline/errors.js.map +1 -1
  326. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  327. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  328. package/dist/pipeline/steps/authorization-facts.js +100 -0
  329. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  330. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  331. package/dist/pipeline/steps/delete.js +1 -1
  332. package/dist/pipeline/steps/delete.js.map +1 -1
  333. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  334. package/dist/pipeline/steps/duplicate.js.map +1 -1
  335. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  336. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  337. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  338. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  339. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  340. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  341. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  342. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  343. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  344. package/dist/pipeline/steps/helpers.js.map +1 -1
  345. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  346. package/dist/pipeline/steps/index-search.js.map +1 -1
  347. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  348. package/dist/pipeline/steps/load-existing.js +1 -1
  349. package/dist/pipeline/steps/load-existing.js.map +1 -1
  350. package/dist/pipeline/steps/references.d.ts +16 -0
  351. package/dist/pipeline/steps/references.d.ts.map +1 -1
  352. package/dist/pipeline/steps/references.js +18 -0
  353. package/dist/pipeline/steps/references.js.map +1 -1
  354. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  355. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  356. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  357. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  358. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  359. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  360. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  361. package/dist/pipeline/steps/slug.js.map +1 -1
  362. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  363. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  364. package/dist/pipeline/steps/validate-visibility.js +6 -1
  365. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  366. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  367. package/dist/pipeline/steps/validation.js.map +1 -1
  368. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  369. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  370. package/dist/pipeline/steps/version-archive.js +129 -0
  371. package/dist/pipeline/steps/version-archive.js.map +1 -0
  372. package/dist/pipeline/steps/version-history.d.ts +49 -0
  373. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  374. package/dist/pipeline/steps/version-history.js +229 -0
  375. package/dist/pipeline/steps/version-history.js.map +1 -0
  376. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  377. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  378. package/dist/pipeline/steps/visibility-gates.js +7 -2
  379. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  380. package/dist/query/search/registry.d.ts.map +1 -1
  381. package/dist/query/search/registry.js +2 -0
  382. package/dist/query/search/registry.js.map +1 -1
  383. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  384. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  385. package/dist/temporal/schedule/run-starter.js +14 -1
  386. package/dist/temporal/schedule/run-starter.js.map +1 -1
  387. package/package.json +5 -4
  388. package/src/archive/__tests__/archive.test.ts +233 -0
  389. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  390. package/src/archive/content-store.ts +132 -0
  391. package/src/archive/inflate.ts +107 -0
  392. package/src/archive/limits.ts +42 -0
  393. package/src/archive/open.ts +131 -0
  394. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  395. package/src/archive/write.ts +54 -0
  396. package/src/authorization/README.md +124 -0
  397. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  398. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  399. package/src/authorization/__tests__/drivers.ts +70 -0
  400. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  401. package/src/authorization/__tests__/facts.test.ts +155 -0
  402. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  403. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  404. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  405. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  406. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  407. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  408. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  409. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  410. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  411. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  412. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  413. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  414. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  415. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  416. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  417. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  418. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  419. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  420. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  421. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  422. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  423. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  424. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  425. package/src/authorization/__tests__/person.test.ts +114 -0
  426. package/src/authorization/__tests__/posture.test.ts +25 -0
  427. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  428. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  429. package/src/authorization/__tests__/support.ts +101 -0
  430. package/src/authorization/__tests__/tuples.test.ts +62 -0
  431. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  432. package/src/authorization/authorizer.ts +208 -0
  433. package/src/authorization/derived-tuples.ts +384 -0
  434. package/src/authorization/evaluator.ts +283 -0
  435. package/src/authorization/facts.ts +47 -0
  436. package/src/authorization/list-read-scope.ts +216 -0
  437. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  438. package/src/authorization/model/agent.ts +64 -0
  439. package/src/authorization/model/agent_channel.ts +49 -0
  440. package/src/authorization/model/agent_execution.ts +33 -0
  441. package/src/authorization/model/agent_instance.ts +66 -0
  442. package/src/authorization/model/agent_share.ts +40 -0
  443. package/src/authorization/model/api_key.ts +28 -0
  444. package/src/authorization/model/artifact.ts +38 -0
  445. package/src/authorization/model/channel_app.ts +39 -0
  446. package/src/authorization/model/default-of.ts +99 -0
  447. package/src/authorization/model/environment.ts +48 -0
  448. package/src/authorization/model/execution_context.ts +20 -0
  449. package/src/authorization/model/iam_policy.ts +42 -0
  450. package/src/authorization/model/identity_account.ts +26 -0
  451. package/src/authorization/model/index.ts +108 -0
  452. package/src/authorization/model/mcp_server.ts +59 -0
  453. package/src/authorization/model/memory.ts +27 -0
  454. package/src/authorization/model/oauth_app.ts +42 -0
  455. package/src/authorization/model/organization.ts +55 -0
  456. package/src/authorization/model/plugin.ts +66 -0
  457. package/src/authorization/model/project.ts +47 -0
  458. package/src/authorization/model/rewrite.ts +213 -0
  459. package/src/authorization/model/schedule.ts +40 -0
  460. package/src/authorization/model/session.ts +50 -0
  461. package/src/authorization/model/skill.ts +60 -0
  462. package/src/authorization/model/workflow.ts +60 -0
  463. package/src/authorization/model/workflow_execution.ts +44 -0
  464. package/src/authorization/model/workflow_instance.ts +122 -0
  465. package/src/authorization/organization-directory.ts +114 -0
  466. package/src/authorization/person.ts +68 -0
  467. package/src/authorization/posture.ts +49 -0
  468. package/src/authorization/schedule-fire-caller.ts +91 -0
  469. package/src/authorization/store-test-kit.ts +454 -0
  470. package/src/authorization/tuples.ts +190 -0
  471. package/src/boot/compose.ts +175 -38
  472. package/src/boot/inprocess.ts +108 -30
  473. package/src/domain/agent/controller.ts +11 -0
  474. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  475. package/src/domain/iampolicy/constants.ts +12 -0
  476. package/src/domain/iampolicy/membership.ts +221 -66
  477. package/src/domain/identityaccount/actor.ts +44 -0
  478. package/src/domain/mcpserver/controller.ts +11 -0
  479. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  480. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  481. package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
  482. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  483. package/src/domain/plugin/archive.ts +89 -0
  484. package/src/domain/plugin/constants.ts +53 -0
  485. package/src/domain/plugin/controller.ts +913 -0
  486. package/src/domain/plugin/materialize/agent.ts +186 -0
  487. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  488. package/src/domain/plugin/materialize/identity.ts +67 -0
  489. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  490. package/src/domain/plugin/materialize/plan.ts +124 -0
  491. package/src/domain/plugin/materialize/ports.ts +53 -0
  492. package/src/domain/plugin/materialize/skills.ts +68 -0
  493. package/src/domain/plugin/materialize/workflows.ts +51 -0
  494. package/src/domain/plugin/members.ts +180 -0
  495. package/src/domain/plugin/overlay/documents.ts +78 -0
  496. package/src/domain/plugin/overlay/parse.ts +115 -0
  497. package/src/domain/plugin/overlay/sanitize.ts +149 -0
  498. package/src/domain/plugin/push.ts +1062 -0
  499. package/src/domain/plugin/search-extractor.ts +60 -0
  500. package/src/domain/skill/constants.ts +11 -14
  501. package/src/domain/skill/controller.ts +44 -36
  502. package/src/domain/skill/push.ts +61 -156
  503. package/src/domain/skill/search-extractor.ts +3 -1
  504. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  505. package/src/domain/skill/storage/zip-gate.ts +58 -154
  506. package/src/domain/skill/version-resolution.ts +67 -269
  507. package/src/domain/workflow/controller.ts +38 -4
  508. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  509. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  510. package/src/extensions/__tests__/composed-support.ts +32 -1
  511. package/src/extensions/__tests__/extension-composition.test.ts +35 -0
  512. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  513. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  514. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  515. package/src/extensions/authorizer.ts +10 -5
  516. package/src/extensions/drivers.ts +4 -1
  517. package/src/extensions/list-read-scope.ts +67 -45
  518. package/src/extensions/organization-directory.ts +13 -9
  519. package/src/extensions/resource-authorization.ts +34 -0
  520. package/src/extensions/schedule-fire-caller.ts +49 -18
  521. package/src/index.ts +51 -1
  522. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  523. package/src/pipeline/apiresource-labels.ts +31 -3
  524. package/src/pipeline/errors.ts +5 -5
  525. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  526. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
  527. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  528. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  529. package/src/pipeline/steps/authorization-facts.ts +131 -0
  530. package/src/pipeline/steps/delete.ts +11 -3
  531. package/src/pipeline/steps/duplicate.ts +8 -2
  532. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  533. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  534. package/src/pipeline/steps/helpers.ts +4 -1
  535. package/src/pipeline/steps/index-search.ts +28 -15
  536. package/src/pipeline/steps/load-existing.ts +12 -3
  537. package/src/pipeline/steps/references.ts +36 -2
  538. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  539. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  540. package/src/pipeline/steps/slug.ts +7 -2
  541. package/src/pipeline/steps/validate-visibility.ts +9 -2
  542. package/src/pipeline/steps/validation.ts +3 -1
  543. package/src/pipeline/steps/version-archive.ts +225 -0
  544. package/src/pipeline/steps/version-history.ts +362 -0
  545. package/src/pipeline/steps/visibility-gates.ts +12 -9
  546. package/src/query/README.md +1 -1
  547. package/src/query/search/__tests__/criteria.test.ts +6 -7
  548. package/src/query/search/__tests__/query-store.test.ts +9 -2
  549. package/src/query/search/__tests__/registry.test.ts +6 -4
  550. package/src/query/search/registry.ts +6 -1
  551. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  552. package/src/temporal/schedule/run-starter.ts +31 -8
  553. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  554. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  555. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -0,0 +1,681 @@
1
+ /**
2
+ * Composed-server round-trips for the Plugin kind: a real server over a
3
+ * temp SQLite store, raw Connect clients, archives written by the server's
4
+ * own writer from the library's fixture builders. Pins the install
5
+ * contract the conformance suite proves per edition: a Cursor plugin with
6
+ * skills, a sub-agent and an MCP server materialises exactly those
7
+ * members with both labels; an MCP-only plugin materialises no agent; a
8
+ * re-push of the same archive writes nothing; a client's edit, re-push or
9
+ * delete of a member is refused naming the plugin while the plugin's own
10
+ * upgrade drops what the archive dropped; uninstall removes every member
11
+ * and is refused while a user's own agent still references one; a slug an
12
+ * unmanaged resource holds refuses the install; a bad overlay refuses
13
+ * before any write.
14
+ */
15
+ import { mkdtempSync, rmSync } from "node:fs";
16
+ import net from "node:net";
17
+ import { tmpdir } from "node:os";
18
+ import path from "node:path";
19
+
20
+ import { Code, ConnectError, createClient } from "@connectrpc/connect";
21
+ import type { Client, Transport } from "@connectrpc/connect";
22
+ import { createGrpcTransport } from "@connectrpc/connect-node";
23
+ import { create as createMessage } from "@bufbuild/protobuf";
24
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
25
+
26
+ import {
27
+ cursorPlugin,
28
+ openPlugin,
29
+ withFile,
30
+ } from "@stigmer/plugin-package/testing";
31
+ import type { PluginFixture } from "@stigmer/plugin-package/testing";
32
+ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
33
+ import { AgentCommandController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/command_pb";
34
+ import { AgentQueryController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/query_pb";
35
+ import {
36
+ AgentSpecSchema,
37
+ McpServerUsageSchema,
38
+ } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
39
+ import { McpServerCommandController } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/command_pb";
40
+ import { McpServerQueryController } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/query_pb";
41
+ import { PluginCommandController } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/command_pb";
42
+ import { PluginQueryController } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/query_pb";
43
+ import { PluginState } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/status_pb";
44
+ import { SkillCommandController } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/command_pb";
45
+ import { SkillQueryController } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/query_pb";
46
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
47
+ import { ApiResourceMetadataSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
48
+ import { ApiResourceReferenceSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
49
+
50
+ import { writeArchive } from "../../../archive/write.js";
51
+ import { loadConfig } from "../../../boot/config.js";
52
+ import { composeServer } from "../../../boot/compose.js";
53
+ import type { ComposedServer } from "../../../boot/compose.js";
54
+ import { createLogger } from "../../../boot/logger.js";
55
+ import {
56
+ PLUGIN_LABEL,
57
+ PLUGIN_VERSION_LABEL,
58
+ } from "../../../pipeline/apiresource-labels.js";
59
+
60
+ const silentLogger = createLogger({
61
+ level: "error",
62
+ pretty: false,
63
+ write: () => {},
64
+ });
65
+ const ORG = "acme";
66
+
67
+ let server: ComposedServer;
68
+ let plugins: Client<typeof PluginCommandController>;
69
+ let pluginQuery: Client<typeof PluginQueryController>;
70
+ let agents: Client<typeof AgentCommandController>;
71
+ let agentQuery: Client<typeof AgentQueryController>;
72
+ let skills: Client<typeof SkillCommandController>;
73
+ let skillQuery: Client<typeof SkillQueryController>;
74
+ let mcpServers: Client<typeof McpServerCommandController>;
75
+ let mcpServerQuery: Client<typeof McpServerQueryController>;
76
+ let dir: string;
77
+
78
+ async function reserveFreePort(): Promise<number> {
79
+ return new Promise((resolve, reject) => {
80
+ const probe = net.createServer();
81
+ probe.once("error", reject);
82
+ probe.listen(0, "127.0.0.1", () => {
83
+ const { port } = probe.address() as net.AddressInfo;
84
+ probe.close(() => resolve(port));
85
+ });
86
+ });
87
+ }
88
+
89
+ beforeAll(async () => {
90
+ dir = mkdtempSync(path.join(tmpdir(), "plugin-domain-test-"));
91
+ const grpcPort = await reserveFreePort();
92
+ server = await composeServer({
93
+ config: loadConfig({
94
+ STIGMER_MODEL_REGISTRY_REFRESH: "off",
95
+ TEMPORAL_HOST_PORT: "127.0.0.1:1",
96
+ GRPC_PORT: String(grpcPort),
97
+ DB_PATH: path.join(dir, "stigmer.db"),
98
+ ARTIFACT_LOCAL_BASE_PATH: path.join(dir, "artifacts"),
99
+ STORAGE_PATH: path.join(dir, "storage"),
100
+ }),
101
+ logger: silentLogger,
102
+ host: "127.0.0.1",
103
+ });
104
+ const port = await server.start();
105
+ const transport: Transport = createGrpcTransport({
106
+ baseUrl: `http://127.0.0.1:${port}`,
107
+ });
108
+ plugins = createClient(PluginCommandController, transport);
109
+ pluginQuery = createClient(PluginQueryController, transport);
110
+ agents = createClient(AgentCommandController, transport);
111
+ agentQuery = createClient(AgentQueryController, transport);
112
+ skills = createClient(SkillCommandController, transport);
113
+ skillQuery = createClient(SkillQueryController, transport);
114
+ mcpServers = createClient(McpServerCommandController, transport);
115
+ mcpServerQuery = createClient(McpServerQueryController, transport);
116
+ });
117
+
118
+ afterAll(async () => {
119
+ await server.shutdown();
120
+ rmSync(dir, { recursive: true, force: true });
121
+ });
122
+
123
+ const encoder = new TextEncoder();
124
+
125
+ /** A fixture map as the archive the CLI would push: the server's own deterministic writer. */
126
+ function archiveOf(fixture: PluginFixture): Uint8Array {
127
+ return writeArchive(
128
+ [...fixture.entries()].map(([filePath, content]) => ({
129
+ path: filePath,
130
+ bytes: typeof content === "string" ? encoder.encode(content) : content,
131
+ })),
132
+ );
133
+ }
134
+
135
+ let counter = 0;
136
+ function uniqueName(prefix: string): string {
137
+ counter += 1;
138
+ return `${prefix}-${counter}`;
139
+ }
140
+
141
+ /** A Cursor plugin with one skill, one sub-agent and one HTTP server: the thermos shape. */
142
+ function thermosLike(
143
+ name: string,
144
+ options: { readonly skill?: string; readonly extraSkill?: string } = {},
145
+ ): PluginFixture {
146
+ const skill = options.skill ?? `${name}-review`;
147
+ return cursorPlugin({
148
+ name,
149
+ version: "1.2.0",
150
+ description: "Code review with a thermonuclear standard",
151
+ skills: [
152
+ {
153
+ name: skill,
154
+ description: "Review code thoroughly",
155
+ body: "# Review\nRead everything.",
156
+ },
157
+ ...(options.extraSkill === undefined
158
+ ? []
159
+ : [
160
+ {
161
+ name: options.extraSkill,
162
+ description: "Another skill",
163
+ body: "# More\nAnd more.",
164
+ },
165
+ ]),
166
+ ],
167
+ agents: [
168
+ {
169
+ file: "reviewer",
170
+ frontmatter: {
171
+ name: `${name}-reviewer`,
172
+ description: "Reviews pull requests",
173
+ model: "sonnet",
174
+ },
175
+ body: "You review pull requests with care and name every risk you see.",
176
+ },
177
+ ],
178
+ mcpServers: {
179
+ [`${name}-github`]: {
180
+ type: "http",
181
+ url: "https://api.githubcopilot.com/mcp/",
182
+ headers: { Authorization: "Bearer ${GITHUB_TOKEN}" },
183
+ },
184
+ },
185
+ variables: {
186
+ GITHUB_TOKEN: {
187
+ type: "string",
188
+ title: "GitHub token",
189
+ description: "A personal access token",
190
+ },
191
+ },
192
+ required: ["GITHUB_TOKEN"],
193
+ });
194
+ }
195
+
196
+ async function expectCode(
197
+ promise: Promise<unknown>,
198
+ code: Code,
199
+ contains?: string,
200
+ ): Promise<ConnectError> {
201
+ try {
202
+ await promise;
203
+ } catch (error) {
204
+ expect(error).toBeInstanceOf(ConnectError);
205
+ const connectError = error as ConnectError;
206
+ expect(connectError.code, connectError.rawMessage).toBe(code);
207
+ if (contains !== undefined) {
208
+ expect(connectError.rawMessage).toContain(contains);
209
+ }
210
+ return connectError;
211
+ }
212
+ throw new Error(`expected ${Code[code]}, the call succeeded`);
213
+ }
214
+
215
+ describe("Plugin push — materialisation", () => {
216
+ it("installs a Cursor plugin as one skill, one MCP server and one agent, each labelled with the plugin id and digest", async () => {
217
+ const name = uniqueName("thermos");
218
+ const installed = await plugins.push({
219
+ org: ORG,
220
+ artifact: archiveOf(thermosLike(name)),
221
+ });
222
+
223
+ expect(installed.metadata?.id).toMatch(/^plg_/);
224
+ expect(installed.metadata?.slug).toBe(name);
225
+ expect(installed.spec?.name).toBe(name);
226
+ expect(installed.spec?.version).toBe("1.2.0");
227
+ expect(installed.status?.state).toBe(PluginState.READY);
228
+ expect(installed.status?.digest).toMatch(/^[a-f0-9]{64}$/);
229
+ expect(installed.status?.materialized).toMatchObject({
230
+ skills: 1,
231
+ mcpServers: 1,
232
+ agents: 1,
233
+ workflows: 0,
234
+ });
235
+ // The sub-agent's model hint is recorded, never applied.
236
+ expect(installed.status?.warnings.map((w) => w.kind)).toContain(
237
+ "model-hint-unresolved",
238
+ );
239
+
240
+ const members = await pluginQuery.listMembers({
241
+ value: installed.metadata!.id,
242
+ });
243
+ expect(
244
+ members.members.map((m) => `${ApiResourceKind[m.kind]}:${m.slug}`),
245
+ ).toEqual([
246
+ `skill:${name}-review`,
247
+ `mcp_server:${name}-github`,
248
+ `agent:${name}`,
249
+ ]);
250
+
251
+ const digest = installed.status!.digest;
252
+ for (const member of members.members) {
253
+ const labels =
254
+ member.kind === ApiResourceKind.skill
255
+ ? (await skillQuery.get({ value: member.id })).metadata!.labels
256
+ : member.kind === ApiResourceKind.mcp_server
257
+ ? (await mcpServerQuery.get({ value: member.id })).metadata!.labels
258
+ : (await agentQuery.get({ value: member.id })).metadata!.labels;
259
+ expect(labels[PLUGIN_LABEL]).toBe(installed.metadata!.id);
260
+ expect(labels[PLUGIN_VERSION_LABEL]).toBe(digest);
261
+ }
262
+
263
+ const agent = await agentQuery.getByReference(
264
+ createMessage(ApiResourceReferenceSchema, {
265
+ org: ORG,
266
+ kind: ApiResourceKind.agent,
267
+ slug: name,
268
+ }),
269
+ );
270
+ expect(agent.spec?.skillRefs.map((r) => r.slug)).toEqual([
271
+ `${name}-review`,
272
+ ]);
273
+ expect(
274
+ agent.spec?.mcpServerUsages.map((u) => u.mcpServerRef?.slug),
275
+ ).toEqual([`${name}-github`]);
276
+ expect(agent.spec?.subAgents.map((s) => s.name)).toEqual([
277
+ `${name}-reviewer`,
278
+ ]);
279
+ expect(agent.spec?.subAgents[0]?.modelOverride).toBe("");
280
+ expect(agent.spec?.subAgents[0]?.mcpAccess.map((a) => a.mcpServer)).toEqual(
281
+ [`${name}-github`],
282
+ );
283
+
284
+ const serverResource = await mcpServerQuery.getByReference(
285
+ createMessage(ApiResourceReferenceSchema, {
286
+ org: ORG,
287
+ kind: ApiResourceKind.mcp_server,
288
+ slug: `${name}-github`,
289
+ }),
290
+ );
291
+ expect(serverResource.spec?.env["GITHUB_TOKEN"]).toMatchObject({
292
+ isSecret: true,
293
+ optional: false,
294
+ });
295
+ });
296
+
297
+ it("installs an MCP-only plugin as its servers and no agent", async () => {
298
+ const name = uniqueName("github");
299
+ const installed = await plugins.push({
300
+ org: ORG,
301
+ artifact: archiveOf(
302
+ openPlugin({
303
+ name,
304
+ version: "0.1.0",
305
+ // The open format's word for the transport is `streamable-http`.
306
+ mcpServers: {
307
+ [name]: {
308
+ type: "streamable-http",
309
+ url: "https://example.com/mcp",
310
+ headers: { Authorization: "Bearer ${TOKEN}" },
311
+ },
312
+ },
313
+ }),
314
+ ),
315
+ });
316
+ expect(installed.status?.materialized).toMatchObject({
317
+ skills: 0,
318
+ mcpServers: 1,
319
+ agents: 0,
320
+ });
321
+ const members = await pluginQuery.listMembers({
322
+ value: installed.metadata!.id,
323
+ });
324
+ expect(members.members.map((m) => ApiResourceKind[m.kind])).toEqual([
325
+ "mcp_server",
326
+ ]);
327
+ });
328
+
329
+ it("re-pushing the same archive writes nothing: same digest, one version, members untouched", async () => {
330
+ const name = uniqueName("idem");
331
+ const first = await plugins.push({
332
+ org: ORG,
333
+ artifact: archiveOf(thermosLike(name)),
334
+ });
335
+ const skillBefore = await skillQuery.getByReference(
336
+ createMessage(ApiResourceReferenceSchema, {
337
+ org: ORG,
338
+ kind: ApiResourceKind.skill,
339
+ slug: `${name}-review`,
340
+ }),
341
+ );
342
+ const second = await plugins.push({
343
+ org: ORG,
344
+ artifact: archiveOf(thermosLike(name)),
345
+ });
346
+ expect(second.metadata?.id).toBe(first.metadata?.id);
347
+ expect(second.status?.digest).toBe(first.status?.digest);
348
+ const versions = await pluginQuery.listVersions({ org: ORG, slug: name });
349
+ expect(versions.totalCount).toBe(1);
350
+ expect(versions.versions[0]?.tag).toBe("1.2.0");
351
+ const skillAfter = await skillQuery.getByReference(
352
+ createMessage(ApiResourceReferenceSchema, {
353
+ org: ORG,
354
+ kind: ApiResourceKind.skill,
355
+ slug: `${name}-review`,
356
+ }),
357
+ );
358
+ expect(skillAfter.status?.audit?.specAudit?.updatedAt).toEqual(
359
+ skillBefore.status?.audit?.specAudit?.updatedAt,
360
+ );
361
+ });
362
+
363
+ it("an upgrade that drops a skill removes it and keeps the agent valid; the version history grows", async () => {
364
+ const name = uniqueName("upgrade");
365
+ const first = await plugins.push({
366
+ org: ORG,
367
+ artifact: archiveOf(thermosLike(name, { extraSkill: `${name}-extra` })),
368
+ });
369
+ expect(first.status?.materialized?.skills).toBe(2);
370
+
371
+ const second = await plugins.push({
372
+ org: ORG,
373
+ artifact: archiveOf(thermosLike(name)),
374
+ });
375
+ expect(second.status?.materialized?.skills).toBe(1);
376
+ expect(second.status?.digest).not.toBe(first.status?.digest);
377
+
378
+ await expectCode(
379
+ skillQuery.getByReference(
380
+ createMessage(ApiResourceReferenceSchema, {
381
+ org: ORG,
382
+ kind: ApiResourceKind.skill,
383
+ slug: `${name}-extra`,
384
+ }),
385
+ ),
386
+ Code.NotFound,
387
+ );
388
+ const agent = await agentQuery.getByReference(
389
+ createMessage(ApiResourceReferenceSchema, {
390
+ org: ORG,
391
+ kind: ApiResourceKind.agent,
392
+ slug: name,
393
+ }),
394
+ );
395
+ expect(agent.spec?.skillRefs.map((r) => r.slug)).toEqual([
396
+ `${name}-review`,
397
+ ]);
398
+ const versions = await pluginQuery.listVersions({ org: ORG, slug: name });
399
+ expect(versions.totalCount).toBe(2);
400
+ expect(
401
+ versions.versions.filter((v) => v.isCurrent).map((v) => v.digest),
402
+ ).toEqual([second.status?.digest]);
403
+ });
404
+
405
+ it("getByReference resolves latest, the digest and the manifest version tag", async () => {
406
+ const name = uniqueName("ref");
407
+ const installed = await plugins.push({
408
+ org: ORG,
409
+ artifact: archiveOf(thermosLike(name)),
410
+ });
411
+ for (const version of ["", "latest", installed.status!.digest, "1.2.0"]) {
412
+ const resolved = await pluginQuery.getByReference(
413
+ createMessage(ApiResourceReferenceSchema, {
414
+ org: ORG,
415
+ kind: ApiResourceKind.plugin,
416
+ slug: name,
417
+ version,
418
+ }),
419
+ );
420
+ expect(resolved.status?.digest, version).toBe(installed.status?.digest);
421
+ }
422
+ });
423
+ });
424
+
425
+ describe("Plugin members are the plugin's to redefine", () => {
426
+ it("refuses a client update, delete and visibility change of a member, naming the plugin", async () => {
427
+ const name = uniqueName("managed");
428
+ const installed = await plugins.push({
429
+ org: ORG,
430
+ artifact: archiveOf(thermosLike(name)),
431
+ });
432
+ const members = await pluginQuery.listMembers({
433
+ value: installed.metadata!.id,
434
+ });
435
+ const agentMember = members.members.find(
436
+ (m) => m.kind === ApiResourceKind.agent,
437
+ )!;
438
+ const serverMember = members.members.find(
439
+ (m) => m.kind === ApiResourceKind.mcp_server,
440
+ )!;
441
+
442
+ const agent = await agentQuery.get({ value: agentMember.id });
443
+ agent.spec!.description = "edited by a client";
444
+ await expectCode(
445
+ agents.update(agent),
446
+ Code.FailedPrecondition,
447
+ `agent '${name}' is managed by plugin '${name}'`,
448
+ );
449
+ await expectCode(
450
+ mcpServers.delete({ resourceId: serverMember.id }),
451
+ Code.FailedPrecondition,
452
+ `MCP server '${name}-github' is managed by plugin '${name}'`,
453
+ );
454
+ await expectCode(
455
+ agents.updateVisibility({ resourceId: agentMember.id, visibility: 3 }),
456
+ Code.FailedPrecondition,
457
+ "is managed by plugin",
458
+ );
459
+ });
460
+
461
+ it("refuses a client re-push of a managed skill under the same name", async () => {
462
+ const name = uniqueName("skillpush");
463
+ await plugins.push({ org: ORG, artifact: archiveOf(thermosLike(name)) });
464
+ const rogue = writeArchive([
465
+ {
466
+ path: "SKILL.md",
467
+ bytes: encoder.encode(
468
+ `---\nname: ${name}-review\ndescription: hijack\n---\n# Mine now`,
469
+ ),
470
+ },
471
+ ]);
472
+ await expectCode(
473
+ skills.push({ org: ORG, artifact: rogue }),
474
+ Code.FailedPrecondition,
475
+ `skill '${name}-review' is managed by plugin '${name}'`,
476
+ );
477
+ });
478
+
479
+ it("refuses to install over a slug an unmanaged resource holds, naming it", async () => {
480
+ const name = uniqueName("collide");
481
+ const skillName = `${name}-review`;
482
+ await skills.push({
483
+ org: ORG,
484
+ artifact: writeArchive([
485
+ {
486
+ path: "SKILL.md",
487
+ bytes: encoder.encode(
488
+ `---\nname: ${skillName}\ndescription: mine\n---\n# Mine`,
489
+ ),
490
+ },
491
+ ]),
492
+ });
493
+ await expectCode(
494
+ plugins.push({ org: ORG, artifact: archiveOf(thermosLike(name)) }),
495
+ Code.AlreadyExists,
496
+ `'${skillName}' exists in org '${ORG}' and is not managed by a plugin`,
497
+ );
498
+ });
499
+
500
+ it("refuses to install a slug another plugin holds, naming that plugin", async () => {
501
+ const first = uniqueName("holder");
502
+ const second = uniqueName("claimant");
503
+ const shared = `${first}-shared`;
504
+ await plugins.push({
505
+ org: ORG,
506
+ artifact: archiveOf(thermosLike(first, { skill: shared })),
507
+ });
508
+ await expectCode(
509
+ plugins.push({
510
+ org: ORG,
511
+ artifact: archiveOf(thermosLike(second, { skill: shared })),
512
+ }),
513
+ Code.AlreadyExists,
514
+ `'${shared}' is held by plugin '${first}'`,
515
+ );
516
+ });
517
+ });
518
+
519
+ describe("Plugin delete", () => {
520
+ it("removes every member and the head; a fresh install of the same archive works afterwards", async () => {
521
+ const name = uniqueName("remove");
522
+ const installed = await plugins.push({
523
+ org: ORG,
524
+ artifact: archiveOf(thermosLike(name)),
525
+ });
526
+ const members = await pluginQuery.listMembers({
527
+ value: installed.metadata!.id,
528
+ });
529
+ expect(members.members).toHaveLength(3);
530
+
531
+ await plugins.delete({ value: installed.metadata!.id });
532
+
533
+ await expectCode(
534
+ pluginQuery.get({ value: installed.metadata!.id }),
535
+ Code.NotFound,
536
+ );
537
+ for (const member of members.members) {
538
+ const lookup =
539
+ member.kind === ApiResourceKind.skill
540
+ ? skillQuery.get({ value: member.id })
541
+ : member.kind === ApiResourceKind.mcp_server
542
+ ? mcpServerQuery.get({ value: member.id })
543
+ : agentQuery.get({ value: member.id });
544
+ await expectCode(lookup, Code.NotFound);
545
+ }
546
+ const again = await plugins.push({
547
+ org: ORG,
548
+ artifact: archiveOf(thermosLike(name)),
549
+ });
550
+ expect(again.status?.state).toBe(PluginState.READY);
551
+ expect(again.metadata?.id).not.toBe(installed.metadata?.id);
552
+ });
553
+
554
+ it("is refused while a user's own agent references a member, and succeeds once it is detached", async () => {
555
+ const name = uniqueName("referenced");
556
+ const installed = await plugins.push({
557
+ org: ORG,
558
+ artifact: archiveOf(thermosLike(name)),
559
+ });
560
+ const mine = await agents.create(
561
+ createMessage(AgentSchema, {
562
+ apiVersion: "agentic.stigmer.ai/v1",
563
+ kind: "Agent",
564
+ metadata: createMessage(ApiResourceMetadataSchema, {
565
+ org: ORG,
566
+ name: `${name}-composer`,
567
+ }),
568
+ spec: createMessage(AgentSpecSchema, {
569
+ instructions: "You compose over the plugin's tools.",
570
+ mcpServerUsages: [
571
+ createMessage(McpServerUsageSchema, {
572
+ mcpServerRef: createMessage(ApiResourceReferenceSchema, {
573
+ org: ORG,
574
+ kind: ApiResourceKind.mcp_server,
575
+ slug: `${name}-github`,
576
+ }),
577
+ }),
578
+ ],
579
+ }),
580
+ }),
581
+ );
582
+ await expectCode(
583
+ plugins.delete({ value: installed.metadata!.id }),
584
+ Code.FailedPrecondition,
585
+ `plugin '${name}' is still used by agent '${name}-composer'`,
586
+ );
587
+ await agents.delete({ value: mine.metadata!.id });
588
+ await plugins.delete({ value: installed.metadata!.id });
589
+ await expectCode(
590
+ pluginQuery.get({ value: installed.metadata!.id }),
591
+ Code.NotFound,
592
+ );
593
+ });
594
+ });
595
+
596
+ describe("Plugin push — refusals before any write", () => {
597
+ it("refuses a package the library refuses, with its sentences", async () => {
598
+ const name = uniqueName("badurl");
599
+ const broken = cursorPlugin({
600
+ name,
601
+ mcpServers: { [name]: { type: "http", url: "https://${HOST}/mcp" } },
602
+ });
603
+ const error = await expectCode(
604
+ plugins.push({ org: ORG, artifact: archiveOf(broken) }),
605
+ Code.InvalidArgument,
606
+ "plugin cannot be installed, 1 problem found",
607
+ );
608
+ expect(error.rawMessage).toContain("has a variable in its 'url'");
609
+ await expectCode(
610
+ pluginQuery.getByReference(
611
+ createMessage(ApiResourceReferenceSchema, {
612
+ org: ORG,
613
+ kind: ApiResourceKind.plugin,
614
+ slug: name,
615
+ }),
616
+ ),
617
+ Code.NotFound,
618
+ );
619
+ });
620
+
621
+ it("refuses an agent overlay with an unknown field, naming the document", async () => {
622
+ const name = uniqueName("overlay");
623
+ const fixture = withFile(
624
+ thermosLike(name),
625
+ "ai.stigmer/agent.yaml",
626
+ `apiVersion: agentic.stigmer.ai/v1\nkind: Agent\nmetadata:\n name: ${name}\nspec:\n instructions: Ten characters or more of instructions.\n favourite_colour: blue\n`,
627
+ );
628
+ await expectCode(
629
+ plugins.push({ org: ORG, artifact: archiveOf(fixture) }),
630
+ Code.InvalidArgument,
631
+ "overlay document 'ai.stigmer/agent.yaml'",
632
+ );
633
+ });
634
+
635
+ it("refuses an agent overlay that names another resource", async () => {
636
+ const name = uniqueName("overlayname");
637
+ const fixture = withFile(
638
+ thermosLike(name),
639
+ "ai.stigmer/agent.yaml",
640
+ `apiVersion: agentic.stigmer.ai/v1\nkind: Agent\nmetadata:\n name: somebody-else\nspec:\n instructions: Ten characters or more of instructions.\n`,
641
+ );
642
+ await expectCode(
643
+ plugins.push({ org: ORG, artifact: archiveOf(fixture) }),
644
+ Code.InvalidArgument,
645
+ "names 'somebody-else'",
646
+ );
647
+ });
648
+
649
+ it("refuses bytes that are not an archive", async () => {
650
+ await expectCode(
651
+ plugins.push({ org: ORG, artifact: encoder.encode("not a zip") }),
652
+ Code.InvalidArgument,
653
+ "failed to read plugin archive",
654
+ );
655
+ });
656
+
657
+ it("applies an agent overlay wholesale when it names the plugin", async () => {
658
+ const name = uniqueName("overlayok");
659
+ const fixture = withFile(
660
+ thermosLike(name),
661
+ "ai.stigmer/agent.yaml",
662
+ `apiVersion: agentic.stigmer.ai/v1\nkind: Agent\nmetadata:\n name: ${name}\nspec:\n description: authored\n instructions: The author's own instructions for this agent.\n`,
663
+ );
664
+ const installed = await plugins.push({
665
+ org: ORG,
666
+ artifact: archiveOf(fixture),
667
+ });
668
+ expect(installed.status?.state).toBe(PluginState.READY);
669
+ const agent = await agentQuery.getByReference(
670
+ createMessage(ApiResourceReferenceSchema, {
671
+ org: ORG,
672
+ kind: ApiResourceKind.agent,
673
+ slug: name,
674
+ }),
675
+ );
676
+ expect(agent.spec?.instructions).toBe(
677
+ "The author's own instructions for this agent.",
678
+ );
679
+ expect(agent.metadata?.labels[PLUGIN_LABEL]).toBe(installed.metadata?.id);
680
+ });
681
+ });