@stigmer/server 3.15.3-dev.20260914100347 → 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 (570) 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 +75 -11
  304. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  305. package/dist/extensions/list-read-scope.js +40 -7
  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/apiresource-meta.d.ts +21 -0
  325. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  326. package/dist/pipeline/apiresource-meta.js +28 -0
  327. package/dist/pipeline/apiresource-meta.js.map +1 -1
  328. package/dist/pipeline/errors.d.ts.map +1 -1
  329. package/dist/pipeline/errors.js.map +1 -1
  330. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  331. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  332. package/dist/pipeline/steps/authorization-facts.js +100 -0
  333. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  334. package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
  335. package/dist/pipeline/steps/authorization-tuples.js +7 -26
  336. package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
  337. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  338. package/dist/pipeline/steps/delete.js +1 -1
  339. package/dist/pipeline/steps/delete.js.map +1 -1
  340. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  341. package/dist/pipeline/steps/duplicate.js.map +1 -1
  342. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  343. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  344. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  345. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  346. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  347. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  348. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  349. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  350. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  351. package/dist/pipeline/steps/helpers.js.map +1 -1
  352. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  353. package/dist/pipeline/steps/index-search.js.map +1 -1
  354. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  355. package/dist/pipeline/steps/load-existing.js +1 -1
  356. package/dist/pipeline/steps/load-existing.js.map +1 -1
  357. package/dist/pipeline/steps/references.d.ts +16 -0
  358. package/dist/pipeline/steps/references.d.ts.map +1 -1
  359. package/dist/pipeline/steps/references.js +18 -0
  360. package/dist/pipeline/steps/references.js.map +1 -1
  361. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  362. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  363. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  364. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  365. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  366. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  367. package/dist/pipeline/steps/shapes.d.ts +18 -0
  368. package/dist/pipeline/steps/shapes.d.ts.map +1 -1
  369. package/dist/pipeline/steps/shapes.js +29 -0
  370. package/dist/pipeline/steps/shapes.js.map +1 -1
  371. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  372. package/dist/pipeline/steps/slug.js.map +1 -1
  373. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  374. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  375. package/dist/pipeline/steps/validate-visibility.js +6 -1
  376. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  377. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  378. package/dist/pipeline/steps/validation.js.map +1 -1
  379. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  380. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  381. package/dist/pipeline/steps/version-archive.js +129 -0
  382. package/dist/pipeline/steps/version-archive.js.map +1 -0
  383. package/dist/pipeline/steps/version-history.d.ts +49 -0
  384. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  385. package/dist/pipeline/steps/version-history.js +229 -0
  386. package/dist/pipeline/steps/version-history.js.map +1 -0
  387. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  388. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  389. package/dist/pipeline/steps/visibility-gates.js +7 -2
  390. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  391. package/dist/query/search/registry.d.ts.map +1 -1
  392. package/dist/query/search/registry.js +2 -0
  393. package/dist/query/search/registry.js.map +1 -1
  394. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  395. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  396. package/dist/temporal/schedule/run-starter.js +14 -1
  397. package/dist/temporal/schedule/run-starter.js.map +1 -1
  398. package/package.json +5 -4
  399. package/src/archive/__tests__/archive.test.ts +233 -0
  400. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  401. package/src/archive/content-store.ts +132 -0
  402. package/src/archive/inflate.ts +107 -0
  403. package/src/archive/limits.ts +42 -0
  404. package/src/archive/open.ts +131 -0
  405. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  406. package/src/archive/write.ts +54 -0
  407. package/src/authorization/README.md +124 -0
  408. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  409. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  410. package/src/authorization/__tests__/drivers.ts +70 -0
  411. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  412. package/src/authorization/__tests__/facts.test.ts +155 -0
  413. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  414. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  415. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  416. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  417. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  418. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  419. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  420. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  421. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  422. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  423. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  424. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  425. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  426. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  427. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  428. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  429. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  430. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  431. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  432. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  433. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  434. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  435. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  436. package/src/authorization/__tests__/person.test.ts +114 -0
  437. package/src/authorization/__tests__/posture.test.ts +25 -0
  438. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  439. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  440. package/src/authorization/__tests__/support.ts +101 -0
  441. package/src/authorization/__tests__/tuples.test.ts +62 -0
  442. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  443. package/src/authorization/authorizer.ts +208 -0
  444. package/src/authorization/derived-tuples.ts +384 -0
  445. package/src/authorization/evaluator.ts +283 -0
  446. package/src/authorization/facts.ts +47 -0
  447. package/src/authorization/list-read-scope.ts +216 -0
  448. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  449. package/src/authorization/model/agent.ts +64 -0
  450. package/src/authorization/model/agent_channel.ts +49 -0
  451. package/src/authorization/model/agent_execution.ts +33 -0
  452. package/src/authorization/model/agent_instance.ts +66 -0
  453. package/src/authorization/model/agent_share.ts +40 -0
  454. package/src/authorization/model/api_key.ts +28 -0
  455. package/src/authorization/model/artifact.ts +38 -0
  456. package/src/authorization/model/channel_app.ts +39 -0
  457. package/src/authorization/model/default-of.ts +99 -0
  458. package/src/authorization/model/environment.ts +48 -0
  459. package/src/authorization/model/execution_context.ts +20 -0
  460. package/src/authorization/model/iam_policy.ts +42 -0
  461. package/src/authorization/model/identity_account.ts +26 -0
  462. package/src/authorization/model/index.ts +108 -0
  463. package/src/authorization/model/mcp_server.ts +59 -0
  464. package/src/authorization/model/memory.ts +27 -0
  465. package/src/authorization/model/oauth_app.ts +42 -0
  466. package/src/authorization/model/organization.ts +55 -0
  467. package/src/authorization/model/plugin.ts +66 -0
  468. package/src/authorization/model/project.ts +47 -0
  469. package/src/authorization/model/rewrite.ts +213 -0
  470. package/src/authorization/model/schedule.ts +40 -0
  471. package/src/authorization/model/session.ts +50 -0
  472. package/src/authorization/model/skill.ts +60 -0
  473. package/src/authorization/model/workflow.ts +60 -0
  474. package/src/authorization/model/workflow_execution.ts +44 -0
  475. package/src/authorization/model/workflow_instance.ts +122 -0
  476. package/src/authorization/organization-directory.ts +114 -0
  477. package/src/authorization/person.ts +68 -0
  478. package/src/authorization/posture.ts +49 -0
  479. package/src/authorization/schedule-fire-caller.ts +91 -0
  480. package/src/authorization/store-test-kit.ts +454 -0
  481. package/src/authorization/tuples.ts +190 -0
  482. package/src/boot/compose.ts +175 -38
  483. package/src/boot/inprocess.ts +108 -30
  484. package/src/domain/agent/controller.ts +11 -0
  485. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  486. package/src/domain/iampolicy/constants.ts +12 -0
  487. package/src/domain/iampolicy/membership.ts +221 -66
  488. package/src/domain/identityaccount/actor.ts +44 -0
  489. package/src/domain/mcpserver/controller.ts +11 -0
  490. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  491. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  492. package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
  493. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  494. package/src/domain/plugin/archive.ts +89 -0
  495. package/src/domain/plugin/constants.ts +53 -0
  496. package/src/domain/plugin/controller.ts +913 -0
  497. package/src/domain/plugin/materialize/agent.ts +186 -0
  498. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  499. package/src/domain/plugin/materialize/identity.ts +67 -0
  500. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  501. package/src/domain/plugin/materialize/plan.ts +124 -0
  502. package/src/domain/plugin/materialize/ports.ts +53 -0
  503. package/src/domain/plugin/materialize/skills.ts +68 -0
  504. package/src/domain/plugin/materialize/workflows.ts +51 -0
  505. package/src/domain/plugin/members.ts +180 -0
  506. package/src/domain/plugin/overlay/documents.ts +78 -0
  507. package/src/domain/plugin/overlay/parse.ts +115 -0
  508. package/src/domain/plugin/overlay/sanitize.ts +149 -0
  509. package/src/domain/plugin/push.ts +1062 -0
  510. package/src/domain/plugin/search-extractor.ts +60 -0
  511. package/src/domain/skill/constants.ts +11 -14
  512. package/src/domain/skill/controller.ts +44 -36
  513. package/src/domain/skill/push.ts +61 -156
  514. package/src/domain/skill/search-extractor.ts +3 -1
  515. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  516. package/src/domain/skill/storage/zip-gate.ts +58 -154
  517. package/src/domain/skill/version-resolution.ts +67 -269
  518. package/src/domain/workflow/controller.ts +38 -4
  519. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  520. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  521. package/src/extensions/__tests__/composed-support.ts +32 -1
  522. package/src/extensions/__tests__/extension-composition.test.ts +35 -0
  523. package/src/extensions/__tests__/list-read-scope.test.ts +245 -3
  524. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  525. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  526. package/src/extensions/authorizer.ts +10 -5
  527. package/src/extensions/drivers.ts +4 -1
  528. package/src/extensions/list-read-scope.ts +116 -16
  529. package/src/extensions/organization-directory.ts +13 -9
  530. package/src/extensions/resource-authorization.ts +34 -0
  531. package/src/extensions/schedule-fire-caller.ts +49 -18
  532. package/src/index.ts +51 -1
  533. package/src/pipeline/__tests__/inherited-authorization-parent.test.ts +51 -0
  534. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  535. package/src/pipeline/apiresource-labels.ts +31 -3
  536. package/src/pipeline/apiresource-meta.ts +37 -0
  537. package/src/pipeline/errors.ts +5 -5
  538. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  539. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
  540. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  541. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  542. package/src/pipeline/steps/authorization-facts.ts +131 -0
  543. package/src/pipeline/steps/authorization-tuples.ts +7 -28
  544. package/src/pipeline/steps/delete.ts +11 -3
  545. package/src/pipeline/steps/duplicate.ts +8 -2
  546. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  547. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  548. package/src/pipeline/steps/helpers.ts +4 -1
  549. package/src/pipeline/steps/index-search.ts +28 -15
  550. package/src/pipeline/steps/load-existing.ts +12 -3
  551. package/src/pipeline/steps/references.ts +36 -2
  552. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  553. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  554. package/src/pipeline/steps/shapes.ts +31 -0
  555. package/src/pipeline/steps/slug.ts +7 -2
  556. package/src/pipeline/steps/validate-visibility.ts +9 -2
  557. package/src/pipeline/steps/validation.ts +3 -1
  558. package/src/pipeline/steps/version-archive.ts +225 -0
  559. package/src/pipeline/steps/version-history.ts +362 -0
  560. package/src/pipeline/steps/visibility-gates.ts +12 -9
  561. package/src/query/README.md +1 -1
  562. package/src/query/search/__tests__/criteria.test.ts +6 -7
  563. package/src/query/search/__tests__/query-store.test.ts +9 -2
  564. package/src/query/search/__tests__/registry.test.ts +6 -4
  565. package/src/query/search/registry.ts +6 -1
  566. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  567. package/src/temporal/schedule/run-starter.ts +31 -8
  568. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  569. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  570. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -1,139 +1,38 @@
