@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,34 @@
1
+ /**
2
+ * The synthetic execution id of an MCP connect — the ONE home for its
3
+ * shape, built here by the connect lane and recognized here by the
4
+ * runner-credential lane, so the two can never drift apart.
5
+ *
6
+ * A connect is not an execution: it has no AgentExecution or
7
+ * WorkflowExecution row. What it has is an ephemeral ExecutionContext
8
+ * (connect.ts `createConnectExecutionContext`) whose `spec.execution_id`
9
+ * must name SOMETHING for the decrypt lane's binding check
10
+ * (executioncontext/resolve-values-for-caller.ts: the token's
11
+ * `execution_id` claim must equal the EC's), and this id is that
12
+ * something — an id that names no resource kind, so the contract's
13
+ * `kind_meta` prefix table (pipeline/apiresource-meta.ts) cannot mistake
14
+ * it for a row. The runner-credential lane reads it the other way round
15
+ * (runnerauth/bound-execution.ts `boundExecutionKindOf`): an id this
16
+ * predicate recognizes is a connect binding, resolved through the EC row
17
+ * whose `spec.execution_id` it is. Keep the builder and the predicate
18
+ * together; a second copy of the prefix anywhere would be the drift this
19
+ * module exists to prevent.
20
+ */
21
+ import { randomUUID } from "node:crypto";
22
+
23
+ /** The prefix every connect execution id carries — no resource kind's id starts with it. */
24
+ const CONNECT_EXECUTION_ID_PREFIX = "connect-";
25
+
26
+ /** One connect's execution id: the server it discovers plus eight hex of entropy per attempt. */
27
+ export function newConnectExecutionId(mcpServerId: string): string {
28
+ return `${CONNECT_EXECUTION_ID_PREFIX}${mcpServerId}-${randomUUID().slice(0, 8)}`;
29
+ }
30
+
31
+ /** Whether `executionId` is a connect's — the runner-credential lane's recognition of the third binding. */
32
+ export function isConnectExecutionId(executionId: string): boolean {
33
+ return executionId.startsWith(CONNECT_EXECUTION_ID_PREFIX);
34
+ }
@@ -17,7 +17,6 @@
17
17
  import { create } from "@bufbuild/protobuf";
18
18
  import type { MessageInitShape } from "@bufbuild/protobuf";
19
19
  import { Code, ConnectError } from "@connectrpc/connect";
20
- import { randomUUID } from "node:crypto";
21
20
 
