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.
Files changed (170) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{C4Ii8cYC.js → 2Eo3qwxj.js} +1 -1
  3. package/.output/public/_nuxt/{lfg-J79K.js → 2ixlK8td.js} +1 -1
  4. package/.output/public/_nuxt/{D57E8FC4.js → 2nDmPuey.js} +1 -1
  5. package/.output/public/_nuxt/{rVZcJ6Pz.js → 6f0CtDWh.js} +1 -1
  6. package/.output/public/_nuxt/{46eRQaVv.js → 7VIfpS3K.js} +1 -1
  7. package/.output/public/_nuxt/{BD07a6OS.js → 8T7bItPs.js} +3 -3
  8. package/.output/public/_nuxt/{Dc_VwXJs.js → B2ejvp4F.js} +1 -1
  9. package/.output/public/_nuxt/{bHsFNLQP.js → B3EVQLy0.js} +1 -1
  10. package/.output/public/_nuxt/{D_1GDAlv.js → B3WWnSJo.js} +1 -1
  11. package/.output/public/_nuxt/{CtNN2F57.js → B6kGLfxE.js} +1 -1
  12. package/.output/public/_nuxt/{BHAaeL5L.js → B8E4nRtc.js} +1 -1
  13. package/.output/public/_nuxt/{CIDjuJ7I.js → BF1GoXYw.js} +1 -1
  14. package/.output/public/_nuxt/{DEmzTuCa.js → BFhzL-L6.js} +1 -1
  15. package/.output/public/_nuxt/{CruI_TS3.js → BH_Lonko.js} +1 -1
  16. package/.output/public/_nuxt/{DEBOaUgW.js → BIRrab0B.js} +1 -1
  17. package/.output/public/_nuxt/{swgNRlWy.js → BIRvCR2S.js} +1 -1
  18. package/.output/public/_nuxt/{B8fLdQfp.js → BISpLSKY.js} +1 -1
  19. package/.output/public/_nuxt/{qI8JV5dU.js → BIhmDjJ8.js} +1 -1
  20. package/.output/public/_nuxt/BMsNdiuj.js +1 -0
  21. package/.output/public/_nuxt/{Bxs6RCfp.js → BP60VAOa.js} +1 -1
  22. package/.output/public/_nuxt/{D4wS6gzr.js → BRHBOpyl.js} +1 -1
  23. package/.output/public/_nuxt/{FGRiZ9J1.js → BSHWLnRg.js} +1 -1
  24. package/.output/public/_nuxt/BUa1DKMp.js +1 -0
  25. package/.output/public/_nuxt/{CIMG8oEU.js → BWgA6Icb.js} +1 -1
  26. package/.output/public/_nuxt/{Cwdn7ZtG.js → BY7b-3vi.js} +1 -1
  27. package/.output/public/_nuxt/{VRRYjCaC.js → BYRCVlFB.js} +1 -1
  28. package/.output/public/_nuxt/{C1wI_STa.js → B_IIr5Dj.js} +2 -2
  29. package/.output/public/_nuxt/{DFPu4h4a.js → BcGMY6mI.js} +1 -1
  30. package/.output/public/_nuxt/{CZvTOsiz.js → Bes0SO2V.js} +1 -1
  31. package/.output/public/_nuxt/{DmGbOc_e.js → Bf_52ujb.js} +1 -1
  32. package/.output/public/_nuxt/BgQoNHMg.js +1 -0
  33. package/.output/public/_nuxt/{BVkPh7-9.js → BiDXeTfW.js} +1 -1
  34. package/.output/public/_nuxt/{iTZxBLAr.js → BiIuqBpS.js} +3 -3
  35. package/.output/public/_nuxt/{9vdFTPZC.js → BiQQLbjx.js} +1 -1
  36. package/.output/public/_nuxt/{FmfogFAR.js → BivpMuR_.js} +1 -1
  37. package/.output/public/_nuxt/{CZQeFnOf.js → Bl7M4LXt.js} +1 -1
  38. package/.output/public/_nuxt/{zvDhkxQS.js → Bo6WXrLP.js} +1 -1
  39. package/.output/public/_nuxt/{rY0W1r76.js → BpN402qF.js} +2 -2
  40. package/.output/public/_nuxt/{DM9s28TO.js → BpyMs36w.js} +1 -1
  41. package/.output/public/_nuxt/{Brmj91Ns.js → Bq9rkJSd.js} +1 -1
  42. package/.output/public/_nuxt/{C3dJrgZH.js → BqSmw12h.js} +1 -1
  43. package/.output/public/_nuxt/{Dkpxacka.js → BrN_ntKk.js} +1 -1
  44. package/.output/public/_nuxt/{ChIzYvpz.js → Bx3A9QLd.js} +1 -1
  45. package/.output/public/_nuxt/{D5AjrkGO.js → Bzkzi9GX.js} +1 -1
  46. package/.output/public/_nuxt/{CCmSsj4q.js → C1pt3HyX.js} +1 -1
  47. package/.output/public/_nuxt/{B0_Iu2zi.js → C4XDZQVz.js} +1 -1
  48. package/.output/public/_nuxt/{BZjMzGZM.js → C4zN4OGX.js} +1 -1
  49. package/.output/public/_nuxt/{w3RSHXA6.js → C5IBUVPW.js} +1 -1
  50. package/.output/public/_nuxt/{wSCSxjgr.js → C6IV65Gy.js} +1 -1
  51. package/.output/public/_nuxt/{3AgfIirx.js → C6M-e7pT.js} +1 -1
  52. package/.output/public/_nuxt/{B1ea1Zc2.js → CAANELnI.js} +1 -1
  53. package/.output/public/_nuxt/{C7Wu2u5C.js → CAaAX5yO.js} +1 -1
  54. package/.output/public/_nuxt/{BGV4_re9.js → CAdrgifl.js} +1 -1
  55. package/.output/public/_nuxt/{BTImkTzA.js → CDX3o-x3.js} +1 -1
  56. package/.output/public/_nuxt/{CD6r4z4e.js → CJAiAVnY.js} +1 -1
  57. package/.output/public/_nuxt/{CjkXqgrT.js → CJa5E6Hb.js} +1 -1
  58. package/.output/public/_nuxt/{BHcVB9Fo.js → CKcctj3r.js} +1 -1
  59. package/.output/public/_nuxt/{Co86ycpI.js → CLk-ZoD9.js} +1 -1
  60. package/.output/public/_nuxt/{P3qGksT8.js → CSQciH0m.js} +1 -1
  61. package/.output/public/_nuxt/{BqyI8nU4.js → CSZw5eEq.js} +1 -1
  62. package/.output/public/_nuxt/{CrHLmWKE.js → CSu09NYz.js} +1 -1
  63. package/.output/public/_nuxt/{CZ5B974o.js → CSwU6kaw.js} +1 -1
  64. package/.output/public/_nuxt/{v-LIF5tR.js → CU58Jr3-.js} +1 -1
  65. package/.output/public/_nuxt/{DIMnGgEU.js → CXWZZrP6.js} +1 -1
  66. package/.output/public/_nuxt/{CGgHmnnS.js → CZT64TBr.js} +3 -3
  67. package/.output/public/_nuxt/{CLmiWiqr.js → CZZl10o-.js} +1 -1
  68. package/.output/public/_nuxt/{BwLYFg9w.js → CbLDrSEX.js} +1 -1
  69. package/.output/public/_nuxt/{DfAWgXhg.js → CfTBjUgE.js} +1 -1
  70. package/.output/public/_nuxt/{6k0gxaWW.js → CfiM4f33.js} +1 -1
  71. package/.output/public/_nuxt/{3hFj0Mf_.js → Cj2M_iYP.js} +1 -1
  72. package/.output/public/_nuxt/{BigIAhcT.js → CjPpmwck.js} +1 -1
  73. package/.output/public/_nuxt/{n5X4vNX9.js → CjhuD2Kg.js} +2 -2
  74. package/.output/public/_nuxt/{UQIfAAmf.js → CnLzT6v5.js} +1 -1
  75. package/.output/public/_nuxt/{DwEfItxe.js → CnViW7-O.js} +1 -1
  76. package/.output/public/_nuxt/{NNQizITf.js → Ctt1B8Lg.js} +1 -1
  77. package/.output/public/_nuxt/{m9zGH_2s.js → CuzrMna6.js} +1 -1
  78. package/.output/public/_nuxt/{B02JOKtW.js → Cv0TenvS.js} +1 -1
  79. package/.output/public/_nuxt/{BhtKu4xV.js → CzSXUP4q.js} +1 -1
  80. package/.output/public/_nuxt/{Dfi2mj_-.js → CzYLEcMN.js} +1 -1
  81. package/.output/public/_nuxt/{Cj3gDP-y.js → D-ysM-Cd.js} +1 -1
  82. package/.output/public/_nuxt/{CD_jDSWh.js → D2A5WweU.js} +1 -1
  83. package/.output/public/_nuxt/{Ehiy7Wkv.js → D5dMt776.js} +1 -1
  84. package/.output/public/_nuxt/{lA6pb86B.js → D5ut0FcJ.js} +1 -1
  85. package/.output/public/_nuxt/{CPb6IrVT.js → D7PJ9LEZ.js} +1 -1
  86. package/.output/public/_nuxt/{DmHn_Ae8.js → DA0qOQ-H.js} +1 -1
  87. package/.output/public/_nuxt/{BW0bq0Nu.js → DCKH9QC5.js} +1 -1
  88. package/.output/public/_nuxt/{DMCE1Up6.js → DCj0VKbE.js} +1 -1
  89. package/.output/public/_nuxt/{pFPRVtL-.js → DD864DXc.js} +1 -1
  90. package/.output/public/_nuxt/{CjVBL0o-.js → DEZB2UVM.js} +1 -1
  91. package/.output/public/_nuxt/{B27NM422.js → DGMjiZpH.js} +1 -1
  92. package/.output/public/_nuxt/{BMTKvzsm.js → DH9moCuc.js} +1 -1
  93. package/.output/public/_nuxt/{DuH9QzIG.js → DHmoYAOF.js} +1 -1
  94. package/.output/public/_nuxt/{QmdcFt0E.js → DKFnR3f3.js} +1 -1
  95. package/.output/public/_nuxt/{81-iumfM.js → DM2gKi5N.js} +1 -1
  96. package/.output/public/_nuxt/{d85YwuyC.js → DMar0qcv.js} +1 -1
  97. package/.output/public/_nuxt/{7msxmF5v.js → DNNOQPuJ.js} +1 -1
  98. package/.output/public/_nuxt/{CbLvLXmb.js → DSNEk90K.js} +1 -1
  99. package/.output/public/_nuxt/{B38X0n2w.js → DTb_yOmO.js} +1 -1
  100. package/.output/public/_nuxt/{QNqSZCYh.js → DWJ2tQkX.js} +1 -1
  101. package/.output/public/_nuxt/{uCsI7fpg.js → DbARsMbj.js} +1 -1
  102. package/.output/public/_nuxt/{Irw5CrIe.js → DbpzXcer.js} +1 -1
  103. package/.output/public/_nuxt/{6DKJrPTD.js → DcC8s2L0.js} +1 -1
  104. package/.output/public/_nuxt/{CxNJcty6.js → DcU1vVta.js} +1 -1
  105. package/.output/public/_nuxt/{BTs0cu3F.js → De4iE8YV.js} +1 -1
  106. package/.output/public/_nuxt/{B3TXSB_R.js → De94RhMH.js} +1 -1
  107. package/.output/public/_nuxt/{B8na0pik.js → DfIQdSBL.js} +1 -1
  108. package/.output/public/_nuxt/{pJF5jz72.js → DfLpZE5I.js} +1 -1
  109. package/.output/public/_nuxt/{DOs_ozN6.js → DhGDBmGP.js} +1 -1
  110. package/.output/public/_nuxt/{mLs_Q7_U.js → Dhf7T8TT.js} +1 -1
  111. package/.output/public/_nuxt/{CVTUqEcr.js → DjY2CmhB.js} +1 -1
  112. package/.output/public/_nuxt/{DfP6jcEM.js → Dj__3Bye.js} +1 -1
  113. package/.output/public/_nuxt/{iVfmia7K.js → DlOqPmYc.js} +1 -1
  114. package/.output/public/_nuxt/{Dbv2gAYq.js → Dm4dqn9Q.js} +1 -1
  115. package/.output/public/_nuxt/{BW-7wimi.js → Dn0NJtvh.js} +1 -1
  116. package/.output/public/_nuxt/{CDKJK4wW.js → DuDOxoNd.js} +1 -1
  117. package/.output/public/_nuxt/{CcJ0pNID.js → DwIL_HsX.js} +1 -1
  118. package/.output/public/_nuxt/DwbYPACo.js +1 -0
  119. package/.output/public/_nuxt/{Cfce_cVw.js → Dzjd35Uu.js} +1 -1
  120. package/.output/public/_nuxt/{BGa5KqPj.js → FOQllft2.js} +1 -1
  121. package/.output/public/_nuxt/{DoGLYOlq.js → FZ4DGVUC.js} +1 -1
  122. package/.output/public/_nuxt/{ByXbV9Xa.js → IwZpKn7a.js} +1 -1
  123. package/.output/public/_nuxt/{By5L5Smf.js → J00SROjJ.js} +1 -1
  124. package/.output/public/_nuxt/{1_nO5SO6.js → KEgU3jLl.js} +1 -1
  125. package/.output/public/_nuxt/{eB60bVen.js → KtLDewau.js} +1 -1
  126. package/.output/public/_nuxt/{IIvTjJqa.js → LFbgE4QY.js} +1 -1
  127. package/.output/public/_nuxt/{BtVAOj3K.js → MwLHW_S3.js} +1 -1
  128. package/.output/public/_nuxt/{Bn175bDC.js → SbeB_1mT.js} +1 -1
  129. package/.output/public/_nuxt/{Bk_mzzQ3.js → T9m6PG7Q.js} +1 -1
  130. package/.output/public/_nuxt/{DLfV22bF.js → UPUPLBes.js} +1 -1
  131. package/.output/public/_nuxt/{BaHB7JKe.js → UmRz2svG.js} +1 -1
  132. package/.output/public/_nuxt/{DB0uzc_1.js → UvHHDzTl.js} +1 -1
  133. package/.output/public/_nuxt/{C-tfM08H.js → YJeqx4Ll.js} +1 -1
  134. package/.output/public/_nuxt/{CSyssKl8.js → _fMejg0f.js} +1 -1
  135. package/.output/public/_nuxt/{DOTIy97K.js → aIIZqPga.js} +1 -1
  136. package/.output/public/_nuxt/{DXAD_aZW.js → awkGRsuS.js} +1 -1
  137. package/.output/public/_nuxt/builds/latest.json +1 -1
  138. package/.output/public/_nuxt/builds/meta/61420747-850d-4496-817a-d86f57e0fb7d.json +1 -0
  139. package/.output/public/_nuxt/{AMPsjNHJ.js → dGa7RyJ8.js} +1 -1
  140. package/.output/public/_nuxt/{gTGPvkTX.js → eTB2hbQs.js} +1 -1
  141. package/.output/public/_nuxt/{n_Arasow.js → iGKcFJAp.js} +1 -1
  142. package/.output/public/_nuxt/{D45gWhSU.js → k5H4Okf8.js} +1 -1
  143. package/.output/public/_nuxt/{DN5cHXGS.js → kbSxj5Sa.js} +1 -1
  144. package/.output/public/_nuxt/{CBJQYyqD.js → l0zNTVMN.js} +1 -1
  145. package/.output/public/_nuxt/{C_hl3kCw.js → lheR7PB2.js} +1 -1
  146. package/.output/public/_nuxt/{BVcLiEDk.js → p1xXbtMk.js} +1 -1
  147. package/.output/public/_nuxt/{B5oEzB-M.js → qBDqAV_3.js} +1 -1
  148. package/.output/public/_nuxt/{CJLlvuDm.js → qEwYRBS3.js} +1 -1
  149. package/.output/public/_nuxt/{RIAd5Wd1.js → tHI-osWJ.js} +1 -1
  150. package/.output/public/_nuxt/{DoSrePUc.js → tIRQIyWk.js} +1 -1
  151. package/.output/public/_nuxt/{D5IKvGig.js → uP6kBJyw.js} +1 -1
  152. package/.output/public/_nuxt/{By6urPVf.js → yyeTZy_R.js} +1 -1
  153. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  154. package/.output/server/chunks/build/styles.mjs +2 -2
  155. package/.output/server/chunks/nitro/nitro.mjs +900 -891
  156. package/.output/server/chunks/routes/{terminal.mjs → _ws/terminal.mjs} +39 -28
  157. package/.output/server/chunks/routes/_ws/terminal.mjs.map +1 -0
  158. package/.output/server/chunks/routes/notifications.mjs +1 -1
  159. package/.output/server/package.json +1 -1
  160. package/app/composables/useTerminal.ts +1 -1
  161. package/package.json +1 -1
  162. package/server/routes/_ws/terminal.ts +111 -0
  163. package/server/utils/pty-manager.ts +12 -3
  164. package/.output/public/_nuxt/CNB4wNeh.js +0 -1
  165. package/.output/public/_nuxt/CnB-ybCZ.js +0 -1
  166. package/.output/public/_nuxt/DAjV9Cip.js +0 -1
  167. package/.output/public/_nuxt/Suor9Vto.js +0 -1
  168. package/.output/public/_nuxt/builds/meta/d37c41da-8cec-4479-a3ac-3097aa4fb2e0.json +0 -1
  169. package/.output/server/chunks/routes/terminal.mjs.map +0 -1
  170. package/server/routes/terminal.ts +0 -98
