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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/README.md +3 -3
  2. package/dist/archive/content-store.d.ts +35 -0
  3. package/dist/archive/content-store.d.ts.map +1 -0
  4. package/dist/archive/content-store.js +98 -0
  5. package/dist/archive/content-store.js.map +1 -0
  6. package/dist/archive/inflate.d.ts +22 -0
  7. package/dist/archive/inflate.d.ts.map +1 -0
  8. package/dist/archive/inflate.js +75 -0
  9. package/dist/archive/inflate.js.map +1 -0
  10. package/dist/archive/limits.d.ts +33 -0
  11. package/dist/archive/limits.d.ts.map +1 -0
  12. package/dist/archive/limits.js +31 -0
  13. package/dist/archive/limits.js.map +1 -0
  14. package/dist/archive/open.d.ts +24 -0
  15. package/dist/archive/open.d.ts.map +1 -0
  16. package/dist/archive/open.js +93 -0
  17. package/dist/archive/open.js.map +1 -0
  18. package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
  19. package/dist/archive/prefilter.d.ts.map +1 -0
  20. package/dist/archive/prefilter.js.map +1 -0
  21. package/dist/archive/write.d.ts +8 -0
  22. package/dist/archive/write.d.ts.map +1 -0
  23. package/dist/archive/write.js +44 -0
  24. package/dist/archive/write.js.map +1 -0
  25. package/dist/authorization/authorizer.d.ts +98 -0
  26. package/dist/authorization/authorizer.d.ts.map +1 -0
  27. package/dist/authorization/authorizer.js +156 -0
  28. package/dist/authorization/authorizer.js.map +1 -0
  29. package/dist/authorization/derived-tuples.d.ts +42 -0
  30. package/dist/authorization/derived-tuples.d.ts.map +1 -0
  31. package/dist/authorization/derived-tuples.js +240 -0
  32. package/dist/authorization/derived-tuples.js.map +1 -0
  33. package/dist/authorization/evaluator.d.ts +66 -0
  34. package/dist/authorization/evaluator.d.ts.map +1 -0
  35. package/dist/authorization/evaluator.js +153 -0
  36. package/dist/authorization/evaluator.js.map +1 -0
  37. package/dist/authorization/facts.d.ts +29 -0
  38. package/dist/authorization/facts.d.ts.map +1 -0
  39. package/dist/authorization/facts.js +17 -0
  40. package/dist/authorization/facts.js.map +1 -0
  41. package/dist/authorization/list-read-scope.d.ts +18 -0
  42. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  43. package/dist/authorization/list-read-scope.js +155 -0
  44. package/dist/authorization/list-read-scope.js.map +1 -0
  45. package/dist/authorization/model/agent.d.ts +2 -0
  46. package/dist/authorization/model/agent.d.ts.map +1 -0
  47. package/dist/authorization/model/agent.js +42 -0
  48. package/dist/authorization/model/agent.js.map +1 -0
  49. package/dist/authorization/model/agent_channel.d.ts +2 -0
  50. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  51. package/dist/authorization/model/agent_channel.js +38 -0
  52. package/dist/authorization/model/agent_channel.js.map +1 -0
  53. package/dist/authorization/model/agent_execution.d.ts +2 -0
  54. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_execution.js +25 -0
  56. package/dist/authorization/model/agent_execution.js.map +1 -0
  57. package/dist/authorization/model/agent_instance.d.ts +2 -0
  58. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_instance.js +47 -0
  60. package/dist/authorization/model/agent_instance.js.map +1 -0
  61. package/dist/authorization/model/agent_share.d.ts +2 -0
  62. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_share.js +29 -0
  64. package/dist/authorization/model/agent_share.js.map +1 -0
  65. package/dist/authorization/model/api_key.d.ts +2 -0
  66. package/dist/authorization/model/api_key.d.ts.map +1 -0
  67. package/dist/authorization/model/api_key.js +27 -0
  68. package/dist/authorization/model/api_key.js.map +1 -0
  69. package/dist/authorization/model/artifact.d.ts +2 -0
  70. package/dist/authorization/model/artifact.d.ts.map +1 -0
  71. package/dist/authorization/model/artifact.js +27 -0
  72. package/dist/authorization/model/artifact.js.map +1 -0
  73. package/dist/authorization/model/channel_app.d.ts +2 -0
  74. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  75. package/dist/authorization/model/channel_app.js +28 -0
  76. package/dist/authorization/model/channel_app.js.map +1 -0
  77. package/dist/authorization/model/default-of.d.ts +38 -0
  78. package/dist/authorization/model/default-of.d.ts.map +1 -0
  79. package/dist/authorization/model/default-of.js +39 -0
  80. package/dist/authorization/model/default-of.js.map +1 -0
  81. package/dist/authorization/model/environment.d.ts +2 -0
  82. package/dist/authorization/model/environment.d.ts.map +1 -0
  83. package/dist/authorization/model/environment.js +33 -0
  84. package/dist/authorization/model/environment.js.map +1 -0
  85. package/dist/authorization/model/execution_context.d.ts +2 -0
  86. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  87. package/dist/authorization/model/execution_context.js +19 -0
  88. package/dist/authorization/model/execution_context.js.map +1 -0
  89. package/dist/authorization/model/iam_policy.d.ts +2 -0
  90. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  91. package/dist/authorization/model/iam_policy.js +31 -0
  92. package/dist/authorization/model/iam_policy.js.map +1 -0
  93. package/dist/authorization/model/identity_account.d.ts +2 -0
  94. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  95. package/dist/authorization/model/identity_account.js +25 -0
  96. package/dist/authorization/model/identity_account.js.map +1 -0
  97. package/dist/authorization/model/index.d.ts +36 -0
  98. package/dist/authorization/model/index.d.ts.map +1 -0
  99. package/dist/authorization/model/index.js +72 -0
  100. package/dist/authorization/model/index.js.map +1 -0
  101. package/dist/authorization/model/mcp_server.d.ts +2 -0
  102. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  103. package/dist/authorization/model/mcp_server.js +37 -0
  104. package/dist/authorization/model/mcp_server.js.map +1 -0
  105. package/dist/authorization/model/memory.d.ts +2 -0
  106. package/dist/authorization/model/memory.d.ts.map +1 -0
  107. package/dist/authorization/model/memory.js +26 -0
  108. package/dist/authorization/model/memory.js.map +1 -0
  109. package/dist/authorization/model/oauth_app.d.ts +2 -0
  110. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  111. package/dist/authorization/model/oauth_app.js +30 -0
  112. package/dist/authorization/model/oauth_app.js.map +1 -0
  113. package/dist/authorization/model/organization.d.ts +2 -0
  114. package/dist/authorization/model/organization.d.ts.map +1 -0
  115. package/dist/authorization/model/organization.js +54 -0
  116. package/dist/authorization/model/organization.js.map +1 -0
  117. package/dist/authorization/model/plugin.d.ts +2 -0
  118. package/dist/authorization/model/plugin.d.ts.map +1 -0
  119. package/dist/authorization/model/plugin.js +44 -0
  120. package/dist/authorization/model/plugin.js.map +1 -0
  121. package/dist/authorization/model/project.d.ts +2 -0
  122. package/dist/authorization/model/project.d.ts.map +1 -0
  123. package/dist/authorization/model/project.js +32 -0
  124. package/dist/authorization/model/project.js.map +1 -0
  125. package/dist/authorization/model/rewrite.d.ts +127 -0
  126. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  127. package/dist/authorization/model/rewrite.js +82 -0
  128. package/dist/authorization/model/rewrite.js.map +1 -0
  129. package/dist/authorization/model/schedule.d.ts +2 -0
  130. package/dist/authorization/model/schedule.d.ts.map +1 -0
  131. package/dist/authorization/model/schedule.js +29 -0
  132. package/dist/authorization/model/schedule.js.map +1 -0
  133. package/dist/authorization/model/session.d.ts +2 -0
  134. package/dist/authorization/model/session.d.ts.map +1 -0
  135. package/dist/authorization/model/session.js +38 -0
  136. package/dist/authorization/model/session.js.map +1 -0
  137. package/dist/authorization/model/skill.d.ts +2 -0
  138. package/dist/authorization/model/skill.d.ts.map +1 -0
  139. package/dist/authorization/model/skill.js +38 -0
  140. package/dist/authorization/model/skill.js.map +1 -0
  141. package/dist/authorization/model/workflow.d.ts +2 -0
  142. package/dist/authorization/model/workflow.d.ts.map +1 -0
  143. package/dist/authorization/model/workflow.js +38 -0
  144. package/dist/authorization/model/workflow.js.map +1 -0
  145. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  146. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow_execution.js +32 -0
  148. package/dist/authorization/model/workflow_execution.js.map +1 -0
  149. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  150. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_instance.js +92 -0
  152. package/dist/authorization/model/workflow_instance.js.map +1 -0
  153. package/dist/authorization/organization-directory.d.ts +13 -0
  154. package/dist/authorization/organization-directory.d.ts.map +1 -0
  155. package/dist/authorization/organization-directory.js +83 -0
  156. package/dist/authorization/organization-directory.js.map +1 -0
  157. package/dist/authorization/person.d.ts +42 -0
  158. package/dist/authorization/person.d.ts.map +1 -0
  159. package/dist/authorization/person.js +19 -0
  160. package/dist/authorization/person.js.map +1 -0
  161. package/dist/authorization/posture.d.ts +38 -0
  162. package/dist/authorization/posture.d.ts.map +1 -0
  163. package/dist/authorization/posture.js +7 -0
  164. package/dist/authorization/posture.js.map +1 -0
  165. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  166. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  167. package/dist/authorization/schedule-fire-caller.js +67 -0
  168. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  169. package/dist/authorization/store-test-kit.d.ts +68 -0
  170. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  171. package/dist/authorization/store-test-kit.js +311 -0
  172. package/dist/authorization/store-test-kit.js.map +1 -0
  173. package/dist/authorization/tuples.d.ts +115 -0
  174. package/dist/authorization/tuples.d.ts.map +1 -0
  175. package/dist/authorization/tuples.js +83 -0
  176. package/dist/authorization/tuples.js.map +1 -0
  177. package/dist/boot/compose.d.ts.map +1 -1
  178. package/dist/boot/compose.js +157 -32
  179. package/dist/boot/compose.js.map +1 -1
  180. package/dist/boot/inprocess.d.ts +12 -0
  181. package/dist/boot/inprocess.d.ts.map +1 -1
  182. package/dist/boot/inprocess.js +62 -20
  183. package/dist/boot/inprocess.js.map +1 -1
  184. package/dist/domain/agent/controller.d.ts.map +1 -1
  185. package/dist/domain/agent/controller.js +9 -0
  186. package/dist/domain/agent/controller.js.map +1 -1
  187. package/dist/domain/iampolicy/constants.d.ts +11 -0
  188. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  189. package/dist/domain/iampolicy/constants.js +11 -0
  190. package/dist/domain/iampolicy/constants.js.map +1 -1
  191. package/dist/domain/iampolicy/membership.d.ts +72 -1
  192. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  193. package/dist/domain/iampolicy/membership.js +141 -56
  194. package/dist/domain/iampolicy/membership.js.map +1 -1
  195. package/dist/domain/identityaccount/actor.d.ts +26 -0
  196. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  197. package/dist/domain/identityaccount/actor.js +17 -0
  198. package/dist/domain/identityaccount/actor.js.map +1 -0
  199. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  200. package/dist/domain/mcpserver/controller.js +9 -0
  201. package/dist/domain/mcpserver/controller.js.map +1 -1
  202. package/dist/domain/plugin/archive.d.ts +37 -0
  203. package/dist/domain/plugin/archive.d.ts.map +1 -0
  204. package/dist/domain/plugin/archive.js +50 -0
  205. package/dist/domain/plugin/archive.js.map +1 -0
  206. package/dist/domain/plugin/constants.d.ts +38 -0
  207. package/dist/domain/plugin/constants.d.ts.map +1 -0
  208. package/dist/domain/plugin/constants.js +46 -0
  209. package/dist/domain/plugin/constants.js.map +1 -0
  210. package/dist/domain/plugin/controller.d.ts +25 -0
  211. package/dist/domain/plugin/controller.d.ts.map +1 -0
  212. package/dist/domain/plugin/controller.js +493 -0
  213. package/dist/domain/plugin/controller.js.map +1 -0
  214. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  215. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  216. package/dist/domain/plugin/materialize/agent.js +128 -0
  217. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  218. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  219. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  220. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  221. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  222. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  223. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  224. package/dist/domain/plugin/materialize/identity.js +40 -0
  225. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  226. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  227. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  228. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  229. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  230. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  231. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  232. package/dist/domain/plugin/materialize/plan.js +77 -0
  233. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  234. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  235. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  236. package/dist/domain/plugin/materialize/ports.js +2 -0
  237. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  238. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  239. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  240. package/dist/domain/plugin/materialize/skills.js +44 -0
  241. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  242. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  243. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/workflows.js +31 -0
  245. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  246. package/dist/domain/plugin/members.d.ts +42 -0
  247. package/dist/domain/plugin/members.d.ts.map +1 -0
  248. package/dist/domain/plugin/members.js +97 -0
  249. package/dist/domain/plugin/members.js.map +1 -0
  250. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  251. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  252. package/dist/domain/plugin/overlay/documents.js +38 -0
  253. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  254. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  255. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  256. package/dist/domain/plugin/overlay/parse.js +79 -0
  257. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  258. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  259. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  260. package/dist/domain/plugin/overlay/sanitize.js +101 -0
  261. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  262. package/dist/domain/plugin/push.d.ts +133 -0
  263. package/dist/domain/plugin/push.d.ts.map +1 -0
  264. package/dist/domain/plugin/push.js +800 -0
  265. package/dist/domain/plugin/push.js.map +1 -0
  266. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  267. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  268. package/dist/domain/plugin/search-extractor.js +41 -0
  269. package/dist/domain/plugin/search-extractor.js.map +1 -0
  270. package/dist/domain/skill/constants.d.ts +6 -11
  271. package/dist/domain/skill/constants.d.ts.map +1 -1
  272. package/dist/domain/skill/constants.js +6 -11
  273. package/dist/domain/skill/constants.js.map +1 -1
  274. package/dist/domain/skill/controller.d.ts.map +1 -1
  275. package/dist/domain/skill/controller.js +33 -30
  276. package/dist/domain/skill/controller.js.map +1 -1
  277. package/dist/domain/skill/push.d.ts +9 -10
  278. package/dist/domain/skill/push.d.ts.map +1 -1
  279. package/dist/domain/skill/push.js +53 -122
  280. package/dist/domain/skill/push.js.map +1 -1
  281. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  282. package/dist/domain/skill/search-extractor.js.map +1 -1
  283. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  284. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  285. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  286. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  287. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  288. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  289. package/dist/domain/skill/storage/zip-gate.js +56 -126
  290. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  291. package/dist/domain/skill/version-resolution.d.ts +5 -5
  292. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  293. package/dist/domain/skill/version-resolution.js +34 -216
  294. package/dist/domain/skill/version-resolution.js.map +1 -1
  295. package/dist/domain/workflow/controller.d.ts.map +1 -1
  296. package/dist/domain/workflow/controller.js +30 -3
  297. package/dist/domain/workflow/controller.js.map +1 -1
  298. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  299. package/dist/extensions/authorizer.d.ts +10 -5
  300. package/dist/extensions/authorizer.d.ts.map +1 -1
  301. package/dist/extensions/drivers.d.ts +4 -1
  302. package/dist/extensions/drivers.d.ts.map +1 -1
  303. package/dist/extensions/list-read-scope.d.ts +47 -20
  304. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  305. package/dist/extensions/list-read-scope.js +20 -24
  306. package/dist/extensions/list-read-scope.js.map +1 -1
  307. package/dist/extensions/organization-directory.d.ts +13 -9
  308. package/dist/extensions/organization-directory.d.ts.map +1 -1
  309. package/dist/extensions/organization-directory.js.map +1 -1
  310. package/dist/extensions/resource-authorization.d.ts +33 -0
  311. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  312. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  313. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  314. package/dist/extensions/schedule-fire-caller.js +12 -1
  315. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  316. package/dist/index.d.ts +10 -0
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +8 -0
  319. package/dist/index.js.map +1 -1
  320. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  321. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  322. package/dist/pipeline/apiresource-labels.js +20 -0
  323. package/dist/pipeline/apiresource-labels.js.map +1 -1
  324. package/dist/pipeline/errors.d.ts.map +1 -1
  325. package/dist/pipeline/errors.js.map +1 -1
  326. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  327. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  328. package/dist/pipeline/steps/authorization-facts.js +100 -0
  329. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  330. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  331. package/dist/pipeline/steps/delete.js +1 -1
  332. package/dist/pipeline/steps/delete.js.map +1 -1
  333. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  334. package/dist/pipeline/steps/duplicate.js.map +1 -1
  335. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  336. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  337. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  338. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  339. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  340. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  341. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  342. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  343. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  344. package/dist/pipeline/steps/helpers.js.map +1 -1
  345. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  346. package/dist/pipeline/steps/index-search.js.map +1 -1
  347. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  348. package/dist/pipeline/steps/load-existing.js +1 -1
  349. package/dist/pipeline/steps/load-existing.js.map +1 -1
  350. package/dist/pipeline/steps/references.d.ts +16 -0
  351. package/dist/pipeline/steps/references.d.ts.map +1 -1
  352. package/dist/pipeline/steps/references.js +18 -0
  353. package/dist/pipeline/steps/references.js.map +1 -1
  354. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  355. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  356. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  357. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  358. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  359. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  360. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  361. package/dist/pipeline/steps/slug.js.map +1 -1
  362. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  363. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  364. package/dist/pipeline/steps/validate-visibility.js +6 -1
  365. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  366. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  367. package/dist/pipeline/steps/validation.js.map +1 -1
  368. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  369. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  370. package/dist/pipeline/steps/version-archive.js +129 -0
  371. package/dist/pipeline/steps/version-archive.js.map +1 -0
  372. package/dist/pipeline/steps/version-history.d.ts +49 -0
  373. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  374. package/dist/pipeline/steps/version-history.js +229 -0
  375. package/dist/pipeline/steps/version-history.js.map +1 -0
  376. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  377. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  378. package/dist/pipeline/steps/visibility-gates.js +7 -2
  379. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  380. package/dist/query/search/registry.d.ts.map +1 -1
  381. package/dist/query/search/registry.js +2 -0
  382. package/dist/query/search/registry.js.map +1 -1
  383. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  384. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  385. package/dist/temporal/schedule/run-starter.js +14 -1
  386. package/dist/temporal/schedule/run-starter.js.map +1 -1
  387. package/package.json +5 -4
  388. package/src/archive/__tests__/archive.test.ts +233 -0
  389. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  390. package/src/archive/content-store.ts +132 -0
  391. package/src/archive/inflate.ts +107 -0
  392. package/src/archive/limits.ts +42 -0
  393. package/src/archive/open.ts +131 -0
  394. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  395. package/src/archive/write.ts +54 -0
  396. package/src/authorization/README.md +124 -0
  397. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  398. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  399. package/src/authorization/__tests__/drivers.ts +70 -0
  400. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  401. package/src/authorization/__tests__/facts.test.ts +155 -0
  402. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  403. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  404. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  405. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  406. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  407. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  408. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  409. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  410. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  411. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  412. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  413. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  414. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  415. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  416. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  417. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  418. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  419. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  420. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  421. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  422. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  423. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  424. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  425. package/src/authorization/__tests__/person.test.ts +114 -0
  426. package/src/authorization/__tests__/posture.test.ts +25 -0
  427. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  428. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  429. package/src/authorization/__tests__/support.ts +101 -0
  430. package/src/authorization/__tests__/tuples.test.ts +62 -0
  431. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  432. package/src/authorization/authorizer.ts +208 -0
  433. package/src/authorization/derived-tuples.ts +384 -0
  434. package/src/authorization/evaluator.ts +283 -0
  435. package/src/authorization/facts.ts +47 -0
  436. package/src/authorization/list-read-scope.ts +216 -0
  437. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  438. package/src/authorization/model/agent.ts +64 -0
  439. package/src/authorization/model/agent_channel.ts +49 -0
  440. package/src/authorization/model/agent_execution.ts +33 -0
  441. package/src/authorization/model/agent_instance.ts +66 -0
  442. package/src/authorization/model/agent_share.ts +40 -0
  443. package/src/authorization/model/api_key.ts +28 -0
  444. package/src/authorization/model/artifact.ts +38 -0
  445. package/src/authorization/model/channel_app.ts +39 -0
  446. package/src/authorization/model/default-of.ts +99 -0
  447. package/src/authorization/model/environment.ts +48 -0
  448. package/src/authorization/model/execution_context.ts +20 -0
  449. package/src/authorization/model/iam_policy.ts +42 -0
  450. package/src/authorization/model/identity_account.ts +26 -0
  451. package/src/authorization/model/index.ts +108 -0
  452. package/src/authorization/model/mcp_server.ts +59 -0
  453. package/src/authorization/model/memory.ts +27 -0
  454. package/src/authorization/model/oauth_app.ts +42 -0
  455. package/src/authorization/model/organization.ts +55 -0
  456. package/src/authorization/model/plugin.ts +66 -0
  457. package/src/authorization/model/project.ts +47 -0
  458. package/src/authorization/model/rewrite.ts +213 -0
  459. package/src/authorization/model/schedule.ts +40 -0
  460. package/src/authorization/model/session.ts +50 -0
  461. package/src/authorization/model/skill.ts +60 -0
  462. package/src/authorization/model/workflow.ts +60 -0
  463. package/src/authorization/model/workflow_execution.ts +44 -0
  464. package/src/authorization/model/workflow_instance.ts +122 -0
  465. package/src/authorization/organization-directory.ts +114 -0
  466. package/src/authorization/person.ts +68 -0
  467. package/src/authorization/posture.ts +49 -0
  468. package/src/authorization/schedule-fire-caller.ts +91 -0
  469. package/src/authorization/store-test-kit.ts +454 -0
  470. package/src/authorization/tuples.ts +190 -0
  471. package/src/boot/compose.ts +175 -38
  472. package/src/boot/inprocess.ts +108 -30
  473. package/src/domain/agent/controller.ts +11 -0
  474. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  475. package/src/domain/iampolicy/constants.ts +12 -0
  476. package/src/domain/iampolicy/membership.ts +221 -66
  477. package/src/domain/identityaccount/actor.ts +44 -0
  478. package/src/domain/mcpserver/controller.ts +11 -0
  479. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  480. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  481. package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
  482. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  483. package/src/domain/plugin/archive.ts +89 -0
  484. package/src/domain/plugin/constants.ts +53 -0
  485. package/src/domain/plugin/controller.ts +913 -0
  486. package/src/domain/plugin/materialize/agent.ts +186 -0
  487. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  488. package/src/domain/plugin/materialize/identity.ts +67 -0
  489. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  490. package/src/domain/plugin/materialize/plan.ts +124 -0
  491. package/src/domain/plugin/materialize/ports.ts +53 -0
  492. package/src/domain/plugin/materialize/skills.ts +68 -0
  493. package/src/domain/plugin/materialize/workflows.ts +51 -0
  494. package/src/domain/plugin/members.ts +180 -0
  495. package/src/domain/plugin/overlay/documents.ts +78 -0
  496. package/src/domain/plugin/overlay/parse.ts +115 -0
  497. package/src/domain/plugin/overlay/sanitize.ts +149 -0
  498. package/src/domain/plugin/push.ts +1062 -0
  499. package/src/domain/plugin/search-extractor.ts +60 -0
  500. package/src/domain/skill/constants.ts +11 -14
  501. package/src/domain/skill/controller.ts +44 -36
  502. package/src/domain/skill/push.ts +61 -156
  503. package/src/domain/skill/search-extractor.ts +3 -1
  504. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  505. package/src/domain/skill/storage/zip-gate.ts +58 -154
  506. package/src/domain/skill/version-resolution.ts +67 -269
  507. package/src/domain/workflow/controller.ts +38 -4
  508. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  509. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  510. package/src/extensions/__tests__/composed-support.ts +32 -1
  511. package/src/extensions/__tests__/extension-composition.test.ts +35 -0
  512. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  513. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  514. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  515. package/src/extensions/authorizer.ts +10 -5
  516. package/src/extensions/drivers.ts +4 -1
  517. package/src/extensions/list-read-scope.ts +67 -45
  518. package/src/extensions/organization-directory.ts +13 -9
  519. package/src/extensions/resource-authorization.ts +34 -0
  520. package/src/extensions/schedule-fire-caller.ts +49 -18
  521. package/src/index.ts +51 -1
  522. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  523. package/src/pipeline/apiresource-labels.ts +31 -3
  524. package/src/pipeline/errors.ts +5 -5
  525. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  526. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
  527. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  528. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  529. package/src/pipeline/steps/authorization-facts.ts +131 -0
  530. package/src/pipeline/steps/delete.ts +11 -3
  531. package/src/pipeline/steps/duplicate.ts +8 -2
  532. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  533. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  534. package/src/pipeline/steps/helpers.ts +4 -1
  535. package/src/pipeline/steps/index-search.ts +28 -15
  536. package/src/pipeline/steps/load-existing.ts +12 -3
  537. package/src/pipeline/steps/references.ts +36 -2
  538. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  539. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  540. package/src/pipeline/steps/slug.ts +7 -2
  541. package/src/pipeline/steps/validate-visibility.ts +9 -2
  542. package/src/pipeline/steps/validation.ts +3 -1
  543. package/src/pipeline/steps/version-archive.ts +225 -0
  544. package/src/pipeline/steps/version-history.ts +362 -0
  545. package/src/pipeline/steps/visibility-gates.ts +12 -9
  546. package/src/query/README.md +1 -1
  547. package/src/query/search/__tests__/criteria.test.ts +6 -7
  548. package/src/query/search/__tests__/query-store.test.ts +9 -2
  549. package/src/query/search/__tests__/registry.test.ts +6 -4
  550. package/src/query/search/registry.ts +6 -1
  551. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  552. package/src/temporal/schedule/run-starter.ts +31 -8
  553. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  554. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  555. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -0,0 +1,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", () => {