1
1
  /**
2
- * Skill artifact store — ports pkg/domain/skill/storage/artifact_storage.go.
3
- * Content-addressed, write-once, never garbage-collected (OD-5): artifacts
4
- * live at {storagePath}/skills/{sha256}.zip, byte-identical to Go's paths —
5
- * at cutover the TS server inherits a Go-written storage directory and must
6
- * serve its artifacts in place. There is deliberately NO delete method on
7
- * the interface: historical versions stay downloadable through the storage
8
- * keys listVersions exposes.
2
+ * Skill artifact store — the `skills/` instance of the content-addressed
3
+ * archive store (src/archive/content-store.ts). Artifacts live at
4
+ * {storagePath}/skills/{sha256}.zip, byte-identical to the retired Go
5
+ * server's paths: at cutover the TS server inherited a Go-written storage
6
+ * directory and serves its artifacts in place. Write-once, never
7
+ * garbage-collected (OD-5): there is deliberately NO delete method, so the
8
+ * storage keys listVersions exposes stay downloadable.
9
9
  *
10
- * Since O5 (20260827.02, blueprint 03 §6b) this is a DOMAIN PORT layered
11
- * over the one ArtifactStorage blob driver (the Q2 gate ruling): the
12
- * driver stores blobs; this module owns the keys, the write-once posture,
13
- * and the not-found vocabulary. The compose root hands it a PER-DOMAIN
14
- * driver instance rooted at storagePath (the Q2b ruling) — skill artifacts
15
- * never silently follow the generic artifact store's backend selection.
10
+ * Since O5 (20260827.02, blueprint 03 §6b) this is a DOMAIN PORT over the
11
+ * one ArtifactStorage blob driver (the Q2 gate ruling); the compose root
12
+ * hands it a PER-DOMAIN driver instance rooted at storagePath (Q2b), so
13
+ * skill artifacts never silently follow the generic artifact store's
14
+ * backend selection. The port's implementation moved to src/archive when
15
+ * plugins needed the identical shape under `plugins/`; the names exported
16
+ * here are the skill domain's and every consumer keeps them.
16
17
  *
17
18
  * Proven by __tests__/artifact-storage.test.ts and the skill conformance
18
19
  * suite's getArtifact/round-trip tests.
19
20
  */