22
21
  import type {
23
22
  EnvironmentList,
@@ -62,6 +61,7 @@ import type {
62
61
  } from "../../store/interface.js";
63
62
  import { ResourceNotFoundError } from "../../store/interface.js";
64
63
  import { resolveOAuthAppRef } from "../oauthapp/refresolution.js";
64
+ import { newConnectExecutionId } from "./connect-execution-id.js";
65
65
  import {
66
66
  persistConnectFailure,
67
67
  persistConnectResult,
@@ -169,10 +169,21 @@ export interface ConnectEnvironmentReader {
169
169
  /**
170
170
  * The ExecutionContext lifecycle surface for the ephemeral connect EC —
171
171
  * Go's downstream executioncontext client (create + delete).
172
+ *
173
+ * `create` takes the connecting caller and the composition creates the
174
+ * row AS THAT PERSON (boot/inprocess.ts, the `asCaller` lane of ruling
175
+ * R5), never under the internal class: the row's creator stamp is what
176
+ * the runner-subject verifier resolves the connect's person from when
177
+ * the runner presents the connect token under the built-in posture
178
+ * (runnerauth/bound-execution.ts, the `mcp-connect` binding). A row
179
+ * stamped `internal` would name nobody, and the credentialed connect
180
+ * would be refused at identity on every enforcing self-host. `delete`
181
+ * stays the server's own act: the row is the lane's, whoever asked.
172
182
  */
173
183
  export interface ConnectExecutionContextClient {
174
184
  create(
175
185
  executionContext: MessageInitShape<typeof ExecutionContextSchema>,
186
+ caller: CallerIdentity,
176
187
  ): Promise<ExecutionContext>;
177
188
  delete(
178
189
  input: MessageInitShape<typeof ApiResourceDeleteInputSchema>,
@@ -272,7 +283,7 @@ export async function connect(
272
283
  input,
273
284
  );
274
285
 
275
- const prepared = await prepareConnect(deps, mcpServer, input);
286
+ const prepared = await prepareConnect(deps, mcpServer, input, identity);
276
287
 
277
288
  try {
278
289
  let run: ConnectRun;
@@ -385,11 +396,28 @@ export async function connect(
385
396
  * read the caller's grant and secrets, which a background task has no
386
397
  * request context to do (the same constraint that scopes
387
398
  * startBestEffortConnect to env-less servers).
399
+ *
400
+ * A connect's discovery runs on the runner with TWO credentials, and the
401
+ * split is deliberate. The runner's own process credential reads the
402
+ * McpServer's metadata — under the built-in posture that credential is
403
+ * the operator's API key, and the operator is an organization admin
404
+ * (deploy/helm/stigmer: the signed-in operator mints the runner's key),
405
+ * whom the model makes an owner of every McpServer in the organization
406
+ * (authorization/model/mcp_server.ts), so a member's private server is
407
+ * readable. The connect token minted below reads the SECRETS: it is
408
+ * bound to this connect's ExecutionContext, and under the built-in
409
+ * posture the runner-subject verifier resolves its bearer to the person
410
+ * that row was created by — which is why the row is created as `identity`
411
+ * and not as the server. The end state where every RPC of a discovery
412
+ * acts as the person (the cloud's connect-sandbox shape) needs a row an
413
+ * env-less connect would also create; it creates none today, so that is
414
+ * a design act of its own, not a widening to make here.
388
415
  */
389
416
  export async function prepareConnect(
390
417
  deps: McpServerConnectDeps,
391
418
  mcpServer: McpServer,
392
419
  input: ConnectInput,
420
+ identity: CallerIdentity,
393
421
  ): Promise<PreparedConnect> {
394
422
  const mcpServerId = mcpServer.metadata?.id ?? "";
395
423
  const callerOrg = input.org;
@@ -402,7 +430,7 @@ export async function prepareConnect(
402
430
  await refreshOAuthTokenIfNeeded(deps, mcpServer, callerOrg);
403
431
  }
404
432
 
405
- const executionId = `connect-${mcpServerId}-${randomUUID().slice(0, 8)}`;
433
+ const executionId = newConnectExecutionId(mcpServerId);
406
434
 
407
435
  const ecResourceId = await createConnectExecutionContext(
408
436
  deps,
@@ -410,6 +438,7 @@ export async function prepareConnect(
410
438
  executionId,
411
439
  callerOrg,
412
440
  input.runtimeEnv,
441
+ identity,
413
442
  );
414
443
 
415
444
  const workflowInput: ConnectWorkflowInput = {
@@ -464,6 +493,10 @@ export async function prepareConnect(
464
493
  * sources: OAuth-managed variables from the grant's managed environment,
465
494
  * the remainder from the user's personal environment. Returns "" when the
466
495
  * MCP server has no env declarations and no runtime_env.
496
+ *
497
+ * The row is created as `caller`, the person connecting (see the
498
+ * ConnectExecutionContextClient doc): its creator stamp is the connect
499
+ * token's person under the built-in posture.
467
500
  */
468
501
  async function createConnectExecutionContext(
469
502
  deps: McpServerConnectDeps,
@@ -471,6 +504,7 @@ async function createConnectExecutionContext(
471
504
  executionId: string,
472
505
  callerOrg: string,
473
506
  runtimeEnv: { [key: string]: ExecutionValue },
507
+ caller: CallerIdentity,
474
508
  ): Promise<string> {
475
509
  let ecData: { [key: string]: ExecutionValue };
476
510
 
@@ -540,6 +574,7 @@ async function createConnectExecutionContext(
540
574
  data: ecData,
541
575
  },
542
576
  }),
577
+ caller,
543
578
  );
544
579
  } catch (error) {
545
580
  throw internalError(error, "failed to create connect ExecutionContext");
@@ -77,6 +77,7 @@ import {
77
77
  EXISTING_RESOURCE_KEY,
78
78
  newLoadExistingStep,
79
79
  } from "../../pipeline/steps/load-existing.js";
80
+ import { newGuardPluginManagedStep } from "../../pipeline/steps/guard-plugin-managed.js";
80
81
  import {
81
82
  SHOULD_CREATE_KEY,
82
83
  newLoadForApplyStep,
@@ -269,6 +270,10 @@ async function update(
269
270
  .addStep(newValidateProtoStep())
270
271
  .addStep(newResolveSlugStep())
271
272
  .addStep(newLoadExistingStep(deps.store))
273
+ // A resource a plugin materialised is the plugin's to redefine; a client
274
+ // write is refused naming the plugin (GuardPluginManaged, keyed on the
275
+ // STORED labels and the plugin row's existence).
276
+ .addStep(newGuardPluginManagedStep(deps.store))
272
277
  .addStep(newBuildUpdateStateStep())
273
278
  .addStep(newGuardReservedLabelsStep(deps.authorizer))
274
279
  .addStep(newValidateDefaultEnabledToolsStep())
@@ -374,6 +379,7 @@ async function deleteMcpServer(
374
379
  )
375
380
  .addStep(newValidateProtoStep())
376
381
  .addStep(newLoadExistingForDeleteStep(deps.store, McpServerSchema))
382
+ .addStep(newGuardPluginManagedStep(deps.store))
377
383
  .addStep(newDeleteResourceStep(deps.store))
378
384
  .addStep(
379
385
  newCleanupIamPoliciesStep(deps.authorizationLifecycle, deps.logger),
@@ -426,6 +432,11 @@ async function updateVisibility(
426
432
  )
427
433
  .addStep(newValidateProtoStep())
428
434
  .addStep(newLoadMcpServerForVisibilityUpdateStep(deps.store))
435
+ .addStep(
436
+ newGuardPluginManagedStep(deps.store, {
437
+ existingKey: UPDATE_VISIBILITY_MCP_SERVER_KEY,
438
+ }),
439
+ )
429
440
  .addStep(
430
441
  newRecordVisibilityBeforeUpdateStep(UPDATE_VISIBILITY_MCP_SERVER_KEY),
431
442
  )
@@ -26,9 +26,15 @@
26
26
  * read RPC redacts secrets unless the caller presents an execution-scoped
27
27
  * runner token, and the discovery activity has no execution of its own to
28
28
  * exchange for one — the capability travels with the work item. It is a
29
- * decrypt-lane discriminator, not a secret value: short-TTL, bound to
30
- * this connect flow's ephemeral EC (deleted when the handler returns),
31
- * and useless once either expires.
29
+ * short-TTL token bound to this connect flow's ephemeral EC (deleted when
30
+ * the connect settles, on the blocking lane and the async one alike) and
31
+ * useless once either expires. What it unlocks depends on the posture:
32
+ * under trusted-local it is a decrypt-lane discriminator and nothing more;
33
+ * under the built-in authorization posture the same token also admits its
34
+ * bearer AS THE PERSON who asked for the connect, on every RPC, for as
35
+ * long as the EC row exists (runnerauth/runnerauth.ts, the two lanes by
36
+ * posture; runnerauth/bound-execution.ts, the `mcp-connect` binding). It
37
+ * sits in Temporal history in the clear like every server-written input.
32
38
  */
33
39
  export interface ConnectWorkflowInput {
34
40
  readonly mcp_server_id: string;
@@ -118,7 +118,7 @@ export async function startConnect(
118
118
  }
119
119
  }
120
120
 
121
- const prepared = await prepareConnect(deps, mcpServer, input);
121
+ const prepared = await prepareConnect(deps, mcpServer, input, identity);
122
122
 
123
123
  // Taken before the start so the advisory describes the queue the run is
124
124
  // about to join. Warn-only by design: a worker may be booting (the
@@ -10,21 +10,34 @@
10
10
  * composed-server pattern).
11
11
  *
12
12
  * getRunnerScopedToken is the mint side of the runner-token lane
13
- * (oss#535) — the seam src/runnerauth/ reserved for this sub-project. OSS
14
- * has no caller identity, so unlike the cloud exchange there is no
15
- * credential to verify: any caller naming an execution receives a token
16
- * for it. On a single-user server the token is the LANE DISCRIMINATOR that
17
- * lets the EC read RPCs redact by default without breaking the runner, not
18
- * a trust boundary (DD-004).
13
+ * (oss#535) — the seam src/runnerauth/. What the token IS depends on the
14
+ * server's posture, and so does who may obtain one:
15
+ *
16
+ * - Under trusted-local (the laptop: one caller, nothing to separate)
17
+ * the arms below mint a clocked token for any caller naming an
18
+ * execution. The token is the LANE DISCRIMINATOR that lets the
19
+ * ExecutionContext read RPCs redact by default without breaking the
20
+ * runner, not a trust boundary — there is no identity for it to
21
+ * change.
22
+ * - Under the built-in authorization posture the same token is an
23
+ * IDENTITY: the runner-subject verifier admits its bearer as the
24
+ * human whose run it is (runnerauth/runner-subject-verifier.ts). A
25
+ * mint for anyone would be impersonation, so the built-in provider
26
+ * defines exchangeScopedToken and this controller delegates to it:
27
+ * the run credential is minted for the run's own person and nobody
28
+ * else (runnerauth/built-in-runner-credential-provider.ts). Runs get
29
+ * their credential from the dispatch itself (the engine clients put
30
+ * it on the workflow input); this exchange is the runner's fallback.
19
31
  *
20
32
  * The C4 capability delegation (20260827.09, gate ruling Q1): when the
21
33
  * composed provider defines exchangeScopedToken / bootstrapCredentials,
22
34
  * this controller delegates the exchange arms and the bootstrap
23
- * credential fields to it wholesale — the cloud's per-arm caller-class
24
- * gating, row authorization, and multi-lane minting are POLICY, not
25
- * contract, and live behind the seam. With neither defined (the OSS
26
- * default), every arm below behaves exactly as before; the conformance
27
- * suites pin that byte-identity.
35
+ * credential fields to it wholesale — per-arm caller gating, row
36
+ * authorization, and multi-lane minting are POLICY, not contract, and
37
+ * live behind the seam (the cloud's four-arm exchange; open source's
38
+ * built-in gate). With neither defined (the trusted-local default), every
39
+ * arm below behaves exactly as before; the conformance suites pin that
40
+ * byte-identity.
28
41
  */
29
42
  import type { ConnectRouter, HandlerContext } from "@connectrpc/connect";
30
43
  import { create } from "@bufbuild/protobuf";
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Pins the pure half of a push — what the plan says a package becomes,
3
+ * before any write: the composed agent's instructions (the versioned
4
+ * template, snapshot-pinned), a sub-agent's mcp_access naming server
5
+ * SLUGS while `model_override` stays empty and the hint becomes a warning,
6
+ * a built-in name becoming a warning, an MCP-only package planning no
7
+ * agent, the `mcpServers` key-to-slug rule, a skill archive rooted at its
8
+ * SKILL.md with the plugin's labels on the request, a version the tag
9
+ * pattern rejects becoming a warning, an overlay that redefines the
10
+ * transport refused, and the convergence and drop rules over members.
11
+ */
12
+ import { describe, expect, it } from "vitest";
13
+
14
+ import {
15
+ inMemoryPluginFiles,
16
+ readPluginPackage,
17
+ } from "@stigmer/plugin-package";
18
+ import type { PluginPackage } from "@stigmer/plugin-package";
19
+ import { cursorPlugin, openPlugin } from "@stigmer/plugin-package/testing";
20
+ import type { PluginFixture } from "@stigmer/plugin-package/testing";
21
+ import { create } from "@bufbuild/protobuf";
22
+ import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
23
+ import {
24
+ McpServerSpecSchema,
25
+ StdioServerConfigSchema,
26
+ } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/spec_pb";
27
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
28
+ import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
29
+
30
+ import { inflateEntry } from "../../../archive/inflate.js";
31
+ import { openArchive } from "../../../archive/open.js";
32
+ import {
33
+ PLUGIN_LABEL,
34
+ PLUGIN_VERSION_LABEL,
35
+ } from "../../../pipeline/apiresource-labels.js";
36
+ import {
37
+ DEFAULT_AGENT_INSTRUCTIONS_VERSION,
38
+ renderDefaultAgentInstructions,
39
+ } from "../materialize/default-agent-instructions.js";
40
+ import type { PluginIdentity } from "../materialize/identity.js";
41
+ import { McpServerOverlayError } from "../materialize/mcp-servers.js";
42
+ import { planMaterialization } from "../materialize/plan.js";
43
+ import { droppedMembers, membersConverge } from "../members.js";
44
+ import type { Member } from "../members.js";
45
+
46
+ const IDENTITY: PluginIdentity = {
47
+ org: "acme",
48
+ id: "plg_1",
49
+ slug: "thermos",
50
+ name: "thermos",
51
+ digest: "d".repeat(64),
52
+ visibility: ApiResourceVisibility.visibility_org,
53
+ };
54
+
55
+ function read(fixture: PluginFixture): PluginPackage {
56
+ const outcome = readPluginPackage(inMemoryPluginFiles(fixture));
57
+ if (!outcome.ok) {
58
+ throw new Error(outcome.errors.map((e) => e.message).join("\n"));
59
+ }
60
+ return outcome.plugin;
61
+ }
62
+
63
+ const thermos = cursorPlugin({
64
+ name: "thermos",
65
+ version: "1.2.0",
66
+ description: "Code review with a thermonuclear standard",
67
+ skills: [
68
+ {
69
+ name: "thermo-review",
70
+ description: "Review code thoroughly",
71
+ body: "# Review",
72
+ files: { "references/checklist.md": "- read it all" },
73
+ },
74
+ ],
75
+ agents: [
76
+ {
77
+ file: "reviewer",
78
+ frontmatter: {
79
+ name: "reviewer",
80
+ description: "Reviews",
81
+ model: "sonnet",
82
+ },
83
+ body: "You review pull requests with care.",
84
+ },
85
+ {
86
+ file: "explore",
87
+ frontmatter: { name: "explore", description: "Shadows a built-in" },
88
+ body: "You explore the repository far and wide.",
89
+ },
90
+ ],
91
+ mcpServers: {
92
+ my_github: {
93
+ type: "http",
94
+ url: "https://api.githubcopilot.com/mcp/",
95
+ headers: { Authorization: "Bearer ${GITHUB_TOKEN}" },
96
+ },
97
+ },
98
+ variables: { GITHUB_TOKEN: { type: "string", title: "Token" } },
99
+ required: ["GITHUB_TOKEN"],
100
+ });
101
+
102
+ describe("renderDefaultAgentInstructions", () => {
103
+ it("renders the versioned template for the package", () => {
104
+ expect(DEFAULT_AGENT_INSTRUCTIONS_VERSION).toBe(1);
105
+ expect(renderDefaultAgentInstructions(read(thermos))).toBe(
106
+ [
107
+ "You are thermos: Code review with a thermonuclear standard",
108
+ "",
109
+ "Your skills:",
110
+ "- thermo-review: Review code thoroughly",
111
+ "",
112
+ "Your tools come from these MCP servers:",
113
+ "- my_github",
114
+ "",
115
+ "Before acting on a task a skill covers, read that skill and follow it. " +
116
+ "Use the tools your servers provide rather than guessing at their results. " +
117
+ "When you finish, state what you did and what you could not do.",
118
+ ].join("\n"),
119
+ );
120
+ });
121
+ });
122
+
123
+ describe("planMaterialization", () => {
124
+ const pkg = read(thermos);
125
+ const plan = planMaterialization(
126
+ pkg,
127
+ inMemoryPluginFiles(thermos),
128
+ { workflows: [], mcpServers: [] },
129
+ IDENTITY,
130
+ "first",
131
+ );
132
+
133
+ it("plans one skill, one server and one agent, in materialisation order", () => {
134
+ expect(
135
+ plan.members.map((m) => `${ApiResourceKind[m.kind]}:${m.slug}`),
136
+ ).toEqual(["skill:thermo-review", "mcp_server:mygithub", "agent:thermos"]);
137
+ expect(plan.tag).toBe("1.2.0");
138
+ });
139
+
140
+ it("writes the skill's archive rooted at SKILL.md and stamps the plugin's labels on the request", () => {
141
+ const skill = plan.skills[0]!;
142
+ expect(skill.request.labels).toEqual({
143
+ [PLUGIN_LABEL]: "plg_1",
144
+ [PLUGIN_VERSION_LABEL]: "d".repeat(64),
145
+ });
146
+ expect(skill.request.tag).toBe("1.2.0");
147
+ expect(skill.request.message).toBe("first");
148
+ const { entries } = openArchive(skill.request.artifact);
149
+ expect(entries.map((e) => e.name)).toEqual([
150
+ "SKILL.md",
151
+ "references/checklist.md",
152
+ ]);
153
+ expect(
154
+ new TextDecoder().decode(inflateEntry(entries[0]!.entry, 1 << 20)),
155
+ ).toContain("name: thermo-review");
156
+ });
157
+
158
+ it("names servers by slug everywhere a sub-agent or usage refers to them", () => {
159
+ expect(plan.mcpServers[0]).toMatchObject({
160
+ name: "my_github",
161
+ slug: "mygithub",
162
+ });
163
+ expect(
164
+ plan.mcpServers[0]!.resource.spec?.env["GITHUB_TOKEN"],
165
+ ).toMatchObject({ isSecret: true, optional: false });
166
+ const agent = plan.agent!.resource;
167
+ expect(
168
+ agent.spec?.mcpServerUsages.map((u) => u.mcpServerRef?.slug),
169
+ ).toEqual(["mygithub"]);
170
+ expect(
171
+ agent.spec?.subAgents.map((s) => s.mcpAccess.map((a) => a.mcpServer)),
172
+ ).toEqual([["mygithub"], ["mygithub"]]);
173
+ });
174
+
175
+ it("records a model hint and a built-in name as warnings and never sets model_override", () => {
176
+ expect(
177
+ plan.agent!.resource.spec?.subAgents.map((s) => s.modelOverride),
178
+ ).toEqual(["", ""]);
179
+ expect(plan.warnings.map((w) => `${w.kind}:${w.path}`)).toEqual(
180
+ expect.arrayContaining([
181
+ "model-hint-unresolved:agents/reviewer.md",
182
+ "sub-agent-name-builtin:agents/explore.md",
183
+ ]),
184
+ );
185
+ });
186
+
187
+ it("plans no agent for an MCP-only package", () => {
188
+ const mcpOnly = openPlugin({
189
+ name: "github",
190
+ mcpServers: {
191
+ github: { type: "streamable-http", url: "https://example.com/mcp" },
192
+ },
193
+ });
194
+ const onlyPlan = planMaterialization(
195
+ read(mcpOnly),
196
+ inMemoryPluginFiles(mcpOnly),
197
+ { workflows: [], mcpServers: [] },
198
+ IDENTITY,
199
+ "",
200
+ );
201
+ expect(onlyPlan.agent).toBeUndefined();
202
+ expect(onlyPlan.members.map((m) => ApiResourceKind[m.kind])).toEqual([
203
+ "mcp_server",
204
+ ]);
205
+ });
206
+
207
+ it("warns and leaves the tag empty when the manifest version does not fit the tag pattern", () => {
208
+ const built = cursorPlugin({
209
+ name: "b",
210
+ version: "1.0.0+build.7",
211
+ skills: [{ name: "s" }],
212
+ });
213
+ const builtPlan = planMaterialization(
214
+ read(built),
215
+ inMemoryPluginFiles(built),
216
+ { workflows: [], mcpServers: [] },
217
+ IDENTITY,
218
+ "",
219
+ );
220
+ expect(builtPlan.tag).toBe("");
221
+ expect(builtPlan.warnings.map((w) => w.kind)).toContain(
222
+ "version-not-taggable",
223
+ );
224
+ expect(builtPlan.skills[0]!.request.tag).toBe("");
225
+ });
226
+
227
+ it("refuses a server overlay that redefines the transport", () => {
228
+ const overlay = create(McpServerSchema, {
229
+ spec: create(McpServerSpecSchema, {
230
+ serverType: {
231
+ case: "stdio",
232
+ value: create(StdioServerConfigSchema, { command: "npx" }),
233
+ },
234
+ }),
235
+ });
236
+ expect(() =>
237
+ planMaterialization(
238
+ pkg,
239
+ inMemoryPluginFiles(thermos),
240
+ {
241
+ workflows: [],
242
+ mcpServers: [
243
+ {
244
+ path: "ai.stigmer/mcp-servers/my_github.yaml",
245
+ server: "my_github",
246
+ resource: overlay,
247
+ },
248
+ ],
249
+ },
250
+ IDENTITY,
251
+ "",
252
+ ),
253
+ ).toThrow(McpServerOverlayError);
254
+ });
255
+ });
256
+
257
+ describe("members: convergence and drops", () => {
258
+ const digest = "d".repeat(64);
259
+ const stored: Member[] = [
260
+ {
261
+ kind: ApiResourceKind.skill,
262
+ id: "skl_1",
263
+ slug: "thermo-review",
264
+ name: "thermo-review",
265
+ version: digest,
266
+ },
267
+ {
268
+ kind: ApiResourceKind.agent,
269
+ id: "agt_1",
270
+ slug: "thermos",
271
+ name: "thermos",
272
+ version: digest,
273
+ },
274
+ ];
275
+ const planned = [
276
+ {
277
+ kind: ApiResourceKind.skill,
278
+ slug: "thermo-review",
279
+ name: "thermo-review",
280
+ },
281
+ { kind: ApiResourceKind.agent, slug: "thermos", name: "thermos" },
282
+ ];
283
+
284
+ it("converges only when every planned member is present and stamped with the digest", () => {
285
+ expect(membersConverge(stored, planned, digest)).toBe(true);
286
+ expect(membersConverge(stored, planned, "e".repeat(64))).toBe(false);
287
+ expect(membersConverge(stored.slice(1), planned, digest)).toBe(false);
288
+ expect(
289
+ membersConverge(
290
+ [...stored, { ...stored[0]!, slug: "extra", id: "skl_2" }],
291
+ planned,
292
+ digest,
293
+ ),
294
+ ).toBe(false);
295
+ });
296
+
297
+ it("drops the members the plan no longer names", () => {
298
+ expect(droppedMembers(stored, planned.slice(1)).map((m) => m.slug)).toEqual(
299
+ ["thermo-review"],
300
+ );
301
+ expect(droppedMembers(stored, planned)).toEqual([]);
302
+ });
303
+ });
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Pins the overlay parser as the server twin of the SDK's strict manifest
3
+ * parse: a document the CLI accepts parses (camelCase and proto field
4
+ * names both), an unknown field refuses naming the path, a wrong `kind`
5
+ * refuses, a missing `kind` refuses, an empty or non-mapping document
6
+ * refuses, a foreign `metadata.org` refuses while an empty or matching
7
+ * one passes, and malformed YAML refuses with the parser's message.
8
+ */
9
+ import { describe, expect, it } from "vitest";
10
+
11
+ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
12
+
13
+ import { OverlayParseError, parseOverlayDocument } from "../overlay/parse.js";
14
+
15
+ const encoder = new TextEncoder();
16
+ const AGENT = { schema: AgentSchema, yamlKind: "Agent", org: "acme" };
17
+
18
+ function parse(text: string) {
19
+ return parseOverlayDocument(
20
+ "ai.stigmer/agent.yaml",
21
+ encoder.encode(text),
22
+ AGENT,
23
+ );
24
+ }
25
+
26
+ function refusal(text: string): string {
27
+ try {
28
+ parse(text);
29
+ } catch (error) {
30
+ expect(error).toBeInstanceOf(OverlayParseError);
31
+ return (error as OverlayParseError).message;
32
+ }
33
+ throw new Error("expected a refusal");
34
+ }
35
+
36
+ describe("parseOverlayDocument", () => {
37
+ it("parses a document the CLI accepts, in either field casing", () => {
38
+ const agent = parse(
39
+ "apiVersion: agentic.stigmer.ai/v1\nkind: Agent\nmetadata:\n name: thermos\nspec:\n instructions: Long enough instructions here.\n skill_refs:\n - slug: a\n skillRefs:\n - slug: b\n",
40
+ );
41
+ expect(agent.metadata?.name).toBe("thermos");
42
+ expect(agent.spec?.skillRefs.map((r) => r.slug)).toContain("b");
43
+ });
44
+
45
+ it("refuses an unknown field, naming the document", () => {
46
+ expect(
47
+ refusal("kind: Agent\nmetadata:\n name: t\nspec:\n colour: blue\n"),
48
+ ).toContain("overlay document 'ai.stigmer/agent.yaml': invalid Agent:");
49
+ });
50
+
51
+ it("refuses a kind other than the one its location holds", () => {
52
+ expect(refusal("kind: Workflow\nmetadata:\n name: t\n")).toBe(
53
+ "overlay document 'ai.stigmer/agent.yaml': kind 'Workflow' is not the Agent this location holds",
54
+ );
55
+ });
56
+
57
+ it("refuses a missing kind", () => {
58
+ expect(refusal("metadata:\n name: t\n")).toContain(
59
+ "missing the required 'kind' field (expected kind: Agent)",
60
+ );
61
+ });
62
+
63
+ it("refuses an empty or non-mapping document", () => {
64
+ expect(refusal(" \n")).toContain("the document is empty");
65
+ expect(refusal("- a\n- b\n")).toContain("expected a mapping document");
66
+ });
67
+
68
+ it("refuses a foreign org and accepts an empty or matching one", () => {
69
+ expect(
70
+ refusal("kind: Agent\nmetadata:\n name: t\n org: other\n"),
71
+ ).toContain(
72
+ "metadata.org 'other' is not the organization the plugin is installed into ('acme')",
73
+ );
74
+ expect(
75
+ parse("kind: Agent\nmetadata:\n name: t\n org: acme\n").metadata?.org,
76
+ ).toBe("acme");
77
+ expect(parse("kind: Agent\nmetadata:\n name: t\n").metadata?.org).toBe("");
78
+ });
79
+
80
+ it("refuses malformed YAML with the parser's message", () => {
81
+ expect(refusal("kind: Agent\nmetadata: [unclosed\n")).toContain(
82
+ "invalid YAML:",
83
+ );
84
+ });
85
+ });