permdock 0.3.1 → 0.5.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 +37 -35
- package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +228 -75
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/create-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/denied-text-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/index-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/ocsf-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +47 -29
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/permission-registry-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/resource-relations-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/types-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/wrap-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +129 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.js +0 -2
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://permdock.com/schemas/support-session-v1.json",
|
|
4
|
+
"title": "PermDock support session",
|
|
5
|
+
"description": "The claims of a vnd.permdock.support-session+jwt, wire format v1: sub is the viewed principal, act the support actor, jti the session id. exp is after iat, by at most one day.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"v",
|
|
9
|
+
"iss",
|
|
10
|
+
"sub",
|
|
11
|
+
"aud",
|
|
12
|
+
"jti",
|
|
13
|
+
"iat",
|
|
14
|
+
"exp",
|
|
15
|
+
"act",
|
|
16
|
+
"tenant",
|
|
17
|
+
"reason",
|
|
18
|
+
"permissions"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"v": {
|
|
22
|
+
"const": 1
|
|
23
|
+
},
|
|
24
|
+
"iss": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"minLength": 1,
|
|
27
|
+
"maxLength": 256
|
|
28
|
+
},
|
|
29
|
+
"sub": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1,
|
|
32
|
+
"maxLength": 256
|
|
33
|
+
},
|
|
34
|
+
"aud": {
|
|
35
|
+
"anyOf": [
|
|
36
|
+
{
|
|
37
|
+
"type": "string",
|
|
38
|
+
"minLength": 1,
|
|
39
|
+
"maxLength": 256
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "array",
|
|
43
|
+
"items": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"maxLength": 256
|
|
47
|
+
},
|
|
48
|
+
"minItems": 1
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"jti": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"minLength": 1,
|
|
55
|
+
"maxLength": 256
|
|
56
|
+
},
|
|
57
|
+
"iat": {
|
|
58
|
+
"type": "integer",
|
|
59
|
+
"minimum": 0
|
|
60
|
+
},
|
|
61
|
+
"exp": {
|
|
62
|
+
"type": "integer",
|
|
63
|
+
"minimum": 0
|
|
64
|
+
},
|
|
65
|
+
"act": {
|
|
66
|
+
"type": "object",
|
|
67
|
+
"required": ["sub", "kind"],
|
|
68
|
+
"additionalProperties": false,
|
|
69
|
+
"properties": {
|
|
70
|
+
"sub": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"minLength": 1,
|
|
73
|
+
"maxLength": 256
|
|
74
|
+
},
|
|
75
|
+
"kind": {
|
|
76
|
+
"const": "support"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"tenant": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"minLength": 1,
|
|
83
|
+
"maxLength": 256
|
|
84
|
+
},
|
|
85
|
+
"reason": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"minLength": 1,
|
|
88
|
+
"maxLength": 1000
|
|
89
|
+
},
|
|
90
|
+
"permissions": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"items": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"minLength": 1,
|
|
95
|
+
"maxLength": 256
|
|
96
|
+
},
|
|
97
|
+
"minItems": 1,
|
|
98
|
+
"maxItems": 64
|
|
99
|
+
},
|
|
100
|
+
"approved_by": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"minLength": 1,
|
|
103
|
+
"maxLength": 256
|
|
104
|
+
},
|
|
105
|
+
"reference": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"minLength": 1,
|
|
108
|
+
"maxLength": 256
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
package/skills/permdock/SKILL.md
CHANGED
|
@@ -32,26 +32,30 @@ PermDock is typed permissions for TypeScript apps, APIs, databases and AI agents
|
|
|
32
32
|
|
|
33
33
|
1. **Pick the skill.** Install the one the task needs with `npx skills add ScaleDockHQ/PermDock --skill <name>` (or all of them with `npx skills add ScaleDockHQ/PermDock`, or `pnpm exec permdock skills install` to match the installed package version):
|
|
34
34
|
|
|
35
|
-
| Task
|
|
36
|
-
|
|
|
37
|
-
| Add PermDock, first guard, limits, plans, CLI checks
|
|
38
|
-
| Review an app or a pull request
|
|
39
|
-
| Agent tool calls, actors, delegation, A2A, WebMCP
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
35
|
+
| Task | Skill |
|
|
36
|
+
| --------------------------------------------------------------------- | ---------------------- |
|
|
37
|
+
| Add PermDock, first guard, limits, plans, CLI checks | `permdock-wire` |
|
|
38
|
+
| Review an app or a pull request | `permdock-audit` |
|
|
39
|
+
| Agent tool calls, actors, delegation, A2A, WebMCP | `permdock-agents` |
|
|
40
|
+
| Automations, workflow runs, chat bots and chat commands | `permdock-agents` |
|
|
41
|
+
| Human approval, approvers, quorum, resume, delegation, access reviews | `permdock-approvals` |
|
|
42
|
+
| Approval prompts and notices by email or chat (delivery) | `permdock-approvals` |
|
|
43
|
+
| Named scopes, memberships, ownership, custom roles | `permdock-tenancy` |
|
|
44
|
+
| ORM queries, generated RLS, relationship graphs, parity | `permdock-data` |
|
|
45
|
+
| Access tokens, API keys, service accounts, feed keys, share links | `permdock-credentials` |
|
|
44
46
|
|
|
45
47
|
✓ The skill for the task is loaded, and `permdock-wire` has run first if the app has no factory file.
|
|
46
48
|
|
|
47
|
-
2. **Look identifiers up, never guess them.** Read the owning page through the docs MCP (`https://permdock.com/mcp`, tools `search`, `list_pages` and `get_page`), or append `.md` to any `https://permdock.com/docs/...` URL. Every public name follows the [naming convention](https://permdock.com/docs/getting-started/naming).
|
|
49
|
+
2. **Look identifiers up, never guess them.** Read the owning page through the docs MCP (`https://permdock.com/docs/mcp`, tools `search`, `list_pages` and `get_page`), or append `.md` to any `https://permdock.com/docs/...` URL. Every public name follows the [naming convention](https://permdock.com/docs/getting-started/naming).
|
|
48
50
|
✓ Each identifier written into the app appears on a docs page or in `node_modules/permdock`.
|
|
49
51
|
3. **Read a decision.** `decide()` returns `{ outcome, denials: [{ reason, ... }], alternatives }`. `reason` is one of the closed list on [decisions](https://permdock.com/docs/concepts/decisions); `alternatives` are permissions on the same resource the subject does hold. HTTP adapters answer RFC 9457 Problem Details ([errors](https://permdock.com/docs/concepts/errors)); for the format, defer to the `problem-details` spec skill (`npx skills add ScaleDockHQ/scaledock-skills --skill problem-details`).
|
|
50
52
|
✓ Each denial the user asked about is named by its reason.
|
|
51
53
|
4. **Explain an unexpected denial.** Run `permdock.explain(permission, data)` in a test or a script. `trace.denies[0]` is the deny that won (give denies a `name` so it reads as a rule), `trace.allows` the allows it overrode, `trace.skipped` the grants passed over and why ([explain](https://permdock.com/docs/concepts/decisions#explain)). The trace never reaches the decision log. To preview a plan before acting, `simulate([[permission, data], ...])` returns every decision.
|
|
52
54
|
✓ The cause is a named grant, condition or missing input, not a guess.
|
|
53
|
-
5. **Check the project.** Run `pnpm exec permdock doctor
|
|
55
|
+
5. **Check the project.** Run `pnpm exec permdock doctor`. Each finding has a stable `PD0xx` code and a one-line fix ([doctor](https://permdock.com/docs/cli/doctor)); the topic skills name the codes for their area. When an agent runs it, every `permdock` command prints one JSON result: the report is in `data`. Exit `3` means the command needs input, a login or the person's consent: show the person `error.detail`, and after they agree run the command `next` gives, with its `--confirm` token. Never add `--confirm` or `--force` on your own ([agent mode](https://permdock.com/docs/cli/agent-mode)).
|
|
54
56
|
✓ `permdock doctor` reports no error.
|
|
57
|
+
6. **Upgrade across a rename release.** After raising `permdock` to 0.5, run `pnpm exec permdock codemod 0.5 --dry-run`, then without `--dry-run`. It renames imported identifiers and lists each call site whose shape changed, and each option or method key to edit by hand, as `file:line:column` ([codemod](https://permdock.com/docs/cli/codemod)). Work through that list, then run `tsc` and the step 5 check.
|
|
58
|
+
✓ The codemod's second run reports no changes, and every follow-up it listed is edited.
|
|
55
59
|
|
|
56
60
|
## Verify before done
|
|
57
61
|
|
|
@@ -63,4 +67,4 @@ PermDock is typed permissions for TypeScript apps, APIs, databases and AI agents
|
|
|
63
67
|
## Reference index
|
|
64
68
|
|
|
65
69
|
- Skills: `permdock-wire`, `permdock-audit`, `permdock-agents`, `permdock-approvals`, `permdock-tenancy`, `permdock-data`, `permdock-credentials`, all from `npx skills add ScaleDockHQ/PermDock --skill <name>`.
|
|
66
|
-
- Docs: [for AI agents](https://permdock.com/docs/for-ai-agents), [naming](https://permdock.com/docs/getting-started/naming), [policies](https://permdock.com/docs/concepts/policies), [decisions](https://permdock.com/docs/concepts/decisions), [threat model](https://permdock.com/docs/security/threat-model), [doctor](https://permdock.com/docs/cli/doctor), `https://permdock.com/llms.txt`.
|
|
70
|
+
- Docs: [for AI agents](https://permdock.com/docs/for-ai-agents), [naming](https://permdock.com/docs/getting-started/naming), [policies](https://permdock.com/docs/concepts/policies), [decisions](https://permdock.com/docs/concepts/decisions), [threat model](https://permdock.com/docs/security/threat-model), [doctor](https://permdock.com/docs/cli/doctor), [codemod](https://permdock.com/docs/cli/codemod), `https://permdock.com/llms.txt`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: permdock-agents
|
|
3
|
-
description: Guards AI agent tool calls with PermDock subjects, actors and delegation. Use when wiring
|
|
3
|
+
description: Guards AI agent tool calls, automations and chat commands with PermDock operations, subjects, actors and delegation. Use when declaring defineOperations, wiring operations in permdock/agent, permdock/ai-sdk, permdock/claude-agent, permdock/openai, permdock/eve or permdock/mcp, gating models or filtering tool results, running published automations with permdock/workflow or permdock/workflow-sdk, protecting chat commands and approval buttons with permdock/chat or permdock/chat-sdk, separating the user (principal) from the agent (actor), declaring a delegation option or policy delegations, publishing an A2A Agent Card with permdock/a2a, registering WebMCP tools with permdock/webmcp, verifying Web Bot Auth signers as actors, or when agent calls are denied with no-delegation or not-delegated.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
6
|
author: ScaleDockHQ
|
|
@@ -10,33 +10,40 @@ metadata:
|
|
|
10
10
|
|
|
11
11
|
# PermDock agents
|
|
12
12
|
|
|
13
|
-
An agent call has a principal (the user whose grants are evaluated), an actor (the agent making the call) and a delegation (what the user handed over). The decision is the principal's grants intersected with the delegation ([delegation](https://permdock.com/docs/security/delegation)). Set up `permissions.ts`, `policy.ts` and the factory first with the `permdock-wire` skill (`npx skills add ScaleDockHQ/PermDock --skill permdock-wire`).
|
|
13
|
+
An agent call has a principal (the user whose grants are evaluated), an actor (the agent making the call) and a delegation (what the user handed over). The decision is the principal's grants intersected with the delegation ([delegation](https://permdock.com/docs/security/delegation)). Agent tools, automations and chat commands read one table from `defineOperations` ([operations](https://permdock.com/docs/concepts/operations)). Set up `permissions.ts`, `policy.ts` and the factory first with the `permdock-wire` skill (`npx skills add ScaleDockHQ/PermDock --skill permdock-wire`).
|
|
14
14
|
|
|
15
15
|
## Inputs (find out, or ask before starting)
|
|
16
16
|
|
|
17
|
-
- Runtimes in use: AI SDK, Claude Agent SDK, OpenAI Agents SDK, Eve, an MCP server, an A2A agent, WebMCP tools in a web page, signed bot traffic over HTTP.
|
|
18
|
-
-
|
|
17
|
+
- Runtimes in use: AI SDK, Claude Agent SDK, OpenAI Agents SDK, Eve, another agent runtime, an MCP server, an A2A agent, WebMCP tools in a web page, signed bot traffic over HTTP.
|
|
18
|
+
- Automations: who publishes them, whether they run as the publisher or a service principal, and the runner (Workflow SDK, Trigger.dev, Inngest, Temporal, Vercel Queues, pgmq).
|
|
19
|
+
- Chat bots: the platform, the workspace id, and where the app stores the link from a chat user id to a principal.
|
|
20
|
+
- Where the principal comes from: the host session, a verified token, the runtime's session (Eve), a run ticket, a linked chat author.
|
|
19
21
|
- Where the actor id comes from: runtime context, `authInfo.clientId`, an Agent Card, a request signature.
|
|
20
22
|
- What the user delegates, per call (scopes, `authorizationDetails`, GNAP `access`) or as standing policy ("members let the Eve agent read and update posts").
|
|
21
|
-
- Which
|
|
23
|
+
- Which operations are destructive or move money, and which models each plan may use.
|
|
22
24
|
|
|
23
25
|
## Invariants
|
|
24
26
|
|
|
25
27
|
1. Subject and actor come from the host session or verified transport auth, never from tool arguments, a task body, a header the client sets, or model output.
|
|
26
28
|
2. An actor with no delegation is denied every check with `no-delegation`. Delegate explicit scopes, never the principal's whole role.
|
|
27
29
|
3. Delegation only narrows. A policy delegation is a ceiling, a token delegation on the same call must also cover the permission, and a `deny` or an `approval` still applies.
|
|
28
|
-
4.
|
|
29
|
-
5.
|
|
30
|
-
6.
|
|
31
|
-
7.
|
|
30
|
+
4. An `agent` actor with a `tools` list calls only those tools: any other is denied with `agent-tool-not-delegated`. An actor with `readOnly: true` is denied every write with `not-delegated`.
|
|
31
|
+
5. One permission per operation. An instance action loads its row through `data` from parsed input; a collection permission (`list`, `create`) on a handler that reads `args.id` is a bug. `meta` labels an operation and never decides.
|
|
32
|
+
6. Tool lists are hints. `allowedOperations`, `capabilityMiddleware`, `guardTools`, MCP list filtering, the A2A extended card, `mayUse` and WebMCP registration hide tools; the server still decides each call.
|
|
33
|
+
7. A trigger never grants. A run reads its principal's rights live on every step through `getPermDock(ticket)`; only the run ticket (`vnd.permdock.run+jwt`) travels between steps.
|
|
34
|
+
8. An unlinked chat author is anonymous. A `ChatAuthor` comes only from a verified platform event and its user id, never an email or display name; an approval button carries the request id, never the token.
|
|
35
|
+
9. A failed Web Bot Auth signature throws `InvalidSignatureError`; it never becomes an anonymous actor.
|
|
36
|
+
10. Protocol rules come from the spec skills (`npx skills add ScaleDockHQ/scaledock-skills --skill <name>`): `mcp-authorization` for MCP auth, `a2a` for Agent Cards, `webmcp` for page tools, `web-bot-auth` for signatures, `owasp-agentic` for the threat checklist.
|
|
32
37
|
|
|
33
38
|
## Workflow
|
|
34
39
|
|
|
35
|
-
1. **Name the three parts per surface.** Write down the principal source, the actor source and the delegation source for each
|
|
36
|
-
✓ Every surface has all three, and none reads from model-controlled input.
|
|
37
|
-
2. **
|
|
38
|
-
✓ Every
|
|
39
|
-
3. **
|
|
40
|
+
1. **Name the three parts per surface.** Write down the principal source, the actor source and the delegation source for each surface from the Inputs. The adapter table on [delegation](https://permdock.com/docs/security/delegation#how-adapters-fill-actor-and-delegation) shows what each adapter fills itself (MCP and A2A read token scopes; in-process runtimes take a `delegation` option). An automation run's actor is `automation` and its delegation is its operations' permissions; a chat command's principal is the linked author.
|
|
41
|
+
✓ Every surface has all three, and none reads from model-controlled input or a trigger payload.
|
|
42
|
+
2. **Define the operations.** One `defineOperations(permissions, { name: { permission, data?, results?, meta? } })` module for the app, with names in MCP tool-name characters and `meta: { risk, effects, title }` on destructive operations. -> [references/operations-automations-chat.md](references/operations-automations-chat.md#operations-defineoperations-from-permdock)
|
|
43
|
+
✓ Every operation names a leaf of the tree, and every instance permission has a `data` loader that parses its input.
|
|
44
|
+
3. **Map the agent tools.** Use the runtime's `createPermDock` with `subject`, `actor`, `delegation` and `operations`, and pass the returned hook to the runtime. For a runtime with no adapter, use `createPermDock` from `permdock/agent` and call `decideOperation(name, input, ctx)` per call. Add `models` for a model gate and `filterResults` on list tools. -> [references/runtimes.md](references/runtimes.md), [agent contract](references/operations-automations-chat.md#agent-contract-permdockagent)
|
|
45
|
+
✓ Every tool the agent can call is an operation, and an unnamed tool is denied unless `unmapped: 'allow'` is deliberate.
|
|
46
|
+
4. **Delegate.** Per call, return `{ scopes: [permissions.post.update.scope] }` (or `authorizationDetails`) from the `delegation` option. As standing policy, declare it once on the policy:
|
|
40
47
|
|
|
41
48
|
```ts
|
|
42
49
|
definePolicy(permissions, {
|
|
@@ -55,23 +62,33 @@ An agent call has a principal (the user whose grants are evaluated), an actor (t
|
|
|
55
62
|
`from` takes a role, `authenticated()`, a plan or `assurance()`. `to` is an actor kind, or `{ kind, id }` for one agent. A permission outside the ceiling is denied with `not-delegated`.
|
|
56
63
|
✓ The agent is granted a delegated tool, and denied with `not-delegated` or `no-delegation` for anything else.
|
|
57
64
|
|
|
58
|
-
|
|
59
|
-
✓ A destructive
|
|
60
|
-
|
|
65
|
+
5. **Gate destructive operations.** Put `approval: { by }` on each destructive or money-moving grant and pass a `store` to the adapter. Follow the `permdock-approvals` skill (`npx skills add ScaleDockHQ/PermDock --skill permdock-approvals`).
|
|
66
|
+
✓ A destructive operation returns the runtime's approval outcome instead of running.
|
|
67
|
+
6. **Run automations.** Publish with `decideAutomation(permdock, request)` and store the `Automation` record. Start runs with `start(id, { caller, trigger })` from the `permdock/workflow` factory, call `getPermDock(ticket)` at the top of every step, and wait with `awaitApproval` or `openApproval` plus `resumeApproval`. On the Workflow SDK use `startAutomation`, `workflowSdkWaiter` and `authorizeHook` from `permdock/workflow-sdk`. -> [references/operations-automations-chat.md](references/operations-automations-chat.md#automations-permdockworkflow)
|
|
68
|
+
✓ A demoted publisher's next step denies, and a caller without the automation's `run` permission starts nothing.
|
|
69
|
+
7. **Protect chat commands.** Use `createPermDock` from `permdock/chat` with `principals` and `approvals`, wrap each command with `protect(operation, handler)`, and apply buttons with `resolveAction`. On the Chat SDK, build authors with `chatSdkAuthor` and render `approvalCard` with `approvalActions`. -> [references/operations-automations-chat.md](references/operations-automations-chat.md#chat-permdockchat)
|
|
70
|
+
✓ An unlinked author is denied with `anonymous`, and the requester's own click on an approval card is refused.
|
|
71
|
+
8. **Wire the agent-facing surfaces.** A2A: serve `agentCard()` publicly, `extendedAgentCard(auth)` behind auth, and `protectSkill` on the task endpoint. WebMCP: `registerTools` from a snapshot, with the server re-checking. Web Bot Auth: `webBotAuth: webBotAuthVerifier({ verify: true, keys })` on the HTTP adapter. -> [references/runtimes.md](references/runtimes.md)
|
|
61
72
|
✓ Each surface passes the Verify list of its spec skill.
|
|
62
|
-
|
|
73
|
+
9. **Test.** Add scenario tests with `permdock/testing` for one delegated grant, one `not-delegated` denial and one approval per destructive operation ([scenario testing](https://permdock.com/docs/guides/scenario-testing)). Run `testAgentRuntime` against a `permdock/agent` integration. Then review with the `permdock-audit` skill, which reports ASI02 and ASI03 per adapter.
|
|
63
74
|
✓ The tests pass and the audit has no blocker.
|
|
64
75
|
|
|
65
76
|
## Verify before done
|
|
66
77
|
|
|
67
|
-
- [ ] No `subject`, `actor`, tenant or approval token is read from tool arguments, a task body or model output.
|
|
78
|
+
- [ ] No `subject`, `actor`, tenant or approval token is read from tool arguments, a task body, a trigger payload or model output.
|
|
68
79
|
- [ ] Every in-process agent adapter sets `delegation`, or a policy `delegations` entry covers its actor kind.
|
|
69
|
-
- [ ]
|
|
80
|
+
- [ ] Agent adapters, automations and chat commands read one `defineOperations` map; no adapter keeps its own tool-to-permission table.
|
|
81
|
+
- [ ] Every instance operation has a `data` loader; no collection permission guards a handler that reads one row.
|
|
82
|
+
- [ ] List and search operations whose backend does not filter by subject declare `results` and go through `filterResults`.
|
|
83
|
+
- [ ] A `models` map gates every model the agent may call, when plans or roles price models.
|
|
70
84
|
- [ ] MCP servers set `resource` to their own URL; Claude Agent `mcp__` tools come only from `mcpSources`.
|
|
71
|
-
- [ ] WebMCP
|
|
72
|
-
- [ ] Every
|
|
85
|
+
- [ ] WebMCP, capability filtering and `allowedOperations` are backed by a server-side check on the same permission.
|
|
86
|
+
- [ ] Every automation step calls `getPermDock(ticket)` itself, `version` changes on every edit, and an approval wait resumes through `resumeApproval` or `awaitApproval`, never from the wake-up payload.
|
|
87
|
+
- [ ] Chat authors come from verified platform events through `subjectFromChat` or `chatSdkAuthor`, and approval buttons carry the request id.
|
|
88
|
+
- [ ] Every destructive operation returns `approval-required`, and the `permdock-approvals` Verify list passes.
|
|
73
89
|
|
|
74
90
|
## Reference index
|
|
75
91
|
|
|
76
92
|
- [references/runtimes.md](references/runtimes.md): factory shapes and outcome mapping for AI SDK, Claude Agent SDK, Eve, OpenAI Agents SDK, MCP, A2A, WebMCP, Web Bot Auth and `permdock/terminal`.
|
|
77
|
-
-
|
|
93
|
+
- [references/operations-automations-chat.md](references/operations-automations-chat.md): `defineOperations`, the `permdock/agent` contract, `permdock/workflow` and `permdock/workflow-sdk`, `permdock/chat` and `permdock/chat-sdk`.
|
|
94
|
+
- Docs: [delegation](https://permdock.com/docs/security/delegation), [subject](https://permdock.com/docs/concepts/subject), [operations](https://permdock.com/docs/concepts/operations), [agents](https://permdock.com/docs/concepts/agents), [automations](https://permdock.com/docs/concepts/automations), [chat](https://permdock.com/docs/concepts/chat), [OWASP Agentic mapping](https://permdock.com/docs/security/owasp-agentic), adapter pages under `https://permdock.com/docs/adapters/<name>`.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Operations, automations and chat
|
|
2
|
+
|
|
3
|
+
One operation table feeds agent tools, automations and chat commands. `permdock/agent`, `permdock/workflow` and `permdock/chat` are the runtime-neutral contracts; `permdock/ai-sdk`, `permdock/openai`, `permdock/claude-agent`, `permdock/eve`, `permdock/workflow-sdk` and `permdock/chat-sdk` implement them for one runtime.
|
|
4
|
+
|
|
5
|
+
## Operations: `defineOperations` from `permdock`
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { defineOperations } from "permdock";
|
|
9
|
+
|
|
10
|
+
export const operations = defineOperations(permissions, {
|
|
11
|
+
send_invoice: {
|
|
12
|
+
permission: permissions.billing.invoice.submit,
|
|
13
|
+
data: (input: { id: string }) => db.invoice.find(input.id),
|
|
14
|
+
meta: {
|
|
15
|
+
risk: "high",
|
|
16
|
+
effects: ["send", "external"],
|
|
17
|
+
title: "Send invoice",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
list_invoices: {
|
|
21
|
+
permission: permissions.billing.invoice.read,
|
|
22
|
+
results: permissions.billing.invoice.read,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
It returns a frozen `OperationMap`; each entry is a frozen `Operation` `{ name, permission, data?, results?, meta }`.
|
|
28
|
+
|
|
29
|
+
| Field | Meaning |
|
|
30
|
+
| ------------ | ----------------------------------------------------------------------------- |
|
|
31
|
+
| `permission` | The leaf a caller must hold to run the operation |
|
|
32
|
+
| `data` | Loads the row the check runs on from the input |
|
|
33
|
+
| `results` | The leaf each result row is filtered by |
|
|
34
|
+
| `meta` | `{ risk?, effects?, title? }`, `{}` when absent; PermDock never decides on it |
|
|
35
|
+
|
|
36
|
+
- `risk` is one of `low`, `medium`, `high`, `critical`. `effects` lists distinct values of `read`, `write`, `delete`, `send`, `spend`, `external`.
|
|
37
|
+
- A name is 1 to 128 of `A-Z a-z 0-9 _ . -` (the MCP tool-name characters), so it works as a tool name unchanged. Names that differ only in case throw.
|
|
38
|
+
- `defineOperations` also throws for a `permission` or `results` outside `permissions` and for a `data` that is not a function.
|
|
39
|
+
- The row `data` returns is validated against the resource schema like any request-derived data. Parse the input before loading.
|
|
40
|
+
- With `operations: "./src/operations.ts"` in `permdock.config.ts`, `permdock collect` writes the map to the catalog, and doctor PD067 reports a key the permissions module does not declare.
|
|
41
|
+
|
|
42
|
+
Every agent adapter takes this map as `operations` ([operations](https://permdock.com/docs/concepts/operations)).
|
|
43
|
+
|
|
44
|
+
## Agent contract: `permdock/agent`
|
|
45
|
+
|
|
46
|
+
`permdock/ai-sdk`, `permdock/openai`, `permdock/claude-agent` and `permdock/eve` build on this contract and return its members next to their runtime hooks. Use `permdock/agent` directly for a runtime PermDock has no adapter for.
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { createPermDock } from "permdock/agent";
|
|
50
|
+
|
|
51
|
+
const agent = createPermDock(policy, {
|
|
52
|
+
subject: (ctx: Context) => ctx.user,
|
|
53
|
+
actor: (ctx) => ({ id: ctx.agentId, kind: "agent" }),
|
|
54
|
+
delegation: (ctx) => ({ scopes: ctx.scopes }),
|
|
55
|
+
operations,
|
|
56
|
+
models: {
|
|
57
|
+
"openai/gpt-5.2": permissions.model.frontier,
|
|
58
|
+
"openai/gpt-5.2-mini": permissions.model.standard,
|
|
59
|
+
},
|
|
60
|
+
store, // ApprovalStore, for approval-required operations
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
| Member | What it does |
|
|
65
|
+
| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- |
|
|
66
|
+
| `decideOperation(name, input, ctx)` | Loads the row through `data`, validates, decides and resumes an approval; never throws |
|
|
67
|
+
| `allowedOperations(ctx)` | Names the subject could be granted for some row: a listing hint for the tool list, never a decision |
|
|
68
|
+
| `decideModel(id, ctx)` | The decision for one model; a model `models` does not name is denied |
|
|
69
|
+
| `permittedModels(ctx)` | Granted model ids in declaration order |
|
|
70
|
+
| `filterResults(name, rows, ctx)` | Keeps the rows the subject may see by the operation's `results`; rows unchanged without `results`; none for an unknown name |
|
|
71
|
+
| `gatewayOptions(ctx)` | `providerOptions.gateway` for the Vercel AI Gateway: principal id as `user`, `tenant:<id>` and `actor:<kind>` as `tags` |
|
|
72
|
+
| `getPermDock(ctx)`, `tokenFor(name, input, ctx)` | The instance for a context, and the approval token a call would park under |
|
|
73
|
+
|
|
74
|
+
An operation `operations` does not name is denied unless `unmapped: 'allow'`. `gatewayOptions` carries identifiers only, never a decision. Use `filterResults` on search and list tools whose backend does not filter by subject.
|
|
75
|
+
|
|
76
|
+
Test an implementation with `testAgentRuntime({ name, mount, skip? })` from `permdock/testing`. `mount(domain)` returns `{ agent, close? }`, an `AgentPermDock` built from `domain.subject`, `domain.operations`, `domain.models` and `domain.store` ([agents](https://permdock.com/docs/concepts/agents), [testing](https://permdock.com/docs/adapters/testing)).
|
|
77
|
+
|
|
78
|
+
## Automations: `permdock/workflow`
|
|
79
|
+
|
|
80
|
+
A run acts as the automation's principal with live rights, narrowed to the automation's operations and to any policy delegation to `actor('automation')`. The trigger only needs the automation's `run` permission to start a run; it is recorded in `subject.context.trigger` and lends the run nothing.
|
|
81
|
+
|
|
82
|
+
### Publish
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
import { decideAutomation } from "permdock";
|
|
86
|
+
const decision = await decideAutomation(permdock, {
|
|
87
|
+
id: "weekly-overdue",
|
|
88
|
+
version: 1,
|
|
89
|
+
operations: [operations.read_invoice, operations.send_invoice],
|
|
90
|
+
run: permissions.report.run,
|
|
91
|
+
name: "Overdue invoices",
|
|
92
|
+
});
|
|
93
|
+
if (decision.outcome === "granted") await automations.save(decision.automation);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`decideAutomation` checks that the publisher may use each operation's permission in the tenant, and returns an `Automation` record. A link, feed, contact, API key or run-ticket subject cannot publish.
|
|
97
|
+
|
|
98
|
+
| `mode` | The run acts as |
|
|
99
|
+
| --------------------- | ---------------------------------------------------------------------------------------------------- |
|
|
100
|
+
| `publisher` (default) | The publisher, with their rights as of each run |
|
|
101
|
+
| `service` | A `kind: 'service'` principal holding `roles` in `tenant`, capped at what the publisher could assign |
|
|
102
|
+
|
|
103
|
+
Bump `version` on every edit: a run ticket for another version is refused. `AutomationSource` is the live record store, read on every run; `memoryAutomationSource` is the in-process default.
|
|
104
|
+
|
|
105
|
+
### Run
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { createPermDock, pollingApprovalWaiter } from "permdock/workflow";
|
|
109
|
+
|
|
110
|
+
const workflow = createPermDock(policy, {
|
|
111
|
+
signer, // TokenSigner for run tickets
|
|
112
|
+
verifier, // TokenVerifier for run tickets
|
|
113
|
+
principals, // PrincipalSource, read live on every step
|
|
114
|
+
automations, // AutomationSource
|
|
115
|
+
store: store,
|
|
116
|
+
waiter: pollingApprovalWaiter({ store }),
|
|
117
|
+
sink,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const started = await workflow.start("weekly-overdue", {
|
|
121
|
+
caller: permdock,
|
|
122
|
+
trigger: event,
|
|
123
|
+
});
|
|
124
|
+
// pass started.ticket as the job payload; in each step:
|
|
125
|
+
const run = await workflow.getPermDock(ticket);
|
|
126
|
+
run.can(permissions.invoice.send, invoice);
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- `start(id, { caller, trigger })` reads the live automation, checks the caller's `run` permission and signs a run ticket (`vnd.permdock.run+jwt`, 24 hours by default). Without `caller`, only server code starts it.
|
|
130
|
+
- `getPermDock(ticket)` rebuilds the run on every step. A new version, a revoked automation or a publisher who is gone gives an instance that denies everything.
|
|
131
|
+
- `awaitApproval(ticket, permission, row)` decides, parks on the `waiter` while `approval-required`, then decides again with the token against the publisher's rights as of then.
|
|
132
|
+
- `openApproval(ticket, permission, row)` and `resumeApproval(ticket, permission, token, row)` are the two halves, for runners that wait outside the call. A request still pending denies with reason `approval`.
|
|
133
|
+
- `pollingApprovalWaiter({ store, interval })` polls every `interval` milliseconds (5,000 by default).
|
|
134
|
+
|
|
135
|
+
For Trigger.dev, Inngest, Temporal, Vercel Queues and pgmq: call `start` where the trigger arrives, pass the ticket as the payload, call `getPermDock(ticket)` at the top of each step, `openApproval` before the wait and `resumeApproval` after it. A wake-up carries no verdict ([automations](https://permdock.com/docs/concepts/automations)).
|
|
136
|
+
|
|
137
|
+
### Workflow SDK: `permdock/workflow-sdk`
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
import {
|
|
141
|
+
authorizeHook,
|
|
142
|
+
startAutomation,
|
|
143
|
+
workflowSdkWaiter,
|
|
144
|
+
} from "permdock/workflow-sdk";
|
|
145
|
+
import { createHook, sleep } from "workflow";
|
|
146
|
+
import { resumeHook, start } from "workflow/api";
|
|
147
|
+
|
|
148
|
+
const waiter = workflowSdkWaiter({ createHook, resumeHook, sleep });
|
|
149
|
+
|
|
150
|
+
const started = await startAutomation(
|
|
151
|
+
workflow,
|
|
152
|
+
start,
|
|
153
|
+
sendOverdue,
|
|
154
|
+
"weekly-overdue",
|
|
155
|
+
[invoiceId],
|
|
156
|
+
{ caller: permdock, trigger: event },
|
|
157
|
+
);
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- `startAutomation(workflow, start, fn, id, args, options)` starts the Workflow SDK run with the ticket as the first argument only when `workflow.start` is granted.
|
|
161
|
+
- `waiter.wait(token)` parks inside the `"use workflow"` function; `openApproval` and `resumeApproval` run as `"use step"` functions around it. The approver handler calls `waiter.wake(token)` after `resolveApproval`.
|
|
162
|
+
- `authorizeHook(resumeHook, caller, permission, row, token, payload)` resumes any other hook only when `caller.decide(permission, row)` is granted. A hook token alone is not an identity ([Workflow SDK adapter](https://permdock.com/docs/adapters/workflow-sdk)).
|
|
163
|
+
|
|
164
|
+
## Chat: `permdock/chat`
|
|
165
|
+
|
|
166
|
+
A chat command runs an operation as the principal the verified chat author links to.
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { createPermDock } from "permdock/chat";
|
|
170
|
+
|
|
171
|
+
const chatPermDock = createPermDock(policy, {
|
|
172
|
+
principals,
|
|
173
|
+
memberships,
|
|
174
|
+
store: store,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const pay = chatPermDock.protect(
|
|
178
|
+
operations["invoice.pay"],
|
|
179
|
+
async ({ input }) => {
|
|
180
|
+
await invoices.pay(input.id);
|
|
181
|
+
return `Paid ${input.id}.`;
|
|
182
|
+
},
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
const result = await pay(author, { id: "inv_42" });
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
- A `ChatAuthor` is `{ provider, userId, workspace? }`, built only from an event whose platform signature the transport verified.
|
|
189
|
+
- `subjectFromChat(author, { principals })` resolves it through `principals.principalByIdentity({ kind: 'chat', provider, value: userId, workspace })`. A missing, malformed or unlinked author is anonymous, so every check denies with `anonymous`. It never throws.
|
|
190
|
+
- The identity link is app data, written when a signed-in user connects their chat account. `memoryPrincipalSource({ principals, identities })` holds links in process.
|
|
191
|
+
- `protect(operation, handler)` resolves `granted` with the handler's `value`, `denied` with the decision, or `approval-required` with an `ApprovalPrompt` (`null` without `approvals`). An approved request runs the handler once.
|
|
192
|
+
- `resolveAction(author, { approval, status, note? })` applies `approved` or `rejected` as the clicking author through `resolveApproval`. The button carries the request id, never the token. The requester never approves their own request ([chat](https://permdock.com/docs/concepts/chat)).
|
|
193
|
+
|
|
194
|
+
### Chat SDK: `permdock/chat-sdk`
|
|
195
|
+
|
|
196
|
+
`chat` here is the Chat SDK `Chat` instance.
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
import {
|
|
200
|
+
approvalActions,
|
|
201
|
+
approvalCard,
|
|
202
|
+
chatSdkAuthor,
|
|
203
|
+
} from "permdock/chat-sdk";
|
|
204
|
+
|
|
205
|
+
chat.onNewMention(async (thread, message) => {
|
|
206
|
+
const author = chatSdkAuthor(message.author, thread.adapter, {
|
|
207
|
+
workspace: "T0ACME",
|
|
208
|
+
});
|
|
209
|
+
const result = await pay(author, { id: "inv_42" });
|
|
210
|
+
await thread.post(
|
|
211
|
+
result.outcome === "granted" ? result.value : "Not allowed.",
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
const actions = approvalActions(chatPermDock, { workspace: "T0ACME" });
|
|
216
|
+
chat.onAction([...actions.actionIds], actions.onAction);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- `chatSdkAuthor(user, adapter, { workspace? })` reads only `userId`, never the email or display name, and returns `null` for a bot, the bot itself or the platform.
|
|
220
|
+
- `approvalCard(prompt, { approvalUrl, buttons? })` renders the prompt with a Review link and Approve and Reject buttons; `buttons: false` leaves only the link.
|
|
221
|
+
- `approvalActions(chatPermDock, { workspace?, onResult? })` routes the clicks to `resolveAction` ([Chat SDK adapter](https://permdock.com/docs/adapters/chat-sdk)).
|