20
- import path from "node:path";
21
-
22
21
  import type { ArtifactStorage } from "../../../artifactstorage/artifact-storage.js";
23
- import { ArtifactStorageNotFoundError } from "../../../artifactstorage/artifact-storage.js";
22
+ import type { ContentAddressedArchiveStore } from "../../../archive/content-store.js";
23
+ import { newContentAddressedArchiveStore } from "../../../archive/content-store.js";
24
24
 
25
- /**
26
- * Storage abstraction for skill artifacts (Go ArtifactStorage). The
27
- * interface exists for the same reason as Go's: cloud uses R2 behind the
28
- * identical surface, and the controller must not know which one it holds.
29
- */
30
- export interface SkillArtifactStorage {
31
- /** Saves an artifact under its content hash; returns the storage key. */
32
- store(hash: string, data: Uint8Array): Promise<string>;
33
- /** Loads an artifact by storage key; throws ArtifactNotFoundError if absent. */
34
- get(storageKey: string): Promise<Uint8Array>;
35
- /** Whether an artifact with this content hash already exists (dedupe). */
36
- exists(hash: string): Promise<boolean>;
37
- /** The storage key for a hash, without storing ("skills/<hash>.zip"). */
38
- getStorageKey(hash: string): string;
39
- /** The stored artifact's byte size via stat — never loads content. */
40
- size(storageKey: string): Promise<number>;
41
- }
25
+ export { ArtifactNotFoundError } from "../../../archive/content-store.js";
42
26
 
