@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,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
+ }
@@ -0,0 +1,362 @@
1
+ /**
2
+ * The read side of content-addressed versioning, shared by every kind whose
3
+ * version is the SHA-256 of a pushed archive (skills, plugins): the
4
+ * getByReference version ladder and the paginated version history. Skills
5
+ * carried both alone (the Go LoadSkillByReferenceStep / ListVersions port);
6
+ * plugins need the identical ladder over another schema, and a second copy
7
+ * would be the drift the house forbids, so the steps take a
8
+ * `VersionedResourceBinding` that names what differs per kind (the schema,
9
+ * the noun in sentences, where the head hash and the live tag live, how a
10
+ * snapshot maps to an entry) and keep everything else once.
11
+ *
12
+ * The ladder: resolve the live head by slug+org; empty/"latest" returns it;
13
+ * a 64-hex version matches the head's hash or falls to the indexed
14
+ * audit-by-hash lookup; anything else is a tag, matching the head's live
15
+ * tag first (honest under the single-holder model: a push reconciles the
16
+ * live tag with the audit tag column, clearing the live tag when
17
+ * assignment fails) and then the indexed audit-by-tag lookup.
18
+ *
19
+ * listVersions marks is_current by HEAD-HASH match, not recency: under
20
+ * repoint semantics (#475) re-pushing archived content re-activates its
21
+ * existing row, so the current version need not be the newest-archived
22
+ * one. Tags come from the audit COLUMN (the single-holder source of
23
+ * truth), never from the snapshot.
24
+ *
25
+ * Proven by the skill domain's __tests__/skill.test.ts (ladder and
26
+ * pagination blocks) and the skill and plugin conformance suites'
27
+ * getByReference/listVersions blocks.
28
+ */
29
+ import { fromBinary } from "@bufbuild/protobuf";
30
+ import type { DescMessage, Message, MessageShape } from "@bufbuild/protobuf";
31
+
32
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
33
+ import type { ApiResourceReferenceSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
34
+
35
+ import {
36
+ internalError,
37
+ invalidArgumentError,
38
+ notFoundError,
39
+ } from "../errors.js";
40
+ import type { PipelineStep } from "../pipeline.js";
41
+ import type { RequestContext } from "../request-context.js";
42
+ import { AuditNotFoundError } from "../../store/interface.js";
43
+ import type { Store } from "../../store/interface.js";
44
+ import { findResourceBySlug, requireOrgForReference } from "./helpers.js";
45
+ import { TARGET_RESOURCE_KEY } from "./load-target.js";
46
+ import { metadataOf } from "./shapes.js";
47
+
48
+ /** A 64-character lowercase-hex string (a SHA-256 content hash). */
49
+ const HASH_PATTERN = /^[a-f0-9]{64}$/;
50
+
51
+ export function isVersionHash(version: string): boolean {
52
+ return HASH_PATTERN.test(version);
53
+ }
54
+
55
+ /** What a content-versioned kind must say about itself for the ladder. */
56
+ export interface VersionedResourceBinding<Desc extends DescMessage> {
57
+ readonly kind: ApiResourceKind;
58
+ readonly schema: Desc;
59
+ /** The noun in sentences: "skill", "plugin". */
60
+ readonly noun: string;
61
+ /** The head's content hash (status.version_hash, status.digest). */
62
+ headHashOf(resource: MessageShape<Desc>): string;
63
+ /** The tag the live head claims (spec.tag; the plugin's manifest version). */
64
+ liveTagOf(resource: MessageShape<Desc>): string;
65
+ }
66
+
67
+ type GetByReferenceDesc = typeof ApiResourceReferenceSchema;
68
+
69
+ /** The reference + version ladder (Go LoadSkillByReferenceStep, generalised). */
70
+ export function newLoadByReferenceWithVersionStep<Desc extends DescMessage>(
71
+ store: Store,
72
+ binding: VersionedResourceBinding<Desc>,
73
+ stepName: string,
74
+ ): PipelineStep<GetByReferenceDesc> {
75
+ return {
76
+ name: stepName,
77
+ async execute(ctx: RequestContext<GetByReferenceDesc>): Promise<void> {
78
+ const ref = ctx.input;
79
+
80
+ if (ref.slug === "") {
81
+ throw invalidArgumentError("slug is required in reference");
82
+ }
83
+
84
+ // Org-scoped kinds: the slug is unique only within an org, so an
85
+ // empty-org reference is under-specified.
86
+ requireOrgForReference(ctx.apiResourceKind, ref.org);
87
+
88
+ if (
89
+ ref.kind !== ApiResourceKind.api_resource_kind_unknown &&
90
+ ref.kind !== binding.kind
91
+ ) {
92
+ throw invalidArgumentError(
93
+ `kind mismatch: expected ${ApiResourceKind[binding.kind]}, got ${ApiResourceKind[ref.kind]}`,
94
+ );
95
+ }
96
+
97
+ let head: MessageShape<Desc> | undefined;
98
+ try {
99
+ head = await findResourceBySlug(
100
+ store,
101
+ ctx.apiResourceKind,
102
+ binding.schema,
103
+ ref.slug,
104
+ ref.org,
105
+ );
106
+ } catch (error) {
107
+ throw internalError(error, `failed to list ${binding.noun}s`);
108
+ }
109
+ if (head === undefined) {
110
+ throw notFoundError(binding.noun, ref.slug);
111
+ }
112
+
113
+ const version = ref.version.trim();
114
+ if (version === "" || version === "latest") {
115
+ ctx.set(TARGET_RESOURCE_KEY, head);
116
+ return;
117
+ }
118
+
119
+ if (headMatchesVersion(binding, head, version)) {
120
+ ctx.set(TARGET_RESOURCE_KEY, head);
121
+ return;
122
+ }
123
+
124
+ const archived = await findAuditByVersion(
125
+ store,
126
+ ctx.apiResourceKind,
127
+ binding.schema,
128
+ idOf(head),
129
+ version,
130
+ );
131
+ if (archived === undefined) {
132
+ throw notFoundError(
133
+ `${binding.noun} version`,
134
+ `${ref.slug}:${version}`,
135
+ );
136
+ }
137
+ ctx.set(TARGET_RESOURCE_KEY, archived);
138
+ },
139
+ };
140
+ }
141
+
142
+ /** Whether the live head IS the requested version — by hash, or by its live tag. */
143
+ function headMatchesVersion<Desc extends DescMessage>(
144
+ binding: VersionedResourceBinding<Desc>,
145
+ head: MessageShape<Desc>,
146
+ version: string,
147
+ ): boolean {
148
+ if (isVersionHash(version)) {
149
+ return binding.headHashOf(head) === version;
150
+ }
151
+ const liveTag = binding.liveTagOf(head);
152
+ return liveTag !== "" && liveTag === version;
153
+ }
154
+
155
+ /**
156
+ * Indexed audit lookup by hash or tag — not-found is a normal outcome
157
+ * (undefined), storage failures are Internal.
158
+ */
159
+ async function findAuditByVersion<Desc extends DescMessage>(
160
+ store: Store,
161
+ kind: ApiResourceKind,
162
+ schema: Desc,
163
+ resourceId: string,
164
+ version: string,
165
+ ): Promise<MessageShape<Desc> | undefined> {
166
+ if (isVersionHash(version)) {
167
+ try {
168
+ return await store.getAuditByHash(kind, resourceId, version, schema);
169
+ } catch (error) {
170
+ if (error instanceof AuditNotFoundError) {
171
+ return undefined;
172
+ }
173
+ throw internalError(error, "failed to query audit by hash");
174
+ }
175
+ }
176
+ try {
177
+ return await store.getAuditByTag(kind, resourceId, version, schema);
178
+ } catch (error) {
179
+ if (error instanceof AuditNotFoundError) {
180
+ return undefined;
181
+ }
182
+ throw internalError(error, "failed to query audit by tag");
183
+ }
184
+ }
185
+
186
+ // ─── listVersions ────────────────────────────────────────────────────────
187
+
188
+ const DEFAULT_PAGE_SIZE = 50;
189
+ const MAX_PAGE_SIZE = 100;
190
+
191
+ export const LIST_VERSIONS_RESOURCE_ID_KEY = "listVersionsResourceId";
192
+ export const LIST_VERSIONS_HEAD_HASH_KEY = "listVersionsHeadHash";
193
+ export const LIST_VERSIONS_RESPONSE_KEY = "listVersionsResponse";
194
+
195
+ /** The fields every ListVersions input carries; the binding reads them off its own message. */
196
+ export interface ListVersionsInputShape {
197
+ readonly org: string;
198
+ readonly slug: string;
199
+ readonly pageToken: string;
200
+ readonly pageSize: number;
201
+ }
202
+
203
+ /** What differs per kind in the version history: the input, the entry, the response. */
204
+ export interface VersionHistoryBinding<
205
+ Desc extends DescMessage,
206
+ InputDesc extends DescMessage,
207
+ Entry extends Message,
208
+ Response extends Message,
209
+ > extends VersionedResourceBinding<Desc> {
210
+ input(message: MessageShape<InputDesc>): ListVersionsInputShape;
211
+ /** An archived snapshot to one entry; `tag` is the audit column's. */
212
+ mapEntry(
213
+ snapshot: MessageShape<Desc>,
214
+ isCurrent: boolean,
215
+ tag: string,
216
+ ): Entry;
217
+ response(
218
+ entries: Entry[],
219
+ nextPageToken: string,
220
+ totalCount: number,
221
+ ): Response;
222
+ }
223
+
224
+ /** Resolves the head by slug and captures its id and hash (Go ResolveSkillBySlugStep, generalised). */
225
+ export function newResolveBySlugForVersionsStep<
226
+ Desc extends DescMessage,
227
+ InputDesc extends DescMessage,
228
+ Entry extends Message,
229
+ Response extends Message,
230
+ >(
231
+ store: Store,
232
+ binding: VersionHistoryBinding<Desc, InputDesc, Entry, Response>,
233
+ stepName: string,
234
+ ): PipelineStep<InputDesc> {
235
+ return {
236
+ name: stepName,
237
+ async execute(ctx: RequestContext<InputDesc>): Promise<void> {
238
+ const req = binding.input(ctx.input);
239
+ let head: MessageShape<Desc> | undefined;
240
+ try {
241
+ head = await findResourceBySlug(
242
+ store,
243
+ ctx.apiResourceKind,
244
+ binding.schema,
245
+ req.slug,
246
+ req.org,
247
+ );
248
+ } catch (error) {
249
+ throw internalError(error, `failed to search for ${binding.noun}`);
250
+ }
251
+ if (head === undefined) {
252
+ throw notFoundError(binding.noun, `${req.slug} (org: ${req.org})`);
253
+ }
254
+ ctx.set(LIST_VERSIONS_RESOURCE_ID_KEY, idOf(head));
255
+ // The live head's hash decides is_current downstream. Under repoint
256
+ // semantics the current version need not be the newest-archived row,
257
+ // so recency cannot stand in for currency.
258
+ ctx.set(LIST_VERSIONS_HEAD_HASH_KEY, binding.headHashOf(head));
259
+ },
260
+ };
261
+ }
262
+
263
+ /** Audit records → entries → one page (Go LoadAndMapVersionsStep, generalised). */
264
+ export function newLoadAndMapVersionsStep<
265
+ Desc extends DescMessage,
266
+ InputDesc extends DescMessage,
267
+ Entry extends Message,
268
+ Response extends Message,
269
+ >(
270
+ store: Store,
271
+ binding: VersionHistoryBinding<Desc, InputDesc, Entry, Response>,
272
+ stepName: string,
273
+ ): PipelineStep<InputDesc> {
274
+ return {
275
+ name: stepName,
276
+ async execute(ctx: RequestContext<InputDesc>): Promise<void> {
277
+ const req = binding.input(ctx.input);
278
+ const resourceId = ctx.get(LIST_VERSIONS_RESOURCE_ID_KEY) as string;
279
+
280
+ let records;
281
+ try {
282
+ records = await store.listAuditRecords(ctx.apiResourceKind, resourceId);
283
+ } catch (error) {
284
+ throw internalError(error, "failed to load version history");
285
+ }
286
+
287
+ // is_current = the entry whose hash matches the live head, not the
288
+ // newest row. Legacy data may hold duplicate-hash rows (predating
289
+ // repoint semantics); marking only the first match keeps
290
+ // exactly-one-current true for them too.
291
+ const headHash = ctx.get(LIST_VERSIONS_HEAD_HASH_KEY) as string;
292
+ let currentMarked = false;
293
+ const entries: Entry[] = [];
294
+ for (const record of records) {
295
+ let snapshot: MessageShape<Desc>;
296
+ try {
297
+ snapshot = fromBinary(binding.schema, record.data);
298
+ } catch {
299
+ continue;
300
+ }
301
+ const isCurrent: boolean =
302
+ !currentMarked &&
303
+ headHash !== "" &&
304
+ binding.headHashOf(snapshot) === headHash;
305
+ currentMarked = currentMarked || isCurrent;
306
+ // Tag comes from the audit column (source of truth), not the snapshot.
307
+ entries.push(binding.mapEntry(snapshot, isCurrent, record.tag));
308
+ }
309
+
310
+ let pageSize = req.pageSize;
311
+ if (pageSize <= 0) {
312
+ pageSize = DEFAULT_PAGE_SIZE;
313
+ }
314
+ if (pageSize > MAX_PAGE_SIZE) {
315
+ pageSize = MAX_PAGE_SIZE;
316
+ }
317
+
318
+ let startIndex = 0;
319
+ if (req.pageToken !== "") {
320
+ startIndex = decodePageToken(req.pageToken);
321
+ }
322
+
323
+ let pageEntries: Entry[] = [];
324
+ let nextPageToken = "";
325
+ if (startIndex < entries.length) {
326
+ const end = Math.min(startIndex + pageSize, entries.length);
327
+ pageEntries = entries.slice(startIndex, end);
328
+ if (end < entries.length) {
329
+ nextPageToken = Buffer.from(String(end)).toString("base64");
330
+ }
331
+ }
332
+
333
+ ctx.set(
334
+ LIST_VERSIONS_RESPONSE_KEY,
335
+ binding.response(pageEntries, nextPageToken, entries.length),
336
+ );
337
+ },
338
+ };
339
+ }
340
+
341
+ /**
342
+ * Decodes the base64 cursor with Go's strictness: base64.StdEncoding
343
+ * rejects malformed input and strconv.Atoi rejects trailing garbage —
344
+ * Buffer.from is lenient on both, so validity is checked explicitly.
345
+ */
346
+ export function decodePageToken(token: string): number {
347
+ const decoded = Buffer.from(token, "base64");
348
+ if (decoded.toString("base64") !== token) {
349
+ throw invalidArgumentError("invalid page_token");
350
+ }
351
+ const text = decoded.toString("utf8");
352
+ const index = Number.parseInt(text, 10);
353
+ if (!Number.isSafeInteger(index) || String(index) !== text || index < 0) {
354
+ throw invalidArgumentError("invalid page_token");
355
+ }
356
+ return index;
357
+ }
358
+
359
+ /** metadata.id of a resource message; every versioned kind carries the commons metadata. */
360
+ function idOf(resource: Message): string {
361
+ return metadataOf(resource)?.id ?? "";
362
+ }
@@ -46,10 +46,7 @@ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/
46
46
  import type { UpdateVisibilityInput } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
47
47
  import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
48
48
 
49
- import type {
50
- Authorizer,
51
- AuthzDecision,
52
- } from "../../extensions/authorizer.js";
49
+ import type { Authorizer, AuthzDecision } from "../../extensions/authorizer.js";
53
50
  import type { CallerIdentity } from "../../extensions/identity.js";
54
51
  import { internalError } from "../errors.js";
55
52
  import type { PipelineStep } from "../pipeline.js";
@@ -92,9 +89,10 @@ export function newGuardPublicVisibilityStep<Desc extends DescMessage>(
92
89
  * chain's own context key (every updateVisibility chain stores it —
93
90
  * the RecordVisibilityBeforeUpdate pattern).
94
91
  */
95
- export function newAuthorizeVisibilityTransitionStep<
96
- Desc extends DescMessage,
97
- >(targetKey: string, authorizer: Authorizer): PipelineStep<Desc> {
92
+ export function newAuthorizeVisibilityTransitionStep<Desc extends DescMessage>(
93
+ targetKey: string,
94
+ authorizer: Authorizer,
95
+ ): PipelineStep<Desc> {
98
96
  return {
99
97
  name: "AuthorizeVisibilityTransition",
100
98
  async execute(ctx: RequestContext<Desc>): Promise<void> {
@@ -127,8 +125,13 @@ export function newAuthorizeVisibilityTransitionStep<
127
125
  };
128
126
  }
129
127
 
130
- /** The single owner of "may this caller set public?" — both doors call it. */
131
- async function requireOperatorMaySetPublic(
128
+ /**
129
+ * The single owner of "may this caller set public?" — both doors call it,
130
+ * and so does the plugin push chain, whose requested level rides the
131
+ * request (the level then flows to every member through the members' own
132
+ * create and updateVisibility doors, which run this check again).
133
+ */
134
+ export async function requireOperatorMaySetPublic(
132
135
  authorizer: Authorizer,
133
136
  caller: CallerIdentity,
134
137
  ): Promise<void> {
@@ -3,7 +3,7 @@
3
3
  The two cross-aggregate query services (D4 #14; Go `pkg/query/`):
4
4
 
5
5
  - `search/` — the SearchService over the store's search index: criteria value object, the
6
- searchable-extractor registry (13 kinds, `kind_meta`-derived set), the
6
+ searchable-extractor registry (14 kinds, `kind_meta`-derived set), the
7
7
  query store over `Store.querySearchIndex`, and boot-time RebuildIndex.
8
8
  - `activity/` — the ActivityQueryController recents feed: sessions +
9
9
  workflow executions merged newest-first (stigmer#461).
@@ -42,7 +42,7 @@ function criteria(overrides?: {
42
42
  }
43
43
 
44
44
  describe("searchIndexedKinds derivation (kind_meta)", () => {
45
- it("derives exactly the 13 searchable kinds, project included", () => {
45
+ it("derives exactly the 14 searchable kinds, project and plugin included", () => {
46
46
  // Go's SearchableKinds map, pinned by its invariant test against the
47
47
  // same kind_meta derivation. project rides #14 (DD-D) although its
48
48
  // domain ports with #16 — RebuildIndex on an adopted Go database
@@ -62,6 +62,7 @@ describe("searchIndexedKinds derivation (kind_meta)", () => {
62
62
  ApiResourceKind.organization,
63
63
  ApiResourceKind.workflow_execution,
64
64
  ApiResourceKind.workflow_instance,
65
+ ApiResourceKind.plugin,
65
66
  ].sort((a, b) => a - b),
66
67
  );
67
68
  });
@@ -112,9 +113,7 @@ describe("SearchCriteria normalization (Go NewSearchCriteria)", () => {
112
113
  it("rejects a query over the cap with Go's exact message", () => {
113
114
  expect(() =>
114
115
  criteria({ query: "x".repeat(MAX_QUERY_LENGTH + 1) }),
115
- ).toThrowError(
116
- "search query exceeds maximum length of 500 characters",
117
- );
116
+ ).toThrowError("search query exceeds maximum length of 500 characters");
118
117
  });
119
118
 
120
119
  it("accepts a query at exactly the cap", () => {
@@ -141,9 +140,9 @@ describe("SearchCriteria normalization (Go NewSearchCriteria)", () => {
141
140
  describe("mode selection", () => {
142
141
  it("empty kinds is discover mode; requested kinds is not", () => {
143
142
  expect(criteria({ kinds: [] }).isDiscoverMode()).toBe(true);
144
- expect(
145
- criteria({ kinds: [ApiResourceKind.agent] }).isDiscoverMode(),
146
- ).toBe(false);
143
+ expect(criteria({ kinds: [ApiResourceKind.agent] }).isDiscoverMode()).toBe(
144
+ false,
145
+ );
147
146
  });
148
147
 
149
148
  it("hasQuery: empty and whitespace-only queries mean list mode", () => {