@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
@@ -32,7 +32,13 @@
32
32
  *
33
33
  * - No scope composed = the OSS full scan, byte-identical (the four
34
34
  * local conformance rosters pin it; the org argument is then not
35
- * consulted either).
35
+ * consulted either). That is the trusted-local posture. Under the
36
+ * built-in authorization posture (src/authorization/posture.ts — an
37
+ * authentication posture with no unit Authorizer) open source
38
+ * composes its own scope (src/authorization/list-read-scope.ts): the
39
+ * cloud's model, evaluated per candidate over the facts the candidate
40
+ * carries, so a self-host's lists show a person what a `get` would
41
+ * let them read. A unit's registered scope wins in every posture.
36
42
  * - A scope only NARROWS. It never reorders, never adds; sort/filter
37
43
  * tails, per-lane org intersection, and empty-set semantics (empty
38
44
  * list, proto default instance, kind-skipped) stay consumer-owned
@@ -71,21 +77,76 @@
71
77
  * untouched with the org unconsulted (the first line above). Two lanes
72
78
  * have no org on the wire (`session.list`, `apiKey.findAll`) and offer
73
79
  * the kind until P1 entry 12 pages them.
80
+ * - A KIND WHOSE AUTHORIZATION IS ITS PARENT'S CARRIES THAT PARENT ON
81
+ * EVERY CANDIDATE (stigmer-cloud 20260913.04 T04, Q-LB-33..36). When
82
+ * `kind_meta` declares PARENT scope with INHERITED owner
83
+ * (`inheritedAuthorizationParentOf`; today agent_execution → session),
84
+ * the helper fills `ListEntryMeta.authorizationParent` from the row's
85
+ * spec through the same read the tuple lifecycle wrote the parent link
86
+ * with. A driver MAY answer the parent's question in place of the
87
+ * child's: by the model's construction the two answers are identical
88
+ * (the child's `owner`, `viewer` and `can_view` are all `from` the
89
+ * parent), and the parent's resolution is direct tuples where the
90
+ * child's walks the parent's whole set (OpenFGA's learned `weight2`
91
+ * strategy read the founder's 423 sessions per execution; that is what
92
+ * rolled back twice on 2026-09-14). A driver that ignores the field is
93
+ * still correct. The one observable difference is stated, not hidden:
94
+ * a row whose parent tuple never landed (the create chain's "row
95
+ * survives, tuple write failed" state, healed by retry) is hidden by
96
+ * the child's check and shown by the parent's — the row's truth, read
97
+ * from the field the tuple was derived from, and no widening: nobody
98
+ * reaches a parent through it who could not create the row in it.
99
+ * - EVERY CANDIDATE CARRIES THE ROW'S AUTHORIZATION FACTS (the
100
+ * built-in scope's entry): the creator stamp, the visibility level
101
+ * and every parent link the tuple lifecycle would have written — the
102
+ * `RowAuthorizationFacts` the row's tuples derive from, read by the
103
+ * one structural resolver the built-in authorizer reads a loaded row
104
+ * through (pipeline/steps/authorization-facts.ts). A driver that
105
+ * evaluates the model over a candidate therefore needs no second
106
+ * read of a row the lane already decoded; a driver that asks an
107
+ * engine ignores the facts and is byte-neutral. The facts are
108
+ * REQUIRED on the candidate, never optional: both are always on the
109
+ * row the helper holds, and an optional field would let a driver
110
+ * silently skip the check.
74
111
  */
75
112
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
113
+ import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
114
+ import type { ApiResourceAudit } from "@stigmer/protos/ai/stigmer/commons/apiresource/status_pb";
115
+
116
+ // The only VALUE imports from extensions/ into pipeline/ (every other
117
+ // crossing is a type): three pure leaf modules that import nothing but
118
+ // protos and each other, so there is no cycle. Deliberate — one resolver
119
+ // for the tuple writer, the point-check driver and the list reader beats
120
+ // a copy in the seam.
121
+ import { inheritedAuthorizationParentOf } from "../pipeline/apiresource-meta.js";
122
+ import { rowAuthorizationFactsOf } from "../pipeline/steps/authorization-facts.js";
76
123
 
77
124
  import type { CallerIdentity } from "./identity.js";
125
+ import type {
126
+ ResolvedParentLink,
127
+ RowAuthorizationFacts,
128
+ } from "./resource-authorization.js";
78
129
 
79
130
  /**
80
- * The candidate metadata a post-scan lane offers the scope — the three
81
- * fields the cloud driver's rules key on (id for the FGA intersection,
82
- * labels for the guest cookie rule; org rides along for symmetry with
83
- * the consumer-owned intersection, so a driver can log or assert on it).
131
+ * The candidate a post-scan lane offers the scope: the row's authorization
132
+ * facts (the header's last contract line), the labels the cloud driver's
133
+ * guest cookie rule keys on (org rides along in the facts for symmetry
134
+ * with the consumer-owned intersection, so a driver can log or assert on
135
+ * it), and the parent for kinds whose authorization is their parent's.
84
136
  */
85
- export interface ListEntryMeta {
86
- readonly id: string;
87
- readonly org: string;
137
+ export interface ListEntryMeta extends RowAuthorizationFacts {
88
138
  readonly labels: Readonly<Record<string, string>>;
139
+ /**
140
+ * OPTIONAL (added 20260913.04 T04): the parent this row's authorization
141
+ * IS — present only for a kind whose `kind_meta` is PARENT scope with
142
+ * INHERITED owner (the header's contract line), the same
143
+ * `ResolvedParentLink` the tuple lifecycle wrote for the row and one of
144
+ * the candidate's own `parentLinks`, named again as the designation a
145
+ * driver may answer in place of the child. Absent for every other kind,
146
+ * and absent when the row's spec does not name its parent — a driver
147
+ * then asks about the row itself, never drops it.
148
+ */
149
+ readonly authorizationParent?: ResolvedParentLink;
89
150
  }
90
151
 
91
152
  /** The scope contract (single-instance point, ExtensionDrivers.listReadScope). */
@@ -117,14 +178,21 @@ export interface ListReadScope {
117
178
 
118
179
  /**
119
180
  * The shape every stored API resource message presents to the shared
120
- * helper — the metadata fields the scope's candidates are built from.
181
+ * helper — the metadata fields the scope's candidates are built from, the
182
+ * spec the parents are read from (structurally, by `kind_meta`'s
183
+ * `spec_field`; typed loosely because the field differs per kind and the
184
+ * read is `parentIdOf`'s), and the audit the creator stamp is read from
185
+ * (the one generated type every kind's status carries it as).
121
186
  */
122
187
  export interface ScopedListResource {
123
188
  metadata?: {
124
189
  id?: string;
125
190
  org?: string;
126
191
  labels?: Record<string, string>;
192
+ visibility?: ApiResourceVisibility;
127
193
  };
194
+ spec?: object;
195
+ status?: { audit?: ApiResourceAudit };
128
196
  }
129
197
 
130
198
  /**
@@ -141,8 +209,13 @@ export interface ScopedListResource {
141
209
  * permission-bounded across orgs, verified per lane in the entry's
142
210
  * census — lanes Java does not org-narrow pass ""), then to the kept
143
211
  * ids. The same set either way (both are per-row predicates); the
144
- * order is the header's last contract line: the scope sees the org's
145
- * rows, not the kind's.
212
+ * order is the header's second-to-last contract line: the scope sees
213
+ * the org's rows, not the kind's;
214
+ * - every candidate carries the row's authorization facts, and the
215
+ * candidates of a kind whose authorization is its parent's name that
216
+ * parent again as `authorizationParent` — one of the facts' parent
217
+ * links, picked by the relation `kind_meta` declares, resolved once
218
+ * per call and read once per row.
146
219
  */
147
220
  export async function restrictListByReadScope<T extends ScopedListResource>(
148
221
  scope: ListReadScope | undefined,
@@ -158,11 +231,38 @@ export async function restrictListByReadScope<T extends ScopedListResource>(
158
231
  requestOrg === ""
159
232
  ? resources
160
233
  : resources.filter((resource) => resource.metadata?.org === requestOrg);
161
- const entries: ListEntryMeta[] = offered.map((resource) => ({
162
- id: resource.metadata?.id ?? "",
163
- org: resource.metadata?.org ?? "",
164
- labels: resource.metadata?.labels ?? {},
165
- }));
234
+ const parentOf = authorizationParentReader(kind);
235
+ const entries: ListEntryMeta[] = offered.map((resource) => {
236
+ const entry: ListEntryMeta = {
237
+ ...rowAuthorizationFactsOf(kind, resource),
238
+ labels: resource.metadata?.labels ?? {},
239
+ };
240
+ const authorizationParent = parentOf(entry.parentLinks);
241
+ return authorizationParent === undefined
242
+ ? entry
243
+ : { ...entry, authorizationParent };
244
+ });
166
245
  const keptIds = await scope.restrictListEntries(caller, kind, entries);
167
246
  return offered.filter((resource) => keptIds.has(resource.metadata?.id ?? ""));
168
247
  }
248
+
249
+ /**
250
+ * The per-row parent picker for `kind`: a constant `undefined` for the 27
251
+ * kinds whose authorization is their own, and for the kind whose
252
+ * authorization is its parent's, the link among the row's own parent
253
+ * links that carries the declared relation — or undefined for a row whose
254
+ * spec does not name it (never a throw: a list is not a create).
255
+ * `kind_meta` is consulted once per call, not once per row.
256
+ */
257
+ function authorizationParentReader(
258
+ kind: ApiResourceKind,
259
+ ): (
260
+ parentLinks: ReadonlyArray<ResolvedParentLink>,
261
+ ) => ResolvedParentLink | undefined {
262
+ const parent = inheritedAuthorizationParentOf(kind);
263
+ if (parent === undefined) {
264
+ return () => undefined;
265
+ }
266
+ return (parentLinks) =>
267
+ parentLinks.find((link) => link.relation === parent.relation);
268
+ }
@@ -5,19 +5,23 @@
5
5
  * conformance capability flags, and this port is their ONE seam:
6
6
  *
7
7
  * - `find` (org enumeration; capability `organizationEnumeration`):
8
- * single-tenant OSS enumerates freely; the cloud refuses with
9
- * UNIMPLEMENTED (tenant isolation — no caller may list orgs it does
10
- * not belong to).
11
- * - `findMyOrganizations` (capability `multiTenant`): OSS answers ALL
12
- * organizations (single-user semantics); the cloud filters to the
13
- * caller's authorized set.
8
+ * the trusted-local laptop enumerates freely; the cloud — and open
9
+ * source under the built-in authorization posture — refuses with
10
+ * UNIMPLEMENTED (no caller may list organizations they hold no role
11
+ * in; `find` is skip-authorization by annotation, so the refusal is
12
+ * the only thing standing between a member and every row).
13
+ * - `findMyOrganizations` (capability `multiTenant`): the trusted-local
14
+ * laptop answers ALL organizations (single-user semantics); the cloud
15
+ * and the built-in directory filter to what the caller may view.
14
16
  * - `getByExternalOrgId` (capability `externalOrgLookup`): deliberately
15
17
  * absent from the OSS partial registration (UNIMPLEMENTED by
16
18
  * construction); the cloud resolves external IdP org ids.
17
19
  *
18
- * No directory composed = the controller's OSS behavior, byte-identical.
19
- * The controller stays the ONE owner of its chains — the directory
20
- * answers policy questions and id lookups; it never handles RPCs.
20
+ * No directory composed = the trusted-local behavior, byte-identical; the
21
+ * built-in directory (authorization/organization-directory.ts) composes
22
+ * under the built-in posture, a unit's under its own. The controller stays
23
+ * the ONE owner of its chains — the directory answers policy questions
24
+ * and id lookups; it never handles RPCs.
21
25
  */
22
26
  import type { CallerIdentity } from "./identity.js";
23
27
 
@@ -55,6 +55,7 @@
55
55
  */
56
56
  import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
57
57
  import type { OwnerAttributionType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
58
+ import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
58
59
  import type { IamPolicy } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/api_pb";
59
60
  import type { IamPolicySpec } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/spec_pb";
60
61
 
@@ -90,6 +91,39 @@ export interface ResolvedParentLink {
90
91
  readonly parentId: string;
91
92
  }
92
93
 
94
+ /**
95
+ * The facts a stored row carries that its authorization tuples derive
96
+ * from — the row-side vocabulary of `kind_meta.authorization`, read back
97
+ * from a row rather than resolved at its create. The lifecycle derives a
98
+ * `ResourceCreatedEvent` from the same facts on the way in; a list lane
99
+ * offers them on every candidate (`ListEntryMeta`, list-read-scope.ts);
100
+ * the built-in authorizer derives a loaded row's tuples from them. One
101
+ * shape, read by one structural resolver
102
+ * (pipeline/steps/authorization-facts.ts), so a driver that evaluates the
103
+ * model over a candidate needs no second read of the row.
104
+ *
105
+ * Read-side facts are lenient where the create-time resolution is strict:
106
+ * a legacy row that names no organization or no parent carries none (an
107
+ * empty `org`, a link absent from `parentLinks`) and a stamp that names
108
+ * nobody is the empty string — a fact about the row, never a fault of the
109
+ * read.
110
+ */
111
+ export interface RowAuthorizationFacts {
112
+ readonly id: string;
113
+ /** `metadata.org`; "" for kinds outside organization scope and for legacy rows that never named one. */
114
+ readonly org: string;
115
+ /** `metadata.visibility` as stored; unspecified when the row never set one. */
116
+ readonly visibility: ApiResourceVisibility;
117
+ /** `status.audit.spec_audit.created_by.id` as stamped; "" when absent. Classified by the reader, not here. */
118
+ readonly createdBy: string;
119
+ /**
120
+ * The scope link and every configured additional parent, in the tuple
121
+ * lifecycle's order, from the row's own fields; a parent the row does
122
+ * not name is absent, never a fault.
123
+ */
124
+ readonly parentLinks: ReadonlyArray<ResolvedParentLink>;
125
+ }
126
+
93
127
  /** Fired synchronously after a resource row is first persisted. */
94
128
  export interface ResourceCreatedEvent {
95
129
  readonly kind: ApiResourceKind;
@@ -2,32 +2,63 @@
2
2
  * The schedule-fire caller seam (stigmer-cloud#572) — WHO a schedule fire
3
3
  * acts as when the RunStarter re-enters the execution create pipeline.
4
4
  *
5
- * OSS deliberately has no caller identity on this lane (DD-015 D-G: the
6
- * single-user edition has no tokens to carry one), so with no driver
7
- * composed every fire enters as the in-process `internal` class — today's
8
- * behavior, byte-identical. The cloud edition's Java baseline instead
9
- * mints a schedule JWT per fire (sub = the org's system-schedule account,
10
- * claim = the firing Schedule id) so the created session and execution
11
- * carry real attribution and the schedule's viewer set reaches the run
12
- * (the FGA model's session#schedule link — "without it a scheduled run is
13
- * invisible to every human, including the schedule's owner"). This seam
14
- * lets a composition supply that identity; the fire then propagates it
15
- * through the R5 caller-propagation header exactly like the other
16
- * request-origin in-process creates.
5
+ * With no driver composed a fire enters as the in-process `internal`
6
+ * class — the trusted-local laptop's lane, where the one caller is the
7
+ * server's operator and attribution has nobody to separate. Under an
8
+ * authentication posture that lane is wrong: the internal class carries
9
+ * the operator's email or `"system"`, which no enforcing evaluator
10
+ * recognizes as a person, so the fired session would belong to nobody
11
+ * (the FGA model's own words — "without it a scheduled run is invisible
12
+ * to every human, including the schedule's owner"). Two drivers answer
13
+ * it: the cloud edition mints a schedule JWT per fire (sub = the org's
14
+ * system-schedule account, claim = the firing Schedule id) so the run
15
+ * reaches the schedule's viewer set through the session#schedule link;
16
+ * open source, under the built-in authorization posture, makes the fire
17
+ * act as the schedule's CREATOR (authorization/schedule-fire-caller.ts),
18
+ * so the run and its session are that person's. The fire then propagates
19
+ * the identity through the R5 caller-propagation header exactly like the
20
+ * other request-origin in-process creates.
17
21
  *
18
22
  * Single-instance point. The mint is per fire — the schedule id is a
19
- * claim of the minted credential, never a cached field — and a mint
20
- * failure is an infrastructure fault: the RunStarter lets it propagate,
21
- * so the tick activity retries (the deterministic execution name absorbs
22
- * the retry) and a manual trigger surfaces the failure to its caller.
23
+ * claim of the minted credential, never a cached field. Two failure
24
+ * shapes, and the RunStarter tells them apart by type, the store-fault
25
+ * precedent (`ResourceNotFoundError` is checked with `instanceof`; every
26
+ * other fault is infrastructure):
27
+ *
28
+ * - any other thrown error is an INFRASTRUCTURE fault: the RunStarter
29
+ * lets it propagate, so the tick activity retries (the deterministic
30
+ * execution name absorbs the retry) and a manual trigger surfaces
31
+ * the failure to its caller;
32
+ * - `ScheduleFireCallerRefusedError` is a DETERMINISTIC refusal — this
33
+ * fire can act as nobody, and no retry will change that (a schedule
34
+ * stamped by no person this server knows). The RunStarter answers
35
+ * the `refused` outcome the way it answers a launch gate's refusal:
36
+ * the failure streak counts it and pauses the schedule with the
37
+ * reason, so the person who scheduled it sees why in the console
38
+ * instead of a tick failing quietly forever.
23
39
  */
24
40
  import type { CallerIdentity } from "./identity.js";
25
41
 
26
42
  export interface ScheduleFireCallerMint {
27
43
  /**
28
44
  * Mints the caller identity one fire acts as. `rawToken` must carry the
29
- * edition's verifiable credential for the identity (compositions read
30
- * fire-scoped claims — e.g. the schedule id — from it downstream).
45
+ * edition's verifiable credential for the identity when the edition
46
+ * reads fire-scoped claims from it downstream (the cloud does — the
47
+ * schedule id); an edition that propagates the identity in-process and
48
+ * reads nothing off the token leaves it empty (open source does).
31
49
  */
32
50
  mintFireCaller(org: string, scheduleId: string): Promise<CallerIdentity>;
33
51
  }
52
+
53
+ /**
54
+ * The mint's deterministic refusal (the module header): thrown by a
55
+ * driver when the fire can act as nobody and retrying cannot help. The
56
+ * message is the reason the schedule's status carries, so it is written
57
+ * for the person who scheduled the run.
58
+ */
59
+ export class ScheduleFireCallerRefusedError extends Error {
60
+ constructor(reason: string) {
61
+ super(reason);
62
+ this.name = "ScheduleFireCallerRefusedError";
63
+ }
64
+ }
package/src/index.ts CHANGED
@@ -148,14 +148,64 @@ export type { AuthorizationQueryEngine } from "./extensions/authorization-querie
148
148
  export type { IdentityFederation } from "./extensions/identity-federation.js";
149
149
  export type { AccountsBySubject } from "./domain/identityaccount/resolve.js";
150
150
  export { identityIdForSubject } from "./domain/identityaccount/resolve.js";
151
+ // The built-in authorizer's model seams: the kind
152
+ // declarations (transcripts of the cloud's `.fga` files), the evaluator,
153
+ // and the OpenFGA store-test kit — exported so the cloud's drift test
154
+ // compares the live model against the transcripts and runs its live
155
+ // store tests through the evaluator, both from the published package.
156
+ // The drivers themselves are composed by the root and are not exported.
157
+ export type {
158
+ DerivedRelation,
159
+ KindDeclaration,
160
+ Rewrite,
161
+ SubjectType,
162
+ } from "./authorization/model/rewrite.js";
163
+ export type { Model } from "./authorization/model/index.js";
164
+ export {
165
+ builtInModel,
166
+ declarationFor,
167
+ newModel,
168
+ } from "./authorization/model/index.js";
169
+ export type {
170
+ CheckContext,
171
+ ObjectRef,
172
+ Person,
173
+ Subject,
174
+ Tuple,
175
+ TupleSource,
176
+ } from "./authorization/tuples.js";
177
+ export type { EvaluationFault } from "./authorization/evaluator.js";
178
+ export {
179
+ AuthorizationEvaluationError,
180
+ MAX_RESOLUTION_DEPTH,
181
+ checkRelation,
182
+ } from "./authorization/evaluator.js";
183
+ export type {
184
+ StoreTestCase,
185
+ StoreTestDocument,
186
+ StoreTestKit,
187
+ StoreTestSkip,
188
+ StoreTestSkipReason,
189
+ } from "./authorization/store-test-kit.js";
190
+ export {
191
+ parseStoreTestDocument,
192
+ storeTestCases,
193
+ } from "./authorization/store-test-kit.js";
194
+ // The kinds whose missing row the built-in authorizer denies instead of
195
+ // answering not-found — the cloud's probe exemption over the open-source
196
+ // tier; exported so the cloud's drift test pins the two sets equal.
197
+ export { NOT_FOUND_EXEMPT_KINDS } from "./authorization/authorizer.js";
151
198
  export type {
152
199
  ListReadScope,
153
200
  ListEntryMeta,
154
201
  } from "./extensions/list-read-scope.js";
155
202
  // The stigmer-cloud#572 seam: the identity a schedule fire acts as
156
203
  // (drivers.scheduleFireCaller) — the composition mints it per fire; the
157
- // RunStarter propagates it through the R5 in-process header.
204
+ // RunStarter propagates it through the R5 in-process header. A mint that
205
+ // can act as nobody throws the seam's typed refusal, which the RunStarter
206
+ // counts against the schedule instead of retrying.
158
207
  export type { ScheduleFireCallerMint } from "./extensions/schedule-fire-caller.js";
208
+ export { ScheduleFireCallerRefusedError } from "./extensions/schedule-fire-caller.js";
159
209
  // The 20260830.03 seam: the visitor-sanitization policy the serving
160
210
  // chain's error boundary consumes (drivers.visitorErrorPolicy) — the
161
211
  // composition supplies WHO is on the anonymous surface and WHAT copy
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Pins `inheritedAuthorizationParentOf` (pipeline/apiresource-meta.ts):
3
+ * the kind_meta question "is this kind's authorization its parent's
4
+ * whole?", answered by the PARENT-scope + INHERITED-owner pair and by
5
+ * nothing else (stigmer-cloud 20260913.04 T04, Q-LB-34).
6
+ *
7
+ * The table below is the WHOLE kind enum, on purpose. The list read scope
8
+ * carries `authorizationParent` for exactly the kinds this function names,
9
+ * and a composed driver asks its authorization backend about the parent
10
+ * in the child's place — so a second kind joining the set is a change in
11
+ * what that driver checks, and must arrive as a reviewed edit of this
12
+ * table, never as a silent consequence of a kind_meta edit. Kinds with
13
+ * additional parents whose inheritance is partial (workflow_execution's
14
+ * opt-in `execution_viewer from workflow_instance`, agent_instance's
15
+ * `viewer from default_of`) own themselves and are pinned as `undefined`.
16
+ */
17
+ import { describe, expect, it } from "vitest";
18
+
19
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
20
+
21
+ import { inheritedAuthorizationParentOf } from "../apiresource-meta.js";
22
+
23
+ describe("inheritedAuthorizationParentOf — the parent a kind's authorization is", () => {
24
+ it("agent_execution's authorization is its session's: relation `session`, spec field `session_id`", () => {
25
+ const parent = inheritedAuthorizationParentOf(
26
+ ApiResourceKind.agent_execution,
27
+ );
28
+ expect(parent).toBeDefined();
29
+ expect(parent?.kind).toBe("session");
30
+ expect(parent?.relation).toBe("session");
31
+ expect(parent?.specField).toBe("session_id");
32
+ });
33
+
34
+ it("every other kind's authorization is its own (the whole enum, pinned)", () => {
35
+ const inherited = Object.values(ApiResourceKind)
36
+ .filter((value): value is ApiResourceKind => typeof value === "number")
37
+ .filter((kind) => kind !== ApiResourceKind.api_resource_kind_unknown)
38
+ .filter((kind) => inheritedAuthorizationParentOf(kind) !== undefined)
39
+ .map((kind) => ApiResourceKind[kind]);
40
+ expect(inherited).toEqual(["agent_execution"]);
41
+ });
42
+
43
+ it.each([
44
+ ApiResourceKind.workflow_execution,
45
+ ApiResourceKind.agent_instance,
46
+ ApiResourceKind.workflow_instance,
47
+ ApiResourceKind.memory,
48
+ ])("a kind with an additional, partial parent owns itself: %s", (kind) => {
49
+ expect(inheritedAuthorizationParentOf(kind)).toBeUndefined();
50
+ });
51
+ });
@@ -157,9 +157,7 @@ describe("R5: caller propagation through the in-process transport", () => {
157
157
  },
158
158
  },
159
159
  );
160
- expect(seen).toEqual([
161
- { ...caller, origin: "in-process" },
162
- ]);
160
+ expect(seen).toEqual([{ ...caller, origin: "in-process" }]);
163
161
  });
164
162
 
165
163
  it("mints the internal class when nothing was propagated (the daemon default)", async () => {
@@ -8,9 +8,12 @@
8
8
  * instances) but never to GRANT anything. Where a grant-shaped decision is
9
9
  * needed, key it on server-owned state instead (e.g. the parent blueprint's
10
10
  * status.default_instance_id, written only by the create/self-heal flows).
11
- * The cloud edition additionally guards the whole reserved namespace at its
12
- * write boundaries (GuardReservedLabelsStep); OSS has no such guard, which
13
- * is one of the reasons OSS predicates must not trust these labels alone.
11
+ * Every write boundary runs GuardReservedLabels over the namespace
12
+ * (pipeline/steps/guard-reserved-labels.ts), but the open-source
13
+ * authorizer's permissive default ALLOWS reserved-label writes by design
14
+ * (the self-hosted operator owns the store), which is why a restrict-shaped
15
+ * predicate here still pairs the label with server-owned state: the
16
+ * plugin-managed guard refuses only beside an existing plugin row.
14
17
  */
15
18
  import type { ApiResourceMetadata } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
16
19
 
@@ -44,6 +47,31 @@ export const SYSTEM_MANAGED_LABEL = `${RESERVED_LABEL_PREFIX}system-managed`;
44
47
  */
45
48
  export const RESERVED_LABEL_TRUE = "true";
46
49
 
50
+ /**
51
+ * The plugin that materialised a resource: the label's value is the
52
+ * plugin's id (`plg_...`), never its slug, because `findAllByLabel` is
53
+ * org-agnostic and two organizations may both install `thermos`. Written
54
+ * only by the plugin controller (in-process, as the installing caller);
55
+ * membership is derived on read from it and stored nowhere else.
56
+ */
57
+ export const PLUGIN_LABEL = `${RESERVED_LABEL_PREFIX}plugin`;
58
+
59
+ /**
60
+ * The archive digest a member was last materialised from — the per-child
61
+ * convergence marker. A re-push compares every member's value with the
62
+ * head's digest before deciding it has nothing to do, so a member another
63
+ * lane deleted or an older install left behind is re-materialised.
64
+ */
65
+ export const PLUGIN_VERSION_LABEL = `${RESERVED_LABEL_PREFIX}plugin-version`;
66
+
67
+ /** The plugin id a resource's labels claim, or undefined when unlabelled. */
68
+ export function pluginIdOf(
69
+ metadata: ApiResourceMetadata | undefined,
70
+ ): string | undefined {
71
+ const value = metadata?.labels[PLUGIN_LABEL];
72
+ return value === undefined || value === "" ? undefined : value;
73
+ }
74
+
47
75
  /**
48
76
  * Whether the metadata carries the DEFAULT_INSTANCE_LABEL marker
49
77
  * (undefined-safe) — Go IsDefaultInstance.
@@ -53,6 +53,11 @@ import {
53
53
  kind_meta,
54
54
  } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
55
55
  import type { ApiResourceKindMeta } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
56
+ import {
57
+ AuthorizationScopeType,
58
+ OwnerAttributionType,
59
+ } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
60
+ import type { ParentRelationConfig } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
56
61
  import type { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
57
62
  import { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
58
63
 
@@ -65,6 +70,38 @@ export function getKindMeta(kind: ApiResourceKind): ApiResourceKindMeta {
65
70
  return getOption(valueDesc, kind_meta);
66
71
  }
67
72
 
73
+ /**
74
+ * The parent a kind's authorization IS — the `kind_meta` declaration that
75
+ * a kind's permissions are its parent's whole, not its own: PARENT scope
76
+ * (the one structural link is to that parent) AND INHERITED owner (no
77
+ * owner tuple of its own; `owner from <parent>` in the FGA model).
78
+ * Undefined for every other kind, including kinds with additional parents
79
+ * whose inheritance is partial (a workflow_execution's opt-in
80
+ * `execution_viewer from workflow_instance` sits beside its own owner).
81
+ *
82
+ * Today exactly one kind answers: agent_execution → session (its
83
+ * `can_view` is `viewer or can_view from session`, and `viewer` is the
84
+ * session's). The list read scope reads this to carry the parent on every
85
+ * candidate (`ListEntryMeta.authorizationParent`, 20260913.04 T04), so a
86
+ * composed driver may ask its authorization backend about the parent —
87
+ * direct tuples — instead of the child, whose resolution walks the
88
+ * parent's whole set. A second kind declaring the pair gets the behavior
89
+ * from this declaration alone; the table pin in __tests__ makes that a
90
+ * reviewed change.
91
+ */
92
+ export function inheritedAuthorizationParentOf(
93
+ kind: ApiResourceKind,
94
+ ): ParentRelationConfig | undefined {
95
+ const config = getKindMeta(kind).authorization;
96
+ if (
97
+ config?.scopeType !== AuthorizationScopeType.PARENT ||
98
+ config.ownerType !== OwnerAttributionType.INHERITED
99
+ ) {
100
+ return undefined;
101
+ }
102
+ return config.parent;
103
+ }
104
+
68
105
  /** Go GetIdPrefix: e.g. agent → "agt". */
69
106
  export function getIdPrefix(kind: ApiResourceKind): string {
70
107
  return getKindMeta(kind).idPrefix;
@@ -24,7 +24,10 @@ export function invalidArgumentError(message: string): ConnectError {
24
24
 
25
25
  /** Go AlreadyExistsError: "%s already exists: %s". */
26
26
  export function alreadyExistsError(resource: string, id: string): ConnectError {
27
- return new ConnectError(`${resource} already exists: ${id}`, Code.AlreadyExists);
27
+ return new ConnectError(
28
+ `${resource} already exists: ${id}`,
29
+ Code.AlreadyExists,
30
+ );
28
31
  }
29
32
 
30
33
  /**
@@ -109,10 +112,7 @@ export function goWrappedStatusError(
109
112
  prefix: string,
110
113
  error: ConnectError,
111
114
  ): ConnectError {
112
- return new ConnectError(
113
- `${prefix}: ${goGrpcErrorText(error)}`,
114
- error.code,
115
- );
115
+ return new ConnectError(`${prefix}: ${goGrpcErrorText(error)}`, error.code);
116
116
  }
117
117
 
118
118
  /**
@@ -55,7 +55,6 @@ import path from "node:path";
55
55
 
56
56
  import { getOption, hasOption } from "@bufbuild/protobuf";
57
57
  import type { DescService } from "@bufbuild/protobuf";
58
- import type { ConnectRouter } from "@connectrpc/connect";
59
58
  import { afterAll, beforeAll, describe, expect, it } from "vitest";
60
59
 
61
60
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
@@ -71,6 +70,7 @@ import { loadConfig } from "../../../boot/config.js";
71
70
  import { composeServer } from "../../../boot/compose.js";
72
71
  import type { ComposedServer } from "../../../boot/compose.js";
73
72
  import { createLogger } from "../../../boot/logger.js";
73
+ import { servedServices } from "../../../extensions/__tests__/composed-support.js";
74
74
 
75
75
  /** One annotated method as the invariant reads it. */
76
76
  interface AnnotationTarget {
@@ -80,25 +80,6 @@ interface AnnotationTarget {
80
80
  readonly skipsResolution: boolean;
81
81
  }
82
82
 
83
- /** Replays the composed routes into a recorder and returns the served services. */
84
- function servedServices(
85
- routes: (router: ConnectRouter) => void,
86
- ): DescService[] {
87
- const served: DescService[] = [];
88
- const recorder = {
89
- handlers: [],
90
- service(desc: DescService) {
91
- served.push(desc);
92
- return recorder;
93
- },
94
- rpc() {
95
- return recorder;
96
- },
97
- };
98
- routes(recorder as unknown as ConnectRouter);
99
- return served;
100
- }
101
-
102
83
  /** Every `rpc.config`-annotated method of the given services, read once. */
103
84
  function annotationTargets(services: DescService[]): AnnotationTarget[] {
104
85
  const targets: AnnotationTarget[] = [];