@@ -95,7 +95,9 @@ function newSession(
95
95
  status: {
96
96
  audit: {
97
97
  specAudit: {
98
- createdAt: { seconds: BigInt(opts?.createdAtSeconds ?? 1_700_000_000) },
98
+ createdAt: {
99
+ seconds: BigInt(opts?.createdAtSeconds ?? 1_700_000_000),
100
+ },
99
101
  },
100
102
  },
101
103
  },
@@ -432,7 +434,12 @@ describe("rebuildIndex", () => {
432
434
  const adopted = SqliteStore.open(fixture.dbPath);
433
435
  try {
434
436
  const project = create(ProjectSchema, {
435
- metadata: { id: "prj_1", name: "billing", slug: "billing", org: "acme" },
437
+ metadata: {
438
+ id: "prj_1",
439
+ name: "billing",
440
+ slug: "billing",
441
+ org: "acme",
442
+ },
436
443
  spec: { description: "the billing project" },
437
444
  status: {
438
445
  audit: { specAudit: { createdAt: { seconds: 1_700_000_000n } } },
@@ -78,15 +78,17 @@ describe("SearchableResourceRegistry (Go registry_test.go)", () => {
78
78
 
79
79
  it("supportedKinds sorts by the kind NAME string (Go's kind.String() sort)", () => {
80
80
  const registry = newSearchableResourceRegistry();
81
- const names = registry.supportedKinds().map((kind) => ApiResourceKind[kind]);
81
+ const names = registry
82
+ .supportedKinds()
83
+ .map((kind) => ApiResourceKind[kind]);
82
84
  expect(names).toEqual([...names].sort((a, b) => a.localeCompare(b)));
83
85
  });
84
86
 
85
87
  it("validateExpectedKinds warns with the missing kinds (never throws)", () => {
86
88
  const logger = testLogger();
87
- new SearchableResourceRegistry([agentSearchExtractor]).validateExpectedKinds(
88
- logger,
89
- );
89
+ new SearchableResourceRegistry([
90
+ agentSearchExtractor,
91
+ ]).validateExpectedKinds(logger);
90
92
  expect(logger.warns).toHaveLength(1);
91
93
  const missing = logger.warns[0]?.missing_kinds as string[];
92
94
  expect(missing).toContain("skill");
@@ -27,6 +27,7 @@ import { environmentSearchExtractor } from "../../domain/environment/search-extr
27
27
  import { executionContextSearchExtractor } from "../../domain/executioncontext/search-extractor.js";
28
28
  import { mcpServerSearchExtractor } from "../../domain/mcpserver/search-extractor.js";
29
29
  import { organizationSearchExtractor } from "../../domain/organization/search-extractor.js";
30
+ import { pluginSearchExtractor } from "../../domain/plugin/search-extractor.js";
30
31
  import { projectSearchExtractor } from "../../domain/project/search-extractor.js";
31
32
  import { sessionSearchExtractor } from "../../domain/session/search-extractor.js";
32
33
  import { skillSearchExtractor } from "../../domain/skill/search-extractor.js";
@@ -39,7 +40,10 @@ import type { SearchableExtractor } from "./extractor.js";
39
40
 
40
41
  /** Go SearchableResourceRegistry — kind → extractor, read-only after build. */
41
42
  export class SearchableResourceRegistry {
42
- private readonly extractors: ReadonlyMap<ApiResourceKind, SearchableExtractor>;
43
+ private readonly extractors: ReadonlyMap<
44
+ ApiResourceKind,
45
+ SearchableExtractor
46
+ >;
43
47
 
44
48
  constructor(extractors: readonly SearchableExtractor[]) {
45
49
  const map = new Map<ApiResourceKind, SearchableExtractor>();
@@ -111,6 +115,7 @@ export function newSearchableResourceRegistry(): SearchableResourceRegistry {
111
115
  executionContextSearchExtractor,
112
116
  mcpServerSearchExtractor,
113
117
  organizationSearchExtractor,
118
+ pluginSearchExtractor,
114
119
  projectSearchExtractor,
115
120
  sessionSearchExtractor,
116
121
  skillSearchExtractor,