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,208 @@
1
+ import { t as compact } from "./compact-y6vfu2_f.js";
2
+ import { t as describe } from "./describe-B_gVZEVi.js";
3
+ import { a as deniedMessage } from "./errors-Cz5zn0mW.js";
4
+ import { t as createPermDock } from "./permdock-CzqXjCpU.js";
5
+ import { n as resourceRef } from "./resource-ref-CaS9yVPi.js";
6
+ import { t as mayUse } from "./may-use-DndQ5tQ-.js";
7
+ import { l as storedApprovalToken, s as resumeDecision } from "./helpers-H_KARDVC.js";
8
+ import { t as instanceOptions } from "./instance-options-Dhhcnm3y.js";
9
+ import { n as tenantScope, t as actorFrom } from "./adapter-context-mlWsVGGg.js";
10
+ //#region src/agent/reason.ts
11
+ function modelReason(decision, permission, subjectId) {
12
+ if (decision.outcome === "denied") return deniedMessage(permission?.key ?? "unknown", subjectId, decision.denials, decision.alternatives.map((leaf) => leaf.key));
13
+ return describe(decision).detail;
14
+ }
15
+ function unmappedReason(toolName) {
16
+ return `Denied: unmapped tool ${toolName}.`;
17
+ }
18
+ function thrownReason(toolName) {
19
+ return `Denied: ${toolName} failed closed.`;
20
+ }
21
+ //#endregion
22
+ //#region src/agent/kernel.ts
23
+ /** The resume token an agent run carries under the namespaced `permdockApproval` key. */
24
+ function approvalTokenOf(context) {
25
+ if (context === null || typeof context !== "object") return;
26
+ const token = context.permdockApproval;
27
+ return typeof token === "string" && token !== "" ? token : void 0;
28
+ }
29
+ function runDecide(permdock, permission, data, how) {
30
+ return permdock.decide(permission, data, how);
31
+ }
32
+ function createAgentKernel(policy, options) {
33
+ const cache = /* @__PURE__ */ new WeakMap();
34
+ const instance = (context) => {
35
+ if (typeof context === "object" && context !== null) {
36
+ const hit = cache.get(context);
37
+ if (hit !== void 0) return hit;
38
+ }
39
+ const built = (async () => {
40
+ let user = null;
41
+ try {
42
+ user = await options.subject(context);
43
+ } catch {
44
+ user = null;
45
+ }
46
+ const actor = await actorFrom(options.actor, context);
47
+ let delegation;
48
+ if (options.delegation !== void 0) try {
49
+ delegation = await options.delegation(context);
50
+ } catch {
51
+ delegation = void 0;
52
+ }
53
+ const { tenant } = await tenantScope(options.tenant, context);
54
+ const created = await createPermDock(policy, user, compact({
55
+ tenant,
56
+ actor,
57
+ delegation,
58
+ ...instanceOptions(options)
59
+ }));
60
+ return options.wrap?.(created) ?? created;
61
+ })();
62
+ if (typeof context === "object" && context !== null) {
63
+ cache.set(context, built);
64
+ const release = () => {
65
+ if (cache.get(context) === built) cache.delete(context);
66
+ };
67
+ built.then(release, release);
68
+ }
69
+ return built;
70
+ };
71
+ const boundary = options.boundary ?? "tool-args";
72
+ const tools = options.tools ?? {};
73
+ const run = async (binding, args, context, how) => {
74
+ let permdock;
75
+ try {
76
+ permdock = await instance(context);
77
+ let data;
78
+ if (binding.data !== void 0) {
79
+ try {
80
+ data = await binding.data(args);
81
+ } catch {
82
+ return {
83
+ ok: false,
84
+ failure: "load-failed",
85
+ permdock
86
+ };
87
+ }
88
+ if (binding.permission.kind === "instance" && (data === null || data === void 0)) return {
89
+ ok: false,
90
+ failure: "no-data",
91
+ permdock
92
+ };
93
+ }
94
+ const raw = runDecide(permdock, binding.permission, data, {
95
+ adapter: options.adapter,
96
+ boundary,
97
+ source: how.source
98
+ });
99
+ const decision = how.resume ? await resumeDecision({
100
+ decision: raw,
101
+ permission: binding.permission,
102
+ subject: permdock.subject,
103
+ store: options.store,
104
+ resource: resourceRef(binding.permission, data),
105
+ adapter: options.adapter,
106
+ token: how.decideOptions.resumeToken ?? await storedApprovalToken(options.store, raw, { denyPending: how.decideOptions.denyPending === true })
107
+ }) : raw;
108
+ return {
109
+ ok: true,
110
+ permdock,
111
+ data,
112
+ raw,
113
+ decision
114
+ };
115
+ } catch {
116
+ return compact({
117
+ ok: false,
118
+ failure: "failed",
119
+ permdock
120
+ });
121
+ }
122
+ };
123
+ const check = (binding, args, context, checkOptions = {}) => run(binding, args, context, {
124
+ resume: checkOptions.simulate !== true,
125
+ source: checkOptions.simulate === true ? "simulate" : "adapter",
126
+ decideOptions: checkOptions
127
+ });
128
+ const evaluate = async (binding, toolName, args, context, decideOptions = {}) => {
129
+ const checked = await check(binding, args, context, decideOptions);
130
+ if (!checked.ok) {
131
+ if (checked.failure !== "no-data" || checked.permdock === void 0) return {
132
+ outcome: "denied",
133
+ decision: null,
134
+ permission: binding.permission,
135
+ reason: thrownReason(toolName)
136
+ };
137
+ const decision = {
138
+ outcome: "denied",
139
+ denials: [{
140
+ role: null,
141
+ reason: "validation"
142
+ }],
143
+ alternatives: []
144
+ };
145
+ return {
146
+ outcome: "denied",
147
+ decision,
148
+ permission: binding.permission,
149
+ reason: modelReason(decision, binding.permission, checked.permdock.subject.principal?.id)
150
+ };
151
+ }
152
+ const { permdock, decision, data } = checked;
153
+ if (decision.outcome === "granted") return {
154
+ outcome: "granted",
155
+ decision,
156
+ permission: binding.permission,
157
+ data
158
+ };
159
+ if (decision.outcome === "approval-required") return {
160
+ outcome: "approval-required",
161
+ decision,
162
+ permission: binding.permission,
163
+ data,
164
+ token: decision.token,
165
+ summary: modelReason(decision, binding.permission, permdock.subject.principal?.id)
166
+ };
167
+ return {
168
+ outcome: "denied",
169
+ decision,
170
+ permission: binding.permission,
171
+ reason: modelReason(decision, binding.permission, permdock.subject.principal?.id)
172
+ };
173
+ };
174
+ const tokenFor = async (binding, args, context) => {
175
+ const checked = await run(binding, args, context, {
176
+ resume: false,
177
+ source: "adapter",
178
+ decideOptions: {}
179
+ });
180
+ return checked.ok && checked.raw.outcome === "approval-required" ? checked.raw.token : void 0;
181
+ };
182
+ const decideTool = (toolName, args, context, decideOptions = {}) => {
183
+ const binding = Object.hasOwn(tools, toolName) ? tools[toolName] : void 0;
184
+ if (binding === void 0) return Promise.resolve({
185
+ outcome: "denied",
186
+ decision: null,
187
+ permission: void 0,
188
+ reason: unmappedReason(toolName)
189
+ });
190
+ return evaluate(binding, toolName, args, context, decideOptions);
191
+ };
192
+ const allowedToolNames = async (context) => {
193
+ const permdock = await instance(context);
194
+ const allowed = /* @__PURE__ */ new Set();
195
+ for (const [name, binding] of Object.entries(tools)) if (mayUse(permdock, binding.permission)) allowed.add(name);
196
+ return allowed;
197
+ };
198
+ return {
199
+ instance,
200
+ decideTool,
201
+ evaluate,
202
+ check,
203
+ tokenFor,
204
+ allowedToolNames
205
+ };
206
+ }
207
+ //#endregion
208
+ export { createAgentKernel as n, approvalTokenOf as t };
@@ -0,0 +1,78 @@
1
+ import { Ir as Condition, Pr as Subject, mn as WhereResult } from "../policy-CFZAr_Al.js";
2
+ import { r as RelationsMapping } from "../graph-sql-B-dsAT6j.js";
3
+ import { s as MembershipsMapping } from "../compile-CNnl6uIt.js";
4
+ import { n as WithSubjectOptions, t as RowCheck } from "../row-check-Dt35czLy.js";
5
+ //#region src/kysely/types.d.ts
6
+ type KyselySelectQuery = {
7
+ select(expr: unknown): KyselySelectQuery;
8
+ where(column: string, op: string, value: unknown): KyselySelectQuery;
9
+ where(expression: unknown): KyselySelectQuery;
10
+ whereRef(left: string, op: string, right: string): KyselySelectQuery;
11
+ };
12
+ type KyselyExpressionBuilder = {
13
+ (left: unknown, op: string, right: unknown): unknown;
14
+ and(args: readonly unknown[]): unknown;
15
+ or(args: readonly unknown[]): unknown;
16
+ not(value: unknown): unknown;
17
+ lit(value: unknown): unknown;
18
+ val(value: unknown): unknown;
19
+ ref(column: string): unknown;
20
+ exists?(query: unknown): unknown;
21
+ selectFrom?(table: string): KyselySelectQuery;
22
+ };
23
+ /** Kysely's `sql` tag; `import { sql } from 'kysely'`. */
24
+ type KyselySql = {
25
+ (strings: TemplateStringsArray, ...values: unknown[]): unknown;
26
+ ref(reference: string): unknown;
27
+ };
28
+ type KyselyWhereOptions = {
29
+ readonly columns?: Readonly<Record<string, string>>;
30
+ /** Condition fields that are Postgres arrays; `contains` on them is `@>`. */
31
+ readonly listFields?: readonly string[];
32
+ readonly subject?: Subject;
33
+ readonly memberships?: MembershipsMapping;
34
+ /** Where the relation graph lives; graph grants compile to Postgres subqueries with it and are refused without. */
35
+ readonly relations?: RelationsMapping;
36
+ readonly now?: number;
37
+ /** Kysely's `sql` tag, for graph subqueries on runtimes without `require`; loaded from the `kysely` peer by default. */
38
+ readonly sql?: KyselySql;
39
+ };
40
+ type KyselyWithSubjectOptions = WithSubjectOptions & {
41
+ /** Kysely's `sql` tag, on runtimes without `require`; loaded from the `kysely` peer by default. */
42
+ readonly sql?: KyselySql;
43
+ };
44
+ //#endregion
45
+ //#region src/kysely/to-where.d.ts
46
+ export declare function toWhere(input: Condition | WhereResult, table: string, options?: KyselyWhereOptions): (eb: KyselyExpressionBuilder) => unknown;
47
+ type KyselyLike<Trx> = {
48
+ transaction(): {
49
+ execute<T>(fn: (trx: Trx) => Promise<T>): Promise<T>;
50
+ };
51
+ };
52
+ /**
53
+ * Runs `fn` in a transaction whose role and claims are `permdock.subject`'s, so the generated
54
+ * RLS policies decide for the same subject as the in-process checks.
55
+ */
56
+ export declare function withSubject<Trx, T>(db: KyselyLike<Trx>, permdock: {
57
+ readonly subject: Subject;
58
+ }, fn: (trx: Trx) => Promise<T>, options?: KyselyWithSubjectOptions): Promise<T>;
59
+ type KyselySelectable = {
60
+ selectFrom(table: never): {
61
+ select(selection: (eb: never) => unknown): {
62
+ where(where: never): {
63
+ limit(count: number): {
64
+ execute(): Promise<readonly {
65
+ readonly granted?: unknown;
66
+ }[]>;
67
+ };
68
+ };
69
+ };
70
+ };
71
+ };
72
+ /**
73
+ * One query for one row: `{ found: false }` when `key` matches nothing, otherwise whether the
74
+ * permission filter keeps the row. Throws when `key` matches more than one row.
75
+ */
76
+ export declare function checkRow(db: KyselySelectable, table: string, input: Condition | WhereResult, key: (eb: KyselyExpressionBuilder) => unknown, options?: KyselyWhereOptions): Promise<RowCheck>;
77
+ //#endregion
78
+ export type { KyselyExpressionBuilder, KyselySql, KyselyWhereOptions, KyselyWithSubjectOptions, MembershipsMapping, RelationsMapping, RowCheck, WithSubjectOptions };
@@ -0,0 +1,129 @@
1
+ import { t as compact } from "../compact-y6vfu2_f.js";
2
+ import { w as assertSafeKey } from "../permissions-DVoF6dMt.js";
3
+ import { n as escapeLike, t as compileWhere } from "../compile-Ba4blROR.js";
4
+ import { i as rowCheckFrom, r as subjectStatements, t as statementTemplate } from "../subject-settings-BwBmCdTR.js";
5
+ //#region src/kysely/to-where.ts
6
+ function ident(name) {
7
+ assertSafeKey(name, "sql identifier");
8
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name)) throw new Error(`PermDock: unsafe SQL identifier '${name}'`);
9
+ return name;
10
+ }
11
+ function col(table, field, columns) {
12
+ assertSafeKey(field, "condition field");
13
+ return `${ident(table)}.${ident(columns?.[field] ?? field)}`;
14
+ }
15
+ function existsExpr(eb, node, table, options) {
16
+ if (eb.exists === void 0 || eb.selectFrom === void 0) return eb.lit(false);
17
+ const m = (name) => `m.${ident(name)}`;
18
+ let query = eb.selectFrom(`${ident(node.table)} as m`).select(eb.lit(1)).whereRef(m(node.rowColumn), "=", col(table, node.rowField, options.columns)).where(m(node.user), "=", eb.val(node.userValue));
19
+ if (node.roles.length > 0) query = query.where(m(node.role), "in", node.roles);
20
+ if (node.expiresAt !== void 0) {
21
+ const expires = eb.ref(m(node.expiresAt));
22
+ query = query.where(eb.or([eb(expires, "is", null), eb(expires, ">", eb.val(node.now))]));
23
+ }
24
+ if (node.tenantColumn !== void 0 && node.tenantValue !== void 0) {
25
+ const tenant = eb.ref(m(node.tenantColumn));
26
+ query = query.where(eb.or([eb(tenant, "is", null), eb(tenant, "=", eb.val(node.tenantValue))]));
27
+ }
28
+ if (node.resourceColumn !== void 0 && node.resourceValue !== void 0) query = query.where(m(node.resourceColumn), "=", eb.val(node.resourceValue));
29
+ return eb.exists(query);
30
+ }
31
+ function containsExpr(eb, column, field, value, options) {
32
+ if (options.listFields?.includes(field) === true) return eb(column, "@>", eb.val([value]));
33
+ return typeof value === "string" ? eb(column, "like", eb.val(`%${escapeLike(value)}%`)) : eb(column, "@>", eb.val(value));
34
+ }
35
+ function loadSql(injected) {
36
+ if (injected !== void 0) return injected;
37
+ const loader = globalThis.process?.getBuiltinModule?.("node:module");
38
+ try {
39
+ if (loader === void 0) throw new Error("no module loader");
40
+ return loader.createRequire(import.meta.url)("kysely").sql;
41
+ } catch {
42
+ throw new Error("PermDock: graph grants and withSubject in permdock/kysely need the kysely peer; pass `sql` on runtimes without require");
43
+ }
44
+ }
45
+ function graphExpr(node, table, options) {
46
+ const sql = loadSql(options.sql);
47
+ const strings = [""];
48
+ const values = [];
49
+ for (const part of node.parts) {
50
+ if ("text" in part) {
51
+ strings[strings.length - 1] += part.text;
52
+ continue;
53
+ }
54
+ values.push("column" in part ? sql.ref(col(table, part.column, options.columns)) : "subject" in part ? node.subject : part.value);
55
+ strings.push("");
56
+ }
57
+ const template = strings;
58
+ Object.defineProperty(template, "raw", { value: strings });
59
+ return sql(template, ...values);
60
+ }
61
+ function render(eb, node, table, options) {
62
+ switch (node.kind) {
63
+ case "never": return eb.lit(false);
64
+ case "always": return eb.lit(true);
65
+ case "isNull": {
66
+ const column = eb.ref(col(table, node.field, options.columns));
67
+ return node.negated ? eb(column, "is not", null) : eb(column, "is", null);
68
+ }
69
+ case "and": return eb.and(node.items.map((item) => render(eb, item, table, options)));
70
+ case "or": return eb.or(node.items.map((item) => render(eb, item, table, options)));
71
+ case "not": return eb.not(render(eb, node.item, table, options));
72
+ case "exists": return existsExpr(eb, node, table, options);
73
+ case "sql": return graphExpr(node, table, options);
74
+ case "compare": {
75
+ const column = eb.ref(col(table, node.field, options.columns));
76
+ switch (node.op) {
77
+ case "eq": return eb(column, "=", eb.val(node.value));
78
+ case "ne": return eb(column, "!=", eb.val(node.value));
79
+ case "gt": return eb(column, ">", eb.val(node.value));
80
+ case "gte": return eb(column, ">=", eb.val(node.value));
81
+ case "lt": return eb(column, "<", eb.val(node.value));
82
+ case "lte": return eb(column, "<=", eb.val(node.value));
83
+ case "in": return eb(column, "in", node.value);
84
+ case "notIn": return eb(column, "not in", node.value);
85
+ case "contains": return containsExpr(eb, column, node.field, node.value, options);
86
+ /* v8 ignore next 4 */
87
+ default: {
88
+ const exhaustive = node.op;
89
+ throw new Error(`PermDock: unknown compare '${String(exhaustive)}'`);
90
+ }
91
+ }
92
+ }
93
+ /* v8 ignore next 6 */
94
+ default: throw new Error(`PermDock: unknown compiled node '${String(node)}'`);
95
+ }
96
+ }
97
+ function toWhere(input, table, options = {}) {
98
+ const compiled = compileWhere(input, compact({
99
+ subject: options.subject,
100
+ memberships: options.memberships,
101
+ now: options.now,
102
+ relations: options.relations
103
+ }));
104
+ return (eb) => render(eb, compiled, table, options);
105
+ }
106
+ /**
107
+ * Runs `fn` in a transaction whose role and claims are `permdock.subject`'s, so the generated
108
+ * RLS policies decide for the same subject as the in-process checks.
109
+ */
110
+ function withSubject(db, permdock, fn, options = {}) {
111
+ const statements = subjectStatements(permdock, options);
112
+ const sql = loadSql(options.sql);
113
+ return db.transaction().execute(async (trx) => {
114
+ for (const statement of statements) await sql(statementTemplate(statement), ...statement.values).execute(trx);
115
+ return fn(trx);
116
+ });
117
+ }
118
+ /**
119
+ * One query for one row: `{ found: false }` when `key` matches nothing, otherwise whether the
120
+ * permission filter keeps the row. Throws when `key` matches more than one row.
121
+ */
122
+ async function checkRow(db, table, input, key, options = {}) {
123
+ const sql = loadSql(options.sql);
124
+ const filter = toWhere(input, table, options);
125
+ const rows = await db.selectFrom(table).select(((eb) => sql`coalesce(${filter(eb)}, false)`.as("granted"))).where(key).limit(2).execute();
126
+ return rowCheckFrom(rows);
127
+ }
128
+ //#endregion
129
+ export { checkRow, toWhere, withSubject };
@@ -0,0 +1,60 @@
1
+ import { createContext, useLayoutEffect, useRef, useState } from "react";
2
+ //#region src/react/context.ts
3
+ const PermDockStoreContext = createContext(null);
4
+ const PermDockSnapshotPromiseContext = createContext(null);
5
+ //#endregion
6
+ //#region src/react/keyed.ts
7
+ /**
8
+ * `create()` once per distinct `inputs`, held in state: React may drop a
9
+ * `useMemo` value and rebuild it, and a rebuilt store loses its answers,
10
+ * polls and followed snapshot.
11
+ */
12
+ function useKeyed(create, inputs) {
13
+ const [held, setHeld] = useState(() => ({
14
+ inputs,
15
+ value: create()
16
+ }));
17
+ if (held.inputs.length === inputs.length && held.inputs.every((input, index) => Object.is(input, inputs[index]))) return held.value;
18
+ const next = {
19
+ inputs,
20
+ value: create()
21
+ };
22
+ setHeld(next);
23
+ return next.value;
24
+ }
25
+ //#endregion
26
+ //#region src/react/live-options.ts
27
+ function sameHeaders(a, b) {
28
+ if (a === b) return true;
29
+ if (a === void 0 || b === void 0) return false;
30
+ const keys = Object.keys(a);
31
+ return keys.length === Object.keys(b).length && keys.every((key) => Object.hasOwn(b, key) && a[key] === b[key]);
32
+ }
33
+ /**
34
+ * Store options whose identity survives a re-render, so an inline `headers`
35
+ * object or `fetch` arrow does not rebuild the store and drop its snapshot.
36
+ * `headers` compare by value, unless `headersByValue` is `false` for a store
37
+ * that only reads `readHeaders`; `fetch` and `verifier` call the latest prop.
38
+ */
39
+ function useLiveOptions(props, headersByValue = true) {
40
+ const latest = useRef(props);
41
+ useLayoutEffect(() => {
42
+ latest.current = props;
43
+ });
44
+ const [headers, setHeaders] = useState(props.headers);
45
+ if (headersByValue && !sameHeaders(headers, props.headers)) setHeaders(props.headers);
46
+ const [readHeaders] = useState(() => () => latest.current.headers);
47
+ const [liveFetch] = useState(() => (...args) => (latest.current.fetch ?? fetch)(...args));
48
+ const [liveVerifier] = useState(() => ({ verify: (token, expectations) => {
49
+ const verifier = latest.current.verifier;
50
+ return verifier === void 0 ? Promise.reject(/* @__PURE__ */ new Error("PermDock: the verifier prop was removed.")) : verifier.verify(token, expectations);
51
+ } }));
52
+ return {
53
+ headers,
54
+ readHeaders,
55
+ fetch: liveFetch,
56
+ verifier: props.verifier === void 0 ? void 0 : liveVerifier
57
+ };
58
+ }
59
+ //#endregion
60
+ export { PermDockStoreContext as i, useKeyed as n, PermDockSnapshotPromiseContext as r, useLiveOptions as t };
@@ -0,0 +1,75 @@
1
+ import { _ as listPermissions } from "./permissions-DVoF6dMt.js";
2
+ import { dirname, resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createJiti } from "jiti";
5
+ //#region src/cli/load.ts
6
+ /**
7
+ * Errors Node raises while resolving or parsing a module graph, before any of
8
+ * its code runs, so loading it again through jiti cannot repeat a side effect.
9
+ */
10
+ const NOT_NATIVE = /* @__PURE__ */ new Set([
11
+ "ERR_MODULE_NOT_FOUND",
12
+ "ERR_UNKNOWN_FILE_EXTENSION",
13
+ "ERR_UNSUPPORTED_DIR_IMPORT",
14
+ "ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX",
15
+ "ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING"
16
+ ]);
17
+ function loadsWithJiti(error) {
18
+ if (error instanceof SyntaxError) return true;
19
+ const code = error !== null && typeof error === "object" && "code" in error ? error.code : void 0;
20
+ return typeof code === "string" && NOT_NATIVE.has(code);
21
+ }
22
+ function importWithJiti(abs, fresh) {
23
+ return createJiti(import.meta.url, {
24
+ interopDefault: false,
25
+ jsx: true,
26
+ tsconfigPaths: dirname(abs),
27
+ moduleCache: !fresh,
28
+ fsCache: !fresh
29
+ }).import(abs);
30
+ }
31
+ /**
32
+ * Imports a project module the way its bundler would. Node's own `import()`
33
+ * comes first; a module it cannot resolve or parse (tsconfig `paths`
34
+ * aliases, extensionless relative imports, `enum`, TSX) loads through jiti
35
+ * with the `paths` of the nearest `tsconfig.json` above it. Exports are
36
+ * returned as written; `default` is not merged into the namespace.
37
+ */
38
+ async function loadModule(abs, options) {
39
+ let loaded;
40
+ if (options?.fresh === true) loaded = await importWithJiti(abs, true);
41
+ else try {
42
+ loaded = await import(pathToFileURL(abs).href);
43
+ } catch (error) {
44
+ if (!loadsWithJiti(error)) throw error;
45
+ loaded = await importWithJiti(abs, false);
46
+ }
47
+ if (loaded === null || typeof loaded !== "object") throw new Error(`PermDock CLI: module '${abs}' did not export an object`);
48
+ return loaded;
49
+ }
50
+ function pickNamed(mod, names) {
51
+ for (const name of names) if (name in mod) return mod[name];
52
+ return mod["default"];
53
+ }
54
+ function asPermissionTree(value) {
55
+ if (value === null || typeof value !== "object") throw new Error("PermDock CLI: permissions export is not a permission tree");
56
+ return value;
57
+ }
58
+ function asPolicy(value) {
59
+ if (value === null || typeof value !== "object" || !("roles" in value) || !("permissions" in value)) throw new Error("PermDock CLI: policy export is not a Policy");
60
+ return value;
61
+ }
62
+ function leavesOf(tree) {
63
+ return listPermissions(tree);
64
+ }
65
+ /** The configured policy export, or `undefined` when unset or unloadable. */
66
+ async function loadConfiguredPolicy(cwd, path, options) {
67
+ if (path === void 0) return;
68
+ try {
69
+ return asPolicy(pickNamed(await loadModule(resolve(cwd, path), options), ["policy"]));
70
+ } catch {
71
+ return;
72
+ }
73
+ }
74
+ //#endregion
75
+ export { loadModule as a, loadConfiguredPolicy as i, asPolicy as n, pickNamed as o, leavesOf as r, asPermissionTree as t };
@@ -0,0 +1,2 @@
1
+ import { a as loadModule, o as pickNamed } from "./load-DhWEB9P1.js";
2
+ export { loadModule, pickNamed };
@@ -0,0 +1,11 @@
1
+ //#region src/jwt/load-jose.ts
2
+ let cached;
3
+ function loadJose() {
4
+ cached ??= import("jose").catch((cause) => {
5
+ cached = void 0;
6
+ throw new Error("PermDock: permdock/jwt requires the optional peer \"jose\".", { cause });
7
+ });
8
+ return cached;
9
+ }
10
+ //#endregion
11
+ export { loadJose as t };
@@ -0,0 +1,28 @@
1
+ //#region src/agent/lru.ts
2
+ function boundedMap(limit) {
3
+ const map = /* @__PURE__ */ new Map();
4
+ return {
5
+ get: (key) => {
6
+ const value = map.get(key);
7
+ if (value !== void 0) {
8
+ map.delete(key);
9
+ map.set(key, value);
10
+ }
11
+ return value;
12
+ },
13
+ set: (key, value) => {
14
+ map.delete(key);
15
+ map.set(key, value);
16
+ if (map.size > limit) {
17
+ const oldest = map.keys().next();
18
+ if (oldest.done !== true) map.delete(oldest.value);
19
+ }
20
+ },
21
+ delete: (key) => {
22
+ map.delete(key);
23
+ },
24
+ size: () => map.size
25
+ };
26
+ }
27
+ //#endregion
28
+ export { boundedMap as t };