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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/README.md +3 -3
  2. package/dist/archive/content-store.d.ts +35 -0
  3. package/dist/archive/content-store.d.ts.map +1 -0
  4. package/dist/archive/content-store.js +98 -0
  5. package/dist/archive/content-store.js.map +1 -0
  6. package/dist/archive/inflate.d.ts +22 -0
  7. package/dist/archive/inflate.d.ts.map +1 -0
  8. package/dist/archive/inflate.js +75 -0
  9. package/dist/archive/inflate.js.map +1 -0
  10. package/dist/archive/limits.d.ts +33 -0
  11. package/dist/archive/limits.d.ts.map +1 -0
  12. package/dist/archive/limits.js +31 -0
  13. package/dist/archive/limits.js.map +1 -0
  14. package/dist/archive/open.d.ts +24 -0
  15. package/dist/archive/open.d.ts.map +1 -0
  16. package/dist/archive/open.js +93 -0
  17. package/dist/archive/open.js.map +1 -0
  18. package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
  19. package/dist/archive/prefilter.d.ts.map +1 -0
  20. package/dist/archive/prefilter.js.map +1 -0
  21. package/dist/archive/write.d.ts +8 -0
  22. package/dist/archive/write.d.ts.map +1 -0
  23. package/dist/archive/write.js +44 -0
  24. package/dist/archive/write.js.map +1 -0
  25. package/dist/authorization/authorizer.d.ts +98 -0
  26. package/dist/authorization/authorizer.d.ts.map +1 -0
  27. package/dist/authorization/authorizer.js +156 -0
  28. package/dist/authorization/authorizer.js.map +1 -0
  29. package/dist/authorization/derived-tuples.d.ts +42 -0
  30. package/dist/authorization/derived-tuples.d.ts.map +1 -0
  31. package/dist/authorization/derived-tuples.js +240 -0
  32. package/dist/authorization/derived-tuples.js.map +1 -0
  33. package/dist/authorization/evaluator.d.ts +66 -0
  34. package/dist/authorization/evaluator.d.ts.map +1 -0
  35. package/dist/authorization/evaluator.js +153 -0
  36. package/dist/authorization/evaluator.js.map +1 -0
  37. package/dist/authorization/facts.d.ts +29 -0
  38. package/dist/authorization/facts.d.ts.map +1 -0
  39. package/dist/authorization/facts.js +17 -0
  40. package/dist/authorization/facts.js.map +1 -0
  41. package/dist/authorization/list-read-scope.d.ts +18 -0
  42. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  43. package/dist/authorization/list-read-scope.js +155 -0
  44. package/dist/authorization/list-read-scope.js.map +1 -0
  45. package/dist/authorization/model/agent.d.ts +2 -0
  46. package/dist/authorization/model/agent.d.ts.map +1 -0
  47. package/dist/authorization/model/agent.js +42 -0
  48. package/dist/authorization/model/agent.js.map +1 -0
  49. package/dist/authorization/model/agent_channel.d.ts +2 -0
  50. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  51. package/dist/authorization/model/agent_channel.js +38 -0
  52. package/dist/authorization/model/agent_channel.js.map +1 -0
  53. package/dist/authorization/model/agent_execution.d.ts +2 -0
  54. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_execution.js +25 -0
  56. package/dist/authorization/model/agent_execution.js.map +1 -0
  57. package/dist/authorization/model/agent_instance.d.ts +2 -0
  58. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_instance.js +47 -0
  60. package/dist/authorization/model/agent_instance.js.map +1 -0
  61. package/dist/authorization/model/agent_share.d.ts +2 -0
  62. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_share.js +29 -0
  64. package/dist/authorization/model/agent_share.js.map +1 -0
  65. package/dist/authorization/model/api_key.d.ts +2 -0
  66. package/dist/authorization/model/api_key.d.ts.map +1 -0
  67. package/dist/authorization/model/api_key.js +27 -0
  68. package/dist/authorization/model/api_key.js.map +1 -0
  69. package/dist/authorization/model/artifact.d.ts +2 -0
  70. package/dist/authorization/model/artifact.d.ts.map +1 -0
  71. package/dist/authorization/model/artifact.js +27 -0
  72. package/dist/authorization/model/artifact.js.map +1 -0
  73. package/dist/authorization/model/channel_app.d.ts +2 -0
  74. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  75. package/dist/authorization/model/channel_app.js +28 -0
  76. package/dist/authorization/model/channel_app.js.map +1 -0
  77. package/dist/authorization/model/default-of.d.ts +38 -0
  78. package/dist/authorization/model/default-of.d.ts.map +1 -0
  79. package/dist/authorization/model/default-of.js +39 -0
  80. package/dist/authorization/model/default-of.js.map +1 -0
  81. package/dist/authorization/model/environment.d.ts +2 -0
  82. package/dist/authorization/model/environment.d.ts.map +1 -0
  83. package/dist/authorization/model/environment.js +33 -0
  84. package/dist/authorization/model/environment.js.map +1 -0
  85. package/dist/authorization/model/execution_context.d.ts +2 -0
  86. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  87. package/dist/authorization/model/execution_context.js +19 -0
  88. package/dist/authorization/model/execution_context.js.map +1 -0
  89. package/dist/authorization/model/iam_policy.d.ts +2 -0
  90. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  91. package/dist/authorization/model/iam_policy.js +31 -0
  92. package/dist/authorization/model/iam_policy.js.map +1 -0
  93. package/dist/authorization/model/identity_account.d.ts +2 -0
  94. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  95. package/dist/authorization/model/identity_account.js +25 -0
  96. package/dist/authorization/model/identity_account.js.map +1 -0
  97. package/dist/authorization/model/index.d.ts +36 -0
  98. package/dist/authorization/model/index.d.ts.map +1 -0
  99. package/dist/authorization/model/index.js +72 -0
  100. package/dist/authorization/model/index.js.map +1 -0
  101. package/dist/authorization/model/mcp_server.d.ts +2 -0
  102. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  103. package/dist/authorization/model/mcp_server.js +37 -0
  104. package/dist/authorization/model/mcp_server.js.map +1 -0
  105. package/dist/authorization/model/memory.d.ts +2 -0
  106. package/dist/authorization/model/memory.d.ts.map +1 -0
  107. package/dist/authorization/model/memory.js +26 -0
  108. package/dist/authorization/model/memory.js.map +1 -0
  109. package/dist/authorization/model/oauth_app.d.ts +2 -0
  110. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  111. package/dist/authorization/model/oauth_app.js +30 -0
  112. package/dist/authorization/model/oauth_app.js.map +1 -0
  113. package/dist/authorization/model/organization.d.ts +2 -0
  114. package/dist/authorization/model/organization.d.ts.map +1 -0
  115. package/dist/authorization/model/organization.js +54 -0
  116. package/dist/authorization/model/organization.js.map +1 -0
  117. package/dist/authorization/model/plugin.d.ts +2 -0
  118. package/dist/authorization/model/plugin.d.ts.map +1 -0
  119. package/dist/authorization/model/plugin.js +44 -0
  120. package/dist/authorization/model/plugin.js.map +1 -0
  121. package/dist/authorization/model/project.d.ts +2 -0
  122. package/dist/authorization/model/project.d.ts.map +1 -0
  123. package/dist/authorization/model/project.js +32 -0
  124. package/dist/authorization/model/project.js.map +1 -0
  125. package/dist/authorization/model/rewrite.d.ts +127 -0
  126. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  127. package/dist/authorization/model/rewrite.js +82 -0
  128. package/dist/authorization/model/rewrite.js.map +1 -0
  129. package/dist/authorization/model/schedule.d.ts +2 -0
  130. package/dist/authorization/model/schedule.d.ts.map +1 -0
  131. package/dist/authorization/model/schedule.js +29 -0
  132. package/dist/authorization/model/schedule.js.map +1 -0
  133. package/dist/authorization/model/session.d.ts +2 -0
  134. package/dist/authorization/model/session.d.ts.map +1 -0
  135. package/dist/authorization/model/session.js +38 -0
  136. package/dist/authorization/model/session.js.map +1 -0
  137. package/dist/authorization/model/skill.d.ts +2 -0
  138. package/dist/authorization/model/skill.d.ts.map +1 -0
  139. package/dist/authorization/model/skill.js +38 -0
  140. package/dist/authorization/model/skill.js.map +1 -0
  141. package/dist/authorization/model/workflow.d.ts +2 -0
  142. package/dist/authorization/model/workflow.d.ts.map +1 -0
  143. package/dist/authorization/model/workflow.js +38 -0
  144. package/dist/authorization/model/workflow.js.map +1 -0
  145. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  146. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow_execution.js +32 -0
  148. package/dist/authorization/model/workflow_execution.js.map +1 -0
  149. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  150. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_instance.js +92 -0
  152. package/dist/authorization/model/workflow_instance.js.map +1 -0
  153. package/dist/authorization/organization-directory.d.ts +13 -0
  154. package/dist/authorization/organization-directory.d.ts.map +1 -0
  155. package/dist/authorization/organization-directory.js +83 -0
  156. package/dist/authorization/organization-directory.js.map +1 -0
  157. package/dist/authorization/person.d.ts +42 -0
  158. package/dist/authorization/person.d.ts.map +1 -0
  159. package/dist/authorization/person.js +19 -0
  160. package/dist/authorization/person.js.map +1 -0
  161. package/dist/authorization/posture.d.ts +38 -0
  162. package/dist/authorization/posture.d.ts.map +1 -0
  163. package/dist/authorization/posture.js +7 -0
  164. package/dist/authorization/posture.js.map +1 -0
  165. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  166. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  167. package/dist/authorization/schedule-fire-caller.js +67 -0
  168. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  169. package/dist/authorization/store-test-kit.d.ts +68 -0
  170. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  171. package/dist/authorization/store-test-kit.js +311 -0
  172. package/dist/authorization/store-test-kit.js.map +1 -0
  173. package/dist/authorization/tuples.d.ts +115 -0
  174. package/dist/authorization/tuples.d.ts.map +1 -0
  175. package/dist/authorization/tuples.js +83 -0
  176. package/dist/authorization/tuples.js.map +1 -0
  177. package/dist/boot/compose.d.ts.map +1 -1
  178. package/dist/boot/compose.js +157 -32
  179. package/dist/boot/compose.js.map +1 -1
  180. package/dist/boot/inprocess.d.ts +12 -0
  181. package/dist/boot/inprocess.d.ts.map +1 -1
  182. package/dist/boot/inprocess.js +62 -20
  183. package/dist/boot/inprocess.js.map +1 -1
  184. package/dist/domain/agent/controller.d.ts.map +1 -1
  185. package/dist/domain/agent/controller.js +9 -0
  186. package/dist/domain/agent/controller.js.map +1 -1
  187. package/dist/domain/iampolicy/constants.d.ts +11 -0
  188. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  189. package/dist/domain/iampolicy/constants.js +11 -0
  190. package/dist/domain/iampolicy/constants.js.map +1 -1
  191. package/dist/domain/iampolicy/membership.d.ts +72 -1
  192. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  193. package/dist/domain/iampolicy/membership.js +141 -56
  194. package/dist/domain/iampolicy/membership.js.map +1 -1
  195. package/dist/domain/identityaccount/actor.d.ts +26 -0
  196. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  197. package/dist/domain/identityaccount/actor.js +17 -0
  198. package/dist/domain/identityaccount/actor.js.map +1 -0
  199. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  200. package/dist/domain/mcpserver/controller.js +9 -0
  201. package/dist/domain/mcpserver/controller.js.map +1 -1
  202. package/dist/domain/plugin/archive.d.ts +37 -0
  203. package/dist/domain/plugin/archive.d.ts.map +1 -0
  204. package/dist/domain/plugin/archive.js +50 -0
  205. package/dist/domain/plugin/archive.js.map +1 -0
  206. package/dist/domain/plugin/constants.d.ts +38 -0
  207. package/dist/domain/plugin/constants.d.ts.map +1 -0
  208. package/dist/domain/plugin/constants.js +46 -0
  209. package/dist/domain/plugin/constants.js.map +1 -0
  210. package/dist/domain/plugin/controller.d.ts +25 -0
  211. package/dist/domain/plugin/controller.d.ts.map +1 -0
  212. package/dist/domain/plugin/controller.js +493 -0
  213. package/dist/domain/plugin/controller.js.map +1 -0
  214. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  215. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  216. package/dist/domain/plugin/materialize/agent.js +128 -0
  217. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  218. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  219. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  220. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  221. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  222. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  223. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  224. package/dist/domain/plugin/materialize/identity.js +40 -0
  225. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  226. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  227. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  228. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  229. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  230. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  231. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  232. package/dist/domain/plugin/materialize/plan.js +77 -0
  233. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  234. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  235. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  236. package/dist/domain/plugin/materialize/ports.js +2 -0
  237. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  238. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  239. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  240. package/dist/domain/plugin/materialize/skills.js +44 -0
  241. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  242. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  243. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/workflows.js +31 -0
  245. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  246. package/dist/domain/plugin/members.d.ts +42 -0
  247. package/dist/domain/plugin/members.d.ts.map +1 -0
  248. package/dist/domain/plugin/members.js +97 -0
  249. package/dist/domain/plugin/members.js.map +1 -0
  250. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  251. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  252. package/dist/domain/plugin/overlay/documents.js +38 -0
  253. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  254. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  255. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  256. package/dist/domain/plugin/overlay/parse.js +79 -0
  257. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  258. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  259. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  260. package/dist/domain/plugin/overlay/sanitize.js +101 -0
  261. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  262. package/dist/domain/plugin/push.d.ts +133 -0
  263. package/dist/domain/plugin/push.d.ts.map +1 -0
  264. package/dist/domain/plugin/push.js +800 -0
  265. package/dist/domain/plugin/push.js.map +1 -0
  266. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  267. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  268. package/dist/domain/plugin/search-extractor.js +41 -0
  269. package/dist/domain/plugin/search-extractor.js.map +1 -0
  270. package/dist/domain/skill/constants.d.ts +6 -11
  271. package/dist/domain/skill/constants.d.ts.map +1 -1
  272. package/dist/domain/skill/constants.js +6 -11
  273. package/dist/domain/skill/constants.js.map +1 -1
  274. package/dist/domain/skill/controller.d.ts.map +1 -1
  275. package/dist/domain/skill/controller.js +33 -30
  276. package/dist/domain/skill/controller.js.map +1 -1
  277. package/dist/domain/skill/push.d.ts +9 -10
  278. package/dist/domain/skill/push.d.ts.map +1 -1
  279. package/dist/domain/skill/push.js +53 -122
  280. package/dist/domain/skill/push.js.map +1 -1
  281. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  282. package/dist/domain/skill/search-extractor.js.map +1 -1
  283. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  284. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  285. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  286. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  287. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  288. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  289. package/dist/domain/skill/storage/zip-gate.js +56 -126
  290. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  291. package/dist/domain/skill/version-resolution.d.ts +5 -5
  292. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  293. package/dist/domain/skill/version-resolution.js +34 -216
  294. package/dist/domain/skill/version-resolution.js.map +1 -1
  295. package/dist/domain/workflow/controller.d.ts.map +1 -1
  296. package/dist/domain/workflow/controller.js +30 -3
  297. package/dist/domain/workflow/controller.js.map +1 -1
  298. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  299. package/dist/extensions/authorizer.d.ts +10 -5
  300. package/dist/extensions/authorizer.d.ts.map +1 -1
  301. package/dist/extensions/drivers.d.ts +4 -1
  302. package/dist/extensions/drivers.d.ts.map +1 -1
  303. package/dist/extensions/list-read-scope.d.ts +47 -20
  304. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  305. package/dist/extensions/list-read-scope.js +20 -24
  306. package/dist/extensions/list-read-scope.js.map +1 -1
  307. package/dist/extensions/organization-directory.d.ts +13 -9
  308. package/dist/extensions/organization-directory.d.ts.map +1 -1
  309. package/dist/extensions/organization-directory.js.map +1 -1
  310. package/dist/extensions/resource-authorization.d.ts +33 -0
  311. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  312. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  313. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  314. package/dist/extensions/schedule-fire-caller.js +12 -1
  315. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  316. package/dist/index.d.ts +10 -0
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +8 -0
  319. package/dist/index.js.map +1 -1
  320. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  321. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  322. package/dist/pipeline/apiresource-labels.js +20 -0
  323. package/dist/pipeline/apiresource-labels.js.map +1 -1
  324. package/dist/pipeline/errors.d.ts.map +1 -1
  325. package/dist/pipeline/errors.js.map +1 -1
  326. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  327. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  328. package/dist/pipeline/steps/authorization-facts.js +100 -0
  329. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  330. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  331. package/dist/pipeline/steps/delete.js +1 -1
  332. package/dist/pipeline/steps/delete.js.map +1 -1
  333. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  334. package/dist/pipeline/steps/duplicate.js.map +1 -1
  335. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  336. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  337. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  338. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  339. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  340. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  341. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  342. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  343. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  344. package/dist/pipeline/steps/helpers.js.map +1 -1
  345. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  346. package/dist/pipeline/steps/index-search.js.map +1 -1
  347. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  348. package/dist/pipeline/steps/load-existing.js +1 -1
  349. package/dist/pipeline/steps/load-existing.js.map +1 -1
  350. package/dist/pipeline/steps/references.d.ts +16 -0
  351. package/dist/pipeline/steps/references.d.ts.map +1 -1
  352. package/dist/pipeline/steps/references.js +18 -0
  353. package/dist/pipeline/steps/references.js.map +1 -1
  354. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  355. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  356. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  357. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  358. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  359. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  360. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  361. package/dist/pipeline/steps/slug.js.map +1 -1
  362. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  363. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  364. package/dist/pipeline/steps/validate-visibility.js +6 -1
  365. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  366. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  367. package/dist/pipeline/steps/validation.js.map +1 -1
  368. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  369. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  370. package/dist/pipeline/steps/version-archive.js +129 -0
  371. package/dist/pipeline/steps/version-archive.js.map +1 -0
  372. package/dist/pipeline/steps/version-history.d.ts +49 -0
  373. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  374. package/dist/pipeline/steps/version-history.js +229 -0
  375. package/dist/pipeline/steps/version-history.js.map +1 -0
  376. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  377. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  378. package/dist/pipeline/steps/visibility-gates.js +7 -2
  379. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  380. package/dist/query/search/registry.d.ts.map +1 -1
  381. package/dist/query/search/registry.js +2 -0
  382. package/dist/query/search/registry.js.map +1 -1
  383. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  384. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  385. package/dist/temporal/schedule/run-starter.js +14 -1
  386. package/dist/temporal/schedule/run-starter.js.map +1 -1
  387. package/package.json +5 -4
  388. package/src/archive/__tests__/archive.test.ts +233 -0
  389. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  390. package/src/archive/content-store.ts +132 -0
  391. package/src/archive/inflate.ts +107 -0
  392. package/src/archive/limits.ts +42 -0
  393. package/src/archive/open.ts +131 -0
  394. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  395. package/src/archive/write.ts +54 -0
  396. package/src/authorization/README.md +124 -0
  397. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  398. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  399. package/src/authorization/__tests__/drivers.ts +70 -0
  400. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  401. package/src/authorization/__tests__/facts.test.ts +155 -0
  402. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  403. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  404. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  405. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  406. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  407. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  408. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  409. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  410. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  411. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  412. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  413. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  414. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  415. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  416. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  417. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  418. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  419. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  420. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  421. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  422. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  423. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  424. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  425. package/src/authorization/__tests__/person.test.ts +114 -0
  426. package/src/authorization/__tests__/posture.test.ts +25 -0
  427. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  428. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  429. package/src/authorization/__tests__/support.ts +101 -0
  430. package/src/authorization/__tests__/tuples.test.ts +62 -0
  431. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  432. package/src/authorization/authorizer.ts +208 -0
  433. package/src/authorization/derived-tuples.ts +384 -0
  434. package/src/authorization/evaluator.ts +283 -0
  435. package/src/authorization/facts.ts +47 -0
  436. package/src/authorization/list-read-scope.ts +216 -0
  437. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  438. package/src/authorization/model/agent.ts +64 -0
  439. package/src/authorization/model/agent_channel.ts +49 -0
  440. package/src/authorization/model/agent_execution.ts +33 -0
  441. package/src/authorization/model/agent_instance.ts +66 -0
  442. package/src/authorization/model/agent_share.ts +40 -0
  443. package/src/authorization/model/api_key.ts +28 -0
  444. package/src/authorization/model/artifact.ts +38 -0
  445. package/src/authorization/model/channel_app.ts +39 -0
  446. package/src/authorization/model/default-of.ts +99 -0
  447. package/src/authorization/model/environment.ts +48 -0
  448. package/src/authorization/model/execution_context.ts +20 -0
  449. package/src/authorization/model/iam_policy.ts +42 -0
  450. package/src/authorization/model/identity_account.ts +26 -0
  451. package/src/authorization/model/index.ts +108 -0
  452. package/src/authorization/model/mcp_server.ts +59 -0
  453. package/src/authorization/model/memory.ts +27 -0
  454. package/src/authorization/model/oauth_app.ts +42 -0
  455. package/src/authorization/model/organization.ts +55 -0
  456. package/src/authorization/model/plugin.ts +66 -0
  457. package/src/authorization/model/project.ts +47 -0
  458. package/src/authorization/model/rewrite.ts +213 -0
  459. package/src/authorization/model/schedule.ts +40 -0
  460. package/src/authorization/model/session.ts +50 -0
  461. package/src/authorization/model/skill.ts +60 -0
  462. package/src/authorization/model/workflow.ts +60 -0
  463. package/src/authorization/model/workflow_execution.ts +44 -0
  464. package/src/authorization/model/workflow_instance.ts +122 -0
  465. package/src/authorization/organization-directory.ts +114 -0
  466. package/src/authorization/person.ts +68 -0
  467. package/src/authorization/posture.ts +49 -0
  468. package/src/authorization/schedule-fire-caller.ts +91 -0
  469. package/src/authorization/store-test-kit.ts +454 -0
  470. package/src/authorization/tuples.ts +190 -0
  471. package/src/boot/compose.ts +175 -38
  472. package/src/boot/inprocess.ts +108 -30
  473. package/src/domain/agent/controller.ts +11 -0
  474. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  475. package/src/domain/iampolicy/constants.ts +12 -0
  476. package/src/domain/iampolicy/membership.ts +221 -66
  477. package/src/domain/identityaccount/actor.ts +44 -0
  478. package/src/domain/mcpserver/controller.ts +11 -0
  479. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  480. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  481. package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
  482. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  483. package/src/domain/plugin/archive.ts +89 -0
  484. package/src/domain/plugin/constants.ts +53 -0
  485. package/src/domain/plugin/controller.ts +913 -0
  486. package/src/domain/plugin/materialize/agent.ts +186 -0
  487. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  488. package/src/domain/plugin/materialize/identity.ts +67 -0
  489. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  490. package/src/domain/plugin/materialize/plan.ts +124 -0
  491. package/src/domain/plugin/materialize/ports.ts +53 -0
  492. package/src/domain/plugin/materialize/skills.ts +68 -0
  493. package/src/domain/plugin/materialize/workflows.ts +51 -0
  494. package/src/domain/plugin/members.ts +180 -0
  495. package/src/domain/plugin/overlay/documents.ts +78 -0
  496. package/src/domain/plugin/overlay/parse.ts +115 -0
  497. package/src/domain/plugin/overlay/sanitize.ts +149 -0
  498. package/src/domain/plugin/push.ts +1062 -0
  499. package/src/domain/plugin/search-extractor.ts +60 -0
  500. package/src/domain/skill/constants.ts +11 -14
  501. package/src/domain/skill/controller.ts +44 -36
  502. package/src/domain/skill/push.ts +61 -156
  503. package/src/domain/skill/search-extractor.ts +3 -1
  504. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  505. package/src/domain/skill/storage/zip-gate.ts +58 -154
  506. package/src/domain/skill/version-resolution.ts +67 -269
  507. package/src/domain/workflow/controller.ts +38 -4
  508. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  509. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  510. package/src/extensions/__tests__/composed-support.ts +32 -1
  511. package/src/extensions/__tests__/extension-composition.test.ts +35 -0
  512. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  513. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  514. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  515. package/src/extensions/authorizer.ts +10 -5
  516. package/src/extensions/drivers.ts +4 -1
  517. package/src/extensions/list-read-scope.ts +67 -45
  518. package/src/extensions/organization-directory.ts +13 -9
  519. package/src/extensions/resource-authorization.ts +34 -0
  520. package/src/extensions/schedule-fire-caller.ts +49 -18
  521. package/src/index.ts +51 -1
  522. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  523. package/src/pipeline/apiresource-labels.ts +31 -3
  524. package/src/pipeline/errors.ts +5 -5
  525. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  526. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
  527. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  528. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  529. package/src/pipeline/steps/authorization-facts.ts +131 -0
  530. package/src/pipeline/steps/delete.ts +11 -3
  531. package/src/pipeline/steps/duplicate.ts +8 -2
  532. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  533. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  534. package/src/pipeline/steps/helpers.ts +4 -1
  535. package/src/pipeline/steps/index-search.ts +28 -15
  536. package/src/pipeline/steps/load-existing.ts +12 -3
  537. package/src/pipeline/steps/references.ts +36 -2
  538. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  539. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  540. package/src/pipeline/steps/slug.ts +7 -2
  541. package/src/pipeline/steps/validate-visibility.ts +9 -2
  542. package/src/pipeline/steps/validation.ts +3 -1
  543. package/src/pipeline/steps/version-archive.ts +225 -0
  544. package/src/pipeline/steps/version-history.ts +362 -0
  545. package/src/pipeline/steps/visibility-gates.ts +12 -9
  546. package/src/query/README.md +1 -1
  547. package/src/query/search/__tests__/criteria.test.ts +6 -7
  548. package/src/query/search/__tests__/query-store.test.ts +9 -2
  549. package/src/query/search/__tests__/registry.test.ts +6 -4
  550. package/src/query/search/registry.ts +6 -1
  551. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  552. package/src/temporal/schedule/run-starter.ts +31 -8
  553. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  554. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  555. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -109,7 +109,10 @@ export function requireOrgForReference(
109
109
  scopeType = meta.authorization?.scopeType;
110
110
  kindName = meta.name;
111
111
  } catch (error) {
112
- throw internalError(error, "failed to resolve kind metadata for reference org check");
112
+ throw internalError(
113
+ error,
114
+ "failed to resolve kind metadata for reference org check",
115
+ );
113
116
  }
