theokit 0.48.13 → 0.50.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 +1 -0
- package/dist/{actions-virtual-module-YQXRSSMW.js → actions-virtual-module-5WBVSDOM.js} +22 -12
- package/dist/actions-virtual-module-5WBVSDOM.js.map +1 -0
- package/dist/{actions-virtual-module-LB4NGONI.js → actions-virtual-module-ZYLMNW6K.js} +13 -8
- package/dist/{actions-virtual-module-LB4NGONI.js.map → actions-virtual-module-ZYLMNW6K.js.map} +1 -1
- package/dist/adapters/agent-mount.d.ts +127 -0
- package/dist/adapters/agent-mount.js +24 -0
- package/dist/adapters/security-headers.d.ts +132 -0
- package/dist/adapters/security-headers.js +64 -0
- package/dist/adapters/security-headers.js.map +1 -0
- package/dist/adapters/web-shim.d.ts +100 -13
- package/dist/adapters/web-shim.js +158 -54
- package/dist/adapters/web-shim.js.map +1 -1
- package/dist/agent-GKUEL6OH.js +15 -0
- package/dist/agent-scan-BZa-pagG.d.ts +16 -0
- package/dist/{app-typed-client-GHO3EWZK.js → app-typed-client-4LAIEGFX.js} +23 -13
- package/dist/app-typed-client-4LAIEGFX.js.map +1 -0
- package/dist/{app-typed-client-G3J5G7E5.js → app-typed-client-DQM3Y6YY.js} +14 -9
- package/dist/app-typed-client-DQM3Y6YY.js.map +1 -0
- package/dist/aws-lambda-VKMYUMP2.js +261 -0
- package/dist/aws-lambda-VKMYUMP2.js.map +1 -0
- package/dist/{build-WU6AKKIB.js → build-FLX6VF7Q.js} +71 -26
- package/dist/build-FLX6VF7Q.js.map +1 -0
- package/dist/{bun-33RD6K7O.js → bun-L7PP6ID5.js} +105 -13
- package/dist/bun-L7PP6ID5.js.map +1 -0
- package/dist/{check-45NKUVSQ.js → check-GIPZBFTX.js} +2 -2
- package/dist/{chunk-KD5G3YXI.js → chunk-2AMLGJJA.js} +35 -9
- package/dist/chunk-2AMLGJJA.js.map +1 -0
- package/dist/chunk-3PBAN2YE.js +146 -0
- package/dist/chunk-3PBAN2YE.js.map +1 -0
- package/dist/{chunk-HBU2GIMZ.js → chunk-3QPVEJ7D.js} +15 -9
- package/dist/chunk-3QPVEJ7D.js.map +1 -0
- package/dist/{chunk-47CINLWF.js → chunk-44J2ANQC.js} +2 -2
- package/dist/{chunk-IEES3CHD.js → chunk-47MM2JUK.js} +8 -2
- package/dist/chunk-47MM2JUK.js.map +1 -0
- package/dist/chunk-4X6H2BXP.js +108 -0
- package/dist/chunk-4X6H2BXP.js.map +1 -0
- package/dist/{chunk-A7JBF5FO.js → chunk-5K4TDLRG.js} +8 -5
- package/dist/chunk-5K4TDLRG.js.map +1 -0
- package/dist/chunk-5YPXXSYY.js +181 -0
- package/dist/chunk-5YPXXSYY.js.map +1 -0
- package/dist/{chunk-YGAXV5HR.js → chunk-6J4JWHDJ.js} +191 -112
- package/dist/chunk-6J4JWHDJ.js.map +1 -0
- package/dist/chunk-72DMJBXI.js +424 -0
- package/dist/chunk-72DMJBXI.js.map +1 -0
- package/dist/chunk-7PM6K5EV.js +513 -0
- package/dist/chunk-7PM6K5EV.js.map +1 -0
- package/dist/{chunk-MTEWLGVY.js → chunk-BPYMC7SU.js} +4 -48
- package/dist/chunk-BPYMC7SU.js.map +1 -0
- package/dist/chunk-BU6RJPPJ.js +421 -0
- package/dist/chunk-BU6RJPPJ.js.map +1 -0
- package/dist/{chunk-FB2HBNIC.js → chunk-BX6EUYHU.js} +6 -2
- package/dist/chunk-BX6EUYHU.js.map +1 -0
- package/dist/{chunk-BIVCP6X5.js → chunk-C62IZEJI.js} +465 -202
- package/dist/chunk-C62IZEJI.js.map +1 -0
- package/dist/chunk-D4VP2QPR.js +16 -0
- package/dist/chunk-D4VP2QPR.js.map +1 -0
- package/dist/{chunk-J5MXCGKA.js → chunk-DHAD2O3S.js} +6 -6
- package/dist/chunk-DHAD2O3S.js.map +1 -0
- package/dist/chunk-E43VJ3E5.js +188 -0
- package/dist/chunk-E43VJ3E5.js.map +1 -0
- package/dist/chunk-EVZKNA2W.js +110 -0
- package/dist/chunk-EVZKNA2W.js.map +1 -0
- package/dist/chunk-FD4ZDTQ6.js +181 -0
- package/dist/chunk-FD4ZDTQ6.js.map +1 -0
- package/dist/chunk-FDOOBTXJ.js +17 -0
- package/dist/chunk-FDOOBTXJ.js.map +1 -0
- package/dist/chunk-FH3SQR6P.js +275 -0
- package/dist/chunk-FH3SQR6P.js.map +1 -0
- package/dist/chunk-HJHGTFEJ.js +23 -0
- package/dist/chunk-HJHGTFEJ.js.map +1 -0
- package/dist/{chunk-LXAESF4Y.js → chunk-HK4AZBKX.js} +7 -4
- package/dist/chunk-HK4AZBKX.js.map +1 -0
- package/dist/{chunk-T5C46IIU.js → chunk-HWBRS4DZ.js} +28 -269
- package/dist/chunk-HWBRS4DZ.js.map +1 -0
- package/dist/chunk-IRQGAC4L.js +52 -0
- package/dist/chunk-IRQGAC4L.js.map +1 -0
- package/dist/{chunk-FNTLKHZ7.js → chunk-JDN5SAAD.js} +7 -4
- package/dist/chunk-JDN5SAAD.js.map +1 -0
- package/dist/{chunk-GXEX4CBH.js → chunk-JIKNR5LX.js} +673 -484
- package/dist/chunk-JIKNR5LX.js.map +1 -0
- package/dist/{chunk-GRI4XHBJ.js → chunk-JWRCZIA4.js} +266 -108
- package/dist/chunk-JWRCZIA4.js.map +1 -0
- package/dist/{chunk-E576KYYT.js → chunk-KI4DOTN4.js} +25 -2
- package/dist/chunk-KI4DOTN4.js.map +1 -0
- package/dist/{chunk-ZB7D62OA.js → chunk-KUZVRJ7M.js} +3 -3
- package/dist/chunk-L4VFNFDL.js +248 -0
- package/dist/chunk-L4VFNFDL.js.map +1 -0
- package/dist/chunk-M2WC5MF7.js +127 -0
- package/dist/chunk-M2WC5MF7.js.map +1 -0
- package/dist/{chunk-O3JIAU3V.js → chunk-MCTC6HSE.js} +157 -103
- package/dist/chunk-MCTC6HSE.js.map +1 -0
- package/dist/{chunk-PXFXSFJL.js → chunk-NZ5JU6D3.js} +9 -9
- package/dist/{chunk-YRBR424R.js → chunk-OAUI273L.js} +338 -165
- package/dist/chunk-OAUI273L.js.map +1 -0
- package/dist/chunk-OGLS76RN.js +43 -0
- package/dist/chunk-OGLS76RN.js.map +1 -0
- package/dist/{chunk-7LVM22VG.js → chunk-OQCRCXCP.js} +6 -6
- package/dist/chunk-OQCRCXCP.js.map +1 -0
- package/dist/{chunk-OLGPYOLO.js → chunk-P6OS7652.js} +5 -2
- package/dist/chunk-P6OS7652.js.map +1 -0
- package/dist/chunk-Q5L5EGWZ.js +26 -0
- package/dist/chunk-Q5L5EGWZ.js.map +1 -0
- package/dist/{chunk-S433N3CT.js → chunk-QTHVHNJJ.js} +6 -36
- package/dist/chunk-QTHVHNJJ.js.map +1 -0
- package/dist/chunk-RPET332G.js +84 -0
- package/dist/chunk-RPET332G.js.map +1 -0
- package/dist/{chunk-646CA6RV.js → chunk-RQW5YMH7.js} +12 -4
- package/dist/chunk-RQW5YMH7.js.map +1 -0
- package/dist/{chunk-XALU5LCU.js → chunk-RWNYIU6A.js} +550 -146
- package/dist/chunk-RWNYIU6A.js.map +1 -0
- package/dist/chunk-SL7YUHPV.js +111 -0
- package/dist/chunk-SL7YUHPV.js.map +1 -0
- package/dist/chunk-U5PWXS3J.js +39 -0
- package/dist/chunk-U5PWXS3J.js.map +1 -0
- package/dist/chunk-ULDCFL2O.js +273 -0
- package/dist/chunk-ULDCFL2O.js.map +1 -0
- package/dist/{chunk-RWNSW4FM.js → chunk-UMNXCU3K.js} +12 -6
- package/dist/{chunk-RWNSW4FM.js.map → chunk-UMNXCU3K.js.map} +1 -1
- package/dist/chunk-VI7ZANB3.js +193 -0
- package/dist/chunk-VI7ZANB3.js.map +1 -0
- package/dist/chunk-VQPHPQ5L.js +14 -0
- package/dist/chunk-VQPHPQ5L.js.map +1 -0
- package/dist/chunk-WNJTJRM6.js +147 -0
- package/dist/chunk-WNJTJRM6.js.map +1 -0
- package/dist/chunk-WOBSEO75.js +790 -0
- package/dist/chunk-WOBSEO75.js.map +1 -0
- package/dist/{chunk-BMHS4WAN.js → chunk-XS7EX55U.js} +156 -42
- package/dist/chunk-XS7EX55U.js.map +1 -0
- package/dist/chunk-YN4W7LCX.js +31 -0
- package/dist/chunk-YN4W7LCX.js.map +1 -0
- package/dist/chunk-YSJOZEI6.js +1 -0
- package/dist/{chunk-JA2ZAT5Q.js → chunk-Z4PJMZLM.js} +2 -2
- package/dist/chunk-Z4PJMZLM.js.map +1 -0
- package/dist/{chunk-7VPQHEAJ.js → chunk-ZNZISJDZ.js} +6 -2
- package/dist/chunk-ZNZISJDZ.js.map +1 -0
- package/dist/chunk-ZWN3AODA.js +11 -0
- package/dist/chunk-ZWN3AODA.js.map +1 -0
- package/dist/cli/index.js +25 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/client/core.d.ts +1 -1
- package/dist/client/core.js +2 -0
- package/dist/client/core.js.map +1 -1
- package/dist/client/index.d.ts +44 -10
- package/dist/client/index.js +35 -0
- package/dist/client/index.js.map +1 -1
- package/dist/cloudflare-SIG42OIW.js +335 -0
- package/dist/cloudflare-SIG42OIW.js.map +1 -0
- package/dist/config-support-WQHQIJTA.js +104 -0
- package/dist/config-support-WQHQIJTA.js.map +1 -0
- package/dist/{csrf-BBrEZSBW.d.ts → csrf-Dgot9qSM.d.ts} +1 -1
- package/dist/deno-deploy-LQAYOOPW.js +196 -0
- package/dist/deno-deploy-LQAYOOPW.js.map +1 -0
- package/dist/{dev-MUWJAZRD.js → dev-ANDSEVLB.js} +28 -18
- package/dist/dev-ANDSEVLB.js.map +1 -0
- package/dist/{dev-emit-GWD6IXV7.js → dev-emit-BFNMDCPB.js} +5 -5
- package/dist/{dev-emit-NBT6JD7R.js → dev-emit-MVAJAFGX.js} +5 -3
- package/dist/dev-emit-MVAJAFGX.js.map +1 -0
- package/dist/engine-singleton-X4R7AZBJ.js +315 -0
- package/dist/engine-singleton-X4R7AZBJ.js.map +1 -0
- package/dist/{generate-Y3GWM57K.js → generate-EN6EDITF.js} +43 -4
- package/dist/generate-EN6EDITF.js.map +1 -0
- package/dist/index-CzxtQcnp.d.ts +1058 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +24 -13
- package/dist/index.js.map +1 -1
- package/dist/{info-XW7HGUPH.js → info-Y55RWS42.js} +8 -6
- package/dist/{info-XW7HGUPH.js.map → info-Y55RWS42.js.map} +1 -1
- package/dist/{internal-api-V5L65YSJ.js → internal-api-IP35YU3G.js} +22 -12
- package/dist/{internal-api-WEOSTMSN.js → internal-api-OPU456AT.js} +30 -16
- package/dist/internal-api-OPU456AT.js.map +1 -0
- package/dist/load-config-4ATXQUN3.js +16 -0
- package/dist/match-DmGgxjIU.d.ts +44 -0
- package/dist/{mcp-ULUFJNSZ.js → mcp-5LLNAGKA.js} +7 -7
- package/dist/netlify-C2IRCZKI.js +245 -0
- package/dist/netlify-C2IRCZKI.js.map +1 -0
- package/dist/node-OSVPYQ3D.js +10 -0
- package/dist/nonce-BXt7Qu_C.d.ts +31 -0
- package/dist/observability-bootstrap-MZMSOE66.js +15 -0
- package/dist/{openapi-HZXR335W.js → openapi-VFPEZSRI.js} +13 -11
- package/dist/{openapi-HZXR335W.js.map → openapi-VFPEZSRI.js.map} +1 -1
- package/dist/{plugin-runner-BFEcgtmJ.d.ts → plugin-runner-BVMOSxvb.d.ts} +1 -1
- package/dist/{plugin-types-D69-lJZ9.d.ts → plugin-types-BUVfUQ0V.d.ts} +13 -1
- package/dist/preview-GHPT2EQ5.js +23 -0
- package/dist/preview-GHPT2EQ5.js.map +1 -0
- package/dist/provider-resolver-Dx6QuWrw.d.ts +128 -0
- package/dist/registry-KBZDCFVQ.js +23 -0
- package/dist/route-config-Cm_ZMA1C.d.ts +72 -0
- package/dist/route-policy-BxOycCDq.d.ts +65 -0
- package/dist/router/element-scroll-restoration.d.ts +28 -0
- package/dist/router/element-scroll-restoration.js +96 -0
- package/dist/router/element-scroll-restoration.js.map +1 -0
- package/dist/{routes-OLNQX7CT.js → routes-BPLU3ISV.js} +11 -9
- package/dist/{routes-OLNQX7CT.js.map → routes-BPLU3ISV.js.map} +1 -1
- package/dist/{scan-7MJC6PYU.js → scan-YJEE4KQK.js} +2 -2
- package/dist/{schema-ZO3OSWVG.js → schema-SOAD43RQ.js} +7 -5
- package/dist/schemas-4AXHQMV3.js +25 -0
- package/dist/schemas-4AXHQMV3.js.map +1 -0
- package/dist/security-headers-Ccj7ncNx.d.ts +129 -0
- package/dist/server/agent/index.d.ts +2 -90
- package/dist/server/agent/index.js +1 -1
- package/dist/server/auth/index.d.ts +2 -21
- package/dist/server/auth/index.js +3 -2
- package/dist/server/cron/index.js +4 -3
- package/dist/server/define/index.d.ts +51 -57
- package/dist/server/define/index.js +10 -1
- package/dist/server/http/index.d.ts +7 -5
- package/dist/server/http/index.js +56 -12
- package/dist/server/index.d.ts +47 -439
- package/dist/server/index.js +119 -201
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs/index.js +4 -3
- package/dist/server/observability/index.d.ts +109 -35
- package/dist/server/observability/index.js +10 -7
- package/dist/server/plugins/index.d.ts +3 -3
- package/dist/server/scan/index.d.ts +47 -12
- package/dist/server/scan/index.js +13 -4
- package/dist/server/security/index.d.ts +61 -103
- package/dist/server/security/index.js +15 -6
- package/dist/server/webhook/index.d.ts +90 -3
- package/dist/server/webhook/index.js +12 -2
- package/dist/server-boundary-6B4ZQUY7.js +148 -0
- package/dist/server-boundary-6B4ZQUY7.js.map +1 -0
- package/dist/server-boundary-7VZQRPPX.js +133 -0
- package/dist/server-boundary-7VZQRPPX.js.map +1 -0
- package/dist/{services-typed-client-PSAGRPFF.js → services-typed-client-XGT5SUUN.js} +2 -2
- package/dist/{start-KR2JJR7K.js → start-UZDMOT7I.js} +342 -111
- package/dist/start-UZDMOT7I.js.map +1 -0
- package/dist/{static-M2W4HUWS.js → static-SVDWIOXJ.js} +24 -13
- package/dist/static-SVDWIOXJ.js.map +1 -0
- package/dist/{theo-cloud-XAHWOUFK.js → theo-cloud-3ET4G5T6.js} +9 -2
- package/dist/theo-cloud-3ET4G5T6.js.map +1 -0
- package/dist/vercel-BMCQKCWE.js +277 -0
- package/dist/vercel-BMCQKCWE.js.map +1 -0
- package/dist/vite-plugin/index.js +24 -13
- package/dist/vite-plugin-VKCT2LF2.js +42 -0
- package/dist/vite-plugin-VKCT2LF2.js.map +1 -0
- package/package.json +19 -6
- package/dist/actions-virtual-module-YQXRSSMW.js.map +0 -1
- package/dist/agent-7JJW3TPB.js +0 -15
- package/dist/app-typed-client-G3J5G7E5.js.map +0 -1
- package/dist/app-typed-client-GHO3EWZK.js.map +0 -1
- package/dist/aws-lambda-CYNDGU5O.js +0 -172
- package/dist/aws-lambda-CYNDGU5O.js.map +0 -1
- package/dist/build-WU6AKKIB.js.map +0 -1
- package/dist/bun-33RD6K7O.js.map +0 -1
- package/dist/chunk-646CA6RV.js.map +0 -1
- package/dist/chunk-6E5WKMDS.js +0 -67
- package/dist/chunk-6E5WKMDS.js.map +0 -1
- package/dist/chunk-6GGWS7J3.js +0 -91
- package/dist/chunk-6GGWS7J3.js.map +0 -1
- package/dist/chunk-7LVM22VG.js.map +0 -1
- package/dist/chunk-7VPQHEAJ.js.map +0 -1
- package/dist/chunk-A7JBF5FO.js.map +0 -1
- package/dist/chunk-AM3QABW5.js +0 -161
- package/dist/chunk-AM3QABW5.js.map +0 -1
- package/dist/chunk-BIVCP6X5.js.map +0 -1
- package/dist/chunk-BMHS4WAN.js.map +0 -1
- package/dist/chunk-E576KYYT.js.map +0 -1
- package/dist/chunk-FB2HBNIC.js.map +0 -1
- package/dist/chunk-FNTLKHZ7.js.map +0 -1
- package/dist/chunk-GRI4XHBJ.js.map +0 -1
- package/dist/chunk-GVW5EKEU.js +0 -422
- package/dist/chunk-GVW5EKEU.js.map +0 -1
- package/dist/chunk-GXEX4CBH.js.map +0 -1
- package/dist/chunk-HBU2GIMZ.js.map +0 -1
- package/dist/chunk-IEES3CHD.js.map +0 -1
- package/dist/chunk-J5MXCGKA.js.map +0 -1
- package/dist/chunk-JA2ZAT5Q.js.map +0 -1
- package/dist/chunk-KD5G3YXI.js.map +0 -1
- package/dist/chunk-LNVMHQ2Z.js +0 -54
- package/dist/chunk-LNVMHQ2Z.js.map +0 -1
- package/dist/chunk-LXAESF4Y.js.map +0 -1
- package/dist/chunk-MTEWLGVY.js.map +0 -1
- package/dist/chunk-O3JIAU3V.js.map +0 -1
- package/dist/chunk-OJLL4YD6.js +0 -403
- package/dist/chunk-OJLL4YD6.js.map +0 -1
- package/dist/chunk-OLGPYOLO.js.map +0 -1
- package/dist/chunk-S433N3CT.js.map +0 -1
- package/dist/chunk-T5C46IIU.js.map +0 -1
- package/dist/chunk-U267AOWS.js +0 -28
- package/dist/chunk-U267AOWS.js.map +0 -1
- package/dist/chunk-UW2TEAGR.js +0 -77
- package/dist/chunk-UW2TEAGR.js.map +0 -1
- package/dist/chunk-WPJOTQA5.js +0 -1
- package/dist/chunk-XALU5LCU.js.map +0 -1
- package/dist/chunk-XR74JD4M.js +0 -457
- package/dist/chunk-XR74JD4M.js.map +0 -1
- package/dist/chunk-YGAXV5HR.js.map +0 -1
- package/dist/chunk-YRBR424R.js.map +0 -1
- package/dist/cloudflare-KYUWCEPL.js +0 -122
- package/dist/cloudflare-KYUWCEPL.js.map +0 -1
- package/dist/deno-deploy-CCTB7HGS.js +0 -107
- package/dist/deno-deploy-CCTB7HGS.js.map +0 -1
- package/dist/dev-MUWJAZRD.js.map +0 -1
- package/dist/dev-emit-NBT6JD7R.js.map +0 -1
- package/dist/generate-Y3GWM57K.js.map +0 -1
- package/dist/index-BEtEv6ZH.d.ts +0 -575
- package/dist/load-config-VKD6LKWU.js +0 -14
- package/dist/match-CfbEFRG4.d.ts +0 -26
- package/dist/netlify-AFMDNKT4.js +0 -150
- package/dist/netlify-AFMDNKT4.js.map +0 -1
- package/dist/node-ZJQEJSP3.js +0 -10
- package/dist/registry-GKR3EWRW.js +0 -23
- package/dist/start-KR2JJR7K.js.map +0 -1
- package/dist/static-M2W4HUWS.js.map +0 -1
- package/dist/theo-cloud-XAHWOUFK.js.map +0 -1
- package/dist/vercel-SRS2DH6O.js +0 -133
- package/dist/vercel-SRS2DH6O.js.map +0 -1
- package/dist/vite-plugin-VPJFD4HK.js +0 -36
- /package/dist/{chunk-WPJOTQA5.js.map → adapters/agent-mount.js.map} +0 -0
- /package/dist/{agent-7JJW3TPB.js.map → agent-GKUEL6OH.js.map} +0 -0
- /package/dist/{check-45NKUVSQ.js.map → check-GIPZBFTX.js.map} +0 -0
- /package/dist/{chunk-47CINLWF.js.map → chunk-44J2ANQC.js.map} +0 -0
- /package/dist/{chunk-ZB7D62OA.js.map → chunk-KUZVRJ7M.js.map} +0 -0
- /package/dist/{chunk-PXFXSFJL.js.map → chunk-NZ5JU6D3.js.map} +0 -0
- /package/dist/{internal-api-WEOSTMSN.js.map → chunk-YSJOZEI6.js.map} +0 -0
- /package/dist/{dev-emit-GWD6IXV7.js.map → dev-emit-BFNMDCPB.js.map} +0 -0
- /package/dist/{internal-api-V5L65YSJ.js.map → internal-api-IP35YU3G.js.map} +0 -0
- /package/dist/{load-config-VKD6LKWU.js.map → load-config-4ATXQUN3.js.map} +0 -0
- /package/dist/{mcp-ULUFJNSZ.js.map → mcp-5LLNAGKA.js.map} +0 -0
- /package/dist/{node-ZJQEJSP3.js.map → node-OSVPYQ3D.js.map} +0 -0
- /package/dist/{scan-7MJC6PYU.js.map → observability-bootstrap-MZMSOE66.js.map} +0 -0
- /package/dist/{registry-GKR3EWRW.js.map → registry-KBZDCFVQ.js.map} +0 -0
- /package/dist/{schema-ZO3OSWVG.js.map → scan-YJEE4KQK.js.map} +0 -0
- /package/dist/{vite-plugin-VPJFD4HK.js.map → schema-SOAD43RQ.js.map} +0 -0
- /package/dist/{services-typed-client-PSAGRPFF.js.map → services-typed-client-XGT5SUUN.js.map} +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// src/server/_internal/process-singleton.ts
|
|
2
|
+
var NAMESPACE = "theokit.singleton.";
|
|
3
|
+
function processSingleton(key, factory) {
|
|
4
|
+
const slot = /* @__PURE__ */ Symbol.for(NAMESPACE + key);
|
|
5
|
+
const host = globalThis;
|
|
6
|
+
const existing = host[slot];
|
|
7
|
+
if (existing !== void 0) return existing;
|
|
8
|
+
const created = factory();
|
|
9
|
+
host[slot] = created;
|
|
10
|
+
return created;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// src/server/agent/provider-resolver.ts
|
|
14
|
+
var DEFAULT_REGISTRY = [
|
|
15
|
+
{
|
|
16
|
+
name: "openrouter",
|
|
17
|
+
envKey: "OPENROUTER_API_KEY",
|
|
18
|
+
baseUrl: "https://openrouter.ai/api/v1",
|
|
19
|
+
priority: 1
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "openai",
|
|
23
|
+
envKey: "OPENAI_API_KEY",
|
|
24
|
+
baseUrl: "https://api.openai.com/v1",
|
|
25
|
+
priority: 2
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "anthropic",
|
|
29
|
+
envKey: "ANTHROPIC_API_KEY",
|
|
30
|
+
baseUrl: "https://api.anthropic.com",
|
|
31
|
+
priority: 3
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
// Mirrors the profile `@theokit/sdk` already ships for this provider — same default host, same
|
|
35
|
+
// override variable — so the two cannot disagree about where ollama is listening. The SDK is
|
|
36
|
+
// what dials it (see `baseUrlEnv`); this entry's job is to stop the resolver from rejecting the
|
|
37
|
+
// model before the SDK is ever reached. No `envKey`: see that field's doc comment for why the
|
|
38
|
+
// absence also keeps this entry out of the priority walk.
|
|
39
|
+
name: "ollama",
|
|
40
|
+
baseUrl: "http://localhost:11434",
|
|
41
|
+
baseUrlEnv: "OLLAMA_HOST",
|
|
42
|
+
priority: 100
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
function registryOf() {
|
|
46
|
+
return processSingleton("provider-registry", () => [...DEFAULT_REGISTRY]);
|
|
47
|
+
}
|
|
48
|
+
var announced = /* @__PURE__ */ new Set();
|
|
49
|
+
function registerProvider(descriptor) {
|
|
50
|
+
const registry = registryOf();
|
|
51
|
+
const idx = registry.findIndex((p) => p.name === descriptor.name);
|
|
52
|
+
if (idx >= 0) registry[idx] = descriptor;
|
|
53
|
+
else registry.push(descriptor);
|
|
54
|
+
}
|
|
55
|
+
function resetProviderRegistry() {
|
|
56
|
+
const registry = registryOf();
|
|
57
|
+
registry.length = 0;
|
|
58
|
+
registry.push(...DEFAULT_REGISTRY);
|
|
59
|
+
}
|
|
60
|
+
function listProviders() {
|
|
61
|
+
return [...registryOf()].sort((a, b) => a.priority - b.priority);
|
|
62
|
+
}
|
|
63
|
+
function announce(desc, how, options) {
|
|
64
|
+
if (announced.has(desc.name)) return;
|
|
65
|
+
announced.add(desc.name);
|
|
66
|
+
const source = desc.envKey ?? "none (this provider takes no credential)";
|
|
67
|
+
const line = `[theokit] provider=${desc.name} (${how}) source=${source} baseUrl=${baseUrlOf(desc)}`;
|
|
68
|
+
if (options?.announce) options.announce(line);
|
|
69
|
+
else console.warn(line);
|
|
70
|
+
}
|
|
71
|
+
function baseUrlOf(desc) {
|
|
72
|
+
if (desc.baseUrlEnv === void 0) return desc.baseUrl;
|
|
73
|
+
const override = process.env[desc.baseUrlEnv];
|
|
74
|
+
return override !== void 0 && override.length > 0 ? override : desc.baseUrl;
|
|
75
|
+
}
|
|
76
|
+
function providerOf(modelId, registered) {
|
|
77
|
+
const prefix = declaredPrefixOf(modelId);
|
|
78
|
+
if (prefix === void 0) return void 0;
|
|
79
|
+
return registered.find((p) => p.name === prefix);
|
|
80
|
+
}
|
|
81
|
+
function declaredPrefixOf(modelId) {
|
|
82
|
+
if (modelId === void 0) return void 0;
|
|
83
|
+
const slash = modelId.indexOf("/");
|
|
84
|
+
if (slash <= 0) return void 0;
|
|
85
|
+
return modelId.slice(0, slash);
|
|
86
|
+
}
|
|
87
|
+
function takesCredential(desc) {
|
|
88
|
+
return desc.envKey !== void 0;
|
|
89
|
+
}
|
|
90
|
+
function resolveProvider(modelId, options) {
|
|
91
|
+
const sorted = [...registryOf()].sort((a, b) => a.priority - b.priority);
|
|
92
|
+
const declared = modelId === void 0 ? void 0 : providerOf(modelId, sorted);
|
|
93
|
+
if (declared !== void 0 && modelId !== void 0) {
|
|
94
|
+
if (declared.envKey === void 0) {
|
|
95
|
+
announce(declared, "declared by the model", options);
|
|
96
|
+
return { name: declared.name, apiKey: "", baseUrl: baseUrlOf(declared) };
|
|
97
|
+
}
|
|
98
|
+
const apiKey = process.env[declared.envKey];
|
|
99
|
+
if (apiKey && apiKey.length > 0) {
|
|
100
|
+
announce(declared, "declared by the model", options);
|
|
101
|
+
return { name: declared.name, apiKey, baseUrl: baseUrlOf(declared) };
|
|
102
|
+
}
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Model "${modelId}" declares provider "${declared.name}", but ${declared.envKey} is not set. Set ${declared.envKey}, or change the model's provider prefix.`
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
const credentialed = sorted.filter(takesCredential);
|
|
108
|
+
for (const desc of credentialed) {
|
|
109
|
+
const apiKey = process.env[desc.envKey];
|
|
110
|
+
if (apiKey && apiKey.length > 0) {
|
|
111
|
+
announce(desc, "by env priority", options);
|
|
112
|
+
return {
|
|
113
|
+
name: desc.name,
|
|
114
|
+
apiKey,
|
|
115
|
+
baseUrl: baseUrlOf(desc)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const prefix = declaredPrefixOf(modelId);
|
|
120
|
+
if (prefix !== void 0) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Model "${modelId}" declares provider "${prefix}", which is not registered. Registered providers: ${sorted.map((p) => p.name).join(", ")}. Register it with registerProvider({ name: '${prefix}', \u2026 }), or use a registered prefix.`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
const envKeys = credentialed.map((p) => p.envKey).join(" OR ");
|
|
126
|
+
throw new Error(
|
|
127
|
+
`No LLM provider API key found in environment. Set one of: ${envKeys}. Get a free OpenRouter key at https://openrouter.ai/keys (recommended \u2014 one key, many models).`
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
function tryResolveProvider(modelId) {
|
|
131
|
+
try {
|
|
132
|
+
return resolveProvider(modelId);
|
|
133
|
+
} catch {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export {
|
|
139
|
+
processSingleton,
|
|
140
|
+
registerProvider,
|
|
141
|
+
resetProviderRegistry,
|
|
142
|
+
listProviders,
|
|
143
|
+
resolveProvider,
|
|
144
|
+
tryResolveProvider
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=chunk-3PBAN2YE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/_internal/process-singleton.ts","../src/server/agent/provider-resolver.ts"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import "tsx/esm";
|
|
3
3
|
|
|
4
4
|
// src/config/load-env.ts
|
|
5
|
-
import { lstatSync, readFileSync, realpathSync, statSync } from "fs";
|
|
5
|
+
import { closeSync, lstatSync, openSync, readFileSync, realpathSync, statSync } from "fs";
|
|
6
6
|
import { resolve } from "path";
|
|
7
7
|
import dotenv from "dotenv";
|
|
8
8
|
import { expand } from "dotenv-expand";
|
|
@@ -29,19 +29,25 @@ function readEnvFile(path) {
|
|
|
29
29
|
);
|
|
30
30
|
return null;
|
|
31
31
|
}
|
|
32
|
+
let fd;
|
|
32
33
|
try {
|
|
33
|
-
|
|
34
|
-
if (lstat.isSymbolicLink()) {
|
|
35
|
-
const real = realpathSync(path);
|
|
36
|
-
console.info(`[theokit] .env at ${path} is a symlink \u2192 ${real}`);
|
|
37
|
-
}
|
|
34
|
+
fd = openSync(path, "r");
|
|
38
35
|
} catch {
|
|
36
|
+
return null;
|
|
39
37
|
}
|
|
40
38
|
try {
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
try {
|
|
40
|
+
if (lstatSync(path).isSymbolicLink()) {
|
|
41
|
+
const real = realpathSync(path);
|
|
42
|
+
console.info(`[theokit] .env at ${path} is a symlink \u2192 ${real}`);
|
|
43
|
+
}
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
return dotenv.parse(readFileSync(fd, "utf-8"));
|
|
43
47
|
} catch {
|
|
44
48
|
return null;
|
|
49
|
+
} finally {
|
|
50
|
+
closeSync(fd);
|
|
45
51
|
}
|
|
46
52
|
}
|
|
47
53
|
function loadEnv(options = {}) {
|
|
@@ -98,4 +104,4 @@ function loadEnv(options = {}) {
|
|
|
98
104
|
export {
|
|
99
105
|
loadEnv
|
|
100
106
|
};
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-3QPVEJ7D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/load-env.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Reads `.env` files from a CLI-controlled `cwd`. File names are a fixed\n * literal set. Build-time + CLI tool; no HTTP input.\n */\n/**\n * `loadEnv()` — auto-loads `.env` files into `process.env` for server code.\n *\n * Implements the Next.js `loadEnvConfig` algorithm\n * (`references/next.js/packages/next-env/index.ts:114-180`) with TheoKit\n * adaptations:\n *\n * - EC-1: 1MB file-size cap (anti-OOM, anti-supply-chain).\n * - EC-2: `_resetEnvCache()` test-only side-door.\n * - EC-8: `dotenv-expand` circular-ref safe (lib-provided).\n * - EC-13: log when `.env` is a symlink (transparency).\n * - D6: real `process.env` wins over `.env`-file values.\n * - NODE_ENV stash: `.env`-set NODE_ENV NEVER overrides the real\n * `process.env.NODE_ENV`. Stashed in `__THEOKIT_USER_NODE_ENV` instead.\n */\n\nimport { closeSync, lstatSync, openSync, readFileSync, realpathSync, statSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport dotenv from 'dotenv'\nimport { expand, type DotenvPopulateInput } from 'dotenv-expand'\n\nimport type { LoadEnvOptions, LoadEnvResult } from './load-env-types.js'\n\n/** EC-1: 1MB cap. Real `.env`s are < 10KB. */\nconst MAX_ENV_FILE_BYTES = 1_048_576\n\nconst cache = new Map<string, LoadEnvResult>()\n\n/** Test-only side-door for EC-2 — clear the module-level cache between vitest test files. */\nexport function _resetEnvCache(): void {\n cache.clear()\n}\n\nfunction envFilesInPriorityOrder(mode: string): string[] {\n // Top of list = highest priority. Will be read in REVERSE so first-in\n // wins via overwrite during merge.\n const files = [`.env.${mode}.local`, `.env.local`, `.env.${mode}`, `.env`]\n // Test mode skips `.env.local` per dotenv convention (avoid leaking dev\n // secrets into the test suite).\n if (mode === 'test') {\n return files.filter((f) => f !== '.env.local')\n }\n return files\n}\n\nfunction readEnvFile(path: string): Record<string, string> | null {\n let stat\n try {\n stat = statSync(path)\n } catch {\n return null // ENOENT / EACCES → skip\n }\n\n // Allow files + FIFOs (1Password/SOPS pipe support).\n if (!stat.isFile() && !stat.isFIFO()) return null\n\n // EC-1 — anti-OOM cap.\n if (stat.size > MAX_ENV_FILE_BYTES) {\n console.warn(\n `[theokit] .env file at ${path} exceeds ${MAX_ENV_FILE_BYTES} bytes — skipping (likely a generated artifact, not a real env file)`,\n )\n return null\n }\n\n // Open first, then describe, then read — all through the one descriptor. Reading by name after\n // inspecting the name resolves it twice, so the file the transparency note describes need not be\n // the file whose values are loaded (CodeQL `js/file-system-race`).\n let fd: number\n try {\n fd = openSync(path, 'r')\n } catch {\n return null\n }\n\n try {\n // EC-13 — symlink transparency. Don't refuse; just say so.\n try {\n if (lstatSync(path).isSymbolicLink()) {\n const real = realpathSync(path)\n // eslint-disable-next-line no-console -- intentional transparency log on a build-time tool\n console.info(`[theokit] .env at ${path} is a symlink → ${real}`)\n }\n } catch {\n // The note is informational; failing to produce it must not fail the load.\n }\n\n return dotenv.parse(readFileSync(fd, 'utf-8'))\n } catch {\n return null\n } finally {\n closeSync(fd)\n }\n}\n\n// eslint-disable-next-line complexity -- canonical env-load algorithm (priority → expand → guards → apply); inlining branches is clearer than extracting micro-helpers\nexport function loadEnv(options: LoadEnvOptions = {}): LoadEnvResult {\n const cwd = options.cwd ?? process.cwd()\n const mode = options.mode ?? process.env.NODE_ENV ?? 'development'\n const cacheKey = `${cwd}:${mode}`\n\n if (!options.forceReload) {\n const cached = cache.get(cacheKey)\n if (cached) return cached\n }\n\n const fileNames = envFilesInPriorityOrder(mode)\n const filePaths = fileNames.map((f) => resolve(cwd, f))\n\n // Read in REVERSE — lower-priority files first, so higher-priority\n // (lower-index) overwrites during merge.\n const merged: Record<string, string> = {}\n const loadedFromFiles: string[] = []\n for (const path of [...filePaths].reverse()) {\n const parsed = readEnvFile(path)\n if (parsed === null) continue\n for (const [k, v] of Object.entries(parsed)) {\n merged[k] = v\n }\n loadedFromFiles.unshift(path) // keep priority order in result\n }\n\n // NODE_ENV stash — `.env`-set NODE_ENV never overrides real process.env.NODE_ENV.\n if (merged.NODE_ENV && process.env.__THEOKIT_USER_NODE_ENV === undefined) {\n process.env.__THEOKIT_USER_NODE_ENV = merged.NODE_ENV\n }\n delete merged.NODE_ENV // never propagate\n\n // EC-8 — dotenv-expand@11 stack-overflows on circular refs (A=${B}, B=${A}).\n // Wrap in try/catch — on overflow, leave the parsed map untouched (literal\n // values survive). Tested via test_loadEnv_circular_expand_no_loop_EC8.\n // Pass a CLONE of process.env (string-only, filtered) so expand can\n // reference real env without mutating it.\n const processEnvClone: DotenvPopulateInput = {}\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') processEnvClone[k] = v\n }\n try {\n expand({ parsed: merged, processEnv: processEnvClone })\n } catch (err) {\n if (err instanceof RangeError) {\n console.warn(\n `[theokit] .env expansion overflow (likely circular reference like A=\\${B}, B=\\${A}). Leaving values as literals.`,\n )\n } else {\n throw err\n }\n }\n\n // Apply: D6 — real process.env wins over file values.\n const loaded: Record<string, string> = {}\n for (const [k, v] of Object.entries(merged)) {\n if (process.env[k] !== undefined) continue // real env wins\n process.env[k] = v\n loaded[k] = v\n }\n\n // Sentinel\n process.env.__THEOKIT_PROCESSED_ENV = 'true'\n\n const result: LoadEnvResult = { loaded, loadedFromFiles }\n cache.set(cacheKey, result)\n return result\n}\n"],"mappings":";;;;AAoBA,SAAS,WAAW,WAAW,UAAU,cAAc,cAAc,gBAAgB;AACrF,SAAS,eAAe;AAExB,OAAO,YAAY;AACnB,SAAS,cAAwC;AAKjD,IAAM,qBAAqB;AAE3B,IAAM,QAAQ,oBAAI,IAA2B;AAO7C,SAAS,wBAAwB,MAAwB;AAGvD,QAAM,QAAQ,CAAC,QAAQ,IAAI,UAAU,cAAc,QAAQ,IAAI,IAAI,MAAM;AAGzE,MAAI,SAAS,QAAQ;AACnB,WAAO,MAAM,OAAO,CAAC,MAAM,MAAM,YAAY;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAA6C;AAChE,MAAI;AACJ,MAAI;AACF,WAAO,SAAS,IAAI;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO,EAAG,QAAO;AAG7C,MAAI,KAAK,OAAO,oBAAoB;AAClC,YAAQ;AAAA,MACN,0BAA0B,IAAI,YAAY,kBAAkB;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAKA,MAAI;AACJ,MAAI;AACF,SAAK,SAAS,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI;AAEF,QAAI;AACF,UAAI,UAAU,IAAI,EAAE,eAAe,GAAG;AACpC,cAAM,OAAO,aAAa,IAAI;AAE9B,gBAAQ,KAAK,qBAAqB,IAAI,wBAAmB,IAAI,EAAE;AAAA,MACjE;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO,OAAO,MAAM,aAAa,IAAI,OAAO,CAAC;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,cAAU,EAAE;AAAA,EACd;AACF;AAGO,SAAS,QAAQ,UAA0B,CAAC,GAAkB;AACnE,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,OAAO,QAAQ,QAAQ,QAAQ,IAAI,YAAY;AACrD,QAAM,WAAW,GAAG,GAAG,IAAI,IAAI;AAE/B,MAAI,CAAC,QAAQ,aAAa;AACxB,UAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,QAAI,OAAQ,QAAO;AAAA,EACrB;AAEA,QAAM,YAAY,wBAAwB,IAAI;AAC9C,QAAM,YAAY,UAAU,IAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAItD,QAAM,SAAiC,CAAC;AACxC,QAAM,kBAA4B,CAAC;AACnC,aAAW,QAAQ,CAAC,GAAG,SAAS,EAAE,QAAQ,GAAG;AAC3C,UAAM,SAAS,YAAY,IAAI;AAC/B,QAAI,WAAW,KAAM;AACrB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,aAAO,CAAC,IAAI;AAAA,IACd;AACA,oBAAgB,QAAQ,IAAI;AAAA,EAC9B;AAGA,MAAI,OAAO,YAAY,QAAQ,IAAI,4BAA4B,QAAW;AACxE,YAAQ,IAAI,0BAA0B,OAAO;AAAA,EAC/C;AACA,SAAO,OAAO;AAOd,QAAM,kBAAuC,CAAC;AAC9C,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AAChD,QAAI,OAAO,MAAM,SAAU,iBAAgB,CAAC,IAAI;AAAA,EAClD;AACA,MAAI;AACF,WAAO,EAAE,QAAQ,QAAQ,YAAY,gBAAgB,CAAC;AAAA,EACxD,SAAS,KAAK;AACZ,QAAI,eAAe,YAAY;AAC7B,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAGA,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,QAAI,QAAQ,IAAI,CAAC,MAAM,OAAW;AAClC,YAAQ,IAAI,CAAC,IAAI;AACjB,WAAO,CAAC,IAAI;AAAA,EACd;AAGA,UAAQ,IAAI,0BAA0B;AAEtC,QAAM,SAAwB,EAAE,QAAQ,gBAAgB;AACxD,QAAM,IAAI,UAAU,MAAM;AAC1B,SAAO;AACT;","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import "tsx/esm";
|
|
3
3
|
import {
|
|
4
4
|
findControllerFiles
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HWBRS4DZ.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/commands/build/emit-controllers.ts
|
|
8
8
|
import { mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -43,4 +43,4 @@ export {
|
|
|
43
43
|
emitControllerArtifacts,
|
|
44
44
|
describeControllerArtifacts
|
|
45
45
|
};
|
|
46
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
//# sourceMappingURL=chunk-44J2ANQC.js.map
|
|
@@ -93,7 +93,13 @@ function scanChild(parentDir, dirName, routePath) {
|
|
|
93
93
|
function scanDir(dir, segment, routePath) {
|
|
94
94
|
const node = { segment, path: routePath, children: [] };
|
|
95
95
|
attachRouteFiles(node, dir);
|
|
96
|
-
|
|
96
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
97
|
+
entries.sort((a, b) => {
|
|
98
|
+
if (a.name < b.name) return -1;
|
|
99
|
+
if (a.name > b.name) return 1;
|
|
100
|
+
return 0;
|
|
101
|
+
});
|
|
102
|
+
for (const entry of entries) {
|
|
97
103
|
if (!entry.isDirectory()) continue;
|
|
98
104
|
if (entry.name.startsWith("_") || entry.name.startsWith(".")) continue;
|
|
99
105
|
const child = scanChild(dir, entry.name, routePath);
|
|
@@ -117,4 +123,4 @@ export {
|
|
|
117
123
|
isRouteFile,
|
|
118
124
|
scanRoutes
|
|
119
125
|
};
|
|
120
|
-
//# sourceMappingURL=chunk-
|
|
126
|
+
//# sourceMappingURL=chunk-47MM2JUK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/router/scan.ts","../src/router/types.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Build-time file-system scanner. All paths originate from `appDir`,\n * which is itself derived from `process.cwd()`. No HTTP input flows here.\n */\nimport { readdirSync, statSync, existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport type { RouteNode, RouteFileName } from './types.js'\nimport { ROUTE_FILE_NAMES, ROUTE_FILE_EXTENSIONS } from './types.js'\n\nfunction toNodeKey(name: RouteFileName): 'page' | 'layout' | 'error' | 'loading' | 'notFound' {\n if (name === 'not-found') return 'notFound'\n return name\n}\n\nfunction setRouteFile(\n node: RouteNode,\n key: 'page' | 'layout' | 'error' | 'loading' | 'notFound',\n value: string,\n): void {\n switch (key) {\n case 'page':\n node.page = value\n break\n case 'layout':\n node.layout = value\n break\n case 'error':\n node.error = value\n break\n case 'loading':\n node.loading = value\n break\n case 'notFound':\n node.notFound = value\n break\n }\n}\n\nfunction attachRouteFiles(node: RouteNode, dir: string): void {\n // Check route files with extension priority (.tsx > .ts > .jsx > .js)\n for (const name of ROUTE_FILE_NAMES) {\n const key = toNodeKey(name)\n if (node[key] !== undefined) continue\n for (const ext of ROUTE_FILE_EXTENSIONS) {\n const filename = `${name}${ext}`\n if (existsSync(join(dir, filename))) {\n setRouteFile(node, key, resolve(dir, filename))\n break\n }\n }\n }\n}\n\ninterface ParsedSegment {\n kind: 'static' | 'dynamic' | 'catchall'\n paramName?: string\n}\n\n/**\n * Classify a directory name as a static, dynamic (`[param]`), or catch-all\n * (`[...slug]`) route segment. Throws at build time on:\n * - optional catch-all `[[...slug]]` (EC-4 — not supported yet; see plan Q3)\n * - a param name outside `[A-Za-z0-9_]` (EC-5 — react-router would silently mis-match)\n * Order matters: catch-all is checked before single dynamic so `[...slug]` is\n * not misread as a dynamic param literally named `...slug`.\n */\nfunction parseSegment(name: string): ParsedSegment {\n if (name.startsWith('[[')) {\n throw new Error(\n `Optional catch-all route segment is not supported yet: '${name}'. ` +\n `Use '[...param]' for catch-all, or split into explicit segments.`,\n )\n }\n const catchAll = /^\\[\\.\\.\\.(.+)\\]$/.exec(name)\n if (catchAll) return checkedSegment('catchall', catchAll[1], name)\n const dynamic = /^\\[(.+)\\]$/.exec(name)\n if (dynamic) return checkedSegment('dynamic', dynamic[1], name)\n return { kind: 'static' }\n}\n\nfunction checkedSegment(\n kind: 'dynamic' | 'catchall',\n paramName: string,\n name: string,\n): ParsedSegment {\n if (!/^\\w+$/.test(paramName)) {\n throw new Error(\n `Invalid route param '${paramName}' in segment '${name}' — ` +\n `param names must match [A-Za-z0-9_] (react-router constraint).`,\n )\n }\n return { kind, paramName }\n}\n\nfunction nodeHasContent(node: RouteNode): boolean {\n return (\n node.page !== undefined ||\n node.layout !== undefined ||\n node.error !== undefined ||\n node.loading !== undefined ||\n node.notFound !== undefined ||\n node.children.length > 0\n )\n}\n\nfunction buildChildPath(routePath: string, urlSegment: string): string {\n if (!urlSegment) return routePath\n return routePath === '/' ? `/${urlSegment}` : `${routePath}/${urlSegment}`\n}\n\n/** Scan one subdirectory into a child RouteNode, attaching dynamic-segment metadata. */\nfunction scanChild(parentDir: string, dirName: string, routePath: string): RouteNode {\n const isRouteGroup = dirName.startsWith('(') && dirName.endsWith(')')\n const urlSegment = isRouteGroup ? '' : dirName\n const childPath = buildChildPath(routePath, urlSegment)\n const child = scanDir(join(parentDir, dirName), isRouteGroup ? '' : dirName, childPath)\n\n // Dynamic / catch-all segment metadata (throws on [[...]] or invalid charset).\n if (!isRouteGroup) {\n const parsed = parseSegment(dirName)\n if (parsed.kind !== 'static' && parsed.paramName !== undefined) {\n child.dynamic = { paramName: parsed.paramName, catchAll: parsed.kind === 'catchall' }\n }\n }\n return child\n}\n\nfunction scanDir(dir: string, segment: string, routePath: string): RouteNode {\n const node: RouteNode = { segment, path: routePath, children: [] }\n attachRouteFiles(node, dir)\n\n // Sorted by name so the manifest does not inherit the filesystem's iteration order.\n // ext4 returns entries in filename-hash order, APFS and NTFS in others — an unsorted\n // walk emits a different module graph per machine, which is what makes the client build\n // non-reproducible (usetheokit/theokit#346).\n //\n // Compared by code unit rather than with `localeCompare`: collation is locale-dependent,\n // so the same tree could sort differently under a different `LANG` — reintroducing the\n // very cross-machine divergence this sort exists to remove.\n const entries = readdirSync(dir, { withFileTypes: true })\n entries.sort((a, b) => {\n if (a.name < b.name) return -1\n if (a.name > b.name) return 1\n return 0\n })\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue\n\n const child = scanChild(dir, entry.name, routePath)\n // Prune empty nodes — a directory with no route files AND no children is\n // irrelevant to the manifest.\n if (nodeHasContent(child)) {\n node.children.push(child)\n }\n }\n\n return node\n}\n\nexport function scanRoutes(appDir: string): RouteNode {\n if (!existsSync(appDir)) {\n throw new Error(`App directory does not exist: ${appDir}`)\n }\n if (!statSync(appDir).isDirectory()) {\n throw new Error(`App path is not a directory: ${appDir}`)\n }\n return scanDir(appDir, '', '/')\n}\n","// T2.2 (architecture-cleanup) — RouteNode moved to core/contracts/route-node.ts\n// (canonical home per ADR-0001 v3). Re-export keeps the local path stable.\nexport type { RouteNode } from '../core/contracts/route-node.js'\n\nexport const ROUTE_FILE_NAMES = ['page', 'layout', 'error', 'loading', 'not-found'] as const\n\nexport type RouteFileName = (typeof ROUTE_FILE_NAMES)[number]\n\nexport const ROUTE_FILE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'] as const\n\nconst ROUTE_FILE_REGEX = /^(page|layout|error|loading|not-found)\\.(tsx|ts|jsx|js)$/\n\nexport function isRouteFile(filename: string): boolean {\n return ROUTE_FILE_REGEX.test(filename)\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// src/config/load-env.ts
|
|
2
|
+
import { closeSync, lstatSync, openSync, readFileSync, realpathSync, statSync } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
import dotenv from "dotenv";
|
|
5
|
+
import { expand } from "dotenv-expand";
|
|
6
|
+
var MAX_ENV_FILE_BYTES = 1048576;
|
|
7
|
+
var cache = /* @__PURE__ */ new Map();
|
|
8
|
+
function _resetEnvCache() {
|
|
9
|
+
cache.clear();
|
|
10
|
+
}
|
|
11
|
+
function envFilesInPriorityOrder(mode) {
|
|
12
|
+
const files = [`.env.${mode}.local`, `.env.local`, `.env.${mode}`, `.env`];
|
|
13
|
+
if (mode === "test") {
|
|
14
|
+
return files.filter((f) => f !== ".env.local");
|
|
15
|
+
}
|
|
16
|
+
return files;
|
|
17
|
+
}
|
|
18
|
+
function readEnvFile(path) {
|
|
19
|
+
let stat;
|
|
20
|
+
try {
|
|
21
|
+
stat = statSync(path);
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
if (!stat.isFile() && !stat.isFIFO()) return null;
|
|
26
|
+
if (stat.size > MAX_ENV_FILE_BYTES) {
|
|
27
|
+
console.warn(
|
|
28
|
+
`[theokit] .env file at ${path} exceeds ${MAX_ENV_FILE_BYTES} bytes \u2014 skipping (likely a generated artifact, not a real env file)`
|
|
29
|
+
);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
let fd;
|
|
33
|
+
try {
|
|
34
|
+
fd = openSync(path, "r");
|
|
35
|
+
} catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
try {
|
|
40
|
+
if (lstatSync(path).isSymbolicLink()) {
|
|
41
|
+
const real = realpathSync(path);
|
|
42
|
+
console.info(`[theokit] .env at ${path} is a symlink \u2192 ${real}`);
|
|
43
|
+
}
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
return dotenv.parse(readFileSync(fd, "utf-8"));
|
|
47
|
+
} catch {
|
|
48
|
+
return null;
|
|
49
|
+
} finally {
|
|
50
|
+
closeSync(fd);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function loadEnv(options = {}) {
|
|
54
|
+
const cwd = options.cwd ?? process.cwd();
|
|
55
|
+
const mode = options.mode ?? process.env.NODE_ENV ?? "development";
|
|
56
|
+
const cacheKey = `${cwd}:${mode}`;
|
|
57
|
+
if (!options.forceReload) {
|
|
58
|
+
const cached = cache.get(cacheKey);
|
|
59
|
+
if (cached) return cached;
|
|
60
|
+
}
|
|
61
|
+
const fileNames = envFilesInPriorityOrder(mode);
|
|
62
|
+
const filePaths = fileNames.map((f) => resolve(cwd, f));
|
|
63
|
+
const merged = {};
|
|
64
|
+
const loadedFromFiles = [];
|
|
65
|
+
for (const path of [...filePaths].reverse()) {
|
|
66
|
+
const parsed = readEnvFile(path);
|
|
67
|
+
if (parsed === null) continue;
|
|
68
|
+
for (const [k, v] of Object.entries(parsed)) {
|
|
69
|
+
merged[k] = v;
|
|
70
|
+
}
|
|
71
|
+
loadedFromFiles.unshift(path);
|
|
72
|
+
}
|
|
73
|
+
if (merged.NODE_ENV && process.env.__THEOKIT_USER_NODE_ENV === void 0) {
|
|
74
|
+
process.env.__THEOKIT_USER_NODE_ENV = merged.NODE_ENV;
|
|
75
|
+
}
|
|
76
|
+
delete merged.NODE_ENV;
|
|
77
|
+
const processEnvClone = {};
|
|
78
|
+
for (const [k, v] of Object.entries(process.env)) {
|
|
79
|
+
if (typeof v === "string") processEnvClone[k] = v;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
expand({ parsed: merged, processEnv: processEnvClone });
|
|
83
|
+
} catch (err) {
|
|
84
|
+
if (err instanceof RangeError) {
|
|
85
|
+
console.warn(
|
|
86
|
+
`[theokit] .env expansion overflow (likely circular reference like A=\${B}, B=\${A}). Leaving values as literals.`
|
|
87
|
+
);
|
|
88
|
+
} else {
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const loaded = {};
|
|
93
|
+
for (const [k, v] of Object.entries(merged)) {
|
|
94
|
+
if (process.env[k] !== void 0) continue;
|
|
95
|
+
process.env[k] = v;
|
|
96
|
+
loaded[k] = v;
|
|
97
|
+
}
|
|
98
|
+
process.env.__THEOKIT_PROCESSED_ENV = "true";
|
|
99
|
+
const result = { loaded, loadedFromFiles };
|
|
100
|
+
cache.set(cacheKey, result);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export {
|
|
105
|
+
_resetEnvCache,
|
|
106
|
+
loadEnv
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=chunk-4X6H2BXP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/load-env.ts"],"mappings":"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","names":[]}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
compareByCodeUnit
|
|
3
|
+
} from "./chunk-ZWN3AODA.js";
|
|
3
4
|
|
|
4
5
|
// src/server/_internal/scan-walker.ts
|
|
5
6
|
import { readdirSync } from "fs";
|
|
6
7
|
import { extname, join, resolve } from "path";
|
|
7
8
|
function walkSourceFiles(root, opts, onFile) {
|
|
8
9
|
const skipPrefixes = opts.skipPrefixes ?? ["_", "."];
|
|
10
|
+
const readDir = opts.readDir ?? ((dir) => readdirSync(dir, { withFileTypes: true }));
|
|
9
11
|
const visit = (dir) => {
|
|
10
12
|
let entries;
|
|
11
13
|
try {
|
|
12
|
-
entries =
|
|
14
|
+
entries = readDir(dir);
|
|
13
15
|
} catch {
|
|
14
16
|
return;
|
|
15
17
|
}
|
|
16
|
-
|
|
18
|
+
const ordered = [...entries].sort((a, b) => compareByCodeUnit(a.name, b.name));
|
|
19
|
+
for (const entry of ordered) {
|
|
17
20
|
const fullPath = join(dir, entry.name);
|
|
18
21
|
if (entry.isDirectory() && !skipPrefixes.some((p) => entry.name.startsWith(p))) {
|
|
19
22
|
visit(fullPath);
|
|
@@ -28,4 +31,4 @@ function walkSourceFiles(root, opts, onFile) {
|
|
|
28
31
|
export {
|
|
29
32
|
walkSourceFiles
|
|
30
33
|
};
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
34
|
+
//# sourceMappingURL=chunk-5K4TDLRG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/_internal/scan-walker.ts"],"mappings":";;;;;AAIA,SAAS,mBAAmB;AAE5B,SAAS,SAAS,MAAM,eAAe;AAoDhC,SAAS,gBACd,MACA,MACA,QACM;AACN,QAAM,eAAe,KAAK,gBAAgB,CAAC,KAAK,GAAG;AACnD,QAAM,UAAU,KAAK,YAAY,CAAC,QAAgB,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1F,QAAM,QAAQ,CAAC,QAAsB;AACnC,QAAI;AACJ,QAAI;AACF,gBAAU,QAAQ,GAAG;AAAA,IACvB,QAAQ;AAEN;AAAA,IACF;AAKA,UAAM,UAAU,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC;AAC7E,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,MAAM,IAAI;AACrC,UAAI,MAAM,YAAY,KAAK,CAAC,aAAa,KAAK,CAAC,MAAM,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG;AAC9E,cAAM,QAAQ;AAAA,MAChB,WAAW,MAAM,OAAO,KAAK,KAAK,WAAW,IAAI,QAAQ,MAAM,IAAI,CAAC,GAAG;AACrE,eAAO,QAAQ,QAAQ,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI;AACZ;","names":[]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "tsx/esm";
|
|
3
|
+
|
|
4
|
+
// src/server/_internal/process-singleton.ts
|
|
5
|
+
var NAMESPACE = "theokit.singleton.";
|
|
6
|
+
function processSingleton(key, factory) {
|
|
7
|
+
const slot = /* @__PURE__ */ Symbol.for(NAMESPACE + key);
|
|
8
|
+
const host = globalThis;
|
|
9
|
+
const existing = host[slot];
|
|
10
|
+
if (existing !== void 0) return existing;
|
|
11
|
+
const created = factory();
|
|
12
|
+
host[slot] = created;
|
|
13
|
+
return created;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// src/server/agent/provider-resolver.ts
|
|
17
|
+
var DEFAULT_REGISTRY = [
|
|
18
|
+
{
|
|
19
|
+
name: "openrouter",
|
|
20
|
+
envKey: "OPENROUTER_API_KEY",
|
|
21
|
+
baseUrl: "https://openrouter.ai/api/v1",
|
|
22
|
+
priority: 1
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "openai",
|
|
26
|
+
envKey: "OPENAI_API_KEY",
|
|
27
|
+
baseUrl: "https://api.openai.com/v1",
|
|
28
|
+
priority: 2
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "anthropic",
|
|
32
|
+
envKey: "ANTHROPIC_API_KEY",
|
|
33
|
+
baseUrl: "https://api.anthropic.com",
|
|
34
|
+
priority: 3
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
// Mirrors the profile `@theokit/sdk` already ships for this provider — same default host, same
|
|
38
|
+
// override variable — so the two cannot disagree about where ollama is listening. The SDK is
|
|
39
|
+
// what dials it (see `baseUrlEnv`); this entry's job is to stop the resolver from rejecting the
|
|
40
|
+
// model before the SDK is ever reached. No `envKey`: see that field's doc comment for why the
|
|
41
|
+
// absence also keeps this entry out of the priority walk.
|
|
42
|
+
name: "ollama",
|
|
43
|
+
baseUrl: "http://localhost:11434",
|
|
44
|
+
baseUrlEnv: "OLLAMA_HOST",
|
|
45
|
+
priority: 100
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
function registryOf() {
|
|
49
|
+
return processSingleton("provider-registry", () => [...DEFAULT_REGISTRY]);
|
|
50
|
+
}
|
|
51
|
+
var announced = /* @__PURE__ */ new Set();
|
|
52
|
+
function announce(desc, how, options) {
|
|
53
|
+
if (announced.has(desc.name)) return;
|
|
54
|
+
announced.add(desc.name);
|
|
55
|
+
const source = desc.envKey ?? "none (this provider takes no credential)";
|
|
56
|
+
const line = `[theokit] provider=${desc.name} (${how}) source=${source} baseUrl=${baseUrlOf(desc)}`;
|
|
57
|
+
if (options?.announce) options.announce(line);
|
|
58
|
+
else console.warn(line);
|
|
59
|
+
}
|
|
60
|
+
function baseUrlOf(desc) {
|
|
61
|
+
if (desc.baseUrlEnv === void 0) return desc.baseUrl;
|
|
62
|
+
const override = process.env[desc.baseUrlEnv];
|
|
63
|
+
return override !== void 0 && override.length > 0 ? override : desc.baseUrl;
|
|
64
|
+
}
|
|
65
|
+
function providerOf(modelId, registered) {
|
|
66
|
+
const prefix = declaredPrefixOf(modelId);
|
|
67
|
+
if (prefix === void 0) return void 0;
|
|
68
|
+
return registered.find((p) => p.name === prefix);
|
|
69
|
+
}
|
|
70
|
+
function declaredPrefixOf(modelId) {
|
|
71
|
+
if (modelId === void 0) return void 0;
|
|
72
|
+
const slash = modelId.indexOf("/");
|
|
73
|
+
if (slash <= 0) return void 0;
|
|
74
|
+
return modelId.slice(0, slash);
|
|
75
|
+
}
|
|
76
|
+
function takesCredential(desc) {
|
|
77
|
+
return desc.envKey !== void 0;
|
|
78
|
+
}
|
|
79
|
+
function resolveProvider(modelId, options) {
|
|
80
|
+
const sorted = [...registryOf()].sort((a, b) => a.priority - b.priority);
|
|
81
|
+
const declared = modelId === void 0 ? void 0 : providerOf(modelId, sorted);
|
|
82
|
+
if (declared !== void 0 && modelId !== void 0) {
|
|
83
|
+
if (declared.envKey === void 0) {
|
|
84
|
+
announce(declared, "declared by the model", options);
|
|
85
|
+
return { name: declared.name, apiKey: "", baseUrl: baseUrlOf(declared) };
|
|
86
|
+
}
|
|
87
|
+
const apiKey = process.env[declared.envKey];
|
|
88
|
+
if (apiKey && apiKey.length > 0) {
|
|
89
|
+
announce(declared, "declared by the model", options);
|
|
90
|
+
return { name: declared.name, apiKey, baseUrl: baseUrlOf(declared) };
|
|
91
|
+
}
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Model "${modelId}" declares provider "${declared.name}", but ${declared.envKey} is not set. Set ${declared.envKey}, or change the model's provider prefix.`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
const credentialed = sorted.filter(takesCredential);
|
|
97
|
+
for (const desc of credentialed) {
|
|
98
|
+
const apiKey = process.env[desc.envKey];
|
|
99
|
+
if (apiKey && apiKey.length > 0) {
|
|
100
|
+
announce(desc, "by env priority", options);
|
|
101
|
+
return {
|
|
102
|
+
name: desc.name,
|
|
103
|
+
apiKey,
|
|
104
|
+
baseUrl: baseUrlOf(desc)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const prefix = declaredPrefixOf(modelId);
|
|
109
|
+
if (prefix !== void 0) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
`Model "${modelId}" declares provider "${prefix}", which is not registered. Registered providers: ${sorted.map((p) => p.name).join(", ")}. Register it with registerProvider({ name: '${prefix}', \u2026 }), or use a registered prefix.`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
const envKeys = credentialed.map((p) => p.envKey).join(" OR ");
|
|
115
|
+
throw new Error(
|
|
116
|
+
`No LLM provider API key found in environment. Set one of: ${envKeys}. Get a free OpenRouter key at https://openrouter.ai/keys (recommended \u2014 one key, many models).`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// src/server/agent/approval-registry.ts
|
|
121
|
+
function getApprovalRegistry() {
|
|
122
|
+
return processSingleton("approval-registry", () => createInProcessApprovalRegistry());
|
|
123
|
+
}
|
|
124
|
+
function createInProcessApprovalRegistry() {
|
|
125
|
+
const pending = /* @__PURE__ */ new Map();
|
|
126
|
+
return {
|
|
127
|
+
register(approvalId, opts) {
|
|
128
|
+
return new Promise((resolve) => {
|
|
129
|
+
const settle = (decision) => {
|
|
130
|
+
const entry = pending.get(approvalId);
|
|
131
|
+
if (!entry) return;
|
|
132
|
+
clearTimeout(entry.timer);
|
|
133
|
+
pending.delete(approvalId);
|
|
134
|
+
resolve(decision);
|
|
135
|
+
};
|
|
136
|
+
const timer = setTimeout(() => {
|
|
137
|
+
settle({
|
|
138
|
+
approved: opts.onTimeout === "proceed",
|
|
139
|
+
settledBy: "timeout",
|
|
140
|
+
// Every value in this sentence was already here and none of it used to survive the
|
|
141
|
+
// settle. `onTimeout` is named because all three of its values reach this line and two
|
|
142
|
+
// of them deny — an operator who wrote `'retry'` and got a denial had nothing to read
|
|
143
|
+
// that mentioned retry.
|
|
144
|
+
reason: `no decision within ${String(opts.timeoutMs)} ms; onTimeout: '${opts.onTimeout}' was applied`
|
|
145
|
+
});
|
|
146
|
+
}, opts.timeoutMs);
|
|
147
|
+
const info = {
|
|
148
|
+
approvalId,
|
|
149
|
+
toolName: opts.toolName,
|
|
150
|
+
question: opts.question,
|
|
151
|
+
expiresAt: Date.now() + opts.timeoutMs,
|
|
152
|
+
...opts.payloadSchema !== void 0 ? { payloadSchema: opts.payloadSchema } : {}
|
|
153
|
+
};
|
|
154
|
+
pending.set(approvalId, {
|
|
155
|
+
settle,
|
|
156
|
+
timer,
|
|
157
|
+
info,
|
|
158
|
+
...opts.owner !== void 0 ? { owner: opts.owner } : {}
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
resolve(approvalId, decision) {
|
|
163
|
+
const entry = pending.get(approvalId);
|
|
164
|
+
if (!entry) return false;
|
|
165
|
+
entry.settle(typeof decision === "boolean" ? { approved: decision } : decision);
|
|
166
|
+
return true;
|
|
167
|
+
},
|
|
168
|
+
list() {
|
|
169
|
+
return [...pending.values()].map((p) => p.info);
|
|
170
|
+
},
|
|
171
|
+
ownerOf(approvalId) {
|
|
172
|
+
return pending.get(approvalId)?.owner;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export {
|
|
178
|
+
getApprovalRegistry,
|
|
179
|
+
resolveProvider
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=chunk-5YPXXSYY.js.map
|