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.
Files changed (344) hide show
  1. package/README.md +327 -1
  2. package/dist/a2a/index.d.ts +169 -0
  3. package/dist/a2a/index.js +232 -0
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +95 -0
  6. package/dist/ai-sdk/index.js +154 -0
  7. package/dist/approval-required-TzNB9oQA.js +6 -0
  8. package/dist/approvals/index.d.ts +3 -0
  9. package/dist/approvals/index.js +5 -0
  10. package/dist/approvals-DbYAuNkG.js +224 -0
  11. package/dist/approvers-DT4AVyIg.js +52 -0
  12. package/dist/arazzo-BAgw9ap6.js +70 -0
  13. package/dist/arazzo-cmvX2jDe.js +54 -0
  14. package/dist/authzen/index.d.ts +39 -0
  15. package/dist/authzen/index.js +302 -0
  16. package/dist/better-auth/index.d.ts +109 -0
  17. package/dist/better-auth/index.js +344 -0
  18. package/dist/better-supabase/index.d.ts +206 -0
  19. package/dist/better-supabase/index.js +620 -0
  20. package/dist/bind-CVy3Espv.d.ts +25 -0
  21. package/dist/bind-VnYn2HKq.js +97 -0
  22. package/dist/boundary-BM8a_P6E.js +13 -0
  23. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  24. package/dist/budget-JqcRqyhK.d.ts +11 -0
  25. package/dist/budget-NbEtbJC_.js +11 -0
  26. package/dist/canonical-json-DemiK4Vp.js +26 -0
  27. package/dist/capability-4qPdO9gk.js +173 -0
  28. package/dist/capability-Dq43tT1u.d.ts +99 -0
  29. package/dist/catalog/index.d.ts +12 -0
  30. package/dist/catalog/index.js +2 -0
  31. package/dist/catalog-BjZSovXQ.js +2 -0
  32. package/dist/catalog-doc-Dsc9y7sd.js +309 -0
  33. package/dist/catalog-h2tlKFkq.js +48 -0
  34. package/dist/catalog-path-CnI0XTFK.js +12 -0
  35. package/dist/catalog-z8q6bi_r.js +55 -0
  36. package/dist/claude-agent/index.d.ts +72 -0
  37. package/dist/claude-agent/index.js +77 -0
  38. package/dist/clerk/index.d.ts +65 -0
  39. package/dist/clerk/index.js +301 -0
  40. package/dist/cli/bin.d.ts +1 -0
  41. package/dist/cli/bin.js +20 -0
  42. package/dist/cli/index.d.ts +46 -0
  43. package/dist/cli/index.js +5 -0
  44. package/dist/clients-C7zLFuWT.d.ts +12 -0
  45. package/dist/clients-DjU5ABMy.js +23 -0
  46. package/dist/cloud/index.d.ts +90 -0
  47. package/dist/cloud/index.js +404 -0
  48. package/dist/cloud-BGhHS-lY.js +50 -0
  49. package/dist/cloud-Bo3e9Ak3.js +118 -0
  50. package/dist/collect-DDDv_ESs.js +502 -0
  51. package/dist/collect-DLlujdHC.js +83 -0
  52. package/dist/collect-rG2IQ3t0.js +2 -0
  53. package/dist/commands-DWOrSQic.js +97 -0
  54. package/dist/compact-y6vfu2_f.js +19 -0
  55. package/dist/compare-pfyVnBjE.js +12 -0
  56. package/dist/compile/index.d.ts +3 -0
  57. package/dist/compile/index.js +2 -0
  58. package/dist/compile-Ba4blROR.js +613 -0
  59. package/dist/compile-CNnl6uIt.d.ts +94 -0
  60. package/dist/config-BJiM-xAm.js +157 -0
  61. package/dist/config-Bn00Z3ks.js +36 -0
  62. package/dist/config-report-Dw_JcUqT.js +44 -0
  63. package/dist/connection-CU8MQxRi.js +194 -0
  64. package/dist/context-Ttp0ekMT.js +82 -0
  65. package/dist/convex/index.d.ts +45 -0
  66. package/dist/convex/index.js +65 -0
  67. package/dist/create-BWyx3jua.d.ts +245 -0
  68. package/dist/create-CPhDL6qx.js +253 -0
  69. package/dist/credential-8P81ff4u.js +306 -0
  70. package/dist/delegation-D8pUEuce.js +103 -0
  71. package/dist/describe-B_gVZEVi.js +94 -0
  72. package/dist/describe-PdoqESvg.d.ts +36 -0
  73. package/dist/diff-B8Tunc3o.js +451 -0
  74. package/dist/diff-CzqLxZ77.js +48 -0
  75. package/dist/digest-B3kc_PgQ.d.ts +19 -0
  76. package/dist/digest-BI-6aa6d.js +27 -0
  77. package/dist/doctor-WpvG6p4k.js +1194 -0
  78. package/dist/doctor-collect-ByfYlNv1.js +664 -0
  79. package/dist/doctor-rOr-4ZfS.js +53 -0
  80. package/dist/drizzle/index.d.ts +73 -0
  81. package/dist/drizzle/index.js +160 -0
  82. package/dist/duration-xK2jGFVc.js +25 -0
  83. package/dist/elysia/index.d.ts +49 -0
  84. package/dist/elysia/index.js +59 -0
  85. package/dist/errors-CWfoNg9N.js +47 -0
  86. package/dist/errors-Cz5zn0mW.js +123 -0
  87. package/dist/errors-DAqevpNk.d.ts +125 -0
  88. package/dist/errors-DRnGZHzF.js +30 -0
  89. package/dist/evaluation-items-CfCCejQd.js +40 -0
  90. package/dist/evaluations-tz6D9A2G.js +461 -0
  91. package/dist/eve/index.d.ts +86 -0
  92. package/dist/eve/index.js +176 -0
  93. package/dist/expiry-BoBJ8Tvc.js +7 -0
  94. package/dist/express/index.d.ts +23 -0
  95. package/dist/express/index.js +78 -0
  96. package/dist/fastify/index.d.ts +33 -0
  97. package/dist/fastify/index.js +92 -0
  98. package/dist/fields-BMl1RxoX.js +26 -0
  99. package/dist/files-DWUN9PzI.js +125 -0
  100. package/dist/fixtures-ht28Cplr.js +67 -0
  101. package/dist/freeze-CrU8nQeX.js +60 -0
  102. package/dist/from-snapshot-C3sHpZNS.js +569 -0
  103. package/dist/generate-CH7ThJ14.js +173 -0
  104. package/dist/grantee-Cv5Sogfv.js +602 -0
  105. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  106. package/dist/headers-BZSDieNT.js +6 -0
  107. package/dist/headers-Cf-zWvsO.d.ts +6 -0
  108. package/dist/helpers-H_KARDVC.js +421 -0
  109. package/dist/hono/index.d.ts +48 -0
  110. package/dist/hono/index.js +99 -0
  111. package/dist/hosted-DJQw46hn.js +266 -0
  112. package/dist/http-BIhmLfCc.js +95 -0
  113. package/dist/http-DPuDaChb.d.ts +13 -0
  114. package/dist/http-SO7qGttf.js +44 -0
  115. package/dist/ids-DC4V4CFu.js +18 -0
  116. package/dist/index-A0YNL8jZ.d.ts +177 -0
  117. package/dist/index-CtE07CBF.d.ts +6 -0
  118. package/dist/index-D3vbkoSI.d.ts +483 -0
  119. package/dist/index-D6_cSa1z.d.ts +201 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +26 -0
  122. package/dist/instance-options-BK_rNOSC.d.ts +11 -0
  123. package/dist/instance-options-Dhhcnm3y.js +22 -0
  124. package/dist/json-schema-BsAflUGW.js +106 -0
  125. package/dist/jwt/index.d.ts +91 -0
  126. package/dist/jwt/index.js +590 -0
  127. package/dist/kernel-GSQnMz3O.js +208 -0
  128. package/dist/kysely/index.d.ts +78 -0
  129. package/dist/kysely/index.js +129 -0
  130. package/dist/live-options-H2eG8dfJ.js +60 -0
  131. package/dist/load-DhWEB9P1.js +75 -0
  132. package/dist/load-DwJUafYN.js +2 -0
  133. package/dist/load-jose-BL6LH4bL.js +11 -0
  134. package/dist/lru-8q4WZjBV.js +28 -0
  135. package/dist/manifest-iaoBXHKc.js +783 -0
  136. package/dist/manifest-uDS9y5de.d.ts +206 -0
  137. package/dist/map-AcxK9o_D.js +147 -0
  138. package/dist/map-claims-Z4QZOiFF.js +369 -0
  139. package/dist/map-error-pgUWNNtG.js +23 -0
  140. package/dist/markers-B0hYLvMD.js +60 -0
  141. package/dist/may-use-DndQ5tQ-.js +77 -0
  142. package/dist/mcp/index.d.ts +159 -0
  143. package/dist/mcp/index.js +603 -0
  144. package/dist/nest/index.d.ts +75 -0
  145. package/dist/nest/index.js +261 -0
  146. package/dist/next/client.d.ts +23 -0
  147. package/dist/next/client.js +33 -0
  148. package/dist/next/index.d.ts +93 -0
  149. package/dist/next/index.js +180 -0
  150. package/dist/next/plugin.d.ts +14 -0
  151. package/dist/next/plugin.js +33 -0
  152. package/dist/node/index.d.ts +24 -0
  153. package/dist/node/index.js +34 -0
  154. package/dist/openai/index.d.ts +62 -0
  155. package/dist/openai/index.js +92 -0
  156. package/dist/openapi/index.d.ts +176 -0
  157. package/dist/openapi/index.js +3 -0
  158. package/dist/openapi-Bbg4wGVL.js +164 -0
  159. package/dist/openapi-BqRBvAng.js +538 -0
  160. package/dist/openapi-CqqEbHsL.js +250 -0
  161. package/dist/openapi-import-cmwetbzw.js +5959 -0
  162. package/dist/openapi-schema--ARjyfQr.js +6902 -0
  163. package/dist/orpc/index.d.ts +51 -0
  164. package/dist/orpc/index.js +145 -0
  165. package/dist/otel/index.d.ts +13 -0
  166. package/dist/otel/index.js +202 -0
  167. package/dist/package-root-zGkxO3oN.js +30 -0
  168. package/dist/parse-BuyjxhZV.js +53 -0
  169. package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
  170. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  171. package/dist/pdp/index.d.ts +22 -0
  172. package/dist/pdp/index.js +682 -0
  173. package/dist/peer-BOr_kJE1.js +31 -0
  174. package/dist/permdock-CzqXjCpU.js +3471 -0
  175. package/dist/permissions-CDgvKG5L.d.ts +52 -0
  176. package/dist/permissions-CpZrivYv.js +142 -0
  177. package/dist/permissions-DVoF6dMt.js +662 -0
  178. package/dist/permissions-DttnqqxC.d.ts +214 -0
  179. package/dist/pins-8ILTftC9.js +12 -0
  180. package/dist/policy-CFZAr_Al.d.ts +2252 -0
  181. package/dist/policy-D8UFyERw.d.ts +20 -0
  182. package/dist/policy-xyWg7QdR.js +1122 -0
  183. package/dist/powersync-A8x_Yyvh.js +2 -0
  184. package/dist/powersync-C7kLglqX.js +540 -0
  185. package/dist/powersync-yW1UUFzp.js +62 -0
  186. package/dist/prisma/index.d.ts +136 -0
  187. package/dist/prisma/index.js +455 -0
  188. package/dist/problem-B43ztKIm.js +191 -0
  189. package/dist/problem-details-CkL50EEf.d.ts +7 -0
  190. package/dist/problem-details-_AMOYz-w.js +144 -0
  191. package/dist/prompt-CXYhLfsS.js +32 -0
  192. package/dist/protected-CNsMzrVd.d.ts +27 -0
  193. package/dist/protected-Cs6kTaHo.js +100 -0
  194. package/dist/protected-bZs6rbT1.d.ts +40 -0
  195. package/dist/provider-Cjr62YMV.d.ts +6 -0
  196. package/dist/provider-DLzpb2Xz.js +52 -0
  197. package/dist/provider-store-DNyC1y48.js +43 -0
  198. package/dist/react/index.d.ts +8 -0
  199. package/dist/react/index.js +7 -0
  200. package/dist/react/provider-client.d.ts +2 -0
  201. package/dist/react/provider-client.js +3 -0
  202. package/dist/react-native/index.d.ts +198 -0
  203. package/dist/react-native/index.js +696 -0
  204. package/dist/refs-KYb4ntaz.js +91 -0
  205. package/dist/relations-cjOL01hZ.js +505 -0
  206. package/dist/replay-BsOyTrdV.js +28 -0
  207. package/dist/replay-sqBGMnNs.d.ts +5 -0
  208. package/dist/resource-ref-CaS9yVPi.js +20 -0
  209. package/dist/revocations-Bhr0aMIC.js +27 -0
  210. package/dist/revocations-Cy06JNx2.d.ts +21 -0
  211. package/dist/rls-BMNydpHk.js +2521 -0
  212. package/dist/rls-CEvs64Kj.js +238 -0
  213. package/dist/rls-fields-BMasREhR.js +3502 -0
  214. package/dist/rls-graph-pc9fuXYm.js +435 -0
  215. package/dist/rls-import-D8F7j35Q.js +943 -0
  216. package/dist/rls-migrate-7wikfrVI.js +367 -0
  217. package/dist/rls-ownership-B5Lkq62W.js +843 -0
  218. package/dist/rls-shared-aOQ4hGTO.js +493 -0
  219. package/dist/rls-verify-D8B7dOTh.js +745 -0
  220. package/dist/row-check-Dt35czLy.d.ts +40 -0
  221. package/dist/rpc-DOK54_CS.js +89 -0
  222. package/dist/run-YXCJDNYk.js +174 -0
  223. package/dist/runtime-CB8gQFvS.js +11 -0
  224. package/dist/saas-Bj_FFkjN.js +1203 -0
  225. package/dist/schema-D3MnDMxa.js +300 -0
  226. package/dist/scim/index.d.ts +2 -0
  227. package/dist/scim/index.js +2 -0
  228. package/dist/scim-BFGBBAqR.js +1445 -0
  229. package/dist/scopes-CVdPrWN-.js +239 -0
  230. package/dist/server/index.d.ts +134 -0
  231. package/dist/server/index.js +11 -0
  232. package/dist/server-DlZ28Oz5.js +268 -0
  233. package/dist/sha256-BO0swRXL.js +150 -0
  234. package/dist/shared-DRu8VFVM.js +123 -0
  235. package/dist/sink-Bd9PSyfq.js +141 -0
  236. package/dist/sink-Gs6TTVa-.d.ts +104 -0
  237. package/dist/skills-Biq5uup3.js +192 -0
  238. package/dist/skills-JaymNCdK.js +56 -0
  239. package/dist/snapshot-Enxd0n-s.js +975 -0
  240. package/dist/snapshot-cache-D6jLelln.js +44 -0
  241. package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
  242. package/dist/solid/index.d.ts +93 -0
  243. package/dist/solid/index.js +188 -0
  244. package/dist/sources-B0UvrJ21.js +534 -0
  245. package/dist/sources-BcJgw0lt.d.ts +192 -0
  246. package/dist/sql-xdg5f4Fi.js +27 -0
  247. package/dist/src-CSbUiozF.js +568 -0
  248. package/dist/ssf/index.d.ts +4 -0
  249. package/dist/ssf/index.js +596 -0
  250. package/dist/store-DMAWwAJV.js +371 -0
  251. package/dist/store-D_pjn91-.d.ts +36 -0
  252. package/dist/store-options-yO0V6gRn.js +716 -0
  253. package/dist/stores-4_sqiOA1.js +87 -0
  254. package/dist/stores-DVR5NHLE.d.ts +52 -0
  255. package/dist/stream-DDpvynSB.js +66 -0
  256. package/dist/stream-DlvG2hs-.d.ts +12 -0
  257. package/dist/style-CTm1AXDT.js +22 -0
  258. package/dist/subject-C6dLxqHU.js +24 -0
  259. package/dist/subject-settings-BwBmCdTR.js +128 -0
  260. package/dist/supabase/index.d.ts +183 -0
  261. package/dist/supabase/index.js +5 -0
  262. package/dist/supabase/middleware.d.ts +82 -0
  263. package/dist/supabase/middleware.js +102 -0
  264. package/dist/supabase-CwafwxxF.js +83 -0
  265. package/dist/supabase-DTBaC20O.js +774 -0
  266. package/dist/supabase-config-Bs44dare.js +472 -0
  267. package/dist/supabase-hook-BuxLQLpU.js +1814 -0
  268. package/dist/supabase-hook-D5qVd_D8.js +2 -0
  269. package/dist/supautils-DYZnzRWV.js +91 -0
  270. package/dist/svelte/PermissionBoundary.svelte +37 -0
  271. package/dist/svelte/Protected.svelte +40 -0
  272. package/dist/svelte/index.d.ts +13 -0
  273. package/dist/svelte/index.js +107 -0
  274. package/dist/svelte/runtime.d.ts +7 -0
  275. package/dist/svelte/runtime.js +4 -0
  276. package/dist/svelte/source.d.ts +13 -0
  277. package/dist/svelte/source.js +11 -0
  278. package/dist/terminal/index.d.ts +163 -0
  279. package/dist/terminal/index.js +833 -0
  280. package/dist/testing/index.d.ts +745 -0
  281. package/dist/testing/index.js +3672 -0
  282. package/dist/testing/saas/index.d.ts +194 -0
  283. package/dist/testing/saas/index.js +3 -0
  284. package/dist/testing/saas/permissions.d.ts +2 -0
  285. package/dist/testing/saas/permissions.js +2 -0
  286. package/dist/text-diff-BdkkYSbi.js +15 -0
  287. package/dist/thenable-okc2xDsj.js +10 -0
  288. package/dist/timeout-D51niuQP.js +8 -0
  289. package/dist/token-CIWxJOCh.js +50 -0
  290. package/dist/trpc/index.d.ts +61 -0
  291. package/dist/trpc/index.js +122 -0
  292. package/dist/types-9AWO9EGt.d.ts +197 -0
  293. package/dist/types-BPxgszlT.d.ts +550 -0
  294. package/dist/types-BVyImy5I.d.ts +120 -0
  295. package/dist/types-Bvc4oWT6.d.ts +9 -0
  296. package/dist/types-C3s9xVJG.d.ts +48 -0
  297. package/dist/types-Dnemwd77.d.ts +183 -0
  298. package/dist/types-kxznc7cn.d.ts +52 -0
  299. package/dist/types-vKyAMtcX.d.ts +157 -0
  300. package/dist/types-vNSDF7Dq.d.ts +66 -0
  301. package/dist/types-yF5LmQVD.d.ts +306 -0
  302. package/dist/unplugin/index.d.ts +7 -0
  303. package/dist/unplugin/index.js +31 -0
  304. package/dist/usage-D07N9QJ3.js +42 -0
  305. package/dist/usage-D82l1CwK.js +2 -0
  306. package/dist/usage-DG1oeCca.js +693 -0
  307. package/dist/validation-error-CnjZ4t92.js +33 -0
  308. package/dist/validation-error-CtF23SrC.d.ts +26 -0
  309. package/dist/validity-uOp8UpYn.js +245 -0
  310. package/dist/verifier-BxBo6I44.js +466 -0
  311. package/dist/version-BvacVTZR.js +17 -0
  312. package/dist/views-Soe7bGSC.js +95 -0
  313. package/dist/vocabulary-DA8a8zif.d.ts +56 -0
  314. package/dist/vue/index.d.ts +79 -0
  315. package/dist/vue/index.js +196 -0
  316. package/dist/watch-Etoa_Mvr.js +2 -0
  317. package/dist/watch-UihESpsJ.js +128 -0
  318. package/dist/webmcp/index.d.ts +75 -0
  319. package/dist/webmcp/index.js +307 -0
  320. package/package.json +450 -5
  321. package/rulesets/permdock.yaml +29 -0
  322. package/schemas/approval-request-v1.json +175 -0
  323. package/schemas/catalog-v1.json +535 -0
  324. package/schemas/openapi/oas-3.1.json +1298 -0
  325. package/schemas/openapi/oas-3.2.json +1516 -0
  326. package/schemas/openapi/overlay-1.1.json +79 -0
  327. package/schemas/supabase-claims-v1.json +144 -0
  328. package/schemas/supabase-manifest-v1.json +361 -0
  329. package/skills/permdock/SKILL.md +66 -0
  330. package/skills/permdock-agents/SKILL.md +77 -0
  331. package/skills/permdock-agents/references/runtimes.md +213 -0
  332. package/skills/permdock-approvals/SKILL.md +80 -0
  333. package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
  334. package/skills/permdock-audit/SKILL.md +67 -0
  335. package/skills/permdock-credentials/SKILL.md +55 -0
  336. package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
  337. package/skills/permdock-data/SKILL.md +57 -0
  338. package/skills/permdock-data/references/queries-and-rls.md +62 -0
  339. package/skills/permdock-data/references/relationships.md +67 -0
  340. package/skills/permdock-tenancy/SKILL.md +80 -0
  341. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
  342. package/skills/permdock-wire/SKILL.md +116 -0
  343. package/skills/permdock-wire/references/adapters.md +492 -0
  344. package/skills/permdock-wire/references/policy-options.md +45 -0
