@stigmer/server 3.15.3-dev.20260914121148 → 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 (555) 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 +47 -20
  304. package/dist/extensions/list-read-scope.d.ts.map +1 -1
  305. package/dist/extensions/list-read-scope.js +20 -24
  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/errors.d.ts.map +1 -1
  325. package/dist/pipeline/errors.js.map +1 -1
  326. package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
  327. package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
  328. package/dist/pipeline/steps/authorization-facts.js +100 -0
  329. package/dist/pipeline/steps/authorization-facts.js.map +1 -0
  330. package/dist/pipeline/steps/delete.d.ts.map +1 -1
  331. package/dist/pipeline/steps/delete.js +1 -1
  332. package/dist/pipeline/steps/delete.js.map +1 -1
  333. package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
  334. package/dist/pipeline/steps/duplicate.js.map +1 -1
  335. package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
  336. package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
  337. package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
  338. package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
  339. package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
  340. package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
  341. package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
  342. package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
  343. package/dist/pipeline/steps/helpers.d.ts.map +1 -1
  344. package/dist/pipeline/steps/helpers.js.map +1 -1
  345. package/dist/pipeline/steps/index-search.d.ts.map +1 -1
  346. package/dist/pipeline/steps/index-search.js.map +1 -1
  347. package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
  348. package/dist/pipeline/steps/load-existing.js +1 -1
  349. package/dist/pipeline/steps/load-existing.js.map +1 -1
  350. package/dist/pipeline/steps/references.d.ts +16 -0
  351. package/dist/pipeline/steps/references.d.ts.map +1 -1
  352. package/dist/pipeline/steps/references.js +18 -0
  353. package/dist/pipeline/steps/references.js.map +1 -1
  354. package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
  355. package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
  356. package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
  357. package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
  358. package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
  359. package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
  360. package/dist/pipeline/steps/slug.d.ts.map +1 -1
  361. package/dist/pipeline/steps/slug.js.map +1 -1
  362. package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
  363. package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
  364. package/dist/pipeline/steps/validate-visibility.js +6 -1
  365. package/dist/pipeline/steps/validate-visibility.js.map +1 -1
  366. package/dist/pipeline/steps/validation.d.ts.map +1 -1
  367. package/dist/pipeline/steps/validation.js.map +1 -1
  368. package/dist/pipeline/steps/version-archive.d.ts +63 -0
  369. package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
  370. package/dist/pipeline/steps/version-archive.js +129 -0
  371. package/dist/pipeline/steps/version-archive.js.map +1 -0
  372. package/dist/pipeline/steps/version-history.d.ts +49 -0
  373. package/dist/pipeline/steps/version-history.d.ts.map +1 -0
  374. package/dist/pipeline/steps/version-history.js +229 -0
  375. package/dist/pipeline/steps/version-history.js.map +1 -0
  376. package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
  377. package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
  378. package/dist/pipeline/steps/visibility-gates.js +7 -2
  379. package/dist/pipeline/steps/visibility-gates.js.map +1 -1
  380. package/dist/query/search/registry.d.ts.map +1 -1
  381. package/dist/query/search/registry.js +2 -0
  382. package/dist/query/search/registry.js.map +1 -1
  383. package/dist/temporal/schedule/run-starter.d.ts +1 -1
  384. package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
  385. package/dist/temporal/schedule/run-starter.js +14 -1
  386. package/dist/temporal/schedule/run-starter.js.map +1 -1
  387. package/package.json +5 -4
  388. package/src/archive/__tests__/archive.test.ts +233 -0
  389. package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
  390. package/src/archive/content-store.ts +132 -0
  391. package/src/archive/inflate.ts +107 -0
  392. package/src/archive/limits.ts +42 -0
  393. package/src/archive/open.ts +131 -0
  394. package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
  395. package/src/archive/write.ts +54 -0
  396. package/src/authorization/README.md +124 -0
  397. package/src/authorization/__tests__/authorizer.test.ts +719 -0
  398. package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
  399. package/src/authorization/__tests__/drivers.ts +70 -0
  400. package/src/authorization/__tests__/evaluator.test.ts +359 -0
  401. package/src/authorization/__tests__/facts.test.ts +155 -0
  402. package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
  403. package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
  404. package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
  405. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
  406. package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
  407. package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
  408. package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
  409. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
  410. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
  411. package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
  412. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
  413. package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
  414. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
  415. package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
  416. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
  417. package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
  418. package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
  419. package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
  420. package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
  421. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
  422. package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
  423. package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
  424. package/src/authorization/__tests__/organization-directory.test.ts +236 -0
  425. package/src/authorization/__tests__/person.test.ts +114 -0
  426. package/src/authorization/__tests__/posture.test.ts +25 -0
  427. package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
  428. package/src/authorization/__tests__/store-tests.test.ts +306 -0
  429. package/src/authorization/__tests__/support.ts +101 -0
  430. package/src/authorization/__tests__/tuples.test.ts +62 -0
  431. package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
  432. package/src/authorization/authorizer.ts +208 -0
  433. package/src/authorization/derived-tuples.ts +384 -0
  434. package/src/authorization/evaluator.ts +283 -0
  435. package/src/authorization/facts.ts +47 -0
  436. package/src/authorization/list-read-scope.ts +216 -0
  437. package/src/authorization/model/__tests__/registry.test.ts +317 -0
  438. package/src/authorization/model/agent.ts +64 -0
  439. package/src/authorization/model/agent_channel.ts +49 -0
  440. package/src/authorization/model/agent_execution.ts +33 -0
  441. package/src/authorization/model/agent_instance.ts +66 -0
  442. package/src/authorization/model/agent_share.ts +40 -0
  443. package/src/authorization/model/api_key.ts +28 -0
  444. package/src/authorization/model/artifact.ts +38 -0
  445. package/src/authorization/model/channel_app.ts +39 -0
  446. package/src/authorization/model/default-of.ts +99 -0
  447. package/src/authorization/model/environment.ts +48 -0
  448. package/src/authorization/model/execution_context.ts +20 -0
  449. package/src/authorization/model/iam_policy.ts +42 -0
  450. package/src/authorization/model/identity_account.ts +26 -0
  451. package/src/authorization/model/index.ts +108 -0
  452. package/src/authorization/model/mcp_server.ts +59 -0
  453. package/src/authorization/model/memory.ts +27 -0
  454. package/src/authorization/model/oauth_app.ts +42 -0
  455. package/src/authorization/model/organization.ts +55 -0
  456. package/src/authorization/model/plugin.ts +66 -0
  457. package/src/authorization/model/project.ts +47 -0
  458. package/src/authorization/model/rewrite.ts +213 -0
  459. package/src/authorization/model/schedule.ts +40 -0
  460. package/src/authorization/model/session.ts +50 -0
  461. package/src/authorization/model/skill.ts +60 -0
  462. package/src/authorization/model/workflow.ts +60 -0
  463. package/src/authorization/model/workflow_execution.ts +44 -0
  464. package/src/authorization/model/workflow_instance.ts +122 -0
  465. package/src/authorization/organization-directory.ts +114 -0
  466. package/src/authorization/person.ts +68 -0
  467. package/src/authorization/posture.ts +49 -0
  468. package/src/authorization/schedule-fire-caller.ts +91 -0
  469. package/src/authorization/store-test-kit.ts +454 -0
  470. package/src/authorization/tuples.ts +190 -0
  471. package/src/boot/compose.ts +175 -38
  472. package/src/boot/inprocess.ts +108 -30
  473. package/src/domain/agent/controller.ts +11 -0
  474. package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
  475. package/src/domain/iampolicy/constants.ts +12 -0
  476. package/src/domain/iampolicy/membership.ts +221 -66
  477. package/src/domain/identityaccount/actor.ts +44 -0
  478. package/src/domain/mcpserver/controller.ts +11 -0
  479. package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
  480. package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
  481. package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
  482. package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
  483. package/src/domain/plugin/archive.ts +89 -0
  484. package/src/domain/plugin/constants.ts +53 -0
  485. package/src/domain/plugin/controller.ts +913 -0
  486. package/src/domain/plugin/materialize/agent.ts +186 -0
  487. package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
  488. package/src/domain/plugin/materialize/identity.ts +67 -0
  489. package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
  490. package/src/domain/plugin/materialize/plan.ts +124 -0
  491. package/src/domain/plugin/materialize/ports.ts +53 -0
  492. package/src/domain/plugin/materialize/skills.ts +68 -0
  493. package/src/domain/plugin/materialize/workflows.ts +51 -0
  494. package/src/domain/plugin/members.ts +180 -0
  495. package/src/domain/plugin/overlay/documents.ts +78 -0
  496. package/src/domain/plugin/overlay/parse.ts +115 -0
  497. package/src/domain/plugin/overlay/sanitize.ts +149 -0
  498. package/src/domain/plugin/push.ts +1062 -0
  499. package/src/domain/plugin/search-extractor.ts +60 -0
  500. package/src/domain/skill/constants.ts +11 -14
  501. package/src/domain/skill/controller.ts +44 -36
  502. package/src/domain/skill/push.ts +61 -156
  503. package/src/domain/skill/search-extractor.ts +3 -1
  504. package/src/domain/skill/storage/artifact-storage.ts +23 -124
  505. package/src/domain/skill/storage/zip-gate.ts +58 -154
  506. package/src/domain/skill/version-resolution.ts +67 -269
  507. package/src/domain/workflow/controller.ts +38 -4
  508. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
  509. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
  510. package/src/extensions/__tests__/composed-support.ts +32 -1
  511. package/src/extensions/__tests__/extension-composition.test.ts +35 -0
  512. package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
  513. package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
  514. package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
  515. package/src/extensions/authorizer.ts +10 -5
  516. package/src/extensions/drivers.ts +4 -1
  517. package/src/extensions/list-read-scope.ts +67 -45
  518. package/src/extensions/organization-directory.ts +13 -9
  519. package/src/extensions/resource-authorization.ts +34 -0
  520. package/src/extensions/schedule-fire-caller.ts +49 -18
  521. package/src/index.ts +51 -1
  522. package/src/pipeline/__tests__/router-transport.test.ts +1 -3
  523. package/src/pipeline/apiresource-labels.ts +31 -3
  524. package/src/pipeline/errors.ts +5 -5
  525. package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
  526. package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
  527. package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
  528. package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
  529. package/src/pipeline/steps/authorization-facts.ts +131 -0
  530. package/src/pipeline/steps/delete.ts +11 -3
  531. package/src/pipeline/steps/duplicate.ts +8 -2
  532. package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
  533. package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
  534. package/src/pipeline/steps/helpers.ts +4 -1
  535. package/src/pipeline/steps/index-search.ts +28 -15
  536. package/src/pipeline/steps/load-existing.ts +12 -3
  537. package/src/pipeline/steps/references.ts +36 -2
  538. package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
  539. package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
  540. package/src/pipeline/steps/slug.ts +7 -2
  541. package/src/pipeline/steps/validate-visibility.ts +9 -2
  542. package/src/pipeline/steps/validation.ts +3 -1
  543. package/src/pipeline/steps/version-archive.ts +225 -0
  544. package/src/pipeline/steps/version-history.ts +362 -0
  545. package/src/pipeline/steps/visibility-gates.ts +12 -9
  546. package/src/query/README.md +1 -1
  547. package/src/query/search/__tests__/criteria.test.ts +6 -7
  548. package/src/query/search/__tests__/query-store.test.ts +9 -2
  549. package/src/query/search/__tests__/registry.test.ts +6 -4
  550. package/src/query/search/registry.ts +6 -1
  551. package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
  552. package/src/temporal/schedule/run-starter.ts +31 -8
  553. package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
  554. package/dist/domain/skill/storage/prefilter.js.map +0 -1
  555. /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The built-in Authorizer — open source's driver for the one