114
117
  // protobuf-es strips the shared enum prefix: proto
115
118
  // AUTHORIZATION_SCOPE_TYPE_ORGANIZATION generates as ORGANIZATION.
@@ -37,26 +37,34 @@ export function newIndexSearchStep<Desc extends DescMessage>(
37
37
  const resource = ctx.newState;
38
38
  const metadata = metadataOf(resource);
39
39
  if (metadata === undefined || metadata.id === "") {
40
- logger.warn("IndexSearch: resource has no metadata or ID, skipping indexing");
40
+ logger.warn(
41
+ "IndexSearch: resource has no metadata or ID, skipping indexing",
42
+ );
41
43
  return;
42
44
  }
43
45
 
44
46
  const entry = extractor.getSearchIndexEntry(resource);
45
47
  if (entry === undefined) {
46
- logger.warn("IndexSearch: extractor returned no entry, skipping indexing", {
47
- id: metadata.id,
48
- });
48
+ logger.warn(
49
+ "IndexSearch: extractor returned no entry, skipping indexing",
50
+ {
51
+ id: metadata.id,
52
+ },
53
+ );
49
54
  return;
50
55
  }
51
56
 
52
57
  try {
53
58
  await store.upsertSearchIndex(ctx.apiResourceKind, metadata.id, entry);
54
59
  } catch (error) {
55
- logger.warn("IndexSearch: failed to update search index (best-effort)", {
56
- id: metadata.id,
57
- kind: apiResourceKindName(ctx.apiResourceKind),
58
- error: error instanceof Error ? error.message : String(error),
59
- });
60
+ logger.warn(
61
+ "IndexSearch: failed to update search index (best-effort)",
62
+ {
63
+ id: metadata.id,
64
+ kind: apiResourceKindName(ctx.apiResourceKind),
65
+ error: error instanceof Error ? error.message : String(error),
66
+ },
67
+ );
60
68
  }
61
69
  },
