permdock 0.5.0 → 0.7.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/README.md +1 -0
- package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
- package/dist/a2a/index.d.ts +5 -5
- package/dist/a2a/index.js +4 -4
- package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +21 -6
- package/dist/ai-sdk/index.js +19 -9
- package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
- package/dist/approvals/index.d.ts +4 -4
- package/dist/approvals/index.js +4 -4
- package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
- package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
- package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
- package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
- package/dist/astro/index.d.ts +6 -6
- package/dist/astro/index.js +2 -2
- package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
- package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
- package/dist/authzen/index.d.ts +162 -22
- package/dist/authzen/index.js +315 -146
- package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
- package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
- package/dist/base-url-BQbddZO5.js +9 -0
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +2 -2
- package/dist/better-supabase/index.d.ts +50 -8
- package/dist/better-supabase/index.js +94 -32
- package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
- package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
- package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
- package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
- package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
- package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
- package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
- package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
- package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
- package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
- package/dist/catalog/index.d.ts +70 -10
- package/dist/catalog/index.js +112 -6
- package/dist/catalog-BCCjSAdH.js +1 -0
- package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
- package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
- package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
- package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
- package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +2 -2
- package/dist/chat-sdk/index.d.ts +3 -3
- package/dist/checks-BC_0mPIq.js +37 -0
- package/dist/claude-agent/index.d.ts +3 -3
- package/dist/claude-agent/index.js +2 -2
- package/dist/clerk/index.d.ts +3 -3
- package/dist/clerk/index.js +1 -1
- package/dist/cli/bin.js +2 -2
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +3 -3
- package/dist/cloud/index.d.ts +127 -11
- package/dist/cloud/index.js +251 -3
- package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
- package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
- package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
- package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
- package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
- package/dist/collect-k_Dulxr5.js +1 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -1
- package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
- package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
- package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
- package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
- package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
- package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
- package/dist/connector-schema-_VCSsdtD.js +433 -0
- package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
- package/dist/convex/index.d.ts +5 -5
- package/dist/convex/index.js +2 -2
- package/dist/core-B5-w6Kw9.js +335 -0
- package/dist/core-CQkE8Esr.d.ts +179 -0
- package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
- package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
- package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
- package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
- package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
- package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
- package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
- package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
- package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
- package/dist/delivery/index.d.ts +5 -5
- package/dist/delivery/index.js +4 -3
- package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
- package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
- package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
- package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
- package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
- package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
- package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
- package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
- package/dist/drizzle/index.d.ts +3 -3
- package/dist/drizzle/index.js +1 -1
- package/dist/elysia/index.d.ts +5 -5
- package/dist/elysia/index.js +3 -3
- package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
- package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
- package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
- package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
- package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +3 -3
- package/dist/express/index.d.ts +5 -5
- package/dist/express/index.js +3 -3
- package/dist/fastify/index.d.ts +5 -5
- package/dist/fastify/index.js +3 -3
- package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
- package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
- package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
- package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
- package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
- package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
- package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
- package/dist/generate-3FNO5P5Q.js +159 -0
- package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
- package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
- package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
- package/dist/h3/index.d.ts +4 -4
- package/dist/h3/index.js +3 -3
- package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
- package/dist/hono/index.d.ts +5 -5
- package/dist/hono/index.js +3 -3
- package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
- package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
- package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
- package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
- package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
- package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
- package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
- package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
- package/dist/index-CMiPH2Tv.d.ts +206 -0
- package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
- package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
- package/dist/index.d.ts +18 -17
- package/dist/index.js +27 -25
- package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
- package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
- package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
- package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
- package/dist/jwt/index.d.ts +83 -5
- package/dist/jwt/index.js +143 -5
- package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
- package/dist/kysely/index.d.ts +3 -3
- package/dist/kysely/index.js +1 -1
- package/dist/load-DrMHXzgN.js +1 -0
- package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
- package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
- package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
- package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
- package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
- package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
- package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
- package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
- package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
- package/dist/mcp/index.d.ts +64 -10
- package/dist/mcp/index.js +151 -22
- package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
- package/dist/nest/index.d.ts +5 -5
- package/dist/nest/index.js +3 -3
- package/dist/next/index.d.ts +9 -9
- package/dist/next/index.js +5 -5
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +2 -2
- package/dist/openai/index.d.ts +5 -5
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +14 -4
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
- package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
- package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
- package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
- package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
- package/dist/orpc/index.d.ts +6 -6
- package/dist/orpc/index.js +4 -4
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +1 -1
- package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
- package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
- package/dist/output-files-DPAY7-GX.js +1 -0
- package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
- package/dist/parse-Ddhz2xf4.js +148 -0
- package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
- package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
- package/dist/pdp/index.d.ts +3 -3
- package/dist/pdp/index.js +7 -3
- package/dist/peer-12Q5I_RH.js +976 -0
- package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
- package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
- package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
- package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
- package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
- package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
- package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
- package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
- package/dist/pkce-5h8NgMQJ.js +21 -0
- package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
- package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
- package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
- package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
- package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
- package/dist/postgres-store-BL9M_CA1.js +1001 -0
- package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
- package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
- package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
- package/dist/powersync-53ryOZip.js +1059 -0
- package/dist/powersync-CExtTLyA.js +1 -0
- package/dist/preset/index.js +1 -1
- package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
- package/dist/prisma/index.d.ts +2 -2
- package/dist/prisma/index.js +1 -1
- package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
- package/dist/prompt-DwtVemER.js +935 -0
- package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
- package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
- package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
- package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
- package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
- package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
- package/dist/pull-Cty6Ovyu.js +1 -0
- package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
- package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
- package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
- package/dist/react/index.d.ts +6 -6
- package/dist/react/index.js +3 -3
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +25 -11
- package/dist/react-native/index.js +214 -24
- package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
- package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
- package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
- package/dist/resend/index.d.ts +4 -4
- package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
- package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
- package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
- package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
- package/dist/rolldown-runtime-C3I60J0A.js +4 -0
- package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
- package/dist/run-Bz7DXGEv.js +1 -0
- package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
- package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
- package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
- package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
- package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
- package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
- package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
- package/dist/scim/index.d.ts +3 -2
- package/dist/scim/index.js +3 -1
- package/dist/scim-C7JYhySg.js +44 -0
- package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
- package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
- package/dist/server/index.d.ts +11 -11
- package/dist/server/index.js +7 -7
- package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
- package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
- package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
- package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
- package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
- package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
- package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
- package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
- package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
- package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
- package/dist/solid/index.d.ts +6 -5
- package/dist/solid/index.js +4 -4
- package/dist/solid-start/index.d.ts +6 -6
- package/dist/solid-start/index.js +3 -3
- package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
- package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
- package/dist/sources-qoIJQrJv.js +11 -0
- package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
- package/dist/sql-CDEPCA0g.d.ts +10 -0
- package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +640 -211
- package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
- package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
- package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
- package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
- package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
- package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
- package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
- package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
- package/dist/supabase/index.d.ts +8 -7
- package/dist/supabase/index.js +5 -5
- package/dist/supabase/middleware.d.ts +6 -6
- package/dist/supabase/middleware.js +6 -6
- package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
- package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
- package/dist/supabase-hook-DJxC4PoP.js +1 -0
- package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
- package/dist/supautils-MESd81bF.js +689 -0
- package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
- package/dist/svelte/index.d.ts +5 -5
- package/dist/svelte/index.js +5 -5
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +5 -5
- package/dist/svelte/source.js +2 -2
- package/dist/sveltekit/index.d.ts +6 -6
- package/dist/sveltekit/index.js +2 -2
- package/dist/tanstack-start/index.d.ts +6 -6
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
- package/dist/terminal/index.d.ts +6 -6
- package/dist/terminal/index.js +3 -3
- package/dist/testing/core.d.ts +2 -0
- package/dist/testing/core.js +1 -0
- package/dist/testing/fixtures/index.d.ts +12 -0
- package/dist/testing/fixtures/index.js +770 -0
- package/dist/testing/index.d.ts +41 -174
- package/dist/testing/index.js +241 -731
- package/dist/testing/saas/index.d.ts +5 -5
- 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/text-diff-DhITNCnD.js +444 -0
- package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
- package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
- package/dist/trpc/index.d.ts +6 -6
- package/dist/trpc/index.js +3 -3
- package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
- package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
- package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
- package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
- package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
- package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
- package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
- package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
- package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
- package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
- package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
- package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
- package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
- package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
- package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
- package/dist/usage-y-kBNdqs.js +1 -0
- package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
- package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
- package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
- package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
- package/dist/vue/index.d.ts +6 -5
- package/dist/vue/index.js +4 -4
- package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
- package/dist/watch-Bd9mx3rd.js +1 -0
- package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +2 -2
- package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
- package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +5 -5
- package/dist/workflow-sdk/index.d.ts +5 -5
- package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
- package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
- package/package.json +22 -11
- package/schemas/cli-result-v1.json +1 -0
- package/schemas/cloud-api-v1.json +152 -7
- package/schemas/connector-v1.json +8 -0
- package/schemas/supabase-claims-v1.json +5 -0
- package/schemas/supabase-manifest-v1.json +276 -75
- package/skills/permdock/SKILL.md +1 -0
- package/skills/permdock-agents/references/runtimes.md +3 -1
- package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
- package/skills/permdock-data/references/queries-and-rls.md +5 -2
- package/skills/permdock-tenancy/SKILL.md +1 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
- package/skills/permdock-wire/references/adapters.md +14 -0
- package/skills/permdock-wire/references/policy-options.md +1 -0
- package/dist/catalog-DjhMYYCq.js +0 -1
- package/dist/collect-FlXJlhus.js +0 -1
- package/dist/index-D8EovfsP.d.ts +0 -91
- package/dist/load-BxEtwlBS.js +0 -1
- package/dist/output-files-B3IZJksC.js +0 -1
- package/dist/parse-Cxq0WxrA.js +0 -53
- package/dist/peer-C8swJ2GH.js +0 -50
- package/dist/powersync-CbzkqL_M.js +0 -1
- package/dist/powersync-bYUDLOAO.js +0 -538
- package/dist/prompt-DfZLJLIn.js +0 -32
- package/dist/pull-ByOks_Tg.js +0 -1
- package/dist/run-CNsApDpd.js +0 -1
- package/dist/supabase-hook-CXcGpHqq.js +0 -1
- package/dist/supautils-B6HYL9eL.js +0 -91
- package/dist/text-diff-BQcUapOb.js +0 -15
- package/dist/usage-CHOtwL19.js +0 -1
- package/dist/watch-Cb-NcaUw.js +0 -1
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { A as memoryCustomRoleSource } from "./src-DLFrtrrC.js";
|
|
2
|
+
import { c as listPermissions } from "./permission-registry-DpPtSKNZ.js";
|
|
3
|
+
import { f as scopeList } from "./scopes-BHsc-wp-.js";
|
|
4
|
+
import { y as membershipsClaim } from "./evaluate-B_oqFbWC.js";
|
|
5
|
+
import { n as parseSnapshot } from "./snapshot-CbGmYiJx.js";
|
|
6
|
+
import { n as fromSnapshot } from "./from-snapshot-Bz469dIh.js";
|
|
7
|
+
import { t as getPermDock } from "./permdock-BfWEeMqk.js";
|
|
8
|
+
import { c as quoteSqlTable, n as defaultSqlCommand, o as quoteSqlIdent, t as SQL_IDENT } from "./sql-B96movIM.js";
|
|
9
|
+
import "./budget-NbEtbJC_.js";
|
|
10
|
+
//#region src/testing/policy-matrix.ts
|
|
11
|
+
function isOutcomeCell(value) {
|
|
12
|
+
return value === "granted" || value === "denied" || value === "approval-required" || value !== null && typeof value === "object" && ("denials" in value || "outcome" in value || "alternatives" in value || "obligations" in value || "deniedBy" in value);
|
|
13
|
+
}
|
|
14
|
+
function expectedOutcome(cell) {
|
|
15
|
+
return typeof cell === "string" ? cell : cell.outcome ?? "denied";
|
|
16
|
+
}
|
|
17
|
+
function same(left, right) {
|
|
18
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
19
|
+
}
|
|
20
|
+
function list(values) {
|
|
21
|
+
return `[${values.join(", ")}]`;
|
|
22
|
+
}
|
|
23
|
+
function decisionFailures(decision, cell) {
|
|
24
|
+
const expected = expectedOutcome(cell);
|
|
25
|
+
if (decision.outcome !== expected) return [`expected ${expected}, got ${decision.outcome}`];
|
|
26
|
+
if (typeof cell !== "object") return [];
|
|
27
|
+
const failures = [];
|
|
28
|
+
if (cell.denials !== void 0 && decision.outcome === "denied") {
|
|
29
|
+
for (const denial of cell.denials) if (!decision.denials.some((item) => item.reason === denial.reason && (denial.role === void 0 || item.role === denial.role))) failures.push(`no denial ${denial.reason}${denial.role === void 0 ? "" : ` for role ${String(denial.role)}`}; got ${list(decision.denials.map((item) => `${item.reason}${item.role === null ? "" : `@${item.role}`}`))}`);
|
|
30
|
+
}
|
|
31
|
+
if (cell.alternatives !== void 0 && decision.outcome === "denied") {
|
|
32
|
+
const actual = decision.alternatives.map((leaf) => leaf.key);
|
|
33
|
+
if (!same(actual, cell.alternatives)) failures.push(`alternatives: expected ${list(cell.alternatives)}, got ${list(actual)}`);
|
|
34
|
+
}
|
|
35
|
+
if (cell.obligations !== void 0 && decision.outcome === "granted") {
|
|
36
|
+
const actual = (decision.obligations ?? []).map((item) => item.kind);
|
|
37
|
+
if (!same(actual, cell.obligations)) failures.push(`obligations: expected ${list(cell.obligations)}, got ${list(actual)}`);
|
|
38
|
+
}
|
|
39
|
+
return failures;
|
|
40
|
+
}
|
|
41
|
+
/** `deniedBy`, against the trace of a fresh `explain` call for the same arguments. */
|
|
42
|
+
function deniedByFailures(instance, permission, data, cell) {
|
|
43
|
+
if (typeof cell !== "object" || cell.deniedBy === void 0) return [];
|
|
44
|
+
const explained = instance.explain(permission, data);
|
|
45
|
+
const winner = explained.trace.denies[0]?.name;
|
|
46
|
+
if (explained.outcome !== "denied" || winner !== cell.deniedBy) return [`deniedBy: expected ${cell.deniedBy}, explain answered ${explained.outcome}${winner === void 0 ? "" : ` by ${winner}`}`];
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
function snapshotFailures(instance, permission, data, cell) {
|
|
50
|
+
const outcome = expectedOutcome(cell);
|
|
51
|
+
if (outcome === "approval-required") return [];
|
|
52
|
+
return fromSnapshot(JSON.parse(JSON.stringify(instance.snapshot()))).can(permission, data) === (outcome === "granted") ? [] : ["snapshot client disagrees with the server"];
|
|
53
|
+
}
|
|
54
|
+
/** The cells `config.matrix` names, in matrix order, before any decision. */
|
|
55
|
+
function pendingCells(policy, config) {
|
|
56
|
+
const cells = [];
|
|
57
|
+
for (const permission of listPermissions(policy.permissions)) {
|
|
58
|
+
const spec = config.matrix[permission.key];
|
|
59
|
+
if (spec === void 0) continue;
|
|
60
|
+
if (!Object.values(spec).some((value) => !isOutcomeCell(value))) {
|
|
61
|
+
const data = permission.kind === "instance" ? Object.values(config.fixtures ?? {})[0] : void 0;
|
|
62
|
+
for (const [subject, cell] of Object.entries(spec)) cells.push({
|
|
63
|
+
name: `${permission.key} / ${subject}`,
|
|
64
|
+
permission,
|
|
65
|
+
subject,
|
|
66
|
+
data,
|
|
67
|
+
expected: cell
|
|
68
|
+
});
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
for (const [fixture, row] of Object.entries(spec)) {
|
|
72
|
+
if (isOutcomeCell(row)) continue;
|
|
73
|
+
for (const [subject, cell] of Object.entries(row)) cells.push({
|
|
74
|
+
name: `${permission.key} / ${fixture} / ${subject}`,
|
|
75
|
+
permission,
|
|
76
|
+
subject,
|
|
77
|
+
fixture,
|
|
78
|
+
data: config.fixtures?.[fixture],
|
|
79
|
+
expected: cell
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return cells;
|
|
84
|
+
}
|
|
85
|
+
/** Where each cell sits, without deciding it: a test runner registers one test per cell. */
|
|
86
|
+
function policyMatrixLayout(policy, config) {
|
|
87
|
+
return pendingCells(policy, config).map((cell) => cell.fixture === void 0 ? {
|
|
88
|
+
name: cell.name,
|
|
89
|
+
permission: cell.permission.key,
|
|
90
|
+
subject: cell.subject
|
|
91
|
+
} : {
|
|
92
|
+
name: cell.name,
|
|
93
|
+
permission: cell.permission.key,
|
|
94
|
+
subject: cell.subject,
|
|
95
|
+
fixture: cell.fixture
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Decides every cell of a policy matrix with no test runner: each cell lists
|
|
100
|
+
* its `failures`, and `missing` names the permissions an exhaustive matrix
|
|
101
|
+
* leaves out. `describePolicy` asserts the same report under Vitest.
|
|
102
|
+
*/
|
|
103
|
+
async function policyMatrix(policy, config) {
|
|
104
|
+
const instances = /* @__PURE__ */ new Map();
|
|
105
|
+
for (const [name, user] of Object.entries(config.subjects)) instances.set(name, await getPermDock(policy, user, config.options));
|
|
106
|
+
const cells = [];
|
|
107
|
+
for (const pending of pendingCells(policy, config)) {
|
|
108
|
+
const instance = instances.get(pending.subject) ?? await getPermDock(policy, config.subjects[pending.subject], config.options);
|
|
109
|
+
const decision = instance.decide(pending.permission, pending.data);
|
|
110
|
+
const failures = [
|
|
111
|
+
...decisionFailures(decision, pending.expected),
|
|
112
|
+
...deniedByFailures(instance, pending.permission, pending.data, pending.expected),
|
|
113
|
+
...config.snapshot === true ? snapshotFailures(instance, pending.permission, pending.data, pending.expected) : []
|
|
114
|
+
];
|
|
115
|
+
cells.push({
|
|
116
|
+
name: pending.name,
|
|
117
|
+
permission: pending.permission.key,
|
|
118
|
+
subject: pending.subject,
|
|
119
|
+
...pending.fixture === void 0 ? {} : { fixture: pending.fixture },
|
|
120
|
+
expected: pending.expected,
|
|
121
|
+
actual: decision.outcome,
|
|
122
|
+
decision,
|
|
123
|
+
failures
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
cells,
|
|
128
|
+
missing: config.exhaustive === false ? [] : listPermissions(policy.permissions).map((permission) => permission.key).filter((key) => config.matrix[key] === void 0)
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//#endregion
|
|
132
|
+
//#region src/testing/rls-parity.ts
|
|
133
|
+
function toSubject(input) {
|
|
134
|
+
return {
|
|
135
|
+
principal: {
|
|
136
|
+
id: input.id,
|
|
137
|
+
roles: input.roles ?? [],
|
|
138
|
+
...input.tenant === void 0 ? {} : { tenant: input.tenant },
|
|
139
|
+
memberships: input.memberships ?? [],
|
|
140
|
+
...input.claims === void 0 ? {} : { claims: input.claims }
|
|
141
|
+
},
|
|
142
|
+
context: {}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function rowId(row) {
|
|
146
|
+
return row["id"];
|
|
147
|
+
}
|
|
148
|
+
function setting(name, value) {
|
|
149
|
+
return {
|
|
150
|
+
sql: "select set_config($1, $2, true)",
|
|
151
|
+
values: [name, value]
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The session state the generated helpers read: JWT claims for `supabase`,
|
|
156
|
+
* GUCs for `guc` (roles as a comma list, memberships as JSON).
|
|
157
|
+
*/
|
|
158
|
+
function subjectSettings(dialect, subject, gucPrefix, tenantClaim, roleClaim, customRoles, scopes) {
|
|
159
|
+
const roles = subject.roles ?? [];
|
|
160
|
+
const memberships = membershipsClaim(subject.memberships ?? [], customRoles, scopes);
|
|
161
|
+
if (dialect === "supabase" || dialect === "neon") {
|
|
162
|
+
const claims = {
|
|
163
|
+
...subject.claims,
|
|
164
|
+
sub: subject.id,
|
|
165
|
+
role: "authenticated",
|
|
166
|
+
[roleClaim]: roles.length === 1 ? roles[0] : roles,
|
|
167
|
+
[tenantClaim]: subject.tenant,
|
|
168
|
+
memberships
|
|
169
|
+
};
|
|
170
|
+
return [setting("request.jwt.claims", JSON.stringify(claims))];
|
|
171
|
+
}
|
|
172
|
+
const settings = [
|
|
173
|
+
...Object.entries(subject.claims ?? {}).map(([name, value]) => {
|
|
174
|
+
if (!SQL_IDENT.test(name)) throw new Error(`PermDock: unsafe claim name '${name}'`);
|
|
175
|
+
return setting(`${gucPrefix}.${name}`, typeof value === "string" ? value : JSON.stringify(value));
|
|
176
|
+
}),
|
|
177
|
+
setting(`${gucPrefix}.user_id`, subject.id),
|
|
178
|
+
setting(`${gucPrefix}.${roleClaim}`, roles.join(",")),
|
|
179
|
+
setting(`${gucPrefix}.memberships`, JSON.stringify(memberships))
|
|
180
|
+
];
|
|
181
|
+
return subject.tenant === void 0 ? settings : [...settings, setting(`${gucPrefix}.${tenantClaim}`, subject.tenant)];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The statement a case runs. With field views it reads back only the key, so
|
|
185
|
+
* a base table whose restricted columns are revoked does not reject it.
|
|
186
|
+
*/
|
|
187
|
+
function statementSql(action, table, keyOnly) {
|
|
188
|
+
const quoted = quoteSqlTable(table);
|
|
189
|
+
const id = quoteSqlIdent("id");
|
|
190
|
+
const back = keyOnly ? id : "*";
|
|
191
|
+
const command = defaultSqlCommand(action) ?? "select";
|
|
192
|
+
switch (command) {
|
|
193
|
+
case "select": return `select ${back} from ${quoted} where ${id} = $1`;
|
|
194
|
+
case "update": return `update ${quoted} set ${id} = ${id} where ${id} = $1 returning ${back}`;
|
|
195
|
+
case "insert": return `insert into ${quoted} (${id}) values ($1) returning ${back}`;
|
|
196
|
+
case "delete": return `delete from ${quoted} where ${id} = $1 returning ${back}`;
|
|
197
|
+
default: return command;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function valued(row) {
|
|
201
|
+
if (row === null || typeof row !== "object") return [];
|
|
202
|
+
const record = row;
|
|
203
|
+
return Object.keys(record).filter((name) => record[name] !== null && record[name] !== void 0).toSorted();
|
|
204
|
+
}
|
|
205
|
+
function isRead(action) {
|
|
206
|
+
return action === "read" || action === "get" || action === "list";
|
|
207
|
+
}
|
|
208
|
+
async function viewColumns(query, table, key) {
|
|
209
|
+
const id = quoteSqlIdent("id");
|
|
210
|
+
await query("savepoint permdock_fields");
|
|
211
|
+
const view = await query(`select * from ${quoteSqlTable(`${table}_visible`)} where ${id} = $1`, [key]);
|
|
212
|
+
if (view.code === void 0) return valued(view.rows[0]);
|
|
213
|
+
await query("rollback to savepoint permdock_fields");
|
|
214
|
+
if (view.code !== "42P01") return view.code;
|
|
215
|
+
const base = await query(`select * from ${quoteSqlTable(table)} where ${id} = $1`, [key]);
|
|
216
|
+
return base.code ?? valued(base.rows[0]);
|
|
217
|
+
}
|
|
218
|
+
function dbOutcome(result) {
|
|
219
|
+
if (result.code === "42501") return "rejected";
|
|
220
|
+
return (result.rowCount ?? result.rows.length) > 0 ? "allowed" : "filtered";
|
|
221
|
+
}
|
|
222
|
+
async function testRlsParity(policy, options) {
|
|
223
|
+
const dialect = options.dialect ?? "guc";
|
|
224
|
+
const gucPrefix = options.gucPrefix ?? "app";
|
|
225
|
+
const tenantClaim = options.tenantClaim ?? "tenant_id";
|
|
226
|
+
const roleClaim = options.roleClaim ?? "user_role";
|
|
227
|
+
const role = options.role ?? "authenticated";
|
|
228
|
+
const customRoles = options.customRoles ?? [];
|
|
229
|
+
const scopes = scopeList(policy.scopes);
|
|
230
|
+
async function runCase(fixture) {
|
|
231
|
+
const permdock = await getPermDock(policy, toSubject(fixture.subject), { customRoles: memoryCustomRoleSource(customRoles) });
|
|
232
|
+
const granted = fixture.permission.kind === "collection" ? permdock.can(fixture.permission, fixture.row) : permdock.can(fixture.permission, fixture.row);
|
|
233
|
+
let fromClient;
|
|
234
|
+
if (options.snapshot === true) {
|
|
235
|
+
const snapshot = permdock.snapshot();
|
|
236
|
+
if (typeof snapshot !== "object" || snapshot instanceof Promise) throw new TypeError("PermDock: testRlsParity needs an unsigned snapshot");
|
|
237
|
+
fromClient = fromSnapshot(parseSnapshot(JSON.stringify(snapshot))).can(fixture.permission, fixture.row);
|
|
238
|
+
}
|
|
239
|
+
await options.query("begin");
|
|
240
|
+
try {
|
|
241
|
+
await options.query(`set local role ${quoteSqlIdent(role === "anon" && dialect === "neon" ? "anonymous" : role)}`);
|
|
242
|
+
for (const item of subjectSettings(dialect, fixture.subject, gucPrefix, tenantClaim, roleClaim, customRoles, scopes)) await options.query(item.sql, item.values);
|
|
243
|
+
const database = dbOutcome(await options.query(statementSql(fixture.permission.action, fixture.table, options.fieldViews === true), [rowId(fixture.row)]));
|
|
244
|
+
const agrees = granted ? database === "allowed" : database === "filtered" || database === "rejected";
|
|
245
|
+
let fields;
|
|
246
|
+
if (options.fieldViews === true && fixture.permission.kind === "instance" && isRead(fixture.permission.action)) {
|
|
247
|
+
const key = policy.resources.get(fixture.permission.resource)?.id ?? "id";
|
|
248
|
+
const kept = new Set(granted ? valued(permdock.pick(fixture.permission, fixture.row)) : []);
|
|
249
|
+
if (granted && fixture.row[key] !== null && fixture.row[key] !== void 0) kept.add(key);
|
|
250
|
+
fields = {
|
|
251
|
+
app: [...kept].toSorted(),
|
|
252
|
+
database: await viewColumns(options.query, fixture.table, rowId(fixture.row))
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const fieldsOk = fields === void 0 || typeof fields.database !== "string" && fields.database.join("\0") === fields.app.join("\0");
|
|
256
|
+
const ok = agrees && fieldsOk && (fromClient === void 0 || fromClient === granted);
|
|
257
|
+
return {
|
|
258
|
+
name: fixture.name,
|
|
259
|
+
granted,
|
|
260
|
+
database,
|
|
261
|
+
...fromClient === void 0 ? {} : { snapshot: fromClient },
|
|
262
|
+
...fields === void 0 ? {} : { fields },
|
|
263
|
+
ok
|
|
264
|
+
};
|
|
265
|
+
} finally {
|
|
266
|
+
await options.query("rollback");
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function runAll(remaining, acc) {
|
|
270
|
+
const [head, ...tail] = remaining;
|
|
271
|
+
if (head === void 0) return acc;
|
|
272
|
+
return runAll(tail, [...acc, await runCase(head)]);
|
|
273
|
+
}
|
|
274
|
+
const results = await runAll(options.fixtures, []);
|
|
275
|
+
return {
|
|
276
|
+
ok: results.every((item) => item.ok),
|
|
277
|
+
results
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//#endregion
|
|
281
|
+
//#region src/testing/orm-parity.ts
|
|
282
|
+
function sortedIds(values) {
|
|
283
|
+
return values.map(String).toSorted();
|
|
284
|
+
}
|
|
285
|
+
function subsetOf(small, large) {
|
|
286
|
+
return small.every((value) => large.includes(value));
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
|
|
290
|
+
* must be exactly the rows the database returns for `toWhere(permdock.where())`.
|
|
291
|
+
* With a `relations` option, the graph is loaded for the rows first, so the
|
|
292
|
+
* in-memory side walks the same graph the database query does.
|
|
293
|
+
* A partial `where()` (a closure grant it cannot compile) may be refused or
|
|
294
|
+
* return fewer rows, never more.
|
|
295
|
+
*/
|
|
296
|
+
async function testOrmParity(policy, scenarios, options) {
|
|
297
|
+
const idField = options.id ?? "id";
|
|
298
|
+
async function runCase(scenario) {
|
|
299
|
+
const permdock = await getPermDock(policy, scenario.user, scenario.options);
|
|
300
|
+
if (scenario.options?.relations !== void 0) await permdock.prefetchRelations(scenario.permission, scenario.rows);
|
|
301
|
+
const expected = sortedIds(permdock.filter(scenario.permission, scenario.rows).map((row) => row[idField]));
|
|
302
|
+
const where = permdock.where(scenario.permission);
|
|
303
|
+
try {
|
|
304
|
+
const actual = sortedIds(await options.run({
|
|
305
|
+
scenario,
|
|
306
|
+
where
|
|
307
|
+
}));
|
|
308
|
+
const ok = where.partial ? subsetOf(actual, expected) : actual.length === expected.length && subsetOf(actual, expected);
|
|
309
|
+
return {
|
|
310
|
+
name: scenario.name,
|
|
311
|
+
expected,
|
|
312
|
+
actual,
|
|
313
|
+
partial: where.partial,
|
|
314
|
+
ok
|
|
315
|
+
};
|
|
316
|
+
} catch (error) {
|
|
317
|
+
return {
|
|
318
|
+
name: scenario.name,
|
|
319
|
+
expected,
|
|
320
|
+
actual: [],
|
|
321
|
+
partial: where.partial,
|
|
322
|
+
error: error instanceof Error ? error.message : String(error),
|
|
323
|
+
ok: where.partial
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const results = [];
|
|
328
|
+
for (const scenario of scenarios) results.push(await runCase(scenario));
|
|
329
|
+
return {
|
|
330
|
+
ok: results.every((item) => item.ok),
|
|
331
|
+
results
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//#endregion
|
|
335
|
+
export { policyMatrixLayout as i, testRlsParity as n, policyMatrix as r, testOrmParity as t };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Ln as Decision, T as Policy, or as Membership, tr as CustomRole } from "./policy-types-B-F-qAZk.js";
|
|
2
|
+
import { u as Permission } from "./permission-types-DhNEmoRG.js";
|
|
3
|
+
import { o as PermDockOptions, u as WhereResult } from "./permdock-Dco6dyCK.js";
|
|
4
|
+
//#region src/testing/policy-matrix.d.ts
|
|
5
|
+
type MatrixOutcome = "granted" | "denied" | "approval-required";
|
|
6
|
+
type MatrixCell = MatrixOutcome | {
|
|
7
|
+
readonly outcome?: MatrixOutcome;
|
|
8
|
+
readonly denials?: readonly {
|
|
9
|
+
readonly role?: string | null;
|
|
10
|
+
readonly reason: string;
|
|
11
|
+
}[];
|
|
12
|
+
readonly alternatives?: readonly string[];
|
|
13
|
+
/** Obligation kinds a granted decision carries, in order; `[]` asserts none. */
|
|
14
|
+
readonly obligations?: readonly string[];
|
|
15
|
+
/** The `name` of the deny grant `explain` reports as the one that won. */
|
|
16
|
+
readonly deniedBy?: string;
|
|
17
|
+
};
|
|
18
|
+
type DescribePolicyConfig<TSubject> = {
|
|
19
|
+
readonly subjects: Record<string, TSubject>;
|
|
20
|
+
readonly fixtures?: Record<string, unknown>;
|
|
21
|
+
readonly matrix: Record<string, Record<string, MatrixCell | Record<string, MatrixCell>>>;
|
|
22
|
+
readonly exhaustive?: boolean;
|
|
23
|
+
readonly options?: PermDockOptions;
|
|
24
|
+
/**
|
|
25
|
+
* Also assert every granted or denied cell against `fromSnapshot(permdock.snapshot())`,
|
|
26
|
+
* the client a Server Component hands down. Closures cannot cross a snapshot and deny on the client.
|
|
27
|
+
*/
|
|
28
|
+
readonly snapshot?: boolean;
|
|
29
|
+
};
|
|
30
|
+
/** One cell of the matrix, decided. */
|
|
31
|
+
type PolicyMatrixCell = {
|
|
32
|
+
/** `<permission> / <subject>`, or `<permission> / <fixture> / <subject>` for a nested row. */
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly permission: string;
|
|
35
|
+
readonly subject: string;
|
|
36
|
+
readonly fixture?: string;
|
|
37
|
+
readonly expected: MatrixCell;
|
|
38
|
+
readonly actual: MatrixOutcome;
|
|
39
|
+
readonly decision: Decision;
|
|
40
|
+
/** Each way the decision differs from `expected`; empty when the cell holds. */
|
|
41
|
+
readonly failures: readonly string[];
|
|
42
|
+
};
|
|
43
|
+
type PolicyMatrixReport = {
|
|
44
|
+
readonly cells: readonly PolicyMatrixCell[];
|
|
45
|
+
/** Permission keys the matrix has no row for; empty with `exhaustive: false`. */
|
|
46
|
+
readonly missing: readonly string[];
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Decides every cell of a policy matrix with no test runner: each cell lists
|
|
50
|
+
* its `failures`, and `missing` names the permissions an exhaustive matrix
|
|
51
|
+
* leaves out. `describePolicy` asserts the same report under Vitest.
|
|
52
|
+
*/
|
|
53
|
+
declare function policyMatrix<TSubject>(policy: Policy, config: DescribePolicyConfig<TSubject>): Promise<PolicyMatrixReport>;
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/testing/rls-parity.d.ts
|
|
56
|
+
type RlsDbOutcome = "allowed" | "filtered" | "rejected";
|
|
57
|
+
type RlsParitySubject = {
|
|
58
|
+
readonly id: string;
|
|
59
|
+
readonly roles?: readonly string[];
|
|
60
|
+
readonly tenant?: string;
|
|
61
|
+
readonly memberships?: readonly Membership[];
|
|
62
|
+
/**
|
|
63
|
+
* Extra token claims, read in memory as `principal.claims.*`. They join the
|
|
64
|
+
* JWT claims (`supabase`, `neon`); under `guc` each top-level claim is its
|
|
65
|
+
* own `<prefix>.<name>` setting, strings as is and anything else as JSON.
|
|
66
|
+
*/
|
|
67
|
+
readonly claims?: Readonly<Record<string, unknown>>;
|
|
68
|
+
};
|
|
69
|
+
type RlsParityFixture = {
|
|
70
|
+
readonly name: string;
|
|
71
|
+
readonly subject: RlsParitySubject;
|
|
72
|
+
readonly permission: Permission;
|
|
73
|
+
readonly row: Readonly<Record<string, unknown>>;
|
|
74
|
+
readonly table: string;
|
|
75
|
+
};
|
|
76
|
+
type RlsQueryResult = {
|
|
77
|
+
readonly rows: readonly Record<string, unknown>[];
|
|
78
|
+
readonly rowCount?: number;
|
|
79
|
+
readonly code?: string;
|
|
80
|
+
};
|
|
81
|
+
type RlsQueryFn = (sql: string, values?: readonly unknown[]) => Promise<RlsQueryResult>;
|
|
82
|
+
type RlsParityOptions = {
|
|
83
|
+
readonly query: RlsQueryFn;
|
|
84
|
+
readonly fixtures: readonly RlsParityFixture[];
|
|
85
|
+
/**
|
|
86
|
+
* `supabase` and `neon` set `request.jwt.claims`; a test database stubs
|
|
87
|
+
* `auth.jwt()` / `auth.uid()` or `auth.session()` / `auth.user_id()` over it.
|
|
88
|
+
*/
|
|
89
|
+
readonly dialect?: "supabase" | "neon" | "guc";
|
|
90
|
+
readonly gucPrefix?: string;
|
|
91
|
+
readonly tenantClaim?: string;
|
|
92
|
+
/** Claim (or `guc` setting) the RLS helpers read global roles from. Default `user_role`. */
|
|
93
|
+
readonly roleClaim?: string;
|
|
94
|
+
readonly role?: "authenticated" | "anon";
|
|
95
|
+
/**
|
|
96
|
+
* Tenant-defined roles the subjects' memberships may hold. `decide` resolves them through a
|
|
97
|
+
* `CustomRoleSource`; each membership's claim carries them as the compact `grants` map, which the
|
|
98
|
+
* helpers read in `jwt` mode. Seeding the `database`-mode tables is the caller's job.
|
|
99
|
+
*/
|
|
100
|
+
readonly customRoles?: readonly CustomRole[];
|
|
101
|
+
/** Also decide each case from the subject's serialized snapshot (`fromSnapshot`); it must agree. */
|
|
102
|
+
readonly snapshot?: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* With `rls generate --fields views`: for each instance read, the row of
|
|
105
|
+
* `<table>_visible` must hold exactly the columns `pick` keeps (plus the key,
|
|
106
|
+
* which always passes through). A table with no view is read directly.
|
|
107
|
+
*/
|
|
108
|
+
readonly fieldViews?: boolean;
|
|
109
|
+
};
|
|
110
|
+
/** Columns with a value in the view's row and in `pick`'s result, sorted. */
|
|
111
|
+
type RlsFieldsOutcome = {
|
|
112
|
+
readonly app: readonly string[];
|
|
113
|
+
readonly database: readonly string[] | string;
|
|
114
|
+
};
|
|
115
|
+
type RlsParityCase = {
|
|
116
|
+
readonly name: string;
|
|
117
|
+
readonly granted: boolean;
|
|
118
|
+
readonly database: RlsDbOutcome;
|
|
119
|
+
/** The snapshot's decision, with `snapshot: true`. */
|
|
120
|
+
readonly snapshot?: boolean;
|
|
121
|
+
/** The field view check, with `fieldViews: true`; `database` is an error code when the read failed. */
|
|
122
|
+
readonly fields?: RlsFieldsOutcome;
|
|
123
|
+
readonly ok: boolean;
|
|
124
|
+
};
|
|
125
|
+
type RlsParityReport = {
|
|
126
|
+
readonly ok: boolean;
|
|
127
|
+
readonly results: readonly RlsParityCase[];
|
|
128
|
+
};
|
|
129
|
+
declare function testRlsParity<TUser>(policy: Policy<TUser>, options: RlsParityOptions): Promise<RlsParityReport>;
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/testing/orm-parity.d.ts
|
|
132
|
+
type OrmParityScenario<TUser = unknown> = {
|
|
133
|
+
readonly name: string;
|
|
134
|
+
/** What the policy's `subject` mapper receives, as in `createPermDock(policy, user)`. */
|
|
135
|
+
readonly user: TUser;
|
|
136
|
+
/** The active tenant and role sources, as in `createPermDock(policy, user, options)`. */
|
|
137
|
+
readonly options?: PermDockOptions;
|
|
138
|
+
/** An instance permission; its `where()` filters the table. */
|
|
139
|
+
readonly permission: Permission<string, unknown, "instance">;
|
|
140
|
+
/** Every row of the table, exactly as the database holds them. */
|
|
141
|
+
readonly rows: readonly Readonly<Record<string, unknown>>[];
|
|
142
|
+
};
|
|
143
|
+
type OrmParityRunInput<TUser = unknown> = {
|
|
144
|
+
readonly scenario: OrmParityScenario<TUser>;
|
|
145
|
+
readonly where: WhereResult;
|
|
146
|
+
};
|
|
147
|
+
type OrmParityOptions<TUser = unknown> = {
|
|
148
|
+
/** Runs `toWhere(where)` against the database and returns the matching row ids. */
|
|
149
|
+
readonly run: (input: OrmParityRunInput<TUser>) => Promise<readonly unknown[]>;
|
|
150
|
+
/** The row id field; default `id`. */
|
|
151
|
+
readonly id?: string;
|
|
152
|
+
};
|
|
153
|
+
type OrmParityCase = {
|
|
154
|
+
readonly name: string;
|
|
155
|
+
readonly expected: readonly string[];
|
|
156
|
+
readonly actual: readonly string[];
|
|
157
|
+
/**
|
|
158
|
+
* `where()` left out a non-portable grant. `toWhere` refusing it is
|
|
159
|
+
* fail-closed and passes; rows it does return must be a subset.
|
|
160
|
+
*/
|
|
161
|
+
readonly partial: boolean;
|
|
162
|
+
readonly error?: string;
|
|
163
|
+
readonly ok: boolean;
|
|
164
|
+
};
|
|
165
|
+
type OrmParityReport = {
|
|
166
|
+
readonly ok: boolean;
|
|
167
|
+
readonly results: readonly OrmParityCase[];
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
|
|
171
|
+
* must be exactly the rows the database returns for `toWhere(permdock.where())`.
|
|
172
|
+
* With a `relations` option, the graph is loaded for the rows first, so the
|
|
173
|
+
* in-memory side walks the same graph the database query does.
|
|
174
|
+
* A partial `where()` (a closure grant it cannot compile) may be refused or
|
|
175
|
+
* return fewer rows, never more.
|
|
176
|
+
*/
|
|
177
|
+
declare function testOrmParity<TUser>(policy: Policy<TUser>, scenarios: readonly OrmParityScenario<TUser>[], options: OrmParityOptions<TUser>): Promise<OrmParityReport>;
|
|
178
|
+
//#endregion
|
|
179
|
+
export { policyMatrix as S, DescribePolicyConfig as _, OrmParityScenario as a, PolicyMatrixCell as b, RlsFieldsOutcome as c, RlsParityOptions as d, RlsParityReport as f, testRlsParity as g, RlsQueryResult as h, OrmParityRunInput as i, RlsParityCase as l, RlsQueryFn as m, OrmParityOptions as n, testOrmParity as o, RlsParitySubject as p, OrmParityReport as r, RlsDbOutcome as s, OrmParityCase as t, RlsParityFixture as u, MatrixCell as v, PolicyMatrixReport as x, MatrixOutcome as y };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as Operation } from "./operations-
|
|
3
|
-
import {
|
|
4
|
-
import { m as ApprovalStore, p as ApprovalStatus } from "./types-
|
|
1
|
+
import { In as ApprovalRequiredDecision, T as Policy, Un as GrantedDecision, Vn as DeniedDecision, j as PolicyVocabulary, lr as Subject, sr as Principal } from "./policy-types-B-F-qAZk.js";
|
|
2
|
+
import { t as Operation } from "./operations-BNLes61x.js";
|
|
3
|
+
import { a as PermDock, h as PrincipalSource, o as PermDockOptions } from "./permdock-Dco6dyCK.js";
|
|
4
|
+
import { m as ApprovalStore, p as ApprovalStatus } from "./types-DC44-hqb.js";
|
|
5
5
|
import { n as ApprovalErrorCode } from "./errors-BWXBMaKK.js";
|
|
6
|
-
import { t as ApprovalPrompt } from "./approval-prompt-
|
|
6
|
+
import { t as ApprovalPrompt } from "./approval-prompt-K0faOLFp.js";
|
|
7
7
|
//#region src/chat/subject.d.ts
|
|
8
8
|
/**
|
|
9
9
|
* The platform user behind a chat message or action. Fill it only from an
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { t as composeWraps } from "./wrap-
|
|
6
|
-
import { r as instanceOptions } from "./build-instance-
|
|
7
|
-
import { n as createAgentKernel } from "./kernel-
|
|
3
|
+
import { o as deniedFor } from "./where-scope-wq2coopv.js";
|
|
4
|
+
import { l as withApp } from "./permdock-BfWEeMqk.js";
|
|
5
|
+
import { t as composeWraps } from "./wrap-CiSc_KCq.js";
|
|
6
|
+
import { r as instanceOptions } from "./build-instance-DxE7czo9.js";
|
|
7
|
+
import { n as createAgentKernel } from "./kernel-DVExUwkp.js";
|
|
8
8
|
//#region src/agent/create.ts
|
|
9
9
|
function modelRow(modelId) {
|
|
10
10
|
return { id: modelId };
|
|
@@ -34,8 +34,8 @@ function decideModelOn(permdock, models, modelId, adapter) {
|
|
|
34
34
|
return deniedFor(permission, "closure-error");
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
/** Builds the agent contract and its kernel for an adapter named `adapter
|
|
38
|
-
function agentRuntime(policy, options, adapter) {
|
|
37
|
+
/** Builds the agent contract and its kernel for an adapter named `adapter`; `runtime.stepUp` sets `stepUp` on denied verdicts. */
|
|
38
|
+
function agentRuntime(policy, options, adapter, runtime = {}) {
|
|
39
39
|
const kernel = createAgentKernel(policy, {
|
|
40
40
|
...compact({
|
|
41
41
|
actor: options.actor,
|
|
@@ -44,7 +44,8 @@ function agentRuntime(policy, options, adapter) {
|
|
|
44
44
|
store: options.store,
|
|
45
45
|
context: options.context,
|
|
46
46
|
wrap: composeWraps(options.otel, options.wrap),
|
|
47
|
-
deniedText: options.deniedText
|
|
47
|
+
deniedText: options.deniedText,
|
|
48
|
+
stepUp: runtime.stepUp
|
|
48
49
|
}),
|
|
49
50
|
...instanceOptions(options),
|
|
50
51
|
subject: options.subject,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
3
|
import { n as problemDetails } from "./problem-details-cn5X30gZ.js";
|
|
4
|
-
import { c as listPermissions } from "./permission-registry-
|
|
4
|
+
import { c as listPermissions } from "./permission-registry-DpPtSKNZ.js";
|
|
5
5
|
import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
|
|
6
|
-
import {
|
|
6
|
+
import { i as challengeScope, l as withApp } from "./permdock-BfWEeMqk.js";
|
|
7
7
|
import { r as hasCredentials } from "./http-BBoKefeS.js";
|
|
8
8
|
import { i as decisionResponse, o as notFoundProblem, s as problemFromDecision, t as ANONYMOUS, u as unauthenticatedProblem } from "./problem-CTviyH5L.js";
|
|
9
|
-
import { n as resolveOrNull } from "./build-instance-
|
|
10
|
-
import {
|
|
9
|
+
import { n as resolveOrNull } from "./build-instance-DxE7czo9.js";
|
|
10
|
+
import { l as InvalidSignatureError, n as applyApprovalResume, o as evaluationsHandler } from "./evaluations-DReoiVBw.js";
|
|
11
11
|
import { n as tenantScope, t as actorFrom } from "./adapter-context-CRhqyzCk.js";
|
|
12
|
-
import { n as requestContext, t as buildReportingInstance } from "./request-context-
|
|
12
|
+
import { n as requestContext, t as buildReportingInstance } from "./request-context-BykKLmyE.js";
|
|
13
13
|
//#region src/server/kernel-problems.ts
|
|
14
14
|
const NOT_DELEGATED = freezeDeep({
|
|
15
15
|
outcome: "denied",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { m as ApprovalStore } from "./types-
|
|
5
|
-
import { a as AutomationSource } from "./automation-
|
|
6
|
-
import { n as ApprovalWaiter } from "./waiter-
|
|
7
|
-
import {
|
|
1
|
+
import { Ln as Decision, Rn as Denial, Rt as Instant, T as Policy, Zt as AuthEvent, dt as TokenVerifier, j as PolicyVocabulary, sr as Principal, ut as TokenSigner } from "./policy-types-B-F-qAZk.js";
|
|
2
|
+
import { u as Permission } from "./permission-types-DhNEmoRG.js";
|
|
3
|
+
import { a as PermDock, h as PrincipalSource, n as DecideOptions, o as PermDockOptions } from "./permdock-Dco6dyCK.js";
|
|
4
|
+
import { m as ApprovalStore } from "./types-DC44-hqb.js";
|
|
5
|
+
import { a as AutomationSource } from "./automation-DOtAFWdy.js";
|
|
6
|
+
import { n as ApprovalWaiter } from "./waiter-DwEyouan.js";
|
|
7
|
+
import { i as RunBinding, r as RunAutomation } from "./run-ticket-BpNi7BCi.js";
|
|
8
8
|
//#region src/workflow/create.d.ts
|
|
9
9
|
type WorkflowPermDockOptions = PermDockOptions & {
|
|
10
10
|
/** Signs the run tickets `start` mints. */
|
|
@@ -1,13 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { t as Operation } from "./operations-
|
|
4
|
-
import {
|
|
5
|
-
import { m as ApprovalStore } from "./types-
|
|
6
|
-
import { t as InstanceOptions } from "./instance-options-
|
|
1
|
+
import { Ln as Decision, T as Policy, j as PolicyVocabulary, lr as Subject, rr as Delegation, sr as Principal } from "./policy-types-B-F-qAZk.js";
|
|
2
|
+
import { u as Permission } from "./permission-types-DhNEmoRG.js";
|
|
3
|
+
import { t as Operation } from "./operations-BNLes61x.js";
|
|
4
|
+
import { a as PermDock } from "./permdock-Dco6dyCK.js";
|
|
5
|
+
import { m as ApprovalStore } from "./types-DC44-hqb.js";
|
|
6
|
+
import { t as InstanceOptions } from "./instance-options-CU0YQCLH.js";
|
|
7
7
|
import { t as RequestContext } from "./request-context-C2_1lchh.js";
|
|
8
|
-
import { n as PermDockWrap } from "./wrap-
|
|
9
|
-
import { o as OtelWrap } from "./types-
|
|
10
|
-
import { t as DeniedText } from "./denied-text-
|
|
8
|
+
import { n as PermDockWrap } from "./wrap-B6R0cMRL.js";
|
|
9
|
+
import { o as OtelWrap } from "./types-CIeZcG8v.js";
|
|
10
|
+
import { t as DeniedText } from "./denied-text-D4qkEtFz.js";
|
|
11
|
+
//#region src/agent/step-up.d.ts
|
|
12
|
+
/**
|
|
13
|
+
* What the user can do to lift a denial: authenticate again with the `acr`
|
|
14
|
+
* and `maxAge` the failing grants ask for, or activate a role they are
|
|
15
|
+
* eligible for. A hint for the user; the call is decided again afterwards.
|
|
16
|
+
*/
|
|
17
|
+
type StepUp = {
|
|
18
|
+
readonly kind: "authentication";
|
|
19
|
+
readonly acrValues?: readonly string[];
|
|
20
|
+
readonly maxAge?: number;
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: "activation";
|
|
23
|
+
readonly role: string;
|
|
24
|
+
readonly scope: string;
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly within?: Readonly<Record<string, string>>;
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
11
29
|
//#region src/agent/types.d.ts
|
|
12
30
|
/** The part of an operation a tool decision reads; an `OperationMap` entry is one. */
|
|
13
31
|
type ToolBinding = Pick<Operation, "permission" | "data" | "results"> & Partial<Pick<Operation, "name" | "meta">>;
|
|
@@ -64,6 +82,8 @@ type ToolVerdict = {
|
|
|
64
82
|
}> | null;
|
|
65
83
|
readonly permission: Permission | undefined;
|
|
66
84
|
readonly reason: string;
|
|
85
|
+
/** What the user can do to lift the denial; set only by an adapter with step-ups on (`permdock/ai-sdk` `stepUp`). */
|
|
86
|
+
readonly stepUp?: StepUp;
|
|
67
87
|
} | {
|
|
68
88
|
readonly outcome: "approval-required";
|
|
69
89
|
readonly decision: Extract<Decision, {
|
|
@@ -135,4 +155,4 @@ type AgentPermDock<TContext, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
|
135
155
|
*/
|
|
136
156
|
declare function createPermDock<TContext, TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, given: AgentPermDockOptions<TContext, TUser>): AgentPermDock<TContext, V>;
|
|
137
157
|
//#endregion
|
|
138
|
-
export { createPermDock as a, ModelMap as c, OperationVerdict as i, ToolBinding as l, AgentPermDockOptions as n, AgentAdapterOptions as o, GatewayOptions as r, DecideToolOptions as s, AgentPermDock as t, ToolMap as u };
|
|
158
|
+
export { createPermDock as a, ModelMap as c, StepUp as d, OperationVerdict as i, ToolBinding as l, AgentPermDockOptions as n, AgentAdapterOptions as o, GatewayOptions as r, DecideToolOptions as s, AgentPermDock as t, ToolMap as u };
|