cognova 0.2.26 → 0.2.27
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{C4Ii8cYC.js → 2Eo3qwxj.js} +1 -1
- package/.output/public/_nuxt/{lfg-J79K.js → 2ixlK8td.js} +1 -1
- package/.output/public/_nuxt/{D57E8FC4.js → 2nDmPuey.js} +1 -1
- package/.output/public/_nuxt/{rVZcJ6Pz.js → 6f0CtDWh.js} +1 -1
- package/.output/public/_nuxt/{46eRQaVv.js → 7VIfpS3K.js} +1 -1
- package/.output/public/_nuxt/{BD07a6OS.js → 8T7bItPs.js} +3 -3
- package/.output/public/_nuxt/{Dc_VwXJs.js → B2ejvp4F.js} +1 -1
- package/.output/public/_nuxt/{bHsFNLQP.js → B3EVQLy0.js} +1 -1
- package/.output/public/_nuxt/{D_1GDAlv.js → B3WWnSJo.js} +1 -1
- package/.output/public/_nuxt/{CtNN2F57.js → B6kGLfxE.js} +1 -1
- package/.output/public/_nuxt/{BHAaeL5L.js → B8E4nRtc.js} +1 -1
- package/.output/public/_nuxt/{CIDjuJ7I.js → BF1GoXYw.js} +1 -1
- package/.output/public/_nuxt/{DEmzTuCa.js → BFhzL-L6.js} +1 -1
- package/.output/public/_nuxt/{CruI_TS3.js → BH_Lonko.js} +1 -1
- package/.output/public/_nuxt/{DEBOaUgW.js → BIRrab0B.js} +1 -1
- package/.output/public/_nuxt/{swgNRlWy.js → BIRvCR2S.js} +1 -1
- package/.output/public/_nuxt/{B8fLdQfp.js → BISpLSKY.js} +1 -1
- package/.output/public/_nuxt/{qI8JV5dU.js → BIhmDjJ8.js} +1 -1
- package/.output/public/_nuxt/BMsNdiuj.js +1 -0
- package/.output/public/_nuxt/{Bxs6RCfp.js → BP60VAOa.js} +1 -1
- package/.output/public/_nuxt/{D4wS6gzr.js → BRHBOpyl.js} +1 -1
- package/.output/public/_nuxt/{FGRiZ9J1.js → BSHWLnRg.js} +1 -1
- package/.output/public/_nuxt/BUa1DKMp.js +1 -0
- package/.output/public/_nuxt/{CIMG8oEU.js → BWgA6Icb.js} +1 -1
- package/.output/public/_nuxt/{Cwdn7ZtG.js → BY7b-3vi.js} +1 -1
- package/.output/public/_nuxt/{VRRYjCaC.js → BYRCVlFB.js} +1 -1
- package/.output/public/_nuxt/{C1wI_STa.js → B_IIr5Dj.js} +2 -2
- package/.output/public/_nuxt/{DFPu4h4a.js → BcGMY6mI.js} +1 -1
- package/.output/public/_nuxt/{CZvTOsiz.js → Bes0SO2V.js} +1 -1
- package/.output/public/_nuxt/{DmGbOc_e.js → Bf_52ujb.js} +1 -1
- package/.output/public/_nuxt/BgQoNHMg.js +1 -0
- package/.output/public/_nuxt/{BVkPh7-9.js → BiDXeTfW.js} +1 -1
- package/.output/public/_nuxt/{iTZxBLAr.js → BiIuqBpS.js} +3 -3
- package/.output/public/_nuxt/{9vdFTPZC.js → BiQQLbjx.js} +1 -1
- package/.output/public/_nuxt/{FmfogFAR.js → BivpMuR_.js} +1 -1
- package/.output/public/_nuxt/{CZQeFnOf.js → Bl7M4LXt.js} +1 -1
- package/.output/public/_nuxt/{zvDhkxQS.js → Bo6WXrLP.js} +1 -1
- package/.output/public/_nuxt/{rY0W1r76.js → BpN402qF.js} +2 -2
- package/.output/public/_nuxt/{DM9s28TO.js → BpyMs36w.js} +1 -1
- package/.output/public/_nuxt/{Brmj91Ns.js → Bq9rkJSd.js} +1 -1
- package/.output/public/_nuxt/{C3dJrgZH.js → BqSmw12h.js} +1 -1
- package/.output/public/_nuxt/{Dkpxacka.js → BrN_ntKk.js} +1 -1
- package/.output/public/_nuxt/{ChIzYvpz.js → Bx3A9QLd.js} +1 -1
- package/.output/public/_nuxt/{D5AjrkGO.js → Bzkzi9GX.js} +1 -1
- package/.output/public/_nuxt/{CCmSsj4q.js → C1pt3HyX.js} +1 -1
- package/.output/public/_nuxt/{B0_Iu2zi.js → C4XDZQVz.js} +1 -1
- package/.output/public/_nuxt/{BZjMzGZM.js → C4zN4OGX.js} +1 -1
- package/.output/public/_nuxt/{w3RSHXA6.js → C5IBUVPW.js} +1 -1
- package/.output/public/_nuxt/{wSCSxjgr.js → C6IV65Gy.js} +1 -1
- package/.output/public/_nuxt/{3AgfIirx.js → C6M-e7pT.js} +1 -1
- package/.output/public/_nuxt/{B1ea1Zc2.js → CAANELnI.js} +1 -1
- package/.output/public/_nuxt/{C7Wu2u5C.js → CAaAX5yO.js} +1 -1
- package/.output/public/_nuxt/{BGV4_re9.js → CAdrgifl.js} +1 -1
- package/.output/public/_nuxt/{BTImkTzA.js → CDX3o-x3.js} +1 -1
- package/.output/public/_nuxt/{CD6r4z4e.js → CJAiAVnY.js} +1 -1
- package/.output/public/_nuxt/{CjkXqgrT.js → CJa5E6Hb.js} +1 -1
- package/.output/public/_nuxt/{BHcVB9Fo.js → CKcctj3r.js} +1 -1
- package/.output/public/_nuxt/{Co86ycpI.js → CLk-ZoD9.js} +1 -1
- package/.output/public/_nuxt/{P3qGksT8.js → CSQciH0m.js} +1 -1
- package/.output/public/_nuxt/{BqyI8nU4.js → CSZw5eEq.js} +1 -1
- package/.output/public/_nuxt/{CrHLmWKE.js → CSu09NYz.js} +1 -1
- package/.output/public/_nuxt/{CZ5B974o.js → CSwU6kaw.js} +1 -1
- package/.output/public/_nuxt/{v-LIF5tR.js → CU58Jr3-.js} +1 -1
- package/.output/public/_nuxt/{DIMnGgEU.js → CXWZZrP6.js} +1 -1
- package/.output/public/_nuxt/{CGgHmnnS.js → CZT64TBr.js} +3 -3
- package/.output/public/_nuxt/{CLmiWiqr.js → CZZl10o-.js} +1 -1
- package/.output/public/_nuxt/{BwLYFg9w.js → CbLDrSEX.js} +1 -1
- package/.output/public/_nuxt/{DfAWgXhg.js → CfTBjUgE.js} +1 -1
- package/.output/public/_nuxt/{6k0gxaWW.js → CfiM4f33.js} +1 -1
- package/.output/public/_nuxt/{3hFj0Mf_.js → Cj2M_iYP.js} +1 -1
- package/.output/public/_nuxt/{BigIAhcT.js → CjPpmwck.js} +1 -1
- package/.output/public/_nuxt/{n5X4vNX9.js → CjhuD2Kg.js} +2 -2
- package/.output/public/_nuxt/{UQIfAAmf.js → CnLzT6v5.js} +1 -1
- package/.output/public/_nuxt/{DwEfItxe.js → CnViW7-O.js} +1 -1
- package/.output/public/_nuxt/{NNQizITf.js → Ctt1B8Lg.js} +1 -1
- package/.output/public/_nuxt/{m9zGH_2s.js → CuzrMna6.js} +1 -1
- package/.output/public/_nuxt/{B02JOKtW.js → Cv0TenvS.js} +1 -1
- package/.output/public/_nuxt/{BhtKu4xV.js → CzSXUP4q.js} +1 -1
- package/.output/public/_nuxt/{Dfi2mj_-.js → CzYLEcMN.js} +1 -1
- package/.output/public/_nuxt/{Cj3gDP-y.js → D-ysM-Cd.js} +1 -1
- package/.output/public/_nuxt/{CD_jDSWh.js → D2A5WweU.js} +1 -1
- package/.output/public/_nuxt/{Ehiy7Wkv.js → D5dMt776.js} +1 -1
- package/.output/public/_nuxt/{lA6pb86B.js → D5ut0FcJ.js} +1 -1
- package/.output/public/_nuxt/{CPb6IrVT.js → D7PJ9LEZ.js} +1 -1
- package/.output/public/_nuxt/{DmHn_Ae8.js → DA0qOQ-H.js} +1 -1
- package/.output/public/_nuxt/{BW0bq0Nu.js → DCKH9QC5.js} +1 -1
- package/.output/public/_nuxt/{DMCE1Up6.js → DCj0VKbE.js} +1 -1
- package/.output/public/_nuxt/{pFPRVtL-.js → DD864DXc.js} +1 -1
- package/.output/public/_nuxt/{CjVBL0o-.js → DEZB2UVM.js} +1 -1
- package/.output/public/_nuxt/{B27NM422.js → DGMjiZpH.js} +1 -1
- package/.output/public/_nuxt/{BMTKvzsm.js → DH9moCuc.js} +1 -1
- package/.output/public/_nuxt/{DuH9QzIG.js → DHmoYAOF.js} +1 -1
- package/.output/public/_nuxt/{QmdcFt0E.js → DKFnR3f3.js} +1 -1
- package/.output/public/_nuxt/{81-iumfM.js → DM2gKi5N.js} +1 -1
- package/.output/public/_nuxt/{d85YwuyC.js → DMar0qcv.js} +1 -1
- package/.output/public/_nuxt/{7msxmF5v.js → DNNOQPuJ.js} +1 -1
- package/.output/public/_nuxt/{CbLvLXmb.js → DSNEk90K.js} +1 -1
- package/.output/public/_nuxt/{B38X0n2w.js → DTb_yOmO.js} +1 -1
- package/.output/public/_nuxt/{QNqSZCYh.js → DWJ2tQkX.js} +1 -1
- package/.output/public/_nuxt/{uCsI7fpg.js → DbARsMbj.js} +1 -1
- package/.output/public/_nuxt/{Irw5CrIe.js → DbpzXcer.js} +1 -1
- package/.output/public/_nuxt/{6DKJrPTD.js → DcC8s2L0.js} +1 -1
- package/.output/public/_nuxt/{CxNJcty6.js → DcU1vVta.js} +1 -1
- package/.output/public/_nuxt/{BTs0cu3F.js → De4iE8YV.js} +1 -1
- package/.output/public/_nuxt/{B3TXSB_R.js → De94RhMH.js} +1 -1
- package/.output/public/_nuxt/{B8na0pik.js → DfIQdSBL.js} +1 -1
- package/.output/public/_nuxt/{pJF5jz72.js → DfLpZE5I.js} +1 -1
- package/.output/public/_nuxt/{DOs_ozN6.js → DhGDBmGP.js} +1 -1
- package/.output/public/_nuxt/{mLs_Q7_U.js → Dhf7T8TT.js} +1 -1
- package/.output/public/_nuxt/{CVTUqEcr.js → DjY2CmhB.js} +1 -1
- package/.output/public/_nuxt/{DfP6jcEM.js → Dj__3Bye.js} +1 -1
- package/.output/public/_nuxt/{iVfmia7K.js → DlOqPmYc.js} +1 -1
- package/.output/public/_nuxt/{Dbv2gAYq.js → Dm4dqn9Q.js} +1 -1
- package/.output/public/_nuxt/{BW-7wimi.js → Dn0NJtvh.js} +1 -1
- package/.output/public/_nuxt/{CDKJK4wW.js → DuDOxoNd.js} +1 -1
- package/.output/public/_nuxt/{CcJ0pNID.js → DwIL_HsX.js} +1 -1
- package/.output/public/_nuxt/DwbYPACo.js +1 -0
- package/.output/public/_nuxt/{Cfce_cVw.js → Dzjd35Uu.js} +1 -1
- package/.output/public/_nuxt/{BGa5KqPj.js → FOQllft2.js} +1 -1
- package/.output/public/_nuxt/{DoGLYOlq.js → FZ4DGVUC.js} +1 -1
- package/.output/public/_nuxt/{ByXbV9Xa.js → IwZpKn7a.js} +1 -1
- package/.output/public/_nuxt/{By5L5Smf.js → J00SROjJ.js} +1 -1
- package/.output/public/_nuxt/{1_nO5SO6.js → KEgU3jLl.js} +1 -1
- package/.output/public/_nuxt/{eB60bVen.js → KtLDewau.js} +1 -1
- package/.output/public/_nuxt/{IIvTjJqa.js → LFbgE4QY.js} +1 -1
- package/.output/public/_nuxt/{BtVAOj3K.js → MwLHW_S3.js} +1 -1
- package/.output/public/_nuxt/{Bn175bDC.js → SbeB_1mT.js} +1 -1
- package/.output/public/_nuxt/{Bk_mzzQ3.js → T9m6PG7Q.js} +1 -1
- package/.output/public/_nuxt/{DLfV22bF.js → UPUPLBes.js} +1 -1
- package/.output/public/_nuxt/{BaHB7JKe.js → UmRz2svG.js} +1 -1
- package/.output/public/_nuxt/{DB0uzc_1.js → UvHHDzTl.js} +1 -1
- package/.output/public/_nuxt/{C-tfM08H.js → YJeqx4Ll.js} +1 -1
- package/.output/public/_nuxt/{CSyssKl8.js → _fMejg0f.js} +1 -1
- package/.output/public/_nuxt/{DOTIy97K.js → aIIZqPga.js} +1 -1
- package/.output/public/_nuxt/{DXAD_aZW.js → awkGRsuS.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/61420747-850d-4496-817a-d86f57e0fb7d.json +1 -0
- package/.output/public/_nuxt/{AMPsjNHJ.js → dGa7RyJ8.js} +1 -1
- package/.output/public/_nuxt/{gTGPvkTX.js → eTB2hbQs.js} +1 -1
- package/.output/public/_nuxt/{n_Arasow.js → iGKcFJAp.js} +1 -1
- package/.output/public/_nuxt/{D45gWhSU.js → k5H4Okf8.js} +1 -1
- package/.output/public/_nuxt/{DN5cHXGS.js → kbSxj5Sa.js} +1 -1
- package/.output/public/_nuxt/{CBJQYyqD.js → l0zNTVMN.js} +1 -1
- package/.output/public/_nuxt/{C_hl3kCw.js → lheR7PB2.js} +1 -1
- package/.output/public/_nuxt/{BVcLiEDk.js → p1xXbtMk.js} +1 -1
- package/.output/public/_nuxt/{B5oEzB-M.js → qBDqAV_3.js} +1 -1
- package/.output/public/_nuxt/{CJLlvuDm.js → qEwYRBS3.js} +1 -1
- package/.output/public/_nuxt/{RIAd5Wd1.js → tHI-osWJ.js} +1 -1
- package/.output/public/_nuxt/{DoSrePUc.js → tIRQIyWk.js} +1 -1
- package/.output/public/_nuxt/{D5IKvGig.js → uP6kBJyw.js} +1 -1
- package/.output/public/_nuxt/{By6urPVf.js → yyeTZy_R.js} +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/styles.mjs +2 -2
- package/.output/server/chunks/nitro/nitro.mjs +900 -891
- package/.output/server/chunks/routes/{terminal.mjs → _ws/terminal.mjs} +39 -28
- package/.output/server/chunks/routes/_ws/terminal.mjs.map +1 -0
- package/.output/server/chunks/routes/notifications.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/app/composables/useTerminal.ts +1 -1
- package/package.json +1 -1
- package/server/routes/_ws/terminal.ts +111 -0
- package/server/utils/pty-manager.ts +12 -3
- package/.output/public/_nuxt/CNB4wNeh.js +0 -1
- package/.output/public/_nuxt/CnB-ybCZ.js +0 -1
- package/.output/public/_nuxt/DAjV9Cip.js +0 -1
- package/.output/public/_nuxt/Suor9Vto.js +0 -1
- package/.output/public/_nuxt/builds/meta/d37c41da-8cec-4479-a3ac-3097aa4fb2e0.json +0 -1
- package/.output/server/chunks/routes/terminal.mjs.map +0 -1
- package/server/routes/terminal.ts +0 -98
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a8 as defineWebSocketHandler,
|
|
1
|
+
import { a8 as defineWebSocketHandler, aa as resizePty, ab as writeToPty, k as auth, ac as getOrCreatePtySession, ad as getOutputBuffer, ae as getPtySession } from '../../nitro/nitro.mjs';
|
|
2
2
|
import '@anthropic-ai/claude-agent-sdk';
|
|
3
3
|
import 'module';
|
|
4
4
|
import 'path';
|
|
@@ -38,42 +38,55 @@ import 'node:url';
|
|
|
38
38
|
import '@iconify/utils';
|
|
39
39
|
import 'consola';
|
|
40
40
|
|
|
41
|
+
function send(peer, data) {
|
|
42
|
+
try {
|
|
43
|
+
peer.send(JSON.stringify(data));
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
}
|
|
41
47
|
const terminal = defineWebSocketHandler({
|
|
42
|
-
open(peer) {
|
|
48
|
+
async open(peer) {
|
|
49
|
+
var _a;
|
|
50
|
+
const headers = (_a = peer.request) == null ? void 0 : _a.headers;
|
|
51
|
+
if (headers) {
|
|
52
|
+
try {
|
|
53
|
+
const session = await auth.api.getSession({ headers });
|
|
54
|
+
if (!session) {
|
|
55
|
+
send(peer, { type: "error", data: "Unauthorized\r\n" });
|
|
56
|
+
peer.close(1008, "Unauthorized");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {
|
|
60
|
+
console.error("[terminal] Auth check failed:", e);
|
|
61
|
+
send(peer, { type: "error", data: "Authentication failed\r\n" });
|
|
62
|
+
peer.close(1008, "Authentication failed");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
43
66
|
const sessionId = "default";
|
|
44
67
|
const cols = 80;
|
|
45
68
|
const rows = 24;
|
|
46
|
-
console.log(`
|
|
69
|
+
console.log(`[terminal] WebSocket opened: ${peer.id}`);
|
|
47
70
|
try {
|
|
48
71
|
const { isNew } = getOrCreatePtySession(sessionId, cols, rows);
|
|
49
72
|
if (!isNew) {
|
|
50
73
|
const buffer = getOutputBuffer(sessionId);
|
|
51
74
|
if (buffer.length > 0) {
|
|
52
|
-
|
|
53
|
-
type: "output",
|
|
54
|
-
data: buffer.join("")
|
|
55
|
-
}));
|
|
75
|
+
send(peer, { type: "output", data: buffer.join("") });
|
|
56
76
|
}
|
|
57
77
|
}
|
|
58
78
|
const session = getPtySession(sessionId);
|
|
59
79
|
if (session) {
|
|
60
80
|
session.pty.onData((data) => {
|
|
61
|
-
|
|
62
|
-
peer.send(JSON.stringify({
|
|
63
|
-
type: "output",
|
|
64
|
-
data
|
|
65
|
-
}));
|
|
66
|
-
} catch {
|
|
67
|
-
}
|
|
81
|
+
send(peer, { type: "output", data });
|
|
68
82
|
});
|
|
69
83
|
}
|
|
70
84
|
} catch (error) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
`
|
|
76
|
-
}));
|
|
85
|
+
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
86
|
+
const stack = error instanceof Error ? error.stack : "";
|
|
87
|
+
console.error("[terminal] Failed to create PTY session:", msg, stack);
|
|
88
|
+
send(peer, { type: "error", data: `Failed to start terminal: ${msg}\r
|
|
89
|
+
` });
|
|
77
90
|
}
|
|
78
91
|
},
|
|
79
92
|
message(peer, message) {
|
|
@@ -82,28 +95,26 @@ const terminal = defineWebSocketHandler({
|
|
|
82
95
|
const msg = JSON.parse(message.text());
|
|
83
96
|
switch (msg.type) {
|
|
84
97
|
case "input":
|
|
85
|
-
if (msg.data)
|
|
98
|
+
if (msg.data)
|
|
86
99
|
writeToPty(sessionId, msg.data);
|
|
87
|
-
}
|
|
88
100
|
break;
|
|
89
101
|
case "resize":
|
|
90
|
-
if (msg.cols && msg.rows)
|
|
102
|
+
if (msg.cols && msg.rows)
|
|
91
103
|
resizePty(sessionId, msg.cols, msg.rows);
|
|
92
|
-
}
|
|
93
104
|
break;
|
|
94
105
|
case "ping":
|
|
95
|
-
|
|
106
|
+
send(peer, { type: "pong" });
|
|
96
107
|
break;
|
|
97
108
|
}
|
|
98
109
|
} catch (e) {
|
|
99
|
-
console.error("
|
|
110
|
+
console.error("[terminal] Message error:", e);
|
|
100
111
|
}
|
|
101
112
|
},
|
|
102
113
|
close(peer) {
|
|
103
|
-
console.log(`
|
|
114
|
+
console.log(`[terminal] WebSocket closed: ${peer.id}`);
|
|
104
115
|
},
|
|
105
116
|
error(peer, error) {
|
|
106
|
-
console.error(`
|
|
117
|
+
console.error(`[terminal] WebSocket error for ${peer.id}:`, error);
|
|
107
118
|
}
|
|
108
119
|
});
|
|
109
120
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.mjs","sources":["../../../../../server/routes/_ws/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ export function useTerminal() {
|
|
|
17
17
|
|
|
18
18
|
function getWebSocketUrl(): string {
|
|
19
19
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
20
|
-
return `${protocol}//${window.location.host}/terminal`
|
|
20
|
+
return `${protocol}//${window.location.host}/_ws/terminal`
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
function connect(term: Terminal) {
|
package/package.json
CHANGED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getOrCreatePtySession,
|
|
3
|
+
getOutputBuffer,
|
|
4
|
+
resizePty,
|
|
5
|
+
writeToPty,
|
|
6
|
+
getPtySession
|
|
7
|
+
} from '~~/server/utils/pty-manager'
|
|
8
|
+
import { auth } from '~~/server/utils/auth'
|
|
9
|
+
|
|
10
|
+
interface TerminalMessage {
|
|
11
|
+
type: 'input' | 'resize' | 'ping'
|
|
12
|
+
data?: string
|
|
13
|
+
cols?: number
|
|
14
|
+
rows?: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
function send(peer: any, data: object) {
|
|
19
|
+
try {
|
|
20
|
+
peer.send(JSON.stringify(data))
|
|
21
|
+
} catch {
|
|
22
|
+
// Client disconnected
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default defineWebSocketHandler({
|
|
27
|
+
async open(peer) {
|
|
28
|
+
// Validate auth from upgrade request cookies (middleware is bypassed for /_ws)
|
|
29
|
+
const headers = peer.request?.headers
|
|
30
|
+
if (headers) {
|
|
31
|
+
try {
|
|
32
|
+
const session = await auth.api.getSession({ headers })
|
|
33
|
+
if (!session) {
|
|
34
|
+
send(peer, { type: 'error', data: 'Unauthorized\r\n' })
|
|
35
|
+
peer.close(1008, 'Unauthorized')
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
} catch (e) {
|
|
39
|
+
console.error('[terminal] Auth check failed:', e)
|
|
40
|
+
send(peer, { type: 'error', data: 'Authentication failed\r\n' })
|
|
41
|
+
peer.close(1008, 'Authentication failed')
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const sessionId = 'default'
|
|
47
|
+
const cols = 80
|
|
48
|
+
const rows = 24
|
|
49
|
+
|
|
50
|
+
console.log(`[terminal] WebSocket opened: ${peer.id}`)
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const { isNew } = getOrCreatePtySession(sessionId, cols, rows)
|
|
54
|
+
|
|
55
|
+
// If reconnecting, replay buffer
|
|
56
|
+
if (!isNew) {
|
|
57
|
+
const buffer = getOutputBuffer(sessionId)
|
|
58
|
+
if (buffer.length > 0) {
|
|
59
|
+
send(peer, { type: 'output', data: buffer.join('') })
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Forward PTY output to client
|
|
64
|
+
const session = getPtySession(sessionId)
|
|
65
|
+
if (session) {
|
|
66
|
+
session.pty.onData((data: string) => {
|
|
67
|
+
send(peer, { type: 'output', data })
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
const msg = error instanceof Error ? error.message : 'Unknown error'
|
|
72
|
+
const stack = error instanceof Error ? error.stack : ''
|
|
73
|
+
console.error('[terminal] Failed to create PTY session:', msg, stack)
|
|
74
|
+
send(peer, { type: 'error', data: `Failed to start terminal: ${msg}\r\n` })
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
message(peer, message) {
|
|
79
|
+
const sessionId = 'default'
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const msg = JSON.parse(message.text()) as TerminalMessage
|
|
83
|
+
|
|
84
|
+
switch (msg.type) {
|
|
85
|
+
case 'input':
|
|
86
|
+
if (msg.data)
|
|
87
|
+
writeToPty(sessionId, msg.data)
|
|
88
|
+
break
|
|
89
|
+
|
|
90
|
+
case 'resize':
|
|
91
|
+
if (msg.cols && msg.rows)
|
|
92
|
+
resizePty(sessionId, msg.cols, msg.rows)
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
case 'ping':
|
|
96
|
+
send(peer, { type: 'pong' })
|
|
97
|
+
break
|
|
98
|
+
}
|
|
99
|
+
} catch (e) {
|
|
100
|
+
console.error('[terminal] Message error:', e)
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
close(peer) {
|
|
105
|
+
console.log(`[terminal] WebSocket closed: ${peer.id}`)
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
error(peer, error) {
|
|
109
|
+
console.error(`[terminal] WebSocket error for ${peer.id}:`, error)
|
|
110
|
+
}
|
|
111
|
+
})
|
|
@@ -7,7 +7,15 @@ import { getVaultRoot } from './path-validator'
|
|
|
7
7
|
// Use createRequire for node-pty to avoid ESM issues with native modules
|
|
8
8
|
// For bundled builds, we need to resolve from a known location
|
|
9
9
|
const requireFromCwd = createRequire(resolve(process.cwd(), 'package.json'))
|
|
10
|
-
|
|
10
|
+
let pty: typeof import('node-pty')
|
|
11
|
+
try {
|
|
12
|
+
pty = requireFromCwd('node-pty')
|
|
13
|
+
const helperPath = resolve(dirname(requireFromCwd.resolve('node-pty')), '..', 'build', 'Release', 'spawn-helper')
|
|
14
|
+
console.log(`[PTY] node-pty loaded, spawn-helper exists: ${existsSync(helperPath)} (${helperPath})`)
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.error('[PTY] Failed to load node-pty:', e)
|
|
17
|
+
throw e
|
|
18
|
+
}
|
|
11
19
|
|
|
12
20
|
// Shell candidates in order of preference
|
|
13
21
|
const SHELL_CANDIDATES = [
|
|
@@ -54,14 +62,15 @@ export function createPtySession(sessionId: string, cols = 80, rows = 24): IPty
|
|
|
54
62
|
// Ensure cwd exists so posix_spawnp doesn't fail
|
|
55
63
|
if (!existsSync(cwd)) mkdirSync(cwd, { recursive: true })
|
|
56
64
|
|
|
57
|
-
|
|
65
|
+
const env = ptyEnv()
|
|
66
|
+
console.log(`[PTY] Creating session: shell=${shell}, cwd=${cwd}, cols=${cols}, rows=${rows}, PATH=${(env.PATH || '').slice(0, 200)}`)
|
|
58
67
|
|
|
59
68
|
const ptyProcess = pty.spawn(shell, [], {
|
|
60
69
|
name: 'xterm-256color',
|
|
61
70
|
cols,
|
|
62
71
|
rows,
|
|
63
72
|
cwd,
|
|
64
|
-
env
|
|
73
|
+
env
|
|
65
74
|
}) as IPty
|
|
66
75
|
|
|
67
76
|
const session: PtySession = {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as e,j as r,a6 as t}from"./CGgHmnnS.js";function a(o){return e(()=>r(o)?!!t(o)?.closest("form"):!0)}export{a as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./CGgHmnnS.js";const s=globalThis.setInterval;export{s};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as a,n as i}from"./CGgHmnnS.js";import{u}from"./B5oEzB-M.js";const r=a(()=>{const{isAuthenticated:e,isPending:t}=u();if(!t.value&&!e.value)return i("/login")});export{r as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{S as e}from"./CGgHmnnS.js";function a(r,u="reka"){return r||`${u}-${e?.()}`}export{a as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"id":"d37c41da-8cec-4479-a3ac-3097aa4fb2e0","timestamp":1771947047568,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.mjs","sources":["../../../../server/routes/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getOrCreatePtySession,
|
|
3
|
-
getOutputBuffer,
|
|
4
|
-
resizePty,
|
|
5
|
-
writeToPty,
|
|
6
|
-
getPtySession
|
|
7
|
-
} from '../utils/pty-manager'
|
|
8
|
-
|
|
9
|
-
interface TerminalMessage {
|
|
10
|
-
type: 'input' | 'resize' | 'ping'
|
|
11
|
-
data?: string
|
|
12
|
-
cols?: number
|
|
13
|
-
rows?: number
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export default defineWebSocketHandler({
|
|
17
|
-
open(peer) {
|
|
18
|
-
const sessionId = 'default' // For now, single session per app
|
|
19
|
-
const cols = 80
|
|
20
|
-
const rows = 24
|
|
21
|
-
|
|
22
|
-
console.log(`Terminal WebSocket opened: ${peer.id}`)
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const { isNew } = getOrCreatePtySession(sessionId, cols, rows)
|
|
26
|
-
|
|
27
|
-
// If reconnecting, replay buffer
|
|
28
|
-
if (!isNew) {
|
|
29
|
-
const buffer = getOutputBuffer(sessionId)
|
|
30
|
-
if (buffer.length > 0) {
|
|
31
|
-
peer.send(JSON.stringify({
|
|
32
|
-
type: 'output',
|
|
33
|
-
data: buffer.join('')
|
|
34
|
-
}))
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Forward PTY output to client
|
|
39
|
-
const session = getPtySession(sessionId)
|
|
40
|
-
if (session) {
|
|
41
|
-
session.pty.onData((data: string) => {
|
|
42
|
-
try {
|
|
43
|
-
peer.send(JSON.stringify({
|
|
44
|
-
type: 'output',
|
|
45
|
-
data
|
|
46
|
-
}))
|
|
47
|
-
} catch {
|
|
48
|
-
// Client disconnected
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.error('Failed to create PTY session:', error)
|
|
54
|
-
peer.send(JSON.stringify({
|
|
55
|
-
type: 'error',
|
|
56
|
-
data: `Failed to start terminal: ${error instanceof Error ? error.message : 'Unknown error'}\r\n`
|
|
57
|
-
}))
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
|
|
61
|
-
message(peer, message) {
|
|
62
|
-
const sessionId = 'default'
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
const msg = JSON.parse(message.text()) as TerminalMessage
|
|
66
|
-
|
|
67
|
-
switch (msg.type) {
|
|
68
|
-
case 'input':
|
|
69
|
-
if (msg.data) {
|
|
70
|
-
writeToPty(sessionId, msg.data)
|
|
71
|
-
}
|
|
72
|
-
break
|
|
73
|
-
|
|
74
|
-
case 'resize':
|
|
75
|
-
if (msg.cols && msg.rows) {
|
|
76
|
-
resizePty(sessionId, msg.cols, msg.rows)
|
|
77
|
-
}
|
|
78
|
-
break
|
|
79
|
-
|
|
80
|
-
case 'ping':
|
|
81
|
-
peer.send(JSON.stringify({ type: 'pong' }))
|
|
82
|
-
break
|
|
83
|
-
}
|
|
84
|
-
} catch (e) {
|
|
85
|
-
console.error('Terminal message error:', e)
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
|
|
89
|
-
close(peer) {
|
|
90
|
-
console.log(`Terminal WebSocket closed: ${peer.id}`)
|
|
91
|
-
// Don't destroy session on close - allow reconnection
|
|
92
|
-
// Session will be cleaned up by timeout in pty-manager
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
error(peer, error) {
|
|
96
|
-
console.error(`Terminal WebSocket error for ${peer.id}:`, error)
|
|
97
|
-
}
|
|
98
|
-
})
|