termdock 1.3.1 → 1.4.1
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-VDfhcxCs.js → abnfDiagram-VRR7QNED-C7YJqmLC.js} +1 -1
- package/dist/client/assets/{arc-CK3Ni_GA.js → arc-B07DueP1.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-QKnogVlc.js → architectureDiagram-ZJ3FMSHR-DRKN8EGo.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-B6KYTMUm.js → blockDiagram-677ZJIJ3-BwR-JbpT.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-CempTpbh.js → c4Diagram-LMCZKHZV-DyRja9hI.js} +1 -1
- package/dist/client/assets/channel-DMZ6Nll6.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-BIfNQQhi.js → chunk-2Q5K7J3B-Cl0vEDWK.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-BjGUsxBo.js → chunk-32BRIVSS-D-cTwhqE.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-YOIRo4TG.js → chunk-5VM5RSS4-D0eRXduK.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-DYok0zQS.js → chunk-EX3LRPZG-J_Nw8oeX.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-jJpFBvnD.js → chunk-JWPE2WC7-D73gFLxs.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-Cfv8l9NT.js → chunk-MOJQB5TN-DZtboEtR.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-DezUuSQG.js → chunk-RYQCIY6F-D7BwVcOs.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-DubthR3B.js → chunk-V7JOEXUC-B63BJcBW.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-Br17FuD9.js → chunk-VR4S4FIN-C502LPuE.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-BEp2DDT5.js → chunk-XXDRQBXY-C9puam3W.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-C7oNngQj.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-C7oNngQj.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-De1yyf-M.js → cose-bilkent-JH36ORCC-CZ24meVw.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-DESao676.js → cynefin-VYW2F7L2-Y2fr06hq.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-BHRUq34L.js → cynefinDiagram-TSTJHNR4-OF_nmz5v.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-q7dQXBcZ.js → dagre-VKFMJZFB-svS4Qj1B.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-DK8KUQgs.js → diagram-FQU43EPY-Bim50nBZ.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-CttMqM35.js → diagram-G47NLZAW-BDGzIPU6.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-DdPuemYp.js → diagram-NH7WQ7WH-DP8vmwhI.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-BbRCM1am.js → diagram-OA4YK3LP-CVwGpEzy.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-Bsx5Tgzq.js → diagram-WEI45ONY-nS0Aj3Pp.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-B_t6Kh6T.js → ebnfDiagram-CCIWWBDH-BogvM--v.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-C9R1g3WF.js → erDiagram-Q63AITRT-pBjz5SjG.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-Cb9bCkNG.js → flowDiagram-23GEKE2U-BINUCOud.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-BiDqptF0.js → ganttDiagram-NO4QXBWP-DITnKqUR.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-Bb5ly04l.js → gitGraphDiagram-IHSO6WYX-C_C74_pU.js} +1 -1
- package/dist/client/assets/index-DgG9nafK.css +1 -0
- package/dist/client/assets/index-VDGjYWHR.js +408 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-CE_9WW2K.js → infoDiagram-FWYZ7A6U-D4WLtM02.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-D6Xq4-fM.js → ishikawaDiagram-FXEZZL3T-tgP7oAl9.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-BR9hIye8.js → journeyDiagram-5HDEW3XC-sK0S0EXp.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-CuCbS_Ki.js → kanban-definition-HUTT4EX6-BZVK0aeo.js} +1 -1
- package/dist/client/assets/{linear-SWu8Le4S.js → linear-CHubENPf.js} +1 -1
- package/dist/client/assets/{mermaid.core-BBUMzzeH.js → mermaid.core-2dLzSZxi.js} +4 -4
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-CQ0baFfF.js → mindmap-definition-LN4V7U3C-C28O3edf.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-ttatanL5.js → pegDiagram-2B236MQR-DaTkErYV.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-CPfxzHzu.js → pieDiagram-ENE6RG2P-CoUX2zjE.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-BXaRswdp.js → quadrantDiagram-ABIIQ3AL-DdidrEKm.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-DrjoYMhE.js → railroadDiagram-RFXS5EU6-B4ua4pek.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-DhVxD_8O.js → requirementDiagram-TGXJPOKE-C7GkSVWe.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-COK6i599.js → sankeyDiagram-HTMAVEWB-D2qKgrSf.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-PVFMoTPN.js → sequenceDiagram-DBY2YBRQ-BKpN5Rg1.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-DOVi8Y5x.js → sizeCapture-X5ZJPWSS-CdOyl0Mu.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-Bn0vvGOe.js → stateDiagram-2N3HPSRC-Pig7diHZ.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DaioXNnb.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-D5QZ4K6L.js → swimlanes-5IMT3BWC-PS6bSiiJ.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-B9vE1I0i.js +8 -0
- package/dist/client/assets/{timeline-definition-FHXFAJF6-DUhdUNzM.js → timeline-definition-FHXFAJF6-BjVebJ90.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-p95xTZY4.js → vennDiagram-L72KCM5P-BtjZHsBe.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-DjIHqD-A.js → wardleyDiagram-EHGQE667-DmmuPtgr.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-DMeL47EZ.js → xychartDiagram-FW5EYKEG-CPh2RG2Y.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 +742 -0
- package/dist/server/agent/plugins.js +271 -0
- package/dist/server/agent/registry.js +306 -0
- package/dist/server/agent/session.js +162 -0
- package/dist/server/agentHook.js +174 -0
- package/dist/server/cli.js +122 -2
- 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/filesystem.js +10 -8
- package/dist/server/routes/terminal.js +798 -390
- package/dist/server/utils/gitStatus.js +114 -0
- package/package.json +1 -1
- package/dist/client/assets/channel-B_qG4XEr.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-DsBZBOre.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-DsBZBOre.js +0 -1
- package/dist/client/assets/index-BeJrvXOJ.js +0 -394
- package/dist/client/assets/index-iK4yVqAA.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-D_c5gxfu.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-DsiBwV8W.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
|
+
}
|
|
@@ -2795,10 +2795,9 @@ router.get('/diff', async (req, res) => {
|
|
|
2795
2795
|
args.push('--', pathspec);
|
|
2796
2796
|
return args;
|
|
2797
2797
|
};
|
|
2798
|
-
//
|
|
2799
|
-
// staged
|
|
2800
|
-
//
|
|
2801
|
-
// additions/deletions/renames look empty in the UI.
|
|
2798
|
+
// Use `git diff HEAD` to present a merged view of all worktree changes
|
|
2799
|
+
// (staged + unstaged) against HEAD. Untracked files are handled separately
|
|
2800
|
+
// with `--no-index` below.
|
|
2802
2801
|
let truncatedByGit = false;
|
|
2803
2802
|
const readLimitedDiff = async (args, maxBytes = MAX_DIFF_BYTES) => {
|
|
2804
2803
|
const gitResult = await execGitLimited(args, gitCwd, maxBytes, false, controller.signal, { id: requestId, action, op: 'git.diff', path: requestedPath, extra: { traceId, interactionId, requestSlotId } });
|
|
@@ -2812,12 +2811,15 @@ router.get('/diff', async (req, res) => {
|
|
|
2812
2811
|
truncatedByGit = true;
|
|
2813
2812
|
return gitResult.stdout;
|
|
2814
2813
|
};
|
|
2814
|
+
const buildHeadDiffArgs = () => {
|
|
2815
|
+
const args = ['diff', '-M', ...diffOptionArgs, 'HEAD'];
|
|
2816
|
+
if (pathspec)
|
|
2817
|
+
args.push('--', pathspec);
|
|
2818
|
+
return args;
|
|
2819
|
+
};
|
|
2815
2820
|
let diff = cached
|
|
2816
2821
|
? await readLimitedDiff(buildDiffArgs(true))
|
|
2817
|
-
:
|
|
2818
|
-
await readLimitedDiff(buildDiffArgs(true)),
|
|
2819
|
-
await readLimitedDiff(buildDiffArgs(false)),
|
|
2820
|
-
].filter(Boolean).join('\n');
|
|
2822
|
+
: await readLimitedDiff(buildHeadDiffArgs());
|
|
2821
2823
|
let totalBytes = getDiffByteLength(diff);
|
|
2822
2824
|
// If git diff produced no output for a specific file, it might be an
|
|
2823
2825
|
// untracked (new) file. Use `git diff --no-index /dev/null <path>` to
|