@@ -0,0 +1,301 @@
1
+ import { t as compact } from "../compact-y6vfu2_f.js";
2
+ import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
+ import { t as ignoreRejection } from "../thenable-okc2xDsj.js";
4
+ import { t as anonymousSubject } from "../subject-C6dLxqHU.js";
5
+ import { c as ttlMs, s as ttlCache } from "../shared-DRu8VFVM.js";
6
+ //#region src/clerk/subject.ts
7
+ function isRecord(value) {
8
+ return value !== null && typeof value === "object" && !Array.isArray(value);
9
+ }
10
+ function asRoles(value) {
11
+ if (typeof value === "string") return value === "" ? [] : [value];
12
+ if (!Array.isArray(value)) return [];
13
+ return value.filter((item) => typeof item === "string");
14
+ }
15
+ function readPath(record, path) {
16
+ let current = record;
17
+ for (const part of path.split(".")) {
18
+ if (!isRecord(current) || !Object.hasOwn(current, part)) return;
19
+ current = current[part];
20
+ }
21
+ return current;
22
+ }
23
+ function validateClaims(extra, schema) {
24
+ const result = schema["~standard"].validate(extra);
25
+ if (result instanceof Promise) {
26
+ ignoreRejection(result);
27
+ return;
28
+ }
29
+ if ("issues" in result && result.issues !== void 0) return;
30
+ const value = result.value;
31
+ return isRecord(value) ? value : void 0;
32
+ }
33
+ const REGISTERED_CLAIMS = /* @__PURE__ */ new Set([
34
+ "iss",
35
+ "sub",
36
+ "aud",
37
+ "exp",
38
+ "nbf",
39
+ "iat",
40
+ "jti",
41
+ "sid",
42
+ "org_id",
43
+ "org_role",
44
+ "org_permissions",
45
+ "org_slug",
46
+ "pla",
47
+ "fea",
48
+ "o",
49
+ "v"
50
+ ]);
51
+ function extraClaims(claims) {
52
+ const extra = {};
53
+ for (const [key, value] of Object.entries(claims)) {
54
+ if (REGISTERED_CLAIMS.has(key) || key === "unsafeMetadata") continue;
55
+ extra[key] = value;
56
+ }
57
+ return extra;
58
+ }
59
+ /**
60
+ * Plan slugs from `pla`, split by owner: `o:` plans belong to the session's
61
+ * organization, everything else (`u:` and unprefixed) to the user.
62
+ */
63
+ function planSlugs(pla) {
64
+ const org = [];
65
+ const user = [];
66
+ if (typeof pla !== "string" || pla === "") return {
67
+ org,
68
+ user
69
+ };
70
+ for (const raw of pla.split(",")) {
71
+ const token = raw.trim();
72
+ if (token === "") continue;
73
+ const prefixed = /^([ou]):(.+)$/u.exec(token);
74
+ const slug = prefixed?.[2] ?? token;
75
+ if (slug !== "") (prefixed?.[1] === "o" ? org : user).push(slug);
76
+ }
77
+ return {
78
+ org,
79
+ user
80
+ };
81
+ }
82
+ function featureRoles(fea, map) {
83
+ if (map === void 0 || typeof fea !== "string" || fea === "") return {
84
+ org: [],
85
+ user: [],
86
+ sources: {}
87
+ };
88
+ const org = [];
89
+ const user = [];
90
+ const sources = {};
91
+ for (const raw of fea.split(",")) {
92
+ const token = raw.trim();
93
+ if (token === "") continue;
94
+ const prefixed = /^([ou]):(.+)$/u.exec(token);
95
+ const slug = prefixed?.[2] ?? token;
96
+ const source = prefixed?.[1] === "o" || prefixed?.[1] === "u" ? prefixed[1] : void 0;
97
+ const role = map[slug];
98
+ if (role === void 0) continue;
99
+ (source === "o" ? org : user).push(role);
100
+ if (source !== void 0) sources[role] = source;
101
+ }
102
+ return {
103
+ org,
104
+ user,
105
+ sources
106
+ };
107
+ }
108
+ function globalRolesFrom(claims, option) {
109
+ if (option === void 0) return [];
110
+ if (typeof option === "function") try {
111
+ return asRoles(option(claims));
112
+ } catch {
113
+ return [];
114
+ }
115
+ return asRoles(readPath(claims, option));
116
+ }
117
+ function splitList(value) {
118
+ return typeof value === "string" ? value.split(",").map((item) => item.trim()).filter((item) => item !== "") : [];
119
+ }
120
+ function orgFeatures(fea) {
121
+ return splitList(fea).map((token) => /^o:(.+)$/u.exec(token)?.[1]).filter((feature) => feature !== void 0);
122
+ }
123
+ /**
124
+ * Session token v2 carries the organization as `o: { id, rol, per, fpm }`:
125
+ * `fpm` holds one bitmask per `o:` feature in `fea`, bit `i` selecting
126
+ * `per[i]`, so a permission key is `org:<feature>:<per[i]>`.
127
+ */
128
+ function orgClaimsV2(claims) {
129
+ const org = claims["o"];
130
+ if (!isRecord(org) || typeof org["id"] !== "string" || org["id"] === "") return;
131
+ const role = typeof org["rol"] === "string" && org["rol"] !== "" ? org["rol"].startsWith("org:") ? org["rol"] : `org:${org["rol"]}` : void 0;
132
+ const actions = splitList(org["per"]);
133
+ const features = orgFeatures(claims["fea"]);
134
+ const masks = splitList(org["fpm"]).map(Number);
135
+ const orgPermissions = [];
136
+ for (const [index, feature] of features.entries()) {
137
+ const mask = masks[index];
138
+ if (mask === void 0 || !Number.isSafeInteger(mask) || mask < 0) continue;
139
+ for (const [bit, action] of actions.entries()) if (bit < 31 && (mask & 1 << bit) !== 0) orgPermissions.push(`org:${feature}:${action}`);
140
+ }
141
+ return {
142
+ tenant: org["id"],
143
+ orgRole: role,
144
+ orgPermissions
145
+ };
146
+ }
147
+ function orgClaimsV1(claims) {
148
+ return {
149
+ tenant: typeof claims["org_id"] === "string" ? claims["org_id"] : void 0,
150
+ orgRole: typeof claims["org_role"] === "string" ? claims["org_role"] : void 0,
151
+ orgPermissions: asRoles(claims["org_permissions"])
152
+ };
153
+ }
154
+ function orgClaims(claims) {
155
+ return orgClaimsV2(claims) ?? orgClaimsV1(claims);
156
+ }
157
+ function isAuthObject(value) {
158
+ if (!isRecord(value)) return false;
159
+ return typeof value["has"] === "function" || isRecord(value["sessionClaims"]);
160
+ }
161
+ function isVerifiedPayload(value) {
162
+ if (!isRecord(value)) return false;
163
+ if (typeof value["sub"] !== "string" || value["sub"] === "") return false;
164
+ return typeof value["sid"] === "string" || typeof value["azp"] === "string" || typeof value["org_id"] === "string" || orgClaimsV2(value) !== void 0;
165
+ }
166
+ function fromAuthObject(auth) {
167
+ const claims = isRecord(auth.sessionClaims) ? { ...auth.sessionClaims } : {};
168
+ const fromClaims = orgClaims(claims);
169
+ return {
170
+ id: typeof auth.userId === "string" ? auth.userId : typeof claims["sub"] === "string" ? claims["sub"] : void 0,
171
+ tenant: typeof auth.orgId === "string" ? auth.orgId : fromClaims.tenant,
172
+ orgRole: typeof auth.orgRole === "string" ? auth.orgRole : fromClaims.orgRole,
173
+ orgPermissions: auth.orgPermissions !== void 0 && auth.orgPermissions !== null ? asRoles(auth.orgPermissions) : fromClaims.orgPermissions,
174
+ claims,
175
+ session: typeof auth.sessionId === "string" ? auth.sessionId : typeof claims["sid"] === "string" ? claims["sid"] : void 0
176
+ };
177
+ }
178
+ function fromPayload(claims) {
179
+ return {
180
+ id: typeof claims["sub"] === "string" ? claims["sub"] : void 0,
181
+ ...orgClaims(claims),
182
+ claims,
183
+ session: typeof claims["sid"] === "string" ? claims["sid"] : void 0
184
+ };
185
+ }
186
+ const MEMBERSHIP_PAGE = 100;
187
+ const MEMBERSHIP_PAGES = 50;
188
+ function membershipRow(item, userId) {
189
+ if (!isRecord(item)) return;
190
+ const owner = isRecord(item["publicUserData"]) ? item["publicUserData"]["userId"] : void 0;
191
+ if (typeof owner === "string" && owner !== userId) return;
192
+ const organization = isRecord(item["organization"]) ? item["organization"] : void 0;
193
+ const tenant = typeof item["organizationId"] === "string" ? item["organizationId"] : typeof organization?.["id"] === "string" ? organization["id"] : void 0;
194
+ const roles = asRoles(item["role"]);
195
+ if (tenant === void 0 || roles.length === 0) return;
196
+ return compact({
197
+ tenant,
198
+ roles
199
+ });
200
+ }
201
+ /** The memberships Clerk lists for `userId`, or `undefined` when a page fails. */
202
+ async function extraMemberships(backend, userId) {
203
+ const list = backend?.users?.getOrganizationMembershipList;
204
+ if (list === void 0) return [];
205
+ try {
206
+ const out = [];
207
+ for (let page = 0; page < MEMBERSHIP_PAGES; page += 1) {
208
+ const offset = page * MEMBERSHIP_PAGE;
209
+ const raw = await list({
210
+ userId,
211
+ limit: MEMBERSHIP_PAGE,
212
+ offset
213
+ });
214
+ const rows = Array.isArray(raw) ? raw : isRecord(raw) && Array.isArray(raw.data) ? raw.data : [];
215
+ for (const item of rows) {
216
+ const row = membershipRow(item, userId);
217
+ if (row !== void 0) out.push(row);
218
+ }
219
+ const total = isRecord(raw) && typeof raw.totalCount === "number" ? raw.totalCount : void 0;
220
+ if (rows.length < MEMBERSHIP_PAGE || total !== void 0 && offset + rows.length >= total) break;
221
+ }
222
+ return out;
223
+ } catch {
224
+ return;
225
+ }
226
+ }
227
+ function subjectFromClerk(authObject, options = {}) {
228
+ return fromClerk(authObject, options, extraMemberships);
229
+ }
230
+ /**
231
+ * A resolver that keeps each user's `memberships: 'all'` list for
232
+ * `cache.ttl` (at most 30 seconds), so a removed membership grants until then.
233
+ */
234
+ function createClerkSubjectResolver(options = {}) {
235
+ const { cache, ...rest } = options;
236
+ const lists = ttlCache(ttlMs(cache));
237
+ const load = async (backend, userId) => {
238
+ const hit = lists.get(userId);
239
+ if (hit !== void 0) return hit;
240
+ const loaded = await extraMemberships(backend, userId);
241
+ if (loaded !== void 0) lists.set(userId, loaded);
242
+ return loaded;
243
+ };
244
+ return (authObject) => fromClerk(authObject, rest, load);
245
+ }
246
+ async function fromClerk(authObject, options, loadMemberships) {
247
+ try {
248
+ const trustedObject = isAuthObject(authObject);
249
+ const trustedPayload = isVerifiedPayload(authObject);
250
+ if (!trustedObject && !trustedPayload) return anonymousSubject();
251
+ const mapped = trustedObject ? fromAuthObject(authObject) : fromPayload(authObject);
252
+ if (mapped.id === void 0 || mapped.id === "") return anonymousSubject();
253
+ const declared = options.declared;
254
+ const orgRole = mapped.orgRole !== void 0 && (declared === void 0 || declared.includes(mapped.orgRole)) ? mapped.orgRole : void 0;
255
+ const permissionRoles = Object.keys(options.permissions ?? {}).filter((key) => mapped.orgPermissions.includes(key));
256
+ const features = featureRoles(mapped.claims["fea"], options.features);
257
+ const plans = planSlugs(mapped.claims["pla"]);
258
+ const membershipRoles = [
259
+ ...orgRole === void 0 ? [] : [orgRole],
260
+ ...permissionRoles,
261
+ ...features.org
262
+ ];
263
+ const sessionMembership = mapped.tenant !== void 0 && (membershipRoles.length > 0 || plans.org.length > 0) ? [compact({
264
+ tenant: mapped.tenant,
265
+ roles: membershipRoles,
266
+ entitlements: plans.org.length === 0 ? void 0 : plans.org
267
+ })] : [];
268
+ const loaded = options.memberships === "all" ? await loadMemberships(options.backend, mapped.id) ?? [] : [];
269
+ const seen = new Set(sessionMembership.map((item) => item.tenant));
270
+ const memberships = [...sessionMembership, ...loaded.filter((item) => {
271
+ if (seen.has(item.tenant)) return false;
272
+ seen.add(item.tenant);
273
+ return true;
274
+ })];
275
+ let claims = extraClaims(mapped.claims);
276
+ if (options.schema !== void 0) claims = validateClaims(claims, options.schema) ?? {};
277
+ const global = [...globalRolesFrom(mapped.claims, options.globalRoles), ...features.user];
278
+ const exp = mapped.claims["exp"];
279
+ const principal = compact({
280
+ id: mapped.id,
281
+ kind: "user",
282
+ tenant: mapped.tenant,
283
+ roles: global,
284
+ plans: plans.user.length === 0 ? void 0 : plans.user,
285
+ memberships,
286
+ clerkPermissions: mapped.orgPermissions,
287
+ claims: Object.keys(claims).length === 0 ? void 0 : claims,
288
+ featureSources: Object.keys(features.sources).length === 0 ? void 0 : features.sources
289
+ });
290
+ return freezeDeep(compact({
291
+ principal,
292
+ context: {},
293
+ session: mapped.session,
294
+ expiresAt: typeof exp === "number" ? exp : void 0
295
+ }));
296
+ } catch {
297
+ return anonymousSubject();
298
+ }
299
+ }
300
+ //#endregion
301
+ export { createClerkSubjectResolver, subjectFromClerk };
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { t as run } from "../run-YXCJDNYk.js";
3
+ import { n as streamHasColors } from "../style-CTm1AXDT.js";
4
+ //#region src/cli/bin.ts
5
+ const result = await run(process.argv.slice(2), {
6
+ cwd: process.cwd(),
7
+ io: {
8
+ env: process.env,
9
+ stdout: (text) => {
10
+ process.stdout.write(text.endsWith("\n") ? text : `${text}\n`);
11
+ },
12
+ stderr: (text) => {
13
+ process.stderr.write(text.endsWith("\n") ? text : `${text}\n`);
14
+ },
15
+ color: streamHasColors(process.stdout),
16
+ interactive: process.stdin.isTTY === true && process.stdout.isTTY === true && process.env["CI"] === void 0
17
+ }
18
+ });
19
+ process.exitCode ??= result.code;
20
+ //#endregion
@@ -0,0 +1,46 @@
1
+ import { a as CatalogDocument, c as CatalogResource, d as CatalogSupportAccess, f as CatalogUsage, l as CatalogRole, n as CatalogApproval, r as CatalogBreakGlass, s as CatalogPermission, t as CatalogActivation, u as CatalogScope } from "../types-Dnemwd77.js";
2
+ import { _ as RunResult, c as RlsConfig, d as RlsMembershipTable, f as RlsMemberships, g as RlsTarget, h as RlsSuspension, i as PermDockConfig, l as RlsDialect, m as RlsSuspendedScope, n as CliIo, o as RlsActiveRow, p as RlsSuspendedMembership, r as CollectConfig, s as RlsApiKeys, t as CatalogConfig, u as RlsFunctionMapping } from "../types-BPxgszlT.js";
3
+ //#region src/cli/catalog-path.d.ts
4
+ /**
5
+ * The absolute path `permdock collect` writes the catalog to: `collect.out`,
6
+ * then `catalog.out`, then `permissions.catalog.json`, resolved against `cwd`.
7
+ * `out` overrides the config, as `collect --out` does.
8
+ */
9
+ export declare function catalogPath(config: PermDockConfig, cwd: string, out?: string): string;
10
+ //#endregion
11
+ //#region src/cli/config.d.ts
12
+ export declare function defineConfig<T extends PermDockConfig>(config: T): T;
13
+ //#endregion
14
+ //#region src/cli/markers.d.ts
15
+ /** The first line of a hook migration `permdock supabase hook generate` wrote. */
16
+ type SupabaseHookMarker = {
17
+ /** The marker's major: `1` for `-- permdock:hook v1`. */
18
+ readonly version: number;
19
+ readonly schema?: string;
20
+ readonly tenantClaim?: string;
21
+ readonly budget?: number;
22
+ readonly claims: readonly string[];
23
+ };
24
+ /** The first line of a `--grants-out` migration. */
25
+ type SupabaseGrantsMarker = {
26
+ readonly version: number;
27
+ readonly schema?: string;
28
+ };
29
+ /**
30
+ * Reads the `-- permdock:hook v<N>` line that starts a generated hook
31
+ * migration. Undefined when the first line is not a hook marker.
32
+ */
33
+ export declare function parseHookMarker(sql: string): SupabaseHookMarker | undefined;
34
+ /**
35
+ * Reads the `-- permdock:grants v<N>` line that starts a `--grants-out`
36
+ * migration. Undefined when the first line is not a grants marker.
37
+ */
38
+ export declare function parseGrantsMarker(sql: string): SupabaseGrantsMarker | undefined;
39
+ //#endregion
40
+ //#region src/cli/run.d.ts
41
+ export declare function run(argv: readonly string[], options?: {
42
+ readonly cwd?: string;
43
+ readonly io?: CliIo;
44
+ }): Promise<RunResult>;
45
+ //#endregion
46
+ export type { CatalogActivation, CatalogApproval, CatalogBreakGlass, CatalogConfig, CatalogDocument, CatalogPermission, CatalogResource, CatalogRole, CatalogScope, CatalogSupportAccess, CatalogUsage, CollectConfig, PermDockConfig, RlsActiveRow, RlsApiKeys, RlsConfig, RlsDialect, RlsFunctionMapping, RlsMembershipTable, RlsMemberships, RlsSuspendedMembership, RlsSuspendedScope, RlsSuspension, RlsTarget, RunResult, SupabaseGrantsMarker, SupabaseHookMarker };
@@ -0,0 +1,5 @@
1
+ import { t as catalogPath } from "../catalog-path-CnI0XTFK.js";
2
+ import { t as defineConfig } from "../config-BJiM-xAm.js";
3
+ import { o as parseGrantsMarker, s as parseHookMarker } from "../markers-B0hYLvMD.js";
4
+ import { t as run } from "../run-YXCJDNYk.js";
5
+ export { catalogPath, defineConfig, parseGrantsMarker, parseHookMarker, run };
@@ -0,0 +1,12 @@
1
+ //#region src/core/clients.d.ts
2
+ /**
3
+ * Stable names for OAuth clients whose ids differ per environment or are
4
+ * assigned at dynamic registration. A record maps each name to the client
5
+ * id (or ids) it stands for; an unset id (an environment variable that is
6
+ * not defined) names nothing. A function maps a verified client id to a
7
+ * name, or `undefined`. Policy delegations name the client (`to: { kind,
8
+ * client }`), never its id.
9
+ */
10
+ type ClientNames = Readonly<Record<string, string | readonly string[] | undefined>> | ((clientId: string) => string | undefined);
11
+ //#endregion
12
+ export { ClientNames as t };
@@ -0,0 +1,23 @@
1
+ //#region src/core/clients.ts
2
+ /**
3
+ * The name `clients` gives `clientId`, or `undefined`: unknown ids, an id
4
+ * two names claim, a function that throws or returns anything but a
5
+ * non-empty string. Never throws.
6
+ */
7
+ function clientNameOf(clients, clientId) {
8
+ if (clients === void 0 || clientId === "") return;
9
+ try {
10
+ if (typeof clients === "function") {
11
+ const name = clients(clientId);
12
+ return typeof name === "string" && name !== "" ? name : void 0;
13
+ }
14
+ const names = Object.entries(clients).flatMap(([name, ids]) => {
15
+ return name !== "" && (typeof ids === "string" ? [ids] : Array.isArray(ids) ? ids : []).includes(clientId) ? [name] : [];
16
+ });
17
+ return names.length === 1 ? names[0] : void 0;
18
+ } catch {
19
+ return;
20
+ }
21
+ }
22
+ //#endregion
23
+ export { clientNameOf as t };
@@ -0,0 +1,90 @@
1
+ import { $ as AccessEvent, At as SnapshotSource, Ft as TokenVerifier, Nt as TokenFailureCause, at as DecisionSink, bn as PolicySource, ht as MembershipEvent, ot as DirectoryEvent, rt as DecisionEvent, tt as CredentialEvent } from "../policy-CFZAr_Al.js";
2
+ import { f as ApprovalStore } from "../types-vKyAMtcX.js";
3
+ import { n as CatalogEventData, o as CloudEventType } from "../sink-Gs6TTVa-.js";
4
+ import { a as JsonWebKeySet, g as ReplayStore } from "../types-9AWO9EGt.js";
5
+ //#region src/cloud/types.d.ts
6
+ type CloudEndpointOptions = {
7
+ readonly url?: string;
8
+ readonly environment?: string;
9
+ };
10
+ type CloudEndpoints = {
11
+ /** The environment URL, `<url>/v1/environments/<env>`: `iss` and `aud` of the policy document. */
12
+ readonly issuer: string;
13
+ /** The environment's JWK Set URL, for `joseTokenVerifier({ jwks })`. */
14
+ readonly jwks: string;
15
+ };
16
+ type CloudOptions = CloudEndpointOptions & {
17
+ readonly key?: string;
18
+ readonly fetch?: typeof fetch;
19
+ readonly flushAt?: number;
20
+ /** Most events the sink holds while the Cloud is unreachable (default 10 000); the oldest are dropped first. */
21
+ readonly capacity?: number;
22
+ readonly waitUntil?: (task: Promise<void>) => void;
23
+ /**
24
+ * Verifies the environment's signed policy document, typically
25
+ * `joseTokenVerifier({ jwks: cloudEndpoints().jwks })`. Without one,
26
+ * `policies.current()` stays `null`: an unverifiable document is never applied.
27
+ */
28
+ readonly verifier?: TokenVerifier;
29
+ };
30
+ type CloudClient = CloudEndpoints & {
31
+ readonly approvals: ApprovalStore;
32
+ readonly sink: DecisionSink;
33
+ readonly snapshots: SnapshotSource;
34
+ readonly policies: PolicySource;
35
+ };
36
+ //#endregion
37
+ //#region src/cloud/create.d.ts
38
+ /**
39
+ * The environment URL and JWK Set URL `cloud()` uses, resolved with the same
40
+ * fallbacks (`PERMDOCK_CLOUD_URL`; `PERMDOCK_CLOUD_ENV`, `VERCEL_ENV`, `production`).
41
+ */
42
+ export declare function cloudEndpoints(options?: CloudEndpointOptions): CloudEndpoints;
43
+ export declare function cloud(options?: CloudOptions): CloudClient;
44
+ //#endregion
45
+ //#region src/cloud/webhook.d.ts
46
+ type Envelope<TType extends CloudEventType, TData> = {
47
+ readonly specversion: "1.0";
48
+ readonly type: TType;
49
+ readonly source: string;
50
+ readonly subject?: string;
51
+ readonly id: string;
52
+ readonly time: string;
53
+ readonly datacontenttype: "application/json";
54
+ readonly data: TData;
55
+ };
56
+ /** A CloudEvent PermDock Cloud delivers, discriminated by `type`. */
57
+ type PermDockCloudEvent = Envelope<"dev.permdock.decision", DecisionEvent> | Envelope<"dev.permdock.approval", DecisionEvent> | Envelope<"dev.permdock.directory", DirectoryEvent> | Envelope<"dev.permdock.membership", MembershipEvent> | Envelope<"dev.permdock.credential", CredentialEvent> | Envelope<"dev.permdock.catalog", CatalogEventData> | Envelope<"dev.permdock.access.started", AccessEvent> | Envelope<"dev.permdock.access.ended", AccessEvent> | Envelope<"dev.permdock.access.revoked", AccessEvent>;
58
+ type VerifyWebhookOptions = {
59
+ /** Your receiver's URL; the batch `aud` must name it. */
60
+ readonly audience: string | readonly string[];
61
+ /** A verifier over the Cloud JWKS; built from `jwks` when absent. */
62
+ readonly verifier?: TokenVerifier;
63
+ /** `cloud().jwks`, a JWKS URL, or an inline key set. */
64
+ readonly jwks?: string | URL | JsonWebKeySet;
65
+ /** Drops a batch whose `jti` was already delivered. */
66
+ readonly replay?: ReplayStore;
67
+ };
68
+ type WebhookFailureReason = "unsigned" | "invalid-token" | "invalid-events" | "replayed";
69
+ type VerifiedWebhook = {
70
+ readonly ok: true;
71
+ readonly id: string;
72
+ readonly events: readonly PermDockCloudEvent[];
73
+ } | {
74
+ readonly ok: false;
75
+ readonly reason: WebhookFailureReason;
76
+ readonly cause?: TokenFailureCause;
77
+ };
78
+ /**
79
+ * Validates one CloudEvent against the closed type list and its data shape;
80
+ * returns `null` for anything else, never throws.
81
+ */
82
+ export declare function parseCloudEvent(value: unknown): PermDockCloudEvent | null;
83
+ /**
84
+ * Verifies a PermDock Cloud webhook delivery: a compact JWS with
85
+ * `typ: permdock-decisions+jwt` whose `events` claim holds CloudEvents.
86
+ * There is no unsigned mode, and it never throws.
87
+ */
88
+ export declare function verifyWebhook(request: Request, options: VerifyWebhookOptions): Promise<VerifiedWebhook>;
89
+ //#endregion
90
+ export type { CloudClient, CloudEndpointOptions, CloudEndpoints, CloudOptions, PermDockCloudEvent, VerifiedWebhook, VerifyWebhookOptions, WebhookFailureReason };