43
- /**
44
- * A storage key that addresses nothing inside the store — missing file OR
45
- * a traversal-shaped key (both render as Go's "artifact not found: %s";
46
- * distinguishing them would tell a probing caller which escapes exist).
47
- */
48
- export class ArtifactNotFoundError extends Error {
49
- constructor(storageKey: string) {
50
- super(`artifact not found: ${storageKey}`);
51
- this.name = "ArtifactNotFoundError";
52
- }
53
- }
27
+ /** Storage abstraction for skill artifacts (Go ArtifactStorage). */
28
+ export type SkillArtifactStorage = ContentAddressedArchiveStore;
54
29
 
55
- /** Skill artifacts are zip archives; the driver stores the honest type. */
56
- const SKILL_ARTIFACT_CONTENT_TYPE = "application/zip";
30
+ /** The key prefix shared with cloud R2 and the download lane's containment check. */
31
+ export const SKILL_ARTIFACT_KEY_PREFIX = "skills/";
57
32
 
58
- /**
59
- * The skill store over a blob driver. Object-literal factory rather than a
60
- * class: all state is the captured driver, and the seam-adapter shape
61
- * matches runner-credential-provider.ts (the O5 house style for ports).
62
- */
33
+ /** The skill store over a blob driver: "skills/<hash>.zip". */
63
34
  export function newSkillArtifactStorage(
64
35
  driver: ArtifactStorage,
65
36
  ): SkillArtifactStorage {
66
- return {
67
- /**
68
- * "skills/<hash>.zip" — the relative key format shared with cloud R2.
69
- * Deliberately a LITERAL forward-slash join, not path.join: the key is
70
- * a wire-visible identifier (status.artifact_storage_key, download
71
- * URLs, the lane's "skills/" prefix check), and Windows support
72
- * arrives only through this server (#24) — path.join would mint
73
- * backslash keys there that the download lane could never serve.
74
- */
75
- getStorageKey(hash: string): string {
76
- return `skills/${hash}.zip`;
77
- },
78
-
79
- async store(hash: string, data: Uint8Array): Promise<string> {
80
- const storageKey = this.getStorageKey(hash);
81
- await driver.upload(storageKey, data, SKILL_ARTIFACT_CONTENT_TYPE);
82
- return storageKey;
83
- },
84
-
85
- async get(storageKey: string): Promise<Uint8Array> {
86
- if (keyEscapesStore(storageKey)) {
87
- throw new ArtifactNotFoundError(storageKey);
88
- }
89
- try {
90
- return await driver.download(storageKey);
91
- } catch (error) {
92
- if (error instanceof ArtifactStorageNotFoundError) {
93
- throw new ArtifactNotFoundError(storageKey);
94
- }
95
- throw new Error(
96
- `failed to read artifact: ${error instanceof Error ? error.message : String(error)}`,
97
- );
98
- }
99
- },
100
-
101
- async exists(hash: string): Promise<boolean> {
102
- return driver.exists(this.getStorageKey(hash));
103
- },
104
-
105
- async size(storageKey: string): Promise<number> {
106
- if (keyEscapesStore(storageKey)) {
107
- throw new ArtifactNotFoundError(storageKey);
108
- }
109
- try {
110
- return await driver.size(storageKey);
111
- } catch (error) {
112
- if (error instanceof ArtifactStorageNotFoundError) {
113
- throw new ArtifactNotFoundError(storageKey);
114
- }
115
- throw new Error(
116
- `failed to stat artifact: ${error instanceof Error ? error.message : String(error)}`,
117
- );
118
- }
119
- },
120
- };
121
- }
122
-
123
- /**
124
- * The domain's own traversal guard (Go resolveWithinRoot, kept HERE per
125
- * "the domain owns keys"): a client-supplied storage key that resolves
126
- * outside the store addresses nothing inside it, and must collapse to the
127
- * same not-found as a missing file BEFORE the driver sees it — the
128
- * driver's own containment refusal is a distinguishable error, and
129
- * distinguishing them would tell a probing caller which escapes exist.
130
- * Lexical, against a fixed virtual root, so the judgment is identical on
131
- * every backend rather than an accident of the local driver's directory.
132
- */
133
- function keyEscapesStore(storageKey: string): boolean {
134
- const virtualRoot = path.resolve(path.sep, "skill-store");
135
- const resolved = path.resolve(virtualRoot, storageKey);
136
- return (
137
- resolved !== virtualRoot && !resolved.startsWith(virtualRoot + path.sep)
138
- );
37
+ return newContentAddressedArchiveStore(driver, SKILL_ARTIFACT_KEY_PREFIX);
139
38
  }
