@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
@@ -7,7 +7,8 @@
7
7
  * no unit registered an Authorizer); a composition with its own
8
8
  * Authorizer has its own onboarding and never constructs this.
9
9
  *
10
- * Two moments:
10
+ * Three moments, one set of arms (`roleFor`, the pure function the first
11
+ * and third share):
11
12
  *
12
13
  * onAccountCreated(account, caller) — a person's FIRST provisioning, and
13
14
  * only that (the identity-account domain's AccountCreatedHook, run by
@@ -50,6 +51,30 @@
50
51
  * email and name — so its audit actor reads like every other write on
51
52
  * that laptop.
52
53
  *
54
+ * ensureRolesForExistingAccounts() — the built-in posture's boot
55
+ * reconciliation, ONCE per database. The first moment runs only on the
56
+ * call that CREATES an account, so a self-host whose people were
57
+ * provisioned before the rules existed (3.15.x with OIDC on) holds
58
+ * accounts with no role rows, and under an enforcing authorizer every
59
+ * one of them would be an outsider on every organization with nobody
60
+ * able to grant a way back. At the first boot where the bootstrap-state
61
+ * marker (ROLES_RECONCILED_KEY) is absent, the arms above run for every
62
+ * PERSON account (`isPersonAccount`: not a machine account, the row-
63
+ * level twin of the `user`-class gate), acting as that account, in
64
+ * creation order — the order the sign-ins would have run the hook in,
65
+ * so arm 4 hands an unclaimed organization to its first sign-in and
66
+ * not to whoever sorts first by id — and the marker is written after
67
+ * the last account. A fault propagates and the boot fails loudly (the
68
+ * storage stage's posture) with the marker unset; the grant path is
69
+ * idempotent and an organization already held is skipped, so the next
70
+ * boot converges. The marker, not "zero rows", is what makes it
71
+ * one-shot: a database whose every role was revoked after the marker is
72
+ * never handed back to anyone by a reboot (plan finding 2's reason,
73
+ * applied to the whole store). Accounts are read through the generic
74
+ * Store as the organizations and blueprints are (Q-S4-5) — the account
75
+ * port carries no enumeration, by its own rule that a port does not
76
+ * carry a method only one edition calls, and this act is open source's.
77
+ *
53
78
  * What a creator stamp is. The rules read `status.audit.spec_audit
54
79
  * .created_by.id` off organizations and blueprints. That stamp is the
55
80
  * caller's identityId at the time: a provisioned caller's ACCOUNT id, an
@@ -92,6 +117,8 @@ import { SkillSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb"
92
117
  import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
93
118
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
94
119
  import type { IdentityAccount } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/api_pb";
120
+ import { IdentityAccountSchema } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/api_pb";
121
+ import { IdentityAccountProvisioningMode } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/enum_pb";
95
122
  import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
96
123
  import { OrganizationSchema } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/api_pb";
97
124
 
@@ -101,8 +128,10 @@ import { SYSTEM_OPERATOR_IDENTITY_ID } from "../../pipeline/interceptors/auth.js
101
128
  import { auditOf } from "../../pipeline/steps/defaults.js";
102
129
  import { metadataOf } from "../../pipeline/steps/shapes.js";
103
130
  import type { Store } from "../../store/interface.js";
131
+ import { rfc3339Seconds } from "../../store/rfc3339.js";
132
+ import { accountAsCaller } from "../identityaccount/actor.js";
104
133
  import type { AccountCreatedHook } from "../identityaccount/provisioning.js";
105
- import { BLUEPRINT_KINDS } from "./constants.js";
134
+ import { BLUEPRINT_KINDS, ROLES_RECONCILED_KEY } from "./constants.js";
106
135
  import type { IamPolicyGrantPath } from "./grant-path.js";
107
136
  import { organizationRole, relationOf } from "./specs.js";
108
137
  import type { IamPolicyStore } from "./store.js";
@@ -119,6 +148,8 @@ export interface MembershipRulesDeps {
119
148
  export interface MembershipRules extends AccountCreatedHook {
120
149
  /** The trusted-local boot ensure: `owner` wherever no owner row exists. */
121
150
  ensureOperatorOwnership(operator: IdentityAccount): Promise<void>;
151
+ /** The built-in posture's boot reconciliation: the arms for every person provisioned before the rules existed, once per database. */
152
+ ensureRolesForExistingAccounts(): Promise<void>;
122
153
  }
123
154
 
124
155
  /**
@@ -142,17 +173,106 @@ const ORGANIZATION = kindEnumName(ApiResourceKind.organization);
142
173
  const IDENTITY_ACCOUNT = kindEnumName(ApiResourceKind.identity_account);
143
174
 
144
175
  /** What the scan keeps of a resource: its id, its organization (blueprints), its creator stamp. */
145
- interface ScannedResource {
176
+ export interface ScannedResource {
146
177
  readonly id: string;
147
178
  readonly org: string;
148
179
  readonly createdBy: string;
149
180
  }
150
181
 
151
- /** A creator stamp that names a person: non-empty and not the unconfigured laptop's placeholder. */
152
- function isPersonStamp(stamp: string): boolean {
182
+ /**
183
+ * A creator stamp that names a person: non-empty and not the unconfigured
184
+ * laptop's placeholder. Exported for the built-in authorizer's derivation
185
+ * (authorization/derived-tuples.ts), which turns a stamp into an owner or
186
+ * creator tuple only when this says the stamp is somebody's — the one
187
+ * predicate, read from the module that owns the doctrine above.
188
+ */
189
+ export function isPersonStamp(stamp: string): boolean {
153
190
  return stamp !== "" && stamp !== SYSTEM_OPERATOR_IDENTITY_ID;
154
191
  }
155
192
 
193
+ /**
194
+ * An account row that is a person's — the row-level twin of the hook's
195
+ * `user`-class gate, for the reconciliation, which has a row and no
196
+ * caller. A machine account (`is_machine_account`, or the `machine`
197
+ * provisioning mode) earns no role, exactly as a `machine`-class caller
198
+ * earns none at the hook.
199
+ */
200
+ export function isPersonAccount(account: IdentityAccount): boolean {
201
+ const spec = account.spec;
202
+ return (
203
+ spec !== undefined &&
204
+ !spec.isMachineAccount &&
205
+ spec.provisioningMode !== IdentityAccountProvisioningMode.machine
206
+ );
207
+ }
208
+
209
+ /** One organization's question for one account: everything the five arms read, resolved by the caller. */
210
+ export interface RoleQuestion {
211
+ readonly accountId: string;
212
+ /** The account's issuer subject (`spec.idp_id`); a stamp equal to it is the account's own (the alias rule). */
213
+ readonly subject: string;
214
+ readonly email: string;
215
+ /** STIGMER_OPERATOR_EMAIL as configured; "" matches nobody. */
216
+ readonly operatorEmail: string;
217
+ readonly organization: ScannedResource;
218
+ readonly blueprintsInOrganization: ReadonlyArray<ScannedResource>;
219
+ /** Whether ANY role row exists on the organization — arm 4's "zero rows", read by the caller through the port. */
220
+ readonly organizationHasRows: boolean;
221
+ }
222
+
223
+ /**
224
+ * The five arms in their ruled order, as one pure function over what they
225
+ * read — the one statement of "which role does this person get here",
226
+ * shared by the first-sign-in hook and the boot reconciliation so the two
227
+ * moments cannot drift. Arms 3 and 4 both answer `admin`; 3 comes first
228
+ * because it is a string compare and 4 needs the rows read.
229
+ */
230
+ export function roleFor(question: RoleQuestion): IamRole {
231
+ const {
232
+ accountId,
233
+ subject,
234
+ email,
235
+ operatorEmail,
236
+ organization,
237
+ blueprintsInOrganization,
238
+ organizationHasRows,
239
+ } = question;
240
+ const isMine = (stamp: string): boolean =>
241
+ stamp !== "" && (stamp === subject || stamp === accountId);
242
+ if (isMine(organization.createdBy)) {
243
+ return IamRole.owner;
244
+ }
245
+ if (blueprintsInOrganization.some((b) => isMine(b.createdBy))) {
246
+ return IamRole.admin;
247
+ }
248
+ if (operatorEmail !== "" && email === operatorEmail) {
249
+ return IamRole.admin;
250
+ }
251
+ const anotherPersonStamped = [
252
+ organization.createdBy,
253
+ ...blueprintsInOrganization.map((b) => b.createdBy),
254
+ ].some((stamp) => isPersonStamp(stamp) && !isMine(stamp));
255
+ if (!anotherPersonStamped && !organizationHasRows) {
256
+ return IamRole.admin;
257
+ }
258
+ return IamRole.member;
259
+ }
260
+
261
+ /** The world one pass of the arms reads: scanned ONCE by the caller, whether for one account or for all. */
262
+ interface ScannedWorld {
263
+ readonly organizations: ReadonlyArray<ScannedResource>;
264
+ readonly blueprints: ReadonlyArray<ScannedResource>;
265
+ }
266
+
267
+ /** `spec_audit.created_at` in epoch milliseconds; a row with no stamp sorts first (it is the oldest thing we know nothing about). */
268
+ function createdAtMillisOf(account: IdentityAccount): number {
269
+ const stamp = account.status?.audit?.specAudit?.createdAt;
270
+ if (stamp === undefined) {
271
+ return Number.NEGATIVE_INFINITY;
272
+ }
273
+ return Number(stamp.seconds) * 1000 + Math.floor(stamp.nanos / 1_000_000);
274
+ }
275
+
156
276
  export function newMembershipRules(deps: MembershipRulesDeps): MembershipRules {
157
277
  const { grantPath, policies, store, operatorEmail } = deps;
158
278
 
@@ -195,13 +315,79 @@ export function newMembershipRules(deps: MembershipRulesDeps): MembershipRules {
195
315
  );
196
316
  }
197
317
 
318
+ /** The whole world one pass reads, scanned once: every organization and every blueprint. */
319
+ async function scanWorld(): Promise<ScannedWorld> {
320
+ return {
321
+ organizations: await scan(ApiResourceKind.organization),
322
+ blueprints: await scanBlueprints(),
323
+ };
324
+ }
325
+
326
+ /**
327
+ * The arms for ONE account over a scanned world: a row on every
328
+ * organization the account holds none on, granted as `caller`. Shared
329
+ * by the hook (one account, the world scanned for it) and the
330
+ * reconciliation (the world scanned once for every account).
331
+ */
332
+ async function applyRulesTo(
333
+ account: IdentityAccount,
334
+ caller: CallerIdentity,
335
+ world: ScannedWorld,
336
+ ): Promise<void> {
337
+ const accountId = account.metadata?.id ?? "";
338
+ if (accountId === "") {
339
+ throw new Error("membership rules: the account carries no id");
340
+ }
341
+ const subject = account.spec?.idpId ?? "";
342
+ const email = account.spec?.email ?? "";
343
+ const held = await organizationsHeldBy(accountId);
344
+
345
+ for (const organization of world.organizations) {
346
+ if (held.has(organization.id)) {
347
+ continue;
348
+ }
349
+ const blueprintsInOrganization = world.blueprints.filter(
350
+ (blueprint) => blueprint.org === organization.id,
351
+ );
352
+ const role = roleFor({
353
+ accountId,
354
+ subject,
355
+ email,
356
+ operatorEmail,
357
+ organization,
358
+ blueprintsInOrganization,
359
+ organizationHasRows:
360
+ (await policies.findByResource(ORGANIZATION, organization.id))
361
+ .length > 0,
362
+ });
363
+ await grantPath.grant(
364
+ organizationRole(accountId, role, organization.id),
365
+ caller,
366
+ );
367
+ }
368
+ }
369
+
370
+ /** Every person account the store holds, oldest first (creation stamp, then id) — the order their sign-ins ran in. */
371
+ async function scanPersonAccounts(): Promise<IdentityAccount[]> {
372
+ const rows = await store.listResources(ApiResourceKind.identity_account);
373
+ return rows
374
+ .map((bytes) => fromBinary(IdentityAccountSchema, bytes))
375
+ .filter(isPersonAccount)
376
+ .sort((a, b) => {
377
+ const byCreation = createdAtMillisOf(a) - createdAtMillisOf(b);
378
+ if (byCreation !== 0) {
379
+ return byCreation;
380
+ }
381
+ return (a.metadata?.id ?? "").localeCompare(b.metadata?.id ?? "");
382
+ });
383
+ }
384
+
198
385
  return {
199
386
  async onAccountCreated(account, caller): Promise<void> {
200
387
  if (caller.callerClass !== "user") {
201
388
  return;
202
389
  }
203
- const accountId = account.metadata?.id ?? "";
204
- if (accountId === "") {
390
+ if ((account.metadata?.id ?? "") === "") {
205
391
  throw new Error(
206
392
  "membership rules: the provisioned account carries no id",
207
393
  );
@@ -210,44 +396,33 @@ export function newMembershipRules(deps: MembershipRulesDeps): MembershipRules {
210
396
  if (organizations.length === 0) {
211
397
  return;
212
398
  }
213
- const subject = account.spec?.idpId ?? "";
214
- const email = account.spec?.email ?? "";
215
- const isMine = (stamp: string): boolean =>
216
- stamp !== "" && (stamp === subject || stamp === accountId);
217
- const held = await organizationsHeldBy(accountId);
218
- const blueprints = await scanBlueprints();
399
+ await applyRulesTo(account, caller, {
400
+ organizations,
401
+ blueprints: await scanBlueprints(),
402
+ });
403
+ },
219
404
 
220
- for (const organization of organizations) {
221
- if (held.has(organization.id)) {
222
- continue;
223
- }
224
- const inOrganization = blueprints.filter(
225
- (blueprint) => blueprint.org === organization.id,
226
- );
227
- let role: IamRole;
228
- if (isMine(organization.createdBy)) {
229
- role = IamRole.owner;
230
- } else if (inOrganization.some((b) => isMine(b.createdBy))) {
231
- role = IamRole.admin;
232
- } else if (operatorEmail !== "" && email === operatorEmail) {
233
- role = IamRole.admin;
234
- } else if (
235
- ![
236
- organization.createdBy,
237
- ...inOrganization.map((b) => b.createdBy),
238
- ].some((stamp) => isPersonStamp(stamp) && !isMine(stamp)) &&
239
- (await policies.findByResource(ORGANIZATION, organization.id))
240
- .length === 0
241
- ) {
242
- role = IamRole.admin;
243
- } else {
244
- role = IamRole.member;
405
+ async ensureRolesForExistingAccounts(): Promise<void> {
406
+ if ((await store.bootstrapState.get(ROLES_RECONCILED_KEY)) !== "") {
407
+ return;
408
+ }
409
+ const accounts = await scanPersonAccounts();
410
+ if (accounts.length > 0) {
411
+ const world = await scanWorld();
412
+ for (const account of accounts) {
413
+ // As the account itself (actor.ts, the one construction), so the
414
+ // row's audit actor reads exactly as the person's own first
415
+ // sign-in would have stamped it.
416
+ await applyRulesTo(account, accountAsCaller(account), world);
245
417
  }
246
- await grantPath.grant(
247
- organizationRole(accountId, role, organization.id),
248
- caller,
249
- );
250
418
  }
419
+ // After the last account, never before: a fault above leaves the
420
+ // marker unset and the next boot converges (the grant path is
421
+ // idempotent; an organization already held is skipped).
422
+ await store.bootstrapState.set(
423
+ ROLES_RECONCILED_KEY,
424
+ rfc3339Seconds(new Date()),
425
+ );
251
426
  },
252
427
 
253
428
  async ensureOperatorOwnership(operator): Promise<void> {
@@ -255,7 +430,10 @@ export function newMembershipRules(deps: MembershipRulesDeps): MembershipRules {
255
430
  if (accountId === "") {
256
431
  throw new Error("membership rules: the operator account carries no id");
257
432
  }
258
- const actor = operatorActor(operator, accountId);
433
+ // The operator acting as its account (domain/identityaccount/actor.ts,
434
+ // the one construction): the row's audit actor is the account,
435
+ // named the way every other trusted-local write names it.
436
+ const actor = accountAsCaller(operator);
259
437
  for (const organization of await scan(ApiResourceKind.organization)) {
260
438
  const owners = await policies.findByResourceWithRelations(
261
439
  ORGANIZATION,
@@ -273,26 +451,3 @@ export function newMembershipRules(deps: MembershipRulesDeps): MembershipRules {
273
451
  },
274
452
  };
275
453
  }
276
-
277
- /**
278
- * The operator acting as its account: the trusted-local identity shape
279
- * (pipeline/interceptors/auth.ts trustedLocalIdentityFor — no issuer, no
280
- * token; email and display name only when known) with the account id as
281
- * the principal, so the row's audit actor is the account, named the way
282
- * every other trusted-local write names it.
283
- */
284
- function operatorActor(
285
- operator: IdentityAccount,
286
- accountId: string,
287
- ): CallerIdentity {
288
- const email = operator.spec?.email ?? "";
289
- const displayName = operator.metadata?.name ?? "";
290
- return {
291
- identityId: accountId,
292
- callerClass: "user",
293
- issuer: "",
294
- rawToken: "",
295
- ...(email !== "" ? { email } : {}),
296
- ...(displayName !== "" ? { displayName } : {}),
297
- };
298
- }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * An account acting as itself — the ONE construction of the caller
3
+ * identity server code stamps when it acts on a person's behalf without
4
+ * a token in hand. The shape is the trusted-local identity's
5
+ * (pipeline/interceptors/auth.ts trustedLocalIdentityFor: no issuer, no
6
+ * token; email and display name only when known) with the account id as
7
+ * the principal, so the audit actor on every write it makes is the
8
+ * account, named the way every other write names it.
9
+ *
10
+ * Two lanes build it: the trusted-local boot ensure, which grants the
11
+ * operator ownership AS their account (domain/iampolicy/membership.ts),
12
+ * and the built-in schedule fire caller, which makes a fire act as the
13
+ * schedule's creator (authorization/schedule-fire-caller.ts). Both ride
14
+ * the in-process transport, whose interceptor stamps `origin:
15
+ * "in-process"` on top — the transport-trust marker is never set here.
16
+ *
17
+ * Why not a token: open source mints no credential for a person the
18
+ * server is composing a request for; the identity is what the
19
+ * propagation header carries, and every consumer that reads a subject off
20
+ * the raw token (`idpIdOf`) is reached only through `accountForCaller`,
21
+ * which resolves this identity by its id first and never asks the token.
22
+ */
23
+ import type { IdentityAccount } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/api_pb";
24
+
25
+ import type { CallerIdentity } from "../../extensions/identity.js";
26
+
27
+ export function accountAsCaller(account: IdentityAccount): CallerIdentity {
28
+ const accountId = account.metadata?.id ?? "";
29
+ if (accountId === "") {
30
+ throw new Error(
31
+ "identity account carries no id — refusing to build a caller for an empty principal",
32
+ );
33
+ }
34
+ const email = account.spec?.email ?? "";
35
+ const displayName = account.metadata?.name ?? "";
36
+ return {
37
+ identityId: accountId,
38
+ callerClass: "user",
39
+ issuer: "",
40
+ rawToken: "",
41
+ ...(email !== "" ? { email } : {}),
42
+ ...(displayName !== "" ? { displayName } : {}),
43
+ };
44
+ }
@@ -77,6 +77,7 @@ import {
77
77
  EXISTING_RESOURCE_KEY,
78
78
  newLoadExistingStep,
79
79
  } from "../../pipeline/steps/load-existing.js";
80
+ import { newGuardPluginManagedStep } from "../../pipeline/steps/guard-plugin-managed.js";
80
81
  import {
81
82
  SHOULD_CREATE_KEY,
82
83
  newLoadForApplyStep,
@@ -269,6 +270,10 @@ async function update(
269
270
  .addStep(newValidateProtoStep())
270
271
  .addStep(newResolveSlugStep())
271
272
  .addStep(newLoadExistingStep(deps.store))
273
+ // A resource a plugin materialised is the plugin's to redefine; a client
274
+ // write is refused naming the plugin (GuardPluginManaged, keyed on the
275
+ // STORED labels and the plugin row's existence).
276
+ .addStep(newGuardPluginManagedStep(deps.store))
272
277
  .addStep(newBuildUpdateStateStep())
273
278
  .addStep(newGuardReservedLabelsStep(deps.authorizer))
274
279
  .addStep(newValidateDefaultEnabledToolsStep())
@@ -374,6 +379,7 @@ async function deleteMcpServer(
374
379
  )
375
380
  .addStep(newValidateProtoStep())
376
381
  .addStep(newLoadExistingForDeleteStep(deps.store, McpServerSchema))
382
+ .addStep(newGuardPluginManagedStep(deps.store))
377
383
  .addStep(newDeleteResourceStep(deps.store))
378
384
  .addStep(
379
385
  newCleanupIamPoliciesStep(deps.authorizationLifecycle, deps.logger),
@@ -426,6 +432,11 @@ async function updateVisibility(
426
432
  )
427
433
  .addStep(newValidateProtoStep())
428
434
  .addStep(newLoadMcpServerForVisibilityUpdateStep(deps.store))
435
+ .addStep(
436
+ newGuardPluginManagedStep(deps.store, {
437
+ existingKey: UPDATE_VISIBILITY_MCP_SERVER_KEY,
438
+ }),
439
+ )
429
440
  .addStep(
430
441
  newRecordVisibilityBeforeUpdateStep(UPDATE_VISIBILITY_MCP_SERVER_KEY),
431
442
  )