@stigmer/server 3.15.3-dev.20260914121148 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (680) hide show
  1. package/README.md +3 -3
  2. package/dist/archive/content-store.d.ts +35 -0
  3. package/dist/archive/content-store.d.ts.map +1 -0
  4. package/dist/archive/content-store.js +98 -0
  5. package/dist/archive/content-store.js.map +1 -0
  6. package/dist/archive/inflate.d.ts +22 -0
  7. package/dist/archive/inflate.d.ts.map +1 -0
  8. package/dist/archive/inflate.js +75 -0
  9. package/dist/archive/inflate.js.map +1 -0
  10. package/dist/archive/limits.d.ts +33 -0
  11. package/dist/archive/limits.d.ts.map +1 -0
  12. package/dist/archive/limits.js +31 -0
  13. package/dist/archive/limits.js.map +1 -0
  14. package/dist/archive/open.d.ts +24 -0
  15. package/dist/archive/open.d.ts.map +1 -0
  16. package/dist/archive/open.js +93 -0
  17. package/dist/archive/open.js.map +1 -0
  18. package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
  19. package/dist/archive/prefilter.d.ts.map +1 -0
  20. package/dist/archive/prefilter.js.map +1 -0
  21. package/dist/archive/write.d.ts +8 -0
  22. package/dist/archive/write.d.ts.map +1 -0
  23. package/dist/archive/write.js +44 -0
  24. package/dist/archive/write.js.map +1 -0
  25. package/dist/authorization/authorizer.d.ts +98 -0
  26. package/dist/authorization/authorizer.d.ts.map +1 -0
  27. package/dist/authorization/authorizer.js +156 -0
  28. package/dist/authorization/authorizer.js.map +1 -0
  29. package/dist/authorization/derived-tuples.d.ts +42 -0
  30. package/dist/authorization/derived-tuples.d.ts.map +1 -0
  31. package/dist/authorization/derived-tuples.js +240 -0
  32. package/dist/authorization/derived-tuples.js.map +1 -0
  33. package/dist/authorization/evaluator.d.ts +66 -0
  34. package/dist/authorization/evaluator.d.ts.map +1 -0
  35. package/dist/authorization/evaluator.js +153 -0
  36. package/dist/authorization/evaluator.js.map +1 -0
  37. package/dist/authorization/facts.d.ts +29 -0
  38. package/dist/authorization/facts.d.ts.map +1 -0
  39. package/dist/authorization/facts.js +17 -0
  40. package/dist/authorization/facts.js.map +1 -0
  41. package/dist/authorization/lane-admission.d.ts +50 -0
  42. package/dist/authorization/lane-admission.d.ts.map +1 -0
  43. package/dist/authorization/lane-admission.js +13 -0
  44. package/dist/authorization/lane-admission.js.map +1 -0
  45. package/dist/authorization/list-read-scope.d.ts +18 -0
  46. package/dist/authorization/list-read-scope.d.ts.map +1 -0
  47. package/dist/authorization/list-read-scope.js +155 -0
  48. package/dist/authorization/list-read-scope.js.map +1 -0
  49. package/dist/authorization/model/agent.d.ts +2 -0
  50. package/dist/authorization/model/agent.d.ts.map +1 -0
  51. package/dist/authorization/model/agent.js +42 -0
  52. package/dist/authorization/model/agent.js.map +1 -0
  53. package/dist/authorization/model/agent_channel.d.ts +2 -0
  54. package/dist/authorization/model/agent_channel.d.ts.map +1 -0
  55. package/dist/authorization/model/agent_channel.js +38 -0
  56. package/dist/authorization/model/agent_channel.js.map +1 -0
  57. package/dist/authorization/model/agent_execution.d.ts +2 -0
  58. package/dist/authorization/model/agent_execution.d.ts.map +1 -0
  59. package/dist/authorization/model/agent_execution.js +25 -0
  60. package/dist/authorization/model/agent_execution.js.map +1 -0
  61. package/dist/authorization/model/agent_instance.d.ts +2 -0
  62. package/dist/authorization/model/agent_instance.d.ts.map +1 -0
  63. package/dist/authorization/model/agent_instance.js +47 -0
  64. package/dist/authorization/model/agent_instance.js.map +1 -0
  65. package/dist/authorization/model/agent_share.d.ts +2 -0
  66. package/dist/authorization/model/agent_share.d.ts.map +1 -0
  67. package/dist/authorization/model/agent_share.js +29 -0
  68. package/dist/authorization/model/agent_share.js.map +1 -0
  69. package/dist/authorization/model/api_key.d.ts +2 -0
  70. package/dist/authorization/model/api_key.d.ts.map +1 -0
  71. package/dist/authorization/model/api_key.js +27 -0
  72. package/dist/authorization/model/api_key.js.map +1 -0
  73. package/dist/authorization/model/artifact.d.ts +2 -0
  74. package/dist/authorization/model/artifact.d.ts.map +1 -0
  75. package/dist/authorization/model/artifact.js +27 -0
  76. package/dist/authorization/model/artifact.js.map +1 -0
  77. package/dist/authorization/model/channel_app.d.ts +2 -0
  78. package/dist/authorization/model/channel_app.d.ts.map +1 -0
  79. package/dist/authorization/model/channel_app.js +28 -0
  80. package/dist/authorization/model/channel_app.js.map +1 -0
  81. package/dist/authorization/model/default-of.d.ts +38 -0
  82. package/dist/authorization/model/default-of.d.ts.map +1 -0
  83. package/dist/authorization/model/default-of.js +39 -0
  84. package/dist/authorization/model/default-of.js.map +1 -0
  85. package/dist/authorization/model/environment.d.ts +2 -0
  86. package/dist/authorization/model/environment.d.ts.map +1 -0
  87. package/dist/authorization/model/environment.js +33 -0
  88. package/dist/authorization/model/environment.js.map +1 -0
  89. package/dist/authorization/model/execution_context.d.ts +2 -0
  90. package/dist/authorization/model/execution_context.d.ts.map +1 -0
  91. package/dist/authorization/model/execution_context.js +19 -0
  92. package/dist/authorization/model/execution_context.js.map +1 -0
  93. package/dist/authorization/model/iam_policy.d.ts +2 -0
  94. package/dist/authorization/model/iam_policy.d.ts.map +1 -0
  95. package/dist/authorization/model/iam_policy.js +31 -0
  96. package/dist/authorization/model/iam_policy.js.map +1 -0
  97. package/dist/authorization/model/identity_account.d.ts +2 -0
  98. package/dist/authorization/model/identity_account.d.ts.map +1 -0
  99. package/dist/authorization/model/identity_account.js +25 -0
  100. package/dist/authorization/model/identity_account.js.map +1 -0
  101. package/dist/authorization/model/index.d.ts +36 -0
  102. package/dist/authorization/model/index.d.ts.map +1 -0
  103. package/dist/authorization/model/index.js +72 -0
  104. package/dist/authorization/model/index.js.map +1 -0
  105. package/dist/authorization/model/mcp_server.d.ts +2 -0
  106. package/dist/authorization/model/mcp_server.d.ts.map +1 -0
  107. package/dist/authorization/model/mcp_server.js +37 -0
  108. package/dist/authorization/model/mcp_server.js.map +1 -0
  109. package/dist/authorization/model/memory.d.ts +2 -0
  110. package/dist/authorization/model/memory.d.ts.map +1 -0
  111. package/dist/authorization/model/memory.js +26 -0
  112. package/dist/authorization/model/memory.js.map +1 -0
  113. package/dist/authorization/model/oauth_app.d.ts +2 -0
  114. package/dist/authorization/model/oauth_app.d.ts.map +1 -0
  115. package/dist/authorization/model/oauth_app.js +30 -0
  116. package/dist/authorization/model/oauth_app.js.map +1 -0
  117. package/dist/authorization/model/organization.d.ts +2 -0
  118. package/dist/authorization/model/organization.d.ts.map +1 -0
  119. package/dist/authorization/model/organization.js +54 -0
  120. package/dist/authorization/model/organization.js.map +1 -0
  121. package/dist/authorization/model/plugin.d.ts +2 -0
  122. package/dist/authorization/model/plugin.d.ts.map +1 -0
  123. package/dist/authorization/model/plugin.js +44 -0
  124. package/dist/authorization/model/plugin.js.map +1 -0
  125. package/dist/authorization/model/project.d.ts +2 -0
  126. package/dist/authorization/model/project.d.ts.map +1 -0
  127. package/dist/authorization/model/project.js +32 -0
  128. package/dist/authorization/model/project.js.map +1 -0
  129. package/dist/authorization/model/rewrite.d.ts +127 -0
  130. package/dist/authorization/model/rewrite.d.ts.map +1 -0
  131. package/dist/authorization/model/rewrite.js +82 -0
  132. package/dist/authorization/model/rewrite.js.map +1 -0
  133. package/dist/authorization/model/schedule.d.ts +2 -0
  134. package/dist/authorization/model/schedule.d.ts.map +1 -0
  135. package/dist/authorization/model/schedule.js +29 -0
  136. package/dist/authorization/model/schedule.js.map +1 -0
  137. package/dist/authorization/model/session.d.ts +2 -0
  138. package/dist/authorization/model/session.d.ts.map +1 -0
  139. package/dist/authorization/model/session.js +38 -0
  140. package/dist/authorization/model/session.js.map +1 -0
  141. package/dist/authorization/model/skill.d.ts +2 -0
  142. package/dist/authorization/model/skill.d.ts.map +1 -0
  143. package/dist/authorization/model/skill.js +38 -0
  144. package/dist/authorization/model/skill.js.map +1 -0
  145. package/dist/authorization/model/workflow.d.ts +2 -0
  146. package/dist/authorization/model/workflow.d.ts.map +1 -0
  147. package/dist/authorization/model/workflow.js +38 -0
  148. package/dist/authorization/model/workflow.js.map +1 -0
  149. package/dist/authorization/model/workflow_execution.d.ts +2 -0
  150. package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
  151. package/dist/authorization/model/workflow_execution.js +32 -0
  152. package/dist/authorization/model/workflow_execution.js.map +1 -0
  153. package/dist/authorization/model/workflow_instance.d.ts +2 -0
  154. package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
  155. package/dist/authorization/model/workflow_instance.js +92 -0
  156. package/dist/authorization/model/workflow_instance.js.map +1 -0
  157. package/dist/authorization/organization-directory.d.ts +13 -0
  158. package/dist/authorization/organization-directory.d.ts.map +1 -0
  159. package/dist/authorization/organization-directory.js +83 -0
  160. package/dist/authorization/organization-directory.js.map +1 -0
  161. package/dist/authorization/person.d.ts +42 -0
  162. package/dist/authorization/person.d.ts.map +1 -0
  163. package/dist/authorization/person.js +19 -0
  164. package/dist/authorization/person.js.map +1 -0
  165. package/dist/authorization/posture.d.ts +38 -0
  166. package/dist/authorization/posture.d.ts.map +1 -0
  167. package/dist/authorization/posture.js +7 -0
  168. package/dist/authorization/posture.js.map +1 -0
  169. package/dist/authorization/schedule-fire-caller.d.ts +12 -0
  170. package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
  171. package/dist/authorization/schedule-fire-caller.js +67 -0
  172. package/dist/authorization/schedule-fire-caller.js.map +1 -0
  173. package/dist/authorization/store-test-kit.d.ts +68 -0
  174. package/dist/authorization/store-test-kit.d.ts.map +1 -0
  175. package/dist/authorization/store-test-kit.js +311 -0
  176. package/dist/authorization/store-test-kit.js.map +1 -0
  177. package/dist/authorization/tuples.d.ts +115 -0
  178. package/dist/authorization/tuples.d.ts.map +1 -0
  179. package/dist/authorization/tuples.js +83 -0
  180. package/dist/authorization/tuples.js.map +1 -0
  181. package/dist/boot/compose.d.ts.map +1 -1
  182. package/dist/boot/compose.js +220 -43
  183. package/dist/boot/compose.js.map +1 -1
  184. package/dist/boot/inprocess.d.ts +12 -0
  185. package/dist/boot/inprocess.d.ts.map +1 -1
  186. package/dist/boot/inprocess.js +68 -21
  187. package/dist/boot/inprocess.js.map +1 -1
  188. package/dist/domain/agent/controller.d.ts.map +1 -1
  189. package/dist/domain/agent/controller.js +9 -0
  190. package/dist/domain/agent/controller.js.map +1 -1
  191. package/dist/domain/executioncontext/resolve-values-for-caller.d.ts +33 -14
  192. package/dist/domain/executioncontext/resolve-values-for-caller.d.ts.map +1 -1
  193. package/dist/domain/executioncontext/resolve-values-for-caller.js +32 -8
  194. package/dist/domain/executioncontext/resolve-values-for-caller.js.map +1 -1
  195. package/dist/domain/iampolicy/constants.d.ts +11 -0
  196. package/dist/domain/iampolicy/constants.d.ts.map +1 -1
  197. package/dist/domain/iampolicy/constants.js +11 -0
  198. package/dist/domain/iampolicy/constants.js.map +1 -1
  199. package/dist/domain/iampolicy/membership.d.ts +72 -1
  200. package/dist/domain/iampolicy/membership.d.ts.map +1 -1
  201. package/dist/domain/iampolicy/membership.js +141 -56
  202. package/dist/domain/iampolicy/membership.js.map +1 -1
  203. package/dist/domain/identityaccount/actor.d.ts +41 -0
  204. package/dist/domain/identityaccount/actor.d.ts.map +1 -0
  205. package/dist/domain/identityaccount/actor.js +34 -0
  206. package/dist/domain/identityaccount/actor.js.map +1 -0
  207. package/dist/domain/identityaccount/resolve.d.ts +19 -0
  208. package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
  209. package/dist/domain/identityaccount/resolve.js +12 -0
  210. package/dist/domain/identityaccount/resolve.js.map +1 -1
  211. package/dist/domain/mcpserver/connect-execution-id.d.ts +5 -0
  212. package/dist/domain/mcpserver/connect-execution-id.d.ts.map +1 -0
  213. package/dist/domain/mcpserver/connect-execution-id.js +32 -0
  214. package/dist/domain/mcpserver/connect-execution-id.js.map +1 -0
  215. package/dist/domain/mcpserver/connect.d.ts +28 -2
  216. package/dist/domain/mcpserver/connect.d.ts.map +1 -1
  217. package/dist/domain/mcpserver/connect.js +27 -7
  218. package/dist/domain/mcpserver/connect.js.map +1 -1
  219. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  220. package/dist/domain/mcpserver/controller.js +9 -0
  221. package/dist/domain/mcpserver/controller.js.map +1 -1
  222. package/dist/domain/mcpserver/engine.d.ts +9 -3
  223. package/dist/domain/mcpserver/engine.d.ts.map +1 -1
  224. package/dist/domain/mcpserver/engine.js.map +1 -1
  225. package/dist/domain/mcpserver/start-connect.js +1 -1
  226. package/dist/domain/mcpserver/start-connect.js.map +1 -1
  227. package/dist/domain/platform/controller.d.ts +24 -11
  228. package/dist/domain/platform/controller.d.ts.map +1 -1
  229. package/dist/domain/platform/controller.js.map +1 -1
  230. package/dist/domain/plugin/archive.d.ts +37 -0
  231. package/dist/domain/plugin/archive.d.ts.map +1 -0
  232. package/dist/domain/plugin/archive.js +50 -0
  233. package/dist/domain/plugin/archive.js.map +1 -0
  234. package/dist/domain/plugin/constants.d.ts +38 -0
  235. package/dist/domain/plugin/constants.d.ts.map +1 -0
  236. package/dist/domain/plugin/constants.js +46 -0
  237. package/dist/domain/plugin/constants.js.map +1 -0
  238. package/dist/domain/plugin/controller.d.ts +25 -0
  239. package/dist/domain/plugin/controller.d.ts.map +1 -0
  240. package/dist/domain/plugin/controller.js +493 -0
  241. package/dist/domain/plugin/controller.js.map +1 -0
  242. package/dist/domain/plugin/materialize/agent.d.ts +13 -0
  243. package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
  244. package/dist/domain/plugin/materialize/agent.js +128 -0
  245. package/dist/domain/plugin/materialize/agent.js.map +1 -0
  246. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
  247. package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
  248. package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
  249. package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
  250. package/dist/domain/plugin/materialize/identity.d.ts +28 -0
  251. package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
  252. package/dist/domain/plugin/materialize/identity.js +40 -0
  253. package/dist/domain/plugin/materialize/identity.js.map +1 -0
  254. package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
  255. package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
  256. package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
  257. package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
  258. package/dist/domain/plugin/materialize/plan.d.ts +24 -0
  259. package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
  260. package/dist/domain/plugin/materialize/plan.js +77 -0
  261. package/dist/domain/plugin/materialize/plan.js.map +1 -0
  262. package/dist/domain/plugin/materialize/ports.d.ts +42 -0
  263. package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
  264. package/dist/domain/plugin/materialize/ports.js +2 -0
  265. package/dist/domain/plugin/materialize/ports.js.map +1 -0
  266. package/dist/domain/plugin/materialize/skills.d.ts +12 -0
  267. package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
  268. package/dist/domain/plugin/materialize/skills.js +44 -0
  269. package/dist/domain/plugin/materialize/skills.js.map +1 -0
  270. package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
  271. package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
  272. package/dist/domain/plugin/materialize/workflows.js +31 -0
  273. package/dist/domain/plugin/materialize/workflows.js.map +1 -0
  274. package/dist/domain/plugin/members.d.ts +42 -0
  275. package/dist/domain/plugin/members.d.ts.map +1 -0
  276. package/dist/domain/plugin/members.js +97 -0
  277. package/dist/domain/plugin/members.js.map +1 -0
  278. package/dist/domain/plugin/overlay/documents.d.ts +31 -0
  279. package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
  280. package/dist/domain/plugin/overlay/documents.js +38 -0
  281. package/dist/domain/plugin/overlay/documents.js.map +1 -0
  282. package/dist/domain/plugin/overlay/parse.d.ts +16 -0
  283. package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
  284. package/dist/domain/plugin/overlay/parse.js +79 -0
  285. package/dist/domain/plugin/overlay/parse.js.map +1 -0
  286. package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
  287. package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
  288. package/dist/domain/plugin/overlay/sanitize.js +103 -0
  289. package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
  290. package/dist/domain/plugin/push.d.ts +133 -0
  291. package/dist/domain/plugin/push.d.ts.map +1 -0
  292. package/dist/domain/plugin/push.js +800 -0
  293. package/dist/domain/plugin/push.js.map +1 -0
  294. package/dist/domain/plugin/search-extractor.d.ts +3 -0
  295. package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
  296. package/dist/domain/plugin/search-extractor.js +41 -0
  297. package/dist/domain/plugin/search-extractor.js.map +1 -0
  298. package/dist/domain/skill/constants.d.ts +6 -11
  299. package/dist/domain/skill/constants.d.ts.map +1 -1
  300. package/dist/domain/skill/constants.js +6 -11
  301. package/dist/domain/skill/constants.js.map +1 -1
  302. package/dist/domain/skill/controller.d.ts.map +1 -1
  303. package/dist/domain/skill/controller.js +33 -30
  304. package/dist/domain/skill/controller.js.map +1 -1
  305. package/dist/domain/skill/push.d.ts +9 -10
  306. package/dist/domain/skill/push.d.ts.map +1 -1
  307. package/dist/domain/skill/push.js +53 -122
  308. package/dist/domain/skill/push.js.map +1 -1
  309. package/dist/domain/skill/search-extractor.d.ts.map +1 -1
  310. package/dist/domain/skill/search-extractor.js.map +1 -1
  311. package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
  312. package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
  313. package/dist/domain/skill/storage/artifact-storage.js +6 -103
  314. package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
  315. package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
  316. package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
  317. package/dist/domain/skill/storage/zip-gate.js +56 -126
  318. package/dist/domain/skill/storage/zip-gate.js.map +1 -1
  319. package/dist/domain/skill/version-resolution.d.ts +5 -5
  320. package/dist/domain/skill/version-resolution.d.ts.map +1 -1
  321. package/dist/domain/skill/version-resolution.js +34 -216
  322. package/dist/domain/skill/version-resolution.js.map +1 -1
  323. package/dist/domain/workflow/controller.d.ts.map +1 -1
  324. package/dist/domain/workflow/controller.js +30 -3
  325. package/dist/domain/workflow/controller.js.map +1 -1
  326. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
  327. package/dist/domain/workflowexecution/phases.d.ts +21 -0
  328. package/dist/domain/workflowexecution/phases.d.ts.map +1 -0
  329. package/dist/domain/workflowexecution/phases.js +31 -0
  330. package/dist/domain/workflowexecution/phases.js.map +1 -0
  331. package/dist/extensions/authorizer.d.ts +10 -5
  332. package/dist/extensions/authorizer.d.ts.map +1 -1
  333. package/dist/extensions/drivers.d.ts +4 -1
  334. package/dist/extensions/drivers.d.ts.map +1 -1
  335. package/dist/extensions/list-read-scope.d.ts +47 -20
  336. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  337. package/dist/extensions/list-read-scope.js +20 -24
  338. package/dist/extensions/list-read-scope.js.map +1 -1
  339. package/dist/extensions/organization-directory.d.ts +13 -9
  340. package/dist/extensions/organization-directory.d.ts.map +1 -1
  341. package/dist/extensions/organization-directory.js.map +1 -1
  342. package/dist/extensions/resource-authorization.d.ts +33 -0
  343. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  344. package/dist/extensions/schedule-fire-caller.d.ts +45 -18
  345. package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
  346. package/dist/extensions/schedule-fire-caller.js +12 -1
  347. package/dist/extensions/schedule-fire-caller.js.map +1 -1
  348. package/dist/identity/oidc-verifier.js +8 -1
  349. package/dist/identity/oidc-verifier.js.map +1 -1
  350. package/dist/index.d.ts +10 -0
  351. package/dist/index.d.ts.map +1 -1
  352. package/dist/index.js +8 -0
  353. package/dist/index.js.map +1 -1
  354. package/dist/pipeline/apiresource-labels.d.ts +23 -3
  355. package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
  356. package/dist/pipeline/apiresource-labels.js +20 -0
  357. package/dist/pipeline/apiresource-labels.js.map +1 -1
  358. package/dist/pipeline/apiresource-meta.d.ts +15 -0
  359. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  360. package/dist/pipeline/apiresource-meta.js +34 -0
  361. package/dist/pipeline/apiresource-meta.js.map +1 -1
  362. package/dist/pipeline/errors.d.ts.map +1 -1
  363. package/dist/pipeline/errors.js.map +1 -1
  364. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  365. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  366. package/dist/pipeline/steps/authorization-facts.js +100 -0
  367. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  368. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  369. package/dist/pipeline/steps/delete.js +1 -1
  370. package/dist/pipeline/steps/delete.js.map +1 -1
  371. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  372. package/dist/pipeline/steps/duplicate.js.map +1 -1
  373. package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
  374. package/dist/pipeline/steps/guard-memory-capture.js +5 -3
  375. package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
  376. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  377. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  378. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  379. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  380. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  381. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  382. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  383. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  384. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  385. package/dist/pipeline/steps/helpers.js.map +1 -1
  386. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  387. package/dist/pipeline/steps/index-search.js.map +1 -1
  388. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  389. package/dist/pipeline/steps/load-existing.js +1 -1
  390. package/dist/pipeline/steps/load-existing.js.map +1 -1
  391. package/dist/pipeline/steps/references.d.ts +16 -0
  392. package/dist/pipeline/steps/references.d.ts.map +1 -1
  393. package/dist/pipeline/steps/references.js +18 -0
  394. package/dist/pipeline/steps/references.js.map +1 -1
  395. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  396. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  397. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  398. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  399. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  400. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  401. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  402. package/dist/pipeline/steps/slug.js.map +1 -1
  403. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  404. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  405. package/dist/pipeline/steps/validate-visibility.js +6 -1
  406. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  407. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  408. package/dist/pipeline/steps/validation.js.map +1 -1
  409. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  410. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  411. package/dist/pipeline/steps/version-archive.js +129 -0
  412. package/dist/pipeline/steps/version-archive.js.map +1 -0
  413. package/dist/pipeline/steps/version-history.d.ts +49 -0
  414. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  415. package/dist/pipeline/steps/version-history.js +229 -0
  416. package/dist/pipeline/steps/version-history.js.map +1 -0
  417. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  418. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  419. package/dist/pipeline/steps/visibility-gates.js +7 -2
  420. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  421. package/dist/query/search/registry.d.ts.map +1 -1
  422. package/dist/query/search/registry.js +2 -0
  423. package/dist/query/search/registry.js.map +1 -1
  424. package/dist/runnerauth/bound-execution.d.ts +27 -0
  425. package/dist/runnerauth/bound-execution.d.ts.map +1 -0
  426. package/dist/runnerauth/bound-execution.js +137 -0
  427. package/dist/runnerauth/bound-execution.js.map +1 -0
  428. package/dist/runnerauth/built-in-runner-credential-provider.d.ts +28 -0
  429. package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -0
  430. package/dist/runnerauth/built-in-runner-credential-provider.js +217 -0
  431. package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -0
  432. package/dist/runnerauth/constants.d.ts +63 -0
  433. package/dist/runnerauth/constants.d.ts.map +1 -0
  434. package/dist/runnerauth/constants.js +63 -0
  435. package/dist/runnerauth/constants.js.map +1 -0
  436. package/dist/runnerauth/dispatch-credential.d.ts +38 -0
  437. package/dist/runnerauth/dispatch-credential.d.ts.map +1 -0
  438. package/dist/runnerauth/dispatch-credential.js +17 -0
  439. package/dist/runnerauth/dispatch-credential.js.map +1 -0
  440. package/dist/runnerauth/runner-credential-provider.d.ts +49 -11
  441. package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
  442. package/dist/runnerauth/runner-credential-provider.js +16 -4
  443. package/dist/runnerauth/runner-credential-provider.js.map +1 -1
  444. package/dist/runnerauth/runner-subject-verifier.d.ts +14 -0
  445. package/dist/runnerauth/runner-subject-verifier.d.ts.map +1 -0
  446. package/dist/runnerauth/runner-subject-verifier.js +115 -0
  447. package/dist/runnerauth/runner-subject-verifier.js.map +1 -0
  448. package/dist/runnerauth/runnerauth.d.ts +33 -4
  449. package/dist/runnerauth/runnerauth.d.ts.map +1 -1
  450. package/dist/runnerauth/runnerauth.js +131 -35
  451. package/dist/runnerauth/runnerauth.js.map +1 -1
  452. package/dist/temporal/agentexecution/engine-client.d.ts +13 -0
  453. package/dist/temporal/agentexecution/engine-client.d.ts.map +1 -1
  454. package/dist/temporal/agentexecution/engine-client.js +10 -2
  455. package/dist/temporal/agentexecution/engine-client.js.map +1 -1
  456. package/dist/temporal/agentexecution/workflow-input.d.ts +13 -0
  457. package/dist/temporal/agentexecution/workflow-input.d.ts.map +1 -1
  458. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.d.ts.map +1 -1
  459. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js +35 -31
  460. package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js.map +1 -1
  461. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  462. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  463. package/dist/temporal/schedule/run-starter.js +14 -1
  464. package/dist/temporal/schedule/run-starter.js.map +1 -1
  465. package/dist/temporal/workflowexecution/engine-client.d.ts +24 -0
  466. package/dist/temporal/workflowexecution/engine-client.d.ts.map +1 -1
  467. package/dist/temporal/workflowexecution/engine-client.js +26 -19
  468. package/dist/temporal/workflowexecution/engine-client.js.map +1 -1
  469. package/dist/temporal/workflowexecution/workflow-input.d.ts +14 -0
  470. package/dist/temporal/workflowexecution/workflow-input.d.ts.map +1 -1
  471. package/package.json +5 -4
  472. package/src/archive/__tests__/archive.test.ts +233 -0
  473. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  474. package/src/archive/content-store.ts +132 -0
  475. package/src/archive/inflate.ts +107 -0
  476. package/src/archive/limits.ts +42 -0
  477. package/src/archive/open.ts +131 -0
  478. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  479. package/src/archive/write.ts +54 -0
  480. package/src/authorization/README.md +124 -0
  481. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  482. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  483. package/src/authorization/__tests__/drivers.ts +70 -0
  484. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  485. package/src/authorization/__tests__/facts.test.ts +155 -0
  486. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  487. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  488. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  489. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  490. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  491. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  492. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  493. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  494. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  495. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  496. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  497. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  498. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  499. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  500. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  501. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  502. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  503. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  504. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  505. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  506. package/src/authorization/__tests__/lane-admission.test.ts +115 -0
  507. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  508. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  509. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  510. package/src/authorization/__tests__/person.test.ts +114 -0
  511. package/src/authorization/__tests__/posture.test.ts +25 -0
  512. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  513. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  514. package/src/authorization/__tests__/support.ts +101 -0
  515. package/src/authorization/__tests__/tuples.test.ts +62 -0
  516. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  517. package/src/authorization/authorizer.ts +208 -0
  518. package/src/authorization/derived-tuples.ts +384 -0
  519. package/src/authorization/evaluator.ts +283 -0
  520. package/src/authorization/facts.ts +47 -0
  521. package/src/authorization/lane-admission.ts +73 -0
  522. package/src/authorization/list-read-scope.ts +216 -0
  523. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  524. package/src/authorization/model/agent.ts +64 -0
  525. package/src/authorization/model/agent_channel.ts +49 -0
  526. package/src/authorization/model/agent_execution.ts +33 -0
  527. package/src/authorization/model/agent_instance.ts +66 -0
  528. package/src/authorization/model/agent_share.ts +40 -0
  529. package/src/authorization/model/api_key.ts +28 -0
  530. package/src/authorization/model/artifact.ts +38 -0
  531. package/src/authorization/model/channel_app.ts +39 -0
  532. package/src/authorization/model/default-of.ts +99 -0
  533. package/src/authorization/model/environment.ts +48 -0
  534. package/src/authorization/model/execution_context.ts +20 -0
  535. package/src/authorization/model/iam_policy.ts +42 -0
  536. package/src/authorization/model/identity_account.ts +26 -0
  537. package/src/authorization/model/index.ts +108 -0
  538. package/src/authorization/model/mcp_server.ts +59 -0
  539. package/src/authorization/model/memory.ts +27 -0
  540. package/src/authorization/model/oauth_app.ts +42 -0
  541. package/src/authorization/model/organization.ts +55 -0
  542. package/src/authorization/model/plugin.ts +66 -0
  543. package/src/authorization/model/project.ts +47 -0
  544. package/src/authorization/model/rewrite.ts +213 -0
  545. package/src/authorization/model/schedule.ts +40 -0
  546. package/src/authorization/model/session.ts +50 -0
  547. package/src/authorization/model/skill.ts +60 -0
  548. package/src/authorization/model/workflow.ts +60 -0
  549. package/src/authorization/model/workflow_execution.ts +44 -0
  550. package/src/authorization/model/workflow_instance.ts +122 -0
  551. package/src/authorization/organization-directory.ts +114 -0
  552. package/src/authorization/person.ts +68 -0
  553. package/src/authorization/posture.ts +49 -0
  554. package/src/authorization/schedule-fire-caller.ts +87 -0
  555. package/src/authorization/store-test-kit.ts +454 -0
  556. package/src/authorization/tuples.ts +190 -0
  557. package/src/boot/compose.ts +246 -52
  558. package/src/boot/inprocess.ts +115 -31
  559. package/src/domain/agent/controller.ts +11 -0
  560. package/src/domain/executioncontext/__tests__/executioncontext.test.ts +104 -0
  561. package/src/domain/executioncontext/__tests__/resolve-values-capability.test.ts +33 -4
  562. package/src/domain/executioncontext/resolve-values-for-caller.ts +79 -22
  563. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  564. package/src/domain/iampolicy/constants.ts +12 -0
  565. package/src/domain/iampolicy/membership.ts +221 -66
  566. package/src/domain/identityaccount/__tests__/account-for-stamp.test.ts +111 -0
  567. package/src/domain/identityaccount/actor.ts +84 -0
  568. package/src/domain/identityaccount/resolve.ts +31 -0
  569. package/src/domain/mcpserver/__tests__/connect.test.ts +17 -2
  570. package/src/domain/mcpserver/connect-execution-id.ts +34 -0
  571. package/src/domain/mcpserver/connect.ts +38 -3
  572. package/src/domain/mcpserver/controller.ts +11 -0
  573. package/src/domain/mcpserver/engine.ts +9 -3
  574. package/src/domain/mcpserver/start-connect.ts +1 -1
  575. package/src/domain/platform/controller.ts +24 -11
  576. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  577. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  578. package/src/domain/plugin/__tests__/plugin.test.ts +796 -0
  579. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  580. package/src/domain/plugin/archive.ts +89 -0
  581. package/src/domain/plugin/constants.ts +53 -0
  582. package/src/domain/plugin/controller.ts +913 -0
  583. package/src/domain/plugin/materialize/agent.ts +186 -0
  584. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  585. package/src/domain/plugin/materialize/identity.ts +67 -0
  586. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  587. package/src/domain/plugin/materialize/plan.ts +124 -0
  588. package/src/domain/plugin/materialize/ports.ts +53 -0
  589. package/src/domain/plugin/materialize/skills.ts +68 -0
  590. package/src/domain/plugin/materialize/workflows.ts +51 -0
  591. package/src/domain/plugin/members.ts +180 -0
  592. package/src/domain/plugin/overlay/documents.ts +78 -0
  593. package/src/domain/plugin/overlay/parse.ts +115 -0
  594. package/src/domain/plugin/overlay/sanitize.ts +151 -0
  595. package/src/domain/plugin/push.ts +1062 -0
  596. package/src/domain/plugin/search-extractor.ts +60 -0
  597. package/src/domain/skill/constants.ts +11 -14
  598. package/src/domain/skill/controller.ts +44 -36
  599. package/src/domain/skill/push.ts +61 -156
  600. package/src/domain/skill/search-extractor.ts +3 -1
  601. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  602. package/src/domain/skill/storage/zip-gate.ts +58 -154
  603. package/src/domain/skill/version-resolution.ts +67 -269
  604. package/src/domain/workflow/controller.ts +38 -4
  605. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  606. package/src/domain/workflowexecution/__tests__/phases.test.ts +58 -0
  607. package/src/domain/workflowexecution/phases.ts +33 -0
  608. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  609. package/src/extensions/__tests__/composed-support.ts +32 -1
  610. package/src/extensions/__tests__/extension-composition.test.ts +42 -1
  611. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  612. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  613. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  614. package/src/extensions/authorizer.ts +10 -5
  615. package/src/extensions/drivers.ts +4 -1
  616. package/src/extensions/list-read-scope.ts +67 -45
  617. package/src/extensions/organization-directory.ts +13 -9
  618. package/src/extensions/resource-authorization.ts +34 -0
  619. package/src/extensions/schedule-fire-caller.ts +49 -18
  620. package/src/identity/__tests__/oidc-verifier.test.ts +22 -0
  621. package/src/identity/oidc-verifier.ts +8 -1
  622. package/src/index.ts +51 -1
  623. package/src/pipeline/__tests__/kind-by-id-prefix.test.ts +75 -0
  624. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  625. package/src/pipeline/apiresource-labels.ts +31 -3
  626. package/src/pipeline/apiresource-meta.ts +41 -0
  627. package/src/pipeline/errors.ts +5 -5
  628. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  629. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +58 -44
  630. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  631. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  632. package/src/pipeline/steps/authorization-facts.ts +131 -0
  633. package/src/pipeline/steps/delete.ts +11 -3
  634. package/src/pipeline/steps/duplicate.ts +8 -2
  635. package/src/pipeline/steps/guard-memory-capture.ts +5 -3
  636. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  637. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  638. package/src/pipeline/steps/helpers.ts +4 -1
  639. package/src/pipeline/steps/index-search.ts +28 -15
  640. package/src/pipeline/steps/load-existing.ts +12 -3
  641. package/src/pipeline/steps/references.ts +36 -2
  642. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  643. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  644. package/src/pipeline/steps/slug.ts +7 -2
  645. package/src/pipeline/steps/validate-visibility.ts +9 -2
  646. package/src/pipeline/steps/validation.ts +3 -1
  647. package/src/pipeline/steps/version-archive.ts +225 -0
  648. package/src/pipeline/steps/version-history.ts +362 -0
  649. package/src/pipeline/steps/visibility-gates.ts +12 -9
  650. package/src/query/README.md +1 -1
  651. package/src/query/search/__tests__/criteria.test.ts +6 -7
  652. package/src/query/search/__tests__/query-store.test.ts +9 -2
  653. package/src/query/search/__tests__/registry.test.ts +6 -4
  654. package/src/query/search/registry.ts +6 -1
  655. package/src/runnerauth/__tests__/bound-execution.test.ts +334 -0
  656. package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +516 -0
  657. package/src/runnerauth/__tests__/dispatch-credential.test.ts +94 -0
  658. package/src/runnerauth/__tests__/runner-credential-provider.test.ts +27 -0
  659. package/src/runnerauth/__tests__/runner-subject-composed.test.ts +497 -0
  660. package/src/runnerauth/__tests__/runner-subject-verifier.test.ts +541 -0
  661. package/src/runnerauth/bound-execution.ts +270 -0
  662. package/src/runnerauth/built-in-runner-credential-provider.ts +300 -0
  663. package/src/runnerauth/constants.ts +74 -0
  664. package/src/runnerauth/dispatch-credential.ts +63 -0
  665. package/src/runnerauth/runner-credential-provider.ts +60 -11
  666. package/src/runnerauth/runner-subject-verifier.ts +152 -0
  667. package/src/runnerauth/runnerauth.ts +148 -38
  668. package/src/temporal/agentexecution/__tests__/engine-client.test.ts +107 -38
  669. package/src/temporal/agentexecution/__tests__/invoke-workflow.test.ts +105 -2
  670. package/src/temporal/agentexecution/engine-client.ts +27 -2
  671. package/src/temporal/agentexecution/workflow-input.ts +13 -0
  672. package/src/temporal/agentexecution/workflows/invoke-agent-execution.ts +90 -44
  673. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  674. package/src/temporal/schedule/run-starter.ts +31 -8
  675. package/src/temporal/workflowexecution/__tests__/engine-client.test.ts +139 -33
  676. package/src/temporal/workflowexecution/engine-client.ts +48 -21
  677. package/src/temporal/workflowexecution/workflow-input.ts +14 -0
  678. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  679. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  680. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
