@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
@@ -0,0 +1,107 @@
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
+
17
+ import { crc32 } from "@stigmer/zip-structure";
18
+ import type { ZipStructuralEntry } from "@stigmer/zip-structure";
19
+
20
+ /** ZIP compression methods the gate can open (Go registers the same two). */
21
+ const METHOD_STORED = 0;
22
+ const METHOD_DEFLATED = 8;
23
+
24
+ export type InflateFailureKind =
25
+ /** The inflated output passed `maxSize`. */
26
+ | "too-large"
27
+ /** zlib refused the payload; `detail` carries its message. */
28
+ | "read-failed"
29
+ /** A compression method neither Go nor this gate registers. */
30
+ | "unsupported-method"
31
+ /** The inflated bytes do not match the entry's CRC. */
32
+ | "checksum";
33
+
34
+ /** A typed refusal; the kind that called maps it to its pinned sentence. */
35
+ export class InflateError extends Error {
36
+ constructor(
37
+ readonly kind: InflateFailureKind,
38
+ readonly detail: string,
39
+ ) {
40
+ super(`${kind}: ${detail}`);
41
+ this.name = "InflateError";
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Inflates one entry to at most `maxSize` bytes and verifies its CRC.
47
+ * The cap bounds the actual output, not the declaration.
48
+ */
49
+ export function inflateEntry(
50
+ entry: ZipStructuralEntry,
51
+ maxSize: number,
52
+ ): Uint8Array {
53
+ let content: Uint8Array;
54
+ switch (entry.compressionMethod) {
55
+ case METHOD_STORED:
56
+ content = entry.compressedData;
57
+ break;
58
+ case METHOD_DEFLATED:
59
+ try {
60
+ content = new Uint8Array(
61
+ inflateRawSync(entry.compressedData, {
62
+ maxOutputLength: maxSize + 1,
63
+ }),
64
+ );
65
+ } catch (error) {
66
+ if (isOutputLengthError(error)) {
67
+ throw new InflateError(
68
+ "too-large",
69
+ `output exceeds ${maxSize} bytes`,
70
+ );
71
+ }
72
+ throw new InflateError(
73
+ "read-failed",
74
+ error instanceof Error ? error.message : String(error),
75
+ );
76
+ }
77
+ break;
78
+ default:
79
+ // Go: File.Open returns ErrAlgorithm for methods without a registered
80
+ // decompressor; each kind pins the text via its own %w-shaped arm.
81
+ throw new InflateError(
82
+ "unsupported-method",
83
+ "zip: unsupported compression algorithm",
84
+ );
85
+ }
86
+
87
+ if (content.length > maxSize) {
88
+ throw new InflateError("too-large", `output exceeds ${maxSize} bytes`);
89
+ }
90
+
91
+ if (crc32(content) !== entry.crc32) {
92
+ // Go's checksumReader: stdlib ErrChecksum via the read-error arm.
93
+ throw new InflateError("checksum", "zip: checksum error");
94
+ }
95
+
96
+ return content;
97
+ }
98
+
99
+ /** node:zlib's maxOutputLength violation (the output-cap arm). */
100
+ function isOutputLengthError(error: unknown): boolean {
101
+ return (
102
+ error instanceof Error &&
103
+ (("code" in error &&
104
+ (error as { code?: string }).code === "ERR_BUFFER_TOO_LARGE") ||
105
+ error.message.includes("maxOutputLength"))
106
+ );
107
+ }
@@ -0,0 +1,42 @@
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
+ /**
16
+ * The compressed-archive ceiling. The platform's artifact size limit, not
17
+ * just an extraction guard: createArtifactUploadUrl enforces it before any
18
+ * bytes move and clients quote it in fail-loud size errors (#675).
19
+ */
20
+ export const MAX_ZIP_SIZE = 100 * 1024 * 1024;
21
+
22
+ /** Total declared-uncompressed budget across all entries (ZIP-bomb guard). */
23
+ export const MAX_UNCOMPRESSED_SIZE = 500 * 1024 * 1024;
24
+
25
+ /** Per-file declared compression ratio ceiling (ZIP-bomb guard). */
26
+ export const MAX_COMPRESSION_RATIO = 100;
27
+
28
+ /** Entry-count ceiling. */
29
+ export const MAX_FILES = 10_000;
30
+
31
+ /** The budgets `validateArchiveStructure` applies; the platform's by default. */
32
+ export interface ArchiveLimits {
33
+ readonly maxFiles: number;
34
+ readonly maxUncompressedSize: number;
35
+ readonly maxCompressionRatio: number;
36
+ }
37
+
38
+ export const PLATFORM_ARCHIVE_LIMITS: ArchiveLimits = {
39
+ maxFiles: MAX_FILES,
40
+ maxUncompressedSize: MAX_UNCOMPRESSED_SIZE,
41
+ maxCompressionRatio: MAX_COMPRESSION_RATIO,
42
+ };
@@ -0,0 +1,131 @@
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
+
26
+ import { parseZipStructure } from "@stigmer/zip-structure";
27
+ import type { ZipStructuralEntry } from "@stigmer/zip-structure";
28
+
29
+ import type { ArchiveLimits } from "./limits.js";
30
+ import { MAX_ZIP_SIZE } from "./limits.js";
31
+ import { applyEntryPrefilter } from "./prefilter.js";
32
+ import type { PrefilteredEntry } from "./prefilter.js";
33
+
34
+ /** A parsed, pre-filtered archive with its content-addressed identity. */
35
+ export interface OpenedArchive {
36
+ /** SHA-256 hex of the archive bytes. */
37
+ readonly hash: string;
38
+ /** The entries a kind may read, names sanitised, shadows dropped. */
39
+ readonly entries: readonly PrefilteredEntry[];
40
+ }
41
+
42
+ /**
43
+ * Bounds, hashes, parses and pre-filters. Throws plain Errors with
44
+ * byte-pinned messages; the caller owns the gRPC code.
45
+ */
46
+ export function openArchive(
47
+ bytes: Uint8Array,
48
+ maxZipSize: number = MAX_ZIP_SIZE,
49
+ ): OpenedArchive {
50
+ if (bytes.length > maxZipSize) {
51
+ throw new Error(
52
+ `ZIP file too large: ${bytes.length} bytes (max: ${maxZipSize})`,
53
+ );
54
+ }
55
+
56
+ const hash = calculateHash(bytes);
57
+
58
+ let entries: readonly ZipStructuralEntry[];
59
+ try {
60
+ entries = parseZipStructure(bytes);
61
+ } catch {
62
+ // Go's zip.NewReader surfaces stdlib ErrFormat here; its text is what
63
+ // clients see via the %w chain, so it is pinned verbatim.
64
+ throw new Error("invalid ZIP file: zip: not a valid zip file");
65
+ }
66
+
67
+ // safearchive MaximumSecurityMode rewrites the entry list before any
68
+ // validation sees it — sanitized names, shadowed/special/8.3 entries
69
+ // dropped.
70
+ return { hash, entries: applyEntryPrefilter(entries) };
71
+ }
72
+
73
+ /**
74
+ * The structural walk: empty archive, file-count cap, then per entry the
75
+ * control-character rule, the running declared-uncompressed budget
76
+ * (fail-fast) and the per-file compression-ratio cap. `onEntry` sees each
77
+ * sanitised name in order so a kind can track its own requirements.
78
+ */
79
+ export function validateArchiveStructure(
80
+ entries: readonly PrefilteredEntry[],
81
+ limits: ArchiveLimits,
82
+ onEntry?: (name: string) => void,
83
+ ): void {
84
+ if (entries.length === 0) {
85
+ throw new Error("ZIP file is empty");
86
+ }
87
+
88
+ if (entries.length > limits.maxFiles) {
89
+ throw new Error(
90
+ `too many files in ZIP: ${entries.length} (max: ${limits.maxFiles})`,
91
+ );
92
+ }
93
+
94
+ let totalUncompressedSize = 0;
95
+
96
+ for (const { name, entry } of entries) {
97
+ onEntry?.(name);
98
+
99
+ // Reject null bytes and control characters in entry names (code
100
+ // points, not UTF-16 units — Go ranges over runes).
101
+ for (const ch of name) {
102
+ const codePoint = ch.codePointAt(0)!;
103
+ if (codePoint < 32 || codePoint === 127) {
104
+ throw new Error(`invalid character in filename: ${name}`);
105
+ }
106
+ }
107
+
108
+ // Track the declared uncompressed total (fail fast once exceeded).
109
+ totalUncompressedSize += entry.uncompressedSize;
110
+ if (totalUncompressedSize > limits.maxUncompressedSize) {
111
+ throw new Error(
112
+ `total uncompressed size too large: ${totalUncompressedSize} bytes (max: ${limits.maxUncompressedSize})`,
113
+ );
114
+ }
115
+
116
+ // Per-file compression ratio (ZIP-bomb guard); integer division as Go.
117
+ if (entry.compressedSize > 0) {
118
+ const ratio = Math.floor(entry.uncompressedSize / entry.compressedSize);
119
+ if (ratio > limits.maxCompressionRatio) {
120
+ throw new Error(
121
+ `suspicious compression ratio in ${name}: ${ratio}:1 (max: ${limits.maxCompressionRatio}:1)`,
122
+ );
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ /** SHA-256 hex of the archive bytes (Go CalculateHash). */
129
+ export function calculateHash(data: Uint8Array): string {
130
+ return createHash("sha256").update(data).digest("hex");
131
+ }
@@ -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,54 @@
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
+ /** One file to write: a plugin-relative POSIX path and its bytes. */
22
+ export interface ArchiveFile {
23
+ readonly path: string;
24
+ readonly bytes: Uint8Array;
25
+ }
26
+
27
+ /**
28
+ * fflate stamps the archive's creation time into every entry when no mtime
29
+ * is given; pinning the DOS epoch removes the one source of byte-level
30
+ * variance. Local-field construction is deliberate: DOS timestamps are
31
+ * local time, and this instant is representable in every zone.
32
+ */
33
+ const DETERMINISTIC_ZIP_MTIME = new Date(1980, 0, 1);
34
+
35
+ /** The CLI's level; changing it would move every digest in the field. */
36
+ const DEFLATE_LEVEL = 6;
37
+
38
+ /** Writes `files` as one deflated archive whose bytes depend on the files alone. */
39
+ export function writeArchive(files: ReadonlyArray<ArchiveFile>): Uint8Array {
40
+ const sorted = [...files].sort((a, b) =>
41
+ a.path < b.path ? -1 : a.path > b.path ? 1 : 0,
42
+ );
43
+ const tree: Record<string, Uint8Array> = {};
44
+ for (const file of sorted) {
45
+ if (file.path in tree) {
46
+ throw new Error(`archive path '${file.path}' listed twice`);
47
+ }
48
+ tree[file.path] = file.bytes;
49
+ }
50
+ return zipSync(tree, {
51
+ level: DEFLATE_LEVEL,
52
+ mtime: DETERMINISTIC_ZIP_MTIME,
53
+ });
54
+ }
@@ -0,0 +1,124 @@
1
+ # authorization/ — the built-in authorizer
2
+
3
+ Open source's own `Authorizer`, organization directory, schedule fire caller and
4
+ `ListReadScope`, composed when a server runs under an authentication posture and
5
+ no unit registers its own — the **built-in posture** (`posture.ts`; the other
6
+ two are the trusted-local laptop's permissive default and a unit's own
7
+ Authorizer). It is not a domain: it drives ports the registry declares
8
+ (`extensions/authorizer.ts`, `extensions/organization-directory.ts`,
9
+ `extensions/schedule-fire-caller.ts`, `extensions/list-read-scope.ts`) by
10
+ reading aggregates it does not own — resources through the generic `Store`,
11
+ accounts through the `IdentityAccountStore` port, roles through the
12
+ `IamPolicyStore` port — and writes nothing.
13
+
14
+ The idea, once: in the cloud, authorization is the OpenFGA model evaluated over
15
+ stored tuples, and every tuple is derived from a row by
16
+ `kind_meta.authorization` except the one that is a fact, the IamPolicy row. So
17
+ open source evaluates the same model over the same tuples, derived from the row
18
+ when a check asks instead of stored. One meaning of authorization in both
19
+ editions; the cloud stores what open source computes.
20
+
21
+ ## Parts
22
+
23
+ - `model/rewrite.ts` — the four relation-rewrite forms the 27 `.fga` files use
24
+ (`this` with its type restrictions, `computed`, `from`, `union`), the
25
+ builders, and `declareKind`, which refuses a transcript that cannot be right
26
+ at module load.
27
+ - `model/<kind>.ts` — one transcript per open-source kind (twenty-three), the
28
+ `.fga` file's relations in the file's order, its path in the header.
29
+ `model/index.ts` registers them in `fga.mod` order and answers by kind or by
30
+ FGA type name. Two relations no row carries as a `kind_meta` fact have a
31
+ `derived` rule beside their transcript: `default_of` on the two instance kinds
32
+ (`model/default-of.ts`, from the blueprint's `status.default_instance_id`) and
33
+ `execution_viewer` on the workflow instance (from
34
+ `spec.execution_visibility`).
35
+ - `tuples.ts` — the tuple vocabulary (object, relation, subject; the string
36
+ notation), the `Person` type (the caller as the model sees them: account id
37
+ plus the aliases a creator stamp may carry), `CheckContext` (the
38
+ `allow_public` parameter: `allow: true` on a point check, `false` in a listing
39
+ — the cloud's own posture).
40
+ - `person.ts` — the one construction of a `Person`: `resolvePerson` reads the
41
+ caller's account through the port the way whoAmI does, `personFor` builds the
42
+ aliases (the account id and the issuer subject; an email is nobody's) and
43
+ refuses an identity that names no person. Every driver resolves the caller
44
+ here.
45
+ - `evaluator.ts` — OpenFGA's check over a model and a tuple source: type
46
+ restrictions enforced on direct tuples (model drift fails closed), a memo per
47
+ (object, relation), OpenFGA's depth bound, cycles and undeclared targets as
48
+ faults, never silent denials.
49
+ - `facts.ts` — `RowFacts`, what a row carries that its tuples derive from: the
50
+ seam's `RowAuthorizationFacts` with the kind beside them. Two producers, one
51
+ resolver: a loaded row (`rowFactsOf`) and a list candidate (`rowFactsOfEntry`
52
+ over the `ListEntryMeta` the lanes' helper builds) both read through the
53
+ pipeline leaf `pipeline/steps/authorization-facts.ts`, the read-time twin of
54
+ the tuple lifecycle's create-time resolution, pinned equal to it.
55
+ - `derived-tuples.ts` — the derivation (the cloud driver's shapes, from the
56
+ facts) and the source that joins it with the person's IamPolicy rows, read
57
+ once per source. The two edition-specific facts live here: the organization's
58
+ owner is a row, and a stamp that names no person is no tuple. A source may be
59
+ seeded with candidates' facts (the list scope), so a seeded object's tuples
60
+ derive without a read of its row; a `derived` rule still reads the row it
61
+ needs.
62
+ - `store-test-kit.ts` — runs an OpenFGA store test (`.fga.yaml`) against the
63
+ evaluator, vitest-free, exported from the barrel. Open source runs it over
64
+ pinned copies of the cloud's own model tests (`__tests__/fixtures/fga/`, a
65
+ byte-exact mirror of the cloud's `fga/tests/`); the cloud runs it over the
66
+ live files at the re-pin. What it does not run it reports in three reasons: a
67
+ target kind the model does not declare, a `list_objects` assertion, and an
68
+ assertion whose walk read a grant through a type the model does not declare
69
+ (the cloud's platform tenancy, `identity_provider#platform_user`).
70
+
71
+ - `authorizer.ts` — the `Authorizer` driver, arm for arm the cloud's
72
+ (`stigmer-cloud src/authorizer/fga-authorizer.ts`): the four pre-check denials
73
+ with the Java copy; a kind this edition does not serve denied (so nobody sets
74
+ public visibility on a self-host); the target loaded once through the source;
75
+ `not-found` for a missing row except on the kinds the cloud never probes
76
+ (`NOT_FOUND_EXEMPT_KINDS`: `identity_account`, `iam_policy` — account ids
77
+ cannot be enumerated); the model's answer with an empty reason on a denial so
78
+ the annotation's copy wins; every fault `unavailable`, never a denial and
79
+ never a throw.
80
+ - `organization-directory.ts` — `findMyOrganizations` as the cloud answers it
81
+ (`listObjectIds(can_view, organization)`): the organizations the person's rows
82
+ name, kept when `can_view` holds; the `internal` class sees all (the
83
+ in-process authorization skip); enumeration refused.
84
+ - `schedule-fire-caller.ts` — a fire acts as the schedule's creator, resolved
85
+ from the row's stamp as an account id or as the 3.14.x raw subject; a stamp
86
+ that names no person is the seam's deterministic refusal, which the RunStarter
87
+ counts against the schedule instead of retrying forever.
88
+ - `list-read-scope.ts` — the `ListReadScope` driver, the cloud's twin
89
+ (`stigmer-cloud src/iam/list-read-scope.ts`): every candidate a list lane
90
+ offers is answered by `can_view` under the listing context (`allow: false`,
91
+ the public wildcard suppressed) — one evaluator walk per candidate over one
92
+ source seeded with the candidates' facts, so no candidate row is read twice
93
+ and a parent hop reads each distinct parent once; the enumeration verb
94
+ (search, recent activity, the two execution summaries — the console library
95
+ rides it) scans the kind and evaluates the same way, a row that does not
96
+ decode skipped; the `internal` class keeps everything (the in-process skip); a
97
+ fault throws and is never an empty answer; an undeclared kind is a consumer
98
+ bug, loud.
99
+ - `posture.ts` — the three postures, named once for the composition root and the
100
+ boot log.
101
+
102
+ ## Proof
103
+
104
+ `__tests__/store-tests.test.ts` is the proof that this evaluator answers the
105
+ cloud's model the cloud's way: every `checkRelation` assertion of all twenty
106
+ documents on a declared kind, in the documents' own words, with what is not run
107
+ pinned as a named list. `__tests__/facts.test.ts` pins that the derivation reads
108
+ a row to the same links and shapes the tuple lifecycle writes from, for every
109
+ kind. `model/__tests__/registry.test.ts` pins the declared set to the
110
+ open-source tier and each kind's wire permissions to its file;
111
+ `__tests__/wire-permissions.test.ts` pins that every static `(kind, permission)`
112
+ a served RPC asks about is a declared relation. The rest pin the machinery:
113
+ alias matching, the wildcard's condition, the memo, the bounds, the source and
114
+ the two derived rules on both store drivers. The four drivers are pinned arm by
115
+ arm on both store drivers (`__tests__/authorizer.test.ts`,
116
+ `organization-directory.test.ts`, `schedule-fire-caller.test.ts`,
117
+ `list-read-scope.test.ts` — the adversarial cells first: the outsider, the
118
+ viewer rung, the admin who does not read members' conversations, the orphaned
119
+ execution, the memory with no subject), the posture at the wire over three real
120
+ boots (`extensions/__tests__/built-in-authorization-composed.test.ts`, the list
121
+ lanes included, and the two-boot proof that the sole person's lists are
122
+ byte-identical with and without the scope), and the scope's cost is measured
123
+ rather than assumed (`list-read-scope.measure.test.ts`, gated on
124
+ `AUTHORIZATION_MEASURE=1`).