62
70
  };
@@ -72,18 +80,23 @@ export function newDeleteSearchIndexStep<Desc extends DescMessage>(
72
80
  const id = ctx.get(RESOURCE_ID_KEY);
73
81
  if (typeof id !== "string" || id === "") {
74
82
  throw internalError(
75
- new Error("resource id not found in context (ExtractResourceId must run first)"),
83
+ new Error(
84
+ "resource id not found in context (ExtractResourceId must run first)",
85
+ ),
76
86
  "delete search index ordering",
77
87
  );
78
88
  }
79
89
  try {
80
90
  await store.deleteSearchIndex(ctx.apiResourceKind, id);
81
91
  } catch (error) {
82
- logger.warn("DeleteSearchIndex: failed to remove search index entry (best-effort)", {
83
- id,
84
- kind: apiResourceKindName(ctx.apiResourceKind),
85
- error: error instanceof Error ? error.message : String(error),
86
- });
92
+ logger.warn(
93
+ "DeleteSearchIndex: failed to remove search index entry (best-effort)",
94
+ {
95
+ id,
96
+ kind: apiResourceKindName(ctx.apiResourceKind),
97
+ error: error instanceof Error ? error.message : String(error),
98
+ },
99
+ );
87
100
  }
88
101
  },
89
102
  };
