@caspian2026/agent-sdk 0.0.9 → 0.0.11
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/{chunk-jgvmjwnx.js → chunk-0ac6r0fw.js} +14 -14
- package/dist/{chunk-9957ffjc.js → chunk-0dm971mw.js} +2 -2
- package/dist/{chunk-0txtpamh.js → chunk-0f5anjkb.js} +6 -6
- package/dist/{chunk-c5zkrd7r.js → chunk-0k9sft0s.js} +15 -15
- package/dist/{chunk-04h360ha.js → chunk-0kgwksm1.js} +5 -5
- package/dist/{chunk-hg6fwhj1.js → chunk-1etzkkxs.js} +1 -1
- package/dist/{chunk-4myad919.js → chunk-1gz2wrhq.js} +14 -14
- package/dist/{chunk-ty1cyqr7.js → chunk-1pr4hr5x.js} +17 -17
- package/dist/{chunk-44t1xk05.js → chunk-1vhjn1j9.js} +14 -14
- package/dist/{chunk-1hqb50ne.js → chunk-1wr6ag3j.js} +2 -2
- package/dist/{chunk-vbtm9g57.js → chunk-24t2wjab.js} +1 -1
- package/dist/{chunk-vk3nb2xe.js → chunk-2589k4k0.js} +15 -15
- package/dist/{chunk-hqjdgc6c.js → chunk-28k13wc7.js} +2 -2
- package/dist/{chunk-hparkfvt.js → chunk-2cr43hzw.js} +22 -22
- package/dist/{chunk-2nrarbza.js → chunk-2sqhjnpn.js} +14 -14
- package/dist/{chunk-9z9teq7p.js → chunk-2tfe2zs1.js} +15 -15
- package/dist/{chunk-5tw3gj5z.js → chunk-2z9rak9s.js} +14 -14
- package/dist/{chunk-1gaw18rz.js → chunk-31bwdrm5.js} +15 -15
- package/dist/{chunk-x3jthbjq.js → chunk-38rkx4cj.js} +15 -15
- package/dist/{chunk-jjz3hs34.js → chunk-394djs3v.js} +23 -23
- package/dist/{chunk-thmtkfgj.js → chunk-3we6j8b4.js} +3 -3
- package/dist/{chunk-22mfb6bp.js → chunk-400r5gmq.js} +4 -4
- package/dist/{chunk-kxrrtr3p.js → chunk-4057dtxd.js} +1 -1
- package/dist/{chunk-dt3epnwj.js → chunk-41en0cc6.js} +4 -4
- package/dist/{chunk-rx4mcfg1.js → chunk-488spx13.js} +23 -23
- package/dist/{chunk-ttyfhx12.js → chunk-49bs7x5p.js} +68 -35
- package/dist/{chunk-b547q41s.js → chunk-4d0g9n3q.js} +15 -15
- package/dist/{chunk-thenr6b3.js → chunk-4fh25m1z.js} +6 -6
- package/dist/{chunk-y5wfy524.js → chunk-4hgxxzdw.js} +17 -17
- package/dist/{chunk-sh2v9ywv.js → chunk-4pj88fnc.js} +2 -2
- package/dist/{chunk-t1pygy19.js → chunk-4re879ja.js} +15 -15
- package/dist/{chunk-vw5jzpcm.js → chunk-50art2hr.js} +3 -3
- package/dist/{chunk-frwznxnf.js → chunk-5pqq0nym.js} +1 -1
- package/dist/{chunk-b6prbsae.js → chunk-6696fngv.js} +1 -1
- package/dist/{chunk-b89ese8r.js → chunk-66dk94r4.js} +14 -14
- package/dist/{chunk-hzbr9543.js → chunk-67808qek.js} +3 -3
- package/dist/{chunk-xcrzgyce.js → chunk-69841w77.js} +14 -14
- package/dist/{chunk-ay5fvc2r.js → chunk-6ebvysef.js} +15 -15
- package/dist/{chunk-tpk67mjc.js → chunk-6zsxtysq.js} +2 -2
- package/dist/{chunk-54wn2jdr.js → chunk-75qqeec8.js} +2 -2
- package/dist/{chunk-ecvy1ng2.js → chunk-765zdaq8.js} +16 -16
- package/dist/{chunk-jwwpfq76.js → chunk-7ce8wn1f.js} +16 -16
- package/dist/{chunk-zcgprbyy.js → chunk-7p2vw8qe.js} +11 -11
- package/dist/{chunk-t1s91wrk.js → chunk-7t5ymv2m.js} +1 -1
- package/dist/{chunk-3pzwd6qq.js → chunk-7tphrzjj.js} +1 -1
- package/dist/{chunk-hgmhngje.js → chunk-8c907cv9.js} +1 -1
- package/dist/{chunk-d8z7pyrb.js → chunk-8dzg4nr5.js} +15 -15
- package/dist/{chunk-qkp4ygnk.js → chunk-8hn2xqjz.js} +2 -2
- package/dist/{chunk-1kmwf4vn.js → chunk-8kmna3cc.js} +3 -3
- package/dist/{chunk-p9ny0p2a.js → chunk-8r5eevap.js} +8 -8
- package/dist/{chunk-1vp22nex.js → chunk-8vkv63c5.js} +1 -1
- package/dist/{chunk-1486qzk5.js → chunk-8w21adpe.js} +3 -3
- package/dist/{chunk-vajsk9ya.js → chunk-8w8d1k7b.js} +3 -3
- package/dist/{chunk-r6nnp8mj.js → chunk-90bqyqfd.js} +14 -14
- package/dist/{chunk-3e4r5pmc.js → chunk-942yq6xx.js} +1 -1
- package/dist/{chunk-35z2vxep.js → chunk-99ck62v1.js} +17 -17
- package/dist/{chunk-9w114071.js → chunk-9g29z3dv.js} +1 -1
- package/dist/{chunk-hg45r671.js → chunk-9nj016rn.js} +1 -1
- package/dist/{chunk-6cfcqjty.js → chunk-9nk34wee.js} +17 -17
- package/dist/{chunk-xhn4ptjn.js → chunk-9z45660r.js} +19 -19
- package/dist/{chunk-njw0haha.js → chunk-a3gq2vv4.js} +4 -4
- package/dist/{chunk-tf859h88.js → chunk-akqsq8bn.js} +2 -2
- package/dist/{chunk-rmpaj37q.js → chunk-aqq5qh2y.js} +15 -15
- package/dist/{chunk-ghwvqhx9.js → chunk-awdftfcf.js} +15 -15
- package/dist/{chunk-2y8x7xt7.js → chunk-b3nkagky.js} +2 -2
- package/dist/{chunk-vtmxgm1m.js → chunk-b8f5dz5b.js} +2 -2
- package/dist/{chunk-rygxwjtc.js → chunk-bayvqjm6.js} +15 -15
- package/dist/{chunk-1hqvvvrt.js → chunk-bgyb0z0p.js} +23 -23
- package/dist/{chunk-t3gmfcy7.js → chunk-bhabqhx1.js} +14 -14
- package/dist/{chunk-c6hsz5ey.js → chunk-bj85dnsy.js} +3 -3
- package/dist/{chunk-g597bz1j.js → chunk-bp4s0gry.js} +15 -15
- package/dist/{chunk-x2bnzvd6.js → chunk-brng9f4q.js} +14 -14
- package/dist/{chunk-3fn3ysvs.js → chunk-bvdzmdw4.js} +15 -15
- package/dist/{chunk-w3782jck.js → chunk-ca72efeb.js} +15 -15
- package/dist/{chunk-67wms97m.js → chunk-cdact4jj.js} +2 -2
- package/dist/{chunk-zqbnw3n2.js → chunk-cfyvkbe5.js} +20 -20
- package/dist/{chunk-zyjkg76f.js → chunk-cjca0q27.js} +3 -3
- package/dist/{chunk-wtpgjmjd.js → chunk-cs9aqzag.js} +15 -15
- package/dist/{chunk-7hrmxpha.js → chunk-cttezxcb.js} +18 -8
- package/dist/{chunk-w6mcmmt5.js → chunk-d2g976qe.js} +3 -3
- package/dist/{chunk-zxywawr7.js → chunk-d7ws01qk.js} +1 -1
- package/dist/{chunk-f4tdn7yr.js → chunk-dsqfe05n.js} +14 -14
- package/dist/{chunk-dz6zxh89.js → chunk-e82vbky2.js} +14 -14
- package/dist/{chunk-jtgyzqbq.js → chunk-eba0b85f.js} +1 -1
- package/dist/{chunk-5zcygjb2.js → chunk-eqnfk1g0.js} +14 -14
- package/dist/{chunk-trvc6jh7.js → chunk-erj5nc8b.js} +17 -17
- package/dist/{chunk-xtdm6ejq.js → chunk-eseq7djh.js} +1 -1
- package/dist/{chunk-7skyagc2.js → chunk-esrkw9v4.js} +2 -2
- package/dist/{chunk-hae34yd0.js → chunk-ewbvcf88.js} +3 -3
- package/dist/{chunk-q8hxwh48.js → chunk-ewhxddsa.js} +1 -1
- package/dist/{chunk-1nvcmzj1.js → chunk-ey1pg5v8.js} +25 -25
- package/dist/{chunk-v5g8nf5h.js → chunk-f1v8h236.js} +4 -4
- package/dist/{chunk-dexkgxt4.js → chunk-f70fwxds.js} +2 -2
- package/dist/{chunk-j0gke393.js → chunk-f73trmvk.js} +14 -14
- package/dist/{chunk-y32em34x.js → chunk-fcww10dt.js} +4 -4
- package/dist/{chunk-h4xfadhf.js → chunk-fhprmgf4.js} +1 -1
- package/dist/{chunk-xw99fqv1.js → chunk-fnf4av18.js} +3 -3
- package/dist/{chunk-frm7mphm.js → chunk-fy543pwf.js} +2 -2
- package/dist/{chunk-wa0xgm6m.js → chunk-fybanr7d.js} +2 -2
- package/dist/{chunk-2vbash3m.js → chunk-g5epkvz2.js} +1 -1
- package/dist/{chunk-ratnrv9v.js → chunk-g8183rkv.js} +2 -2
- package/dist/{chunk-ecbh4n6q.js → chunk-gbztsm42.js} +14 -14
- package/dist/{chunk-szzff973.js → chunk-ge57c9hg.js} +3 -3
- package/dist/{chunk-93vwm44t.js → chunk-ggq2y3tn.js} +91 -91
- package/dist/{chunk-42a0nyrq.js → chunk-gpzkzg7v.js} +15 -15
- package/dist/{chunk-dngfdsm9.js → chunk-gw1a82j8.js} +66 -66
- package/dist/{chunk-tj7v47cp.js → chunk-gw1g065z.js} +1 -1
- package/dist/{chunk-gzj94jgg.js → chunk-h4dnamt5.js} +14 -14
- package/dist/{chunk-xvk90wpt.js → chunk-h5mkzk0z.js} +1 -1
- package/dist/{chunk-5m3m7hr5.js → chunk-h7dm24cc.js} +4 -4
- package/dist/{chunk-wkt2q02c.js → chunk-hadww3nd.js} +1 -1
- package/dist/{chunk-fesvrjhd.js → chunk-hapvn84d.js} +3 -3
- package/dist/{chunk-wm1zm5xj.js → chunk-hekf5s9q.js} +2 -2
- package/dist/{chunk-0gpem3pk.js → chunk-hkgb5y9f.js} +14 -14
- package/dist/{chunk-azv68vk1.js → chunk-hzceftr4.js} +1 -1
- package/dist/{chunk-9wf3fc4t.js → chunk-j2x6fp25.js} +2 -2
- package/dist/{chunk-ssb4wba6.js → chunk-j30g8fd1.js} +3 -3
- package/dist/{chunk-jxp2j9t5.js → chunk-j3awswy3.js} +14 -14
- package/dist/{chunk-bjdknxqn.js → chunk-j513wqe9.js} +14 -14
- package/dist/{chunk-wg47eg7y.js → chunk-jkens34n.js} +14 -14
- package/dist/{chunk-ef2m4xyz.js → chunk-jperb6n2.js} +14 -14
- package/dist/{chunk-etbb3dss.js → chunk-jqmr6ag1.js} +17 -17
- package/dist/{chunk-xs7zsmzk.js → chunk-jx6k8msx.js} +14 -14
- package/dist/{chunk-t9eeyrkn.js → chunk-jyz65rfv.js} +15 -15
- package/dist/{chunk-sjpqw47t.js → chunk-k5mckm5f.js} +1 -1
- package/dist/{chunk-bf03a1w7.js → chunk-k9z36r5q.js} +16 -16
- package/dist/{chunk-ec6ga5ey.js → chunk-kamesdff.js} +19 -19
- package/dist/{chunk-wgd4n1q7.js → chunk-kj4m0j4n.js} +1 -1
- package/dist/{chunk-rpsqtvkx.js → chunk-m25yfqc3.js} +14 -14
- package/dist/{chunk-7cdy4aj6.js → chunk-mgpj5f7h.js} +65 -65
- package/dist/{chunk-ayx9aq2k.js → chunk-mmn62bh2.js} +15 -15
- package/dist/{chunk-rz94yg8c.js → chunk-mq94v5vn.js} +1 -1
- package/dist/{chunk-mewywsar.js → chunk-msvv7dpt.js} +14 -14
- package/dist/{chunk-r3ehjkj5.js → chunk-mtv83pq4.js} +25 -25
- package/dist/{chunk-h61d4awv.js → chunk-n36xjgtj.js} +16 -16
- package/dist/{chunk-q4f1g9y6.js → chunk-n9d0gg9z.js} +9 -9
- package/dist/{chunk-ckh4f9ry.js → chunk-na63s9wn.js} +3 -3
- package/dist/{chunk-v6hbqcmr.js → chunk-nebntwvd.js} +11 -11
- package/dist/{chunk-dj7d67ya.js → chunk-nj02kck4.js} +1 -1
- package/dist/{chunk-pddf0719.js → chunk-nv7vcqme.js} +17 -17
- package/dist/{chunk-vmp5rk8q.js → chunk-pbeee2kp.js} +2 -2
- package/dist/{chunk-q14wrksq.js → chunk-pcbm66ch.js} +16 -16
- package/dist/{chunk-72qa16xm.js → chunk-pe3n0w2t.js} +16 -16
- package/dist/{chunk-f4v7t54y.js → chunk-peh3mj19.js} +1 -1
- package/dist/{chunk-65q3hqkw.js → chunk-pepgckn4.js} +3 -3
- package/dist/{chunk-cay13mxk.js → chunk-pm67yj46.js} +3 -3
- package/dist/{chunk-35nft36d.js → chunk-pp8nrx40.js} +83 -83
- package/dist/{chunk-rfbbcx5s.js → chunk-pq5290db.js} +14 -14
- package/dist/{chunk-gkn3jgqn.js → chunk-pzp8fj0a.js} +25 -25
- package/dist/{chunk-2m32xn94.js → chunk-q1j8ebyf.js} +3 -3
- package/dist/{chunk-jj4zs4gr.js → chunk-q2fn2p7y.js} +14 -14
- package/dist/{chunk-4vtvwg7e.js → chunk-q347821k.js} +22 -22
- package/dist/{chunk-be77bcs8.js → chunk-qb88vpgy.js} +14 -14
- package/dist/{chunk-grqkx44z.js → chunk-qehbwde1.js} +15 -15
- package/dist/{chunk-qqs58ywv.js → chunk-qmmxwh8x.js} +2 -2
- package/dist/{chunk-jksf0ax9.js → chunk-qxmm3jbn.js} +14 -14
- package/dist/{chunk-ey0n4emm.js → chunk-qywk2c7m.js} +14 -14
- package/dist/{chunk-1efrnkxx.js → chunk-r0dpeqg0.js} +6 -6
- package/dist/{chunk-xffb3dsw.js → chunk-r0m970pk.js} +1 -1
- package/dist/{chunk-v4wba09w.js → chunk-r5bf0h0t.js} +14 -14
- package/dist/{chunk-1yfc1d48.js → chunk-r7xpsch7.js} +14 -14
- package/dist/{chunk-vyz3v0qx.js → chunk-rkvwts6v.js} +2 -2
- package/dist/{chunk-w3gnkyfc.js → chunk-rm4c8zd9.js} +16 -16
- package/dist/{chunk-qctsv1d7.js → chunk-rm9gb396.js} +1 -1
- package/dist/{chunk-s19b0bc7.js → chunk-s213xmp8.js} +14 -14
- package/dist/{chunk-rnxpvm3m.js → chunk-s3s0611n.js} +1 -1
- package/dist/{chunk-qxjhw1dt.js → chunk-scrk9jbt.js} +9 -9
- package/dist/{chunk-vmbht6ec.js → chunk-tgmettzd.js} +3 -3
- package/dist/{chunk-9byfzaeq.js → chunk-tj6hejny.js} +14 -14
- package/dist/{chunk-djfq8ws0.js → chunk-tn0xnp8a.js} +25 -25
- package/dist/{chunk-k8jpbz31.js → chunk-tpn6rh31.js} +4 -4
- package/dist/{chunk-rhvn1rqs.js → chunk-tq4vws6e.js} +2 -2
- package/dist/{chunk-ecv9kbtk.js → chunk-tzzzbb9d.js} +3 -3
- package/dist/{chunk-jwpp2bq2.js → chunk-v6fcbmqz.js} +51 -51
- package/dist/{chunk-mmhkcj7c.js → chunk-vc59jf3q.js} +22 -22
- package/dist/{chunk-jqfrz5g9.js → chunk-vdk9b74d.js} +5 -5
- package/dist/{chunk-g78fetxa.js → chunk-vf9c1649.js} +14 -14
- package/dist/{chunk-1nhnn2rg.js → chunk-vgk0nymz.js} +2 -2
- package/dist/{chunk-e7ag583m.js → chunk-vgzpbh28.js} +15 -15
- package/dist/{chunk-txgbs4hp.js → chunk-vhxrn87v.js} +16 -16
- package/dist/{chunk-7cje7scj.js → chunk-vnzgpyrz.js} +1 -1
- package/dist/{chunk-v0tgjdx0.js → chunk-vqh6cjfx.js} +2 -2
- package/dist/{chunk-r5nd93kc.js → chunk-vz3pa5n6.js} +1 -1
- package/dist/{chunk-3npsy4c4.js → chunk-w1h5z2sy.js} +14 -14
- package/dist/{chunk-msxggy37.js → chunk-w2vvxj1f.js} +4 -4
- package/dist/{chunk-2yxqz99n.js → chunk-w5zezk61.js} +1 -1
- package/dist/{chunk-5mrc0ps5.js → chunk-wahqac7c.js} +8 -8
- package/dist/{chunk-84cdy41j.js → chunk-wc0np2zw.js} +3 -3
- package/dist/{chunk-xgbd6ec5.js → chunk-wcpmtszh.js} +15 -15
- package/dist/{chunk-ev7h351p.js → chunk-wdzjtdye.js} +2 -2
- package/dist/{chunk-6hs0cptm.js → chunk-wmbpjx7v.js} +20 -20
- package/dist/{chunk-m70n19dz.js → chunk-wrsy4y58.js} +16 -16
- package/dist/{chunk-hb1gr101.js → chunk-wskkym13.js} +2 -2
- package/dist/{chunk-r7684mmh.js → chunk-wt6v1zbe.js} +1 -1
- package/dist/{chunk-hrhp26d7.js → chunk-wyj3wpjv.js} +22 -22
- package/dist/{chunk-pfarypfq.js → chunk-xdg2rpj3.js} +16 -16
- package/dist/{chunk-grqhgr2b.js → chunk-xemw9d52.js} +3 -3
- package/dist/{chunk-04pw5akr.js → chunk-xmdny0m1.js} +5 -5
- package/dist/{chunk-8jy18nx9.js → chunk-xv5a2xbe.js} +1 -1
- package/dist/{chunk-p791ydbm.js → chunk-xx709m24.js} +1 -1
- package/dist/{chunk-cr1dv2js.js → chunk-y024419t.js} +14 -14
- package/dist/{chunk-wxkrq9eb.js → chunk-y1ps26mz.js} +14 -14
- package/dist/{chunk-0v89r445.js → chunk-y2r5e6kv.js} +2 -2
- package/dist/{chunk-rn1s097c.js → chunk-y41svpxw.js} +14 -14
- package/dist/{chunk-1hx5g6qy.js → chunk-ygwcq4vd.js} +3 -3
- package/dist/{chunk-ya9dxex0.js → chunk-ykv414dd.js} +16 -16
- package/dist/{chunk-h3vyya5n.js → chunk-ynkzfhs1.js} +8 -8
- package/dist/{chunk-rjq5nf1c.js → chunk-yrqx3p9k.js} +2 -2
- package/dist/{chunk-8ckwc9k8.js → chunk-ys17e80d.js} +14 -14
- package/dist/{chunk-c4d52460.js → chunk-zbb7qd0v.js} +2 -2
- package/dist/{chunk-ftsdm7y7.js → chunk-zjxv5g2n.js} +22 -22
- package/dist/{chunk-j99ms5ep.js → chunk-zmwgp2sh.js} +1 -1
- package/dist/cli.js +5 -5
- package/dist/gateway/index.js +131 -27
- package/dist/gateway/worker.js +558 -112
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -33,7 +33,7 @@ async function main() {
|
|
|
33
33
|
if (false) {}
|
|
34
34
|
if (process.argv[2] === "--claude-in-chrome-mcp") {
|
|
35
35
|
profileCheckpoint("cli_claude_in_chrome_mcp_path");
|
|
36
|
-
const { runClaudeInChromeMcpServer } = await import("./chunk-
|
|
36
|
+
const { runClaudeInChromeMcpServer } = await import("./chunk-6ebvysef.js");
|
|
37
37
|
await runClaudeInChromeMcpServer();
|
|
38
38
|
return;
|
|
39
39
|
} else if (process.argv[2] === "--chrome-native-host") {
|
|
@@ -43,7 +43,7 @@ async function main() {
|
|
|
43
43
|
return;
|
|
44
44
|
} else if (process.argv[2] === "--computer-use-mcp") {
|
|
45
45
|
profileCheckpoint("cli_computer_use_mcp_path");
|
|
46
|
-
const { runComputerUseMcpServer } = await import("./chunk-
|
|
46
|
+
const { runComputerUseMcpServer } = await import("./chunk-vdk9b74d.js");
|
|
47
47
|
await runComputerUseMcpServer();
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
@@ -62,11 +62,11 @@ async function main() {
|
|
|
62
62
|
const hasTmuxFlag = args.includes("--tmux") || args.includes("--tmux=classic");
|
|
63
63
|
if (hasTmuxFlag && (args.includes("-w") || args.includes("--worktree") || args.some((a) => a.startsWith("--worktree=")))) {
|
|
64
64
|
profileCheckpoint("cli_tmux_worktree_fast_path");
|
|
65
|
-
const { enableConfigs } = await import("./chunk-
|
|
65
|
+
const { enableConfigs } = await import("./chunk-yrqx3p9k.js");
|
|
66
66
|
enableConfigs();
|
|
67
67
|
const { isWorktreeModeEnabled } = await import("./chunk-pwwa7s62.js");
|
|
68
68
|
if (isWorktreeModeEnabled()) {
|
|
69
|
-
const { execIntoTmuxWorktree } = await import("./chunk-
|
|
69
|
+
const { execIntoTmuxWorktree } = await import("./chunk-hkgb5y9f.js");
|
|
70
70
|
const result = await execIntoTmuxWorktree(args);
|
|
71
71
|
if (result.handled) {
|
|
72
72
|
return;
|
|
@@ -83,7 +83,7 @@ async function main() {
|
|
|
83
83
|
const { startCapturingEarlyInput } = await import("./chunk-etdt1xz3.js");
|
|
84
84
|
startCapturingEarlyInput();
|
|
85
85
|
profileCheckpoint("cli_before_main_import");
|
|
86
|
-
const { main: cliMain } = await import("./chunk-
|
|
86
|
+
const { main: cliMain } = await import("./chunk-pp8nrx40.js");
|
|
87
87
|
profileCheckpoint("cli_after_main_import");
|
|
88
88
|
await cliMain();
|
|
89
89
|
profileCheckpoint("cli_after_main_complete");
|
package/dist/gateway/index.js
CHANGED
|
@@ -22,7 +22,6 @@ function parseJsonRpc(line) {
|
|
|
22
22
|
|
|
23
23
|
// src/entrypoints/gateway/sessionRouter.ts
|
|
24
24
|
import { Worker } from "node:worker_threads";
|
|
25
|
-
import { createHash } from "node:crypto";
|
|
26
25
|
var DEFAULT_MAX_SESSIONS = 16;
|
|
27
26
|
var DEFAULT_IDLE_TTL_MS = 10 * 60 * 1000;
|
|
28
27
|
var IDLE_CHECK_INTERVAL_MS = 60 * 1000;
|
|
@@ -35,6 +34,8 @@ class SessionRouter {
|
|
|
35
34
|
onWorkerMessage;
|
|
36
35
|
onWorkerExit;
|
|
37
36
|
idleTimer = null;
|
|
37
|
+
pendingReady = new Map;
|
|
38
|
+
pendingUpdate = new Map;
|
|
38
39
|
constructor(options) {
|
|
39
40
|
this.workerPath = options.workerPath;
|
|
40
41
|
this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;
|
|
@@ -47,12 +48,17 @@ class SessionRouter {
|
|
|
47
48
|
}
|
|
48
49
|
async create(sessionKey, config) {
|
|
49
50
|
if (this.sessions.has(sessionKey)) {
|
|
50
|
-
|
|
51
|
+
process.stderr.write(`[SessionRouter] Session already exists, destroying old: ${sessionKey}
|
|
52
|
+
`);
|
|
53
|
+
await this.destroy(sessionKey);
|
|
51
54
|
}
|
|
52
55
|
if (this.sessions.size >= this.maxSessions) {
|
|
56
|
+
process.stderr.write(`[SessionRouter] Max sessions reached, evicting LRU session
|
|
57
|
+
`);
|
|
53
58
|
this.evictLRU();
|
|
54
59
|
}
|
|
55
|
-
|
|
60
|
+
process.stderr.write(`[SessionRouter] Creating worker for session: ${sessionKey}
|
|
61
|
+
`);
|
|
56
62
|
const worker = new Worker(this.workerPath, {
|
|
57
63
|
workerData: config
|
|
58
64
|
});
|
|
@@ -60,26 +66,42 @@ class SessionRouter {
|
|
|
60
66
|
sessionKey,
|
|
61
67
|
worker,
|
|
62
68
|
sessionId: null,
|
|
63
|
-
configHash,
|
|
64
69
|
lastActive: new Date,
|
|
65
|
-
created: new Date
|
|
70
|
+
created: new Date,
|
|
71
|
+
destroyed: false
|
|
66
72
|
};
|
|
67
73
|
worker.on("message", (msg) => {
|
|
68
74
|
if (msg.type === "ready") {
|
|
69
75
|
entry.sessionId = msg.session_id;
|
|
76
|
+
this.pendingReady.get(sessionKey)?.resolve();
|
|
77
|
+
this.pendingReady.delete(sessionKey);
|
|
78
|
+
}
|
|
79
|
+
if (msg.type === "updated") {
|
|
80
|
+
this.pendingUpdate.get(sessionKey)?.resolve();
|
|
81
|
+
this.pendingUpdate.delete(sessionKey);
|
|
70
82
|
}
|
|
71
83
|
entry.lastActive = new Date;
|
|
72
84
|
this.onWorkerMessage(sessionKey, msg);
|
|
73
85
|
});
|
|
74
86
|
worker.on("exit", (code) => {
|
|
75
87
|
this.sessions.delete(sessionKey);
|
|
76
|
-
|
|
88
|
+
if (!entry.destroyed) {
|
|
89
|
+
process.stderr.write(`[SessionRouter] Worker exited unexpectedly for session: ${sessionKey}, code: ${code}
|
|
90
|
+
`);
|
|
91
|
+
this.onWorkerExit(sessionKey, code);
|
|
92
|
+
} else {
|
|
93
|
+
process.stderr.write(`[SessionRouter] Worker destroyed for session: ${sessionKey}, code: ${code}
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
77
96
|
});
|
|
78
97
|
worker.on("error", (err) => {
|
|
98
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
99
|
+
process.stderr.write(`[SessionRouter] Worker thread error for session: ${sessionKey} - ${errMsg}
|
|
100
|
+
`);
|
|
79
101
|
this.onWorkerMessage(sessionKey, {
|
|
80
102
|
type: "error",
|
|
81
103
|
session_key: sessionKey,
|
|
82
|
-
error: `Worker thread error: ${
|
|
104
|
+
error: `Worker thread error: ${errMsg}`
|
|
83
105
|
});
|
|
84
106
|
});
|
|
85
107
|
this.sessions.set(sessionKey, entry);
|
|
@@ -90,9 +112,6 @@ class SessionRouter {
|
|
|
90
112
|
has(sessionKey) {
|
|
91
113
|
return this.sessions.has(sessionKey);
|
|
92
114
|
}
|
|
93
|
-
getConfigHash(sessionKey) {
|
|
94
|
-
return this.sessions.get(sessionKey)?.configHash;
|
|
95
|
-
}
|
|
96
115
|
send(sessionKey, msg) {
|
|
97
116
|
const entry = this.sessions.get(sessionKey);
|
|
98
117
|
if (!entry)
|
|
@@ -104,14 +123,62 @@ class SessionRouter {
|
|
|
104
123
|
const entry = this.sessions.get(sessionKey);
|
|
105
124
|
if (!entry)
|
|
106
125
|
return;
|
|
126
|
+
process.stderr.write(`[SessionRouter] Destroying worker for session: ${sessionKey}
|
|
127
|
+
`);
|
|
128
|
+
this.pendingReady.get(sessionKey)?.reject(new Error("Session destroyed"));
|
|
129
|
+
this.pendingReady.delete(sessionKey);
|
|
130
|
+
this.pendingUpdate.get(sessionKey)?.reject(new Error("Session destroyed"));
|
|
131
|
+
this.pendingUpdate.delete(sessionKey);
|
|
107
132
|
this.sessions.delete(sessionKey);
|
|
133
|
+
entry.destroyed = true;
|
|
108
134
|
entry.worker.postMessage({ type: "destroy" });
|
|
135
|
+
const exitPromise = new Promise((resolve) => {
|
|
136
|
+
entry.worker.once("exit", () => resolve());
|
|
137
|
+
});
|
|
138
|
+
const timeout = new Promise((resolve) => setTimeout(resolve, 2000));
|
|
139
|
+
await Promise.race([exitPromise, timeout]);
|
|
109
140
|
await entry.worker.terminate();
|
|
110
141
|
}
|
|
111
142
|
async destroyAll() {
|
|
112
143
|
const keys = [...this.sessions.keys()];
|
|
113
144
|
await Promise.all(keys.map((k) => this.destroy(k)));
|
|
114
145
|
}
|
|
146
|
+
waitForReady(sessionKey, timeoutMs = 30000) {
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
const timer = setTimeout(() => {
|
|
149
|
+
this.pendingReady.delete(sessionKey);
|
|
150
|
+
reject(new Error(`Session creation timed out after ${timeoutMs / 1000}s`));
|
|
151
|
+
}, timeoutMs);
|
|
152
|
+
this.pendingReady.set(sessionKey, {
|
|
153
|
+
resolve: () => {
|
|
154
|
+
clearTimeout(timer);
|
|
155
|
+
resolve();
|
|
156
|
+
},
|
|
157
|
+
reject: (err) => {
|
|
158
|
+
clearTimeout(timer);
|
|
159
|
+
reject(err);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
waitForUpdate(sessionKey, timeoutMs = 15000) {
|
|
165
|
+
return new Promise((resolve, reject) => {
|
|
166
|
+
const timer = setTimeout(() => {
|
|
167
|
+
this.pendingUpdate.delete(sessionKey);
|
|
168
|
+
reject(new Error(`Session update timed out after ${timeoutMs / 1000}s`));
|
|
169
|
+
}, timeoutMs);
|
|
170
|
+
this.pendingUpdate.set(sessionKey, {
|
|
171
|
+
resolve: () => {
|
|
172
|
+
clearTimeout(timer);
|
|
173
|
+
resolve();
|
|
174
|
+
},
|
|
175
|
+
reject: (err) => {
|
|
176
|
+
clearTimeout(timer);
|
|
177
|
+
reject(err);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
115
182
|
get activeCount() {
|
|
116
183
|
return this.sessions.size;
|
|
117
184
|
}
|
|
@@ -128,10 +195,16 @@ class SessionRouter {
|
|
|
128
195
|
const now = Date.now();
|
|
129
196
|
const toEvict = [];
|
|
130
197
|
for (const [key, entry] of this.sessions) {
|
|
198
|
+
if (this.pendingReady.has(key))
|
|
199
|
+
continue;
|
|
131
200
|
if (now - entry.lastActive.getTime() > this.idleTtlMs) {
|
|
132
201
|
toEvict.push(key);
|
|
133
202
|
}
|
|
134
203
|
}
|
|
204
|
+
if (toEvict.length > 0) {
|
|
205
|
+
process.stderr.write(`[SessionRouter] Evicting ${toEvict.length} idle session(s): ${toEvict.join(", ")}
|
|
206
|
+
`);
|
|
207
|
+
}
|
|
135
208
|
for (const key of toEvict) {
|
|
136
209
|
this.destroy(key).catch(() => {});
|
|
137
210
|
}
|
|
@@ -140,29 +213,20 @@ class SessionRouter {
|
|
|
140
213
|
let oldest = null;
|
|
141
214
|
let oldestTime = Infinity;
|
|
142
215
|
for (const [key, entry] of this.sessions) {
|
|
216
|
+
if (this.pendingReady.has(key))
|
|
217
|
+
continue;
|
|
143
218
|
if (entry.lastActive.getTime() < oldestTime) {
|
|
144
219
|
oldestTime = entry.lastActive.getTime();
|
|
145
220
|
oldest = key;
|
|
146
221
|
}
|
|
147
222
|
}
|
|
148
223
|
if (oldest) {
|
|
224
|
+
process.stderr.write(`[SessionRouter] Evicting LRU session: ${oldest}
|
|
225
|
+
`);
|
|
149
226
|
this.destroy(oldest).catch(() => {});
|
|
150
227
|
}
|
|
151
228
|
}
|
|
152
229
|
}
|
|
153
|
-
function computeConfigHash(config) {
|
|
154
|
-
const parts = [
|
|
155
|
-
config.session.model ?? "",
|
|
156
|
-
config.session.cwd ?? "",
|
|
157
|
-
config.session.systemPrompt ?? "",
|
|
158
|
-
config.session.appendSystemPrompt ?? "",
|
|
159
|
-
config.session.permissionMode ?? "",
|
|
160
|
-
config.permission.mode ?? "",
|
|
161
|
-
...(config.permission.allowed_tools ?? []).sort(),
|
|
162
|
-
...(config.permission.denied_tools ?? []).sort()
|
|
163
|
-
];
|
|
164
|
-
return createHash("sha256").update(JSON.stringify(parts)).digest("hex").slice(0, 16);
|
|
165
|
-
}
|
|
166
230
|
|
|
167
231
|
// src/entrypoints/gateway/index.ts
|
|
168
232
|
var __dirname2 = dirname(fileURLToPath(import.meta.url));
|
|
@@ -170,6 +234,7 @@ var WORKER_PATH = resolve(__dirname2, "worker.js");
|
|
|
170
234
|
var outputBuffer = "";
|
|
171
235
|
var drainResolve = null;
|
|
172
236
|
var MAX_OUTPUT_BUFFER_SIZE = 10 * 1024 * 1024;
|
|
237
|
+
var lastWorkerErrors = new Map;
|
|
173
238
|
function notify(msg) {
|
|
174
239
|
let line;
|
|
175
240
|
try {
|
|
@@ -205,15 +270,22 @@ var router = new SessionRouter({
|
|
|
205
270
|
onWorkerMessage: (sessionKey, msg) => {
|
|
206
271
|
switch (msg.type) {
|
|
207
272
|
case "ready":
|
|
208
|
-
|
|
273
|
+
process.stderr.write(`[Gateway] Session ready: ${sessionKey}, sessionId: ${msg.session_id}
|
|
274
|
+
`);
|
|
275
|
+
notify({ method: "session.ready", params: { session_key: msg.session_key, session_id: msg.session_id, state_session_id: msg.state_session_id } });
|
|
209
276
|
break;
|
|
210
277
|
case "stream":
|
|
211
278
|
notify({ method: "session.stream", params: { session_key: msg.session_key, data: msg.data } });
|
|
212
279
|
break;
|
|
213
280
|
case "complete":
|
|
281
|
+
process.stderr.write(`[Gateway] Session complete: ${sessionKey}, sessionId: ${msg.session_id}
|
|
282
|
+
`);
|
|
214
283
|
notify({ method: "session.complete", params: { session_key: msg.session_key, session_id: msg.session_id } });
|
|
215
284
|
break;
|
|
216
285
|
case "error":
|
|
286
|
+
process.stderr.write(`[Gateway] Session error: ${sessionKey} - ${msg.error}
|
|
287
|
+
`);
|
|
288
|
+
lastWorkerErrors.set(sessionKey, msg.error);
|
|
217
289
|
notify({ method: "session.error", params: { session_key: msg.session_key, error: msg.error } });
|
|
218
290
|
break;
|
|
219
291
|
case "permission_request":
|
|
@@ -229,21 +301,31 @@ var router = new SessionRouter({
|
|
|
229
301
|
}
|
|
230
302
|
});
|
|
231
303
|
break;
|
|
304
|
+
case "updated":
|
|
305
|
+
process.stderr.write(`[Gateway] Session updated: ${sessionKey}
|
|
306
|
+
`);
|
|
307
|
+
break;
|
|
232
308
|
}
|
|
233
309
|
},
|
|
234
310
|
onWorkerExit: (sessionKey, code) => {
|
|
235
|
-
|
|
311
|
+
const lastError = lastWorkerErrors.get(sessionKey);
|
|
312
|
+
const enrichedError = lastError ? `Worker exited with code ${code}. Last error: ${lastError}` : `Worker exited with code ${code}`;
|
|
313
|
+
process.stderr.write(`[Gateway] Worker exited: ${sessionKey}, code: ${code}. Last error: ${lastError || "none"}
|
|
314
|
+
`);
|
|
315
|
+
notify({ method: "session.error", params: { session_key: sessionKey, error: enrichedError } });
|
|
316
|
+
lastWorkerErrors.delete(sessionKey);
|
|
236
317
|
}
|
|
237
318
|
});
|
|
238
319
|
async function handleRequest(req) {
|
|
239
320
|
switch (req.method) {
|
|
240
321
|
case "session.create": {
|
|
241
|
-
const { session_key, config, permission, env } = req.params;
|
|
322
|
+
const { session_key, config, permission, env, resume } = req.params;
|
|
242
323
|
const workerConfig = {
|
|
243
324
|
sessionKey: session_key,
|
|
244
325
|
session: config,
|
|
245
326
|
permission,
|
|
246
|
-
env
|
|
327
|
+
env,
|
|
328
|
+
resume
|
|
247
329
|
};
|
|
248
330
|
try {
|
|
249
331
|
await router.create(session_key, workerConfig);
|
|
@@ -284,6 +366,28 @@ async function handleRequest(req) {
|
|
|
284
366
|
await router.destroy(session_key);
|
|
285
367
|
break;
|
|
286
368
|
}
|
|
369
|
+
case "session.update": {
|
|
370
|
+
const { session_key, config } = req.params;
|
|
371
|
+
if (!router.has(session_key)) {
|
|
372
|
+
notify({
|
|
373
|
+
method: "session.error",
|
|
374
|
+
params: { session_key, error: `Session not found: ${session_key}` }
|
|
375
|
+
});
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
try {
|
|
379
|
+
const updatePromise = router.waitForUpdate(session_key);
|
|
380
|
+
router.send(session_key, { type: "update", config });
|
|
381
|
+
await updatePromise;
|
|
382
|
+
notify({ method: "session.updated", params: { session_key } });
|
|
383
|
+
} catch (err) {
|
|
384
|
+
notify({
|
|
385
|
+
method: "session.error",
|
|
386
|
+
params: { session_key, error: err instanceof Error ? err.message : String(err) }
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
287
391
|
case "session.permission_response": {
|
|
288
392
|
const { session_key, request_id, result } = req.params;
|
|
289
393
|
try {
|