package/README.md CHANGED
@@ -15,7 +15,7 @@ citations are the port's provenance record.
15
15
 
16
16
  ## Contract promise
17
17
 
18
- The wire contract is shared: the cloud Java service, the runner, every
18
+ The wire contract is shared: the cloud composition, the runner, every
19
19
  published SDK, and databases written before the cutover all speak it.
20
20
  Byte-pinned identifiers, error copy, and streaming behavior are contract —
21
21
  every deliberate exception is recorded in the program's parity-deltas
@@ -89,5 +89,5 @@ npm run build:slim && npm run verify:slim
89
89
 
90
90
  Or from the repo root: `make build-server`, `make test-server`.
91
91
 
92
- Coding standards for this service live in
93
- `.cursor/rules/backend/ts-server-guidelines.mdc`.
92
+ The binding laws and read-order for this service are in [`AGENTS.md`](AGENTS.md)
93
+ beside this file; repo-wide laws are in the root `AGENTS.md`.
@@ -0,0 +1,35 @@
1
+ import type { ArtifactStorage } from "../artifactstorage/artifact-storage.js";
2
+ /**
3
+ * Storage abstraction for content-addressed archives. The interface exists
4
+ * for the same reason Go's did: the cloud edition uses R2 behind the
5
+ * identical surface, and a controller must not know which one it holds.
6
+ */
7
+ export interface ContentAddressedArchiveStore {
8
+ /** Saves an archive under its content hash; returns the storage key. */
9
+ store(hash: string, data: Uint8Array): Promise<string>;
10
+ /** Loads an archive by storage key; throws ArtifactNotFoundError if absent. */
11
+ get(storageKey: string): Promise<Uint8Array>;
12
+ /** Whether an archive with this content hash already exists (dedupe). */
13
+ exists(hash: string): Promise<boolean>;
14
+ /** The storage key for a hash, without storing ("<prefix><hash>.zip"). */
15
+ getStorageKey(hash: string): string;
16
+ /** The stored archive's byte size via stat — never loads content. */
17
+ size(storageKey: string): Promise<number>;
18
+ }
19
+ /**
20
+ * A storage key that addresses nothing inside the store — missing file OR
21
+ * a traversal-shaped key (both render as Go's "artifact not found: %s").
22
+ */
23
+ export declare class ArtifactNotFoundError extends Error {
24
+ constructor(storageKey: string);
25
+ }
26
+ /**
27
+ * The store over a blob driver. Object-literal factory rather than a class:
28
+ * all state is the captured driver and prefix, and the seam-adapter shape
29
+ * matches runner-credential-provider.ts (the house style for ports).
30
+ *
31
+ * `keyPrefix` ends with a slash (`skills/`); it is also the download lane's
32
+ * containment prefix, so the two agree by construction.
33
+ */
34
+ export declare function newContentAddressedArchiveStore(driver: ArtifactStorage, keyPrefix: string): ContentAddressedArchiveStore;
35
+ //# sourceMappingURL=content-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-store.d.ts","sourceRoot":"","sources":["../../src/archive/content-store.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAG9E;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,wEAAwE;IACxE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,+EAA+E;IAC/E,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,yEAAyE;IACzE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,0EAA0E;IAC1E,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,qEAAqE;IACrE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,UAAU,EAAE,MAAM;CAI/B;AAKD;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,GAChB,4BAA4B,CAwD9B"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The content-addressed archive store — a domain port over the one
3
+ * ArtifactStorage blob driver: keys are `<prefix><sha256>.zip`, writes are
4
+ * once and never garbage-collected (historical versions stay downloadable
5
+ * through the keys a version history exposes), and a key that addresses
6
+ * nothing inside the store collapses to one not-found before the driver
7
+ * sees it. Skills shipped this shape first
8
+ * (pkg/domain/skill/storage/artifact_storage.go, then the TS port under
9
+ * domain/skill/storage); plugins need the identical port under another
10
+ * prefix, so the implementation lives here and each domain names its
11
+ * instance (`skills/`, `plugins/`).
12
+ *
13
+ * Why the traversal guard is the port's, not the driver's: a
14
+ * client-supplied storage key that resolves outside the store must read
15
+ * exactly like a missing file — the driver's own containment refusal is a
16
+ * distinguishable error, and distinguishing them would tell a probing
17
+ * caller which escapes exist. Lexical, against a fixed virtual root, so
18
+ * the judgment is identical on every backend.
19
+ *
20
+ * Key shape: a LITERAL forward-slash join, never path.join — the key is a
21
+ * wire-visible identifier (status.artifact_storage_key, download URLs, the
22
+ * lane's prefix check) and Windows support arrives only through this server
23
+ * (#24); path.join would mint backslash keys there.
24
+ *
25
+ * Proven by the skill store's __tests__/artifact-storage.test.ts (the
26
+ * `skills/` instance) and by __tests__/content-store.test.ts.
27
+ */
28
+ import path from "node:path";
29
+ import { ArtifactStorageNotFoundError } from "../artifactstorage/artifact-storage.js";
30
+ /**
31
+ * A storage key that addresses nothing inside the store — missing file OR
32
+ * a traversal-shaped key (both render as Go's "artifact not found: %s").
33
+ */
34
+ export class ArtifactNotFoundError extends Error {
35
+ constructor(storageKey) {
36
+ super(`artifact not found: ${storageKey}`);
37
+ this.name = "ArtifactNotFoundError";
38
+ }
39
+ }
40
+ /** Archives are zip files; the driver stores the honest type. */
41
+ const ARCHIVE_CONTENT_TYPE = "application/zip";
42
+ /**
43
+ * The store over a blob driver. Object-literal factory rather than a class:
44
+ * all state is the captured driver and prefix, and the seam-adapter shape
45
+ * matches runner-credential-provider.ts (the house style for ports).
46
+ *
47
+ * `keyPrefix` ends with a slash (`skills/`); it is also the download lane's
48
+ * containment prefix, so the two agree by construction.
49
+ */
50
+ export function newContentAddressedArchiveStore(driver, keyPrefix) {
51
+ const virtualRoot = path.resolve(path.sep, "archive-store");
52
+ const keyEscapesStore = (storageKey) => {
53
+ const resolved = path.resolve(virtualRoot, storageKey);
54
+ return (resolved !== virtualRoot && !resolved.startsWith(virtualRoot + path.sep));
55
+ };
56
+ return {
57
+ getStorageKey(hash) {
58
+ return `${keyPrefix}${hash}.zip`;
59
+ },
60
+ async store(hash, data) {
61
+ const storageKey = this.getStorageKey(hash);
62
+ await driver.upload(storageKey, data, ARCHIVE_CONTENT_TYPE);
63
+ return storageKey;
64
+ },
65
+ async get(storageKey) {
66
+ if (keyEscapesStore(storageKey)) {
67
+ throw new ArtifactNotFoundError(storageKey);
68
+ }
69
+ try {
70
+ return await driver.download(storageKey);
71
+ }
72
+ catch (error) {
73
+ if (error instanceof ArtifactStorageNotFoundError) {
74
+ throw new ArtifactNotFoundError(storageKey);
75
+ }
76
+ throw new Error(`failed to read artifact: ${error instanceof Error ? error.message : String(error)}`);
77
+ }
78
+ },
79
+ async exists(hash) {
80
+ return driver.exists(this.getStorageKey(hash));
81
+ },
82
+ async size(storageKey) {
83
+ if (keyEscapesStore(storageKey)) {
84
+ throw new ArtifactNotFoundError(storageKey);
85
+ }
86
+ try {
87
+ return await driver.size(storageKey);
88
+ }
89
+ catch (error) {
90
+ if (error instanceof ArtifactStorageNotFoundError) {
91
+ throw new ArtifactNotFoundError(storageKey);
92
+ }
93
+ throw new Error(`failed to stat artifact: ${error instanceof Error ? error.message : String(error)}`);
94
+ }
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=content-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-store.js","sourceRoot":"","sources":["../../src/archive/content-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAoBtF;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,UAAkB;QAC5B,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,iEAAiE;AACjE,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,UAAU,+BAA+B,CAC7C,MAAuB,EACvB,SAAiB;IAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAW,EAAE;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACvD,OAAO,CACL,QAAQ,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CACzE,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,aAAa,CAAC,IAAY;YACxB,OAAO,GAAG,SAAS,GAAG,IAAI,MAAM,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAAgB;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,UAAkB;YAC1B,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,4BAA4B,EAAE,CAAC;oBAClD,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;gBAC9C,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,UAAkB;YAC3B,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,4BAA4B,EAAE,CAAC;oBAClD,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;gBAC9C,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ZipStructuralEntry } from "@stigmer/zip-structure";
2
+ export type InflateFailureKind =
3
+ /** The inflated output passed `maxSize`. */
4
+ "too-large"
5
+ /** zlib refused the payload; `detail` carries its message. */
6
+ | "read-failed"
7
+ /** A compression method neither Go nor this gate registers. */
8
+ | "unsupported-method"
9
+ /** The inflated bytes do not match the entry's CRC. */
10
+ | "checksum";
11
+ /** A typed refusal; the kind that called maps it to its pinned sentence. */
12
+ export declare class InflateError extends Error {
13
+ readonly kind: InflateFailureKind;
14
+ readonly detail: string;
15
+ constructor(kind: InflateFailureKind, detail: string);
16
+ }
17
+ /**
18
+ * Inflates one entry to at most `maxSize` bytes and verifies its CRC.
19
+ * The cap bounds the actual output, not the declaration.
20
+ */
21
+ export declare function inflateEntry(entry: ZipStructuralEntry, maxSize: number): Uint8Array;
22
+ //# sourceMappingURL=inflate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inflate.d.ts","sourceRoot":"","sources":["../../src/archive/inflate.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAMjE,MAAM,MAAM,kBAAkB;AAC5B,4CAA4C;AAC1C,WAAW;AACb,8DAA8D;GAC5D,aAAa;AACf,+DAA+D;GAC7D,oBAAoB;AACtB,uDAAuD;GACrD,UAAU,CAAC;AAEf,4EAA4E;AAC5E,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,MAAM;CAK1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,MAAM,GACd,UAAU,CA6CZ"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Reading one archive entry under a real cap. Declared sizes are client
3
+ * claims, so every gate that opens an entry bounds the ACTUAL inflated
4
+ * output (`maxOutputLength`), verifies the CRC the way Go's checksumReader
5
+ * does on every read, and opens only the two methods the platform
6
+ * registers (stored, deflated). The skill gate did this for SKILL.md alone;
7
+ * a plugin reads many documents through the same discipline, so the read
8
+ * lives here and each kind keeps its own sentences: the outcome is a typed
9
+ * failure, never prose, because the skill's copy is byte-pinned wire
10
+ * contract and a plugin's names a different document.
11
+ *
12
+ * Proven by __tests__/inflate.test.ts and, through composition, by the
13
+ * skill gate's zip-gate.test.ts.
14
+ */
15
+ import { inflateRawSync } from "node:zlib";
16
+ import { crc32 } from "@stigmer/zip-structure";
17
+ /** ZIP compression methods the gate can open (Go registers the same two). */
18
+ const METHOD_STORED = 0;
19
+ const METHOD_DEFLATED = 8;
20
+ /** A typed refusal; the kind that called maps it to its pinned sentence. */
21
+ export class InflateError extends Error {
22
+ kind;
23
+ detail;
24
+ constructor(kind, detail) {
25
+ super(`${kind}: ${detail}`);
26
+ this.kind = kind;
27
+ this.detail = detail;
28
+ this.name = "InflateError";
29
+ }
30
+ }
31
+ /**
32
+ * Inflates one entry to at most `maxSize` bytes and verifies its CRC.
33
+ * The cap bounds the actual output, not the declaration.
34
+ */
35
+ export function inflateEntry(entry, maxSize) {
36
+ let content;
37
+ switch (entry.compressionMethod) {
38
+ case METHOD_STORED:
39
+ content = entry.compressedData;
40
+ break;
41
+ case METHOD_DEFLATED:
42
+ try {
43
+ content = new Uint8Array(inflateRawSync(entry.compressedData, {
44
+ maxOutputLength: maxSize + 1,
45
+ }));
46
+ }
47
+ catch (error) {
48
+ if (isOutputLengthError(error)) {
49
+ throw new InflateError("too-large", `output exceeds ${maxSize} bytes`);
50
+ }
51
+ throw new InflateError("read-failed", error instanceof Error ? error.message : String(error));
52
+ }
53
+ break;
54
+ default:
55
+ // Go: File.Open returns ErrAlgorithm for methods without a registered
56
+ // decompressor; each kind pins the text via its own %w-shaped arm.
57
+ throw new InflateError("unsupported-method", "zip: unsupported compression algorithm");
58
+ }
59
+ if (content.length > maxSize) {
60
+ throw new InflateError("too-large", `output exceeds ${maxSize} bytes`);
61
+ }
62
+ if (crc32(content) !== entry.crc32) {
63
+ // Go's checksumReader: stdlib ErrChecksum via the read-error arm.
64
+ throw new InflateError("checksum", "zip: checksum error");
65
+ }
66
+ return content;
67
+ }
68
+ /** node:zlib's maxOutputLength violation (the output-cap arm). */
69
+ function isOutputLengthError(error) {
70
+ return (error instanceof Error &&
71
+ (("code" in error &&
72
+ error.code === "ERR_BUFFER_TOO_LARGE") ||
73
+ error.message.includes("maxOutputLength")));
74
+ }
75
+ //# sourceMappingURL=inflate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inflate.js","sourceRoot":"","sources":["../../src/archive/inflate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAG/C,6EAA6E;AAC7E,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,eAAe,GAAG,CAAC,CAAC;AAY1B,4EAA4E;AAC5E,MAAM,OAAO,YAAa,SAAQ,KAAK;IAE1B;IACA;IAFX,YACW,IAAwB,EACxB,MAAc;QAEvB,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QAHnB,SAAI,GAAJ,IAAI,CAAoB;QACxB,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAyB,EACzB,OAAe;IAEf,IAAI,OAAmB,CAAC;IACxB,QAAQ,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAChC,KAAK,aAAa;YAChB,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC;YAC/B,MAAM;QACR,KAAK,eAAe;YAClB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,UAAU,CACtB,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE;oBACnC,eAAe,EAAE,OAAO,GAAG,CAAC;iBAC7B,CAAC,CACH,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,YAAY,CACpB,WAAW,EACX,kBAAkB,OAAO,QAAQ,CAClC,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,YAAY,CACpB,aAAa,EACb,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;YACD,MAAM;QACR;YACE,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,IAAI,YAAY,CACpB,oBAAoB,EACpB,wCAAwC,CACzC,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,YAAY,CAAC,WAAW,EAAE,kBAAkB,OAAO,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QACnC,kEAAkE;QAClE,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kEAAkE;AAClE,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,CAAC,CAAC,MAAM,IAAI,KAAK;YACd,KAA2B,CAAC,IAAI,KAAK,sBAAsB,CAAC;YAC7D,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The platform's archive limits — one home for every ZIP-bomb budget the
3
+ * server applies to a pushed archive, whichever kind it becomes. Skills
4
+ * carried these alone until plugins arrived (also pushed as a ZIP); the
5
+ * values stay byte-pinned to the retired Go gate's (pkg/domain/skill/storage/
6
+ * zip_extractor.go), because every sentence quoting them is wire contract
7
+ * and the transfer lane refuses over-limit declarations by them before a
8
+ * byte moves.
9
+ *
10
+ * A per-kind cap that is NOT an archive budget (the 1 MB SKILL.md
11
+ * extraction cap) stays with its kind: it bounds one document, not the
12
+ * archive.
13
+ */
14
+ /**
15
+ * The compressed-archive ceiling. The platform's artifact size limit, not
16
+ * just an extraction guard: createArtifactUploadUrl enforces it before any
17
+ * bytes move and clients quote it in fail-loud size errors (#675).
18
+ */
19
+ export declare const MAX_ZIP_SIZE: number;
20
+ /** Total declared-uncompressed budget across all entries (ZIP-bomb guard). */
21
+ export declare const MAX_UNCOMPRESSED_SIZE: number;
22
+ /** Per-file declared compression ratio ceiling (ZIP-bomb guard). */
23
+ export declare const MAX_COMPRESSION_RATIO = 100;
24
+ /** Entry-count ceiling. */
25
+ export declare const MAX_FILES = 10000;
26
+ /** The budgets `validateArchiveStructure` applies; the platform's by default. */
27
+ export interface ArchiveLimits {
28
+ readonly maxFiles: number;
29
+ readonly maxUncompressedSize: number;
30
+ readonly maxCompressionRatio: number;
31
+ }
32
+ export declare const PLATFORM_ARCHIVE_LIMITS: ArchiveLimits;
33
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/archive/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAoB,CAAC;AAE9C,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AAEvD,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,2BAA2B;AAC3B,eAAO,MAAM,SAAS,QAAS,CAAC;AAEhC,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,uBAAuB,EAAE,aAIrC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The platform's archive limits — one home for every ZIP-bomb budget the
3
+ * server applies to a pushed archive, whichever kind it becomes. Skills
4
+ * carried these alone until plugins arrived (also pushed as a ZIP); the
5
+ * values stay byte-pinned to the retired Go gate's (pkg/domain/skill/storage/
6
+ * zip_extractor.go), because every sentence quoting them is wire contract
7
+ * and the transfer lane refuses over-limit declarations by them before a
8
+ * byte moves.
9
+ *
10
+ * A per-kind cap that is NOT an archive budget (the 1 MB SKILL.md
11
+ * extraction cap) stays with its kind: it bounds one document, not the
12
+ * archive.
13
+ */
14
+ /**
15
+ * The compressed-archive ceiling. The platform's artifact size limit, not
16
+ * just an extraction guard: createArtifactUploadUrl enforces it before any
17
+ * bytes move and clients quote it in fail-loud size errors (#675).
18
+ */
19
+ export const MAX_ZIP_SIZE = 100 * 1024 * 1024;
20
+ /** Total declared-uncompressed budget across all entries (ZIP-bomb guard). */
21
+ export const MAX_UNCOMPRESSED_SIZE = 500 * 1024 * 1024;
22
+ /** Per-file declared compression ratio ceiling (ZIP-bomb guard). */
23
+ export const MAX_COMPRESSION_RATIO = 100;
24
+ /** Entry-count ceiling. */
25
+ export const MAX_FILES = 10_000;
26
+ export const PLATFORM_ARCHIVE_LIMITS = {
27
+ maxFiles: MAX_FILES,
28
+ maxUncompressedSize: MAX_UNCOMPRESSED_SIZE,
29
+ maxCompressionRatio: MAX_COMPRESSION_RATIO,
30
+ };
31
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/archive/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvD,oEAAoE;AACpE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAShC,MAAM,CAAC,MAAM,uBAAuB,GAAkB;IACpD,QAAQ,EAAE,SAAS;IACnB,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;CAC3C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ArchiveLimits } from "./limits.js";
2
+ import type { PrefilteredEntry } from "./prefilter.js";
3
+ /** A parsed, pre-filtered archive with its content-addressed identity. */
4
+ export interface OpenedArchive {
5
+ /** SHA-256 hex of the archive bytes. */
6
+ readonly hash: string;
7
+ /** The entries a kind may read, names sanitised, shadows dropped. */
8
+ readonly entries: readonly PrefilteredEntry[];
9
+ }
10
+ /**
11
+ * Bounds, hashes, parses and pre-filters. Throws plain Errors with
12
+ * byte-pinned messages; the caller owns the gRPC code.
13
+ */
14
+ export declare function openArchive(bytes: Uint8Array, maxZipSize?: number): OpenedArchive;
15
+ /**
16
+ * The structural walk: empty archive, file-count cap, then per entry the
17
+ * control-character rule, the running declared-uncompressed budget
18
+ * (fail-fast) and the per-file compression-ratio cap. `onEntry` sees each
19
+ * sanitised name in order so a kind can track its own requirements.
20
+ */
21
+ export declare function validateArchiveStructure(entries: readonly PrefilteredEntry[], limits: ArchiveLimits, onEntry?: (name: string) => void): void;
22
+ /** SHA-256 hex of the archive bytes (Go CalculateHash). */
23
+ export declare function calculateHash(data: Uint8Array): string;
24
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/archive/open.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,UAAU,GAAE,MAAqB,GAChC,aAAa,CAsBf;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC/B,IAAI,CA2CN;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Opening a pushed archive — the kind-agnostic half of the ZIP gate every
3
+ * archive-shaped push runs (skills, plugins). Two steps, both pure over the
4
+ * bytes: `openArchive` bounds the compressed size, hashes the bytes (the
5
+ * content-addressed version identity), parses the central directory and
6
+ * applies the safearchive prefilter; `validateArchiveStructure` walks the
7
+ * pre-filtered entries in the retired Go gate's exact order (empty
8
+ * archive, file count, then per entry the filename control-character rule,
9
+ * the running declared-uncompressed budget and the per-file ratio cap).
10
+ *
11
+ * What a KIND requires of the entries (a root SKILL.md, a plugin manifest)
12
+ * is not here: the walk accepts an `onEntry` observer so a kind tracks what
13
+ * it needs in the same pass and rules on it afterwards, which keeps the
14
+ * observable error order the skill gate's tests pin.
15
+ *
16
+ * Error text is wire-visible contract: the sentences below are the Go
17
+ * gate's verbatim, wrapped by each kind's push step into its own
18
+ * InvalidArgument arm. Only declared sizes are judged here; inflating an
19
+ * entry under a real cap is `inflate.ts`'s job.
20
+ *
21
+ * Proven by the skill gate's __tests__/zip-gate.test.ts (which composes
22
+ * these) and by __tests__/open.test.ts for the plugin-shaped path.
23
+ */
24
+ import { createHash } from "node:crypto";
25
+ import { parseZipStructure } from "@stigmer/zip-structure";
26
+ import { MAX_ZIP_SIZE } from "./limits.js";
27
+ import { applyEntryPrefilter } from "./prefilter.js";
28
+ /**
29
+ * Bounds, hashes, parses and pre-filters. Throws plain Errors with
30
+ * byte-pinned messages; the caller owns the gRPC code.
31
+ */
32
+ export function openArchive(bytes, maxZipSize = MAX_ZIP_SIZE) {
33
+ if (bytes.length > maxZipSize) {
34
+ throw new Error(`ZIP file too large: ${bytes.length} bytes (max: ${maxZipSize})`);
35
+ }
36
+ const hash = calculateHash(bytes);
37
+ let entries;
38
+ try {
39
+ entries = parseZipStructure(bytes);
40
+ }
41
+ catch {
42
+ // Go's zip.NewReader surfaces stdlib ErrFormat here; its text is what
43
+ // clients see via the %w chain, so it is pinned verbatim.
44
+ throw new Error("invalid ZIP file: zip: not a valid zip file");
45
+ }
46
+ // safearchive MaximumSecurityMode rewrites the entry list before any
47
+ // validation sees it — sanitized names, shadowed/special/8.3 entries
48
+ // dropped.
49
+ return { hash, entries: applyEntryPrefilter(entries) };
50
+ }
51
+ /**
52
+ * The structural walk: empty archive, file-count cap, then per entry the
53
+ * control-character rule, the running declared-uncompressed budget
54
+ * (fail-fast) and the per-file compression-ratio cap. `onEntry` sees each
55
+ * sanitised name in order so a kind can track its own requirements.
56
+ */
57
+ export function validateArchiveStructure(entries, limits, onEntry) {
58
+ if (entries.length === 0) {
59
+ throw new Error("ZIP file is empty");
60
+ }
61
+ if (entries.length > limits.maxFiles) {
62
+ throw new Error(`too many files in ZIP: ${entries.length} (max: ${limits.maxFiles})`);
63
+ }
64
+ let totalUncompressedSize = 0;
65
+ for (const { name, entry } of entries) {
66
+ onEntry?.(name);
67
+ // Reject null bytes and control characters in entry names (code
68
+ // points, not UTF-16 units — Go ranges over runes).
69
+ for (const ch of name) {
70
+ const codePoint = ch.codePointAt(0);
71
+ if (codePoint < 32 || codePoint === 127) {
72
+ throw new Error(`invalid character in filename: ${name}`);
73
+ }
74
+ }
75
+ // Track the declared uncompressed total (fail fast once exceeded).
76
+ totalUncompressedSize += entry.uncompressedSize;
77
+ if (totalUncompressedSize > limits.maxUncompressedSize) {
78
+ throw new Error(`total uncompressed size too large: ${totalUncompressedSize} bytes (max: ${limits.maxUncompressedSize})`);
79
+ }
80
+ // Per-file compression ratio (ZIP-bomb guard); integer division as Go.
81
+ if (entry.compressedSize > 0) {
82
+ const ratio = Math.floor(entry.uncompressedSize / entry.compressedSize);
83
+ if (ratio > limits.maxCompressionRatio) {
84
+ throw new Error(`suspicious compression ratio in ${name}: ${ratio}:1 (max: ${limits.maxCompressionRatio}:1)`);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ /** SHA-256 hex of the archive bytes (Go CalculateHash). */
90
+ export function calculateHash(data) {
91
+ return createHash("sha256").update(data).digest("hex");
92
+ }
93
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/archive/open.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,11 @@
28
28
  * bits; FAT/NTFS/VFAT creators carry MSDOS bits that can never encode a
29
29
  * symlink or special file; unknown creators decode to a regular file.
30
30
  *
31
+ * Shared by every archive gate the server runs (skills, plugins): the
32
+ * filter describes what an archive IS before any kind reads it, so it
33
+ * lives with the archive plumbing rather than with the first kind that
34
+ * needed it.
35
+ *
31
36
  * Proven by __tests__/prefilter.test.ts (byte-crafted fixtures per DD-001).
32
37
  */
33
38
  import type { ZipStructuralEntry } from "@stigmer/zip-structure";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefilter.d.ts","sourceRoot":"","sources":["../../src/archive/prefilter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUlD;AA2BD,0EAA0E;AAC1E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAK/D;AAgBD,UAAU,aAAa;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAetE;AAID;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,gBAAgB,EAAE,CAwCpB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefilter.js","sourceRoot":"","sources":["../../src/archive/prefilter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** One file to write: a plugin-relative POSIX path and its bytes. */
2
+ export interface ArchiveFile {
3
+ readonly path: string;
4
+ readonly bytes: Uint8Array;
5
+ }
6
+ /** Writes `files` as one deflated archive whose bytes depend on the files alone. */
7
+ export declare function writeArchive(files: ReadonlyArray<ArchiveFile>): Uint8Array;
8
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/archive/write.ts"],"names":[],"mappings":"AAoBA,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAaD,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,UAAU,CAe1E"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Writing a deterministic archive. The server writes ZIPs for one reason: a
3
+ * plugin's skills are pushed through the skill pipeline as archives of
4
+ * their own, and a skill's version IS the SHA-256 of its archive bytes, so
5
+ * the same files must always produce the same bytes or every re-install
6
+ * would mint a new skill version out of nothing. Determinism comes from
7
+ * three choices, each mirrored from the CLI's skill packager
8
+ * (client-apps/cli/src/resources/skill.ts): entries sorted by path, one
9
+ * fixed DOS-epoch mtime on every entry (fflate would otherwise stamp the
10
+ * wall clock), and one fixed deflate level.
11
+ *
12
+ * fflate is the ratified server dependency for ZIP work (see
13
+ * domain/agentexecution/artifacts.ts); this module is its one write site.
14
+ *
15
+ * Proven by __tests__/write.test.ts: two writes of the same files are
16
+ * byte-equal, entry order does not matter, and the result round-trips
17
+ * through the server's own reader.
18
+ */
19
+ import { zipSync } from "fflate";
20
+ /**
21
+ * fflate stamps the archive's creation time into every entry when no mtime
22
+ * is given; pinning the DOS epoch removes the one source of byte-level
23
+ * variance. Local-field construction is deliberate: DOS timestamps are
24
+ * local time, and this instant is representable in every zone.
25
+ */
26
+ const DETERMINISTIC_ZIP_MTIME = new Date(1980, 0, 1);
27
+ /** The CLI's level; changing it would move every digest in the field. */
28
+ const DEFLATE_LEVEL = 6;
29
+ /** Writes `files` as one deflated archive whose bytes depend on the files alone. */
30
+ export function writeArchive(files) {
31
+ const sorted = [...files].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
32
+ const tree = {};
33
+ for (const file of sorted) {
34
+ if (file.path in tree) {
35
+ throw new Error(`archive path '${file.path}' listed twice`);
36
+ }
37
+ tree[file.path] = file.bytes;
38
+ }
39
+ return zipSync(tree, {
40
+ level: DEFLATE_LEVEL,
41
+ mtime: DETERMINISTIC_ZIP_MTIME,
42
+ });
43
+ }
44
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/archive/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAQjC;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAErD,yEAAyE;AACzE,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,KAAiC;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAC;IACF,MAAM,IAAI,GAA+B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,gBAAgB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,uBAAuB;KAC/B,CAAC,CAAC;AACL,CAAC"}