permdock 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a2a/index.d.ts +7 -5
- package/dist/a2a/index.js +14 -21
- package/dist/ai-sdk/index.d.ts +18 -6
- package/dist/ai-sdk/index.js +8 -5
- package/dist/app-data-CV8pqqMi.js +59 -0
- package/dist/approvals/index.d.ts +2 -2
- package/dist/approvals/index.js +3 -3
- package/dist/{approvals-DbYAuNkG.js → approvals-DZL76lKW.js} +35 -19
- package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/{arazzo-BAgw9ap6.js → arazzo-C4BcskbX.js} +6 -5
- package/dist/{arazzo-C9chp3ST.js → arazzo-CD8d0WLb.js} +2 -2
- package/dist/authzen/index.d.ts +3 -3
- package/dist/authzen/index.js +161 -23
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +6 -19
- package/dist/better-supabase/index.d.ts +112 -87
- package/dist/better-supabase/index.js +257 -156
- package/dist/{bind-C_ob3LKa.d.ts → bind-BzqG8SMb.d.ts} +16 -5
- package/dist/{bind-CuzGytRf.js → bind-kk-uyCwH.js} +14 -6
- package/dist/build-instance-DIIV9DbC.js +51 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-CFKyFOke.js} +1 -3
- package/dist/{capability-2kYTMWDv.d.ts → capability-CksyCWDH.d.ts} +2 -2
- package/dist/{capability-4qPdO9gk.js → capability-txATtKV4.js} +3 -2
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-6yWAX6Ps.js +2 -0
- package/dist/{catalog-CYj-mX2O.js → catalog-WHG4kBq7.js} +2 -2
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-DWtg0gGR.js} +17 -10
- package/dist/{catalog-DWF5cYqB.js → catalog-tZUyOfOv.js} +4 -4
- package/dist/claude-agent/index.d.ts +4 -4
- package/dist/claude-agent/index.js +4 -5
- package/dist/clerk/index.d.ts +3 -3
- package/dist/clerk/index.js +8 -33
- package/dist/cli/bin.js +1 -1
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +3 -3
- package/dist/cloud/index.d.ts +4 -4
- package/dist/cloud/index.js +9 -15
- package/dist/{cloud-CfwZ39Rl.js → cloud-C7bSDgX4.js} +2 -2
- package/dist/{cloud-DWLXO2af.js → cloud-PeBN3IEn.js} +5 -5
- package/dist/{collect-DSTE3ml9.js → collect-2SrB7lfk.js} +6 -8
- package/dist/collect-Bw2Jdq1q.js +2 -0
- package/dist/{collect-CHB22Sx4.js → collect-CQx4hX4N.js} +3 -3
- package/dist/{commands-BeaGNj_o.js → commands-Cpip4ULx.js} +13 -13
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -1
- package/dist/{compile-Ba4blROR.js → compile-CcEu2ZQ1.js} +6 -5
- package/dist/{compile-BkRyBDBw.d.ts → compile-CtTP7eur.d.ts} +2 -2
- package/dist/{config-BJiM-xAm.js → config-BIjREpyE.js} +4 -4
- package/dist/{config-ir40y8m0.js → config-DLt6BvV7.js} +2 -2
- package/dist/{config-report-CdCgbRnV.js → config-report--Xb9APJS.js} +5 -6
- package/dist/{connection-CU8MQxRi.js → connection-DUsczpB5.js} +3 -2
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-DieZVJXu.js} +16 -5
- package/dist/convex/index.d.ts +4 -4
- package/dist/convex/index.js +14 -16
- package/dist/create-BBO24vj6.js +324 -0
- package/dist/{credential-8P81ff4u.js → credential-kue0qpbm.js} +4 -4
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -0
- package/dist/denied-text-DfRk15uw.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-C3ldA9os.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-Cgkp7eP0.js} +5 -4
- package/dist/{diff-C9RDjjhs.js → diff-Cnghh_Ip.js} +2 -2
- package/dist/{diff-2VaeChzX.js → diff-rpqoe7Ag.js} +9 -9
- package/dist/{doctor-Djh6JDEk.js → doctor-CuVJvhV_.js} +2 -2
- package/dist/doctor-owlv6ddh.js +2166 -0
- package/dist/drizzle/index.d.ts +2 -2
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +4 -4
- package/dist/elysia/index.js +7 -7
- package/dist/{errors-DPdqI50v.d.ts → errors-OD_4c__H.d.ts} +2 -2
- package/dist/{errors-Cz5zn0mW.js → errors-drnfxYtm.js} +3 -3
- package/dist/{evaluations-tz6D9A2G.js → evaluations-C9YJsv3H.js} +45 -7
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +5 -5
- package/dist/express/index.d.ts +4 -4
- package/dist/express/index.js +8 -7
- package/dist/fastify/index.d.ts +15 -5
- package/dist/fastify/index.js +9 -29
- package/dist/fields-fwfXN01n.js +1016 -0
- package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-h2eG2OZV.js} +5 -6
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-7REQZe0H.js} +32 -22
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-CXY-0C87.js +254 -0
- package/dist/grantee-conditions-MQs5NIuX.js +270 -0
- package/dist/grantee-match-fxYp9Nmt.js +141 -0
- package/dist/{helpers-H_KARDVC.js → helpers-C9YmyBIa.js} +7 -6
- package/dist/hono/index.d.ts +4 -4
- package/dist/hono/index.js +8 -8
- package/dist/hosted-CBHgkzDl.js +655 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-BIhmLfCc.js → http-BEbdMZ05.js} +2 -24
- package/dist/{rls-import-4lLW_pbb.js → import-BFIlhetD.js} +86 -80
- package/dist/{openapi-import-cmwetbzw.js → import-UHk1N7vH.js} +6 -7
- package/dist/{index-C8z4RjQV.d.ts → index-BwMe94Xq.d.ts} +1 -1
- package/dist/{index-0nNqHspG.d.ts → index-DgM7w96K.d.ts} +2 -2
- package/dist/{index-C7Tw7MaW.d.ts → index-Dz7didpC.d.ts} +3 -3
- package/dist/{index-BNc7Wer_.d.ts → index-UdVQgq48.d.ts} +105 -38
- package/dist/index.d.ts +15 -13
- package/dist/index.js +22 -22
- package/dist/{instance-options-jARdwfPN.d.ts → instance-options-plkrsAog.d.ts} +1 -1
- package/dist/{json-schema-BsAflUGW.js → json-schema-DBkdUuCO.js} +1 -3
- package/dist/jwt/index.d.ts +4 -4
- package/dist/jwt/index.js +13 -13
- package/dist/{kernel-_RRHmnMY.js → kernel-CB3LrIJM.js} +81 -32
- package/dist/kysely/index.d.ts +2 -2
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-B_shHrmd.js +2 -0
- package/dist/{load-DhWEB9P1.js → load-C3_oTHyO.js} +11 -3
- package/dist/{manifest-iaoBXHKc.js → manifest-BngWKryL.js} +5 -18
- package/dist/{map-claims-Z4QZOiFF.js → map-claims-AVlBaJoa.js} +7 -16
- package/dist/{map-error-pgUWNNtG.js → map-error-BE27PYkE.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-CiwAOZtO.js} +6 -2
- package/dist/{may-use-DndQ5tQ-.js → may-use-BOn_dR_w.js} +4 -3
- package/dist/mcp/index.d.ts +26 -9
- package/dist/mcp/index.js +456 -446
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BwlB5-Wk.js} +75 -15
- package/dist/nest/index.d.ts +4 -4
- package/dist/nest/index.js +11 -12
- package/dist/next/index.d.ts +31 -8
- package/dist/next/index.js +29 -33
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +1 -1
- package/dist/node/index.d.ts +4 -4
- package/dist/node/index.js +4 -4
- package/dist/ocsf-uYFXGVw2.js +115 -0
- package/dist/openai/index.d.ts +5 -5
- package/dist/openai/index.js +4 -4
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-CqqEbHsL.js → openapi-BJdBmYDG.js} +19 -23
- package/dist/{openapi-BqRBvAng.js → openapi-DBzHQbov.js} +2 -5
- package/dist/{openapi-CQTsgKoB.js → openapi-DcQ1Kg40.js} +3 -3
- package/dist/orpc/index.d.ts +5 -5
- package/dist/orpc/index.js +9 -11
- package/dist/otel/index.d.ts +2 -2
- package/dist/otel/index.js +26 -23
- package/dist/output-files-CgIsvdSa.js +140 -0
- package/dist/{rls-ownership-DcYlZ09B.js → ownership-BgnbOJFT.js} +387 -379
- package/dist/{package-root-zGkxO3oN.js → package-root-DtNnpmUd.js} +3 -2
- package/dist/{parse-BuyjxhZV.js → parse-CVFQHk6c.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-C-q02Pal.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DvYUR0QL.d.ts} +1 -1
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +8 -9
- package/dist/{permdock-CbgvLnuo.js → permdock-L26udHSk.js} +1387 -1220
- package/dist/{rls-fields-CZOMlwHl.js → permission-keys-B26jeyUv.js} +1268 -2053
- package/dist/permission-registry-BsblpB-z.js +385 -0
- package/dist/{permissions-DttnqqxC.d.ts → permission-types-Dg39z9Kv.d.ts} +59 -31
- package/dist/{permissions-RJrovw98.js → permissions-CCJ6lmxB.js} +3 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-COH-KRgT.d.ts} +2 -2
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-sp9P1iIV.d.ts} +661 -582
- package/dist/{policy-D2W7uv19.d.ts → policy-ur0BBK_e.d.ts} +2 -2
- package/dist/{powersync-DE19b9dT.js → powersync-BFSbSElQ.js} +2 -2
- package/dist/powersync-DCDgZgfZ.js +2 -0
- package/dist/{powersync-Dv1_aWF7.js → powersync-cZe4kzhL.js} +26 -27
- package/dist/prisma/index.d.ts +1 -1
- package/dist/prisma/index.js +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CnWraVhC.js} +8 -7
- package/dist/{problem-details-_AMOYz-w.js → problem-details-DECUnXAn.js} +2 -2
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-rIIo8B2C.d.ts} +1 -1
- package/dist/{protected-BdnIEFkY.d.ts → protected-B3_P7xuw.d.ts} +9 -6
- package/dist/{protected-utU-SLuy.js → protected-BN7BUdY1.js} +20 -8
- package/dist/{provider-CSQd7m92.js → provider-Bi-0HNL3.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-kwHC9CZD.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-Ctt-81Ni.js} +6 -3
- package/dist/react/index.d.ts +7 -7
- package/dist/react/index.js +5 -5
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +20 -11
- package/dist/react-native/index.js +33 -17
- package/dist/{refs-KYb4ntaz.js → refs-f3imMjNW.js} +1 -1
- package/dist/relation-walk-BXnlLtg2.js +186 -0
- package/dist/relations-CvmSpG67.js +163 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-COpmZUfx.d.ts} +1 -1
- package/dist/request-context-BVM7aWNs.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- package/dist/resource-relations-D1Un3pcz.js +243 -0
- package/dist/retire-BFcxL6un.js +240 -0
- package/dist/{rls-P-BeBx0n.js → rls-55DQTuf5.js} +14 -2
- package/dist/{rls-DiinlRML.js → rls-BEktUaqg.js} +884 -484
- package/dist/{policy-xyWg7QdR.js → role-builder-B4GbKM-i.js} +235 -541
- package/dist/{rpc-DL9Sqvb1.js → rpc-nYC3cR_u.js} +15 -5
- package/dist/{run-BWc9qqvE.js → run-DMcNW_8T.js} +3 -3
- package/dist/{runtime-CB8gQFvS.js → runtime-D_tMXnsq.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-DtaA4JuW.js} +9 -8
- package/dist/{openapi-schema--ARjyfQr.js → schema-Bol6gqXA.js} +3 -5
- package/dist/{schema-D3MnDMxa.js → schema-DjQBcAP9.js} +4 -2
- package/dist/scim/index.d.ts +1 -1
- package/dist/scim/index.js +1 -1
- package/dist/{scim-BFGBBAqR.js → scim-vFR1O5oG.js} +6 -12
- package/dist/{scopes-CVdPrWN-.js → scopes-tvpa34ep.js} +10 -2
- package/dist/server/index.d.ts +18 -8
- package/dist/server/index.js +8 -8
- package/dist/{server-DlZ28Oz5.js → server-ZYEHtNHS.js} +4 -4
- package/dist/{create-B1d519XK.d.ts → server-types-DdqBwZN_.d.ts} +69 -33
- package/dist/shared-1uhI-e-b.js +294 -0
- package/dist/{shared-DRu8VFVM.js → shared-JhMeOsDF.js} +1 -1
- package/dist/{sink-Bd9PSyfq.js → sink-BTtmfPnE.js} +1 -1
- package/dist/{sink-B1fZzIMf.d.ts → sink-CPN4zLfs.d.ts} +1 -1
- package/dist/{skills-Biq5uup3.js → skills-BZdRQkxs.js} +4 -3
- package/dist/{skills-C5CbhhpG.js → skills-Dle4ZoLF.js} +2 -2
- package/dist/{snapshot-Enxd0n-s.js → snapshot-Dc9CHPME.js} +116 -13
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-Cod40D-X.js} +1 -1
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-J5T7t_vD.d.ts} +1 -1
- package/dist/solid/index.d.ts +22 -22
- package/dist/solid/index.js +40 -10
- package/dist/{sources-4p0-4xQm.js → sources-B1-b-R0t.js} +25 -26
- package/dist/{sources-BdOYLw9j.d.ts → sources-Dljy06zL.d.ts} +6 -2
- package/dist/{sql-xdg5f4Fi.js → sql-t8teWOfo.js} +19 -3
- package/dist/{src-BDwEZWrZ.js → src-Bb7no-hS.js} +194 -123
- package/dist/ssf/index.d.ts +3 -3
- package/dist/ssf/index.js +58 -61
- package/dist/store-9KO4BlkB.d.ts +147 -0
- package/dist/{store-DMAWwAJV.js → store-ILkLUj_o.js} +4 -4
- package/dist/{store-options-ByhZq1jV.js → store-options-CbUHDoSe.js} +16 -7
- package/dist/{stores-BT2pSCub.js → stores-BHXdSbw9.js} +7 -3
- package/dist/stores-Cxz_80g-.d.ts +31 -0
- package/dist/{stream-DDpvynSB.js → stream-BMui98KK.js} +2 -1
- package/dist/{stream-D1RXubw2.d.ts → stream-Dwsg6WwE.d.ts} +2 -2
- package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +4 -4
- package/dist/supabase/index.js +3 -3
- package/dist/supabase/middleware.d.ts +11 -5
- package/dist/supabase/middleware.js +10 -7
- package/dist/{supabase-C0qESOa-.js → supabase-C1TWlnYt.js} +36 -52
- package/dist/{supabase-s4o9s1O1.js → supabase-Dbqr141s.js} +2 -2
- package/dist/supabase-hook-BULg7Ut_.js +2 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-Cva3ikXz.js} +730 -781
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/svelte/Protected.svelte +9 -2
- package/dist/svelte/index.d.ts +6 -6
- package/dist/svelte/index.js +25 -11
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +6 -6
- package/dist/svelte/source.js +4 -4
- package/dist/{validity-uOp8UpYn.js → tenancy-DshjqY0n.js} +3 -39
- package/dist/terminal/index.d.ts +5 -5
- package/dist/terminal/index.js +18 -34
- package/dist/testing/index.d.ts +89 -77
- package/dist/testing/index.js +1276 -1262
- package/dist/testing/saas/index.d.ts +4 -4
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/thenable-QSmvt-vZ.js +65 -0
- package/dist/{token-CIWxJOCh.js → token-Bx9qy30p.js} +1 -1
- package/dist/tool-refusal-CQ7OEia9.js +41 -0
- package/dist/trpc/index.d.ts +5 -5
- package/dist/trpc/index.js +7 -8
- package/dist/{types-DbjRN55U.d.ts → types-7rJVLWe5.d.ts} +82 -4
- package/dist/{types-aqOHTHcp.d.ts → types-Br9IXUBG.d.ts} +1 -1
- package/dist/types-ByUo56un.d.ts +88 -0
- package/dist/{types-Cq_H8N_X.d.ts → types-C0dee0Qf.d.ts} +2 -2
- package/dist/{types-DxiCGmmd.d.ts → types-CIlTojhq.d.ts} +2 -2
- package/dist/{types-QCuYJh4q.d.ts → types-CUcFZfpU.d.ts} +1 -1
- package/dist/{types-C97IskBw.d.ts → types-CqrjB9o6.d.ts} +1 -1
- package/dist/{types-BnIEz1sU.d.ts → types-DHrmBJLH.d.ts} +24 -6
- package/dist/{types-Dnemwd77.d.ts → types-DpWfQdSh.d.ts} +5 -1
- package/dist/{types-Bvc4oWT6.d.ts → types-DvupZE0w.d.ts} +1 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +1 -1
- package/dist/{usage-B0YuTQRO.js → usage-4G6t643F.js} +2 -2
- package/dist/{usage-ItS7nLcl.js → usage-CG9nOYZw.js} +7 -7
- package/dist/usage-iFLJ0-rr.js +2 -0
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-BSSw0l_8.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-dVrUEPJt.js +62 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DMr_Zmb_.js} +51 -15
- package/dist/{rls-verify-CMv9H3wV.js → verify-BztUB3GX.js} +668 -239
- package/dist/{version-BvacVTZR.js → version-BEogC-rB.js} +1 -1
- package/dist/{views-Soe7bGSC.js → views-CJsrBS1f.js} +23 -1
- package/dist/{vocabulary-DA8a8zif.d.ts → vocabulary-hhEFLFoL.d.ts} +15 -6
- package/dist/vue/index.d.ts +24 -19
- package/dist/vue/index.js +24 -8
- package/dist/watch-C8TpsAl4.js +2 -0
- package/dist/{watch-DVBJ9cBq.js → watch-zeucB7eF.js} +6 -6
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- package/dist/wrap-Cr93qqdP.d.ts +14 -0
- package/dist/wrap-DWsU_5Bd.js +26 -0
- package/package.json +8 -8
- package/schemas/catalog-v1.json +6 -0
- package/skills/permdock-credentials/SKILL.md +1 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
- package/skills/permdock-data/references/queries-and-rls.md +4 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +1 -0
- package/skills/permdock-wire/SKILL.md +2 -2
- package/skills/permdock-wire/references/adapters.md +9 -1
- package/skills/permdock-wire/references/policy-options.md +10 -1
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- package/dist/hosted-DJQw46hn.js +0 -266
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/watch-BwxLTYMZ.js +0 -2
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
import { r as isRecord } from "../compact-CAf557ZB.js";
|
|
1
2
|
import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
3
|
+
import { d as scopeList } from "../scopes-tvpa34ep.js";
|
|
4
|
+
import { c as listPermissions, o as isPermission } from "../permission-registry-BsblpB-z.js";
|
|
5
|
+
import { t as createPermDock } from "../permdock-L26udHSk.js";
|
|
4
6
|
import { t as anonymousSubject } from "../subject-C6dLxqHU.js";
|
|
5
|
-
import { t as mayUse } from "../may-use-
|
|
6
|
-
import { o as parseCredential, r as credentialSubject } from "../credential-
|
|
7
|
+
import { t as mayUse } from "../may-use-BOn_dR_w.js";
|
|
8
|
+
import { o as parseCredential, r as credentialSubject } from "../credential-kue0qpbm.js";
|
|
7
9
|
import { t as policyRowConditionKeys } from "../row-conditions-h2HythXQ.js";
|
|
8
|
-
import {
|
|
9
|
-
import "../sources-
|
|
10
|
-
import { o as subjectFromSupabaseSession, t as parseSupabaseManifest } from "../manifest-
|
|
11
|
-
import { t as parseCatalog } from "../parse-
|
|
10
|
+
import { c as sqlIdent, o as quoteSqlLiteral } from "../sql-t8teWOfo.js";
|
|
11
|
+
import "../sources-B1-b-R0t.js";
|
|
12
|
+
import { o as subjectFromSupabaseSession, t as parseSupabaseManifest } from "../manifest-BngWKryL.js";
|
|
13
|
+
import { t as parseCatalog } from "../parse-CVFQHk6c.js";
|
|
12
14
|
import { AsyncResult, dbError } from "better-supabase";
|
|
13
15
|
//#region src/better-supabase/provider.ts
|
|
14
16
|
/**
|
|
@@ -314,93 +316,6 @@ function authorizationProvider(options) {
|
|
|
314
316
|
});
|
|
315
317
|
}
|
|
316
318
|
//#endregion
|
|
317
|
-
//#region src/better-supabase/policies.ts
|
|
318
|
-
/** PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the policies it generates. */
|
|
319
|
-
const SPLIT_KEY = /#\d+$/u;
|
|
320
|
-
function checkedKey(where, permission, facts, scope) {
|
|
321
|
-
const key = permission.key;
|
|
322
|
-
if (SPLIT_KEY.test(key)) throw new TypeError(`PermDock: ${where} "${key}" is one part of a permission split by row condition. Use the policies \`permdock rls generate\` writes for it.`);
|
|
323
|
-
const entry = facts(key);
|
|
324
|
-
if (!entry.known) throw new TypeError(`PermDock: ${where} "${key}" is not in permissions.catalog.json. Run \`permdock catalog\`.`);
|
|
325
|
-
if (entry.rowConditions) throw new TypeError(`PermDock: ${where} "${key}" has row conditions (rowConditions: true), which the SQL helpers don't check, so the policy would grant every object in the scope. Use the policies \`permdock rls generate\` writes for it.`);
|
|
326
|
-
const grantScope = scope === "platform" ? "global" : scope;
|
|
327
|
-
const scopes = entry.grantScopes;
|
|
328
|
-
if (scopes.length > 0 && !scopes.includes(grantScope)) throw new TypeError(`PermDock: ${where} "${key}" is granted at ${[...new Set(scopes)].join(", ")}, not at ${grantScope}. Check it at one of those scopes.`);
|
|
329
|
-
return key;
|
|
330
|
-
}
|
|
331
|
-
function target(options) {
|
|
332
|
-
const policy = options.policy;
|
|
333
|
-
let names;
|
|
334
|
-
let schemaName;
|
|
335
|
-
let facts;
|
|
336
|
-
if (policy === void 0) {
|
|
337
|
-
const manifest = parseSupabaseManifest(options.manifest);
|
|
338
|
-
const catalog = parseCatalog(options.catalog);
|
|
339
|
-
names = manifest.rls.scopes.map((scope) => scope.name);
|
|
340
|
-
schemaName = manifest.rls.schema;
|
|
341
|
-
facts = (key) => {
|
|
342
|
-
const entry = catalog.permissions.find((candidate) => candidate.key === key);
|
|
343
|
-
return {
|
|
344
|
-
known: entry !== void 0,
|
|
345
|
-
rowConditions: entry?.rowConditions === true,
|
|
346
|
-
grantScopes: (catalog.grants ?? []).flatMap((grant) => grant.permission === key && typeof grant.scope === "string" ? [grant.scope] : [])
|
|
347
|
-
};
|
|
348
|
-
};
|
|
349
|
-
} else {
|
|
350
|
-
names = scopeList(policy.scopes).map((scope) => scope.name);
|
|
351
|
-
schemaName = options.schema ?? "permdock";
|
|
352
|
-
const conditioned = policyRowConditionKeys(policy);
|
|
353
|
-
facts = (key) => ({
|
|
354
|
-
known: true,
|
|
355
|
-
rowConditions: conditioned.has(key),
|
|
356
|
-
grantScopes: policy.grants.flatMap((grant) => grant.hosted === void 0 && grant.permission.key === key && typeof grant.scope === "string" ? [grant.scope] : [])
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
if (options.scope !== "platform" && !names.includes(options.scope)) throw new TypeError(`PermDock: scope "${options.scope}" is not in the ${policy === void 0 ? "manifest's rls.scopes" : "policy's scopes"} (${names.join(", ")}) and is not "platform".`);
|
|
360
|
-
const schema = sqlIdent(schemaName);
|
|
361
|
-
return {
|
|
362
|
-
facts,
|
|
363
|
-
sql: {
|
|
364
|
-
idsWith: `${schema}.permitted_{scope}_ids_by_permission({permission})`,
|
|
365
|
-
isPlatform: `${schema}.permdock_has_permission({permission})`
|
|
366
|
-
}
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* A better-supabase bucket `policy` that checks PermDock permissions with
|
|
371
|
-
* the `rls generate` helpers at `scope`. The helpers check role and scope
|
|
372
|
-
* only, so a permission with row conditions (`rowConditions: true` in the
|
|
373
|
-
* catalog, or a conditioned grant in `policy`), or one not granted at
|
|
374
|
-
* `scope`, throws.
|
|
375
|
-
*/
|
|
376
|
-
function bucketPolicy(access, options) {
|
|
377
|
-
const { facts, sql } = target(options);
|
|
378
|
-
const key = (name, permission) => checkedKey(`bucket access.${name}`, permission, facts, options.scope);
|
|
379
|
-
return freezeDeep({
|
|
380
|
-
access: {
|
|
381
|
-
read: key("read", access.read),
|
|
382
|
-
...access.list ? { list: key("list", access.list) } : {},
|
|
383
|
-
write: key("write", access.write),
|
|
384
|
-
...access.delete ? { delete: key("delete", access.delete) } : {}
|
|
385
|
-
},
|
|
386
|
-
scope: options.scope,
|
|
387
|
-
...options.segment === void 0 ? {} : { segment: options.segment },
|
|
388
|
-
sql
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
/** As {@link bucketPolicy}, for a better-supabase Realtime topic. */
|
|
392
|
-
function topicPolicy(access, options) {
|
|
393
|
-
const { facts, sql } = target(options);
|
|
394
|
-
const key = (name, permission) => checkedKey(`topic ${name}`, permission, facts, options.scope);
|
|
395
|
-
return freezeDeep({
|
|
396
|
-
receive: key("receive", access.receive),
|
|
397
|
-
...access.send ? { send: key("send", access.send) } : {},
|
|
398
|
-
scope: options.scope,
|
|
399
|
-
...options.segment === void 0 ? {} : { segment: options.segment },
|
|
400
|
-
sql
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
//#endregion
|
|
404
319
|
//#region src/better-supabase/api-keys.ts
|
|
405
320
|
const seconds = (instant) => Math.floor(instant.epochMilliseconds / 1e3);
|
|
406
321
|
/** When a key stops verifying: its expiry, or the end of a rotated key's grace period. */
|
|
@@ -508,6 +423,252 @@ function apiKeyClaimOptions(manifest) {
|
|
|
508
423
|
});
|
|
509
424
|
}
|
|
510
425
|
//#endregion
|
|
426
|
+
//#region src/better-supabase/subject.ts
|
|
427
|
+
/** `session` with the short codes in `claim` turned back into feature keys. */
|
|
428
|
+
function decodedFeatures(session, claim, keys) {
|
|
429
|
+
const claims = session?.claims;
|
|
430
|
+
if (session === null || session === void 0 || !isRecord(claims)) return session;
|
|
431
|
+
const coded = claims[claim];
|
|
432
|
+
if (!isRecord(coded)) return session;
|
|
433
|
+
const byCode = new Map(Object.entries(keys).map(([key, code]) => [code, key]));
|
|
434
|
+
const decoded = Object.fromEntries(Object.entries(coded).map(([tenant, codes]) => [tenant, Array.isArray(codes) ? codes.flatMap((code) => {
|
|
435
|
+
const key = typeof code === "string" ? byCode.get(code) : void 0;
|
|
436
|
+
return key === void 0 ? [] : [key];
|
|
437
|
+
}) : codes]));
|
|
438
|
+
return {
|
|
439
|
+
...session,
|
|
440
|
+
claims: {
|
|
441
|
+
...claims,
|
|
442
|
+
[claim]: decoded
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
function isApiKeySession(session) {
|
|
447
|
+
if (typeof session !== "object" || session === null) return false;
|
|
448
|
+
const record = Object.fromEntries(Object.entries(session));
|
|
449
|
+
return record["kind"] === "apiKey" && typeof record["keyId"] === "string" && typeof record["name"] === "string" && Array.isArray(record["scopes"]) && record["scopes"].every((scope) => typeof scope === "string");
|
|
450
|
+
}
|
|
451
|
+
function apiKeySubject(session, options) {
|
|
452
|
+
const roles = typeof options.serviceRoles === "function" ? options.serviceRoles(session) : options.serviceRoles ?? manifestServiceRoles(options.manifest);
|
|
453
|
+
const credential = keyCredential({
|
|
454
|
+
id: session.keyId,
|
|
455
|
+
name: session.name,
|
|
456
|
+
scopes: session.scopes,
|
|
457
|
+
...session.organizationId === void 0 ? {} : { organizationId: session.organizationId },
|
|
458
|
+
...session.userId === void 0 ? {} : { userId: session.userId },
|
|
459
|
+
...session.createdBy === void 0 ? {} : { createdBy: session.createdBy },
|
|
460
|
+
...session.createdAt === void 0 ? {} : { createdAt: session.createdAt }
|
|
461
|
+
}, roles, listPermissions(options.permissions));
|
|
462
|
+
return credential === null ? anonymousSubject() : credentialSubject(credential, { permissions: options.permissions });
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
|
|
466
|
+
* `memberships` for the memberships and the entitlements module's `features`
|
|
467
|
+
* claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
|
|
468
|
+
* a verified `apiKey` session is the key's credential subject: a personal key
|
|
469
|
+
* acts as its user within the key's scopes, a tenant key as a `service`
|
|
470
|
+
* principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
|
|
471
|
+
* `service` and `invalid` sessions, the subject is anonymous.
|
|
472
|
+
*/
|
|
473
|
+
function subjectFromBetterSupabase(session, options = {}) {
|
|
474
|
+
const { apiKeys, plans = "features", ...rest } = options;
|
|
475
|
+
if (isApiKeySession(session)) return apiKeys === void 0 ? anonymousSubject() : apiKeySubject(session, apiKeys);
|
|
476
|
+
const claim = typeof plans === "string" ? plans : plans.claim ?? "features";
|
|
477
|
+
const keys = typeof plans === "string" ? void 0 : plans.keys;
|
|
478
|
+
return subjectFromSupabaseSession(keys === void 0 ? session : decodedFeatures(session, claim, keys), {
|
|
479
|
+
memberships: "memberships",
|
|
480
|
+
...rest,
|
|
481
|
+
plans: claim
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
//#endregion
|
|
485
|
+
//#region src/better-supabase/authorizer.ts
|
|
486
|
+
const OPERATIONS = /* @__PURE__ */ new Set([
|
|
487
|
+
"list",
|
|
488
|
+
"get",
|
|
489
|
+
"create",
|
|
490
|
+
"update",
|
|
491
|
+
"delete"
|
|
492
|
+
]);
|
|
493
|
+
const denied = (reason) => ({
|
|
494
|
+
outcome: "denied",
|
|
495
|
+
reason
|
|
496
|
+
});
|
|
497
|
+
function outcomeOf(decision, key) {
|
|
498
|
+
switch (decision.outcome) {
|
|
499
|
+
case "granted": return { outcome: "granted" };
|
|
500
|
+
case "approval-required": return {
|
|
501
|
+
outcome: "approval-required",
|
|
502
|
+
approval: { id: decision.token }
|
|
503
|
+
};
|
|
504
|
+
case "denied": {
|
|
505
|
+
const why = decision.denials[0]?.reason;
|
|
506
|
+
return denied(why === void 0 ? `PermDock denied ${key}.` : `PermDock denied ${key}: ${why}.`);
|
|
507
|
+
}
|
|
508
|
+
default: return decision;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
function decideWith(permdock, request) {
|
|
512
|
+
const { action } = request;
|
|
513
|
+
if (!isPermission(action)) return denied("Unknown permission.");
|
|
514
|
+
return outcomeOf(permdock.decide(action, request.resource.properties), action.key);
|
|
515
|
+
}
|
|
516
|
+
/** The verified claims better-supabase passes in `subject.properties.claims`, for a user or a delegated agent. */
|
|
517
|
+
function claimsOf(request) {
|
|
518
|
+
const { subject } = request;
|
|
519
|
+
if (subject.type !== "user" && subject.type !== "agent") return void 0;
|
|
520
|
+
const claims = subject.properties?.["claims"];
|
|
521
|
+
return isRecord(claims) ? claims : void 0;
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* better-supabase's `authorizer` for PermDock: every resource, action, route
|
|
525
|
+
* guard and MCP tool that declares a `permission` is decided with `decide`.
|
|
526
|
+
* The subject is mapped from the verified claims with
|
|
527
|
+
* `subjectFromBetterSupabase`; the request's `context.tenant` selects the
|
|
528
|
+
* active tenant only among the memberships the claims hold. A caller without
|
|
529
|
+
* claims is anonymous, and a throw denies.
|
|
530
|
+
*/
|
|
531
|
+
function authorizer(options) {
|
|
532
|
+
const { operations } = options;
|
|
533
|
+
const instanceFor = async (claims, tenant) => {
|
|
534
|
+
const session = claims === void 0 ? null : {
|
|
535
|
+
kind: "user",
|
|
536
|
+
claims
|
|
537
|
+
};
|
|
538
|
+
const base = await createPermDock(options.policy, subjectFromBetterSupabase(session, options.subject), options.options);
|
|
539
|
+
return typeof tenant === "string" ? base.tenant(tenant) : base;
|
|
540
|
+
};
|
|
541
|
+
return Object.freeze({
|
|
542
|
+
apiVersion: 1,
|
|
543
|
+
name: "PermDock",
|
|
544
|
+
key(ref) {
|
|
545
|
+
if (!isPermission(ref)) throw new TypeError("Not a PermDock permission");
|
|
546
|
+
return ref.key;
|
|
547
|
+
},
|
|
548
|
+
...operations === void 0 ? {} : { forOperation(table, operation) {
|
|
549
|
+
if (!OPERATIONS.has(operation) || !Object.hasOwn(operations, table)) return void 0;
|
|
550
|
+
return operations[table]?.[operation];
|
|
551
|
+
} },
|
|
552
|
+
async evaluate(request) {
|
|
553
|
+
try {
|
|
554
|
+
return decideWith(await instanceFor(claimsOf(request), request.context["tenant"]), request);
|
|
555
|
+
} catch {
|
|
556
|
+
return denied("The permission check failed.");
|
|
557
|
+
}
|
|
558
|
+
},
|
|
559
|
+
evaluations(requests) {
|
|
560
|
+
const cache = /* @__PURE__ */ new Map();
|
|
561
|
+
const shared = (claims, tenant) => {
|
|
562
|
+
let byTenant = cache.get(claims);
|
|
563
|
+
if (byTenant === void 0) {
|
|
564
|
+
byTenant = /* @__PURE__ */ new Map();
|
|
565
|
+
cache.set(claims, byTenant);
|
|
566
|
+
}
|
|
567
|
+
let instance = byTenant.get(tenant);
|
|
568
|
+
if (instance === void 0) {
|
|
569
|
+
instance = instanceFor(claims, tenant);
|
|
570
|
+
byTenant.set(tenant, instance);
|
|
571
|
+
}
|
|
572
|
+
return instance;
|
|
573
|
+
};
|
|
574
|
+
return Promise.all(requests.map(async (request) => {
|
|
575
|
+
try {
|
|
576
|
+
return decideWith(await shared(claimsOf(request), request.context["tenant"]), request);
|
|
577
|
+
} catch {
|
|
578
|
+
return denied("The permission check failed.");
|
|
579
|
+
}
|
|
580
|
+
}));
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
//#endregion
|
|
585
|
+
//#region src/better-supabase/policies.ts
|
|
586
|
+
/** PermDock splits a key with row conditions into `key#1`, `key#2`, ... in the policies it generates. */
|
|
587
|
+
const SPLIT_KEY = /#\d+$/u;
|
|
588
|
+
function checkedKey(where, permission, facts, scope) {
|
|
589
|
+
const key = permission.key;
|
|
590
|
+
if (SPLIT_KEY.test(key)) throw new TypeError(`PermDock: ${where} "${key}" is one part of a permission split by row condition. Use the policies \`permdock rls generate\` writes for it.`);
|
|
591
|
+
const entry = facts(key);
|
|
592
|
+
if (!entry.known) throw new TypeError(`PermDock: ${where} "${key}" is not in permissions.catalog.json. Run \`permdock catalog\`.`);
|
|
593
|
+
if (entry.rowConditions) throw new TypeError(`PermDock: ${where} "${key}" has row conditions (rowConditions: true), which the SQL helpers don't check, so the policy would grant every object in the scope. Use the policies \`permdock rls generate\` writes for it.`);
|
|
594
|
+
const grantScope = scope === "platform" ? "global" : scope;
|
|
595
|
+
const scopes = entry.grantScopes;
|
|
596
|
+
if (scopes.length > 0 && !scopes.includes(grantScope)) throw new TypeError(`PermDock: ${where} "${key}" is granted at ${[...new Set(scopes)].join(", ")}, not at ${grantScope}. Check it at one of those scopes.`);
|
|
597
|
+
return key;
|
|
598
|
+
}
|
|
599
|
+
function target(options) {
|
|
600
|
+
const policy = options.policy;
|
|
601
|
+
let names;
|
|
602
|
+
let schemaName;
|
|
603
|
+
let facts;
|
|
604
|
+
if (policy === void 0) {
|
|
605
|
+
const manifest = parseSupabaseManifest(options.manifest);
|
|
606
|
+
const catalog = parseCatalog(options.catalog);
|
|
607
|
+
names = manifest.rls.scopes.map((scope) => scope.name);
|
|
608
|
+
schemaName = manifest.rls.schema;
|
|
609
|
+
facts = (key) => {
|
|
610
|
+
const entry = catalog.permissions.find((candidate) => candidate.key === key);
|
|
611
|
+
return {
|
|
612
|
+
known: entry !== void 0,
|
|
613
|
+
rowConditions: entry?.rowConditions === true,
|
|
614
|
+
grantScopes: (catalog.grants ?? []).flatMap((grant) => grant.permission === key && typeof grant.scope === "string" ? [grant.scope] : [])
|
|
615
|
+
};
|
|
616
|
+
};
|
|
617
|
+
} else {
|
|
618
|
+
names = scopeList(policy.scopes).map((scope) => scope.name);
|
|
619
|
+
schemaName = options.schema ?? "permdock";
|
|
620
|
+
const conditioned = policyRowConditionKeys(policy);
|
|
621
|
+
facts = (key) => ({
|
|
622
|
+
known: true,
|
|
623
|
+
rowConditions: conditioned.has(key),
|
|
624
|
+
grantScopes: policy.grants.flatMap((grant) => grant.hosted === void 0 && grant.permission.key === key && typeof grant.scope === "string" ? [grant.scope] : [])
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
if (options.scope !== "platform" && !names.includes(options.scope)) throw new TypeError(`PermDock: scope "${options.scope}" is not in the ${policy === void 0 ? "manifest's rls.scopes" : "policy's scopes"} (${names.join(", ")}) and is not "platform".`);
|
|
628
|
+
const schema = sqlIdent(schemaName);
|
|
629
|
+
return {
|
|
630
|
+
facts,
|
|
631
|
+
sql: {
|
|
632
|
+
idsWith: `${schema}.permitted_{scope}_ids_by_permission({permission})`,
|
|
633
|
+
isPlatform: `${schema}.permdock_has_permission({permission})`
|
|
634
|
+
}
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* A better-supabase bucket `policy` that checks PermDock permissions with
|
|
639
|
+
* the `rls generate` helpers at `scope`. The helpers check role and scope
|
|
640
|
+
* only, so a permission with row conditions (`rowConditions: true` in the
|
|
641
|
+
* catalog, or a conditioned grant in `policy`), or one not granted at
|
|
642
|
+
* `scope`, throws.
|
|
643
|
+
*/
|
|
644
|
+
function bucketPolicy(access, options) {
|
|
645
|
+
const { facts, sql } = target(options);
|
|
646
|
+
const key = (name, permission) => checkedKey(`bucket access.${name}`, permission, facts, options.scope);
|
|
647
|
+
return freezeDeep({
|
|
648
|
+
access: {
|
|
649
|
+
read: key("read", access.read),
|
|
650
|
+
...access.list ? { list: key("list", access.list) } : {},
|
|
651
|
+
write: key("write", access.write),
|
|
652
|
+
...access.delete ? { delete: key("delete", access.delete) } : {}
|
|
653
|
+
},
|
|
654
|
+
scope: options.scope,
|
|
655
|
+
...options.segment === void 0 ? {} : { segment: options.segment },
|
|
656
|
+
sql
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
/** As {@link bucketPolicy}, for a better-supabase Realtime topic. */
|
|
660
|
+
function topicPolicy(access, options) {
|
|
661
|
+
const { facts, sql } = target(options);
|
|
662
|
+
const key = (name, permission) => checkedKey(`topic ${name}`, permission, facts, options.scope);
|
|
663
|
+
return freezeDeep({
|
|
664
|
+
receive: key("receive", access.receive),
|
|
665
|
+
...access.send ? { send: key("send", access.send) } : {},
|
|
666
|
+
scope: options.scope,
|
|
667
|
+
...options.segment === void 0 ? {} : { segment: options.segment },
|
|
668
|
+
sql
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
//#endregion
|
|
511
672
|
//#region src/better-supabase/credentials.ts
|
|
512
673
|
/**
|
|
513
674
|
* `provider` with every `getToken`, `startAuthorization`,
|
|
@@ -585,64 +746,4 @@ function toolPolicy(options) {
|
|
|
585
746
|
});
|
|
586
747
|
}
|
|
587
748
|
//#endregion
|
|
588
|
-
|
|
589
|
-
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
590
|
-
/** `session` with the short codes in `claim` turned back into feature keys. */
|
|
591
|
-
function decodedFeatures(session, claim, keys) {
|
|
592
|
-
const claims = session?.claims;
|
|
593
|
-
if (session === null || session === void 0 || !isRecord(claims)) return session;
|
|
594
|
-
const coded = claims[claim];
|
|
595
|
-
if (!isRecord(coded)) return session;
|
|
596
|
-
const byCode = new Map(Object.entries(keys).map(([key, code]) => [code, key]));
|
|
597
|
-
const decoded = Object.fromEntries(Object.entries(coded).map(([tenant, codes]) => [tenant, Array.isArray(codes) ? codes.flatMap((code) => {
|
|
598
|
-
const key = typeof code === "string" ? byCode.get(code) : void 0;
|
|
599
|
-
return key === void 0 ? [] : [key];
|
|
600
|
-
}) : codes]));
|
|
601
|
-
return {
|
|
602
|
-
...session,
|
|
603
|
-
claims: {
|
|
604
|
-
...claims,
|
|
605
|
-
[claim]: decoded
|
|
606
|
-
}
|
|
607
|
-
};
|
|
608
|
-
}
|
|
609
|
-
function isApiKeySession(session) {
|
|
610
|
-
if (typeof session !== "object" || session === null) return false;
|
|
611
|
-
const record = Object.fromEntries(Object.entries(session));
|
|
612
|
-
return record["kind"] === "apiKey" && typeof record["keyId"] === "string" && typeof record["name"] === "string" && Array.isArray(record["scopes"]) && record["scopes"].every((scope) => typeof scope === "string");
|
|
613
|
-
}
|
|
614
|
-
function apiKeySubject(session, options) {
|
|
615
|
-
const roles = typeof options.serviceRoles === "function" ? options.serviceRoles(session) : options.serviceRoles ?? manifestServiceRoles(options.manifest);
|
|
616
|
-
const credential = keyCredential({
|
|
617
|
-
id: session.keyId,
|
|
618
|
-
name: session.name,
|
|
619
|
-
scopes: session.scopes,
|
|
620
|
-
...session.organizationId === void 0 ? {} : { organizationId: session.organizationId },
|
|
621
|
-
...session.userId === void 0 ? {} : { userId: session.userId },
|
|
622
|
-
...session.createdBy === void 0 ? {} : { createdBy: session.createdBy },
|
|
623
|
-
...session.createdAt === void 0 ? {} : { createdAt: session.createdAt }
|
|
624
|
-
}, roles, listPermissions(options.permissions));
|
|
625
|
-
return credential === null ? anonymousSubject() : credentialSubject(credential, { permissions: options.permissions });
|
|
626
|
-
}
|
|
627
|
-
/**
|
|
628
|
-
* `subjectFromSupabaseSession` for better-supabase's `AuthSession`, reading
|
|
629
|
-
* `memberships` for the memberships and the entitlements module's `features`
|
|
630
|
-
* claim for `principal.plans` (`plans` names another claim). With `apiKeys`,
|
|
631
|
-
* a verified `apiKey` session is the key's credential subject: a personal key
|
|
632
|
-
* acts as its user within the key's scopes, a tenant key as a `service`
|
|
633
|
-
* principal holding `serviceRoles`. Without `apiKeys`, and for `anon`,
|
|
634
|
-
* `service` and `invalid` sessions, the subject is anonymous.
|
|
635
|
-
*/
|
|
636
|
-
function subjectFromBetterSupabase(session, options = {}) {
|
|
637
|
-
const { apiKeys, plans = "features", ...rest } = options;
|
|
638
|
-
if (isApiKeySession(session)) return apiKeys === void 0 ? anonymousSubject() : apiKeySubject(session, apiKeys);
|
|
639
|
-
const claim = typeof plans === "string" ? plans : plans.claim ?? "features";
|
|
640
|
-
const keys = typeof plans === "string" ? void 0 : plans.keys;
|
|
641
|
-
return subjectFromSupabaseSession(keys === void 0 ? session : decodedFeatures(session, claim, keys), {
|
|
642
|
-
memberships: "memberships",
|
|
643
|
-
...rest,
|
|
644
|
-
plans: claim
|
|
645
|
-
});
|
|
646
|
-
}
|
|
647
|
-
//#endregion
|
|
648
|
-
export { apiKeyClaimOptions, apiKeyVerifier, authorizationProvider, bucketPolicy, credentialGuard, subjectFromBetterSupabase, toolPolicy, topicPolicy };
|
|
749
|
+
export { apiKeyClaimOptions, apiKeyVerifier, authorizationProvider, authorizer, bucketPolicy, credentialGuard, subjectFromBetterSupabase, toolPolicy, topicPolicy };
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { f as ApprovalStore } from "./types-
|
|
2
|
-
import { t as InstanceOptions } from "./instance-options-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { f as ApprovalStore } from "./types-Br9IXUBG.js";
|
|
2
|
+
import { t as InstanceOptions } from "./instance-options-plkrsAog.js";
|
|
3
|
+
import { t as RequestContext } from "./request-context-C2_1lchh.js";
|
|
4
|
+
import { n as PermDockWrap } from "./wrap-Cr93qqdP.js";
|
|
5
|
+
import { r as PdpFactory } from "./types-CIlTojhq.js";
|
|
6
|
+
import { T as TenantOption, n as OnDenied, y as WebBotAuthVerifier } from "./server-types-DdqBwZN_.js";
|
|
7
|
+
import { o as OtelWrap } from "./types-CUcFZfpU.js";
|
|
6
8
|
//#region src/server/bind.d.ts
|
|
7
9
|
/** The options of every framework adapter; `TContext` is what its callbacks receive. */
|
|
8
10
|
type ServerAdapterOptions<TContext, TUser = unknown> = InstanceOptions & ServerAdapterServices & {
|
|
@@ -10,6 +12,11 @@ type ServerAdapterOptions<TContext, TUser = unknown> = InstanceOptions & ServerA
|
|
|
10
12
|
/** The agent or service acting for the subject; anything but an `Actor` is ignored. */
|
|
11
13
|
readonly actor?: (context: TContext) => unknown;
|
|
12
14
|
readonly tenant?: TenantOption<TContext>;
|
|
15
|
+
/**
|
|
16
|
+
* Request values merged into `subject.context`, under `policy.context`.
|
|
17
|
+
* Only values the server derived belong here, never client input.
|
|
18
|
+
*/
|
|
19
|
+
readonly context?: (context: TContext) => RequestContext | undefined | Promise<RequestContext | undefined>;
|
|
13
20
|
};
|
|
14
21
|
/** The services an adapter hands to its kernel unchanged. */
|
|
15
22
|
type ServerAdapterServices = {
|
|
@@ -20,6 +27,10 @@ type ServerAdapterServices = {
|
|
|
20
27
|
readonly otel?: OtelWrap;
|
|
21
28
|
/** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
|
|
22
29
|
readonly webBotAuth?: WebBotAuthVerifier;
|
|
30
|
+
/** Wraps each instance after `otel`; build it with `wrapPermDock` to cover derived instances. */
|
|
31
|
+
readonly wrap?: PermDockWrap;
|
|
32
|
+
/** Replaces the response of a refused guard; it can never turn a refusal into a grant. */
|
|
33
|
+
readonly onDenied?: OnDenied;
|
|
23
34
|
};
|
|
24
35
|
//#endregion
|
|
25
36
|
export { ServerAdapterServices as n, ServerAdapterOptions as t };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { t as compact } from "./compact-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { t as composeWraps } from "./wrap-DWsU_5Bd.js";
|
|
3
|
+
import { r as instanceOptions } from "./build-instance-DIIV9DbC.js";
|
|
4
|
+
import { o as invalidSignatureResponse } from "./evaluations-C9YJsv3H.js";
|
|
4
5
|
import { n as tenantScope } from "./adapter-context-mlWsVGGg.js";
|
|
5
|
-
import { n as createServerKernel } from "./create-
|
|
6
|
+
import { n as createServerKernel } from "./create-BBO24vj6.js";
|
|
6
7
|
//#region src/server/bind.ts
|
|
7
8
|
/** The server kernel with the subject and actor callbacks reading the context `contextOf` maps a `Request` to. */
|
|
8
9
|
function adapterKernel(policy, options, adapter, contextOf) {
|
|
@@ -15,13 +16,18 @@ function adapterKernel(policy, options, adapter, contextOf) {
|
|
|
15
16
|
const context = contextOf(request);
|
|
16
17
|
return context === void 0 ? void 0 : options.actor?.(context);
|
|
17
18
|
},
|
|
19
|
+
context: options.context === void 0 ? void 0 : (request) => {
|
|
20
|
+
const context = contextOf(request);
|
|
21
|
+
return context === void 0 ? void 0 : options.context?.(context);
|
|
22
|
+
},
|
|
18
23
|
...instanceOptions(options),
|
|
19
24
|
store: options.store,
|
|
20
25
|
pdp: options.pdp,
|
|
21
26
|
webBotAuth: options.webBotAuth,
|
|
22
27
|
revocations: options.revocations,
|
|
23
28
|
adapter,
|
|
24
|
-
wrap: options.otel
|
|
29
|
+
wrap: composeWraps(options.otel, options.wrap),
|
|
30
|
+
onDenied: options.onDenied
|
|
25
31
|
}));
|
|
26
32
|
}
|
|
27
33
|
/**
|
|
@@ -53,13 +59,15 @@ function bindKernel(policy, options, adapter, toRequest) {
|
|
|
53
59
|
return context === void 0 ? Promise.resolve({ tenant: void 0 }) : scopeOf(context);
|
|
54
60
|
};
|
|
55
61
|
const attach = (context) => attached(async () => kernel.permdock(bind(context), await scopeOf(context)));
|
|
62
|
+
const guard = async (permission, loadData, context, protectOptions) => kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(context), protectOptions)(bind(context), await scopeOf(context));
|
|
56
63
|
return {
|
|
57
64
|
kernel,
|
|
58
65
|
bind,
|
|
59
66
|
rebind,
|
|
60
67
|
scopeOf,
|
|
61
68
|
handlerScope,
|
|
62
|
-
attach
|
|
69
|
+
attach,
|
|
70
|
+
guard
|
|
63
71
|
};
|
|
64
72
|
}
|
|
65
73
|
/** The instance `build` resolves; an invalid Web Bot Auth signature is its `401` response. */
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { t as createPermDock } from "./permdock-L26udHSk.js";
|
|
3
|
+
//#region src/core/instance-options.ts
|
|
4
|
+
const INSTANCE_KEYS = {
|
|
5
|
+
memberships: true,
|
|
6
|
+
relations: true,
|
|
7
|
+
entitlements: true,
|
|
8
|
+
customRoles: true,
|
|
9
|
+
policies: true,
|
|
10
|
+
approvalPolicies: true,
|
|
11
|
+
sink: true,
|
|
12
|
+
limits: true
|
|
13
|
+
};
|
|
14
|
+
/** The `InstanceOptions` set on `options`, without the adapter's own keys. */
|
|
15
|
+
function instanceOptions(options) {
|
|
16
|
+
const picked = {};
|
|
17
|
+
for (const key of Object.keys(INSTANCE_KEYS)) {
|
|
18
|
+
const name = key;
|
|
19
|
+
if (options[name] !== void 0) picked[name] = options[name];
|
|
20
|
+
}
|
|
21
|
+
return picked;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/core/build-instance.ts
|
|
25
|
+
/**
|
|
26
|
+
* `resolve()`, or `null` when it throws: a subject or delegation that cannot
|
|
27
|
+
* be resolved is absent. `rethrow` sees the error first, so a framework's
|
|
28
|
+
* control-flow throws (Next.js `redirect`, `notFound`) pass through.
|
|
29
|
+
*/
|
|
30
|
+
async function resolveOrNull(resolve, rethrow) {
|
|
31
|
+
try {
|
|
32
|
+
return await resolve();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
rethrow?.(error);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** The one path every server adapter creates a request's instance through. */
|
|
39
|
+
async function buildInstance(input) {
|
|
40
|
+
const options = compact({
|
|
41
|
+
...instanceOptions(input.sources),
|
|
42
|
+
...input.scope
|
|
43
|
+
});
|
|
44
|
+
const created = await createPermDock(input.policy, input.user, options);
|
|
45
|
+
return {
|
|
46
|
+
permdock: input.wrap === void 0 ? created : input.wrap(created),
|
|
47
|
+
options
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { resolveOrNull as n, instanceOptions as r, buildInstance as t };
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
+
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
1
2
|
//#region src/core/canonical-json.ts
|
|
2
|
-
function isRecord(value) {
|
|
3
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4
|
-
}
|
|
5
3
|
/**
|
|
6
4
|
* JSON with sorted keys and `undefined` members dropped, so equal values hash
|
|
7
5
|
* equally. Dates become ISO strings, bigints `"<n>n"`, and a repeated object
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Or as Principal, kr as Subject, lt as TokenSigner } from "./policy-types-sp9P1iIV.js";
|
|
2
|
+
import { d as Permission, p as PermissionTree } from "./permission-types-Dg39z9Kv.js";
|
|
3
3
|
//#region src/core/capability.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Who may redeem a capability: anyone holding it, any signed-in principal,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { t as compact } from "./compact-
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import {
|
|
3
|
+
import { o as isForbiddenKey } from "./thenable-QSmvt-vZ.js";
|
|
4
4
|
import { t as expiredAt } from "./expiry-BoBJ8Tvc.js";
|
|
5
5
|
import { n as sameId } from "./ids-DC4V4CFu.js";
|
|
6
|
+
import { c as listPermissions } from "./permission-registry-BsblpB-z.js";
|
|
6
7
|
import { t as anonymousSubject } from "./subject-C6dLxqHU.js";
|
|
7
8
|
//#region src/core/capability.ts
|
|
8
9
|
function redeemerKind(redeemer) {
|
package/dist/catalog/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, i as CatalogDelegation, l as CatalogRole, n as CatalogApproval, o as CatalogGrant, p as CatalogValidity, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-
|
|
1
|
+
import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, i as CatalogDelegation, l as CatalogRole, n as CatalogApproval, o as CatalogGrant, p as CatalogValidity, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-DpWfQdSh.js";
|
|
2
2
|
//#region src/catalog/parse.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* Reads a `permissions.catalog.json` document (parsed, or the JSON text) and
|
package/dist/catalog/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as rowConditionKeys, t as parseCatalog } from "../parse-
|
|
1
|
+
import { n as rowConditionKeys, t as parseCatalog } from "../parse-CVFQHk6c.js";
|
|
2
2
|
export { parseCatalog, rowConditionKeys };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-
|
|
1
|
+
import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-Cpip4ULx.js";
|
|
2
2
|
import { defineCommand } from "citty";
|
|
3
3
|
//#region src/cli/commands/catalog.ts
|
|
4
4
|
function catalog(ctx) {
|
|
@@ -31,7 +31,7 @@ function catalog(ctx) {
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
async run({ args: parsed, rawArgs }) {
|
|
34
|
-
const result = await (await import("./catalog-
|
|
34
|
+
const result = await (await import("./catalog-6yWAX6Ps.js")).runCatalog({
|
|
35
35
|
cwd: ctx.cwd,
|
|
36
36
|
config: ctx.config,
|
|
37
37
|
format: parsed.format,
|