permdock 0.1.0 → 0.2.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-cmvX2jDe.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 +206 -0
- package/dist/better-supabase/index.js +620 -0
- package/dist/bind-CVy3Espv.d.ts +25 -0
- package/dist/bind-VnYn2HKq.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-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
- package/dist/{capability-BDG_nkxt.d.ts → capability-Dq43tT1u.d.ts} +2 -2
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-Dsc9y7sd.js} +23 -12
- package/dist/{catalog-B0E6bggc.js → catalog-h2tlKFkq.js} +2 -2
- package/dist/{catalog-H-vFGwWK.js → catalog-z8q6bi_r.js} +4 -4
- 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-BGhHS-lY.js} +2 -2
- package/dist/{cloud-Cuxr6Czw.js → cloud-Bo3e9Ak3.js} +7 -6
- package/dist/{collect-O-tOtbnk.js → collect-DDDv_ESs.js} +194 -42
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/{commands-BMh_Etm2.js → commands-DWOrSQic.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-CNnl6uIt.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Bn00Z3ks.js +36 -0
- package/dist/config-report-Dw_JcUqT.js +44 -0
- package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
- package/dist/{context-CKEAabd7.js → context-Ttp0ekMT.js} +36 -27
- package/dist/convex/index.d.ts +9 -4
- package/dist/convex/index.js +14 -4
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.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-PdoqESvg.d.ts} +9 -10
- package/dist/{diff-x5Il8LVa.js → diff-B8Tunc3o.js} +44 -11
- package/dist/{diff-BUzf5Poi.js → diff-CzqLxZ77.js} +2 -2
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/{doctor-Bqo6FwUa.js → doctor-rOr-4ZfS.js} +2 -2
- 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-DAqevpNk.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-C3sHpZNS.js} +65 -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-LF_hS-yn.d.ts → index-A0YNL8jZ.d.ts} +1 -1
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/{index-xIxJLwOQ.d.ts → index-D3vbkoSI.d.ts} +75 -7
- package/dist/{index-CltcQ4Bf.d.ts → index-D6_cSa1z.d.ts} +68 -5
- package/dist/index.d.ts +14 -9
- package/dist/index.js +22 -17
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -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-GSQnMz3O.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-CwePaF7C.js → openapi-Bbg4wGVL.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-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-BkGQNzAh.d.ts +10 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +14 -127
- package/dist/{permdock-yoZ7EjxX.js → permdock-CzqXjCpU.js} +641 -126
- package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
- package/dist/{permissions-CofRqesP.js → permissions-CpZrivYv.js} +3 -3
- package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
- package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
- package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
- package/dist/{policy-CInmNGkM.d.ts → policy-CFZAr_Al.d.ts} +330 -37
- package/dist/{policy-Cq2fB8Q5.d.ts → policy-D8UFyERw.d.ts} +2 -2
- package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
- package/dist/powersync-A8x_Yyvh.js +2 -0
- package/dist/powersync-C7kLglqX.js +540 -0
- package/dist/powersync-yW1UUFzp.js +62 -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-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/{protected-BuPAycJT.d.ts → protected-CNsMzrVd.d.ts} +5 -4
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/{provider-wTAUda2v.d.ts → provider-Cjr62YMV.d.ts} +1 -1
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.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-sqBGMnNs.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/{rls-BOFU3chG.js → rls-CEvs64Kj.js} +8 -3
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/{rls-graph-DxQ39PJj.js → rls-graph-pc9fuXYm.js} +100 -36
- package/dist/{rls-import-CXV6LBlS.js → rls-import-D8F7j35Q.js} +7 -6
- package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-7wikfrVI.js} +6 -5
- package/dist/rls-ownership-B5Lkq62W.js +843 -0
- package/dist/rls-shared-aOQ4hGTO.js +493 -0
- package/dist/rls-verify-D8B7dOTh.js +745 -0
- package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/{run-CJ6UvS3a.js → run-YXCJDNYk.js} +31 -12
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/{saas-BRrZzJkM.js → saas-Bj_FFkjN.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-Gs6TTVa-.d.ts} +1 -1
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/{skills-C_lpV4Jx.js → skills-JaymNCdK.js} +10 -4
- package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +39 -9
- package/dist/solid/index.js +76 -85
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
- package/dist/{src-CTNT-PBW.js → src-CSbUiozF.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-D_pjn91-.d.ts} +13 -4
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/{stores-CkG2HrSg.js → stores-4_sqiOA1.js} +10 -63
- package/dist/{stores-CvOnu_2T.d.ts → stores-DVR5NHLE.d.ts} +20 -9
- package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
- package/dist/{stream-BhMfZOwr.d.ts → stream-DlvG2hs-.d.ts} +2 -2
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +122 -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-CwafwxxF.js} +3 -3
- package/dist/{supabase-DTxGtYdi.js → supabase-DTBaC20O.js} +345 -367
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-BuxLQLpU.js} +994 -708
- package/dist/supabase-hook-D5qVd_D8.js +2 -0
- package/dist/supautils-DYZnzRWV.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-9AWO9EGt.d.ts +197 -0
- package/dist/{types-D6Z6-rKJ.d.ts → types-BPxgszlT.d.ts} +260 -22
- package/dist/{types-BvBk1wgn.d.ts → types-BVyImy5I.d.ts} +5 -3
- package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/{types-B8w5PFtS.d.ts → types-vKyAMtcX.d.ts} +17 -1
- package/dist/{types-B9dmiiab.d.ts → types-vNSDF7Dq.d.ts} +1 -1
- package/dist/{sources-DOpW5Ila.d.ts → types-yF5LmQVD.d.ts} +86 -127
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +10 -9
- package/dist/{usage-1ozMubLY.js → usage-D07N9QJ3.js} +2 -2
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/{usage-CUnK6Ou9.js → usage-DG1oeCca.js} +225 -62
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -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-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.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/README.md
CHANGED
|
@@ -3,42 +3,32 @@
|
|
|
3
3
|
**Typed permissions for TypeScript apps, APIs, databases and AI agents.**
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/permdock)
|
|
6
|
-
[](https://github.com/ScaleDockHQ/
|
|
7
|
-
[](https://github.com/ScaleDockHQ/PermDock/blob/main/LICENSE)
|
|
7
|
+
[](https://github.com/ScaleDockHQ/PermDock/actions)
|
|
8
8
|

|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
Define permissions once as typed references over the Zod, Valibot or ArkType schemas you already have. Grant them to roles with portable conditions. Check them in React,
|
|
11
|
+
Define permissions once as typed references over the Zod, Valibot or ArkType schemas you already have. Grant them to roles with portable conditions. Check them in React, Next.js, Hono, tRPC, MCP servers and agent runtimes, and compile the same conditions to SQL `where` clauses and Postgres Row Level Security.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
[Docs](https://permdock.dev/docs) · [Quick start](https://permdock.dev/docs/getting-started/quick-start) · [Adapters](https://permdock.dev/docs/adapters) · [For AI agents](https://permdock.dev/docs/for-ai-agents) · [Source](https://github.com/ScaleDockHQ/permdock)
|
|
16
|
-
|
|
17
|
-
## Install
|
|
13
|
+
[Docs](https://permdock.com/docs) · [Quick start](https://permdock.com/docs/getting-started/quick-start) · [Adapters](https://permdock.com/docs/adapters) · [Existing apps](https://permdock.com/docs/getting-started/existing-apps) · [For AI agents](https://permdock.com/docs/for-ai-agents) · [Changelog](https://github.com/ScaleDockHQ/PermDock/blob/main/packages/permdock/CHANGELOG.md) · [Source](https://github.com/ScaleDockHQ/PermDock)
|
|
18
14
|
|
|
19
15
|
```bash
|
|
20
|
-
pnpm add permdock
|
|
16
|
+
pnpm add permdock
|
|
21
17
|
```
|
|
22
18
|
|
|
23
|
-
|
|
24
|
-
- ESM only. Node.js 24 or later. Written in and tested with TypeScript 7; the public types are also checked under TypeScript 5.9 and 6.
|
|
25
|
-
- Runtime entries depend on `@standard-schema/spec` only. The CLI's dependencies (`oxc-parser`, `citty`, `jiti`, `smol-toml`, `package-manager-detector`, `@clack/prompts`, `diff`) never reach them. Framework SDKs are optional peers, and structurally typed providers (`supabase`, `clerk`, `better-auth`, `convex`, `prisma`, `mcp`, `react-native`) declare no peer at all.
|
|
19
|
+
One package: core, every adapter as a subpath export, the `permdock` CLI and `permdock/testing`. ESM only, Node.js 24 or later, built with TypeScript 7 and type-checked under 5.9 and 6. Runtime entries depend on `@standard-schema/spec` only; framework SDKs are optional peers.
|
|
26
20
|
|
|
27
|
-
##
|
|
21
|
+
## One definition, one decision
|
|
28
22
|
|
|
29
|
-
|
|
23
|
+
| Surface | What PermDock gives it |
|
|
24
|
+
| --------- | ---------------------------------------------------------------------------------------------- |
|
|
25
|
+
| UI | A JSON snapshot with conditions, `<Protected>` and `usePermission`, answered offline |
|
|
26
|
+
| HTTP, RPC | `protect` guards that answer a denial with RFC 9457 Problem Details |
|
|
27
|
+
| Database | `where()` for Drizzle, Prisma and Kysely; generated Postgres RLS with a parity check |
|
|
28
|
+
| Agents | Filtered tool lists, model-readable refusals, human approvals with a replay-safe token |
|
|
29
|
+
| CI | A committed catalog, `permdock diff` that fails on a breaking change, `permdock doctor` checks |
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
- **Standard Schema native.** Resources are built from any [Standard Schema](https://standardschema.dev) validator; instance types are inferred; untrusted input is validated at trust boundaries only.
|
|
33
|
-
- **Policy as data.** Roles are arrays of `allow` / `deny` grants with a portable condition AST. One condition evaluates in the browser, filters arrays, compiles to Drizzle / Prisma / Kysely `where`, and generates Postgres RLS.
|
|
34
|
-
- **Multi-tenant roles.** A role is held globally, in a tenant, in a team or on one resource: `role('admin', grants, { on: 'tenant' })` replaces the `orgId` condition you used to repeat on every grant. Memberships come from your auth provider; PermDock stores nothing. Read [tenants, teams and scoped roles](https://permdock.dev/docs/concepts/tenancy).
|
|
35
|
-
- **Decisions, not booleans.** `decide()` returns `granted`, `denied` or `approval-required` with the matched grant, denial reasons and permitted alternatives. Adapters turn that into RFC 9457 Problem Details, model-readable MCP refusals and AI SDK approval states.
|
|
36
|
-
- **Snapshots that carry conditions.** The client answers ownership checks offline with no duplicated rules, and `<Protected>` never blocks a Next.js 16.3 instant navigation.
|
|
37
|
-
- **Agent-native.** A two-principal subject (principal, actor, delegation), adapters for MCP, the AI SDK, the Claude Agent SDK, Eve, the OpenAI Agents SDK, WebMCP and A2A, an AuthZEN 1.0 decision endpoint, and bundled agent skills.
|
|
38
|
-
- **Human approvals that resume safely.** `approval: 'human'` grants yield a third outcome with a replay-safe `token`. Pending approvals live in a pluggable `ApprovalStore`; approvers are authenticated and never the agent; plain HTTP resumes with a `PermDock-Approval` header.
|
|
39
|
-
- **Secure by default.** Fail-closed, deny overrides allow, an unknown reference is a type error, prototype-safe, no eval, `service_role` never emitted, model-supplied subjects never trusted, an agent with no delegation denied, no one approving their own request, never a default tenant, data validated against the resource schema unless the caller marks a row it loaded `trusted: true`.
|
|
40
|
-
- **Authentication stays upstream.** PermDock consumes verified material only: sessions, JWKS-verified JWTs (`permdock/jwt`, with `jose` as an optional peer), Supabase, Clerk and Better Auth claims, MCP `authInfo`. Token failures become RFC 6750 challenges, never thrown errors. Read [authentication](https://permdock.dev/docs/concepts/authentication).
|
|
41
|
-
- **The Cloud is optional.** Every decision runs in-process. PermDock Cloud adds a decision log, access reviews, an approval inbox, a hosted AuthZEN endpoint and a SCIM relay, all behind interfaces this package ships with in-process defaults. Read [PermDock Cloud](https://permdock.dev/docs/adapters/cloud).
|
|
31
|
+
Every check returns one of three outcomes: `granted`, `denied` or `approval-required`. Anything unknown, invalid or thrown denies, and a deny overrides an allow.
|
|
42
32
|
|
|
43
33
|
## Quick start
|
|
44
34
|
|
|
@@ -71,9 +61,11 @@ export const roles = defineRoles({ member: {}, admin: { on: "tenant" } });
|
|
|
71
61
|
permissions.post.update.key; // 'post.update'
|
|
72
62
|
```
|
|
73
63
|
|
|
64
|
+
`permissions.post.update` is a frozen object, not a string: go-to-definition works, a rename is a type error everywhere it is used, and the definition is the catalog.
|
|
65
|
+
|
|
74
66
|
### 2. Write the policy
|
|
75
67
|
|
|
76
|
-
Server-only. Roles are data; conditions are portable.
|
|
68
|
+
Server-only. Roles are data; conditions are a portable JSON tree.
|
|
77
69
|
|
|
78
70
|
```ts
|
|
79
71
|
// src/policy.ts
|
|
@@ -113,7 +105,7 @@ export const policy = definePolicy(
|
|
|
113
105
|
);
|
|
114
106
|
```
|
|
115
107
|
|
|
116
|
-
`subjectFromClerk`, `subjectFromBetterAuth`, `subjectFromSupabase` and `subjectFromJwt` produce `memberships` from the provider you already use.
|
|
108
|
+
`subjectFromClerk`, `subjectFromBetterAuth`, `subjectFromSupabase` and `subjectFromJwt` produce `memberships` from the provider you already use. PermDock stores no tenants, teams or memberships.
|
|
117
109
|
|
|
118
110
|
### 3. Decide
|
|
119
111
|
|
|
@@ -123,11 +115,14 @@ import { createPermDock } from "permdock";
|
|
|
123
115
|
const permdock = await createPermDock(policy, user); // frozen, request-scoped, never throws
|
|
124
116
|
permdock.can(permissions.post.update, post); // boolean
|
|
125
117
|
permdock.decide(permissions.post.delete, post); // { outcome: 'granted' | 'denied' | 'approval-required', ... }
|
|
118
|
+
permdock.explain(permissions.post.delete, post); // the decision plus a trace naming the deny that won
|
|
126
119
|
permdock.filter(permissions.post.read, posts); // Post[]
|
|
127
120
|
permdock.where(permissions.post.read); // portable condition for Drizzle / Prisma / Kysely / SQL
|
|
128
121
|
permdock.snapshot({ include: [permissions.post] }); // JSON for the client
|
|
129
122
|
```
|
|
130
123
|
|
|
124
|
+
## Use it where the check happens
|
|
125
|
+
|
|
131
126
|
### React
|
|
132
127
|
|
|
133
128
|
```tsx
|
|
@@ -146,7 +141,7 @@ import { PermDockProvider, Protected, usePermission } from "permdock/react";
|
|
|
146
141
|
const { allowed, status } = usePermission(permissions.post.update, post);
|
|
147
142
|
```
|
|
148
143
|
|
|
149
|
-
The same hook names exist in React Native, Vue, Svelte and Solid. Read [building UI](https://permdock.
|
|
144
|
+
The same hook names exist in React Native, Vue, Svelte and Solid. Read [building UI](https://permdock.com/docs/concepts/ui).
|
|
150
145
|
|
|
151
146
|
### Next.js 16.3
|
|
152
147
|
|
|
@@ -206,6 +201,8 @@ protectServer(server).registerTool(
|
|
|
206
201
|
|
|
207
202
|
### AI SDK
|
|
208
203
|
|
|
204
|
+
The Claude Agent SDK, Eve, the OpenAI Agents SDK, WebMCP and A2A have their own entries with the same tool map.
|
|
205
|
+
|
|
209
206
|
```ts
|
|
210
207
|
import { createPermDock } from "permdock/ai-sdk";
|
|
211
208
|
|
|
@@ -225,36 +222,98 @@ const { toolApproval } = createPermDock(policy, {
|
|
|
225
222
|
generateText({ model, tools, toolApproval }); // granted → approved, denied → denied, approval-required → user-approval
|
|
226
223
|
```
|
|
227
224
|
|
|
228
|
-
### RLS
|
|
225
|
+
### Postgres RLS
|
|
229
226
|
|
|
230
227
|
```bash
|
|
231
228
|
permdock rls generate --target drizzle --dialect supabase # roles × grants → policies
|
|
232
229
|
permdock rls verify --db $DATABASE_URL # can() vs database parity
|
|
233
230
|
```
|
|
234
231
|
|
|
232
|
+
## Agents and approvals
|
|
233
|
+
|
|
234
|
+
An agent acts for a user, so a subject has two principals: the user (`principal`) and the agent (`actor`). Policy `delegations` cap what an actor may do for a user, and an approval grant pauses the call until people other than the requester approve it.
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
import { actor, allow, definePolicy } from "permdock";
|
|
238
|
+
|
|
239
|
+
const policy = definePolicy(permissions, {
|
|
240
|
+
roles: [member, finance],
|
|
241
|
+
delegations: [
|
|
242
|
+
{
|
|
243
|
+
from: roles.member,
|
|
244
|
+
to: actor("eve"),
|
|
245
|
+
permissions: [permissions.post.read, permissions.post.update],
|
|
246
|
+
validUntil: "2027-06-01T00:00:00Z",
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
subject,
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
allow(permissions.payout.release, {
|
|
253
|
+
approval: {
|
|
254
|
+
by: roles.finance,
|
|
255
|
+
quorum: 2, // two distinct finance approvers
|
|
256
|
+
ttl: "30m",
|
|
257
|
+
escalation: { after: "10m", to: roles.cfo },
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Approvers are authenticated and are never the agent, no one approves their own request by default, and the resumed call carries a token bound to the permission and the data. Read [delegation](https://permdock.com/docs/security/delegation) and [approvals](https://permdock.com/docs/security/approvals).
|
|
263
|
+
|
|
264
|
+
## Existing apps
|
|
265
|
+
|
|
266
|
+
PermDock adopts the permission keys, SQL helpers, tokens and stored custom roles an app already has, in steps that each leave the app working: generated helpers beside the hand-written SQL, `permdock rls migrate` to rewrite policies, and `renamed` aliases for keys you change later. `permdock doctor` reports what still uses an old key. Read [existing apps](https://permdock.com/docs/getting-started/existing-apps).
|
|
267
|
+
|
|
268
|
+
## CLI
|
|
269
|
+
|
|
270
|
+
| Command | What it does |
|
|
271
|
+
| ------------------------ | ------------------------------------------------------------------------------------ |
|
|
272
|
+
| `permdock collect` | Scan the sources and write `permissions.catalog.json`; `--check` in CI |
|
|
273
|
+
| `permdock diff a b` | Compare two policies or catalogs; exit `1` on a breaking change; `--impact` |
|
|
274
|
+
| `permdock doctor` | Check wiring, imports, catalog freshness and security defaults; print a fix for each |
|
|
275
|
+
| `permdock usage` | Report unused, ungranted and role-less permissions |
|
|
276
|
+
| `permdock rls` | `generate`, `import`, `verify` and `migrate` Postgres RLS policies |
|
|
277
|
+
| `permdock supabase hook` | Generate the Supabase Custom Access Token Hook from your membership sources |
|
|
278
|
+
| `permdock openapi` | Emit `security` into an OpenAPI document or Overlay, or import one |
|
|
279
|
+
| `permdock skills` | Install the PermDock Agent Skills from `node_modules/permdock/skills` |
|
|
280
|
+
|
|
281
|
+
`catalog`, `arazzo check` and `cloud push` complete the list. Every command takes `--json`; under it, a failure prints RFC 9457 Problem Details. Read [CLI](https://permdock.com/docs/cli).
|
|
282
|
+
|
|
235
283
|
## Works with
|
|
236
284
|
|
|
237
285
|
Any Standard Schema validator: Zod, Valibot, ArkType, Effect Schema. One import path per target:
|
|
238
286
|
|
|
239
|
-
| Group | Entries
|
|
240
|
-
| ------------------ |
|
|
241
|
-
| UI | `permdock/react` · `permdock/react-native` · `permdock/vue` · `permdock/svelte` · `permdock/solid`
|
|
242
|
-
| Full-stack | `permdock/next`
|
|
243
|
-
| HTTP | `permdock/server` · `permdock/hono` · `permdock/express` · `permdock/fastify` · `permdock/elysia` · `permdock/nest` · `permdock/node`
|
|
244
|
-
| Terminal | `permdock/terminal` for your own CLI (not the `permdock` binary)
|
|
245
|
-
| RPC | `permdock/trpc` · `permdock/orpc`
|
|
246
|
-
| Agents | `permdock/mcp` · `permdock/ai-sdk` · `permdock/claude-agent` · `permdock/eve` · `permdock/openai` · `permdock/webmcp` · `permdock/a2a`
|
|
247
|
-
| Decision plane | `permdock/authzen` · `permdock/approvals` · `permdock/cloud` · `permdock/scim` · `permdock/ssf` · `permdock/openapi` · `permdock/otel` · `permdock/pdp`
|
|
248
|
-
| Data | `permdock/drizzle` · `permdock/prisma` · `permdock/kysely` · `permdock rls`
|
|
249
|
-
| Auth and providers | `permdock/jwt` · `permdock/supabase` · `permdock/supabase/middleware` · `permdock/better-auth` · `permdock/clerk` · `permdock/convex`
|
|
250
|
-
| Build | `permdock/next/plugin` · `permdock/unplugin`
|
|
251
|
-
| Testing | `permdock/testing`
|
|
252
|
-
|
|
253
|
-
|
|
287
|
+
| Group | Entries |
|
|
288
|
+
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
289
|
+
| UI | `permdock/react` · `permdock/react-native` · `permdock/vue` · `permdock/svelte` · `permdock/solid` |
|
|
290
|
+
| Full-stack | `permdock/next` |
|
|
291
|
+
| HTTP | `permdock/server` · `permdock/hono` · `permdock/express` · `permdock/fastify` · `permdock/elysia` · `permdock/nest` · `permdock/node` |
|
|
292
|
+
| Terminal | `permdock/terminal` for your own CLI (not the `permdock` binary) |
|
|
293
|
+
| RPC | `permdock/trpc` · `permdock/orpc` |
|
|
294
|
+
| Agents | `permdock/mcp` · `permdock/ai-sdk` · `permdock/claude-agent` · `permdock/eve` · `permdock/openai` · `permdock/webmcp` · `permdock/a2a` |
|
|
295
|
+
| Decision plane | `permdock/authzen` · `permdock/approvals` · `permdock/cloud` · `permdock/scim` · `permdock/ssf` · `permdock/openapi` · `permdock/otel` · `permdock/pdp` |
|
|
296
|
+
| Data | `permdock/drizzle` · `permdock/prisma` · `permdock/kysely` · `permdock rls` · `permdock powersync` |
|
|
297
|
+
| Auth and providers | `permdock/jwt` · `permdock/supabase` · `permdock/supabase/middleware` · `permdock/better-supabase` · `permdock/better-auth` · `permdock/clerk` · `permdock/convex` |
|
|
298
|
+
| Build | `permdock/next/plugin` · `permdock/unplugin` |
|
|
299
|
+
| Testing | `permdock/testing` |
|
|
300
|
+
|
|
301
|
+
React Router, TanStack Start, SvelteKit and Nuxt loaders call `getSnapshot(request)` from `permdock/server` and send `snapshotHeaders(snapshot)`. Astro and Effect use these entries plus `permdock/unplugin`. The full matrix with example apps and related standards is on the [adapters page](https://permdock.com/docs/adapters).
|
|
302
|
+
|
|
303
|
+
## Secure by default
|
|
304
|
+
|
|
305
|
+
- Fail-closed: an unknown, invalid or thrown check denies, and `can()` never throws.
|
|
306
|
+
- Deny overrides allow, an unknown reference is a type error, and evaluation is prototype-safe with no eval.
|
|
307
|
+
- `service_role` is never emitted, a model-supplied subject is never trusted, and an agent with no delegation is denied.
|
|
308
|
+
- No one approves their own request by default, there is never a default tenant, and data is validated against the resource schema unless the caller marks a row it loaded `trusted: true`.
|
|
309
|
+
- Authentication stays upstream: PermDock consumes verified sessions, JWKS-verified JWTs (`permdock/jwt`, with `jose` as an optional peer), provider claims and MCP `authInfo`. Core never verifies a token. User-editable fields never become claims: `subjectFromBetterAuth` copies `additionalFields` only through a `schema`. Read [authentication](https://permdock.com/docs/concepts/authentication).
|
|
310
|
+
- Every decision runs in-process. [PermDock Cloud](https://permdock.com/docs/adapters/cloud) adds a decision log, an approval inbox, a hosted AuthZEN endpoint and a SCIM relay, behind interfaces this package ships with in-process defaults.
|
|
311
|
+
|
|
312
|
+
Read the [threat model](https://permdock.com/docs/security/threat-model).
|
|
254
313
|
|
|
255
314
|
## Compared with
|
|
256
315
|
|
|
257
|
-
Other TypeScript permission libraries (CASL, permix, Kilpi, `@zap-studio/permit`) return booleans from string keys and stop at the server or the UI. Hosted PDPs (Cerbos, Permit.io, OpenFGA, SpiceDB) put a network call on every check. PermDock is an embedded, typed library with one decision object across UI, API, SQL, RLS and agent approvals. Read the [comparison](https://permdock.
|
|
316
|
+
Other TypeScript permission libraries (CASL, permix, Kilpi, `@zap-studio/permit`) return booleans from string keys and stop at the server or the UI. Hosted PDPs (Cerbos, Permit.io, OpenFGA, SpiceDB) put a network call on every check. PermDock is an embedded, typed library with one decision object across UI, API, SQL, RLS and agent approvals. Read the [comparison](https://permdock.com/docs/comparison).
|
|
258
317
|
|
|
259
318
|
## For AI agents
|
|
260
319
|
|
|
@@ -263,8 +322,8 @@ npx skills add ScaleDockHQ/PermDock # the permdock, permdock-wire, permdock-au
|
|
|
263
322
|
permdock skills # the same skills, offline, from node_modules/permdock/skills
|
|
264
323
|
```
|
|
265
324
|
|
|
266
|
-
Claude Code users can add the plugin marketplace instead: `/plugin marketplace add ScaleDockHQ/permdock`. Every docs page is served as Markdown,
|
|
325
|
+
Claude Code users can add the plugin marketplace instead: `/plugin marketplace add ScaleDockHQ/permdock`. Every docs page is served as Markdown, with `llms.txt`, `llms-full.txt` and a docs MCP server at `https://permdock.com/mcp`. Read [for AI agents](https://permdock.com/docs/for-ai-agents).
|
|
267
326
|
|
|
268
327
|
## License
|
|
269
328
|
|
|
270
|
-
[MIT](https://github.com/ScaleDockHQ/
|
|
329
|
+
[MIT](https://github.com/ScaleDockHQ/PermDock/blob/main/LICENSE) © 2026 ScaleDockHQ. Report vulnerabilities privately through [GitHub security advisories](https://github.com/ScaleDockHQ/PermDock/security/advisories/new).
|
package/dist/a2a/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { f as ApprovalStore } from "../types-
|
|
4
|
-
import {
|
|
1
|
+
import { C as Policy, Nr as Principal, Tr as AuthorizationDetail } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { f as ApprovalStore } from "../types-vKyAMtcX.js";
|
|
4
|
+
import { a as ProblemDetails } from "../errors-DAqevpNk.js";
|
|
5
|
+
import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
|
|
5
6
|
//#region src/a2a/types.d.ts
|
|
6
7
|
type A2aAuth = {
|
|
7
8
|
readonly clientId?: string;
|
|
@@ -138,28 +139,18 @@ type A2aTaskOutcome = {
|
|
|
138
139
|
readonly ok: true;
|
|
139
140
|
} | {
|
|
140
141
|
readonly ok: false;
|
|
141
|
-
readonly status: 401 | 403;
|
|
142
|
+
readonly status: 401 | 403 | 429 | 503;
|
|
142
143
|
readonly state: "failed" | "input-required";
|
|
143
144
|
readonly problem: ProblemDetails;
|
|
144
145
|
readonly wwwAuthenticate?: string;
|
|
145
146
|
};
|
|
146
|
-
type A2aPermDockOptions<TUser = unknown> = {
|
|
147
|
+
type A2aPermDockOptions<TUser = unknown> = InstanceOptions & {
|
|
147
148
|
readonly subject: (auth: A2aAuth) => TUser | Promise<TUser>;
|
|
148
149
|
readonly card: A2aCardInfo;
|
|
149
150
|
readonly securitySchemes: Readonly<Record<string, A2aSecurityScheme>>;
|
|
150
151
|
readonly skills: Readonly<Record<string, A2aSkillConfig>>;
|
|
151
152
|
readonly tenant?: string | ((auth: A2aAuth) => string | undefined | Promise<string | undefined>);
|
|
152
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
153
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
154
|
-
readonly relations?: RelationSource;
|
|
155
|
-
readonly entitlements?: EntitlementSource;
|
|
156
|
-
readonly customRoles?: RoleSource;
|
|
157
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
158
|
-
readonly policies?: PolicySource;
|
|
159
153
|
readonly store?: ApprovalStore;
|
|
160
|
-
readonly sink?: DecisionSink;
|
|
161
|
-
readonly limits?: LimitStore;
|
|
162
|
-
readonly snapshots?: SnapshotSource;
|
|
163
154
|
};
|
|
164
155
|
type A2aPermDock = {
|
|
165
156
|
readonly agentCard: () => A2aAgentCard;
|
package/dist/a2a/index.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { t as compact } from "../compact-y6vfu2_f.js";
|
|
2
|
-
import { n as PermDockDeniedError, t as PermDockApprovalRequiredError } from "../errors-
|
|
3
|
-
import {
|
|
2
|
+
import { n as PermDockDeniedError, t as PermDockApprovalRequiredError } from "../errors-Cz5zn0mW.js";
|
|
3
|
+
import { t as canonicalJson } from "../canonical-json-DemiK4Vp.js";
|
|
4
4
|
import { t as bytesToBase64Url } from "../sha256-BO0swRXL.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { i as scopesReaching, r as challengeScope } from "../permdock-CzqXjCpU.js";
|
|
6
|
+
import { n as resourceRef } from "../resource-ref-CaS9yVPi.js";
|
|
7
|
+
import { t as mayUse } from "../may-use-DndQ5tQ-.js";
|
|
8
|
+
import { d as wwwAuthenticate, n as bearerChallenge } from "../problem-B43ztKIm.js";
|
|
9
|
+
import { t as instanceOptions } from "../instance-options-Dhhcnm3y.js";
|
|
10
|
+
import { n as createAgentKernel } from "../kernel-GSQnMz3O.js";
|
|
9
11
|
//#region src/a2a/create.ts
|
|
10
|
-
function isRecord(value) {
|
|
11
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
12
|
-
}
|
|
13
12
|
function firstScheme(options) {
|
|
14
13
|
return Object.keys(options.securitySchemes)[0];
|
|
15
14
|
}
|
|
@@ -88,24 +87,8 @@ function actorOf(auth) {
|
|
|
88
87
|
kind: "oauth-client"
|
|
89
88
|
} : void 0;
|
|
90
89
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
return await tenant(auth);
|
|
95
|
-
} catch {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
function hasScope(auth, scope) {
|
|
100
|
-
return auth.scopes?.includes(scope) === true;
|
|
101
|
-
}
|
|
102
|
-
function resourceRef(permission, data) {
|
|
103
|
-
if (!isRecord(data)) return { type: permission.resource };
|
|
104
|
-
const id = data["id"];
|
|
105
|
-
return typeof id === "string" || typeof id === "number" ? {
|
|
106
|
-
type: permission.resource,
|
|
107
|
-
id: String(id)
|
|
108
|
-
} : { type: permission.resource };
|
|
90
|
+
function hasScope(auth, scopes) {
|
|
91
|
+
return scopes.some((scope) => auth.scopes?.includes(scope) === true);
|
|
109
92
|
}
|
|
110
93
|
const LOAD_FAILED = {
|
|
111
94
|
outcome: "denied",
|
|
@@ -115,20 +98,29 @@ const LOAD_FAILED = {
|
|
|
115
98
|
}],
|
|
116
99
|
alternatives: []
|
|
117
100
|
};
|
|
118
|
-
|
|
119
|
-
|
|
101
|
+
const NO_SUBJECT = {
|
|
102
|
+
principal: null,
|
|
103
|
+
context: {}
|
|
104
|
+
};
|
|
105
|
+
function taskStatus(status) {
|
|
106
|
+
return status === 401 || status === 429 || status === 503 ? status : 403;
|
|
107
|
+
}
|
|
108
|
+
function deniedOutcome(decision, permission, data, subject) {
|
|
109
|
+
const problem = new PermDockDeniedError({
|
|
110
|
+
decision,
|
|
111
|
+
permission: permission.key,
|
|
112
|
+
scope: permission.scope,
|
|
113
|
+
resource: resourceRef(permission, data),
|
|
114
|
+
subject: subject ?? NO_SUBJECT,
|
|
115
|
+
message: `${permission.key} denied.`
|
|
116
|
+
}).toProblemDetails();
|
|
117
|
+
return compact({
|
|
120
118
|
ok: false,
|
|
121
|
-
status:
|
|
119
|
+
status: taskStatus(problem.status),
|
|
122
120
|
state: "failed",
|
|
123
|
-
problem
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
scope: permission.scope,
|
|
127
|
-
resource: resourceRef(permission, data),
|
|
128
|
-
subject: permdock.subject,
|
|
129
|
-
message: `${permission.key} denied.`
|
|
130
|
-
}).toProblemDetails()
|
|
131
|
-
};
|
|
121
|
+
problem,
|
|
122
|
+
wwwAuthenticate: wwwAuthenticate(decision, permission, false)
|
|
123
|
+
});
|
|
132
124
|
}
|
|
133
125
|
function approvalOutcome(decision, permission, data) {
|
|
134
126
|
return {
|
|
@@ -158,51 +150,44 @@ async function signCard(card, signPayload) {
|
|
|
158
150
|
}]
|
|
159
151
|
};
|
|
160
152
|
}
|
|
161
|
-
function missingScope(permission) {
|
|
153
|
+
function missingScope(permission, scope) {
|
|
162
154
|
return {
|
|
163
155
|
ok: false,
|
|
164
156
|
status: 401,
|
|
165
157
|
state: "failed",
|
|
166
158
|
problem: {
|
|
167
|
-
type: "https://permdock.
|
|
159
|
+
type: "https://permdock.com/problems/unauthenticated",
|
|
168
160
|
title: "Insufficient scope",
|
|
169
161
|
status: 401,
|
|
170
|
-
detail: `insufficient_scope: ${
|
|
162
|
+
detail: `insufficient_scope: ${scope}`,
|
|
171
163
|
permission: permission.key,
|
|
172
|
-
scope
|
|
164
|
+
scope
|
|
173
165
|
},
|
|
174
166
|
wwwAuthenticate: bearerChallenge({
|
|
175
167
|
error: "insufficient_scope",
|
|
176
|
-
scopes: [
|
|
168
|
+
scopes: [scope]
|
|
177
169
|
})
|
|
178
170
|
};
|
|
179
171
|
}
|
|
180
172
|
function createPermDock(policy, options) {
|
|
181
173
|
for (const [id, config] of Object.entries(options.skills)) if (config.permission.kind === "instance" && config.data === void 0) throw new TypeError(`PermDock: A2A skill '${id}' checks ${config.permission.key} on a row and needs a data loader; the task body is never used as the row`);
|
|
182
|
-
const
|
|
183
|
-
|
|
174
|
+
const kernel = createAgentKernel(policy, compact({
|
|
175
|
+
subject: options.subject,
|
|
176
|
+
actor: actorOf,
|
|
177
|
+
delegation: delegationOf,
|
|
178
|
+
tenant: options.tenant,
|
|
179
|
+
store: options.store,
|
|
180
|
+
adapter: "a2a",
|
|
181
|
+
...instanceOptions(options)
|
|
182
|
+
}));
|
|
183
|
+
const agentCard = () => cardOf(options, publicSkills(options));
|
|
184
|
+
const extendedAgentCard = async (auth) => {
|
|
185
|
+
let permdock;
|
|
184
186
|
try {
|
|
185
|
-
|
|
187
|
+
permdock = await kernel.instance(auth);
|
|
186
188
|
} catch {
|
|
187
|
-
|
|
189
|
+
return cardOf(options, []);
|
|
188
190
|
}
|
|
189
|
-
const tenant = await resolveTenant(options.tenant, auth);
|
|
190
|
-
return createPermDock$1(policy, user, compact({
|
|
191
|
-
tenant,
|
|
192
|
-
actor: actorOf(auth),
|
|
193
|
-
delegation: delegationOf(auth),
|
|
194
|
-
memberships: options.memberships,
|
|
195
|
-
relations: options.relations,
|
|
196
|
-
entitlements: options.entitlements,
|
|
197
|
-
customRoles: options.customRoles,
|
|
198
|
-
policies: options.policies,
|
|
199
|
-
sink: options.sink,
|
|
200
|
-
limits: options.limits
|
|
201
|
-
}));
|
|
202
|
-
};
|
|
203
|
-
const agentCard = () => cardOf(options, publicSkills(options));
|
|
204
|
-
const extendedAgentCard = async (auth) => {
|
|
205
|
-
const permdock = await instanceFor(auth);
|
|
206
191
|
const scheme = firstScheme(options);
|
|
207
192
|
const skills = [];
|
|
208
193
|
for (const [id, config] of Object.entries(options.skills)) if (mayUse(permdock, config.permission)) skills.push(skillOf(id, config, scheme));
|
|
@@ -216,46 +201,22 @@ function createPermDock(policy, options) {
|
|
|
216
201
|
status: 403,
|
|
217
202
|
state: "failed",
|
|
218
203
|
problem: {
|
|
219
|
-
type: "https://permdock.
|
|
204
|
+
type: "https://permdock.com/problems/denied",
|
|
220
205
|
title: "Permission denied",
|
|
221
206
|
status: 403,
|
|
222
207
|
detail: "unknown skill"
|
|
223
208
|
}
|
|
224
209
|
};
|
|
225
|
-
if (!hasScope(auth, config.permission
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
return deniedOutcome(LOAD_FAILED, config.permission, void 0, permdock);
|
|
233
|
-
}
|
|
234
|
-
if (config.permission.kind === "instance" && (data === null || data === void 0)) return deniedOutcome(LOAD_FAILED, config.permission, void 0, permdock);
|
|
235
|
-
}
|
|
236
|
-
let decision;
|
|
237
|
-
try {
|
|
238
|
-
const raw = permdock.decide(config.permission, data, compact({
|
|
239
|
-
source: "adapter",
|
|
240
|
-
adapter: "a2a",
|
|
241
|
-
trusted: false,
|
|
242
|
-
boundary: "tool-args"
|
|
243
|
-
}));
|
|
244
|
-
decision = await resumeDecision({
|
|
245
|
-
decision: raw,
|
|
246
|
-
permission: config.permission,
|
|
247
|
-
subject: permdock.subject,
|
|
248
|
-
store: options.store,
|
|
249
|
-
resource: resourceRef(config.permission, data),
|
|
250
|
-
adapter: "a2a",
|
|
251
|
-
token: auth.extra?.approval ?? await storedApprovalToken(options.store, raw, false)
|
|
252
|
-
});
|
|
253
|
-
} catch {
|
|
254
|
-
return deniedOutcome(LOAD_FAILED, config.permission, data, permdock);
|
|
255
|
-
}
|
|
210
|
+
if (!hasScope(auth, scopesReaching(policy, config.permission))) return missingScope(config.permission, challengeScope(policy, config.permission));
|
|
211
|
+
const checked = await kernel.check(compact({
|
|
212
|
+
permission: config.permission,
|
|
213
|
+
data: config.data
|
|
214
|
+
}), task, auth, compact({ resumeToken: auth.extra?.approval }));
|
|
215
|
+
if (!checked.ok) return deniedOutcome(LOAD_FAILED, config.permission, void 0, checked.permdock?.subject);
|
|
216
|
+
const { decision, data, permdock } = checked;
|
|
256
217
|
switch (decision.outcome) {
|
|
257
218
|
case "granted": return { ok: true };
|
|
258
|
-
case "denied": return deniedOutcome(decision, config.permission, data, permdock);
|
|
219
|
+
case "denied": return deniedOutcome(decision, config.permission, data, permdock.subject);
|
|
259
220
|
case "approval-required": return approvalOutcome(decision, config.permission, data);
|
|
260
221
|
default: return decision;
|
|
261
222
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { n as isActor } from "./subject-C6dLxqHU.js";
|
|
2
|
+
//#region src/core/adapter-context.ts
|
|
3
|
+
/** Resolves an adapter `tenant` option against its framework context; a throw is no tenant. */
|
|
4
|
+
async function tenantScope(option, context) {
|
|
5
|
+
if (option === void 0 || typeof option === "string") return { tenant: option };
|
|
6
|
+
try {
|
|
7
|
+
return { tenant: await option(context) };
|
|
8
|
+
} catch {
|
|
9
|
+
return { tenant: void 0 };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Resolves an adapter `actor` option; anything but an `Actor`, or a throw, is no actor. */
|
|
13
|
+
async function actorFrom(option, context) {
|
|
14
|
+
if (option === void 0) return;
|
|
15
|
+
try {
|
|
16
|
+
const resolved = await option(context);
|
|
17
|
+
return isActor(resolved) ? resolved : void 0;
|
|
18
|
+
} catch {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { tenantScope as n, actorFrom as t };
|
package/dist/ai-sdk/index.d.ts
CHANGED
|
@@ -1,31 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { f as ApprovalStore } from "../types-
|
|
4
|
-
import { t as
|
|
1
|
+
import { C as Policy, Nr as Principal, kr as Delegation } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { f as ApprovalStore } from "../types-vKyAMtcX.js";
|
|
4
|
+
import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
|
|
5
|
+
import { t as ToolMap } from "../types-Bvc4oWT6.js";
|
|
5
6
|
//#region src/ai-sdk/create.d.ts
|
|
6
7
|
type AiSdkContext = {
|
|
7
8
|
readonly runtimeContext?: unknown;
|
|
8
9
|
readonly permdockApproval?: string;
|
|
9
10
|
readonly [key: string]: unknown;
|
|
10
11
|
};
|
|
11
|
-
type AiSdkPermDockOptions<TUser = unknown> = {
|
|
12
|
+
type AiSdkPermDockOptions<TUser = unknown> = InstanceOptions & {
|
|
12
13
|
readonly subject: (context: AiSdkContext) => TUser | Promise<TUser>;
|
|
13
14
|
readonly actor?: (context: AiSdkContext) => unknown;
|
|
14
15
|
readonly delegation?: (context: AiSdkContext) => Delegation | undefined | Promise<Delegation | undefined>;
|
|
15
16
|
readonly tenant?: string | ((context: AiSdkContext) => string | undefined | Promise<string | undefined>);
|
|
16
17
|
readonly tools: ToolMap;
|
|
17
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
18
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
19
|
-
readonly relations?: RelationSource;
|
|
20
|
-
readonly entitlements?: EntitlementSource;
|
|
21
|
-
readonly customRoles?: RoleSource;
|
|
22
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
23
|
-
readonly policies?: PolicySource;
|
|
24
18
|
readonly store?: ApprovalStore;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Tools the `tools` map does not bind to a permission. `'deny'` (default):
|
|
21
|
+
* the middleware hides them and `toolApproval` denies them. `'allow'`: they
|
|
22
|
+
* pass through both, to the application's own `toolApproval`.
|
|
23
|
+
*/
|
|
24
|
+
readonly unmapped?: "deny" | "allow";
|
|
28
25
|
};
|
|
26
|
+
/** What an AI SDK tool approval function may return; `undefined` is `not-applicable`. */
|
|
27
|
+
type ToolApprovalResult = ToolApprovalStatus | undefined | "not-applicable" | "denied" | "user-approval" | {
|
|
28
|
+
readonly type: "not-applicable";
|
|
29
|
+
} | {
|
|
30
|
+
readonly type: "approved";
|
|
31
|
+
readonly reason?: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly type: "denied";
|
|
34
|
+
readonly reason?: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly type: "user-approval";
|
|
37
|
+
readonly reason?: string;
|
|
38
|
+
};
|
|
39
|
+
/** An application's own tool approval function, in the AI SDK's generic form. */
|
|
40
|
+
type AppToolApproval = (call: ToolApprovalCall) => ToolApprovalResult | PromiseLike<ToolApprovalResult>;
|
|
29
41
|
type ToolApprovalStatus = "approved" | {
|
|
30
42
|
readonly type: "denied";
|
|
31
43
|
readonly reason: string;
|
|
@@ -65,10 +77,19 @@ type LanguageModelMiddleware = {
|
|
|
65
77
|
};
|
|
66
78
|
type AiSdkPermDock = {
|
|
67
79
|
readonly toolApproval: (call: ToolApprovalCall) => Promise<ToolApprovalStatus>;
|
|
80
|
+
/**
|
|
81
|
+
* PermDock's `toolApproval` followed by the application's own: `app` is
|
|
82
|
+
* asked only for a call PermDock grants (or an unmapped tool under
|
|
83
|
+
* `unmapped: 'allow'`), and its answer is returned as is, `undefined`
|
|
84
|
+
* included (not applicable, as the AI SDK reads it). An answer that is not
|
|
85
|
+
* a tool approval result denies. PermDock's denials and approval requests
|
|
86
|
+
* come first.
|
|
87
|
+
*/
|
|
88
|
+
readonly composeToolApproval: (app: AppToolApproval) => (call: ToolApprovalCall) => Promise<ToolApprovalResult>;
|
|
68
89
|
/** Hides tools the subject in `context` can never use, before the model sees them. */
|
|
69
90
|
readonly capabilityMiddleware: (context: AiSdkContext) => LanguageModelMiddleware;
|
|
70
91
|
readonly needsApproval: (permission: Permission) => (input: unknown, options?: NeedsApprovalOptions) => Promise<boolean>;
|
|
71
92
|
};
|
|
72
93
|
export declare function createPermDock<TUser, TPrincipal extends Principal = Principal>(policy: Policy<TUser, TPrincipal>, options: AiSdkPermDockOptions<TUser>): AiSdkPermDock;
|
|
73
94
|
//#endregion
|
|
74
|
-
export type { AiSdkContext, AiSdkPermDock, AiSdkPermDockOptions, LanguageModelMiddleware, NeedsApprovalOptions, ToolApprovalCall, ToolApprovalStatus };
|
|
95
|
+
export type { AiSdkContext, AiSdkPermDock, AiSdkPermDockOptions, AppToolApproval, LanguageModelMiddleware, NeedsApprovalOptions, ToolApprovalCall, ToolApprovalResult, ToolApprovalStatus };
|