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.
Files changed (89) hide show
  1. package/dist/client/assets/{abnfDiagram-VRR7QNED-VDfhcxCs.js → abnfDiagram-VRR7QNED-C7YJqmLC.js} +1 -1
  2. package/dist/client/assets/{arc-CK3Ni_GA.js → arc-B07DueP1.js} +1 -1
  3. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-QKnogVlc.js → architectureDiagram-ZJ3FMSHR-DRKN8EGo.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-677ZJIJ3-B6KYTMUm.js → blockDiagram-677ZJIJ3-BwR-JbpT.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-LMCZKHZV-CempTpbh.js → c4Diagram-LMCZKHZV-DyRja9hI.js} +1 -1
  6. package/dist/client/assets/channel-DMZ6Nll6.js +1 -0
  7. package/dist/client/assets/{chunk-2Q5K7J3B-BIfNQQhi.js → chunk-2Q5K7J3B-Cl0vEDWK.js} +1 -1
  8. package/dist/client/assets/{chunk-32BRIVSS-BjGUsxBo.js → chunk-32BRIVSS-D-cTwhqE.js} +1 -1
  9. package/dist/client/assets/{chunk-5VM5RSS4-YOIRo4TG.js → chunk-5VM5RSS4-D0eRXduK.js} +1 -1
  10. package/dist/client/assets/{chunk-EX3LRPZG-DYok0zQS.js → chunk-EX3LRPZG-J_Nw8oeX.js} +1 -1
  11. package/dist/client/assets/{chunk-JWPE2WC7-jJpFBvnD.js → chunk-JWPE2WC7-D73gFLxs.js} +1 -1
  12. package/dist/client/assets/{chunk-MOJQB5TN-Cfv8l9NT.js → chunk-MOJQB5TN-DZtboEtR.js} +1 -1
  13. package/dist/client/assets/{chunk-RYQCIY6F-DezUuSQG.js → chunk-RYQCIY6F-D7BwVcOs.js} +1 -1
  14. package/dist/client/assets/{chunk-V7JOEXUC-DubthR3B.js → chunk-V7JOEXUC-B63BJcBW.js} +1 -1
  15. package/dist/client/assets/{chunk-VR4S4FIN-Br17FuD9.js → chunk-VR4S4FIN-C502LPuE.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY-BEp2DDT5.js → chunk-XXDRQBXY-C9puam3W.js} +1 -1
  17. package/dist/client/assets/classDiagram-OUVF2IWQ-C7oNngQj.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-EOCWNBFH-C7oNngQj.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-JH36ORCC-De1yyf-M.js → cose-bilkent-JH36ORCC-CZ24meVw.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-DESao676.js → cynefin-VYW2F7L2-Y2fr06hq.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-BHRUq34L.js → cynefinDiagram-TSTJHNR4-OF_nmz5v.js} +1 -1
  22. package/dist/client/assets/{dagre-VKFMJZFB-q7dQXBcZ.js → dagre-VKFMJZFB-svS4Qj1B.js} +1 -1
  23. package/dist/client/assets/{diagram-FQU43EPY-DK8KUQgs.js → diagram-FQU43EPY-Bim50nBZ.js} +1 -1
  24. package/dist/client/assets/{diagram-G47NLZAW-CttMqM35.js → diagram-G47NLZAW-BDGzIPU6.js} +1 -1
  25. package/dist/client/assets/{diagram-NH7WQ7WH-DdPuemYp.js → diagram-NH7WQ7WH-DP8vmwhI.js} +1 -1
  26. package/dist/client/assets/{diagram-OA4YK3LP-BbRCM1am.js → diagram-OA4YK3LP-CVwGpEzy.js} +1 -1
  27. package/dist/client/assets/{diagram-WEI45ONY-Bsx5Tgzq.js → diagram-WEI45ONY-nS0Aj3Pp.js} +1 -1
  28. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-B_t6Kh6T.js → ebnfDiagram-CCIWWBDH-BogvM--v.js} +1 -1
  29. package/dist/client/assets/{erDiagram-Q63AITRT-C9R1g3WF.js → erDiagram-Q63AITRT-pBjz5SjG.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-23GEKE2U-Cb9bCkNG.js → flowDiagram-23GEKE2U-BINUCOud.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-NO4QXBWP-BiDqptF0.js → ganttDiagram-NO4QXBWP-DITnKqUR.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-Bb5ly04l.js → gitGraphDiagram-IHSO6WYX-C_C74_pU.js} +1 -1
  33. package/dist/client/assets/index-DgG9nafK.css +1 -0
  34. package/dist/client/assets/index-VDGjYWHR.js +408 -0
  35. package/dist/client/assets/{infoDiagram-FWYZ7A6U-CE_9WW2K.js → infoDiagram-FWYZ7A6U-D4WLtM02.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-D6Xq4-fM.js → ishikawaDiagram-FXEZZL3T-tgP7oAl9.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-5HDEW3XC-BR9hIye8.js → journeyDiagram-5HDEW3XC-sK0S0EXp.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-HUTT4EX6-CuCbS_Ki.js → kanban-definition-HUTT4EX6-BZVK0aeo.js} +1 -1
  39. package/dist/client/assets/{linear-SWu8Le4S.js → linear-CHubENPf.js} +1 -1
  40. package/dist/client/assets/{mermaid.core-BBUMzzeH.js → mermaid.core-2dLzSZxi.js} +4 -4
  41. package/dist/client/assets/{mindmap-definition-LN4V7U3C-CQ0baFfF.js → mindmap-definition-LN4V7U3C-C28O3edf.js} +1 -1
  42. package/dist/client/assets/{pegDiagram-2B236MQR-ttatanL5.js → pegDiagram-2B236MQR-DaTkErYV.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-ENE6RG2P-CPfxzHzu.js → pieDiagram-ENE6RG2P-CoUX2zjE.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-BXaRswdp.js → quadrantDiagram-ABIIQ3AL-DdidrEKm.js} +1 -1
  45. package/dist/client/assets/{railroadDiagram-RFXS5EU6-DrjoYMhE.js → railroadDiagram-RFXS5EU6-B4ua4pek.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-TGXJPOKE-DhVxD_8O.js → requirementDiagram-TGXJPOKE-C7GkSVWe.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-COK6i599.js → sankeyDiagram-HTMAVEWB-D2qKgrSf.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-PVFMoTPN.js → sequenceDiagram-DBY2YBRQ-BKpN5Rg1.js} +1 -1
  49. package/dist/client/assets/{sizeCapture-X5ZJPWSS-DOVi8Y5x.js → sizeCapture-X5ZJPWSS-CdOyl0Mu.js} +1 -1
  50. package/dist/client/assets/{stateDiagram-2N3HPSRC-Bn0vvGOe.js → stateDiagram-2N3HPSRC-Pig7diHZ.js} +1 -1
  51. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DaioXNnb.js +1 -0
  52. package/dist/client/assets/{swimlanes-5IMT3BWC-D5QZ4K6L.js → swimlanes-5IMT3BWC-PS6bSiiJ.js} +2 -2
  53. package/dist/client/assets/swimlanesDiagram-G3AALYLV-B9vE1I0i.js +8 -0
  54. package/dist/client/assets/{timeline-definition-FHXFAJF6-DUhdUNzM.js → timeline-definition-FHXFAJF6-BjVebJ90.js} +1 -1
  55. package/dist/client/assets/{vennDiagram-L72KCM5P-p95xTZY4.js → vennDiagram-L72KCM5P-BtjZHsBe.js} +1 -1
  56. package/dist/client/assets/{wardleyDiagram-EHGQE667-DjIHqD-A.js → wardleyDiagram-EHGQE667-DmmuPtgr.js} +1 -1
  57. package/dist/client/assets/{xychartDiagram-FW5EYKEG-DMeL47EZ.js → xychartDiagram-FW5EYKEG-CPh2RG2Y.js} +1 -1
  58. package/dist/client/icons/agents/amp.svg +12 -0
  59. package/dist/client/icons/agents/claude.svg +10 -0
  60. package/dist/client/icons/agents/codex.svg +10 -0
  61. package/dist/client/icons/agents/copilot.svg +12 -0
  62. package/dist/client/icons/agents/cursor.svg +3 -0
  63. package/dist/client/icons/agents/droid.svg +10 -0
  64. package/dist/client/icons/agents/gemini.svg +5 -0
  65. package/dist/client/icons/agents/goose.svg +10 -0
  66. package/dist/client/icons/agents/grok.svg +5 -0
  67. package/dist/client/icons/agents/opencode.svg +3 -0
  68. package/dist/client/index.html +2 -2
  69. package/dist/client/sw.js +1 -1
  70. package/dist/server/agent/installers.js +742 -0
  71. package/dist/server/agent/plugins.js +271 -0
  72. package/dist/server/agent/registry.js +306 -0
  73. package/dist/server/agent/session.js +162 -0
  74. package/dist/server/agentHook.js +174 -0
  75. package/dist/server/cli.js +122 -2
  76. package/dist/server/ptyHost.js +261 -0
  77. package/dist/server/ptyhost/manager.js +396 -0
  78. package/dist/server/ptyhost/protocol.js +80 -0
  79. package/dist/server/routes/filesystem.js +10 -8
  80. package/dist/server/routes/terminal.js +798 -390
  81. package/dist/server/utils/gitStatus.js +114 -0
  82. package/package.json +1 -1
  83. package/dist/client/assets/channel-B_qG4XEr.js +0 -1
  84. package/dist/client/assets/classDiagram-OUVF2IWQ-DsBZBOre.js +0 -1
  85. package/dist/client/assets/classDiagram-v2-EOCWNBFH-DsBZBOre.js +0 -1
  86. package/dist/client/assets/index-BeJrvXOJ.js +0 -394
  87. package/dist/client/assets/index-iK4yVqAA.css +0 -1
  88. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-D_c5gxfu.js +0 -1
  89. 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
- // Default sidebar diffs should represent every changed file from the list:
2799
- // staged-only changes, unstaged changes, and untracked files. Plain
2800
- // `git diff` only shows unstaged tracked edits, which made staged-only
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