termdock 1.3.0 → 1.4.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/client/assets/{abnfDiagram-VRR7QNED-DboLYKjC.js → abnfDiagram-VRR7QNED-G_YxqZwv.js} +1 -1
- package/dist/client/assets/{arc-C7cI3SGK.js → arc-BuvKiJCC.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-DupwL8qH.js → architectureDiagram-ZJ3FMSHR-BvkwEVZw.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-DNM7fUPm.js → blockDiagram-677ZJIJ3-C3bxox0Z.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-Jaxf-YGr.js → c4Diagram-LMCZKHZV-DLORcr8m.js} +1 -1
- package/dist/client/assets/channel-BnGIwxUi.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CjqqaH_Z.js → chunk-2Q5K7J3B-Dnqi-8g0.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-BYtt3b30.js → chunk-32BRIVSS-D70B4HxL.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-C68y4tT7.js → chunk-5VM5RSS4-Cl7t39aR.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-BpJMVcVA.js → chunk-EX3LRPZG-DKMD4DfE.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-BaYNrMI4.js → chunk-JWPE2WC7-CsN_pMOw.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-y5QTOrLI.js → chunk-MOJQB5TN-D8BHaQpE.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-DiHf2o1T.js → chunk-RYQCIY6F-B8BtUiHF.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-9j4f9aIn.js → chunk-V7JOEXUC-CdN7tlvn.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-CdbelzcZ.js → chunk-VR4S4FIN-UPjL_wl4.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-YAjZkdyb.js → chunk-XXDRQBXY--eX5Na_l.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-DMigd9mj.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-DMigd9mj.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-lTBDAWfs.js → cose-bilkent-JH36ORCC-CEAcZx3N.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-Dl7ev6m4.js → cynefin-VYW2F7L2-up8zIMDo.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-CSxz6O5q.js → cynefinDiagram-TSTJHNR4-DZ2SQpCq.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-zWgEHxrl.js → dagre-VKFMJZFB-DOoLtq9O.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-BQeiowzD.js → diagram-FQU43EPY-x8umATxt.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-DJezXuHM.js → diagram-G47NLZAW-Kle7Toxb.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-D1d1WkdQ.js → diagram-NH7WQ7WH-CezkkMqP.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-C2ZpnAsd.js → diagram-OA4YK3LP-CaU0u6UQ.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-DH9kmAm9.js → diagram-WEI45ONY-B4m53TVj.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-CjnajZxN.js → ebnfDiagram-CCIWWBDH-Dpwjo8_v.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-CzmBQFbx.js → erDiagram-Q63AITRT-BU4R1QVk.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-ljeoJhTo.js → flowDiagram-23GEKE2U-BFtDsA0k.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-DF3m0dot.js → ganttDiagram-NO4QXBWP-DtSEfub5.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-BwB7r571.js → gitGraphDiagram-IHSO6WYX-BGukYlT3.js} +1 -1
- package/dist/client/assets/index-CP3_puZd.js +395 -0
- package/dist/client/assets/index-CxBkmASY.css +1 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-Cv9S0ijK.js → infoDiagram-FWYZ7A6U-Bx1NQNsL.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-DRecz33b.js → ishikawaDiagram-FXEZZL3T-DHlxYJjl.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-BLRRylnR.js → journeyDiagram-5HDEW3XC-BOZzlR6d.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-BC1ph5cw.js → kanban-definition-HUTT4EX6-C2nWuUXX.js} +1 -1
- package/dist/client/assets/{linear-C2zeZj0z.js → linear-DtblW0g4.js} +1 -1
- package/dist/client/assets/{mermaid.core-BqDN_zP4.js → mermaid.core-BKSuG721.js} +4 -4
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-BpDX-24D.js → mindmap-definition-LN4V7U3C-Co3LLQGt.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-Sn0Dke6L.js → pegDiagram-2B236MQR-DSUG1nB1.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-DzMhYGWJ.js → pieDiagram-ENE6RG2P-DvEr0UPf.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-CuQoPglS.js → quadrantDiagram-ABIIQ3AL-C2diLBZ8.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-C4hKErDp.js → railroadDiagram-RFXS5EU6-CqYZHCvf.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-CE5J97_g.js → requirementDiagram-TGXJPOKE-CFAKdPQp.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-BDyhQ6qz.js → sankeyDiagram-HTMAVEWB-DV95NA9H.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-CW-oi8so.js → sequenceDiagram-DBY2YBRQ-cbv0xzG-.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-mMoYKQSz.js → sizeCapture-X5ZJPWSS-DpkzYB1F.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-BUd0G8S2.js → stateDiagram-2N3HPSRC-BnAwPP0V.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DtPm_oHq.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-B8hw4xPM.js → swimlanes-5IMT3BWC-kObRIKfj.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-yeb4EUGj.js +8 -0
- package/dist/client/assets/{timeline-definition-FHXFAJF6-DykkYG1G.js → timeline-definition-FHXFAJF6-BbnAJ8pO.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-BBkpVj6b.js → vennDiagram-L72KCM5P-sIu_hWKx.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-ClqSnTks.js → wardleyDiagram-EHGQE667-DpGdJtdb.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-Ba_5tcTW.js → xychartDiagram-FW5EYKEG-C5F9faN2.js} +1 -1
- package/dist/client/icons/agents/amp.svg +12 -0
- package/dist/client/icons/agents/claude.svg +10 -0
- package/dist/client/icons/agents/codex.svg +10 -0
- package/dist/client/icons/agents/copilot.svg +12 -0
- package/dist/client/icons/agents/cursor.svg +3 -0
- package/dist/client/icons/agents/droid.svg +10 -0
- package/dist/client/icons/agents/gemini.svg +5 -0
- package/dist/client/icons/agents/goose.svg +10 -0
- package/dist/client/icons/agents/grok.svg +5 -0
- package/dist/client/icons/agents/opencode.svg +3 -0
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +1 -1
- package/dist/server/agent/installers.js +551 -0
- package/dist/server/agent/registry.js +244 -0
- package/dist/server/agent/session.js +162 -0
- package/dist/server/agentHook.js +174 -0
- package/dist/server/ptyHost.js +261 -0
- package/dist/server/ptyhost/manager.js +396 -0
- package/dist/server/ptyhost/protocol.js +80 -0
- package/dist/server/routes/terminal.js +829 -395
- package/dist/server/utils/gitStatus.js +114 -0
- package/package.json +1 -1
- package/dist/client/assets/channel-D1achAhM.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-BiqbrzEM.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-BiqbrzEM.js +0 -1
- package/dist/client/assets/index-QtbZAkiJ.css +0 -1
- package/dist/client/assets/index-odB6evg3.js +0 -394
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-XLkUpRKa.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-CA2gJRr9.js +0 -8
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framed wire protocol between the termdock server and the pty-host daemon
|
|
3
|
+
* over a Unix-domain socket. (架构移植自 tty7 daemon/protocol.rs,Apache-2.0)
|
|
4
|
+
*
|
|
5
|
+
* Frame layout: `[1B type][4B BE length][payload]`.
|
|
6
|
+
* Per-channel payloads (DATA/INPUT/REPLAY) start with `[1B idLen][id utf8]`.
|
|
7
|
+
* CONTROL payloads are a single JSON document.
|
|
8
|
+
*
|
|
9
|
+
* The host owns the PTYs and a bounded per-channel replay ring, and counts
|
|
10
|
+
* output in *chars* (both sides count JS string length, so multibyte text
|
|
11
|
+
* never desyncs the offset). Attach carries `since`; the host replays only
|
|
12
|
+
* newer output, then live data.
|
|
13
|
+
*/
|
|
14
|
+
export const PTY_HOST_PROTOCOL_VERSION = 1;
|
|
15
|
+
export const FRAME_DATA = 0x01; // host → server: live PTY output
|
|
16
|
+
export const FRAME_INPUT = 0x02; // server → host: client keystrokes
|
|
17
|
+
export const FRAME_CONTROL = 0x03; // both ways: JSON control message
|
|
18
|
+
export const FRAME_REPLAY = 0x04; // host → server: historical ring output
|
|
19
|
+
const HEADER_LEN = 5;
|
|
20
|
+
const MAX_FRAME = 4 * 1024 * 1024;
|
|
21
|
+
export function encodeDataFrame(type, id, data) {
|
|
22
|
+
const idBuf = Buffer.from(id, 'utf8');
|
|
23
|
+
if (idBuf.length > 255)
|
|
24
|
+
throw new Error('channel id too long');
|
|
25
|
+
const dataBuf = Buffer.from(data, 'utf8');
|
|
26
|
+
const frame = Buffer.allocUnsafe(HEADER_LEN + 1 + idBuf.length + dataBuf.length);
|
|
27
|
+
frame.writeUInt8(type, 0);
|
|
28
|
+
frame.writeUInt32BE(1 + idBuf.length + dataBuf.length, 1);
|
|
29
|
+
frame.writeUInt8(idBuf.length, HEADER_LEN);
|
|
30
|
+
idBuf.copy(frame, HEADER_LEN + 1);
|
|
31
|
+
dataBuf.copy(frame, HEADER_LEN + 1 + idBuf.length);
|
|
32
|
+
return frame;
|
|
33
|
+
}
|
|
34
|
+
export function encodeControl(msg) {
|
|
35
|
+
const json = Buffer.from(JSON.stringify(msg), 'utf8');
|
|
36
|
+
const frame = Buffer.allocUnsafe(HEADER_LEN + json.length);
|
|
37
|
+
frame.writeUInt8(FRAME_CONTROL, 0);
|
|
38
|
+
frame.writeUInt32BE(json.length, 1);
|
|
39
|
+
json.copy(frame, HEADER_LEN);
|
|
40
|
+
return frame;
|
|
41
|
+
}
|
|
42
|
+
/** Incremental frame decoder: feed chunks, drain complete frames. */
|
|
43
|
+
export class FrameDecoder {
|
|
44
|
+
buf = Buffer.alloc(0);
|
|
45
|
+
feed(chunk) {
|
|
46
|
+
this.buf = this.buf.length === 0 ? chunk : Buffer.concat([this.buf, chunk]);
|
|
47
|
+
const out = [];
|
|
48
|
+
for (;;) {
|
|
49
|
+
if (this.buf.length < HEADER_LEN)
|
|
50
|
+
break;
|
|
51
|
+
const type = this.buf.readUInt8(0);
|
|
52
|
+
const len = this.buf.readUInt32BE(1);
|
|
53
|
+
if (len > MAX_FRAME) {
|
|
54
|
+
// Desync guard: drop everything, let the connection reset.
|
|
55
|
+
this.buf = Buffer.alloc(0);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
if (this.buf.length < HEADER_LEN + len)
|
|
59
|
+
break;
|
|
60
|
+
const payload = this.buf.subarray(HEADER_LEN, HEADER_LEN + len);
|
|
61
|
+
this.buf = this.buf.subarray(HEADER_LEN + len);
|
|
62
|
+
if (type === FRAME_CONTROL) {
|
|
63
|
+
try {
|
|
64
|
+
out.push({ type, id: null, data: null, control: JSON.parse(payload.toString('utf8')) });
|
|
65
|
+
}
|
|
66
|
+
catch { /* malformed control frame: skip */ }
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (type === FRAME_DATA || type === FRAME_INPUT || type === FRAME_REPLAY) {
|
|
70
|
+
const idLen = payload.readUInt8(0);
|
|
71
|
+
const id = payload.subarray(1, 1 + idLen).toString('utf8');
|
|
72
|
+
const data = payload.subarray(1 + idLen).toString('utf8');
|
|
73
|
+
out.push({ type, id, data, control: null });
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// Unknown frame type: skip payload (forward compatibility).
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
}
|