@@ -3,10 +3,15 @@
3
3
  * arm-for-arm. Validates an uploaded artifact (size caps, ZIP-bomb
4
4
  * budgets, entry-count and filename rules, root-SKILL.md presence with the
5
5
  * #452 hint), extracts SKILL.md IN MEMORY ONLY (never to disk), and parses
6
- * its frontmatter. Structural parsing rides @stigmer/zip-structure
7
- * (central-directory-based, issues #450/#567); the safearchive-parity
8
- * entry pre-filter runs first (prefilter.ts, sub-project DD-001) exactly
9
- * as Go's reader rewrites its entry list before validation.
6
+ * its frontmatter.
7
+ *
8
+ * The kind-agnostic half (open, hash, prefilter, structural walk, capped
9
+ * inflate with CRC) is src/archive's, shared with the plugin gate since
10
+ * plugins are pushed as archives too; this module composes it and owns
11
+ * what is a SKILL's: the root-SKILL.md rule, the 1 MB document cap, the
12
+ * frontmatter parse, and every sentence below. The observable error order
13
+ * is the Go gate's exactly: the structural walk tracks SKILL.md placement
14
+ * in the same pass it validates, and rules on presence last.
10
15
  *
11
16
  * Error strings are wire-visible contract (the push pipeline wraps them
12
17
  * into the InvalidArgument "failed to extract SKILL.md: ..." arm), pinned
@@ -21,24 +26,22 @@
21
26
  * Proven by __tests__/zip-gate.test.ts and the skill conformance suite's
22
27
  * push-validation negatives (CONFORMANCE_TARGET=local).
23
28
  */
24
- import { createHash } from "node:crypto";
25
- import { inflateRawSync } from "node:zlib";
26
-
27
- import { crc32, parseZipStructure } from "@stigmer/zip-structure";
28
- import type { ZipStructuralEntry } from "@stigmer/zip-structure";
29
-
29
+ import { InflateError, inflateEntry } from "../../../archive/inflate.js";
30
+ import { PLATFORM_ARCHIVE_LIMITS } from "../../../archive/limits.js";
31
+ import {
32
+ openArchive,
33
+ validateArchiveStructure,
34
+ } from "../../../archive/open.js";
35
+ import type { PrefilteredEntry } from "../../../archive/prefilter.js";
30
36
  import {
31
- MAX_COMPRESSION_RATIO,
32
- MAX_FILES,
33
37
  MAX_SKILL_MD_SIZE,
34
- MAX_UNCOMPRESSED_SIZE,
35
38
  MAX_ZIP_SIZE,
36
39
  NESTED_SKILL_MD_HINT,
37
40
  } from "../constants.js";
38
- import { applyEntryPrefilter } from "./prefilter.js";
39
- import type { PrefilteredEntry } from "./prefilter.js";
40
41
  import { parseFrontmatter } from "./frontmatter.js";
41
42
 
43
+ export { calculateHash } from "../../../archive/open.js";
44
+
42
45
  /** Result of a successful gate pass (Go ExtractSkillMdResult). */
43
46
  export interface ExtractSkillMdResult {
44
47
  /** Full SKILL.md content, frontmatter included. */
@@ -51,41 +54,35 @@ export interface ExtractSkillMdResult {
51
54
  readonly description: string;
52
55
  }
53
56
 
54
- /** ZIP compression methods the gate can open (Go registers the same two). */
55
- const METHOD_STORED = 0;
56
- const METHOD_DEFLATED = 8;
57
-
58
57
  /**
59
58
  * Validates the artifact and extracts SKILL.md + frontmatter (Go
60
59
  * ExtractSkillMd). Throws plain Errors with byte-pinned messages; the
61
60
  * push pipeline owns the gRPC code.
62
61
  */
63
62
  export function extractSkillMd(zipData: Uint8Array): ExtractSkillMdResult {
64
- if (zipData.length > MAX_ZIP_SIZE) {
65
- throw new Error(
66
- `ZIP file too large: ${zipData.length} bytes (max: ${MAX_ZIP_SIZE})`,
67
- );
68
- }
63
+ const { hash, entries } = openArchive(zipData, MAX_ZIP_SIZE);
69
64
 
70
- const hash = calculateHash(zipData);
65
+ // SKILL.md must be at the archive root. Nested occurrences are tracked
66
+ // only to make the rejection actionable (the #452 hint), in the same
67
+ // pass the structural checks run so their precedence stays Go's.
68
+ let hasSkillMd = false;
69
+ let hasNestedSkillMd = false;
70
+ validateArchiveStructure(entries, PLATFORM_ARCHIVE_LIMITS, (name) => {
71
+ if (name === "SKILL.md") {
72
+ hasSkillMd = true;
73
+ } else if (name.endsWith("/SKILL.md")) {
74
+ hasNestedSkillMd = true;
75
+ }
76
+ });
71
77
 
72
- let entries: readonly ZipStructuralEntry[];
73
- try {
74
- entries = parseZipStructure(zipData);
75
- } catch {
76
- // Go's zip.NewReader surfaces stdlib ErrFormat here; its text is what
77
- // clients see via the %w chain, so it is pinned verbatim.
78
- throw new Error("invalid ZIP file: zip: not a valid zip file");
78
+ if (!hasSkillMd) {
79
+ if (hasNestedSkillMd) {
80
+ throw new Error(NESTED_SKILL_MD_HINT);
81
+ }
82
+ throw new Error("SKILL.md not found in ZIP archive");
79
83
  }
80
84
 
81
- // safearchive MaximumSecurityMode rewrites the entry list before any
82
- // validation sees it (DD-001) — sanitized names, shadowed/special/8.3
83
- // entries dropped.
84
- const filtered = applyEntryPrefilter(entries);
85
-
86
- validateZipContent(filtered);
87
-
88
- const content = extractSkillMdContent(filtered);
85
+ const content = extractSkillMdContent(entries);
89
86
 
90
87
  let frontmatter;
91
88
  try {
@@ -104,76 +101,10 @@ export function extractSkillMd(zipData: Uint8Array): ExtractSkillMdResult {
104
101
  };
105
102
  }
106
103
 
107
- /**
108
- * Security validation over the (pre-filtered) entry list — Go
109
- * validateZipContent, checks in its exact order: empty archive, file-count
110
- * cap, then per entry SKILL.md placement tracking, filename
111
- * control-character rejection, the running declared-uncompressed budget
112
- * (fail-fast), and the per-file compression-ratio cap; finally the
113
- * root-SKILL.md presence rule with the #452 nested-only hint.
114
- */
115
- function validateZipContent(entries: readonly PrefilteredEntry[]): void {
116
- if (entries.length === 0) {
117
- throw new Error("ZIP file is empty");
118
- }
119
-
120
- if (entries.length > MAX_FILES) {
121
- throw new Error(`too many files in ZIP: ${entries.length} (max: ${MAX_FILES})`);
122
- }
123
-
124
- let totalUncompressedSize = 0;
125
- let hasSkillMd = false;
126
- let hasNestedSkillMd = false;
127
-
128
- for (const { name, entry } of entries) {
129
- // SKILL.md must be at the archive root. Nested occurrences are tracked
130
- // only to make the rejection actionable (below).
131
- if (name === "SKILL.md") {
132
- hasSkillMd = true;
133
- } else if (name.endsWith("/SKILL.md")) {
134
- hasNestedSkillMd = true;
135
- }
136
-
137
- // Reject null bytes and control characters in entry names (code
138
- // points, not UTF-16 units — Go ranges over runes).
139
- for (const ch of name) {
140
- const codePoint = ch.codePointAt(0)!;
141
- if (codePoint < 32 || codePoint === 127) {
142
- throw new Error(`invalid character in filename: ${name}`);
143
- }
144
- }
145
-
146
- // Track the declared uncompressed total (fail fast once exceeded).
147
- totalUncompressedSize += entry.uncompressedSize;
148
- if (totalUncompressedSize > MAX_UNCOMPRESSED_SIZE) {
149
- throw new Error(
150
- `total uncompressed size too large: ${totalUncompressedSize} bytes (max: ${MAX_UNCOMPRESSED_SIZE})`,
151
- );
152
- }
153
-
154
- // Per-file compression ratio (ZIP-bomb guard); integer division as Go.
155
- if (entry.compressedSize > 0) {
156
- const ratio = Math.floor(entry.uncompressedSize / entry.compressedSize);
157
- if (ratio > MAX_COMPRESSION_RATIO) {
158
- throw new Error(
159
- `suspicious compression ratio in ${name}: ${ratio}:1 (max: ${MAX_COMPRESSION_RATIO}:1)`,
160
- );
161
- }
162
- }
163
- }
164
-
165
- if (!hasSkillMd) {
166
- if (hasNestedSkillMd) {
167
- throw new Error(NESTED_SKILL_MD_HINT);
168
- }
169
- throw new Error("SKILL.md not found in ZIP archive");
170
- }
171
- }
172
-
173
104
  /**
174
105
  * Extracts SKILL.md's content in memory (Go extractSkillMdContent): the
175
- * first root-named entry, decompressed under the 1MB cap, CRC-verified
176
- * (Go's reader checks the checksum on every read), UTF-8 decoded.
106
+ * first root-named entry, decompressed under the 1MB cap, CRC-verified,
107
+ * UTF-8 decoded. The typed inflate outcome maps to Go's sentences here.
177
108
  */
178
109
  function extractSkillMdContent(entries: readonly PrefilteredEntry[]): string {
179
110
  for (const { name, entry } of entries) {
@@ -182,41 +113,28 @@ function extractSkillMdContent(entries: readonly PrefilteredEntry[]): string {
182
113
  }
183
114
 
184
115
  let contentBytes: Uint8Array;
185
- switch (entry.compressionMethod) {
186
- case METHOD_STORED:
187
- contentBytes = entry.compressedData;
188
- break;
189
- case METHOD_DEFLATED:
190
- try {
191
- // The cap bounds the ACTUAL inflated output — declared sizes are
192
- // client claims (the ratio check upstream only sees declarations).
193
- contentBytes = new Uint8Array(
194
- inflateRawSync(entry.compressedData, {
195
- maxOutputLength: MAX_SKILL_MD_SIZE + 1,
196
- }),
197
- );
198
- } catch (error) {
199
- if (isOutputLengthError(error)) {
200
- throw new Error(`SKILL.md too large (max: ${MAX_SKILL_MD_SIZE} bytes)`);
201
- }
116
+ try {
117
+ contentBytes = inflateEntry(entry, MAX_SKILL_MD_SIZE);
118
+ } catch (error) {
119
+ if (!(error instanceof InflateError)) {
120
+ throw error;
121
+ }
122
+ switch (error.kind) {
123
+ case "too-large":
202
124
  throw new Error(
203
- `failed to read SKILL.md: ${error instanceof Error ? error.message : String(error)}`,
125
+ `SKILL.md too large (max: ${MAX_SKILL_MD_SIZE} bytes)`,
204
126
  );
127
+ case "read-failed":
128
+ throw new Error(`failed to read SKILL.md: ${error.detail}`);
129
+ case "unsupported-method":
130
+ throw new Error(`failed to open SKILL.md: ${error.detail}`);
131
+ case "checksum":
132
+ throw new Error(`failed to read SKILL.md: ${error.detail}`);
133
+ default: {
134
+ const exhaustive: never = error.kind;
135
+ throw new Error(`unknown inflate failure ${String(exhaustive)}`);
205
136
  }
206
- break;
207
- default:
208
- // Go: File.Open returns ErrAlgorithm for methods without a
209
- // registered decompressor; the text is pinned via the %w chain.
210
- throw new Error("failed to open SKILL.md: zip: unsupported compression algorithm");
211
- }
212
-
213
- if (contentBytes.length > MAX_SKILL_MD_SIZE) {
214
- throw new Error(`SKILL.md too large (max: ${MAX_SKILL_MD_SIZE} bytes)`);
215
- }
216
-
217
- if (crc32(contentBytes) !== entry.crc32) {
218
- // Go's checksumReader: stdlib ErrChecksum via the read-error arm.
219
- throw new Error("failed to read SKILL.md: zip: checksum error");
137
+ }
220
138
  }
221
139
 
222
140
  if (contentBytes.length === 0) {
@@ -228,17 +146,3 @@ function extractSkillMdContent(entries: readonly PrefilteredEntry[]): string {
228
146
 
229
147
  throw new Error("SKILL.md not found in ZIP archive");
230
148
  }
231
-
232
- /** node:zlib's maxOutputLength violation (the output-cap arm). */
233
- function isOutputLengthError(error: unknown): boolean {
234
- return (
235
- error instanceof Error &&
236
- (("code" in error && (error as { code?: string }).code === "ERR_BUFFER_TOO_LARGE") ||
237
- error.message.includes("maxOutputLength"))
238
- );
239
- }
240
-
241
- /** SHA-256 hex of the artifact bytes (Go CalculateHash). */
242
- export function calculateHash(data: Uint8Array): string {
243
- return createHash("sha256").update(data).digest("hex");
244
- }