3
+ * authorization decision seam (extensions/authorizer.ts), composed under
4
+ * the built-in posture (posture.ts): the cloud's model evaluated over the
5
+ * tuples this row would have had, derived on the fly (evaluator.ts over
6
+ * derived-tuples.ts). Every arm below mirrors the cloud's driver
7
+ * (stigmer-cloud src/authorizer/fga-authorizer.ts) by name and copy, so
8
+ * the two editions answer one question the same way and the drift test
9
+ * can pin the arms and not only the model.
10
+ *
11
+ * The arms, in order:
12
+ * 1. The cloud's four pre-checks with the Java service's copy, each a
13
+ * `deny` with the reason: an unspecified permission, an empty
14
+ * identity, an empty resource id, the unknown kind. No wire caller
15
+ * reaches the unknown kind since the kind refusals landed; the
16
+ * arm is the backstop, not a path.
17
+ * 2. A kind this edition does not serve is `deny` (`kindServedByEdition`,
18
+ * the predicate 2b's `checkMyPermission` arm 1 uses, so the console
19
+ * and the server agree by construction). `platform` is the one that
20
+ * arrives, through `can_set_public_visibility` — under the built-in
21
+ * posture nobody sets public visibility, the model's own reason for
22
+ * making it a platform operator's act.
23
+ * 3. The caller as a person (person.ts) and one derived tuple source for
24
+ * them; the target loaded ONCE through the source's memoised loader,
25
+ * so the read that decides not-found is the read the derivation
26
+ * uses.
27
+ * 4. A missing target is `not-found` — the Authorize step answers the
28
+ * load-first chain's NOT_FOUND (stigmer#224) — EXCEPT for the kinds
29
+ * the cloud never probes (NOT_FOUND_EXEMPT_KINDS): there a missing
30
+ * row is evaluated like any other and denies, so an authenticated
31
+ * member cannot learn which account ids exist. Present or exempt, the
32
+ * row is then evaluated: the cloud asks OpenFGA whether or not the row
33
+ * exists, and so does this driver.
34
+ * 5. `checkRelation` with the point-check context (`allow: true`: a
35
+ * public resource reads for any authenticated caller, the cloud's
36
+ * posture). True is `allow`; false is `deny` with an EMPTY reason, so
37
+ * the method annotation's byte-pinned `error_msg` wins on the wire,
38
+ * exactly the cloud's genuine-denial path.
39
+ *
40
+ * Faults. Everything past the pre-checks runs under one guard: a store
41
+ * fault, a person that names nobody (`personFor`), an evaluation fault
42
+ * (a cycle, the depth bound, an undeclared target — a registry gap the
43
+ * edition pin makes unreachable) all answer `unavailable` with the cause,
44
+ * which the Authorize step maps to INTERNAL. A denial is never a softened
45
+ * outage and an outage is never a denial; the driver itself never throws.
46
+ *
47
+ * Logging. One debug line per deny and per not-found, naming the person's
48
+ * account id, the permission and the object — what an operator needs to
49
+ * answer "why can Alice not see this" — and never the token. Allows are
50
+ * silent; they are the common case.
51
+ *
52
+ * Cost, per check (measured at slice 4): the target row (1), the caller's
53
+ * account (1 primary-key read; 2 for a caller a composition verifier left
54
+ * idp-shaped), the person's IamPolicy rows (1 scan of the port, once per
55
+ * source), and one row per parent hop the model walks.
56
+ */
57
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
58
+ import type { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
59
+ import type { Logger } from "../boot/logger.js";
60
+ import type { IamPolicyStore } from "../domain/iampolicy/store.js";
61
+ import type { Authorizer } from "../extensions/authorizer.js";
62
+ import type { Store } from "../store/interface.js";
63
+ import type { Model } from "./model/index.js";
64
+ import type { AccountsByCaller } from "./person.js";
65
+ /**
66
+ * Kinds whose missing row is a denial, never `not-found` (arm 4): the
67
+ * cloud's `PROBE_EXEMPT_KINDS` restricted to the kinds this edition
68
+ * serves — `platform`, `identity_provider`, `platform_client` and
69
+ * `invitation` are refused by arm 2 before any row is asked about. The
70
+ * cloud's drift test pins the two sets equal over the open-source tier.
71
+ *
72
+ * `iam_policy` is reachable as a target through the IamPolicy RPCs' own
73
+ * `resource.kind` (a caller may name it); the grant scope refuses such a
74
+ * target after the Authorize step in both editions, and the arm here
75
+ * keeps the wire the same on the way there.
76
+ */
77
+ export declare const NOT_FOUND_EXEMPT_KINDS: ReadonlySet<ApiResourceKind>;
78
+ /** The Java RequestAuthorizationService's pre-check copy, byte for byte (the cloud renders the same). */
79
+ export declare const UNKNOWN_PERMISSION_DENY_REASON = "authorization cannot be performed with unknown permission";
80
+ export declare const EMPTY_IDENTITY_DENY_REASON = "authorization cannot be performed on empty identity string";
81
+ export declare const EMPTY_RESOURCE_ID_DENY_REASON = "authorization cannot be performed on empty api-resource-id";
82
+ export declare const UNKNOWN_KIND_DENY_REASON = "authorization cannot be performed on unknown api-resource-kind";
83
+ /** This edition's own arm; the cloud has no unserved kind to deny. */
84
+ export declare const UNSERVED_KIND_DENY_REASON = "authorization cannot be performed on a kind this edition does not serve";
85
+ export interface BuiltInAuthorizerDeps {
86
+ readonly store: Store;
87
+ /** The port the grant path writes through — the person's rows are read from the same instance. */
88
+ readonly policies: IamPolicyStore;
89
+ /** The account port: the caller's account, and identity_account targets. */
90
+ readonly accounts: AccountsByCaller;
91
+ /** The served edition (`extensions.edition`); the built-in posture pins it to `oss` at boot. */
92
+ readonly edition: ServerEdition;
93
+ readonly logger: Logger;
94
+ /** The declarations to evaluate; the built-in model unless a test says otherwise. */
95
+ readonly model?: Model;
96
+ }
97
+ export declare function newBuiltInAuthorizer(deps: BuiltInAuthorizerDeps): Authorizer;
98
+ //# sourceMappingURL=authorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizer.d.ts","sourceRoot":"","sources":["../../src/authorization/authorizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAE3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EACV,UAAU,EAGX,MAAM,6BAA6B,CAAC;AAMrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,eAAe,CAG9D,CAAC;AAEH,yGAAyG;AACzG,eAAO,MAAM,8BAA8B,8DACkB,CAAC;AAC9D,eAAO,MAAM,0BAA0B,+DACuB,CAAC;AAC/D,eAAO,MAAM,6BAA6B,+DACoB,CAAC;AAC/D,eAAO,MAAM,wBAAwB,mEAC6B,CAAC;AACnE,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,4EACqC,CAAC;AAE5E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,gGAAgG;IAChG,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,UAAU,CA8E5E"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * The built-in Authorizer — open source's driver for the one
3
+ * authorization decision seam (extensions/authorizer.ts), composed under
4
+ * the built-in posture (posture.ts): the cloud's model evaluated over the
5
+ * tuples this row would have had, derived on the fly (evaluator.ts over
6
+ * derived-tuples.ts). Every arm below mirrors the cloud's driver
7
+ * (stigmer-cloud src/authorizer/fga-authorizer.ts) by name and copy, so
8
+ * the two editions answer one question the same way and the drift test
9
+ * can pin the arms and not only the model.
10
+ *
11
+ * The arms, in order:
12
+ * 1. The cloud's four pre-checks with the Java service's copy, each a
13
+ * `deny` with the reason: an unspecified permission, an empty
14
+ * identity, an empty resource id, the unknown kind. No wire caller
15
+ * reaches the unknown kind since the kind refusals landed; the
16
+ * arm is the backstop, not a path.
17
+ * 2. A kind this edition does not serve is `deny` (`kindServedByEdition`,
18
+ * the predicate 2b's `checkMyPermission` arm 1 uses, so the console
19
+ * and the server agree by construction). `platform` is the one that
20
+ * arrives, through `can_set_public_visibility` — under the built-in
21
+ * posture nobody sets public visibility, the model's own reason for
22
+ * making it a platform operator's act.
23
+ * 3. The caller as a person (person.ts) and one derived tuple source for
24
+ * them; the target loaded ONCE through the source's memoised loader,
25
+ * so the read that decides not-found is the read the derivation
26
+ * uses.
27
+ * 4. A missing target is `not-found` — the Authorize step answers the
28
+ * load-first chain's NOT_FOUND (stigmer#224) — EXCEPT for the kinds
29
+ * the cloud never probes (NOT_FOUND_EXEMPT_KINDS): there a missing
30
+ * row is evaluated like any other and denies, so an authenticated
31
+ * member cannot learn which account ids exist. Present or exempt, the
32
+ * row is then evaluated: the cloud asks OpenFGA whether or not the row
33
+ * exists, and so does this driver.
34
+ * 5. `checkRelation` with the point-check context (`allow: true`: a
35
+ * public resource reads for any authenticated caller, the cloud's
36
+ * posture). True is `allow`; false is `deny` with an EMPTY reason, so
37
+ * the method annotation's byte-pinned `error_msg` wins on the wire,
38
+ * exactly the cloud's genuine-denial path.
39
+ *
40
+ * Faults. Everything past the pre-checks runs under one guard: a store
41
+ * fault, a person that names nobody (`personFor`), an evaluation fault
42
+ * (a cycle, the depth bound, an undeclared target — a registry gap the
43
+ * edition pin makes unreachable) all answer `unavailable` with the cause,
44
+ * which the Authorize step maps to INTERNAL. A denial is never a softened
45
+ * outage and an outage is never a denial; the driver itself never throws.
46
+ *
47
+ * Logging. One debug line per deny and per not-found, naming the person's
48
+ * account id, the permission and the object — what an operator needs to
49
+ * answer "why can Alice not see this" — and never the token. Allows are
50
+ * silent; they are the common case.
51
+ *
52
+ * Cost, per check (measured at slice 4): the target row (1), the caller's
53
+ * account (1 primary-key read; 2 for a caller a composition verifier left
54
+ * idp-shaped), the person's IamPolicy rows (1 scan of the port, once per
55
+ * source), and one row per parent hop the model walks.
56
+ */
57
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
58
+ import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
59
+ import { kindEnumName, kindServedByEdition, } from "../pipeline/apiresource-meta.js";
60
+ import { newDerivedTupleSource } from "./derived-tuples.js";
61
+ import { checkRelation } from "./evaluator.js";
62
+ import { builtInModel } from "./model/index.js";
63
+ import { resolvePerson } from "./person.js";
64
+ import { formatObjectRef } from "./tuples.js";
65
+ /**
66
+ * Kinds whose missing row is a denial, never `not-found` (arm 4): the
67
+ * cloud's `PROBE_EXEMPT_KINDS` restricted to the kinds this edition
68
+ * serves — `platform`, `identity_provider`, `platform_client` and
69
+ * `invitation` are refused by arm 2 before any row is asked about. The
70
+ * cloud's drift test pins the two sets equal over the open-source tier.
71
+ *
72
+ * `iam_policy` is reachable as a target through the IamPolicy RPCs' own
73
+ * `resource.kind` (a caller may name it); the grant scope refuses such a
74
+ * target after the Authorize step in both editions, and the arm here
75
+ * keeps the wire the same on the way there.
76
+ */
77
+ export const NOT_FOUND_EXEMPT_KINDS = new Set([
78
+ ApiResourceKind.identity_account,
79
+ ApiResourceKind.iam_policy,
80
+ ]);
81
+ /** The Java RequestAuthorizationService's pre-check copy, byte for byte (the cloud renders the same). */
82
+ export const UNKNOWN_PERMISSION_DENY_REASON = "authorization cannot be performed with unknown permission";
83
+ export const EMPTY_IDENTITY_DENY_REASON = "authorization cannot be performed on empty identity string";
84
+ export const EMPTY_RESOURCE_ID_DENY_REASON = "authorization cannot be performed on empty api-resource-id";
85
+ export const UNKNOWN_KIND_DENY_REASON = "authorization cannot be performed on unknown api-resource-kind";
86
+ /** This edition's own arm; the cloud has no unserved kind to deny. */
87
+ export const UNSERVED_KIND_DENY_REASON = "authorization cannot be performed on a kind this edition does not serve";
88
+ export function newBuiltInAuthorizer(deps) {
89
+ const model = deps.model ?? builtInModel;
90
+ return {
91
+ async authorize(caller, check) {
92
+ if (check.permission === IamPermission.unspecified) {
93
+ return deny(UNKNOWN_PERMISSION_DENY_REASON);
94
+ }
95
+ if (caller.identityId === "") {
96
+ return deny(EMPTY_IDENTITY_DENY_REASON);
97
+ }
98
+ if (check.resourceId === "") {
99
+ return deny(EMPTY_RESOURCE_ID_DENY_REASON);
100
+ }
101
+ if (check.resourceKind === ApiResourceKind.api_resource_kind_unknown) {
102
+ return deny(UNKNOWN_KIND_DENY_REASON);
103
+ }
104
+ if (!kindServedByEdition(check.resourceKind, deps.edition)) {
105
+ return deny(UNSERVED_KIND_DENY_REASON);
106
+ }
107
+ const object = {
108
+ type: kindEnumName(check.resourceKind),
109
+ id: check.resourceId,
110
+ };
111
+ const relation = IamPermission[check.permission];
112
+ try {
113
+ const person = await resolvePerson(deps.accounts, caller);
114
+ const source = newDerivedTupleSource({
115
+ store: deps.store,
116
+ policies: deps.policies,
117
+ accounts: deps.accounts,
118
+ model,
119
+ }, person);
120
+ const row = await source.loader.load(object);
121
+ if (row === undefined &&
122
+ !NOT_FOUND_EXEMPT_KINDS.has(check.resourceKind)) {
123
+ deps.logger.debug("authorization target not found", {
124
+ account: person.accountId,
125
+ permission: relation,
126
+ object: formatObjectRef(object),
127
+ });
128
+ return { kind: "not-found" };
129
+ }
130
+ const allowed = await checkRelation({ model, source }, object, relation, person, { allow: true });
131
+ if (allowed) {
132
+ return { kind: "allow" };
133
+ }
134
+ deps.logger.debug("authorization denied", {
135
+ account: person.accountId,
136
+ permission: relation,
137
+ object: formatObjectRef(object),
138
+ });
139
+ // Empty on purpose: the Authorize step then surfaces the method
140
+ // annotation's byte-pinned error_msg (or its fallback copy), the
141
+ // cloud's genuine-denial path.
142
+ return deny("");
143
+ }
144
+ catch (error) {
145
+ return {
146
+ kind: "unavailable",
147
+ cause: error instanceof Error ? error : new Error(String(error)),
148
+ };
149
+ }
150
+ },
151
+ };
152
+ }
153
+ function deny(reason) {
154
+ return { kind: "deny", reason };
155
+ }
156
+ //# sourceMappingURL=authorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizer.js","sourceRoot":"","sources":["../../src/authorization/authorizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
2
+ import type { IamPolicyStore } from "../domain/iampolicy/store.js";
3
+ import type { IdentityAccountStore } from "../domain/identityaccount/store.js";
4
+ import type { Store } from "../store/interface.js";
5
+ import type { RowFacts } from "./facts.js";
6
+ import type { Model } from "./model/index.js";
7
+ import type { Person, RowLoader, Tuple, TupleSource } from "./tuples.js";
8
+ /**
9
+ * Kinds whose `[identity_account]` owner is recorded as an IamPolicy row
10
+ * by this edition (the module header): the derivation writes no owner
11
+ * tuple for them. Mirrors role-lifecycle.ts's create arm, which writes
12
+ * the row for `organization` and nothing else.
13
+ */
14
+ export declare const ROW_RECORDED_OWNER_KINDS: ReadonlySet<ApiResourceKind>;
15
+ /** The tuples a row stands for, in the cloud driver's shapes and order. */
16
+ export declare function deriveTuples(facts: RowFacts): ReadonlyArray<Tuple>;
17
+ export interface DerivedTupleSourceDeps {
18
+ readonly store: Store;
19
+ /** The port the grant path writes through — the rows are read from the same instance. */
20
+ readonly policies: IamPolicyStore;
21
+ /** The account port — an `identity_account` object is read through it, never the generic Store (the module header). */
22
+ readonly accounts: Pick<IdentityAccountStore, "findById">;
23
+ /** The declarations to derive with; the built-in model unless a test says otherwise. */
24
+ readonly model?: Model;
25
+ }
26
+ export interface DerivedTupleSource extends TupleSource {
27
+ /** The memoised row reads, exposed for a declaration's `derived` rules and for tests. */
28
+ readonly loader: RowLoader;
29
+ /**
30
+ * The person's own IamPolicy rows as tuples — the ONE read of them this
31
+ * source makes, shared with `tuplesOf`. A list-shaped consumer (the
32
+ * organization directory; the list scope) reads its candidate objects
33
+ * from here instead of scanning the port a second time.
34
+ */
35
+ personTuples(): Promise<ReadonlyArray<Tuple>>;
36
+ }
37
+ export interface DerivedTupleSourceSeed {
38
+ /** Objects whose facts the caller already holds; their rows are not read for derivation. */
39
+ readonly facts: ReadonlyArray<RowFacts>;
40
+ }
41
+ export declare function newDerivedTupleSource(deps: DerivedTupleSourceDeps, person: Person, seed?: DerivedTupleSourceSeed): DerivedTupleSource;
42
+ //# sourceMappingURL=derived-tuples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-tuples.d.ts","sourceRoot":"","sources":["../../src/authorization/derived-tuples.ts"],"names":[],"mappings":"AAiEA,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAKtH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAQ/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAEV,MAAM,EACN,SAAS,EAET,KAAK,EACL,WAAW,EACZ,MAAM,aAAa,CAAC;AAOrB;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,eAAe,CAEhE,CAAC;AAMH,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAuDlE;AAoCD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,uHAAuH;IACvH,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;IAC1D,wFAAwF;IACxF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAsB;IACrC,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CACzC;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,sBAAsB,GAC5B,kBAAkB,CAoFpB"}
@@ -0,0 +1,240 @@
1
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
2
+ import { OwnerAttributionType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
3
+ import { isPersonStamp } from "../domain/iampolicy/membership.js";
4
+ import { getKindMeta, kindByEnumName, kindEnumName, } from "../pipeline/apiresource-meta.js";
5
+ import { visibilityShapesFor } from "../pipeline/steps/authorization-tuples.js";
6
+ import { ResourceNotFoundError } from "../store/interface.js";
7
+ import { rowFactsOf } from "./facts.js";
8
+ import { builtInModel } from "./model/index.js";
9
+ import { ACCOUNT_TYPE, ALLOW_PUBLIC_CONDITION, formatObjectRef, } from "./tuples.js";
10
+ /**
11
+ * Kinds whose `[identity_account]` owner is recorded as an IamPolicy row
12
+ * by this edition (the module header): the derivation writes no owner
13
+ * tuple for them. Mirrors role-lifecycle.ts's create arm, which writes
14
+ * the row for `organization` and nothing else.
15
+ */
16
+ export const ROW_RECORDED_OWNER_KINDS = new Set([
17
+ ApiResourceKind.organization,
18
+ ]);
19
+ function account(id) {
20
+ return { form: "object", object: { type: ACCOUNT_TYPE, id } };
21
+ }
22
+ /** The tuples a row stands for, in the cloud driver's shapes and order. */
23
+ export function deriveTuples(facts) {
24
+ const object = { type: kindEnumName(facts.kind), id: facts.id };
25
+ const config = getKindMeta(facts.kind).authorization;
26
+ if (config === undefined) {
27
+ return [];
28
+ }
29
+ const tuples = [];
30
+ for (const link of facts.parentLinks) {
31
+ tuples.push({
32
+ object,
33
+ relation: link.relation,
34
+ subject: {
35
+ form: "object",
36
+ object: { type: kindEnumName(link.parentKind), id: link.parentId },
37
+ },
38
+ });
39
+ }
40
+ const stampIsPerson = isPersonStamp(facts.createdBy);
41
+ switch (config.ownerType) {
42
+ case OwnerAttributionType.DIRECT:
43
+ if (stampIsPerson && !ROW_RECORDED_OWNER_KINDS.has(facts.kind)) {
44
+ tuples.push({
45
+ object,
46
+ relation: "owner",
47
+ subject: account(facts.createdBy),
48
+ });
49
+ }
50
+ break;
51
+ case OwnerAttributionType.SELF:
52
+ tuples.push({ object, relation: "owner", subject: account(facts.id) });
53
+ break;
54
+ case OwnerAttributionType.INHERITED:
55
+ case OwnerAttributionType.NONE:
56
+ case OwnerAttributionType.UNSPECIFIED:
57
+ // Inherited: the model walks `owner from <parent>`; none: the kind has no owner.
58
+ break;
59
+ default: {
60
+ const exhaustive = config.ownerType;
61
+ throw new Error(`unknown owner attribution: ${String(exhaustive)}`);
62
+ }
63
+ }
64
+ if (config.requiresCreatorTuple && stampIsPerson) {
65
+ tuples.push({
66
+ object,
67
+ relation: "creator",
68
+ subject: account(facts.createdBy),
69
+ });
70
+ }
71
+ for (const shape of visibilityShapesFor(facts.kind, facts.visibility)) {
72
+ const subject = visibilitySubject(shape, facts.org);
73
+ if (subject !== undefined) {
74
+ tuples.push({ object, relation: "viewer", subject });
75
+ }
76
+ }
77
+ return tuples;
78
+ }
79
+ /** The driver's grant table for a visibility shape; undefined where this edition writes nothing. */
80
+ function visibilitySubject(shape, org) {
81
+ switch (shape) {
82
+ case "org-viewer":
83
+ // No organization to point at (a legacy row): no userset.
84
+ return org === ""
85
+ ? undefined
86
+ : {
87
+ form: "userset",
88
+ object: { type: "organization", id: org },
89
+ relation: "viewer",
90
+ };
91
+ case "public-viewer":
92
+ return {
93
+ form: "wildcard",
94
+ type: ACCOUNT_TYPE,
95
+ condition: ALLOW_PUBLIC_CONDITION,
96
+ };
97
+ case "platform-viewer":
98
+ return undefined;
99
+ default: {
100
+ const exhaustive = shape;
101
+ throw new Error(`unknown visibility shape: ${String(exhaustive)}`);
102
+ }
103
+ }
104
+ }
105
+ export function newDerivedTupleSource(deps, person, seed) {
106
+ const model = deps.model ?? builtInModel;
107
+ const rows = new Map();
108
+ const derived = new Map();
109
+ const seeded = new Map();
110
+ for (const facts of seed?.facts ?? []) {
111
+ seeded.set(formatObjectRef({ type: kindEnumName(facts.kind), id: facts.id }), facts);
112
+ }
113
+ let personRows;
114
+ const loader = {
115
+ load(object) {
116
+ const key = formatObjectRef(object);
117
+ const held = rows.get(key);
118
+ if (held !== undefined) {
119
+ return held;
120
+ }
121
+ const loading = loadRow(deps, model, object);
122
+ rows.set(key, loading);
123
+ return loading;
124
+ },
125
+ };
126
+ function derivedTuplesOf(object) {
127
+ const key = formatObjectRef(object);
128
+ const held = derived.get(key);
129
+ if (held !== undefined) {
130
+ return held;
131
+ }
132
+ const declaration = model.byType(object.type);
133
+ const known = seeded.get(key);
134
+ let deriving;
135
+ if (declaration === undefined) {
136
+ deriving = Promise.resolve([]);
137
+ }
138
+ else if (known !== undefined) {
139
+ deriving = Promise.resolve(deriveTuples(known));
140
+ }
141
+ else {
142
+ deriving = loader
143
+ .load(object)
144
+ .then((row) => row === undefined
145
+ ? []
146
+ : deriveTuples(rowFactsOf(declaration.kind, row)));
147
+ }
148
+ derived.set(key, deriving);
149
+ return deriving;
150
+ }
151
+ function rowTuples() {
152
+ if (personRows === undefined) {
153
+ personRows = deps.policies
154
+ .findByPrincipal(ACCOUNT_TYPE, person.accountId)
155
+ .then((found) => found.map(tupleOfRow));
156
+ }
157
+ return personRows;
158
+ }
159
+ return {
160
+ loader,
161
+ personTuples: rowTuples,
162
+ async tuplesOf(object, relation) {
163
+ const onPair = (tuple) => tuple.relation === relation &&
164
+ tuple.object.type === object.type &&
165
+ tuple.object.id === object.id;
166
+ const fromRows = (await rowTuples()).filter(onPair);
167
+ const declaration = model.byType(object.type);
168
+ if (declaration === undefined) {
169
+ return fromRows;
170
+ }
171
+ const fromRow = (await derivedTuplesOf(object)).filter(onPair);
172
+ const rule = declaration.derived.get(relation);
173
+ if (rule === undefined) {
174
+ return [...fromRows, ...fromRow];
175
+ }
176
+ const row = await loader.load(object);
177
+ const fromRule = row === undefined ? [] : await rule(object, row, loader);
178
+ return [...fromRows, ...fromRow, ...fromRule];
179
+ },
180
+ };
181
+ }
182
+ /** The decoded row for an object, or undefined when the kind is not declared or the row does not exist. */
183
+ async function loadRow(deps, model, object) {
184
+ const declaration = model.byType(object.type);
185
+ const kind = kindByEnumName(object.type);
186
+ if (declaration === undefined ||
187
+ kind === ApiResourceKind.api_resource_kind_unknown ||
188
+ object.id === "") {
189
+ return undefined;
190
+ }
191
+ if (kind === ApiResourceKind.identity_account) {
192
+ return deps.accounts.findById(object.id);
193
+ }
194
+ try {
195
+ return await deps.store.getResource(kind, object.id, declaration.schema);
196
+ }
197
+ catch (error) {
198
+ if (error instanceof ResourceNotFoundError) {
199
+ return undefined;
200
+ }
201
+ throw error;
202
+ }
203
+ }
204
+ /** An IamPolicy row as the tuple it records: `resource#relation@principal`. */
205
+ function tupleOfRow(row) {
206
+ const spec = row.spec;
207
+ const principal = spec?.principal;
208
+ const resource = spec?.resource;
209
+ const object = {
210
+ type: resource?.kind ?? "",
211
+ id: resource?.id ?? "",
212
+ };
213
+ const principalObject = {
214
+ type: principal?.kind ?? "",
215
+ id: principal?.id ?? "",
216
+ };
217
+ let subject;
218
+ if (principal !== undefined && principal.relation !== "") {
219
+ subject = {
220
+ form: "userset",
221
+ object: principalObject,
222
+ relation: principal.relation,
223
+ };
224
+ }
225
+ else if (principalObject.id === "*") {
226
+ // A wildcard row carries no condition of its own; the evaluator
227
+ // honours it only where a line admits an unconditioned wildcard,
228
+ // which no line in the model does.
229
+ subject = {
230
+ form: "wildcard",
231
+ type: principalObject.type,
232
+ condition: undefined,
233
+ };
234
+ }
235
+ else {
236
+ subject = { form: "object", object: principalObject };
237
+ }
238
+ return { object, relation: spec?.relation ?? "", subject };
239
+ }
240
+ //# sourceMappingURL=derived-tuples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-tuples.js","sourceRoot":"","sources":["../../src/authorization/derived-tuples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The evaluator — OpenFGA's check, over the built-in model and a tuple
3
+ * source, small because the model uses four rewrite forms and nothing
4
+ * else (model/rewrite.ts). `checkRelation(object, relation, person, context)`
5
+ * answers "does this person hold this relation on this object" the way
6
+ * the cloud's engine answers it over stored tuples, so the two editions
7
+ * share one meaning of authorization.
8
+ *
9
+ * The walk, in the order a `.fga` line reads:
10
+ * - `this`: the tuples on (object, relation). A tuple counts only if
11
+ * its subject's TYPE is in the line's restriction list — the check
12
+ * OpenFGA makes at write time, made here at read time, so a derived
13
+ * tuple the model no longer admits denies instead of allowing. An
14
+ * object subject matches when it names one of the person's aliases;
15
+ * a userset subject is resolved on its own object; the wildcard is
16
+ * honoured only under its condition (`allow_public` reads the
17
+ * context's `allow`; an unknown condition is a fault).
18
+ * - `computed`: the same object, another relation.
19
+ * - `from`: every object the tupleset relation links to (again within
20
+ * the tupleset line's type restriction), resolved for the relation.
21
+ * - `union`: the first true member wins; members are tried in the
22
+ * line's order, so the cheap arms the model lists first (the person's
23
+ * own owner tuple) are read before the hops.
24
+ *
25
+ * Bounds and faults. Every (object, relation) pair is resolved once per
26
+ * check (the memo — a diamond such as `owner` reached through `viewer`
27
+ * and through `can_edit` reads the source once). A pair re-entered while
28
+ * it is being resolved is a cycle in the declarations, which is a bug,
29
+ * and a resolution deeper than MAX_RESOLUTION_DEPTH is the same class of
30
+ * bug; both throw, because the alternative — a quiet `false` — would turn
31
+ * a broken transcript into a lockout nobody can see. A kind the model does
32
+ * not declare is a fault as the check's TARGET (the driver refuses
33
+ * unserved kinds before evaluation, so reaching here is a registry gap)
34
+ * and simply an object with no relations when reached through a tuple
35
+ * (`identity_provider#platform_user`, which no open-source tuple names).
36
+ * A relation the kind does not declare is `false` — the ruled answer for
37
+ * a wire question the model has no line for, where OpenFGA
38
+ * itself answers a validation error.
39
+ *
40
+ * The evaluator does no I/O of its own and knows no store: the source
41
+ * owns every read, and a fault it raises propagates through untouched,
42
+ * so the driver above can fold it into `unavailable` and never into a
43
+ * denial.
44
+ */
45
+ import type { Model } from "./model/index.js";
46
+ import type { CheckContext, ObjectRef, Person, TupleSource } from "./tuples.js";
47
+ /**
48
+ * OpenFGA's default resolution-depth limit (its `resolveNodeLimit`), so
49
+ * the bound here is the oracle's own and not a number chosen locally. The
50
+ * deepest real chain in the model is under ten: an instance's `viewer
51
+ * from default_of` to its blueprint, the blueprint's `admin from
52
+ * organization`, then the organization's four-rung ladder.
53
+ */
54
+ export declare const MAX_RESOLUTION_DEPTH = 25;
55
+ export type EvaluationFault = "undeclared-target-kind" | "resolution-depth-exceeded" | "resolution-cycle" | "unknown-condition";
56
+ /** A fault in the model or its evaluation — never a denial; the driver maps it to `unavailable`. */
57
+ export declare class AuthorizationEvaluationError extends Error {
58
+ readonly reason: EvaluationFault;
59
+ constructor(reason: EvaluationFault, message: string);
60
+ }
61
+ export interface EvaluationDeps {
62
+ readonly model: Model;
63
+ readonly source: TupleSource;
64
+ }
65
+ export declare function checkRelation(deps: EvaluationDeps, object: ObjectRef, relation: string, person: Person, context: CheckContext): Promise<boolean>;
66
+ //# sourceMappingURL=evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/authorization/evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,MAAM,EAEN,WAAW,EACZ,MAAM,aAAa,CAAC;AAQrB;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,MAAM,eAAe,GACvB,wBAAwB,GACxB,2BAA2B,GAC3B,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,oGAAoG;AACpG,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;gBAErB,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;CAKrD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CAQlB"}