@@ -15,7 +15,11 @@ import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
15
15
  import { ResourceNotFoundError } from "../../store/interface.js";
16
16
  import type { Store } from "../../store/interface.js";
17
17
  import { getKindName } from "../apiresource-meta.js";
18
- import { internalError, invalidArgumentError, notFoundError } from "../errors.js";
18
+ import {
19
+ internalError,
20
+ invalidArgumentError,
21
+ notFoundError,
22
+ } from "../errors.js";
19
23
  import type { PipelineStep } from "../pipeline.js";
20
24
  import type { RequestContext } from "../request-context.js";
21
25
  import { findResourceBySlug } from "./helpers.js";
@@ -32,7 +36,10 @@ export function newLoadExistingStep<Desc extends DescMessage>(
32
36
  async execute(ctx: RequestContext<Desc>): Promise<void> {
33
37
  const metadata = metadataOf(ctx.newState);
34
38
  if (metadata === undefined) {
35
- throw internalError(new Error("resource metadata is nil"), "load existing");
39
+ throw internalError(
40
+ new Error("resource metadata is nil"),
41
+ "load existing",
42
+ );
36
43
  }
37
44
 
38
45
  let existing: MessageShape<Desc>;
@@ -64,7 +71,9 @@ export function newLoadExistingStep<Desc extends DescMessage>(
64
71
  // Populate the id so merge and persist have it.
65
72
  metadata.id = metadataOf(existing)?.id ?? "";
66
73
  } else {
67
- throw invalidArgumentError("resource id or slug is required for update");
74
+ throw invalidArgumentError(
75
+ "resource id or slug is required for update",
76
+ );
68
77
  }
69
78
 
70
79
  ctx.set(EXISTING_RESOURCE_KEY, existing);
@@ -31,13 +31,18 @@ import { messageFieldByName, metadataOf } from "./shapes.js";
31
31
  const API_RESOURCE_REFERENCE_TYPE =
32
32
  "ai.stigmer.commons.apiresource.ApiResourceReference";
33
33
 
34
- export function newNormalizeReferencesStep<Desc extends DescMessage>(): PipelineStep<Desc> {
34
+ export function newNormalizeReferencesStep<
35
+ Desc extends DescMessage,
36
+ >(): PipelineStep<Desc> {
35
37
  return {
36
38
  name: "NormalizeReferences",
37
39
  execute(ctx: RequestContext<Desc>): void {
38
40
  const metadata = metadataOf(ctx.newState);
39
41
  if (metadata === undefined) {
40
- throw internalError(new Error("resource metadata is nil"), "normalize references");
42
+ throw internalError(
43
+ new Error("resource metadata is nil"),
44
+ "normalize references",
45
+ );
41
46
  }
42
47
  // No org to resolve from — skip silently; required-org validation is
43
48
  // the validation step's responsibility, not this one's.
@@ -100,6 +105,35 @@ export function newValidateReferencesStep<Desc extends DescMessage>(
100
105
  };
101
106
  }
102
107
 
108
+ /** One reference a spec carries, as the walker reads it. */
109
+ export interface SpecReference {
110
+ readonly kind: ApiResourceKind;
111
+ readonly slug: string;
112
+ readonly org: string;
113
+ }
114
+
115
+ /**
116
+ * Every ApiResourceReference in a resource's spec — the same walk
117
+ * ValidateReferences runs, exported for the readers that ask the reverse
118
+ * question ("who references this?"): the plugin delete guard scans an
119
+ * organization's agents and workflows for references to a member it is
120
+ * about to remove.
121
+ */
122
+ export function collectSpecReferences(
123
+ schema: DescMessage,
124
+ msg: Parameters<typeof reflect>[1],
125
+ ): SpecReference[] {
126
+ const refs: SpecReference[] = [];
127
+ forEachSpecReference(schema, msg, (ref) => {
128
+ refs.push({
129
+ kind: numberField(ref, "kind") as ApiResourceKind,
130
+ slug: stringField(ref, "slug"),
131
+ org: stringField(ref, "org"),
132
+ });
133
+ });
134
+ return refs;
135
+ }
136
+
103
137
  /**
104
138
  * Walks the resource's spec and invokes fn on every ApiResourceReference
105
139
  * (singular, repeated, and map-valued message fields, recursively) —
@@ -0,0 +1,66 @@
1
+ /**
2
+ * ResolveArtifactSource — materialises the archive bytes of a push-shaped
3
+ * request from whichever source it carries: inline bytes pass through; an
4
+ * upload reference is consumed HERE, which retires the single-use
5
+ * reference whatever happens downstream. Proto validation has already
6
+ * guaranteed exactly one source. Downstream steps read the bytes from the
7
+ * context key and never touch the request's fields, so the two sources
8
+ * are indistinguishable past this point.
9
+ *
10
+ * Skills carried this step alone (the Go ResolveArtifactSource port);
11
+ * plugins are pushed the same two ways over the same upload slots (one
12
+ * upload surface, as boot/compose.ts wires it), so the step lives
13
+ * here and each kind names its lane-absent sentence and the request
14
+ * fields it reads.
15
+ *
16
+ * The unusable-reference arm is INVALID_ARGUMENT, not a server fault: an
17
+ * unknown, expired, already consumed, or minted-but-never-uploaded
18
+ * reference all mean the client must re-mint and re-upload.
19
+ */
20
+ import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
21
+
22
+ import type { UploadSlots } from "../../domain/skill/transfer/slots.js";
23
+ import { failedPreconditionError, invalidArgumentError } from "../errors.js";
24
+ import type { PipelineStep } from "../pipeline.js";
25
+ import type { RequestContext } from "../request-context.js";
26
+
27
+ /** Where the resolved bytes ride for every downstream step. */
28
+ export const ARTIFACT_BYTES_KEY = "pushArtifactBytes";
29
+
30
+ export interface ArtifactSourceBinding<Desc extends DescMessage> {
31
+ /** The request's two sources; exactly one is set by proto validation. */
32
+ source(input: MessageShape<Desc>): {
33
+ readonly artifact: Uint8Array;
34
+ readonly artifactUploadRef: string;
35
+ };
36
+ /** The FailedPrecondition copy when no lane is configured; each kind pins its own. */
37
+ readonly laneNotConfigured: string;
38
+ }
39
+
40
+ export function newResolveArtifactSourceStep<Desc extends DescMessage>(
41
+ slots: UploadSlots | undefined,
42
+ binding: ArtifactSourceBinding<Desc>,
43
+ ): PipelineStep<Desc> {
44
+ return {
45
+ name: "ResolveArtifactSource",
46
+ async execute(ctx: RequestContext<Desc>): Promise<void> {
47
+ const { artifact, artifactUploadRef } = binding.source(ctx.input);
48
+ if (artifactUploadRef === "") {
49
+ ctx.set(ARTIFACT_BYTES_KEY, artifact);
50
+ return;
51
+ }
52
+ if (slots === undefined) {
53
+ throw failedPreconditionError(binding.laneNotConfigured);
54
+ }
55
+ let data: Uint8Array;
56
+ try {
57
+ data = await slots.consume(artifactUploadRef);
58
+ } catch (error) {
59
+ throw invalidArgumentError(
60
+ `artifact_upload_ref not usable: ${error instanceof Error ? error.message : String(error)} — request a new upload URL via createArtifactUploadUrl`,
61
+ );
62
+ }
63
+ ctx.set(ARTIFACT_BYTES_KEY, data);
64
+ },
65
+ };
66
+ }
@@ -36,7 +36,8 @@ export function recordServerStampedReservedLabels<Desc extends DescMessage>(
36
36
  ...keys: ReadonlyArray<string>
37
37
  ): void {
38
38
  const existing = ctx.get(STAMPED_KEYS_CONTEXT_KEY);
39
- const stamped = existing instanceof Set ? (existing as Set<string>) : new Set<string>();
39
+ const stamped =
40
+ existing instanceof Set ? (existing as Set<string>) : new Set<string>();
40
41
  for (const key of keys) {
41
42
  stamped.add(key);
42
43
  }
@@ -14,14 +14,19 @@ import type { PipelineStep } from "../pipeline.js";
14
14
  import type { RequestContext } from "../request-context.js";
15
15
  import { metadataOf } from "./shapes.js";
16
16
 
17
- export function newResolveSlugStep<Desc extends DescMessage>(): PipelineStep<Desc> {
17
+ export function newResolveSlugStep<
18
+ Desc extends DescMessage,
19
+ >(): PipelineStep<Desc> {
18
20
  return {
19
21
  name: "ResolveSlug",
20
22
  execute(ctx: RequestContext<Desc>): void {
21
23
  const metadata = metadataOf(ctx.newState);
22
24
  if (metadata === undefined) {
23
25
  // A server-side programming error, not bad client input (Go).
24
- throw internalError(new Error("resource metadata is nil"), "slug resolution");
26
+ throw internalError(
27
+ new Error("resource metadata is nil"),
28
+ "slug resolution",
29
+ );
25
30
  }
26
31
  if (metadata.slug !== "") {
27
32
  return; // already set — idempotent
@@ -34,7 +34,9 @@ import type { PipelineStep } from "../pipeline.js";
34
34
  import type { RequestContext } from "../request-context.js";
35
35
  import { metadataOf } from "./shapes.js";
36
36
 
37
- export function newValidateVisibilityStep<Desc extends DescMessage>(): PipelineStep<Desc> {
37
+ export function newValidateVisibilityStep<
38
+ Desc extends DescMessage,
39
+ >(): PipelineStep<Desc> {
38
40
  return {
39
41
  name: "ValidateVisibility",
40
42
  execute(ctx: RequestContext<Desc>): void {
@@ -72,7 +74,12 @@ export function rejectDefaultInstanceVisibilityUpdate(): never {
72
74
  }
73
75
 
74
76
  /** Go rejectUnsupportedVisibility (the shared level check + copy). */
75
- function rejectUnsupportedVisibility(
77
+ /**
78
+ * The one sentence for a level a kind does not support. Exported for the
79
+ * push-shaped chains whose requested level rides the request rather than
80
+ * a resource's metadata (plugin push), so the copy stays in one place.
81
+ */
82
+ export function rejectUnsupportedVisibility(
76
83
  kind: ApiResourceKind,
77
84
  visibility: ApiResourceVisibility,
78
85
  ): void {
@@ -23,7 +23,9 @@ export function validator(): Validator {
23
23
  return sharedValidator;
24
24
  }
25
25
 
26
- export function newValidateProtoStep<Desc extends DescMessage>(): PipelineStep<Desc> {
26
+ export function newValidateProtoStep<
27
+ Desc extends DescMessage,
28
+ >(): PipelineStep<Desc> {
27
29
  return {
28
30
  name: "ValidateProto",
29
31
  execute(ctx: RequestContext<Desc>): void {
@@ -0,0 +1,225 @@
1
+ /**
2
+ * The write side of content-addressed versioning, shared by every kind
3
+ * whose version is the SHA-256 of a pushed archive (skills, plugins): the
4
+ * "archive the head" step a push runs after the head is fully populated,
5
+ * and the best-effort archive cleanup a delete runs before the row. Skills
6
+ * carried both alone (#341, adopted for skills in #475; the Go
7
+ * ArchiveCurrentSkillStep / DeleteSkillArchivesStep port); plugins need the
8
+ * identical semantics over another schema, so the steps live here and each
9
+ * kind names its step (`ArchiveCurrentSkill`, `ArchiveCurrentPlugin`), its
10
+ * context key and where its hash and tag live.
11
+ *
12
+ * The load-bearing semantics, all preserved from the skill port:
13
+ * - repoint-never-duplicate: re-pushing EVER-archived content repoints the
14
+ * head to the existing audit row (an A→B→A re-push must not duplicate
15
+ * A's row);
16
+ * - snapshots archive TAGLESS; the audit tag COLUMN is the tag's only
17
+ * home, assigned through the single-holder setAuditTag primitive —
18
+ * assigned even when the content was already archived, because
19
+ * re-pushing under a new tag is the only retag path;
20
+ * - safe degradation: archive failure clears the version hash from the
21
+ * head (the persisted head never references an unresolvable audit
22
+ * entry); tag-assignment failure clears the live tag.
23
+ *
24
+ * Proven by the skill domain's __tests__/push-degradation.test.ts (the
25
+ * failing-store arms) and both kinds' conformance suites (the
26
+ * content-addressed versioning blocks).
27
+ */
28
+ import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
29
+
30
+ import type { Logger } from "../../boot/logger.js";
31
+ import type { PipelineStep } from "../pipeline.js";
32
+ import type { RequestContext } from "../request-context.js";
33
+ import { AuditNotFoundError } from "../../store/interface.js";
34
+ import type { Store } from "../../store/interface.js";
35
+ import { RESOURCE_ID_KEY } from "./delete.js";
36
+ import { metadataOf } from "./shapes.js";
37
+
38
+ /** What a content-versioned kind must expose for its head to be archived. */
39
+ export interface ArchiveCurrentVersionBinding<Desc extends DescMessage> {
40
+ /** The step's name in the chain; shared vocabulary, never renamed. */
41
+ readonly stepName: string;
42
+ /** The context key the fully populated head rides. */
43
+ readonly resourceKey: string;
44
+ readonly schema: Desc;
45
+ /** The noun in log lines: "skill", "plugin". */
46
+ readonly noun: string;
47
+ headHashOf(resource: MessageShape<Desc>): string;
48
+ /** Degradation arm: the head must never reference an unresolvable audit row. */
49
+ clearHeadHash(resource: MessageShape<Desc>): void;
50
+ liveTagOf(resource: MessageShape<Desc>): string;
51
+ /** Degradation arm: the live tag must agree with the audit column. */
52
+ clearLiveTag(resource: MessageShape<Desc>): void;
53
+ }
54
+
55
+ /**
56
+ * Repoint or archive, then the single-holder tag assignment, each with its
57
+ * safe degradation. Runs AFTER the populate step so the archived snapshot
58
+ * is the fully populated head.
59
+ */
60
+ export function newArchiveCurrentVersionStep<
61
+ Desc extends DescMessage,
62
+ RequestDesc extends DescMessage,
63
+ >(
64
+ store: Store,
65
+ logger: Logger,
66
+ binding: ArchiveCurrentVersionBinding<Desc>,
67
+ ): PipelineStep<RequestDesc> {
68
+ return {
69
+ name: binding.stepName,
70
+ async execute(ctx: RequestContext<RequestDesc>): Promise<void> {
71
+ const resource = ctx.get(binding.resourceKey) as MessageShape<Desc>;
72
+ const versionHash = binding.headHashOf(resource);
73
+ if (versionHash === "") {
74
+ return;
75
+ }
76
+ const tag = binding.liveTagOf(resource);
77
+ const resourceId = metadataOf(resource)?.id ?? "";
78
+ const idField = `${binding.noun}Id`;
79
+
80
+ // Repoint, never duplicate: if this content was ever archived, the
81
+ // head simply repoints to the existing row and only the tag
82
+ // assignment below still runs. An unexpected lookup failure degrades
83
+ // to archiving anyway — a possible duplicate row beats a failed push
84
+ // (readers resolve duplicates newest-wins).
85
+ let alreadyArchived = false;
86
+ try {
87
+ await store.getAuditByHash(
88
+ ctx.apiResourceKind,
89
+ resourceId,
90
+ versionHash,
91
+ binding.schema,
92
+ );
93
+ alreadyArchived = true;
94
+ } catch (error) {
95
+ if (!(error instanceof AuditNotFoundError)) {
96
+ logger.warn(
97
+ `Could not check for an existing archived ${binding.noun} version — archiving anyway`,
98
+ {
99
+ [idField]: resourceId,
100
+ versionHash,
101
+ error: error instanceof Error ? error.message : String(error),
102
+ },
103
+ );
104
+ }
105
+ }
106
+
107
+ if (!alreadyArchived) {
108
+ // Archive the snapshot tagless: the tag lives only in the audit tag
109
+ // column (the source of truth), assigned below through the
110
+ // single-holder primitive — a later tag move never rewrites this
111
+ // immutable content.
112
+ try {
113
+ await store.saveAudit(
114
+ ctx.apiResourceKind,
115
+ resourceId,
116
+ binding.schema,
117
+ resource,
118
+ versionHash,
119
+ "",
120
+ );
121
+ } catch (error) {
122
+ logger.error(
123
+ `Failed to archive ${binding.noun} version — reverting the version hash to maintain the audit-resolvability invariant`,
124
+ {
125
+ [idField]: resourceId,
126
+ versionHash,
127
+ error: error instanceof Error ? error.message : String(error),
128
+ },
129
+ );
130
+ // Revert: the persisted head must never reference an audit entry
131
+ // that does not exist. The push still succeeds, but without
132
+ // version tracking for this apply.
133
+ binding.clearHeadHash(resource);
134
+ return;
135
+ }
136
+ }
137
+
138
+ // Assign the requested tag through setAuditTag — the single-holder
139
+ // primitive — so the head version (freshly archived or repointed-to)
140
+ // becomes the tag's sole holder; any prior holder is cleared.
141
+ if (tag !== "") {
142
+ try {
143
+ await store.setAuditTag(
144
+ ctx.apiResourceKind,
145
+ resourceId,
146
+ versionHash,
147
+ tag,
148
+ );
149
+ } catch (error) {
150
+ logger.error(
151
+ `Archived ${binding.noun} version but failed to assign its tag — clearing the live tag to stay consistent with the audit column`,
152
+ {
153
+ [idField]: resourceId,
154
+ versionHash,
155
+ tag,
156
+ error: error instanceof Error ? error.message : String(error),
157
+ },
158
+ );
159
+ // The audit head is now untagged; keep the live head consistent
160
+ // so get / getByReference never advertise a tag the store cannot
161
+ // resolve.
162
+ binding.clearLiveTag(resource);
163
+ }
164
+ }
165
+
166
+ if (alreadyArchived) {
167
+ logger.info(
168
+ `${capitalize(binding.noun)} version content already archived — repointed head without a new history row`,
169
+ { [idField]: resourceId, versionHash, tag },
170
+ );
171
+ } else {
172
+ logger.info(`Archived ${binding.noun} version to audit history`, {
173
+ [idField]: resourceId,
174
+ versionHash,
175
+ tag,
176
+ });
177
+ }
178
+ },
179
+ };
180
+ }
181
+
182
+ /**
183
+ * Best-effort audit cleanup BEFORE the resource row (no FK cascade in the
184
+ * schema, by design): failures log and never block the delete. Reads the
185
+ * id ExtractResourceId set.
186
+ */
187
+ export function newDeleteVersionArchivesStep<RequestDesc extends DescMessage>(
188
+ store: Store,
189
+ logger: Logger,
190
+ binding: { readonly stepName: string; readonly noun: string },
191
+ ): PipelineStep<RequestDesc> {
192
+ return {
193
+ name: binding.stepName,
194
+ async execute(ctx: RequestContext<RequestDesc>): Promise<void> {
195
+ const resourceId = ctx.get(RESOURCE_ID_KEY);
196
+ if (typeof resourceId !== "string") {
197
+ throw new Error(
198
+ "resource id not found in context (ExtractResourceIdStep must run first)",
199
+ );
200
+ }
201
+ const idField = `${binding.noun}Id`;
202
+ try {
203
+ const deletedCount = await store.deleteAuditByResourceId(
204
+ ctx.apiResourceKind,
205
+ resourceId,
206
+ );
207
+ if (deletedCount > 0) {
208
+ logger.info(`Deleted archive records for ${binding.noun}`, {
209
+ [idField]: resourceId,
210
+ count: deletedCount,
211
+ });
212
+ }
213
+ } catch (error) {
214
+ logger.warn(`failed to delete ${binding.noun} archives (best-effort)`, {
215
+ [idField]: resourceId,
216
+ error: error instanceof Error ? error.message : String(error),
217
+ });
218
+ }
219
+ },
220
+ };
221
+ }
222
+
223
+ function capitalize(word: string): string {
224
+ return word.charAt(0).toUpperCase() + word.slice(1);
225
+ }