permdock 0.1.0 → 0.3.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 +106 -47
- package/dist/a2a/index.d.ts +7 -16
- package/dist/a2a/index.js +59 -98
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +37 -16
- package/dist/ai-sdk/index.js +30 -13
- package/dist/approvals/index.d.ts +3 -3
- package/dist/approvals/index.js +5 -4
- package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
- package/dist/{arazzo-aoTkqYsJ.js → arazzo-CKwwqFWz.js} +2 -2
- package/dist/authzen/index.d.ts +4 -13
- package/dist/authzen/index.js +16 -50
- package/dist/better-auth/index.d.ts +20 -3
- package/dist/better-auth/index.js +27 -7
- package/dist/better-supabase/index.d.ts +223 -0
- package/dist/better-supabase/index.js +648 -0
- package/dist/bind-C_ob3LKa.d.ts +25 -0
- package/dist/bind-CuzGytRf.js +97 -0
- package/dist/boundary-BM8a_P6E.js +13 -0
- package/dist/boundary-BmHxVH1J.d.ts +15 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/{capability-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
- package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-CRW5Mx_B.js +2 -0
- package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
- package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
- package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
- package/dist/claude-agent/index.d.ts +5 -14
- package/dist/claude-agent/index.js +4 -10
- package/dist/clerk/index.d.ts +12 -3
- package/dist/clerk/index.js +26 -5
- package/dist/cli/bin.js +1 -1
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +2 -2
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +4 -5
- package/dist/cloud/index.js +20 -6
- package/dist/{cloud-BNQTrmrr.js → cloud-CB_ELYuX.js} +2 -2
- package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
- package/dist/collect-DClJsheJ.js +83 -0
- package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
- package/dist/collect-DSWOk19R.js +2 -0
- package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.js} +16 -12
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
- package/dist/compile-BkRyBDBw.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Dnszbv-6.js +36 -0
- package/dist/config-report-DMvWKUxL.js +44 -0
- package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
- package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
- package/dist/convex/index.d.ts +9 -4
- package/dist/convex/index.js +14 -4
- package/dist/create-B1d519XK.d.ts +245 -0
- package/dist/create-CMwIl-w2.js +253 -0
- package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
- package/dist/{describe-DernyItf.d.ts → describe-DMYiCjJV.d.ts} +9 -10
- package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
- package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
- package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
- package/dist/doctor-collect-CHk6XWOA.js +665 -0
- package/dist/doctor-igIiM_Hl.js +1194 -0
- package/dist/drizzle/index.d.ts +4 -3
- package/dist/drizzle/index.js +3 -3
- package/dist/elysia/index.d.ts +6 -28
- package/dist/elysia/index.js +16 -60
- package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
- package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
- package/dist/{errors-DbZ1YOnb.d.ts → errors-DPdqI50v.d.ts} +8 -21
- package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
- package/dist/eve/index.d.ts +6 -15
- package/dist/eve/index.js +7 -12
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +6 -29
- package/dist/express/index.js +28 -58
- package/dist/fastify/index.d.ts +6 -29
- package/dist/fastify/index.js +16 -65
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
- package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
- package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
- package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-CTLijvdm.js} +66 -48
- package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
- package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +6 -28
- package/dist/hono/index.js +11 -43
- package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
- package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/index-0nNqHspG.d.ts +6 -0
- package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
- package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
- package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
- package/dist/index.d.ts +14 -9
- package/dist/index.js +22 -17
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/instance-options-jARdwfPN.d.ts +11 -0
- package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
- package/dist/jwt/index.d.ts +10 -6
- package/dist/jwt/index.js +32 -13
- package/dist/kernel-_RRHmnMY.js +208 -0
- package/dist/kysely/index.d.ts +4 -3
- package/dist/kysely/index.js +3 -3
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
- package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +54 -22
- package/dist/mcp/index.js +218 -178
- package/dist/nest/index.d.ts +26 -31
- package/dist/nest/index.js +75 -84
- package/dist/next/client.d.ts +7 -8
- package/dist/next/client.js +11 -9
- package/dist/next/index.d.ts +30 -47
- package/dist/next/index.js +45 -60
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +32 -1
- package/dist/node/index.d.ts +9 -28
- package/dist/node/index.js +11 -43
- package/dist/openai/index.d.ts +6 -15
- package/dist/openai/index.js +7 -20
- package/dist/openapi/index.d.ts +87 -4
- package/dist/openapi/index.js +3 -3
- package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
- package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
- package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
- package/dist/{openapi-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
- package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
- package/dist/orpc/index.d.ts +15 -28
- package/dist/orpc/index.js +74 -117
- package/dist/otel/index.d.ts +2 -2
- package/dist/parse-BuyjxhZV.js +53 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +14 -127
- package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
- package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
- package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
- package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
- package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
- package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
- package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
- package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
- package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
- package/dist/powersync-BylawD_U.js +540 -0
- package/dist/powersync-DliZK_-y.js +62 -0
- package/dist/powersync-e_AZrKbg.js +2 -0
- package/dist/prisma/index.d.ts +3 -2
- package/dist/prisma/index.js +45 -20
- package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
- package/dist/problem-details-DX075l9V.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
- package/dist/protected-utU-SLuy.js +100 -0
- package/dist/protected-xAr24FEC.d.ts +40 -0
- package/dist/provider-CSQd7m92.js +52 -0
- package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
- package/dist/provider-store-Cfbvo4DE.js +43 -0
- package/dist/react/index.d.ts +7 -5
- package/dist/react/index.js +5 -4
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +166 -10
- package/dist/react-native/index.js +607 -85
- package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
- package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
- package/dist/replay-BsOyTrdV.js +28 -0
- package/dist/replay-CYyiLiwO.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
- package/dist/rls-DQtdgTHB.js +2521 -0
- package/dist/rls-fields-74oZPXWL.js +3582 -0
- package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
- package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
- package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
- package/dist/rls-ownership-RuFqaqGz.js +843 -0
- package/dist/rls-shared-Cewd_-zI.js +495 -0
- package/dist/rls-verify-CVQTHTh5.js +746 -0
- package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
- package/dist/row-conditions-h2HythXQ.js +27 -0
- package/dist/rpc-DL9Sqvb1.js +89 -0
- package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.js} +17 -7
- package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
- package/dist/scim/index.d.ts +1 -1
- package/dist/scim/index.js +1 -1
- package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
- package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
- package/dist/server/index.d.ts +22 -11
- package/dist/server/index.js +11 -8
- package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/{sink-Cfr9-7YC.d.ts → sink-B1fZzIMf.d.ts} +1 -1
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
- package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
- package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/solid/index.d.ts +39 -9
- package/dist/solid/index.js +76 -85
- package/dist/sources-4p0-4xQm.js +545 -0
- package/dist/sources-BdOYLw9j.d.ts +192 -0
- package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
- package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.js} +149 -11
- package/dist/ssf/index.d.ts +3 -2
- package/dist/ssf/index.js +3 -29
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/{store-Bq90395i.d.ts → store-jOBYpiXC.d.ts} +13 -4
- package/dist/store-options-ByhZq1jV.js +716 -0
- package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
- package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
- package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
- package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +133 -6
- package/dist/supabase/index.js +4 -3
- package/dist/supabase/middleware.d.ts +32 -27
- package/dist/supabase/middleware.js +56 -22
- package/dist/{supabase-D8UlBA7Z.js → supabase-Boqb9a_Y.js} +3 -3
- package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
- package/dist/supabase-config-BpPXt3x1.js +472 -0
- package/dist/supabase-hook-6sYLXg_u.js +2 -0
- package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
- package/dist/supautils-Cn4R4cJ4.js +91 -0
- package/dist/svelte/PermissionBoundary.svelte +37 -0
- package/dist/svelte/Protected.svelte +8 -2
- package/dist/svelte/index.d.ts +9 -6
- package/dist/svelte/index.js +61 -7
- package/dist/svelte/runtime.d.ts +4 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +9 -6
- package/dist/svelte/source.js +7 -4
- package/dist/terminal/index.d.ts +6 -14
- package/dist/terminal/index.js +44 -32
- package/dist/testing/index.d.ts +105 -16
- package/dist/testing/index.js +504 -40
- 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/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +7 -26
- package/dist/trpc/index.js +17 -100
- package/dist/types-BnIEz1sU.d.ts +48 -0
- package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
- package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
- package/dist/types-CKNSyIf_.d.ts +52 -0
- package/dist/types-Cq_H8N_X.d.ts +197 -0
- package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
- package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
- package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
- package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
- package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +10 -9
- package/dist/usage-DorAJiU_.js +2 -0
- package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
- package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
- package/dist/validation-error-Ba264OaJ.d.ts +26 -0
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
- package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
- package/dist/vue/index.d.ts +35 -13
- package/dist/vue/index.js +86 -93
- package/dist/watch-BwxLTYMZ.js +2 -0
- package/dist/watch-DVBJ9cBq.js +128 -0
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +7 -13
- package/package.json +62 -36
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +29 -1
- package/schemas/supabase-claims-v1.json +6 -1
- package/schemas/supabase-manifest-v1.json +150 -6
- package/skills/permdock/SKILL.md +7 -7
- package/skills/permdock-agents/SKILL.md +5 -5
- package/skills/permdock-agents/references/runtimes.md +12 -10
- package/skills/permdock-approvals/SKILL.md +4 -4
- package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +4 -4
- package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
- package/skills/permdock-data/SKILL.md +4 -4
- package/skills/permdock-data/references/queries-and-rls.md +14 -6
- package/skills/permdock-data/references/relationships.md +5 -3
- package/skills/permdock-tenancy/SKILL.md +9 -6
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
- package/skills/permdock-wire/SKILL.md +4 -4
- package/skills/permdock-wire/references/adapters.md +42 -30
- package/skills/permdock-wire/references/policy-options.md +5 -3
- package/dist/approvers-aH0PJkmf.js +0 -20
- package/dist/catalog-idsHc0vo.js +0 -2
- package/dist/collect-B7_TIfmg.js +0 -49
- package/dist/collect-fRPAQIWb.js +0 -2
- package/dist/compile-CQbvyIBr.d.ts +0 -30
- package/dist/config-BPYmjTOp.js +0 -26
- package/dist/context-gtAwAILx.js +0 -6
- package/dist/create-BKF3dgFk.d.ts +0 -162
- package/dist/create-CSkhDU9T.js +0 -222
- package/dist/doctor-BGle8Gqi.js +0 -1314
- package/dist/helpers-DnSOrhB9.js +0 -682
- package/dist/index-fG6NSXlc.d.ts +0 -9
- package/dist/kernel-YOGCWNLf.js +0 -211
- package/dist/load-QOOm1z70.js +0 -2
- package/dist/manifest-DDQbC6K0.d.ts +0 -118
- package/dist/map-error-RJ3ZsUyA.js +0 -16
- package/dist/may-use-CnFEjVEp.js +0 -37
- package/dist/pg-4GJWDUxG.js +0 -953
- package/dist/plugin-4gr7IxFJ.js +0 -65
- package/dist/protected-B4K3BKoX.js +0 -138
- package/dist/protected-wY7nXhY9.d.ts +0 -23
- package/dist/provider-_wx46HpB.js +0 -48
- package/dist/rls-CJVja9Ww.js +0 -2119
- package/dist/rls-helpers-BxRuif0l.js +0 -1346
- package/dist/runtime-DP9ttFh1.js +0 -27
- package/dist/skills-Dx3QLnMY.js +0 -110
- package/dist/source-DoBBYJi2.js +0 -6
- package/dist/sources-DVHM3Mwq.js +0 -284
- package/dist/store-C6hFW6ta.js +0 -508
- package/dist/subject-settings-xt7V845g.js +0 -82
- package/dist/supabase-hook-DW-xP4hU.js +0 -2
- package/dist/types-DbWdEfcm.d.ts +0 -87
- package/dist/types-bva3i4Gf.d.ts +0 -98
- package/dist/types-i4BAOvdb.d.ts +0 -97
- package/dist/usage-PyEor6GA.js +0 -2
- package/dist/version-CnSh33Fj.js +0 -16
package/dist/drizzle/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Ir as Condition, Pr as Subject, mn as WhereResult } from "../policy-IB6yxpC3.js";
|
|
2
|
+
import { r as RelationsMapping } from "../graph-sql-B-dsAT6j.js";
|
|
3
|
+
import { s as MembershipsMapping } from "../compile-BkRyBDBw.js";
|
|
4
|
+
import { n as WithSubjectOptions, t as RowCheck } from "../row-check-Dt35czLy.js";
|
|
4
5
|
import { SQL, Table } from "drizzle-orm";
|
|
5
6
|
//#region src/drizzle/types.d.ts
|
|
6
7
|
/** A column of the Drizzle table `T` or an `SQL` expression; anything for a structural stand-in. */
|
package/dist/drizzle/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as compact } from "../compact-y6vfu2_f.js";
|
|
2
|
-
import {
|
|
3
|
-
import { n as escapeLike, t as compileWhere } from "../compile-
|
|
4
|
-
import { i as rowCheckFrom, r as subjectStatements, t as statementTemplate } from "../subject-settings-
|
|
2
|
+
import { w as assertSafeKey } from "../permissions-DVoF6dMt.js";
|
|
3
|
+
import { n as escapeLike, t as compileWhere } from "../compile-Ba4blROR.js";
|
|
4
|
+
import { i as rowCheckFrom, r as subjectStatements, t as statementTemplate } from "../subject-settings-BwBmCdTR.js";
|
|
5
5
|
//#region src/drizzle/to-where.ts
|
|
6
6
|
function loadOperators(injected) {
|
|
7
7
|
if (injected !== void 0) return injected;
|
package/dist/elysia/index.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { f as ApprovalStore } from "../types-B8w5PFtS.js";
|
|
1
|
+
import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-IB6yxpC3.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
4
3
|
import { n as RevocationFeed } from "../revocations-Cy06JNx2.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { S as ConnectionOptions, b as Connection, g as discoverViaSignatureAgent, h as WebBotAuthVerifier, n as OpenApiHooks, o as TenantOption, r as ProtectOptions, u as InvalidSignatureError, y as verifyWebBotAuth } from "../create-BKF3dgFk.js";
|
|
4
|
+
import { A as ConnectionOptions, O as Connection, h as InvalidSignatureError, i as ProtectOptions, n as OpenApiHooks, w as verifyWebBotAuth, x as discoverViaSignatureAgent } from "../create-B1d519XK.js";
|
|
5
|
+
import { t as ServerAdapterOptions } from "../bind-C_ob3LKa.js";
|
|
8
6
|
import { Elysia } from "elysia";
|
|
9
7
|
//#region src/elysia/create.d.ts
|
|
10
8
|
type ElysiaCtx = {
|
|
@@ -12,27 +10,7 @@ type ElysiaCtx = {
|
|
|
12
10
|
readonly body?: unknown;
|
|
13
11
|
readonly params?: Readonly<Record<string, string | undefined>>;
|
|
14
12
|
};
|
|
15
|
-
type ElysiaPermDockOptions<TUser = unknown> = {
|
|
16
|
-
readonly subject: (ctx: ElysiaCtx) => TUser | Promise<TUser>;
|
|
17
|
-
readonly tenant?: TenantOption<ElysiaCtx>;
|
|
18
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
19
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
20
|
-
readonly relations?: RelationSource;
|
|
21
|
-
readonly entitlements?: EntitlementSource;
|
|
22
|
-
readonly customRoles?: RoleSource;
|
|
23
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
24
|
-
readonly policies?: PolicySource;
|
|
25
|
-
readonly store?: ApprovalStore;
|
|
26
|
-
readonly sink?: DecisionSink;
|
|
27
|
-
readonly limits?: LimitStore;
|
|
28
|
-
/** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
|
|
29
|
-
readonly pdp?: PdpFactory;
|
|
30
|
-
/** Accepted for adapter parity; not read by this adapter. */
|
|
31
|
-
readonly snapshots?: SnapshotSource;
|
|
32
|
-
/** `(permdock) => withOtel(permdock, options)` from `permdock/otel`. */
|
|
33
|
-
readonly otel?: OtelWrap;
|
|
34
|
-
/** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
|
|
35
|
-
readonly webBotAuth?: WebBotAuthVerifier;
|
|
13
|
+
type ElysiaPermDockOptions<TUser = unknown> = ServerAdapterOptions<ElysiaCtx, TUser> & {
|
|
36
14
|
/** Ends or revalidates open sockets. */
|
|
37
15
|
readonly revocations?: RevocationFeed;
|
|
38
16
|
};
|
|
@@ -45,7 +23,7 @@ type ElysiaContext<V extends PolicyVocabulary = PolicyVocabulary> = ElysiaCtx &
|
|
|
45
23
|
permdock: PermDock<V>;
|
|
46
24
|
permdockData?: unknown;
|
|
47
25
|
};
|
|
48
|
-
type ElysiaProtect = (permission: Permission, loadData?: (ctx: ElysiaCtx) => unknown, protectOptions?: ProtectOptions) => (ctx: ElysiaCtx) => Promise<Response | undefined>;
|
|
26
|
+
type ElysiaProtect = (permission: Permission | null, loadData?: (ctx: ElysiaCtx) => unknown, protectOptions?: ProtectOptions) => (ctx: ElysiaCtx) => Promise<Response | undefined>;
|
|
49
27
|
/** The `permdock()` plugin: its global derive types `permdock` in every later handler. */
|
|
50
28
|
type ElysiaPermDockPlugin<V extends PolicyVocabulary = PolicyVocabulary> = Elysia<"", {
|
|
51
29
|
decorator: Record<never, never>;
|
package/dist/elysia/index.js
CHANGED
|
@@ -1,47 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { i as onRevoked, t as POLICY_VIOLATION } from "../stream-
|
|
1
|
+
import { i as parsedBody, n as hasCredentials } from "../http-SO7qGttf.js";
|
|
2
|
+
import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-tz6D9A2G.js";
|
|
3
|
+
import { t as problemFromError } from "../map-error-pgUWNNtG.js";
|
|
4
|
+
import { a as socketConnection, i as decorate, r as bindKernel } from "../bind-CuzGytRf.js";
|
|
5
|
+
import { i as onRevoked, t as POLICY_VIOLATION } from "../stream-DDpvynSB.js";
|
|
6
6
|
import { Elysia } from "elysia";
|
|
7
7
|
//#region src/elysia/create.ts
|
|
8
8
|
function createPermDock(policy, options) {
|
|
9
|
-
const contexts = /* @__PURE__ */ new WeakMap();
|
|
10
|
-
const bound = /* @__PURE__ */ new WeakMap();
|
|
11
9
|
const seed = globalThis.crypto.randomUUID();
|
|
12
|
-
const kernel =
|
|
13
|
-
subject: (request) => {
|
|
14
|
-
const ctx = contexts.get(request);
|
|
15
|
-
return ctx === void 0 ? null : options.subject(ctx);
|
|
16
|
-
},
|
|
17
|
-
memberships: options.memberships,
|
|
18
|
-
relations: options.relations,
|
|
19
|
-
entitlements: options.entitlements,
|
|
20
|
-
customRoles: options.customRoles,
|
|
21
|
-
policies: options.policies,
|
|
22
|
-
store: options.store,
|
|
23
|
-
sink: options.sink,
|
|
24
|
-
limits: options.limits,
|
|
25
|
-
pdp: options.pdp,
|
|
26
|
-
webBotAuth: options.webBotAuth,
|
|
27
|
-
revocations: options.revocations,
|
|
28
|
-
adapter: "elysia",
|
|
29
|
-
wrap: options.otel
|
|
30
|
-
}));
|
|
31
|
-
const bind = (ctx) => {
|
|
32
|
-
const hit = bound.get(ctx);
|
|
33
|
-
if (hit !== void 0) return hit;
|
|
34
|
-
const next = toRequest(ctx);
|
|
35
|
-
bound.set(ctx, next);
|
|
36
|
-
contexts.set(next, ctx);
|
|
37
|
-
return next;
|
|
38
|
-
};
|
|
39
|
-
const scopeOf = (ctx) => tenantScope(options.tenant, ctx);
|
|
40
|
-
const decorate = (ctx, instance, data) => {
|
|
41
|
-
const scoped = ctx;
|
|
42
|
-
scoped.permdock = instance;
|
|
43
|
-
if (data !== void 0) scoped.permdockData = data;
|
|
44
|
-
};
|
|
10
|
+
const { kernel, bind, scopeOf, handlerScope } = bindKernel(policy, options, "elysia", toRequest);
|
|
45
11
|
const permdock = () => new Elysia({
|
|
46
12
|
name: "permdock",
|
|
47
13
|
seed
|
|
@@ -49,31 +15,22 @@ function createPermDock(policy, options) {
|
|
|
49
15
|
const instance = await kernel.permdock(bind(ctx), await scopeOf(ctx));
|
|
50
16
|
decorate(ctx, instance);
|
|
51
17
|
return { permdock: instance };
|
|
52
|
-
}).onError({ as: "global" }, ({ error }) => problemFromError(error));
|
|
18
|
+
}).onError({ as: "global" }, ({ error, request }) => problemFromError(error, { credentials: hasCredentials(request) }));
|
|
53
19
|
const protect = (permission, loadData, protectOptions) => async (ctx) => {
|
|
54
20
|
const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(ctx), protectOptions)(bind(ctx), await scopeOf(ctx));
|
|
55
21
|
if (!guard.ok) return guard.response;
|
|
56
22
|
decorate(ctx, guard.permdock, guard.data);
|
|
57
23
|
};
|
|
58
24
|
const sockets = /* @__PURE__ */ new WeakMap();
|
|
59
|
-
const connection = (ws, connectionOptions) => {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const conn = await kernel.connection(bind(ws.data), connectionOptions, await scopeOf(ws.data));
|
|
64
|
-
onRevoked(conn, (problem) => {
|
|
65
|
-
ws.close(POLICY_VIOLATION, problem.type);
|
|
66
|
-
});
|
|
67
|
-
return conn;
|
|
68
|
-
})();
|
|
69
|
-
sockets.set(ws.data, opened);
|
|
70
|
-
return opened;
|
|
71
|
-
};
|
|
72
|
-
const permdockHandler = () => {
|
|
73
|
-
const { POST, GET } = kernel.permdockHandler((request) => {
|
|
74
|
-
const ctx = contexts.get(request);
|
|
75
|
-
return ctx === void 0 ? { tenant: void 0 } : scopeOf(ctx);
|
|
25
|
+
const connection = (ws, connectionOptions) => socketConnection(sockets, ws.data, async () => {
|
|
26
|
+
const conn = await kernel.connection(bind(ws.data), connectionOptions, await scopeOf(ws.data));
|
|
27
|
+
onRevoked(conn, (problem) => {
|
|
28
|
+
ws.close(POLICY_VIOLATION, problem.type);
|
|
76
29
|
});
|
|
30
|
+
return conn;
|
|
31
|
+
});
|
|
32
|
+
const permdockHandler = () => {
|
|
33
|
+
const { POST, GET } = kernel.permdockHandler(handlerScope);
|
|
77
34
|
return new Elysia({
|
|
78
35
|
name: "permdock-handler",
|
|
79
36
|
seed
|
|
@@ -91,8 +48,7 @@ function toRequest(ctx) {
|
|
|
91
48
|
const method = ctx.request.method;
|
|
92
49
|
if (method === "GET" || method === "HEAD" || ctx.body === void 0) return ctx.request;
|
|
93
50
|
const headers = new Headers(ctx.request.headers);
|
|
94
|
-
const body =
|
|
95
|
-
if (!headers.has("content-type")) headers.set("content-type", "application/json");
|
|
51
|
+
const body = parsedBody(ctx.body, headers) ?? null;
|
|
96
52
|
return new Request(ctx.request.url, {
|
|
97
53
|
method,
|
|
98
54
|
headers,
|
|
@@ -10,8 +10,12 @@ var CliError = class extends Error {
|
|
|
10
10
|
};
|
|
11
11
|
const TITLES = {
|
|
12
12
|
usage: "Usage or configuration error",
|
|
13
|
-
unavailable: "A database or service the command needs did not answer"
|
|
13
|
+
unavailable: "A database or service the command needs did not answer",
|
|
14
|
+
failed: "The check the command ran found a problem"
|
|
14
15
|
};
|
|
16
|
+
function describeError(error) {
|
|
17
|
+
return error instanceof Error ? error.message : String(error);
|
|
18
|
+
}
|
|
15
19
|
/** An unclassified error is a usage error: a module that throws while loading is the project's to fix. */
|
|
16
20
|
function cliErrorKind(error) {
|
|
17
21
|
return error instanceof CliError ? error.kind : "usage";
|
|
@@ -21,7 +25,7 @@ function exitCodeOf(kind) {
|
|
|
21
25
|
}
|
|
22
26
|
function cliProblem(kind, message, command) {
|
|
23
27
|
return {
|
|
24
|
-
type: `https://permdock.
|
|
28
|
+
type: `https://permdock.com/problems/cli-${kind}`,
|
|
25
29
|
title: TITLES[kind],
|
|
26
30
|
detail: stripVTControlCharacters(message),
|
|
27
31
|
...command === void 0 ? {} : { command },
|
|
@@ -36,8 +40,8 @@ function usageResult(error) {
|
|
|
36
40
|
if (error instanceof CliError) throw error;
|
|
37
41
|
return {
|
|
38
42
|
code: 2,
|
|
39
|
-
output:
|
|
43
|
+
output: describeError(error)
|
|
40
44
|
};
|
|
41
45
|
}
|
|
42
46
|
//#endregion
|
|
43
|
-
export {
|
|
47
|
+
export { exitCodeOf as a, describeError as i, cliErrorKind as n, usageResult as o, cliProblem as r, CliError as t };
|
|
@@ -1,32 +1,8 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
+
import { t as PROBLEM_BASE } from "./validation-error-CnjZ4t92.js";
|
|
3
|
+
import { a as wireDenials, n as problemDetails } from "./problem-details-_AMOYz-w.js";
|
|
2
4
|
import { n as deniedDigest, t as approvalDigest } from "./digest-BI-6aa6d.js";
|
|
3
|
-
//#region src/core/wire-denial.ts
|
|
4
|
-
const IN_PROCESS = /* @__PURE__ */ new Set(["closure-error", "validation"]);
|
|
5
|
-
function jsonDetail(value) {
|
|
6
|
-
if (value === void 0 || value === null || value instanceof Error) return;
|
|
7
|
-
if (typeof value === "string" || typeof value === "boolean") return value;
|
|
8
|
-
if (typeof value === "number") return Number.isFinite(value) ? value : void 0;
|
|
9
|
-
if (typeof value !== "object") return;
|
|
10
|
-
try {
|
|
11
|
-
return JSON.parse(JSON.stringify(value));
|
|
12
|
-
} catch {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function wireDenial(denial) {
|
|
17
|
-
return compact({
|
|
18
|
-
role: denial.role,
|
|
19
|
-
reason: denial.reason,
|
|
20
|
-
to: denial.to,
|
|
21
|
-
detail: IN_PROCESS.has(denial.reason) ? void 0 : jsonDetail(denial.detail)
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function wireDenials(denials) {
|
|
25
|
-
return denials.map(wireDenial);
|
|
26
|
-
}
|
|
27
|
-
//#endregion
|
|
28
5
|
//#region src/core/errors.ts
|
|
29
|
-
const PROBLEM_BASE = "https://permdock.dev/problems";
|
|
30
6
|
var PermDockDeniedError = class extends Error {
|
|
31
7
|
name = "PermDockDeniedError";
|
|
32
8
|
decision;
|
|
@@ -34,6 +10,8 @@ var PermDockDeniedError = class extends Error {
|
|
|
34
10
|
scope;
|
|
35
11
|
resource;
|
|
36
12
|
subject;
|
|
13
|
+
/** The resource's `disclosure` when the denied check carried a row; `'hide'` answers as `404`. */
|
|
14
|
+
disclosure;
|
|
37
15
|
/** `PERMDOCK_DENIED;<permission>`; survives the Server Component boundary (`parsePermDockDigest`). */
|
|
38
16
|
digest;
|
|
39
17
|
constructor(input) {
|
|
@@ -43,21 +21,20 @@ var PermDockDeniedError = class extends Error {
|
|
|
43
21
|
this.scope = input.scope;
|
|
44
22
|
this.resource = input.resource;
|
|
45
23
|
this.subject = input.subject;
|
|
24
|
+
if (input.disclosure !== void 0) this.disclosure = input.disclosure;
|
|
46
25
|
this.digest = deniedDigest(input.permission);
|
|
47
26
|
}
|
|
27
|
+
/** The same status matrix as `protect`: `401`, `404`, `429`, `503` or `403`. */
|
|
48
28
|
toProblemDetails(options) {
|
|
49
|
-
return compact({
|
|
50
|
-
|
|
51
|
-
title: "Permission denied",
|
|
52
|
-
status: 403,
|
|
29
|
+
return problemDetails(compact({
|
|
30
|
+
decision: this.decision,
|
|
53
31
|
detail: this.message,
|
|
54
32
|
instance: options?.instance,
|
|
55
33
|
permission: this.permission,
|
|
56
34
|
scope: this.scope,
|
|
57
35
|
resource: this.resource,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
});
|
|
36
|
+
disclosure: options?.disclosure ?? this.disclosure
|
|
37
|
+
}));
|
|
61
38
|
}
|
|
62
39
|
};
|
|
63
40
|
var PermDockApprovalRequiredError = class extends Error {
|
|
@@ -81,45 +58,14 @@ var PermDockApprovalRequiredError = class extends Error {
|
|
|
81
58
|
this.digest = approvalDigest(input.permission, input.decision.token);
|
|
82
59
|
}
|
|
83
60
|
toProblemDetails(options) {
|
|
84
|
-
return compact({
|
|
85
|
-
|
|
86
|
-
title: "Approval required",
|
|
87
|
-
status: 403,
|
|
61
|
+
return problemDetails(compact({
|
|
62
|
+
decision: this.decision,
|
|
88
63
|
detail: this.message,
|
|
89
64
|
instance: options?.instance,
|
|
90
65
|
permission: this.permission,
|
|
91
66
|
scope: this.scope,
|
|
92
|
-
resource: this.resource
|
|
93
|
-
|
|
94
|
-
token: this.token
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
var PermDockValidationError = class extends Error {
|
|
99
|
-
name = "PermDockValidationError";
|
|
100
|
-
code;
|
|
101
|
-
permission;
|
|
102
|
-
resource;
|
|
103
|
-
issues;
|
|
104
|
-
boundary;
|
|
105
|
-
constructor(input) {
|
|
106
|
-
super(input.message);
|
|
107
|
-
this.code = input.code;
|
|
108
|
-
this.permission = input.permission;
|
|
109
|
-
this.resource = input.resource;
|
|
110
|
-
this.issues = input.issues ?? [];
|
|
111
|
-
this.boundary = input.boundary;
|
|
112
|
-
}
|
|
113
|
-
toProblemDetails(options) {
|
|
114
|
-
return compact({
|
|
115
|
-
type: `${PROBLEM_BASE}/validation`,
|
|
116
|
-
title: "Invalid resource data",
|
|
117
|
-
status: 400,
|
|
118
|
-
detail: this.message,
|
|
119
|
-
instance: options?.instance,
|
|
120
|
-
permission: this.permission,
|
|
121
|
-
issues: this.issues
|
|
122
|
-
});
|
|
67
|
+
resource: this.resource
|
|
68
|
+
}));
|
|
123
69
|
}
|
|
124
70
|
};
|
|
125
71
|
/** The `name` of the deny grant a `deny` denial carries in `detail`, if any. */
|
|
@@ -127,13 +73,13 @@ function denyName(detail) {
|
|
|
127
73
|
if (detail === null || typeof detail !== "object" || !("name" in detail)) return;
|
|
128
74
|
return typeof detail.name === "string" ? detail.name : void 0;
|
|
129
75
|
}
|
|
130
|
-
function deniedMessage(permission, subjectId, denials, alternatives) {
|
|
76
|
+
function deniedMessage(permission, subjectId, denials, alternatives, named = true) {
|
|
131
77
|
const clauses = denials.map((denial) => {
|
|
132
78
|
const name = denial.reason === "deny" ? denyName(denial.detail) : void 0;
|
|
133
79
|
return name === void 0 ? `${denial.role ?? "none"} (${denial.reason})` : `${denial.role ?? "none"} (${denial.reason} '${name}')`;
|
|
134
80
|
}).join(", ");
|
|
135
81
|
const alt = alternatives.length === 0 ? "" : ` Alternatives: ${alternatives.join(", ")}.`;
|
|
136
|
-
return `${permission} denied for subject ${subjectId ?? "anonymous"}: ${clauses}.${alt}`;
|
|
82
|
+
return `${permission} denied${named ? ` for subject ${subjectId ?? "anonymous"}` : ""}: ${clauses}.${alt}`;
|
|
137
83
|
}
|
|
138
84
|
function approvalMessage(permission, reason, token) {
|
|
139
85
|
return `${permission} requires human approval (${reason}). Token: ${token}.`;
|
|
@@ -174,4 +120,4 @@ var PermDockRevokedError = class extends Error {
|
|
|
174
120
|
}
|
|
175
121
|
};
|
|
176
122
|
//#endregion
|
|
177
|
-
export {
|
|
123
|
+
export { deniedMessage as a, approvalMessage as i, PermDockDeniedError as n, PermDockRevokedError as r, PermDockApprovalRequiredError as t };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Gt as WireDenial, Pr as Subject, Yn as Decision } from "./policy-IB6yxpC3.js";
|
|
2
|
+
import { t as Disclosure } from "./problem-details-DX075l9V.js";
|
|
2
3
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
3
4
|
//#region src/core/errors.d.ts
|
|
4
5
|
/** Where and how a human approves; carries no secret. */
|
|
@@ -42,6 +43,8 @@ declare class PermDockDeniedError extends Error {
|
|
|
42
43
|
readonly id?: string;
|
|
43
44
|
};
|
|
44
45
|
readonly subject: Subject;
|
|
46
|
+
/** The resource's `disclosure` when the denied check carried a row; `'hide'` answers as `404`. */
|
|
47
|
+
readonly disclosure?: Disclosure;
|
|
45
48
|
/** `PERMDOCK_DENIED;<permission>`; survives the Server Component boundary (`parsePermDockDigest`). */
|
|
46
49
|
readonly digest: string;
|
|
47
50
|
constructor(input: {
|
|
@@ -56,9 +59,12 @@ declare class PermDockDeniedError extends Error {
|
|
|
56
59
|
};
|
|
57
60
|
readonly subject: Subject;
|
|
58
61
|
readonly message: string;
|
|
62
|
+
readonly disclosure?: Disclosure;
|
|
59
63
|
});
|
|
64
|
+
/** The same status matrix as `protect`: `401`, `404`, `429`, `503` or `403`. */
|
|
60
65
|
toProblemDetails(options?: {
|
|
61
66
|
readonly instance?: string;
|
|
67
|
+
readonly disclosure?: Disclosure;
|
|
62
68
|
}): ProblemDetails;
|
|
63
69
|
}
|
|
64
70
|
declare class PermDockApprovalRequiredError extends Error {
|
|
@@ -92,25 +98,6 @@ declare class PermDockApprovalRequiredError extends Error {
|
|
|
92
98
|
readonly instance?: string;
|
|
93
99
|
}): ProblemDetails;
|
|
94
100
|
}
|
|
95
|
-
declare class PermDockValidationError extends Error {
|
|
96
|
-
override readonly name: "PermDockValidationError";
|
|
97
|
-
readonly code: "invalid-data" | "async-schema" | "no-schema" | "non-portable-condition";
|
|
98
|
-
readonly permission: string;
|
|
99
|
-
readonly resource: string;
|
|
100
|
-
readonly issues: readonly StandardSchemaV1.Issue[];
|
|
101
|
-
readonly boundary: string;
|
|
102
|
-
constructor(input: {
|
|
103
|
-
readonly code: "invalid-data" | "async-schema" | "no-schema" | "non-portable-condition";
|
|
104
|
-
readonly permission: string;
|
|
105
|
-
readonly resource: string;
|
|
106
|
-
readonly issues?: readonly StandardSchemaV1.Issue[];
|
|
107
|
-
readonly boundary: string;
|
|
108
|
-
readonly message: string;
|
|
109
|
-
});
|
|
110
|
-
toProblemDetails(options?: {
|
|
111
|
-
readonly instance?: string;
|
|
112
|
-
}): ProblemDetails;
|
|
113
|
-
}
|
|
114
101
|
type RevokedCode = "session-revoked" | "expired" | "denied" | "subject-changed";
|
|
115
102
|
/**
|
|
116
103
|
* The `reason` of a long-lived connection's aborted `signal`. `denied` carries
|
|
@@ -135,4 +122,4 @@ declare class PermDockRevokedError extends Error {
|
|
|
135
122
|
}): ProblemDetails;
|
|
136
123
|
}
|
|
137
124
|
//#endregion
|
|
138
|
-
export {
|
|
125
|
+
export { ProblemDetails as a, PermDockRevokedError as i, PermDockApprovalRequiredError as n, RevokedCode as o, PermDockDeniedError as r, ApprovalHint as t };
|
|
@@ -17,6 +17,9 @@ const CODES = /* @__PURE__ */ new Set([
|
|
|
17
17
|
"approver-not-eligible",
|
|
18
18
|
"approver-repeated"
|
|
19
19
|
]);
|
|
20
|
+
function isApprovalErrorCode(value) {
|
|
21
|
+
return typeof value === "string" && CODES.has(value);
|
|
22
|
+
}
|
|
20
23
|
/** Matches by `name` and `code`, so an error from another copy of the module still maps. */
|
|
21
24
|
function isApprovalError(value) {
|
|
22
25
|
if (!(value instanceof Error) || value.name !== "ApprovalError") return false;
|
|
@@ -24,4 +27,4 @@ function isApprovalError(value) {
|
|
|
24
27
|
return typeof code === "string" && CODES.has(code);
|
|
25
28
|
}
|
|
26
29
|
//#endregion
|
|
27
|
-
export { isApprovalError as n, ApprovalError as t };
|
|
30
|
+
export { isApprovalError as n, isApprovalErrorCode as r, ApprovalError as t };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { _ as listPermissions, a as formerKeys, o as formerScopes } from "./permissions-DVoF6dMt.js";
|
|
2
|
+
//#region src/server/evaluation-items.ts
|
|
3
|
+
function firstWins(map, name, leaf) {
|
|
4
|
+
if (!map.has(name)) map.set(name, leaf);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Indexes `tree` once. The lookup tries `action` as a permission key or
|
|
8
|
+
* scope, then `<resource.type>.<action>`, then the leaf with that resource
|
|
9
|
+
* and action; current names win over former ones and earlier leaves over
|
|
10
|
+
* later ones. Anything else is `undefined`, which the caller denies.
|
|
11
|
+
*/
|
|
12
|
+
function permissionLookup(tree) {
|
|
13
|
+
const current = /* @__PURE__ */ new Map();
|
|
14
|
+
const former = /* @__PURE__ */ new Map();
|
|
15
|
+
const byPair = /* @__PURE__ */ new Map();
|
|
16
|
+
for (const leaf of listPermissions(tree)) {
|
|
17
|
+
firstWins(current, leaf.key, leaf);
|
|
18
|
+
firstWins(current, leaf.scope, leaf);
|
|
19
|
+
for (const name of [...formerKeys(leaf), ...formerScopes(leaf)]) firstWins(former, name, leaf);
|
|
20
|
+
firstWins(byPair, `${leaf.resource}\u0000${leaf.action}`, leaf);
|
|
21
|
+
}
|
|
22
|
+
const named = (name) => current.get(name) ?? former.get(name);
|
|
23
|
+
return (action, resource) => {
|
|
24
|
+
if (action === void 0) return;
|
|
25
|
+
const byKey = named(action);
|
|
26
|
+
if (byKey !== void 0) return byKey;
|
|
27
|
+
const type = typeof resource?.type === "string" ? resource.type : void 0;
|
|
28
|
+
if (type === void 0) return;
|
|
29
|
+
return named(`${type}.${action}`) ?? byPair.get(`${type}\u0000${action}`);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** The row an item's resource describes: its `properties`, else `{ id }`. */
|
|
33
|
+
function itemResourceData(resource) {
|
|
34
|
+
const properties = resource?.properties;
|
|
35
|
+
if (properties !== null && typeof properties === "object") return properties;
|
|
36
|
+
const id = resource?.id;
|
|
37
|
+
if (typeof id === "string" || typeof id === "number") return { id: String(id) };
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { permissionLookup as n, itemResourceData as t };
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { t as PROBLEM_BASE } from "./validation-error-CnjZ4t92.js";
|
|
3
|
+
import { a as wireDenials } from "./problem-details-_AMOYz-w.js";
|
|
4
|
+
import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
|
|
5
|
+
import { s as problemResponse, t as batchTooLarge, u as validationProblem } from "./problem-B43ztKIm.js";
|
|
6
|
+
import { i as readApprovalHeader, s as resumeDecision } from "./helpers-H_KARDVC.js";
|
|
5
7
|
import { t as timeoutSignal } from "./timeout-D51niuQP.js";
|
|
6
|
-
import {
|
|
8
|
+
import { n as permissionLookup, t as itemResourceData } from "./evaluation-items-CfCCejQd.js";
|
|
9
|
+
//#region src/core/decision.ts
|
|
10
|
+
/** The denial for a check that failed or named no declared permission. */
|
|
11
|
+
const NO_GRANT = Object.freeze({
|
|
12
|
+
outcome: "denied",
|
|
13
|
+
denials: Object.freeze([Object.freeze({
|
|
14
|
+
role: null,
|
|
15
|
+
reason: "no-grant"
|
|
16
|
+
})]),
|
|
17
|
+
alternatives: Object.freeze([])
|
|
18
|
+
});
|
|
19
|
+
//#endregion
|
|
7
20
|
//#region src/server/web-bot-auth.ts
|
|
8
21
|
/** Milliseconds a key directory fetch may take before the signature counts as unverifiable. */
|
|
9
22
|
const DIRECTORY_TIMEOUT_MS = 5e3;
|
|
@@ -316,39 +329,8 @@ function decodeSfBytes(value) {
|
|
|
316
329
|
}
|
|
317
330
|
//#endregion
|
|
318
331
|
//#region src/server/evaluations.ts
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
denials: [{
|
|
322
|
-
role: null,
|
|
323
|
-
reason: "no-grant"
|
|
324
|
-
}],
|
|
325
|
-
alternatives: []
|
|
326
|
-
};
|
|
327
|
-
function permissionOf(tree, item) {
|
|
328
|
-
const action = typeof item.action?.name === "string" ? item.action.name : void 0;
|
|
329
|
-
if (action === void 0) return;
|
|
330
|
-
const byKey = findPermission(tree, action);
|
|
331
|
-
if (byKey !== void 0) return byKey;
|
|
332
|
-
const resource = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
333
|
-
if (resource === void 0) return;
|
|
334
|
-
const dotted = findPermission(tree, `${resource}.${action}`);
|
|
335
|
-
if (dotted !== void 0) return dotted;
|
|
336
|
-
return listPermissions(tree).find((leaf) => leaf.resource === resource && leaf.action === action);
|
|
337
|
-
}
|
|
338
|
-
function resourceData(item) {
|
|
339
|
-
const properties = item.resource?.properties;
|
|
340
|
-
if (properties !== null && typeof properties === "object") return properties;
|
|
341
|
-
const id = item.resource?.id;
|
|
342
|
-
if (typeof id === "string" || typeof id === "number") return { id: String(id) };
|
|
343
|
-
}
|
|
344
|
-
function resourceRef(permission, item, data) {
|
|
345
|
-
const fromRow = data !== null && typeof data === "object" && "id" in data ? data.id : void 0;
|
|
346
|
-
const fromWire = item.resource?.id;
|
|
347
|
-
const id = typeof fromRow === "string" || typeof fromRow === "number" ? String(fromRow) : typeof fromWire === "string" || typeof fromWire === "number" ? String(fromWire) : void 0;
|
|
348
|
-
return compact({
|
|
349
|
-
type: permission.resource,
|
|
350
|
-
id
|
|
351
|
-
});
|
|
332
|
+
function permissionOf(lookup, item) {
|
|
333
|
+
return lookup(typeof item.action?.name === "string" ? item.action.name : void 0, item.resource);
|
|
352
334
|
}
|
|
353
335
|
function evaluationRow(decision) {
|
|
354
336
|
switch (decision.outcome) {
|
|
@@ -387,13 +369,13 @@ function applyApprovalResume(decision, permission, permdock, store, request, res
|
|
|
387
369
|
store,
|
|
388
370
|
resource,
|
|
389
371
|
adapter,
|
|
390
|
-
token: readApprovalHeader(request.headers)
|
|
372
|
+
token: request === void 0 ? void 0 : readApprovalHeader(request.headers)
|
|
391
373
|
});
|
|
392
374
|
}
|
|
393
|
-
function evaluateOne(
|
|
394
|
-
const permission = permissionOf(
|
|
395
|
-
if (permission === void 0) return Promise.resolve(
|
|
396
|
-
const data =
|
|
375
|
+
function evaluateOne(lookup, permdock, item, store, header, adapter) {
|
|
376
|
+
const permission = permissionOf(lookup, item);
|
|
377
|
+
if (permission === void 0) return Promise.resolve(NO_GRANT);
|
|
378
|
+
const data = itemResourceData(item.resource);
|
|
397
379
|
const decide = permdock.decide;
|
|
398
380
|
const decision = decide(permission, data, compact({
|
|
399
381
|
source: "endpoint",
|
|
@@ -406,7 +388,7 @@ function evaluateOne(policy, permdock, item, store, header, adapter) {
|
|
|
406
388
|
permission,
|
|
407
389
|
subject: permdock.subject,
|
|
408
390
|
store,
|
|
409
|
-
resource: resourceRef(permission,
|
|
391
|
+
resource: resourceRef(permission, data, item.resource?.id),
|
|
410
392
|
adapter,
|
|
411
393
|
token: header,
|
|
412
394
|
consume: false
|
|
@@ -422,6 +404,7 @@ async function resolvePermdock(options, request, tenant) {
|
|
|
422
404
|
}
|
|
423
405
|
function createEvaluationsHandler(options) {
|
|
424
406
|
const adapter = options.adapter ?? "server";
|
|
407
|
+
const lookup = permissionLookup(options.policy.permissions);
|
|
425
408
|
const maxEvaluations = options.maxEvaluations ?? 256;
|
|
426
409
|
const POST = async (request) => {
|
|
427
410
|
let body;
|
|
@@ -444,8 +427,7 @@ function createEvaluationsHandler(options) {
|
|
|
444
427
|
throw error;
|
|
445
428
|
}
|
|
446
429
|
const rows = await Promise.all(evaluations.map(async (item) => {
|
|
447
|
-
|
|
448
|
-
return evaluationRow(await evaluateOne(options.policy, permdock, entry, options.store, header, adapter));
|
|
430
|
+
return evaluationRow(await evaluateOne(lookup, permdock, item !== null && typeof item === "object" ? item : {}, options.store, header, adapter));
|
|
449
431
|
}));
|
|
450
432
|
return Response.json({ evaluations: rows });
|
|
451
433
|
};
|
|
@@ -476,4 +458,4 @@ function createEvaluationsHandler(options) {
|
|
|
476
458
|
};
|
|
477
459
|
}
|
|
478
460
|
//#endregion
|
|
479
|
-
export { invalidSignatureProblem as a, discoverViaSignatureAgent as i, createEvaluationsHandler as n, invalidSignatureResponse as o, InvalidSignatureError as r, verifyWebBotAuth as s, applyApprovalResume as t };
|
|
461
|
+
export { invalidSignatureProblem as a, NO_GRANT as c, discoverViaSignatureAgent as i, createEvaluationsHandler as n, invalidSignatureResponse as o, InvalidSignatureError as r, verifyWebBotAuth as s, applyApprovalResume as t };
|
package/dist/eve/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { c as ApprovalRequest, f as ApprovalStore } from "../types-
|
|
4
|
-
import { t as
|
|
1
|
+
import { C as Policy, D as PolicyVocabulary, Nr as Principal, kr as Delegation, ln as PermDock } from "../policy-IB6yxpC3.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { c as ApprovalRequest, f as ApprovalStore } from "../types-aqOHTHcp.js";
|
|
4
|
+
import { t as InstanceOptions } from "../instance-options-jARdwfPN.js";
|
|
5
|
+
import { t as ToolMap } from "../types-Bvc4oWT6.js";
|
|
5
6
|
//#region src/eve/create.d.ts
|
|
6
7
|
/** Structural `SessionAuthContext` from `eve`. */
|
|
7
8
|
type EvePrincipal = {
|
|
@@ -48,24 +49,14 @@ type EveContext = Pick<EveApprovalContext, "session" | "callId">;
|
|
|
48
49
|
type EveApprovers = {
|
|
49
50
|
readonly roles: readonly string[];
|
|
50
51
|
} | ((responder: EvePrincipal, request: ApprovalRequest) => boolean);
|
|
51
|
-
type EvePermDockOptions<TUser = unknown> = {
|
|
52
|
+
type EvePermDockOptions<TUser = unknown> = InstanceOptions & {
|
|
52
53
|
readonly subject?: (context: EveContext) => TUser | Promise<TUser>;
|
|
53
54
|
readonly actor?: (context: EveContext) => unknown;
|
|
54
55
|
readonly delegation?: (context: EveContext) => Delegation | undefined | Promise<Delegation | undefined>;
|
|
55
56
|
readonly tenant?: string | ((context: EveContext) => string | undefined | Promise<string | undefined>);
|
|
56
57
|
readonly tools: ToolMap;
|
|
57
58
|
readonly approvers?: EveApprovers;
|
|
58
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
59
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
60
|
-
readonly relations?: RelationSource;
|
|
61
|
-
readonly entitlements?: EntitlementSource;
|
|
62
|
-
readonly customRoles?: RoleSource;
|
|
63
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
64
|
-
readonly policies?: PolicySource;
|
|
65
59
|
readonly store?: ApprovalStore;
|
|
66
|
-
readonly sink?: DecisionSink;
|
|
67
|
-
readonly limits?: LimitStore;
|
|
68
|
-
readonly snapshots?: SnapshotSource;
|
|
69
60
|
};
|
|
70
61
|
type EveRequestResult = "not-applicable" | "user-approval" | {
|
|
71
62
|
readonly type: "denied";
|