@@ -1,4 +1,4 @@
1
- import { a8 as defineWebSocketHandler, ab as resizePty, ac as writeToPty, ad as getOrCreatePtySession, ae as getOutputBuffer, af as getPtySession } from '../nitro/nitro.mjs';
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(`Terminal WebSocket opened: ${peer.id}`);
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
- peer.send(JSON.stringify({
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
- try {
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
- console.error("Failed to create PTY session:", error);
72
- peer.send(JSON.stringify({
73
- type: "error",
74
- data: `Failed to start terminal: ${error instanceof Error ? error.message : "Unknown error"}\r
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
- peer.send(JSON.stringify({ type: "pong" }));
106
+ send(peer, { type: "pong" });
96
107
  break;
97
108
  }
98
109
  } catch (e) {
99
- console.error("Terminal message error:", e);
110
+ console.error("[terminal] Message error:", e);
100
111
  }
101
112
  },
102
113
  close(peer) {
103
- console.log(`Terminal WebSocket closed: ${peer.id}`);
114
+ console.log(`[terminal] WebSocket closed: ${peer.id}`);
104
115
  },
105
116
  error(peer, error) {
106
- console.error(`Terminal WebSocket error for ${peer.id}:`, 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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"}
@@ -1,4 +1,4 @@
1
- import { a8 as defineWebSocketHandler, aa as notificationBus } from '../nitro/nitro.mjs';
1
+ import { a8 as defineWebSocketHandler, af as notificationBus } from '../nitro/nitro.mjs';
2
2
  import '@anthropic-ai/claude-agent-sdk';
3
3
  import 'module';
4
4
  import 'path';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cognova-prod",
3
- "version": "0.2.26",
3
+ "version": "0.2.27",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
@@ -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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cognova",
3
3
  "type": "module",
4
- "version": "0.2.26",
4
+ "version": "0.2.27",
5
5
  "description": "Personal knowledge management system with Claude Code integration",
6
6
  "repository": {
7
7
  "type": "git",
@@ -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
- const pty = requireFromCwd('node-pty')
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
- console.log(`[PTY] Creating session: shell=${shell}, cwd=${cwd}, cols=${cols}, rows=${rows}`)
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: ptyEnv()
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
- })