@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,796 @@
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. A second composition, under an authorizer that denies
14
+ * `can_write_reserved_labels`, pins the reserved-label refusal the
15
+ * open-source posture allows by design.
16
+ */
17
+ import { mkdtempSync, rmSync } from "node:fs";
18
+ import net from "node:net";
19
+ import { tmpdir } from "node:os";
20
+ import path from "node:path";
21
+
22
+ import { Code, ConnectError, createClient } from "@connectrpc/connect";
23
+ import type { Client, Transport } from "@connectrpc/connect";
24
+ import { createGrpcTransport } from "@connectrpc/connect-node";
25
+ import { create as createMessage } from "@bufbuild/protobuf";
26
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
27
+
28
+ import {
29
+ cursorPlugin,
30
+ openPlugin,
31
+ withFile,
32
+ } from "@stigmer/plugin-package/testing";
33
+ import type { PluginFixture } from "@stigmer/plugin-package/testing";
34
+ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
35
+ import { AgentCommandController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/command_pb";
36
+ import { AgentQueryController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/query_pb";
37
+ import {
38
+ AgentSpecSchema,
39
+ McpServerUsageSchema,
40
+ } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
41
+ import { McpServerCommandController } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/command_pb";
42
+ import { McpServerQueryController } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/query_pb";
43
+ import { PluginCommandController } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/command_pb";
44
+ import { PluginQueryController } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/query_pb";
45
+ import { PluginState } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/status_pb";
46
+ import { SkillCommandController } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/command_pb";
47
+ import { SkillQueryController } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/query_pb";
48
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
49
+ import { ApiResourceMetadataSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
50
+ import { ApiResourceReferenceSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
51
+ import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
52
+
53
+ import { writeArchive } from "../../../archive/write.js";
54
+ import { loadConfig } from "../../../boot/config.js";
55
+ import { composeServer } from "../../../boot/compose.js";
56
+ import type { ComposedServer } from "../../../boot/compose.js";
57
+ import type { Authorizer, AuthzCheck } from "../../../extensions/authorizer.js";
58
+ import { createLogger } from "../../../boot/logger.js";
59
+ import {
60
+ PLUGIN_LABEL,
61
+ PLUGIN_VERSION_LABEL,
62
+ } from "../../../pipeline/apiresource-labels.js";
63
+
64
+ const silentLogger = createLogger({
65
+ level: "error",
66
+ pretty: false,
67
+ write: () => {},
68
+ });
69
+ const ORG = "acme";
70
+
71
+ let server: ComposedServer;
72
+ let plugins: Client<typeof PluginCommandController>;
73
+ let pluginQuery: Client<typeof PluginQueryController>;
74
+ let agents: Client<typeof AgentCommandController>;
75
+ let agentQuery: Client<typeof AgentQueryController>;
76
+ let skills: Client<typeof SkillCommandController>;
77
+ let skillQuery: Client<typeof SkillQueryController>;
78
+ let mcpServers: Client<typeof McpServerCommandController>;
79
+ let mcpServerQuery: Client<typeof McpServerQueryController>;
80
+ let dir: string;
81
+
82
+ async function reserveFreePort(): Promise<number> {
83
+ return new Promise((resolve, reject) => {
84
+ const probe = net.createServer();
85
+ probe.once("error", reject);
86
+ probe.listen(0, "127.0.0.1", () => {
87
+ const { port } = probe.address() as net.AddressInfo;
88
+ probe.close(() => resolve(port));
89
+ });
90
+ });
91
+ }
92
+
93
+ beforeAll(async () => {
94
+ dir = mkdtempSync(path.join(tmpdir(), "plugin-domain-test-"));
95
+ const grpcPort = await reserveFreePort();
96
+ server = await composeServer({
97
+ config: loadConfig({
98
+ STIGMER_MODEL_REGISTRY_REFRESH: "off",
99
+ TEMPORAL_HOST_PORT: "127.0.0.1:1",
100
+ GRPC_PORT: String(grpcPort),
101
+ DB_PATH: path.join(dir, "stigmer.db"),
102
+ ARTIFACT_LOCAL_BASE_PATH: path.join(dir, "artifacts"),
103
+ STORAGE_PATH: path.join(dir, "storage"),
104
+ }),
105
+ logger: silentLogger,
106
+ host: "127.0.0.1",
107
+ });
108
+ const port = await server.start();
109
+ const transport: Transport = createGrpcTransport({
110
+ baseUrl: `http://127.0.0.1:${port}`,
111
+ });
112
+ plugins = createClient(PluginCommandController, transport);
113
+ pluginQuery = createClient(PluginQueryController, transport);
114
+ agents = createClient(AgentCommandController, transport);
115
+ agentQuery = createClient(AgentQueryController, transport);
116
+ skills = createClient(SkillCommandController, transport);
117
+ skillQuery = createClient(SkillQueryController, transport);
118
+ mcpServers = createClient(McpServerCommandController, transport);
119
+ mcpServerQuery = createClient(McpServerQueryController, transport);
120
+ });
121
+
122
+ afterAll(async () => {
123
+ await server.shutdown();
124
+ rmSync(dir, { recursive: true, force: true });
125
+ });
126
+
127
+ const encoder = new TextEncoder();
128
+
129
+ /** A fixture map as the archive the CLI would push: the server's own deterministic writer. */
130
+ function archiveOf(fixture: PluginFixture): Uint8Array {
131
+ return writeArchive(
132
+ [...fixture.entries()].map(([filePath, content]) => ({
133
+ path: filePath,
134
+ bytes: typeof content === "string" ? encoder.encode(content) : content,
135
+ })),
136
+ );
137
+ }
138
+
139
+ let counter = 0;
140
+ function uniqueName(prefix: string): string {
141
+ counter += 1;
142
+ return `${prefix}-${counter}`;
143
+ }
144
+
145
+ /** A Cursor plugin with one skill, one sub-agent and one HTTP server: the thermos shape. */
146
+ function thermosLike(
147
+ name: string,
148
+ options: { readonly skill?: string; readonly extraSkill?: string } = {},
149
+ ): PluginFixture {
150
+ const skill = options.skill ?? `${name}-review`;
151
+ return cursorPlugin({
152
+ name,
153
+ version: "1.2.0",
154
+ description: "Code review with a thermonuclear standard",
155
+ skills: [
156
+ {
157
+ name: skill,
158
+ description: "Review code thoroughly",
159
+ body: "# Review\nRead everything.",
160
+ },
161
+ ...(options.extraSkill === undefined
162
+ ? []
163
+ : [
164
+ {
165
+ name: options.extraSkill,
166
+ description: "Another skill",
167
+ body: "# More\nAnd more.",
168
+ },
169
+ ]),
170
+ ],
171
+ agents: [
172
+ {
173
+ file: "reviewer",
174
+ frontmatter: {
175
+ name: `${name}-reviewer`,
176
+ description: "Reviews pull requests",
177
+ model: "sonnet",
178
+ },
179
+ body: "You review pull requests with care and name every risk you see.",
180
+ },
181
+ ],
182
+ mcpServers: {
183
+ [`${name}-github`]: {
184
+ type: "http",
185
+ url: "https://api.githubcopilot.com/mcp/",
186
+ headers: { Authorization: "Bearer ${GITHUB_TOKEN}" },
187
+ },
188
+ },
189
+ variables: {
190
+ GITHUB_TOKEN: {
191
+ type: "string",
192
+ title: "GitHub token",
193
+ description: "A personal access token",
194
+ },
195
+ },
196
+ required: ["GITHUB_TOKEN"],
197
+ });
198
+ }
199
+
200
+ async function expectCode(
201
+ promise: Promise<unknown>,
202
+ code: Code,
203
+ contains?: string,
204
+ ): Promise<ConnectError> {
205
+ try {
206
+ await promise;
207
+ } catch (error) {
208
+ expect(error).toBeInstanceOf(ConnectError);
209
+ const connectError = error as ConnectError;
210
+ expect(connectError.code, connectError.rawMessage).toBe(code);
211
+ if (contains !== undefined) {
212
+ expect(connectError.rawMessage).toContain(contains);
213
+ }
214
+ return connectError;
215
+ }
216
+ throw new Error(`expected ${Code[code]}, the call succeeded`);
217
+ }
218
+
219
+ describe("Plugin push — materialisation", () => {
220
+ it("installs a Cursor plugin as one skill, one MCP server and one agent, each labelled with the plugin id and digest", async () => {
221
+ const name = uniqueName("thermos");
222
+ const installed = await plugins.push({
223
+ org: ORG,
224
+ artifact: archiveOf(thermosLike(name)),
225
+ });
226
+
227
+ expect(installed.metadata?.id).toMatch(/^plg_/);
228
+ expect(installed.metadata?.slug).toBe(name);
229
+ expect(installed.spec?.name).toBe(name);
230
+ expect(installed.spec?.version).toBe("1.2.0");
231
+ expect(installed.status?.state).toBe(PluginState.READY);
232
+ expect(installed.status?.digest).toMatch(/^[a-f0-9]{64}$/);
233
+ expect(installed.status?.materialized).toMatchObject({
234
+ skills: 1,
235
+ mcpServers: 1,
236
+ agents: 1,
237
+ workflows: 0,
238
+ });
239
+ // The sub-agent's model hint is recorded, never applied.
240
+ expect(installed.status?.warnings.map((w) => w.kind)).toContain(
241
+ "model-hint-unresolved",
242
+ );
243
+
244
+ const members = await pluginQuery.listMembers({
245
+ value: installed.metadata!.id,
246
+ });
247
+ expect(
248
+ members.members.map((m) => `${ApiResourceKind[m.kind]}:${m.slug}`),
249
+ ).toEqual([
250
+ `skill:${name}-review`,
251
+ `mcp_server:${name}-github`,
252
+ `agent:${name}`,
253
+ ]);
254
+
255
+ const digest = installed.status!.digest;
256
+ for (const member of members.members) {
257
+ const labels =
258
+ member.kind === ApiResourceKind.skill
259
+ ? (await skillQuery.get({ value: member.id })).metadata!.labels
260
+ : member.kind === ApiResourceKind.mcp_server
261
+ ? (await mcpServerQuery.get({ value: member.id })).metadata!.labels
262
+ : (await agentQuery.get({ value: member.id })).metadata!.labels;
263
+ expect(labels[PLUGIN_LABEL]).toBe(installed.metadata!.id);
264
+ expect(labels[PLUGIN_VERSION_LABEL]).toBe(digest);
265
+ }
266
+
267
+ const agent = await agentQuery.getByReference(
268
+ createMessage(ApiResourceReferenceSchema, {
269
+ org: ORG,
270
+ kind: ApiResourceKind.agent,
271
+ slug: name,
272
+ }),
273
+ );
274
+ expect(agent.spec?.skillRefs.map((r) => r.slug)).toEqual([
275
+ `${name}-review`,
276
+ ]);
277
+ expect(
278
+ agent.spec?.mcpServerUsages.map((u) => u.mcpServerRef?.slug),
279
+ ).toEqual([`${name}-github`]);
280
+ expect(agent.spec?.subAgents.map((s) => s.name)).toEqual([
281
+ `${name}-reviewer`,
282
+ ]);
283
+ expect(agent.spec?.subAgents[0]?.modelOverride).toBe("");
284
+ expect(agent.spec?.subAgents[0]?.mcpAccess.map((a) => a.mcpServer)).toEqual(
285
+ [`${name}-github`],
286
+ );
287
+
288
+ const serverResource = await mcpServerQuery.getByReference(
289
+ createMessage(ApiResourceReferenceSchema, {
290
+ org: ORG,
291
+ kind: ApiResourceKind.mcp_server,
292
+ slug: `${name}-github`,
293
+ }),
294
+ );
295
+ expect(serverResource.spec?.env["GITHUB_TOKEN"]).toMatchObject({
296
+ isSecret: true,
297
+ optional: false,
298
+ });
299
+ });
300
+
301
+ it("installs an MCP-only plugin as its servers and no agent", async () => {
302
+ const name = uniqueName("github");
303
+ const installed = await plugins.push({
304
+ org: ORG,
305
+ artifact: archiveOf(
306
+ openPlugin({
307
+ name,
308
+ version: "0.1.0",
309
+ // The open format's word for the transport is `streamable-http`.
310
+ mcpServers: {
311
+ [name]: {
312
+ type: "streamable-http",
313
+ url: "https://example.com/mcp",
314
+ headers: { Authorization: "Bearer ${TOKEN}" },
315
+ },
316
+ },
317
+ }),
318
+ ),
319
+ });
320
+ expect(installed.status?.materialized).toMatchObject({
321
+ skills: 0,
322
+ mcpServers: 1,
323
+ agents: 0,
324
+ });
325
+ const members = await pluginQuery.listMembers({
326
+ value: installed.metadata!.id,
327
+ });
328
+ expect(members.members.map((m) => ApiResourceKind[m.kind])).toEqual([
329
+ "mcp_server",
330
+ ]);
331
+ });
332
+
333
+ it("re-pushing the same archive writes nothing: same digest, one version, members untouched", async () => {
334
+ const name = uniqueName("idem");
335
+ const first = await plugins.push({
336
+ org: ORG,
337
+ artifact: archiveOf(thermosLike(name)),
338
+ });
339
+ const skillBefore = await skillQuery.getByReference(
340
+ createMessage(ApiResourceReferenceSchema, {
341
+ org: ORG,
342
+ kind: ApiResourceKind.skill,
343
+ slug: `${name}-review`,
344
+ }),
345
+ );
346
+ const second = await plugins.push({
347
+ org: ORG,
348
+ artifact: archiveOf(thermosLike(name)),
349
+ });
350
+ expect(second.metadata?.id).toBe(first.metadata?.id);
351
+ expect(second.status?.digest).toBe(first.status?.digest);
352
+ const versions = await pluginQuery.listVersions({ org: ORG, slug: name });
353
+ expect(versions.totalCount).toBe(1);
354
+ expect(versions.versions[0]?.tag).toBe("1.2.0");
355
+ const skillAfter = await skillQuery.getByReference(
356
+ createMessage(ApiResourceReferenceSchema, {
357
+ org: ORG,
358
+ kind: ApiResourceKind.skill,
359
+ slug: `${name}-review`,
360
+ }),
361
+ );
362
+ expect(skillAfter.status?.audit?.specAudit?.updatedAt).toEqual(
363
+ skillBefore.status?.audit?.specAudit?.updatedAt,
364
+ );
365
+ });
366
+
367
+ it("an upgrade that drops a skill removes it and keeps the agent valid; the version history grows", async () => {
368
+ const name = uniqueName("upgrade");
369
+ const first = await plugins.push({
370
+ org: ORG,
371
+ artifact: archiveOf(thermosLike(name, { extraSkill: `${name}-extra` })),
372
+ });
373
+ expect(first.status?.materialized?.skills).toBe(2);
374
+
375
+ const second = await plugins.push({
376
+ org: ORG,
377
+ artifact: archiveOf(thermosLike(name)),
378
+ });
379
+ expect(second.status?.materialized?.skills).toBe(1);
380
+ expect(second.status?.digest).not.toBe(first.status?.digest);
381
+
382
+ await expectCode(
383
+ skillQuery.getByReference(
384
+ createMessage(ApiResourceReferenceSchema, {
385
+ org: ORG,
386
+ kind: ApiResourceKind.skill,
387
+ slug: `${name}-extra`,
388
+ }),
389
+ ),
390
+ Code.NotFound,
391
+ );
392
+ const agent = await agentQuery.getByReference(
393
+ createMessage(ApiResourceReferenceSchema, {
394
+ org: ORG,
395
+ kind: ApiResourceKind.agent,
396
+ slug: name,
397
+ }),
398
+ );
399
+ expect(agent.spec?.skillRefs.map((r) => r.slug)).toEqual([
400
+ `${name}-review`,
401
+ ]);
402
+ const versions = await pluginQuery.listVersions({ org: ORG, slug: name });
403
+ expect(versions.totalCount).toBe(2);
404
+ expect(
405
+ versions.versions.filter((v) => v.isCurrent).map((v) => v.digest),
406
+ ).toEqual([second.status?.digest]);
407
+ });
408
+
409
+ it("getByReference resolves latest, the digest and the manifest version tag", async () => {
410
+ const name = uniqueName("ref");
411
+ const installed = await plugins.push({
412
+ org: ORG,
413
+ artifact: archiveOf(thermosLike(name)),
414
+ });
415
+ for (const version of ["", "latest", installed.status!.digest, "1.2.0"]) {
416
+ const resolved = await pluginQuery.getByReference(
417
+ createMessage(ApiResourceReferenceSchema, {
418
+ org: ORG,
419
+ kind: ApiResourceKind.plugin,
420
+ slug: name,
421
+ version,
422
+ }),
423
+ );
424
+ expect(resolved.status?.digest, version).toBe(installed.status?.digest);
425
+ }
426
+ });
427
+ });
428
+
429
+ describe("Plugin members are the plugin's to redefine", () => {
430
+ it("refuses a client update, delete and visibility change of a member, naming the plugin", async () => {
431
+ const name = uniqueName("managed");
432
+ const installed = await plugins.push({
433
+ org: ORG,
434
+ artifact: archiveOf(thermosLike(name)),
435
+ });
436
+ const members = await pluginQuery.listMembers({
437
+ value: installed.metadata!.id,
438
+ });
439
+ const agentMember = members.members.find(
440
+ (m) => m.kind === ApiResourceKind.agent,
441
+ )!;
442
+ const serverMember = members.members.find(
443
+ (m) => m.kind === ApiResourceKind.mcp_server,
444
+ )!;
445
+
446
+ const agent = await agentQuery.get({ value: agentMember.id });
447
+ agent.spec!.description = "edited by a client";
448
+ await expectCode(
449
+ agents.update(agent),
450
+ Code.FailedPrecondition,
451
+ `agent '${name}' is managed by plugin '${name}'`,
452
+ );
453
+ await expectCode(
454
+ mcpServers.delete({ resourceId: serverMember.id }),
455
+ Code.FailedPrecondition,
456
+ `MCP server '${name}-github' is managed by plugin '${name}'`,
457
+ );
458
+ await expectCode(
459
+ agents.updateVisibility({ resourceId: agentMember.id, visibility: 3 }),
460
+ Code.FailedPrecondition,
461
+ "is managed by plugin",
462
+ );
463
+ });
464
+
465
+ it("refuses a client re-push of a managed skill under the same name", async () => {
466
+ const name = uniqueName("skillpush");
467
+ await plugins.push({ org: ORG, artifact: archiveOf(thermosLike(name)) });
468
+ const rogue = writeArchive([
469
+ {
470
+ path: "SKILL.md",
471
+ bytes: encoder.encode(
472
+ `---\nname: ${name}-review\ndescription: hijack\n---\n# Mine now`,
473
+ ),
474
+ },
475
+ ]);
476
+ await expectCode(
477
+ skills.push({ org: ORG, artifact: rogue }),
478
+ Code.FailedPrecondition,
479
+ `skill '${name}-review' is managed by plugin '${name}'`,
480
+ );
481
+ });
482
+
483
+ it("refuses to install over a slug an unmanaged resource holds, naming it", async () => {
484
+ const name = uniqueName("collide");
485
+ const skillName = `${name}-review`;
486
+ await skills.push({
487
+ org: ORG,
488
+ artifact: writeArchive([
489
+ {
490
+ path: "SKILL.md",
491
+ bytes: encoder.encode(
492
+ `---\nname: ${skillName}\ndescription: mine\n---\n# Mine`,
493
+ ),
494
+ },
495
+ ]),
496
+ });
497
+ await expectCode(
498
+ plugins.push({ org: ORG, artifact: archiveOf(thermosLike(name)) }),
499
+ Code.AlreadyExists,
500
+ `'${skillName}' exists in org '${ORG}' and is not managed by a plugin`,
501
+ );
502
+ });
503
+
504
+ it("refuses to install a slug another plugin holds, naming that plugin", async () => {
505
+ const first = uniqueName("holder");
506
+ const second = uniqueName("claimant");
507
+ const shared = `${first}-shared`;
508
+ await plugins.push({
509
+ org: ORG,
510
+ artifact: archiveOf(thermosLike(first, { skill: shared })),
511
+ });
512
+ await expectCode(
513
+ plugins.push({
514
+ org: ORG,
515
+ artifact: archiveOf(thermosLike(second, { skill: shared })),
516
+ }),
517
+ Code.AlreadyExists,
518
+ `'${shared}' is held by plugin '${first}'`,
519
+ );
520
+ });
521
+ });
522
+
523
+ describe("Plugin delete", () => {
524
+ it("removes every member and the head; a fresh install of the same archive works afterwards", async () => {
525
+ const name = uniqueName("remove");
526
+ const installed = await plugins.push({
527
+ org: ORG,
528
+ artifact: archiveOf(thermosLike(name)),
529
+ });
530
+ const members = await pluginQuery.listMembers({
531
+ value: installed.metadata!.id,
532
+ });
533
+ expect(members.members).toHaveLength(3);
534
+
535
+ await plugins.delete({ value: installed.metadata!.id });
536
+
537
+ await expectCode(
538
+ pluginQuery.get({ value: installed.metadata!.id }),
539
+ Code.NotFound,
540
+ );
541
+ for (const member of members.members) {
542
+ const lookup =
543
+ member.kind === ApiResourceKind.skill
544
+ ? skillQuery.get({ value: member.id })
545
+ : member.kind === ApiResourceKind.mcp_server
546
+ ? mcpServerQuery.get({ value: member.id })
547
+ : agentQuery.get({ value: member.id });
548
+ await expectCode(lookup, Code.NotFound);
549
+ }
550
+ const again = await plugins.push({
551
+ org: ORG,
552
+ artifact: archiveOf(thermosLike(name)),
553
+ });
554
+ expect(again.status?.state).toBe(PluginState.READY);
555
+ expect(again.metadata?.id).not.toBe(installed.metadata?.id);
556
+ });
557
+
558
+ it("is refused while a user's own agent references a member, and succeeds once it is detached", async () => {
559
+ const name = uniqueName("referenced");
560
+ const installed = await plugins.push({
561
+ org: ORG,
562
+ artifact: archiveOf(thermosLike(name)),
563
+ });
564
+ const mine = await agents.create(
565
+ createMessage(AgentSchema, {
566
+ apiVersion: "agentic.stigmer.ai/v1",
567
+ kind: "Agent",
568
+ metadata: createMessage(ApiResourceMetadataSchema, {
569
+ org: ORG,
570
+ name: `${name}-composer`,
571
+ }),
572
+ spec: createMessage(AgentSpecSchema, {
573
+ instructions: "You compose over the plugin's tools.",
574
+ mcpServerUsages: [
575
+ createMessage(McpServerUsageSchema, {
576
+ mcpServerRef: createMessage(ApiResourceReferenceSchema, {
577
+ org: ORG,
578
+ kind: ApiResourceKind.mcp_server,
579
+ slug: `${name}-github`,
580
+ }),
581
+ }),
582
+ ],
583
+ }),
584
+ }),
585
+ );
586
+ await expectCode(
587
+ plugins.delete({ value: installed.metadata!.id }),
588
+ Code.FailedPrecondition,
589
+ `plugin '${name}' is still used by agent '${name}-composer'`,
590
+ );
591
+ await agents.delete({ value: mine.metadata!.id });
592
+ await plugins.delete({ value: installed.metadata!.id });
593
+ await expectCode(
594
+ pluginQuery.get({ value: installed.metadata!.id }),
595
+ Code.NotFound,
596
+ );
597
+ });
598
+ });
599
+
600
+ describe("Plugin push — refusals before any write", () => {
601
+ it("refuses a package the library refuses, with its sentences", async () => {
602
+ const name = uniqueName("badurl");
603
+ const broken = cursorPlugin({
604
+ name,
605
+ mcpServers: { [name]: { type: "http", url: "https://${HOST}/mcp" } },
606
+ });
607
+ const error = await expectCode(
608
+ plugins.push({ org: ORG, artifact: archiveOf(broken) }),
609
+ Code.InvalidArgument,
610
+ "plugin cannot be installed, 1 problem found",
611
+ );
612
+ expect(error.rawMessage).toContain("has a variable in its 'url'");
613
+ await expectCode(
614
+ pluginQuery.getByReference(
615
+ createMessage(ApiResourceReferenceSchema, {
616
+ org: ORG,
617
+ kind: ApiResourceKind.plugin,
618
+ slug: name,
619
+ }),
620
+ ),
621
+ Code.NotFound,
622
+ );
623
+ });
624
+
625
+ it("refuses an agent overlay with an unknown field, naming the document", async () => {
626
+ const name = uniqueName("overlay");
627
+ const fixture = withFile(
628
+ thermosLike(name),
629
+ "ai.stigmer/agent.yaml",
630
+ `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`,
631
+ );
632
+ await expectCode(
633
+ plugins.push({ org: ORG, artifact: archiveOf(fixture) }),
634
+ Code.InvalidArgument,
635
+ "overlay document 'ai.stigmer/agent.yaml'",
636
+ );
637
+ });
638
+
639
+ it("refuses an agent overlay that names another resource", async () => {
640
+ const name = uniqueName("overlayname");
641
+ const fixture = withFile(
642
+ thermosLike(name),
643
+ "ai.stigmer/agent.yaml",
644
+ `apiVersion: agentic.stigmer.ai/v1\nkind: Agent\nmetadata:\n name: somebody-else\nspec:\n instructions: Ten characters or more of instructions.\n`,
645
+ );
646
+ await expectCode(
647
+ plugins.push({ org: ORG, artifact: archiveOf(fixture) }),
648
+ Code.InvalidArgument,
649
+ "names 'somebody-else'",
650
+ );
651
+ });
652
+
653
+ it("refuses bytes that are not an archive", async () => {
654
+ await expectCode(
655
+ plugins.push({ org: ORG, artifact: encoder.encode("not a zip") }),
656
+ Code.InvalidArgument,
657
+ "failed to read plugin archive",
658
+ );
659
+ });
660
+
661
+ it("applies an agent overlay wholesale when it names the plugin", async () => {
662
+ const name = uniqueName("overlayok");
663
+ const fixture = withFile(
664
+ thermosLike(name),
665
+ "ai.stigmer/agent.yaml",
666
+ `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`,
667
+ );
668
+ const installed = await plugins.push({
669
+ org: ORG,
670
+ artifact: archiveOf(fixture),
671
+ });
672
+ expect(installed.status?.state).toBe(PluginState.READY);
673
+ const agent = await agentQuery.getByReference(
674
+ createMessage(ApiResourceReferenceSchema, {
675
+ org: ORG,
676
+ kind: ApiResourceKind.agent,
677
+ slug: name,
678
+ }),
679
+ );
680
+ expect(agent.spec?.instructions).toBe(
681
+ "The author's own instructions for this agent.",
682
+ );
683
+ expect(agent.metadata?.labels[PLUGIN_LABEL]).toBe(installed.metadata?.id);
684
+ });
685
+ });
686
+
687
+ /**
688
+ * The reserved-label refusal where an authorizer enforces. The open-source
689
+ * built-in authorizer allows `can_write_reserved_labels` by design, so the
690
+ * default composition above cannot show the refusal; this composition
691
+ * registers an authorizer that denies exactly that permission and allows
692
+ * everything else, the posture a hosted edition takes. An archive whose
693
+ * overlay carries a `stigmer.ai/*` label is refused before a byte is
694
+ * written, and a plain overlay under the same authorizer still installs —
695
+ * so the sanitiser asks the platform capability and nothing broader.
696
+ */
697
+ describe("Plugin push under an authorizer that enforces reserved labels", () => {
698
+ let enforcingDir: string;
699
+ let enforcing: ComposedServer;
700
+ let enforcingPlugins: Client<typeof PluginCommandController>;
701
+ let enforcingQuery: Client<typeof PluginQueryController>;
702
+ const observed: AuthzCheck[] = [];
703
+
704
+ beforeAll(async () => {
705
+ enforcingDir = mkdtempSync(path.join(tmpdir(), "plugin-domain-enforcing-"));
706
+ const grpcPort = await reserveFreePort();
707
+ const authorizer: Authorizer = {
708
+ authorize(_caller, check) {
709
+ if (check.permission === IamPermission.can_write_reserved_labels) {
710
+ observed.push(check);
711
+ return Promise.resolve({
712
+ kind: "deny",
713
+ reason: "reserved labels are the platform's",
714
+ });
715
+ }
716
+ return Promise.resolve({ kind: "allow" });
717
+ },
718
+ };
719
+ enforcing = await composeServer({
720
+ config: loadConfig({
721
+ STIGMER_MODEL_REGISTRY_REFRESH: "off",
722
+ TEMPORAL_HOST_PORT: "127.0.0.1:1",
723
+ GRPC_PORT: String(grpcPort),
724
+ DB_PATH: path.join(enforcingDir, "stigmer.db"),
725
+ ARTIFACT_LOCAL_BASE_PATH: path.join(enforcingDir, "artifacts"),
726
+ STORAGE_PATH: path.join(enforcingDir, "storage"),
727
+ }),
728
+ logger: silentLogger,
729
+ host: "127.0.0.1",
730
+ extensions: [{ name: "reserved-labels-enforced", authorizer }],
731
+ });
732
+ const port = await enforcing.start();
733
+ const transport: Transport = createGrpcTransport({
734
+ baseUrl: `http://127.0.0.1:${port}`,
735
+ });
736
+ enforcingPlugins = createClient(PluginCommandController, transport);
737
+ enforcingQuery = createClient(PluginQueryController, transport);
738
+ });
739
+
740
+ afterAll(async () => {
741
+ await enforcing.shutdown();
742
+ rmSync(enforcingDir, { recursive: true, force: true });
743
+ });
744
+
745
+ it("refuses an archive whose overlay carries a reserved label, naming the document and the key, and writes nothing", async () => {
746
+ const name = uniqueName("plg-forged");
747
+ const forged = withFile(
748
+ thermosLike(name),
749
+ "ai.stigmer/agent.yaml",
750
+ [
751
+ "apiVersion: agentic.stigmer.ai/v1",
752
+ "kind: Agent",
753
+ "metadata:",
754
+ ` name: ${name}`,
755
+ " labels:",
756
+ " stigmer.ai/plugin: plg_somebody_else",
757
+ "spec:",
758
+ " instructions: Long enough instructions for the forged agent.",
759
+ "",
760
+ ].join("\n"),
761
+ );
762
+ const error = await expectCode(
763
+ enforcingPlugins.push({ org: ORG, artifact: archiveOf(forged) }),
764
+ Code.InvalidArgument,
765
+ );
766
+ expect(error.rawMessage).toContain(
767
+ "cannot be set by a plugin (ai.stigmer/agent.yaml: stigmer.ai/plugin)",
768
+ );
769
+ expect(observed.map((c) => c.permission)).toEqual([
770
+ IamPermission.can_write_reserved_labels,
771
+ ]);
772
+ await expectCode(
773
+ enforcingQuery.getByReference(
774
+ createMessage(ApiResourceReferenceSchema, {
775
+ org: ORG,
776
+ kind: ApiResourceKind.plugin,
777
+ slug: name,
778
+ }),
779
+ ),
780
+ Code.NotFound,
781
+ );
782
+ });
783
+
784
+ it("installs a plain overlay under the same authorizer: the platform stamps its own labels through the in-process origin", async () => {
785
+ const name = uniqueName("plg-honest");
786
+ const installed = await enforcingPlugins.push({
787
+ org: ORG,
788
+ artifact: archiveOf(thermosLike(name)),
789
+ });
790
+ expect(installed.status?.state).toBe(PluginState.READY);
791
+ const { members } = await enforcingQuery.listMembers({
792
+ value: installed.metadata!.id,
793
+ });
794
+ expect(members).toHaveLength(3);
795
+ });
796
+ });