permdock 0.0.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 +327 -1
- package/dist/a2a/index.d.ts +169 -0
- package/dist/a2a/index.js +232 -0
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +95 -0
- package/dist/ai-sdk/index.js +154 -0
- package/dist/approval-required-TzNB9oQA.js +6 -0
- package/dist/approvals/index.d.ts +3 -0
- package/dist/approvals/index.js +5 -0
- package/dist/approvals-DbYAuNkG.js +224 -0
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/arazzo-BAgw9ap6.js +70 -0
- package/dist/arazzo-cmvX2jDe.js +54 -0
- package/dist/authzen/index.d.ts +39 -0
- package/dist/authzen/index.js +302 -0
- package/dist/better-auth/index.d.ts +109 -0
- package/dist/better-auth/index.js +344 -0
- 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/budget-JqcRqyhK.d.ts +11 -0
- package/dist/budget-NbEtbJC_.js +11 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/capability-4qPdO9gk.js +173 -0
- package/dist/capability-Dq43tT1u.d.ts +99 -0
- package/dist/catalog/index.d.ts +12 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/catalog-doc-Dsc9y7sd.js +309 -0
- package/dist/catalog-h2tlKFkq.js +48 -0
- package/dist/catalog-path-CnI0XTFK.js +12 -0
- package/dist/catalog-z8q6bi_r.js +55 -0
- package/dist/claude-agent/index.d.ts +72 -0
- package/dist/claude-agent/index.js +77 -0
- package/dist/clerk/index.d.ts +65 -0
- package/dist/clerk/index.js +301 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +20 -0
- package/dist/cli/index.d.ts +46 -0
- package/dist/cli/index.js +5 -0
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +90 -0
- package/dist/cloud/index.js +404 -0
- package/dist/cloud-BGhHS-lY.js +50 -0
- package/dist/cloud-Bo3e9Ak3.js +118 -0
- package/dist/collect-DDDv_ESs.js +502 -0
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/commands-DWOrSQic.js +97 -0
- package/dist/compact-y6vfu2_f.js +19 -0
- package/dist/compare-pfyVnBjE.js +12 -0
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/compile-Ba4blROR.js +613 -0
- 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-CU8MQxRi.js +194 -0
- package/dist/context-Ttp0ekMT.js +82 -0
- package/dist/convex/index.d.ts +45 -0
- package/dist/convex/index.js +65 -0
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.js +253 -0
- package/dist/credential-8P81ff4u.js +306 -0
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/describe-B_gVZEVi.js +94 -0
- package/dist/describe-PdoqESvg.d.ts +36 -0
- package/dist/diff-B8Tunc3o.js +451 -0
- package/dist/diff-CzqLxZ77.js +48 -0
- package/dist/digest-B3kc_PgQ.d.ts +19 -0
- package/dist/digest-BI-6aa6d.js +27 -0
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/doctor-rOr-4ZfS.js +53 -0
- package/dist/drizzle/index.d.ts +73 -0
- package/dist/drizzle/index.js +160 -0
- package/dist/duration-xK2jGFVc.js +25 -0
- package/dist/elysia/index.d.ts +49 -0
- package/dist/elysia/index.js +59 -0
- package/dist/errors-CWfoNg9N.js +47 -0
- package/dist/errors-Cz5zn0mW.js +123 -0
- package/dist/errors-DAqevpNk.d.ts +125 -0
- package/dist/errors-DRnGZHzF.js +30 -0
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/evaluations-tz6D9A2G.js +461 -0
- package/dist/eve/index.d.ts +86 -0
- package/dist/eve/index.js +176 -0
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +23 -0
- package/dist/express/index.js +78 -0
- package/dist/fastify/index.d.ts +33 -0
- package/dist/fastify/index.js +92 -0
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/files-DWUN9PzI.js +125 -0
- package/dist/fixtures-ht28Cplr.js +67 -0
- package/dist/freeze-CrU8nQeX.js +60 -0
- package/dist/from-snapshot-C3sHpZNS.js +569 -0
- package/dist/generate-CH7ThJ14.js +173 -0
- package/dist/grantee-Cv5Sogfv.js +602 -0
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/headers-BZSDieNT.js +6 -0
- package/dist/headers-Cf-zWvsO.d.ts +6 -0
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +48 -0
- package/dist/hono/index.js +99 -0
- package/dist/hosted-DJQw46hn.js +266 -0
- package/dist/http-BIhmLfCc.js +95 -0
- package/dist/http-DPuDaChb.d.ts +13 -0
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/index-A0YNL8jZ.d.ts +177 -0
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/index-D3vbkoSI.d.ts +483 -0
- package/dist/index-D6_cSa1z.d.ts +201 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +26 -0
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/json-schema-BsAflUGW.js +106 -0
- package/dist/jwt/index.d.ts +91 -0
- package/dist/jwt/index.js +590 -0
- package/dist/kernel-GSQnMz3O.js +208 -0
- package/dist/kysely/index.d.ts +78 -0
- package/dist/kysely/index.js +129 -0
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/load-DhWEB9P1.js +75 -0
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/load-jose-BL6LH4bL.js +11 -0
- package/dist/lru-8q4WZjBV.js +28 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/map-AcxK9o_D.js +147 -0
- package/dist/map-claims-Z4QZOiFF.js +369 -0
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/markers-B0hYLvMD.js +60 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +159 -0
- package/dist/mcp/index.js +603 -0
- package/dist/nest/index.d.ts +75 -0
- package/dist/nest/index.js +261 -0
- package/dist/next/client.d.ts +23 -0
- package/dist/next/client.js +33 -0
- package/dist/next/index.d.ts +93 -0
- package/dist/next/index.js +180 -0
- package/dist/next/plugin.d.ts +14 -0
- package/dist/next/plugin.js +33 -0
- package/dist/node/index.d.ts +24 -0
- package/dist/node/index.js +34 -0
- package/dist/openai/index.d.ts +62 -0
- package/dist/openai/index.js +92 -0
- package/dist/openapi/index.d.ts +176 -0
- package/dist/openapi/index.js +3 -0
- package/dist/openapi-Bbg4wGVL.js +164 -0
- package/dist/openapi-BqRBvAng.js +538 -0
- package/dist/openapi-CqqEbHsL.js +250 -0
- package/dist/openapi-import-cmwetbzw.js +5959 -0
- package/dist/openapi-schema--ARjyfQr.js +6902 -0
- package/dist/orpc/index.d.ts +51 -0
- package/dist/orpc/index.js +145 -0
- package/dist/otel/index.d.ts +13 -0
- package/dist/otel/index.js +202 -0
- package/dist/package-root-zGkxO3oN.js +30 -0
- 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 +22 -0
- package/dist/pdp/index.js +682 -0
- package/dist/peer-BOr_kJE1.js +31 -0
- package/dist/permdock-CzqXjCpU.js +3471 -0
- package/dist/permissions-CDgvKG5L.d.ts +52 -0
- package/dist/permissions-CpZrivYv.js +142 -0
- package/dist/permissions-DVoF6dMt.js +662 -0
- package/dist/permissions-DttnqqxC.d.ts +214 -0
- package/dist/pins-8ILTftC9.js +12 -0
- package/dist/policy-CFZAr_Al.d.ts +2252 -0
- package/dist/policy-D8UFyERw.d.ts +20 -0
- package/dist/policy-xyWg7QdR.js +1122 -0
- 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 +136 -0
- package/dist/prisma/index.js +455 -0
- package/dist/problem-B43ztKIm.js +191 -0
- package/dist/problem-details-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/prompt-CXYhLfsS.js +32 -0
- package/dist/protected-CNsMzrVd.d.ts +27 -0
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/provider-Cjr62YMV.d.ts +6 -0
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.js +43 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +7 -0
- package/dist/react/provider-client.d.ts +2 -0
- package/dist/react/provider-client.js +3 -0
- package/dist/react-native/index.d.ts +198 -0
- package/dist/react-native/index.js +696 -0
- package/dist/refs-KYb4ntaz.js +91 -0
- package/dist/relations-cjOL01hZ.js +505 -0
- 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/revocations-Cy06JNx2.d.ts +21 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/rls-CEvs64Kj.js +238 -0
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/rls-graph-pc9fuXYm.js +435 -0
- package/dist/rls-import-D8F7j35Q.js +943 -0
- package/dist/rls-migrate-7wikfrVI.js +367 -0
- 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-Dt35czLy.d.ts +40 -0
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/run-YXCJDNYk.js +174 -0
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/saas-Bj_FFkjN.js +1203 -0
- package/dist/schema-D3MnDMxa.js +300 -0
- package/dist/scim/index.d.ts +2 -0
- package/dist/scim/index.js +2 -0
- package/dist/scim-BFGBBAqR.js +1445 -0
- package/dist/scopes-CVdPrWN-.js +239 -0
- package/dist/server/index.d.ts +134 -0
- package/dist/server/index.js +11 -0
- package/dist/server-DlZ28Oz5.js +268 -0
- package/dist/sha256-BO0swRXL.js +150 -0
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/sink-Bd9PSyfq.js +141 -0
- package/dist/sink-Gs6TTVa-.d.ts +104 -0
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/skills-JaymNCdK.js +56 -0
- package/dist/snapshot-Enxd0n-s.js +975 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +93 -0
- package/dist/solid/index.js +188 -0
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/sql-xdg5f4Fi.js +27 -0
- package/dist/src-CSbUiozF.js +568 -0
- package/dist/ssf/index.d.ts +4 -0
- package/dist/ssf/index.js +596 -0
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/store-D_pjn91-.d.ts +36 -0
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/stores-4_sqiOA1.js +87 -0
- package/dist/stores-DVR5NHLE.d.ts +52 -0
- package/dist/stream-DDpvynSB.js +66 -0
- package/dist/stream-DlvG2hs-.d.ts +12 -0
- package/dist/style-CTm1AXDT.js +22 -0
- package/dist/subject-C6dLxqHU.js +24 -0
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +183 -0
- package/dist/supabase/index.js +5 -0
- package/dist/supabase/middleware.d.ts +82 -0
- package/dist/supabase/middleware.js +102 -0
- package/dist/supabase-CwafwxxF.js +83 -0
- package/dist/supabase-DTBaC20O.js +774 -0
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/supabase-hook-BuxLQLpU.js +1814 -0
- 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 +40 -0
- package/dist/svelte/index.d.ts +13 -0
- package/dist/svelte/index.js +107 -0
- package/dist/svelte/runtime.d.ts +7 -0
- package/dist/svelte/runtime.js +4 -0
- package/dist/svelte/source.d.ts +13 -0
- package/dist/svelte/source.js +11 -0
- package/dist/terminal/index.d.ts +163 -0
- package/dist/terminal/index.js +833 -0
- package/dist/testing/index.d.ts +745 -0
- package/dist/testing/index.js +3672 -0
- package/dist/testing/saas/index.d.ts +194 -0
- package/dist/testing/saas/index.js +3 -0
- package/dist/testing/saas/permissions.d.ts +2 -0
- package/dist/testing/saas/permissions.js +2 -0
- package/dist/text-diff-BdkkYSbi.js +15 -0
- package/dist/thenable-okc2xDsj.js +10 -0
- package/dist/timeout-D51niuQP.js +8 -0
- package/dist/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +61 -0
- package/dist/trpc/index.js +122 -0
- package/dist/types-9AWO9EGt.d.ts +197 -0
- package/dist/types-BPxgszlT.d.ts +550 -0
- package/dist/types-BVyImy5I.d.ts +120 -0
- package/dist/types-Bvc4oWT6.d.ts +9 -0
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/types-Dnemwd77.d.ts +183 -0
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/types-vKyAMtcX.d.ts +157 -0
- package/dist/types-vNSDF7Dq.d.ts +66 -0
- package/dist/types-yF5LmQVD.d.ts +306 -0
- package/dist/unplugin/index.d.ts +7 -0
- package/dist/unplugin/index.js +31 -0
- package/dist/usage-D07N9QJ3.js +42 -0
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/usage-DG1oeCca.js +693 -0
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -0
- package/dist/validity-uOp8UpYn.js +245 -0
- package/dist/verifier-BxBo6I44.js +466 -0
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/vocabulary-DA8a8zif.d.ts +56 -0
- package/dist/vue/index.d.ts +79 -0
- package/dist/vue/index.js +196 -0
- package/dist/watch-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.js +128 -0
- package/dist/webmcp/index.d.ts +75 -0
- package/dist/webmcp/index.js +307 -0
- package/package.json +450 -5
- package/rulesets/permdock.yaml +29 -0
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +535 -0
- package/schemas/openapi/oas-3.1.json +1298 -0
- package/schemas/openapi/oas-3.2.json +1516 -0
- package/schemas/openapi/overlay-1.1.json +79 -0
- package/schemas/supabase-claims-v1.json +144 -0
- package/schemas/supabase-manifest-v1.json +361 -0
- package/skills/permdock/SKILL.md +66 -0
- package/skills/permdock-agents/SKILL.md +77 -0
- package/skills/permdock-agents/references/runtimes.md +213 -0
- package/skills/permdock-approvals/SKILL.md +80 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
- package/skills/permdock-audit/SKILL.md +67 -0
- package/skills/permdock-credentials/SKILL.md +55 -0
- package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
- package/skills/permdock-data/SKILL.md +57 -0
- package/skills/permdock-data/references/queries-and-rls.md +62 -0
- package/skills/permdock-data/references/relationships.md +67 -0
- package/skills/permdock-tenancy/SKILL.md +80 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
- package/skills/permdock-wire/SKILL.md +116 -0
- package/skills/permdock-wire/references/adapters.md +492 -0
- package/skills/permdock-wire/references/policy-options.md +45 -0
package/README.md
CHANGED
|
@@ -1,3 +1,329 @@
|
|
|
1
1
|
# permdock
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Typed permissions for TypeScript apps, APIs, databases and AI agents.**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/permdock)
|
|
6
|
+
[](https://github.com/ScaleDockHQ/PermDock/blob/main/LICENSE)
|
|
7
|
+
[](https://github.com/ScaleDockHQ/PermDock/actions)
|
|
8
|
+

|
|
9
|
+

|
|
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, Next.js, Hono, tRPC, MCP servers and agent runtimes, and compile the same conditions to SQL `where` clauses and Postgres Row Level Security.
|
|
12
|
+
|
|
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)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pnpm add permdock
|
|
17
|
+
```
|
|
18
|
+
|
|
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.
|
|
20
|
+
|
|
21
|
+
## One definition, one decision
|
|
22
|
+
|
|
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
|
+
|
|
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.
|
|
32
|
+
|
|
33
|
+
## Quick start
|
|
34
|
+
|
|
35
|
+
### 1. Define permissions
|
|
36
|
+
|
|
37
|
+
Importable everywhere: server, client, React Native, MCP, tests.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// src/permissions.ts
|
|
41
|
+
import { definePermissions, defineRoles, resource } from "permdock";
|
|
42
|
+
import { z } from "zod"; // or valibot / arktype / effect
|
|
43
|
+
|
|
44
|
+
const Post = z.object({
|
|
45
|
+
id: z.string(),
|
|
46
|
+
authorId: z.string(),
|
|
47
|
+
orgId: z.string(),
|
|
48
|
+
published: z.boolean(),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export const permissions = definePermissions({
|
|
52
|
+
post: resource(Post, {
|
|
53
|
+
id: "id", // identity field: cache keys, filter, RLS
|
|
54
|
+
actions: ["read", "update", "delete", "publish"], // take an instance
|
|
55
|
+
collection: ["create", "list"], // do not
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
export const roles = defineRoles({ member: {}, admin: { on: "tenant" } });
|
|
60
|
+
|
|
61
|
+
permissions.post.update.key; // 'post.update'
|
|
62
|
+
```
|
|
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
|
+
|
|
66
|
+
### 2. Write the policy
|
|
67
|
+
|
|
68
|
+
Server-only. Roles are data; conditions are a portable JSON tree.
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
// src/policy.ts
|
|
72
|
+
import { allow, definePolicy, principal, relation, role } from "permdock";
|
|
73
|
+
import { permissions, roles } from "./permissions";
|
|
74
|
+
|
|
75
|
+
const member = role(roles.member, [
|
|
76
|
+
allow(permissions.post.read),
|
|
77
|
+
allow(permissions.post.create),
|
|
78
|
+
allow(permissions.post.update, { to: relation(permissions.post, "author") }),
|
|
79
|
+
allow(permissions.post.delete, {
|
|
80
|
+
where: { authorId: principal.id },
|
|
81
|
+
approval: "human",
|
|
82
|
+
}),
|
|
83
|
+
]);
|
|
84
|
+
|
|
85
|
+
const admin = role(
|
|
86
|
+
roles.admin,
|
|
87
|
+
[...member.grants, allow(permissions.post.delete)],
|
|
88
|
+
{ on: "tenant" },
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
export const policy = definePolicy(
|
|
92
|
+
{ permissions, roles },
|
|
93
|
+
{
|
|
94
|
+
roles: [member, admin],
|
|
95
|
+
scopes: { tenant: { key: "orgId" } },
|
|
96
|
+
principal: (user: User | null) =>
|
|
97
|
+
user && {
|
|
98
|
+
id: user.id,
|
|
99
|
+
roles: user.roles,
|
|
100
|
+
tenant: user.activeOrgId,
|
|
101
|
+
memberships: user.memberships,
|
|
102
|
+
},
|
|
103
|
+
validate: "boundary",
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`subjectFromClerk`, `subjectFromBetterAuth`, `subjectFromSupabase` and `subjectFromJwt` produce `memberships` from the provider you already use. PermDock stores no tenants, teams or memberships.
|
|
109
|
+
|
|
110
|
+
### 3. Decide
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { createPermDock } from "permdock";
|
|
114
|
+
|
|
115
|
+
const permdock = await createPermDock(policy, user); // frozen, request-scoped, never throws
|
|
116
|
+
permdock.can(permissions.post.update, post); // boolean
|
|
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
|
|
119
|
+
permdock.filter(permissions.post.read, posts); // Post[]
|
|
120
|
+
permdock.where(permissions.post.read); // portable condition for Drizzle / Prisma / Kysely / SQL
|
|
121
|
+
permdock.snapshot({ include: [permissions.post] }); // JSON for the client
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Use it where the check happens
|
|
125
|
+
|
|
126
|
+
### React
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
import { PermDockProvider, Protected, usePermission } from "permdock/react";
|
|
130
|
+
|
|
131
|
+
<PermDockProvider snapshot={snapshot} endpoint="/api/permdock">
|
|
132
|
+
<Protected
|
|
133
|
+
permission={permissions.post.update}
|
|
134
|
+
data={post}
|
|
135
|
+
fallback={<Locked />}
|
|
136
|
+
>
|
|
137
|
+
<EditButton />
|
|
138
|
+
</Protected>
|
|
139
|
+
</PermDockProvider>;
|
|
140
|
+
|
|
141
|
+
const { allowed, status } = usePermission(permissions.post.update, post);
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
The same hook names exist in React Native, Vue, Svelte and Solid. Read [building UI](https://permdock.com/docs/concepts/ui).
|
|
145
|
+
|
|
146
|
+
### Next.js 16.3
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
// src/permdock/server.ts
|
|
150
|
+
import { createPermDock } from "permdock/next";
|
|
151
|
+
|
|
152
|
+
export const { getPermDock, requireAccess, permdockHandler } = createPermDock(
|
|
153
|
+
policy,
|
|
154
|
+
{
|
|
155
|
+
subject: async () => getUser(await cookies()),
|
|
156
|
+
},
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
// in a page or Server Action
|
|
160
|
+
await requireAccess({ permission: permissions.post.update, data: post }); // forbidden() / unauthorized() on a denial
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Hono
|
|
164
|
+
|
|
165
|
+
Express, Fastify, Elysia, Nest, Node, tRPC and oRPC have the same shape.
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
import { createPermDock } from "permdock/hono";
|
|
169
|
+
|
|
170
|
+
export const { permdock, protect } = createPermDock(policy, {
|
|
171
|
+
subject: (c) => c.get("user"),
|
|
172
|
+
});
|
|
173
|
+
app.use(permdock());
|
|
174
|
+
app.delete(
|
|
175
|
+
"/posts/:id",
|
|
176
|
+
protect(permissions.post.delete, (c) => loadPost(c.req.param("id"))),
|
|
177
|
+
handler,
|
|
178
|
+
);
|
|
179
|
+
// deny → 403 application/problem+json with permission, denials and alternatives
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### MCP
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
import { createPermDock } from "permdock/mcp";
|
|
186
|
+
|
|
187
|
+
const { protectServer } = createPermDock(policy, {
|
|
188
|
+
subject: (authInfo) => userFrom(authInfo),
|
|
189
|
+
});
|
|
190
|
+
protectServer(server).registerTool(
|
|
191
|
+
"delete_post",
|
|
192
|
+
{
|
|
193
|
+
permission: permissions.post.delete,
|
|
194
|
+
inputSchema,
|
|
195
|
+
data: (args) => loadPost(args.id),
|
|
196
|
+
},
|
|
197
|
+
handler,
|
|
198
|
+
);
|
|
199
|
+
// tools filtered per caller, args validated, refusals carry reasons and alternatives
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### AI SDK
|
|
203
|
+
|
|
204
|
+
The Claude Agent SDK, Eve, the OpenAI Agents SDK, WebMCP and A2A have their own entries with the same tool map.
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
import { createPermDock } from "permdock/ai-sdk";
|
|
208
|
+
|
|
209
|
+
const { toolApproval } = createPermDock(policy, {
|
|
210
|
+
subject: ({ runtimeContext }) => runtimeContext.user,
|
|
211
|
+
actor: ({ runtimeContext }) => ({
|
|
212
|
+
id: runtimeContext.agentId,
|
|
213
|
+
kind: "ai-sdk",
|
|
214
|
+
}),
|
|
215
|
+
tools: {
|
|
216
|
+
delete_post: {
|
|
217
|
+
permission: permissions.post.delete,
|
|
218
|
+
data: (args) => loadPost(args.id),
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
generateText({ model, tools, toolApproval }); // granted → approved, denied → denied, approval-required → user-approval
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Postgres RLS
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
permdock rls generate --target drizzle --dialect supabase # roles × grants → policies
|
|
229
|
+
permdock rls verify --db $DATABASE_URL # can() vs database parity
|
|
230
|
+
```
|
|
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
|
+
|
|
283
|
+
## Works with
|
|
284
|
+
|
|
285
|
+
Any Standard Schema validator: Zod, Valibot, ArkType, Effect Schema. One import path per target:
|
|
286
|
+
|
|
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).
|
|
313
|
+
|
|
314
|
+
## Compared with
|
|
315
|
+
|
|
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).
|
|
317
|
+
|
|
318
|
+
## For AI agents
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
npx skills add ScaleDockHQ/PermDock # the permdock, permdock-wire, permdock-audit and topic skills
|
|
322
|
+
permdock skills # the same skills, offline, from node_modules/permdock/skills
|
|
323
|
+
```
|
|
324
|
+
|
|
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).
|
|
326
|
+
|
|
327
|
+
## License
|
|
328
|
+
|
|
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).
|
|
@@ -0,0 +1,169 @@
|
|
|
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";
|
|
6
|
+
//#region src/a2a/types.d.ts
|
|
7
|
+
type A2aAuth = {
|
|
8
|
+
readonly clientId?: string;
|
|
9
|
+
readonly scopes?: readonly string[];
|
|
10
|
+
readonly extra?: {
|
|
11
|
+
readonly authorizationDetails?: readonly AuthorizationDetail[];
|
|
12
|
+
readonly approval?: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
/** OpenAPI-style input; the card carries the A2A 1.0 union form. */
|
|
16
|
+
type A2aSecurityScheme = {
|
|
17
|
+
readonly type: "oauth2";
|
|
18
|
+
readonly oauth2MetadataUrl: string;
|
|
19
|
+
readonly description?: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly type: "http";
|
|
22
|
+
readonly scheme: string;
|
|
23
|
+
readonly bearerFormat?: string;
|
|
24
|
+
readonly description?: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly type: "openIdConnect";
|
|
27
|
+
readonly openIdConnectUrl: string;
|
|
28
|
+
readonly description?: string;
|
|
29
|
+
} | {
|
|
30
|
+
readonly type: "mutualTLS";
|
|
31
|
+
readonly description?: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly type: "apiKey";
|
|
34
|
+
readonly in: "query" | "header" | "cookie";
|
|
35
|
+
readonly name: string;
|
|
36
|
+
readonly description?: string;
|
|
37
|
+
};
|
|
38
|
+
/** A2A 1.0 `SecurityScheme`: exactly one member set. */
|
|
39
|
+
type A2aWireSecurityScheme = {
|
|
40
|
+
readonly oauth2SecurityScheme: {
|
|
41
|
+
readonly oauth2MetadataUrl: string;
|
|
42
|
+
readonly description?: string;
|
|
43
|
+
};
|
|
44
|
+
} | {
|
|
45
|
+
readonly httpAuthSecurityScheme: {
|
|
46
|
+
readonly scheme: string;
|
|
47
|
+
readonly bearerFormat?: string;
|
|
48
|
+
readonly description?: string;
|
|
49
|
+
};
|
|
50
|
+
} | {
|
|
51
|
+
readonly openIdConnectSecurityScheme: {
|
|
52
|
+
readonly openIdConnectUrl: string;
|
|
53
|
+
readonly description?: string;
|
|
54
|
+
};
|
|
55
|
+
} | {
|
|
56
|
+
readonly mtlsSecurityScheme: {
|
|
57
|
+
readonly description?: string;
|
|
58
|
+
};
|
|
59
|
+
} | {
|
|
60
|
+
readonly apiKeySecurityScheme: {
|
|
61
|
+
readonly location: "query" | "header" | "cookie";
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly description?: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
type A2aCardInfo = {
|
|
67
|
+
readonly name: string;
|
|
68
|
+
/** Required by A2A 1.0; defaults to `name`. */
|
|
69
|
+
readonly description?: string;
|
|
70
|
+
/** The preferred interface URL, the first `supportedInterfaces` entry. */
|
|
71
|
+
readonly url: string;
|
|
72
|
+
readonly version: string;
|
|
73
|
+
/** Defaults to `JSONRPC`. */
|
|
74
|
+
readonly protocolBinding?: "JSONRPC" | "GRPC" | "HTTP+JSON";
|
|
75
|
+
readonly provider?: {
|
|
76
|
+
readonly organization: string;
|
|
77
|
+
readonly url: string;
|
|
78
|
+
};
|
|
79
|
+
readonly documentationUrl?: string;
|
|
80
|
+
readonly iconUrl?: string;
|
|
81
|
+
/** Media types; default `['text/plain']`. */
|
|
82
|
+
readonly defaultInputModes?: readonly string[];
|
|
83
|
+
readonly defaultOutputModes?: readonly string[];
|
|
84
|
+
readonly streaming?: boolean;
|
|
85
|
+
readonly pushNotifications?: boolean;
|
|
86
|
+
};
|
|
87
|
+
type A2aSkillConfig = {
|
|
88
|
+
readonly permission: Permission;
|
|
89
|
+
readonly description?: string;
|
|
90
|
+
/** Required by A2A 1.0; defaults to the permission's resource. */
|
|
91
|
+
readonly tags?: readonly string[];
|
|
92
|
+
readonly data?: (task: unknown) => Promise<unknown>;
|
|
93
|
+
};
|
|
94
|
+
/** A2A 1.0 `SecurityRequirement`: scheme name to required scopes. */
|
|
95
|
+
type A2aSecurityRequirement = {
|
|
96
|
+
readonly schemes: Readonly<Record<string, {
|
|
97
|
+
readonly list: readonly string[];
|
|
98
|
+
}>>;
|
|
99
|
+
};
|
|
100
|
+
type A2aSkill = {
|
|
101
|
+
readonly id: string;
|
|
102
|
+
readonly name: string;
|
|
103
|
+
readonly description: string;
|
|
104
|
+
readonly tags: readonly string[];
|
|
105
|
+
readonly securityRequirements: readonly A2aSecurityRequirement[];
|
|
106
|
+
};
|
|
107
|
+
/** A2A 1.0 `AgentCardSignature`: a JWS over the card without `signatures`. */
|
|
108
|
+
type A2aAgentCardSignature = {
|
|
109
|
+
readonly protected: string;
|
|
110
|
+
readonly signature: string;
|
|
111
|
+
};
|
|
112
|
+
type A2aAgentCard = {
|
|
113
|
+
readonly name: string;
|
|
114
|
+
readonly description: string;
|
|
115
|
+
readonly version: string;
|
|
116
|
+
readonly supportedInterfaces: readonly {
|
|
117
|
+
readonly url: string;
|
|
118
|
+
readonly protocolBinding: string;
|
|
119
|
+
readonly protocolVersion: "1.0";
|
|
120
|
+
}[];
|
|
121
|
+
readonly provider?: {
|
|
122
|
+
readonly organization: string;
|
|
123
|
+
readonly url: string;
|
|
124
|
+
};
|
|
125
|
+
readonly documentationUrl?: string;
|
|
126
|
+
readonly iconUrl?: string;
|
|
127
|
+
readonly capabilities: {
|
|
128
|
+
readonly extendedAgentCard: true;
|
|
129
|
+
readonly streaming?: boolean;
|
|
130
|
+
readonly pushNotifications?: boolean;
|
|
131
|
+
};
|
|
132
|
+
readonly defaultInputModes: readonly string[];
|
|
133
|
+
readonly defaultOutputModes: readonly string[];
|
|
134
|
+
readonly securitySchemes: Readonly<Record<string, A2aWireSecurityScheme>>;
|
|
135
|
+
readonly skills: readonly A2aSkill[];
|
|
136
|
+
readonly signatures?: readonly A2aAgentCardSignature[];
|
|
137
|
+
};
|
|
138
|
+
type A2aTaskOutcome = {
|
|
139
|
+
readonly ok: true;
|
|
140
|
+
} | {
|
|
141
|
+
readonly ok: false;
|
|
142
|
+
readonly status: 401 | 403 | 429 | 503;
|
|
143
|
+
readonly state: "failed" | "input-required";
|
|
144
|
+
readonly problem: ProblemDetails;
|
|
145
|
+
readonly wwwAuthenticate?: string;
|
|
146
|
+
};
|
|
147
|
+
type A2aPermDockOptions<TUser = unknown> = InstanceOptions & {
|
|
148
|
+
readonly subject: (auth: A2aAuth) => TUser | Promise<TUser>;
|
|
149
|
+
readonly card: A2aCardInfo;
|
|
150
|
+
readonly securitySchemes: Readonly<Record<string, A2aSecurityScheme>>;
|
|
151
|
+
readonly skills: Readonly<Record<string, A2aSkillConfig>>;
|
|
152
|
+
readonly tenant?: string | ((auth: A2aAuth) => string | undefined | Promise<string | undefined>);
|
|
153
|
+
readonly store?: ApprovalStore;
|
|
154
|
+
};
|
|
155
|
+
type A2aPermDock = {
|
|
156
|
+
readonly agentCard: () => A2aAgentCard;
|
|
157
|
+
readonly extendedAgentCard: (auth: A2aAuth) => Promise<A2aAgentCard>;
|
|
158
|
+
readonly protectSkill: (selector: (task: unknown) => string) => (task: unknown, auth: A2aAuth) => Promise<A2aTaskOutcome>;
|
|
159
|
+
/**
|
|
160
|
+
* Appends an A2A 1.0 signature. `sign` returns a compact JWS over the
|
|
161
|
+
* RFC 8785 canonical card it is given; the payload is detached.
|
|
162
|
+
*/
|
|
163
|
+
readonly sign: (card: A2aAgentCard, sign: (payload: string) => Promise<string>) => Promise<A2aAgentCard>;
|
|
164
|
+
};
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/a2a/create.d.ts
|
|
167
|
+
export declare function createPermDock<TUser, TPrincipal extends Principal = Principal>(policy: Policy<TUser, TPrincipal>, options: A2aPermDockOptions<TUser>): A2aPermDock;
|
|
168
|
+
//#endregion
|
|
169
|
+
export type { A2aAgentCard, A2aAgentCardSignature, A2aAuth, A2aCardInfo, A2aPermDock, A2aPermDockOptions, A2aSecurityRequirement, A2aSecurityScheme, A2aSkill, A2aSkillConfig, A2aTaskOutcome, A2aWireSecurityScheme };
|