gemi 0.130.0 → 0.132.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/dist/ai/AgentController.d.ts +73 -0
- package/dist/ai/AgentController.d.ts.map +1 -1
- package/dist/ai/AgentProvider.d.ts +25 -0
- package/dist/ai/AgentProvider.d.ts.map +1 -1
- package/dist/ai/VoiceBridge.d.ts +365 -0
- package/dist/ai/VoiceBridge.d.ts.map +1 -0
- package/dist/ai/index.d.ts +13 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +18 -18
- package/dist/ai/index.js.map +11 -6
- package/dist/ai/providers/endpoints.d.ts +19 -0
- package/dist/ai/providers/endpoints.d.ts.map +1 -1
- package/dist/ai/providers/realtime.d.ts +272 -0
- package/dist/ai/providers/realtime.d.ts.map +1 -0
- package/dist/ai/providers/sideband.d.ts +254 -0
- package/dist/ai/providers/sideband.d.ts.map +1 -0
- package/dist/ai/runtime.d.ts.map +1 -1
- package/dist/ai/types.d.ts +15 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/voice/index.d.ts +23 -0
- package/dist/ai/voice/index.d.ts.map +1 -0
- package/dist/ai/voice/index.js +433 -0
- package/dist/ai/voice/index.js.map +1 -0
- package/dist/ai/voice/state.d.ts +34 -0
- package/dist/ai/voice/state.d.ts.map +1 -0
- package/dist/ai/voice/useVoiceSession.d.ts +82 -0
- package/dist/ai/voice/useVoiceSession.d.ts.map +1 -0
- package/dist/ai/voice/voiceCall.d.ts +57 -0
- package/dist/ai/voice/voiceCall.d.ts.map +1 -0
- package/dist/ai/voice/wire.d.ts +66 -0
- package/dist/ai/voice/wire.d.ts.map +1 -0
- package/dist/ai/voiceConfig.d.ts +70 -0
- package/dist/ai/voiceConfig.d.ts.map +1 -0
- package/dist/ai/voiceMcp.d.ts +89 -0
- package/dist/ai/voiceMcp.d.ts.map +1 -0
- package/dist/ai/voiceStore.d.ts +52 -0
- package/dist/ai/voiceStore.d.ts.map +1 -0
- package/dist/app/App.d.ts +9 -0
- package/dist/app/App.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/bin/gemi.js +182 -128
- package/dist/bin/gemi.js.map +7 -6
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-ww86zqbw.js → chunk-0eamc2tr.js} +2 -2
- package/dist/{chunk-ww86zqbw.js.map → chunk-0eamc2tr.js.map} +1 -1
- package/dist/{chunk-1z311hyj.js → chunk-0gg4e94v.js} +2 -2
- package/dist/{chunk-1z311hyj.js.map → chunk-0gg4e94v.js.map} +1 -1
- package/dist/{chunk-2bmk0fzm.js → chunk-0rhf4g12.js} +3 -3
- package/dist/{chunk-2bmk0fzm.js.map → chunk-0rhf4g12.js.map} +1 -1
- package/dist/{chunk-43vjbd6n.js → chunk-1awxdnb6.js} +1 -1
- package/dist/{chunk-vc5kpxdk.js → chunk-2cnawkke.js} +12 -12
- package/dist/{chunk-vc5kpxdk.js.map → chunk-2cnawkke.js.map} +3 -3
- package/dist/{chunk-7ynnce4b.js → chunk-2vteyrjj.js} +3 -3
- package/dist/{chunk-7ynnce4b.js.map → chunk-2vteyrjj.js.map} +3 -3
- package/dist/{chunk-nh9ewam0.js → chunk-33hdxe7v.js} +1 -1
- package/dist/{chunk-0m2fyw7g.js → chunk-3g5q0cj5.js} +2 -2
- package/dist/{chunk-0m2fyw7g.js.map → chunk-3g5q0cj5.js.map} +1 -1
- package/dist/{chunk-1gdzajwb.js → chunk-3h37f124.js} +2 -2
- package/dist/{chunk-1gdzajwb.js.map → chunk-3h37f124.js.map} +1 -1
- package/dist/{chunk-qv8sj2z3.js → chunk-4278e429.js} +2 -2
- package/dist/{chunk-qv8sj2z3.js.map → chunk-4278e429.js.map} +1 -1
- package/dist/chunk-47e7fbsp.js +5 -0
- package/dist/{chunk-pqn9j5s8.js.map → chunk-47e7fbsp.js.map} +1 -1
- package/dist/{chunk-jj1ppnnk.js → chunk-4pvv8qs0.js} +2 -2
- package/dist/{chunk-jj1ppnnk.js.map → chunk-4pvv8qs0.js.map} +1 -1
- package/dist/{chunk-gzaaspe7.js → chunk-4t41m5f1.js} +2 -2
- package/dist/{chunk-gzaaspe7.js.map → chunk-4t41m5f1.js.map} +1 -1
- package/dist/{chunk-5nkvpc0a.js → chunk-53rr32zm.js} +1 -1
- package/dist/{chunk-5bk7767a.js → chunk-5pdgh9a1.js} +2 -2
- package/dist/{chunk-5bk7767a.js.map → chunk-5pdgh9a1.js.map} +1 -1
- package/dist/{chunk-1yttk239.js → chunk-65j32dtn.js} +2 -2
- package/dist/{chunk-1yttk239.js.map → chunk-65j32dtn.js.map} +1 -1
- package/dist/{chunk-pxsq9841.js → chunk-6fr6j338.js} +2 -2
- package/dist/{chunk-pxsq9841.js.map → chunk-6fr6j338.js.map} +1 -1
- package/dist/{chunk-5ym464xx.js → chunk-6hz63ts4.js} +4 -4
- package/dist/{chunk-5ym464xx.js.map → chunk-6hz63ts4.js.map} +1 -1
- package/dist/{chunk-ja41ts8v.js → chunk-6qty7at2.js} +2 -2
- package/dist/{chunk-ja41ts8v.js.map → chunk-6qty7at2.js.map} +1 -1
- package/dist/{chunk-wf3qe12c.js → chunk-7nxnyw7x.js} +2 -2
- package/dist/{chunk-wf3qe12c.js.map → chunk-7nxnyw7x.js.map} +1 -1
- package/dist/{chunk-dak8txaw.js → chunk-8ryrjtn0.js} +2 -2
- package/dist/{chunk-dak8txaw.js.map → chunk-8ryrjtn0.js.map} +1 -1
- package/dist/{chunk-pgddb43b.js → chunk-8sde8337.js} +2 -2
- package/dist/{chunk-pgddb43b.js.map → chunk-8sde8337.js.map} +1 -1
- package/dist/{chunk-0vxwrc4t.js → chunk-99a4e6zf.js} +2 -2
- package/dist/{chunk-0vxwrc4t.js.map → chunk-99a4e6zf.js.map} +1 -1
- package/dist/{chunk-p528pvmm.js → chunk-beb265c9.js} +2 -2
- package/dist/{chunk-p528pvmm.js.map → chunk-beb265c9.js.map} +1 -1
- package/dist/{chunk-ty5sp1ym.js → chunk-cxsvzqd4.js} +2 -2
- package/dist/{chunk-ty5sp1ym.js.map → chunk-cxsvzqd4.js.map} +1 -1
- package/dist/{chunk-8jqve5dr.js → chunk-dt95z6et.js} +2 -2
- package/dist/{chunk-8jqve5dr.js.map → chunk-dt95z6et.js.map} +1 -1
- package/dist/{chunk-vjpby5sf.js → chunk-feajsgns.js} +3 -3
- package/dist/{chunk-vjpby5sf.js.map → chunk-feajsgns.js.map} +1 -1
- package/dist/{chunk-2869cbhd.js → chunk-ff60bzvf.js} +3 -3
- package/dist/{chunk-2869cbhd.js.map → chunk-ff60bzvf.js.map} +1 -1
- package/dist/{chunk-kmcnfk2s.js → chunk-gng5e7pd.js} +1 -1
- package/dist/{chunk-np73p641.js → chunk-gqgpwb88.js} +2 -2
- package/dist/{chunk-np73p641.js.map → chunk-gqgpwb88.js.map} +1 -1
- package/dist/{chunk-njaxnv6c.js → chunk-ha15x5ns.js} +2 -2
- package/dist/{chunk-njaxnv6c.js.map → chunk-ha15x5ns.js.map} +1 -1
- package/dist/{chunk-n1t4ea9g.js → chunk-hb9hm8za.js} +3 -3
- package/dist/{chunk-n1t4ea9g.js.map → chunk-hb9hm8za.js.map} +1 -1
- package/dist/{chunk-h55c9bdf.js → chunk-hf492gg2.js} +1 -1
- package/dist/{chunk-wv3nnq8c.js → chunk-hj88dcss.js} +3 -3
- package/dist/{chunk-wv3nnq8c.js.map → chunk-hj88dcss.js.map} +1 -1
- package/dist/{chunk-jcps2gpp.js → chunk-j5g7qc5f.js} +2 -2
- package/dist/{chunk-jcps2gpp.js.map → chunk-j5g7qc5f.js.map} +1 -1
- package/dist/{chunk-fv53h1q2.js → chunk-jgx8ggbz.js} +2 -2
- package/dist/{chunk-fv53h1q2.js.map → chunk-jgx8ggbz.js.map} +1 -1
- package/dist/{chunk-cp84b0ev.js → chunk-jx2mgvvt.js} +3 -3
- package/dist/{chunk-cp84b0ev.js.map → chunk-jx2mgvvt.js.map} +1 -1
- package/dist/{chunk-4yp84g2y.js → chunk-jx5zx48j.js} +2 -2
- package/dist/{chunk-4yp84g2y.js.map → chunk-jx5zx48j.js.map} +1 -1
- package/dist/{chunk-pgh7gsag.js → chunk-jy9dkgt0.js} +2 -2
- package/dist/{chunk-pgh7gsag.js.map → chunk-jy9dkgt0.js.map} +1 -1
- package/dist/{chunk-wn437678.js → chunk-k2xeskp6.js} +2 -2
- package/dist/{chunk-wn437678.js.map → chunk-k2xeskp6.js.map} +1 -1
- package/dist/{chunk-xhm5wgfe.js → chunk-ka991yx4.js} +2 -2
- package/dist/{chunk-xhm5wgfe.js.map → chunk-ka991yx4.js.map} +1 -1
- package/dist/{chunk-bg5qb9hm.js → chunk-krk880my.js} +2 -2
- package/dist/{chunk-bg5qb9hm.js.map → chunk-krk880my.js.map} +1 -1
- package/dist/{chunk-7321qjgb.js → chunk-m9vwg9j1.js} +3 -3
- package/dist/{chunk-7321qjgb.js.map → chunk-m9vwg9j1.js.map} +1 -1
- package/dist/{chunk-03wc6em7.js → chunk-mpqvmge4.js} +1 -1
- package/dist/chunk-mr66zxsz.js +6 -0
- package/dist/{chunk-xtqhagxz.js.map → chunk-mr66zxsz.js.map} +2 -2
- package/dist/{chunk-3dyd4z06.js → chunk-mw7ft5bs.js} +2 -2
- package/dist/{chunk-3dyd4z06.js.map → chunk-mw7ft5bs.js.map} +1 -1
- package/dist/{chunk-x92g4x4w.js → chunk-njpnstck.js} +2 -2
- package/dist/{chunk-x92g4x4w.js.map → chunk-njpnstck.js.map} +1 -1
- package/dist/{chunk-gpdsxwkt.js → chunk-p82868xx.js} +2 -2
- package/dist/{chunk-gpdsxwkt.js.map → chunk-p82868xx.js.map} +1 -1
- package/dist/{chunk-er5ed5pg.js → chunk-pm8wjatv.js} +3 -3
- package/dist/{chunk-er5ed5pg.js.map → chunk-pm8wjatv.js.map} +1 -1
- package/dist/{chunk-2epj17ac.js → chunk-q15f5g86.js} +2 -2
- package/dist/{chunk-2epj17ac.js.map → chunk-q15f5g86.js.map} +1 -1
- package/dist/{chunk-qjmcn5m5.js → chunk-qfra7gah.js} +2 -2
- package/dist/{chunk-qjmcn5m5.js.map → chunk-qfra7gah.js.map} +1 -1
- package/dist/{chunk-xtnbcbkf.js → chunk-rnp5k8m3.js} +2 -2
- package/dist/{chunk-nvfhx9d1.js.map → chunk-rnp5k8m3.js.map} +1 -1
- package/dist/{chunk-n4dk0dc9.js → chunk-rzqft8q8.js} +2 -2
- package/dist/{chunk-n4dk0dc9.js.map → chunk-rzqft8q8.js.map} +1 -1
- package/dist/{chunk-jm1f9cas.js → chunk-s025aycr.js} +2 -2
- package/dist/{chunk-jm1f9cas.js.map → chunk-s025aycr.js.map} +1 -1
- package/dist/{chunk-tn3y2qkj.js → chunk-s782bzeq.js} +2 -2
- package/dist/{chunk-tn3y2qkj.js.map → chunk-s782bzeq.js.map} +1 -1
- package/dist/chunk-sa6cxt3g.js +4 -0
- package/dist/chunk-sa6cxt3g.js.map +10 -0
- package/dist/{chunk-9701fx4z.js → chunk-swwkdm75.js} +2 -2
- package/dist/{chunk-9701fx4z.js.map → chunk-swwkdm75.js.map} +1 -1
- package/dist/{chunk-9122838b.js → chunk-t33yh84d.js} +2 -2
- package/dist/{chunk-9122838b.js.map → chunk-t33yh84d.js.map} +1 -1
- package/dist/{chunk-13agap7z.js → chunk-t79n15f8.js} +4 -4
- package/dist/{chunk-13agap7z.js.map → chunk-t79n15f8.js.map} +3 -3
- package/dist/{chunk-mc8mxx2a.js → chunk-vnw91fe1.js} +2 -2
- package/dist/{chunk-mc8mxx2a.js.map → chunk-vnw91fe1.js.map} +1 -1
- package/dist/{chunk-k10vbrjx.js → chunk-w1cksc5z.js} +3 -3
- package/dist/{chunk-k10vbrjx.js.map → chunk-w1cksc5z.js.map} +1 -1
- package/dist/chunk-wevj4981.js +122 -0
- package/dist/{chunk-0ryswty9.js.map → chunk-wevj4981.js.map} +10 -9
- package/dist/{chunk-nvfhx9d1.js → chunk-wrsf2abe.js} +2 -2
- package/dist/{chunk-xtnbcbkf.js.map → chunk-wrsf2abe.js.map} +1 -1
- package/dist/{chunk-k107vw69.js → chunk-x16ckgq1.js} +2 -2
- package/dist/{chunk-k107vw69.js.map → chunk-x16ckgq1.js.map} +1 -1
- package/dist/{chunk-1rq53cb0.js → chunk-x51tegk3.js} +2 -2
- package/dist/{chunk-1rq53cb0.js.map → chunk-x51tegk3.js.map} +1 -1
- package/dist/{chunk-87rtxv9n.js → chunk-x5hj0mqp.js} +2 -2
- package/dist/{chunk-87rtxv9n.js.map → chunk-x5hj0mqp.js.map} +1 -1
- package/dist/{chunk-f8ce6e9c.js → chunk-x9bk5s21.js} +2 -2
- package/dist/{chunk-f8ce6e9c.js.map → chunk-x9bk5s21.js.map} +1 -1
- package/dist/{chunk-nwzsgzvy.js → chunk-xvvsc58s.js} +2 -2
- package/dist/{chunk-nwzsgzvy.js.map → chunk-xvvsc58s.js.map} +1 -1
- package/dist/{chunk-t7gvgz20.js → chunk-xymr3asa.js} +2 -2
- package/dist/{chunk-t7gvgz20.js.map → chunk-xymr3asa.js.map} +1 -1
- package/dist/{chunk-2z1gd231.js → chunk-ysc7ykss.js} +2 -2
- package/dist/{chunk-2z1gd231.js.map → chunk-ysc7ykss.js.map} +1 -1
- package/dist/{chunk-v09w6pr2.js → chunk-z61dj480.js} +3 -3
- package/dist/{chunk-v09w6pr2.js.map → chunk-z61dj480.js.map} +1 -1
- package/dist/{chunk-peng31np.js → chunk-z9xxthp1.js} +3 -3
- package/dist/{chunk-peng31np.js.map → chunk-z9xxthp1.js.map} +1 -1
- package/dist/{chunk-fezaxj28.js → chunk-zv5qyrqg.js} +2 -2
- package/dist/{chunk-fezaxj28.js.map → chunk-zv5qyrqg.js.map} +1 -1
- package/dist/{chunk-sh39q44t.js → chunk-zyhmn3hy.js} +3 -3
- package/dist/{chunk-sh39q44t.js.map → chunk-zyhmn3hy.js.map} +1 -1
- package/dist/{chunk-b7wmssj5.js → chunk-zypmy8yq.js} +2 -2
- package/dist/{chunk-b7wmssj5.js.map → chunk-zypmy8yq.js.map} +1 -1
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/ApiRouter.d.ts +27 -5
- package/dist/http/ApiRouter.d.ts.map +1 -1
- package/dist/http/ViewRouter.d.ts +17 -0
- package/dist/http/ViewRouter.d.ts.map +1 -1
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/server/httpDev.d.ts.map +1 -1
- package/dist/server/httpProd.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -3
- package/dist/services/index.js.map +2 -2
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/services/router/DomainResolver.d.ts +12 -0
- package/dist/services/router/DomainResolver.d.ts.map +1 -1
- package/dist/services/router/ViewRouteDispatcher.d.ts.map +1 -1
- package/dist/services/router/config.d.ts +21 -5
- package/dist/services/router/config.d.ts.map +1 -1
- package/dist/services/router/documentScript.d.ts +46 -0
- package/dist/services/router/documentScript.d.ts.map +1 -0
- package/dist/services/router/staticDocument.d.ts +11 -1
- package/dist/services/router/staticDocument.d.ts.map +1 -1
- package/dist/stats/route-table.js +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/testing/index.js +4 -2
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/staticDocument.d.ts +8 -2
- package/dist/testing/staticDocument.d.ts.map +1 -1
- package/dist/vitest/index.js +1 -1
- package/package.json +2 -1
- package/dist/chunk-0ryswty9.js +0 -120
- package/dist/chunk-bnp6wpzd.js +0 -4
- package/dist/chunk-bnp6wpzd.js.map +0 -10
- package/dist/chunk-pqn9j5s8.js +0 -5
- package/dist/chunk-xtqhagxz.js +0 -6
- /package/dist/{chunk-43vjbd6n.js.map → chunk-1awxdnb6.js.map} +0 -0
- /package/dist/{chunk-nh9ewam0.js.map → chunk-33hdxe7v.js.map} +0 -0
- /package/dist/{chunk-5nkvpc0a.js.map → chunk-53rr32zm.js.map} +0 -0
- /package/dist/{chunk-kmcnfk2s.js.map → chunk-gng5e7pd.js.map} +0 -0
- /package/dist/{chunk-h55c9bdf.js.map → chunk-hf492gg2.js.map} +0 -0
- /package/dist/{chunk-03wc6em7.js.map → chunk-mpqvmge4.js.map} +0 -0
package/dist/bin/gemi.js
CHANGED
|
@@ -4006,7 +4006,7 @@ var require_util = __commonJS((exports) => {
|
|
|
4006
4006
|
return path3;
|
|
4007
4007
|
}
|
|
4008
4008
|
exports.normalize = normalize;
|
|
4009
|
-
function
|
|
4009
|
+
function join4(aRoot, aPath) {
|
|
4010
4010
|
if (aRoot === "") {
|
|
4011
4011
|
aRoot = ".";
|
|
4012
4012
|
}
|
|
@@ -4038,11 +4038,11 @@ var require_util = __commonJS((exports) => {
|
|
|
4038
4038
|
}
|
|
4039
4039
|
return joined;
|
|
4040
4040
|
}
|
|
4041
|
-
exports.join =
|
|
4041
|
+
exports.join = join4;
|
|
4042
4042
|
exports.isAbsolute = function(aPath) {
|
|
4043
4043
|
return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
|
|
4044
4044
|
};
|
|
4045
|
-
function
|
|
4045
|
+
function relative2(aRoot, aPath) {
|
|
4046
4046
|
if (aRoot === "") {
|
|
4047
4047
|
aRoot = ".";
|
|
4048
4048
|
}
|
|
@@ -4061,7 +4061,7 @@ var require_util = __commonJS((exports) => {
|
|
|
4061
4061
|
}
|
|
4062
4062
|
return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
|
|
4063
4063
|
}
|
|
4064
|
-
exports.relative =
|
|
4064
|
+
exports.relative = relative2;
|
|
4065
4065
|
var supportsNullProto = function() {
|
|
4066
4066
|
var obj = Object.create(null);
|
|
4067
4067
|
return !("__proto__" in obj);
|
|
@@ -4211,7 +4211,7 @@ var require_util = __commonJS((exports) => {
|
|
|
4211
4211
|
parsed.path = parsed.path.substring(0, index + 1);
|
|
4212
4212
|
}
|
|
4213
4213
|
}
|
|
4214
|
-
sourceURL =
|
|
4214
|
+
sourceURL = join4(urlGenerate(parsed), sourceURL);
|
|
4215
4215
|
}
|
|
4216
4216
|
return normalize(sourceURL);
|
|
4217
4217
|
}
|
|
@@ -36727,7 +36727,7 @@ var init_generate = __esm(() => {
|
|
|
36727
36727
|
|
|
36728
36728
|
// bin/gemi.ts
|
|
36729
36729
|
import path10 from "path";
|
|
36730
|
-
import { existsSync as
|
|
36730
|
+
import { existsSync as existsSync11 } from "fs";
|
|
36731
36731
|
import { mkdtemp, rm } from "fs/promises";
|
|
36732
36732
|
import { tmpdir as tmpdir2 } from "os";
|
|
36733
36733
|
|
|
@@ -36798,6 +36798,9 @@ class App {
|
|
|
36798
36798
|
sockets() {
|
|
36799
36799
|
return this.kernel.sockets.call(this.kernel);
|
|
36800
36800
|
}
|
|
36801
|
+
applyTrustedClientIp(req) {
|
|
36802
|
+
this.kernel.domains().resolver?.applyClientIp(req);
|
|
36803
|
+
}
|
|
36801
36804
|
getRouteManifest() {
|
|
36802
36805
|
return this.kernel.viewRoutes().routeManifest;
|
|
36803
36806
|
}
|
|
@@ -36818,6 +36821,7 @@ class App {
|
|
|
36818
36821
|
async fetch(req) {
|
|
36819
36822
|
const url = new URL(req.url);
|
|
36820
36823
|
return this.kernel.run.call(this.kernel, async () => {
|
|
36824
|
+
this.applyTrustedClientIp(req);
|
|
36821
36825
|
const gated = this.globallyGated.has(req);
|
|
36822
36826
|
const outcome = gated ? null : await this.kernel.globalMiddleware(req);
|
|
36823
36827
|
const carried = gated ? this.globallyGated.get(req) : outcome.carried;
|
|
@@ -36873,13 +36877,97 @@ async function loadApp() {
|
|
|
36873
36877
|
return new App({ kernel: Kernel });
|
|
36874
36878
|
}
|
|
36875
36879
|
|
|
36880
|
+
// services/router/documentScript.ts
|
|
36881
|
+
import { existsSync as existsSync2, readFileSync } from "fs";
|
|
36882
|
+
import { join as join3 } from "path";
|
|
36883
|
+
|
|
36884
|
+
// support/discover.ts
|
|
36885
|
+
import { existsSync, readdirSync } from "fs";
|
|
36886
|
+
import { join as join2, relative } from "path";
|
|
36887
|
+
function sourceFiles(dir, ignore = []) {
|
|
36888
|
+
const out = [];
|
|
36889
|
+
const ignored = (path2) => {
|
|
36890
|
+
const rel = relative(dir, path2).split("\\").join("/");
|
|
36891
|
+
return ignore.some((pattern) => rel === pattern || rel.startsWith(`${pattern}/`));
|
|
36892
|
+
};
|
|
36893
|
+
const walk = (current) => {
|
|
36894
|
+
for (const entry of readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0)) {
|
|
36895
|
+
const path2 = join2(current, entry.name);
|
|
36896
|
+
if (ignored(path2))
|
|
36897
|
+
continue;
|
|
36898
|
+
if (entry.isDirectory()) {
|
|
36899
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
36900
|
+
continue;
|
|
36901
|
+
if (existsSync(join2(path2, "package.json")))
|
|
36902
|
+
continue;
|
|
36903
|
+
walk(path2);
|
|
36904
|
+
continue;
|
|
36905
|
+
}
|
|
36906
|
+
if (!entry.name.endsWith(".ts") && !entry.name.endsWith(".tsx"))
|
|
36907
|
+
continue;
|
|
36908
|
+
if (entry.name.endsWith(".d.ts"))
|
|
36909
|
+
continue;
|
|
36910
|
+
if (/\.(test|test-d|spec|bench)\.tsx?$/.test(entry.name))
|
|
36911
|
+
continue;
|
|
36912
|
+
out.push(path2);
|
|
36913
|
+
}
|
|
36914
|
+
};
|
|
36915
|
+
if (!existsSync(dir))
|
|
36916
|
+
return out;
|
|
36917
|
+
walk(dir);
|
|
36918
|
+
return out;
|
|
36919
|
+
}
|
|
36920
|
+
|
|
36921
|
+
// services/router/documentScript.ts
|
|
36922
|
+
var DOCUMENT_SCRIPT_SUFFIX = ".script";
|
|
36923
|
+
var DOCUMENT_SCRIPTS_MANIFEST = "document-scripts.json";
|
|
36924
|
+
var NAME = /^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$/;
|
|
36925
|
+
async function bundleDocumentScript(file) {
|
|
36926
|
+
const result = await Bun.build({
|
|
36927
|
+
entrypoints: [file],
|
|
36928
|
+
target: "browser",
|
|
36929
|
+
format: "iife",
|
|
36930
|
+
minify: true,
|
|
36931
|
+
throw: false
|
|
36932
|
+
});
|
|
36933
|
+
if (!result.success || !result.outputs[0]) {
|
|
36934
|
+
const logs = result.logs.map((log) => String(log)).join(`
|
|
36935
|
+
`);
|
|
36936
|
+
throw new Error(`The document script ${file} does not bundle.
|
|
36937
|
+
${logs}`);
|
|
36938
|
+
}
|
|
36939
|
+
const source = (await result.outputs[0].text()).trim();
|
|
36940
|
+
if (/<\/script|<!--/i.test(source)) {
|
|
36941
|
+
throw new Error(`The document script ${file} contains "</script" or "<!--", which would end the inline <script> it is put in. Write it "<\\/script" or build the string from parts.`);
|
|
36942
|
+
}
|
|
36943
|
+
return source;
|
|
36944
|
+
}
|
|
36945
|
+
async function bundleDocumentScripts(appDir) {
|
|
36946
|
+
const views = join3(appDir, "views");
|
|
36947
|
+
const scripts = {};
|
|
36948
|
+
if (!existsSync2(views))
|
|
36949
|
+
return scripts;
|
|
36950
|
+
const glob = new Bun.Glob(`**/*${DOCUMENT_SCRIPT_SUFFIX}.{ts,js}`);
|
|
36951
|
+
const files = [...glob.scanSync({ cwd: views })].sort();
|
|
36952
|
+
for (const file of files) {
|
|
36953
|
+
if (file.split("/").includes("node_modules"))
|
|
36954
|
+
continue;
|
|
36955
|
+
const name = file.replace(/\.script\.[tj]s$/, "");
|
|
36956
|
+
if (!NAME.test(name) || name in scripts)
|
|
36957
|
+
continue;
|
|
36958
|
+
scripts[name] = await bundleDocumentScript(join3(views, file));
|
|
36959
|
+
}
|
|
36960
|
+
return scripts;
|
|
36961
|
+
}
|
|
36962
|
+
var bundledInProduction = new Map;
|
|
36963
|
+
|
|
36876
36964
|
// bin/migrate/index.ts
|
|
36877
36965
|
import path2 from "path";
|
|
36878
36966
|
import {
|
|
36879
|
-
existsSync,
|
|
36967
|
+
existsSync as existsSync3,
|
|
36880
36968
|
mkdirSync,
|
|
36881
|
-
readFileSync,
|
|
36882
|
-
readdirSync,
|
|
36969
|
+
readFileSync as readFileSync2,
|
|
36970
|
+
readdirSync as readdirSync2,
|
|
36883
36971
|
rmSync,
|
|
36884
36972
|
statSync,
|
|
36885
36973
|
writeFileSync
|
|
@@ -37750,7 +37838,7 @@ var GEMI_MODULES = [
|
|
|
37750
37838
|
async function runMigrate(options) {
|
|
37751
37839
|
const { rootDir, dryRun = false } = options;
|
|
37752
37840
|
const appDir = path2.join(rootDir, "app");
|
|
37753
|
-
if (!
|
|
37841
|
+
if (!existsSync3(appDir)) {
|
|
37754
37842
|
console.error(`No app/ directory found in ${rootDir}. Nothing to migrate.`);
|
|
37755
37843
|
process.exitCode = 1;
|
|
37756
37844
|
return;
|
|
@@ -37761,9 +37849,9 @@ async function runMigrate(options) {
|
|
|
37761
37849
|
const slices = new Map;
|
|
37762
37850
|
const migratedFiles = [];
|
|
37763
37851
|
const carriedProviders = [];
|
|
37764
|
-
const onOldLayout =
|
|
37852
|
+
const onOldLayout = existsSync3(providersDir);
|
|
37765
37853
|
if (onOldLayout) {
|
|
37766
|
-
for (const entry of
|
|
37854
|
+
for (const entry of readdirSync2(providersDir).sort()) {
|
|
37767
37855
|
if (!/\.tsx?$/.test(entry))
|
|
37768
37856
|
continue;
|
|
37769
37857
|
const file = path2.join(providersDir, entry);
|
|
@@ -37787,7 +37875,7 @@ async function runMigrate(options) {
|
|
|
37787
37875
|
for (const [configKey, inputs] of slices) {
|
|
37788
37876
|
const emitted = buildConfigFile(configKey, inputs, { rootDir, appDir, aliasPrefix }, notes);
|
|
37789
37877
|
const configFile = path2.join(appDir, "config", `${configKey}.ts`);
|
|
37790
|
-
if (
|
|
37878
|
+
if (existsSync3(configFile)) {
|
|
37791
37879
|
notes.push({
|
|
37792
37880
|
file: rel(rootDir, configFile),
|
|
37793
37881
|
message: `already exists \u2014 left untouched. The ${inputs.length === 1 ? "provider" : "providers"} it would ` + `have been generated from ${inputs.length === 1 ? "is" : "are"} left in place too, so nothing is ` + `lost; fold them together by hand and delete the provider.`
|
|
@@ -37801,7 +37889,7 @@ async function runMigrate(options) {
|
|
|
37801
37889
|
}
|
|
37802
37890
|
changes.push({ file: configFile, contents: emitted.contents });
|
|
37803
37891
|
for (const extracted of emitted.extractedFiles) {
|
|
37804
|
-
if (
|
|
37892
|
+
if (existsSync3(extracted.file)) {
|
|
37805
37893
|
notes.push({
|
|
37806
37894
|
file: rel(rootDir, extracted.file),
|
|
37807
37895
|
message: "already exists \u2014 left untouched, review it by hand"
|
|
@@ -37813,7 +37901,7 @@ async function runMigrate(options) {
|
|
|
37813
37901
|
}
|
|
37814
37902
|
const kernelFile = path2.join(appDir, "kernel", "Kernel.ts");
|
|
37815
37903
|
if (onOldLayout) {
|
|
37816
|
-
if (
|
|
37904
|
+
if (existsSync3(kernelFile)) {
|
|
37817
37905
|
changes.push({
|
|
37818
37906
|
file: kernelFile,
|
|
37819
37907
|
contents: buildKernel(kernelFile, [...slices.keys()], carriedProviders, rootDir, notes)
|
|
@@ -37826,7 +37914,7 @@ async function runMigrate(options) {
|
|
|
37826
37914
|
}
|
|
37827
37915
|
}
|
|
37828
37916
|
const appProviderFile = path2.join(appDir, "providers", "AppServiceProvider.ts");
|
|
37829
|
-
if (onOldLayout && !
|
|
37917
|
+
if (onOldLayout && !existsSync3(appProviderFile)) {
|
|
37830
37918
|
changes.push({ file: appProviderFile, contents: APP_SERVICE_PROVIDER });
|
|
37831
37919
|
}
|
|
37832
37920
|
for (const file of migratedFiles)
|
|
@@ -37835,7 +37923,7 @@ async function runMigrate(options) {
|
|
|
37835
37923
|
for (const file of walk(appDir)) {
|
|
37836
37924
|
if (touched.has(file))
|
|
37837
37925
|
continue;
|
|
37838
|
-
const source =
|
|
37926
|
+
const source = readFileSync2(file, "utf8");
|
|
37839
37927
|
let rewritten = rewriteReferences(source, rel(rootDir, file), notes);
|
|
37840
37928
|
rewritten = annotateRetiredFields(rewritten, file, rootDir, notes);
|
|
37841
37929
|
if (rewritten !== source)
|
|
@@ -37855,7 +37943,7 @@ async function runMigrate(options) {
|
|
|
37855
37943
|
continue;
|
|
37856
37944
|
swept.add(file);
|
|
37857
37945
|
const index = pending.get(file);
|
|
37858
|
-
const before = index === undefined ?
|
|
37946
|
+
const before = index === undefined ? readFileSync2(file, "utf8") : changes[index].contents;
|
|
37859
37947
|
const after = annotateOrmPortHazards(before, rel(rootDir, file), notes);
|
|
37860
37948
|
if (after === before)
|
|
37861
37949
|
continue;
|
|
@@ -37877,21 +37965,21 @@ async function runMigrate(options) {
|
|
|
37877
37965
|
rmSync(change.file, { force: true });
|
|
37878
37966
|
continue;
|
|
37879
37967
|
}
|
|
37880
|
-
const verb =
|
|
37968
|
+
const verb = existsSync3(change.file) ? "update" : "create";
|
|
37881
37969
|
console.log(` ${verb.padStart(6)} ${label}`);
|
|
37882
37970
|
if (dryRun)
|
|
37883
37971
|
continue;
|
|
37884
37972
|
mkdirSync(path2.dirname(change.file), { recursive: true });
|
|
37885
37973
|
writeFileSync(change.file, change.contents);
|
|
37886
37974
|
}
|
|
37887
|
-
if (!dryRun &&
|
|
37975
|
+
if (!dryRun && existsSync3(providersDir) && readdirSync2(providersDir).length === 0) {
|
|
37888
37976
|
rmSync(providersDir, { recursive: true, force: true });
|
|
37889
37977
|
}
|
|
37890
37978
|
report(notes, dryRun);
|
|
37891
37979
|
}
|
|
37892
37980
|
function readProvider(file, rootDir, notes) {
|
|
37893
37981
|
const label = rel(rootDir, file);
|
|
37894
|
-
const source = rewriteReferences(
|
|
37982
|
+
const source = rewriteReferences(readFileSync2(file, "utf8"), label, notes, {
|
|
37895
37983
|
keepProviders: true
|
|
37896
37984
|
});
|
|
37897
37985
|
const imports = parseImports(source);
|
|
@@ -38099,7 +38187,7 @@ function reindent(text, width, shift) {
|
|
|
38099
38187
|
`);
|
|
38100
38188
|
}
|
|
38101
38189
|
function buildKernel(file, configKeys, carriedProviders, rootDir, notes) {
|
|
38102
|
-
const source =
|
|
38190
|
+
const source = readFileSync2(file, "utf8");
|
|
38103
38191
|
const imports = parseImports(source);
|
|
38104
38192
|
const kernelClass = findClasses(source).find((cls) => cls.isDefaultExport);
|
|
38105
38193
|
const providerLocals = new Map;
|
|
@@ -38368,19 +38456,19 @@ function moduleSpecifier(ctx, dir, name) {
|
|
|
38368
38456
|
return `${ctx.aliasPrefix}${dir}/${name}`;
|
|
38369
38457
|
const from = path2.join(ctx.appDir, "config");
|
|
38370
38458
|
const to = path2.join(ctx.rootDir, dir, name);
|
|
38371
|
-
const
|
|
38372
|
-
return
|
|
38459
|
+
const relative2 = path2.relative(from, to).split(path2.sep).join("/");
|
|
38460
|
+
return relative2.startsWith(".") ? relative2 : `./${relative2}`;
|
|
38373
38461
|
}
|
|
38374
38462
|
function detectAliasPrefix(appDir) {
|
|
38375
38463
|
for (const file of walk(appDir)) {
|
|
38376
|
-
const source =
|
|
38464
|
+
const source = readFileSync2(file, "utf8");
|
|
38377
38465
|
if (/from\s+["']@\/app\//.test(source))
|
|
38378
38466
|
return "@/";
|
|
38379
38467
|
}
|
|
38380
38468
|
return null;
|
|
38381
38469
|
}
|
|
38382
38470
|
function* walk(dir) {
|
|
38383
|
-
for (const entry of
|
|
38471
|
+
for (const entry of readdirSync2(dir).sort()) {
|
|
38384
38472
|
if (entry === "node_modules" || entry === "dist" || entry.startsWith("."))
|
|
38385
38473
|
continue;
|
|
38386
38474
|
const full = path2.join(dir, entry);
|
|
@@ -38580,13 +38668,13 @@ function gemiPlugin() {
|
|
|
38580
38668
|
}
|
|
38581
38669
|
|
|
38582
38670
|
// config/load.ts
|
|
38583
|
-
import { existsSync as
|
|
38584
|
-
import { join as
|
|
38671
|
+
import { existsSync as existsSync4 } from "fs";
|
|
38672
|
+
import { join as join4 } from "path";
|
|
38585
38673
|
var CONFIG_FILES = ["gemi.config.ts", "gemi.config.js", "gemi.config.mjs"];
|
|
38586
38674
|
async function loadGemiConfig(rootDir = process.cwd()) {
|
|
38587
38675
|
for (const name of CONFIG_FILES) {
|
|
38588
|
-
const path3 =
|
|
38589
|
-
if (
|
|
38676
|
+
const path3 = join4(rootDir, name);
|
|
38677
|
+
if (existsSync4(path3)) {
|
|
38590
38678
|
const mod = await import(path3);
|
|
38591
38679
|
return mod.default ?? mod;
|
|
38592
38680
|
}
|
|
@@ -38613,8 +38701,8 @@ for (let i = 0;i < chars.length; i++) {
|
|
|
38613
38701
|
intToChar[i] = c;
|
|
38614
38702
|
charToInt[c] = i;
|
|
38615
38703
|
}
|
|
38616
|
-
function encodeInteger(builder, num,
|
|
38617
|
-
let delta = num -
|
|
38704
|
+
function encodeInteger(builder, num, relative2) {
|
|
38705
|
+
let delta = num - relative2;
|
|
38618
38706
|
delta = delta < 0 ? -delta << 1 | 1 : delta << 1;
|
|
38619
38707
|
do {
|
|
38620
38708
|
let clamped = delta & 31;
|
|
@@ -40054,7 +40142,7 @@ function walk2(node, visit) {
|
|
|
40054
40142
|
|
|
40055
40143
|
// vite/assetBasePlugin.ts
|
|
40056
40144
|
import { mkdir, writeFile } from "fs/promises";
|
|
40057
|
-
import { dirname, join as
|
|
40145
|
+
import { dirname, join as join5 } from "path";
|
|
40058
40146
|
|
|
40059
40147
|
// config/assetBase.ts
|
|
40060
40148
|
var DEFAULT_ASSET_BASE = "/";
|
|
@@ -40087,7 +40175,7 @@ function gemiAssetBasePlugin(assetBase) {
|
|
|
40087
40175
|
if (!resolved || resolved.command !== "build" || resolved.build.ssr || !options.dir) {
|
|
40088
40176
|
return;
|
|
40089
40177
|
}
|
|
40090
|
-
const file =
|
|
40178
|
+
const file = join5(options.dir, ASSET_BASE_RECORD);
|
|
40091
40179
|
await mkdir(dirname(file), { recursive: true });
|
|
40092
40180
|
await writeFile(file, `${JSON.stringify({ assetBase: documentBase(resolved.base) })}
|
|
40093
40181
|
`);
|
|
@@ -40100,7 +40188,7 @@ function documentBase(base) {
|
|
|
40100
40188
|
|
|
40101
40189
|
// vite/islandPlugin.ts
|
|
40102
40190
|
import { realpathSync } from "fs";
|
|
40103
|
-
import { relative, sep } from "path";
|
|
40191
|
+
import { relative as relative2, sep } from "path";
|
|
40104
40192
|
|
|
40105
40193
|
// internal/islandRuntime.ts
|
|
40106
40194
|
var ISLAND_RUNTIME_ID = "virtual:gemi-island-runtime";
|
|
@@ -40194,7 +40282,7 @@ function gemiIslandPlugin() {
|
|
|
40194
40282
|
if (!resolved || resolved.external)
|
|
40195
40283
|
continue;
|
|
40196
40284
|
const file = realPath(resolved.id.split("?")[0]);
|
|
40197
|
-
const key =
|
|
40285
|
+
const key = relative2(root, file).split(sep).join("/");
|
|
40198
40286
|
if (key.startsWith(".."))
|
|
40199
40287
|
continue;
|
|
40200
40288
|
const name = `__gemi_island_${imports.length}`;
|
|
@@ -40274,7 +40362,7 @@ var vite_default = gemi;
|
|
|
40274
40362
|
|
|
40275
40363
|
// vite/previousAssets.ts
|
|
40276
40364
|
import { copyFile, lstat, mkdir as mkdir2, readdir, readFile, stat, writeFile as writeFile2 } from "fs/promises";
|
|
40277
|
-
import { dirname as dirname2, isAbsolute, join as
|
|
40365
|
+
import { dirname as dirname2, isAbsolute, join as join6, relative as relative3, resolve, sep as sep2 } from "path";
|
|
40278
40366
|
var PREVIOUS_ASSETS_RECORD = ".vite/previous-assets.json";
|
|
40279
40367
|
var DEFAULT_RETAINED_RELEASES = 2;
|
|
40280
40368
|
var DEFAULT_RETAINED_MAX_AGE_SECONDS = 7 * 24 * 60 * 60;
|
|
@@ -40285,7 +40373,7 @@ function resolvePreviousAssets(configured, rootDir, env = process.env.GEMI_PREVI
|
|
|
40285
40373
|
return;
|
|
40286
40374
|
}
|
|
40287
40375
|
const config = typeof configured === "object" ? configured : {};
|
|
40288
|
-
const from = fromEnv || config.from ||
|
|
40376
|
+
const from = fromEnv || config.from || join6("dist", "client");
|
|
40289
40377
|
const releases = config.releases ?? DEFAULT_RETAINED_RELEASES;
|
|
40290
40378
|
const maxAge = config.maxAge ?? DEFAULT_RETAINED_MAX_AGE_SECONDS;
|
|
40291
40379
|
if (!Number.isInteger(releases) || releases < 0) {
|
|
@@ -40302,8 +40390,8 @@ function resolvePreviousAssets(configured, rootDir, env = process.env.GEMI_PREVI
|
|
|
40302
40390
|
}
|
|
40303
40391
|
async function stagePreviousAssets(options, stagingDir, now = new Date) {
|
|
40304
40392
|
const { from } = options;
|
|
40305
|
-
if (!await isDirectory(
|
|
40306
|
-
console.log(`No previous assets at ${
|
|
40393
|
+
if (!await isDirectory(join6(from, ASSETS_DIR))) {
|
|
40394
|
+
console.log(`No previous assets at ${join6(from, ASSETS_DIR)}; nothing to carry over.`);
|
|
40307
40395
|
return [];
|
|
40308
40396
|
}
|
|
40309
40397
|
const carried = await readRecord(from);
|
|
@@ -40323,7 +40411,7 @@ async function stagePreviousAssets(options, stagingDir, now = new Date) {
|
|
|
40323
40411
|
if (!source || !await isFile(source)) {
|
|
40324
40412
|
continue;
|
|
40325
40413
|
}
|
|
40326
|
-
const target =
|
|
40414
|
+
const target = join6(stagingDir, file);
|
|
40327
40415
|
await mkdir2(dirname2(target), { recursive: true });
|
|
40328
40416
|
await copyFile(source, target);
|
|
40329
40417
|
await copySiblings(source, target);
|
|
@@ -40347,8 +40435,8 @@ async function restorePreviousAssets(stagingDir, clientDir, releases) {
|
|
|
40347
40435
|
continue;
|
|
40348
40436
|
}
|
|
40349
40437
|
await mkdir2(dirname2(target), { recursive: true });
|
|
40350
|
-
await copyFile(
|
|
40351
|
-
await copySiblings(
|
|
40438
|
+
await copyFile(join6(stagingDir, file), target);
|
|
40439
|
+
await copySiblings(join6(stagingDir, file), target);
|
|
40352
40440
|
files.push(file);
|
|
40353
40441
|
paths.push(file);
|
|
40354
40442
|
}
|
|
@@ -40357,7 +40445,7 @@ async function restorePreviousAssets(stagingDir, clientDir, releases) {
|
|
|
40357
40445
|
count += files.length;
|
|
40358
40446
|
}
|
|
40359
40447
|
}
|
|
40360
|
-
const recordPath =
|
|
40448
|
+
const recordPath = join6(clientDir, PREVIOUS_ASSETS_RECORD);
|
|
40361
40449
|
await mkdir2(dirname2(recordPath), { recursive: true });
|
|
40362
40450
|
await writeFile2(recordPath, `${JSON.stringify({ releases: record }, null, 2)}
|
|
40363
40451
|
`);
|
|
@@ -40378,7 +40466,7 @@ async function copySiblings(source, target) {
|
|
|
40378
40466
|
async function readRecord(clientDir) {
|
|
40379
40467
|
let raw;
|
|
40380
40468
|
try {
|
|
40381
|
-
raw = await readFile(
|
|
40469
|
+
raw = await readFile(join6(clientDir, PREVIOUS_ASSETS_RECORD), "utf8");
|
|
40382
40470
|
} catch (error) {
|
|
40383
40471
|
if (error?.code === "ENOENT") {
|
|
40384
40472
|
return [];
|
|
@@ -40393,7 +40481,7 @@ async function readRecord(clientDir) {
|
|
|
40393
40481
|
}
|
|
40394
40482
|
async function listFiles(root, dir) {
|
|
40395
40483
|
const files = [];
|
|
40396
|
-
const entries = (await readdir(
|
|
40484
|
+
const entries = (await readdir(join6(root, dir), { withFileTypes: true })).sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
40397
40485
|
for (const entry of entries) {
|
|
40398
40486
|
const path3 = `${dir}/${entry.name}`;
|
|
40399
40487
|
if (entry.isDirectory()) {
|
|
@@ -40409,7 +40497,7 @@ function isCarriable(file) {
|
|
|
40409
40497
|
}
|
|
40410
40498
|
function inside(root, file) {
|
|
40411
40499
|
const path3 = resolve(root, file);
|
|
40412
|
-
const rel2 =
|
|
40500
|
+
const rel2 = relative3(root, path3);
|
|
40413
40501
|
return rel2 && !rel2.startsWith("..") && !isAbsolute(rel2) && rel2.split(sep2)[0] === ASSETS_DIR ? path3 : null;
|
|
40414
40502
|
}
|
|
40415
40503
|
async function isDirectory(path3) {
|
|
@@ -40438,7 +40526,7 @@ async function exists(path3) {
|
|
|
40438
40526
|
// vite/precompressAssets.ts
|
|
40439
40527
|
import { mkdir as mkdir3, readFile as readFile2, stat as stat2, writeFile as writeFile3 } from "fs/promises";
|
|
40440
40528
|
import { availableParallelism } from "os";
|
|
40441
|
-
import { dirname as dirname3, join as
|
|
40529
|
+
import { dirname as dirname3, join as join7 } from "path";
|
|
40442
40530
|
import { promisify } from "util";
|
|
40443
40531
|
import { brotliCompress, constants, gzip } from "zlib";
|
|
40444
40532
|
var STATIC_ASSETS_RECORD = ".vite/static-assets.json";
|
|
@@ -40493,7 +40581,7 @@ async function precompressAssets(clientDir, files, options = {}) {
|
|
|
40493
40581
|
if (!isPrecompressible(file)) {
|
|
40494
40582
|
return;
|
|
40495
40583
|
}
|
|
40496
|
-
const path3 =
|
|
40584
|
+
const path3 = join7(clientDir, file);
|
|
40497
40585
|
const size = await fileSize(path3);
|
|
40498
40586
|
if (size === null || size < minBytes) {
|
|
40499
40587
|
return;
|
|
@@ -40537,7 +40625,7 @@ async function precompressAssets(clientDir, files, options = {}) {
|
|
|
40537
40625
|
return { record, stats };
|
|
40538
40626
|
}
|
|
40539
40627
|
async function writeStaticAssetsRecord(clientDir, record) {
|
|
40540
|
-
const path3 =
|
|
40628
|
+
const path3 = join7(clientDir, STATIC_ASSETS_RECORD);
|
|
40541
40629
|
await mkdir3(dirname3(path3), { recursive: true });
|
|
40542
40630
|
const files = Object.fromEntries(Object.entries(record.files).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0));
|
|
40543
40631
|
await writeFile3(path3, `${JSON.stringify({ files }, null, 2)}
|
|
@@ -40563,45 +40651,6 @@ var {
|
|
|
40563
40651
|
// bin/check-models.ts
|
|
40564
40652
|
import { statSync as statSync2 } from "fs";
|
|
40565
40653
|
import { relative as relative4, resolve as resolve2 } from "path";
|
|
40566
|
-
|
|
40567
|
-
// support/discover.ts
|
|
40568
|
-
import { existsSync as existsSync3, readdirSync as readdirSync2 } from "fs";
|
|
40569
|
-
import { join as join6, relative as relative3 } from "path";
|
|
40570
|
-
function sourceFiles(dir, ignore = []) {
|
|
40571
|
-
const out = [];
|
|
40572
|
-
const ignored = (path3) => {
|
|
40573
|
-
const rel2 = relative3(dir, path3).split("\\").join("/");
|
|
40574
|
-
return ignore.some((pattern) => rel2 === pattern || rel2.startsWith(`${pattern}/`));
|
|
40575
|
-
};
|
|
40576
|
-
const walk3 = (current) => {
|
|
40577
|
-
for (const entry of readdirSync2(current, { withFileTypes: true }).sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0)) {
|
|
40578
|
-
const path3 = join6(current, entry.name);
|
|
40579
|
-
if (ignored(path3))
|
|
40580
|
-
continue;
|
|
40581
|
-
if (entry.isDirectory()) {
|
|
40582
|
-
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
40583
|
-
continue;
|
|
40584
|
-
if (existsSync3(join6(path3, "package.json")))
|
|
40585
|
-
continue;
|
|
40586
|
-
walk3(path3);
|
|
40587
|
-
continue;
|
|
40588
|
-
}
|
|
40589
|
-
if (!entry.name.endsWith(".ts") && !entry.name.endsWith(".tsx"))
|
|
40590
|
-
continue;
|
|
40591
|
-
if (entry.name.endsWith(".d.ts"))
|
|
40592
|
-
continue;
|
|
40593
|
-
if (/\.(test|test-d|spec|bench)\.tsx?$/.test(entry.name))
|
|
40594
|
-
continue;
|
|
40595
|
-
out.push(path3);
|
|
40596
|
-
}
|
|
40597
|
-
};
|
|
40598
|
-
if (!existsSync3(dir))
|
|
40599
|
-
return out;
|
|
40600
|
-
walk3(dir);
|
|
40601
|
-
return out;
|
|
40602
|
-
}
|
|
40603
|
-
|
|
40604
|
-
// bin/check-models.ts
|
|
40605
40654
|
function modelFiles(dir, ignore = []) {
|
|
40606
40655
|
return sourceFiles(dir, ignore);
|
|
40607
40656
|
}
|
|
@@ -40777,8 +40826,8 @@ function indent(message) {
|
|
|
40777
40826
|
|
|
40778
40827
|
// bin/ide/generateApiManifest.ts
|
|
40779
40828
|
var import_recast2 = __toESM(require_main2(), 1);
|
|
40780
|
-
import { join as
|
|
40781
|
-
import { existsSync as
|
|
40829
|
+
import { join as join8 } from "path";
|
|
40830
|
+
import { existsSync as existsSync5 } from "fs";
|
|
40782
40831
|
|
|
40783
40832
|
// utils/toCamelCase.ts
|
|
40784
40833
|
function toCamelCase(input) {
|
|
@@ -40829,7 +40878,7 @@ class ApiManifestGenerator {
|
|
|
40829
40878
|
rootRouterBody;
|
|
40830
40879
|
routerBodyCache = new Map;
|
|
40831
40880
|
controllerCache = new Map;
|
|
40832
|
-
manifestCacheDir =
|
|
40881
|
+
manifestCacheDir = join8(ROOT, ".gemi/cache/api-routes-manifest");
|
|
40833
40882
|
async writeManifest(cacheFilePath) {
|
|
40834
40883
|
const manifest = {};
|
|
40835
40884
|
for (const [routeName, method] of this.routes.entries()) {
|
|
@@ -40861,7 +40910,7 @@ class ApiManifestGenerator {
|
|
|
40861
40910
|
if (path4.startsWith("@/app")) {
|
|
40862
40911
|
return path4.replace("@", "") + ".ts";
|
|
40863
40912
|
}
|
|
40864
|
-
return
|
|
40913
|
+
return join8(parentPath, path4) + ".ts";
|
|
40865
40914
|
}
|
|
40866
40915
|
isFileShouldBeParsed(path4) {
|
|
40867
40916
|
return path4.includes("app/http/router") || path4.includes("app/http/controllers");
|
|
@@ -40909,7 +40958,7 @@ class ApiManifestGenerator {
|
|
|
40909
40958
|
if (normalizedPath.startsWith("/app/http/controllers")) {
|
|
40910
40959
|
for (const specifier of node.specifiers) {
|
|
40911
40960
|
const name = specifier.type === "ImportDefaultSpecifier" ? specifier.local.name : specifier.imported.name;
|
|
40912
|
-
await this.parseControllerFile(await this.parseFile(
|
|
40961
|
+
await this.parseControllerFile(await this.parseFile(join8(ROOT, normalizedPath)), name, normalizedPath);
|
|
40913
40962
|
}
|
|
40914
40963
|
}
|
|
40915
40964
|
if (normalizedPath.startsWith("/app/http/routes")) {
|
|
@@ -41013,7 +41062,7 @@ class ApiManifestGenerator {
|
|
|
41013
41062
|
}
|
|
41014
41063
|
async parse(cacheFilePath, filePath, isRoot = true, name = "") {
|
|
41015
41064
|
console.log({ ROOT, filePath });
|
|
41016
|
-
const file = await this.parseFile(
|
|
41065
|
+
const file = await this.parseFile(join8(ROOT, filePath));
|
|
41017
41066
|
for (const body of file.program.body) {
|
|
41018
41067
|
if (!this.isNodeShouldBeParsed(body))
|
|
41019
41068
|
continue;
|
|
@@ -41049,8 +41098,8 @@ class ApiManifestGenerator {
|
|
|
41049
41098
|
}
|
|
41050
41099
|
async run(filePath) {
|
|
41051
41100
|
const cacheId = generateGitDiffId();
|
|
41052
|
-
const cacheFilePath =
|
|
41053
|
-
if (
|
|
41101
|
+
const cacheFilePath = join8(this.manifestCacheDir, `${cacheId}.json`);
|
|
41102
|
+
if (existsSync5(cacheFilePath)) {
|
|
41054
41103
|
console.log(await Bun.file(cacheFilePath).text());
|
|
41055
41104
|
} else {
|
|
41056
41105
|
await this.parse(cacheFilePath, filePath, true);
|
|
@@ -41059,7 +41108,7 @@ class ApiManifestGenerator {
|
|
|
41059
41108
|
}
|
|
41060
41109
|
|
|
41061
41110
|
// bin/version.ts
|
|
41062
|
-
import { existsSync as
|
|
41111
|
+
import { existsSync as existsSync6, readFileSync as readFileSync3 } from "fs";
|
|
41063
41112
|
import path4 from "path";
|
|
41064
41113
|
var VERSION_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
41065
41114
|
function parseVersion(version) {
|
|
@@ -41117,7 +41166,7 @@ function findGemiPackageDir(rootDir) {
|
|
|
41117
41166
|
let dir = path4.resolve(rootDir);
|
|
41118
41167
|
while (true) {
|
|
41119
41168
|
const candidate = path4.join(dir, "node_modules", "gemi");
|
|
41120
|
-
if (
|
|
41169
|
+
if (existsSync6(path4.join(candidate, "package.json")))
|
|
41121
41170
|
return candidate;
|
|
41122
41171
|
const parent = path4.dirname(dir);
|
|
41123
41172
|
if (parent === dir)
|
|
@@ -41130,7 +41179,7 @@ function readInstalledVersion(rootDir) {
|
|
|
41130
41179
|
if (!packageDir)
|
|
41131
41180
|
return null;
|
|
41132
41181
|
try {
|
|
41133
|
-
const manifest = JSON.parse(
|
|
41182
|
+
const manifest = JSON.parse(readFileSync3(path4.join(packageDir, "package.json"), "utf8"));
|
|
41134
41183
|
return typeof manifest?.version === "string" ? manifest.version : null;
|
|
41135
41184
|
} catch {
|
|
41136
41185
|
return null;
|
|
@@ -41226,16 +41275,16 @@ function reportUpdate(options, log = console.log) {
|
|
|
41226
41275
|
}
|
|
41227
41276
|
|
|
41228
41277
|
// bin/upgrade.ts
|
|
41229
|
-
import { existsSync as
|
|
41278
|
+
import { existsSync as existsSync8, readFileSync as readFileSync5 } from "fs";
|
|
41230
41279
|
import path6 from "path";
|
|
41231
41280
|
|
|
41232
41281
|
// bin/install-skill.ts
|
|
41233
41282
|
import { createHash as createHash2 } from "crypto";
|
|
41234
41283
|
import {
|
|
41235
41284
|
cpSync,
|
|
41236
|
-
existsSync as
|
|
41285
|
+
existsSync as existsSync7,
|
|
41237
41286
|
mkdirSync as mkdirSync2,
|
|
41238
|
-
readFileSync as
|
|
41287
|
+
readFileSync as readFileSync4,
|
|
41239
41288
|
readdirSync as readdirSync3,
|
|
41240
41289
|
renameSync,
|
|
41241
41290
|
rmSync as rmSync2,
|
|
@@ -41253,7 +41302,7 @@ function lockPath(rootDir) {
|
|
|
41253
41302
|
return path5.join(rootDir, ".agents", ".skill-lock.json");
|
|
41254
41303
|
}
|
|
41255
41304
|
function isSkillInstalled(rootDir) {
|
|
41256
|
-
return
|
|
41305
|
+
return existsSync7(path5.join(skillTargetDir(rootDir), "SKILL.md"));
|
|
41257
41306
|
}
|
|
41258
41307
|
function hashDirectory(dir) {
|
|
41259
41308
|
const hash = createHash2("sha1");
|
|
@@ -41267,7 +41316,7 @@ function hashDirectory(dir) {
|
|
|
41267
41316
|
} else if (entry.isFile()) {
|
|
41268
41317
|
hash.update(relative5);
|
|
41269
41318
|
hash.update("\x00");
|
|
41270
|
-
hash.update(
|
|
41319
|
+
hash.update(readFileSync4(full));
|
|
41271
41320
|
hash.update("\x00");
|
|
41272
41321
|
}
|
|
41273
41322
|
}
|
|
@@ -41278,10 +41327,10 @@ function hashDirectory(dir) {
|
|
|
41278
41327
|
function readLock(rootDir) {
|
|
41279
41328
|
const empty = { version: 3, skills: {} };
|
|
41280
41329
|
const file = lockPath(rootDir);
|
|
41281
|
-
if (!
|
|
41330
|
+
if (!existsSync7(file))
|
|
41282
41331
|
return empty;
|
|
41283
41332
|
try {
|
|
41284
|
-
const parsed = JSON.parse(
|
|
41333
|
+
const parsed = JSON.parse(readFileSync4(file, "utf8"));
|
|
41285
41334
|
if (!parsed || typeof parsed !== "object")
|
|
41286
41335
|
return empty;
|
|
41287
41336
|
return {
|
|
@@ -41300,10 +41349,10 @@ function writeLock(rootDir, lock) {
|
|
|
41300
41349
|
}
|
|
41301
41350
|
function quarantineUnreadableLock(rootDir) {
|
|
41302
41351
|
const file = lockPath(rootDir);
|
|
41303
|
-
if (!
|
|
41352
|
+
if (!existsSync7(file))
|
|
41304
41353
|
return null;
|
|
41305
41354
|
try {
|
|
41306
|
-
const parsed = JSON.parse(
|
|
41355
|
+
const parsed = JSON.parse(readFileSync4(file, "utf8"));
|
|
41307
41356
|
if (parsed && typeof parsed === "object")
|
|
41308
41357
|
return null;
|
|
41309
41358
|
} catch {}
|
|
@@ -41337,14 +41386,14 @@ function install(options) {
|
|
|
41337
41386
|
return 1;
|
|
41338
41387
|
}
|
|
41339
41388
|
const source = skillSourceDir(packageDir);
|
|
41340
|
-
if (!
|
|
41389
|
+
if (!existsSync7(path5.join(source, "SKILL.md"))) {
|
|
41341
41390
|
error(`The installed gemi does not ship the \`${SKILL_NAME}\` skill (looked in ` + `${source}). It was added in a later release \u2014 run \`gemi upgrade\` first.`);
|
|
41342
41391
|
return 1;
|
|
41343
41392
|
}
|
|
41344
41393
|
const target = skillTargetDir(rootDir);
|
|
41345
41394
|
const lock = readLock(rootDir);
|
|
41346
41395
|
const recorded = lock.skills[SKILL_NAME];
|
|
41347
|
-
const existing =
|
|
41396
|
+
const existing = existsSync7(target) ? hashDirectory(target) : null;
|
|
41348
41397
|
if (existing !== null && !force) {
|
|
41349
41398
|
if (!recorded) {
|
|
41350
41399
|
error(`${path5.relative(rootDir, target) || target} already exists and was not ` + `installed by \`gemi install-skill\`. Re-run with --force to replace it.`);
|
|
@@ -41402,7 +41451,7 @@ function detectPackageManager(rootDir) {
|
|
|
41402
41451
|
let dir = path6.resolve(rootDir);
|
|
41403
41452
|
while (true) {
|
|
41404
41453
|
for (const [manager, files] of LOCKFILES) {
|
|
41405
|
-
if (files.some((file) =>
|
|
41454
|
+
if (files.some((file) => existsSync8(path6.join(dir, file))))
|
|
41406
41455
|
return manager;
|
|
41407
41456
|
}
|
|
41408
41457
|
const parent = path6.dirname(dir);
|
|
@@ -41413,10 +41462,10 @@ function detectPackageManager(rootDir) {
|
|
|
41413
41462
|
}
|
|
41414
41463
|
function dependencyKind(dir) {
|
|
41415
41464
|
const manifestPath = path6.join(dir, "package.json");
|
|
41416
|
-
if (!
|
|
41465
|
+
if (!existsSync8(manifestPath))
|
|
41417
41466
|
return null;
|
|
41418
41467
|
try {
|
|
41419
|
-
const manifest = JSON.parse(
|
|
41468
|
+
const manifest = JSON.parse(readFileSync5(manifestPath, "utf8"));
|
|
41420
41469
|
if (manifest?.dependencies?.gemi)
|
|
41421
41470
|
return "dependencies";
|
|
41422
41471
|
if (manifest?.devDependencies?.gemi)
|
|
@@ -41442,7 +41491,7 @@ function findDeclaringDir(rootDir) {
|
|
|
41442
41491
|
}
|
|
41443
41492
|
function isWorkspaceRoot(dir) {
|
|
41444
41493
|
try {
|
|
41445
|
-
const manifest = JSON.parse(
|
|
41494
|
+
const manifest = JSON.parse(readFileSync5(path6.join(dir, "package.json"), "utf8"));
|
|
41446
41495
|
return manifest?.workspaces !== undefined;
|
|
41447
41496
|
} catch {
|
|
41448
41497
|
return false;
|
|
@@ -41574,12 +41623,12 @@ function exitCodeOf(proc) {
|
|
|
41574
41623
|
|
|
41575
41624
|
// stats/run.ts
|
|
41576
41625
|
import path7 from "path";
|
|
41577
|
-
import { existsSync as
|
|
41626
|
+
import { existsSync as existsSync10, mkdtempSync, readFileSync as readFileSync7, rmSync as rmSync3, writeFileSync as writeFileSync3 } from "fs";
|
|
41578
41627
|
import { tmpdir } from "os";
|
|
41579
41628
|
|
|
41580
41629
|
// stats/bundleStats.ts
|
|
41581
|
-
import { existsSync as
|
|
41582
|
-
import { join as
|
|
41630
|
+
import { existsSync as existsSync9, readFileSync as readFileSync6, statSync as statSync3 } from "fs";
|
|
41631
|
+
import { join as join9 } from "path";
|
|
41583
41632
|
import { brotliCompressSync, constants as constants3, gzipSync } from "zlib";
|
|
41584
41633
|
|
|
41585
41634
|
// internal/staticNavigationRuntime.ts
|
|
@@ -41606,7 +41655,7 @@ function routeKey(entry) {
|
|
|
41606
41655
|
}
|
|
41607
41656
|
function bundleStats(options) {
|
|
41608
41657
|
const { clientDir } = options;
|
|
41609
|
-
const manifest = options.manifest ?? JSON.parse(
|
|
41658
|
+
const manifest = options.manifest ?? JSON.parse(readFileSync6(join9(clientDir, ".vite/manifest.json"), "utf8"));
|
|
41610
41659
|
const sizes = new Map;
|
|
41611
41660
|
const size = (file) => {
|
|
41612
41661
|
let known = sizes.get(file);
|
|
@@ -41735,10 +41784,10 @@ function isJs(file) {
|
|
|
41735
41784
|
return /\.m?js$/.test(file);
|
|
41736
41785
|
}
|
|
41737
41786
|
function measure(clientDir, file) {
|
|
41738
|
-
const path7 =
|
|
41739
|
-
const sibling = (ext) =>
|
|
41787
|
+
const path7 = join9(clientDir, file);
|
|
41788
|
+
const sibling = (ext) => existsSync9(path7 + ext) ? statSync3(path7 + ext).size : null;
|
|
41740
41789
|
let buffer;
|
|
41741
|
-
const read = () => buffer ??=
|
|
41790
|
+
const read = () => buffer ??= readFileSync6(path7);
|
|
41742
41791
|
return {
|
|
41743
41792
|
raw: statSync3(path7).size,
|
|
41744
41793
|
gzip: sibling(".gz") ?? gzipSync(read(), { level: 9 }).length,
|
|
@@ -41855,7 +41904,7 @@ async function runStats(options) {
|
|
|
41855
41904
|
const log = options.log ?? console.log;
|
|
41856
41905
|
const error = options.error ?? console.error;
|
|
41857
41906
|
const clientDir = path7.join(options.rootDir, "dist", "client");
|
|
41858
|
-
if (!
|
|
41907
|
+
if (!existsSync10(path7.join(clientDir, ".vite/manifest.json"))) {
|
|
41859
41908
|
error(`No client build in ${clientDir}. Run \`gemi build\` first.`);
|
|
41860
41909
|
return 1;
|
|
41861
41910
|
}
|
|
@@ -41876,7 +41925,7 @@ ${table.message}`);
|
|
|
41876
41925
|
`);
|
|
41877
41926
|
}
|
|
41878
41927
|
if (options.markdown) {
|
|
41879
|
-
const base = options.base &&
|
|
41928
|
+
const base = options.base && existsSync10(options.base) ? JSON.parse(readFileSync7(options.base, "utf8")) : null;
|
|
41880
41929
|
writeFileSync3(options.markdown, `${markdownReport(stats, base, budgets)}
|
|
41881
41930
|
`);
|
|
41882
41931
|
}
|
|
@@ -41921,13 +41970,13 @@ async function loadRouteTable(rootDir, preloadArgs, options = {}) {
|
|
|
41921
41970
|
if (timedOut) {
|
|
41922
41971
|
return { ok: false, message: `reading the route table took over ${timeoutMs / 1000}s.` };
|
|
41923
41972
|
}
|
|
41924
|
-
if (code !== 0 || !
|
|
41973
|
+
if (code !== 0 || !existsSync10(out)) {
|
|
41925
41974
|
return {
|
|
41926
41975
|
ok: false,
|
|
41927
41976
|
message: stderr.trim() || `the route table process exited with ${code}.`
|
|
41928
41977
|
};
|
|
41929
41978
|
}
|
|
41930
|
-
return { ok: true, routes: JSON.parse(
|
|
41979
|
+
return { ok: true, routes: JSON.parse(readFileSync7(out, "utf8")) };
|
|
41931
41980
|
} finally {
|
|
41932
41981
|
rmSync3(dir, { recursive: true, force: true });
|
|
41933
41982
|
}
|
|
@@ -41936,7 +41985,7 @@ async function loadRouteTable(rootDir, preloadArgs, options = {}) {
|
|
|
41936
41985
|
// bin/gemi.ts
|
|
41937
41986
|
function appPreloadArgs(appDir) {
|
|
41938
41987
|
const preloadPath = path10.join(appDir, "preload.ts");
|
|
41939
|
-
return
|
|
41988
|
+
return existsSync11(preloadPath) ? ["--preload", preloadPath] : [];
|
|
41940
41989
|
}
|
|
41941
41990
|
program.command("dev").action(async () => {
|
|
41942
41991
|
console.log("Starting dev server...");
|
|
@@ -42057,6 +42106,11 @@ withStatsOptions(program.command("build").option("--stats", "After building, pri
|
|
|
42057
42106
|
console.error(message);
|
|
42058
42107
|
process.exit(1);
|
|
42059
42108
|
}
|
|
42109
|
+
const documentScripts = await bundleDocumentScripts(appDir);
|
|
42110
|
+
await Bun.write(path10.join(rootDir, "dist", "server", DOCUMENT_SCRIPTS_MANIFEST), JSON.stringify(documentScripts));
|
|
42111
|
+
if (Object.keys(documentScripts).length > 0) {
|
|
42112
|
+
console.log(`Bundled ${Object.keys(documentScripts).length} document script(s).`);
|
|
42113
|
+
}
|
|
42060
42114
|
if (options.stats || options.json || options.markdown) {
|
|
42061
42115
|
console.log("");
|
|
42062
42116
|
process.exit(await printStats(rootDir, options));
|
|
@@ -42194,5 +42248,5 @@ program.command("app:route-manifest").action(async () => {
|
|
|
42194
42248
|
});
|
|
42195
42249
|
program.parse();
|
|
42196
42250
|
|
|
42197
|
-
//# debugId=
|
|
42251
|
+
//# debugId=217A9B3D9A15D57264756E2164756E21
|
|
42198
42252
|
//# sourceMappingURL=gemi.js.map
|