termdock 1.3.1 → 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.
Files changed (86) hide show
  1. package/dist/client/assets/{abnfDiagram-VRR7QNED-VDfhcxCs.js → abnfDiagram-VRR7QNED-G_YxqZwv.js} +1 -1
  2. package/dist/client/assets/{arc-CK3Ni_GA.js → arc-BuvKiJCC.js} +1 -1
  3. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-QKnogVlc.js → architectureDiagram-ZJ3FMSHR-BvkwEVZw.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-677ZJIJ3-B6KYTMUm.js → blockDiagram-677ZJIJ3-C3bxox0Z.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-LMCZKHZV-CempTpbh.js → c4Diagram-LMCZKHZV-DLORcr8m.js} +1 -1
  6. package/dist/client/assets/channel-BnGIwxUi.js +1 -0
  7. package/dist/client/assets/{chunk-2Q5K7J3B-BIfNQQhi.js → chunk-2Q5K7J3B-Dnqi-8g0.js} +1 -1
  8. package/dist/client/assets/{chunk-32BRIVSS-BjGUsxBo.js → chunk-32BRIVSS-D70B4HxL.js} +1 -1
  9. package/dist/client/assets/{chunk-5VM5RSS4-YOIRo4TG.js → chunk-5VM5RSS4-Cl7t39aR.js} +1 -1
  10. package/dist/client/assets/{chunk-EX3LRPZG-DYok0zQS.js → chunk-EX3LRPZG-DKMD4DfE.js} +1 -1
  11. package/dist/client/assets/{chunk-JWPE2WC7-jJpFBvnD.js → chunk-JWPE2WC7-CsN_pMOw.js} +1 -1
  12. package/dist/client/assets/{chunk-MOJQB5TN-Cfv8l9NT.js → chunk-MOJQB5TN-D8BHaQpE.js} +1 -1
  13. package/dist/client/assets/{chunk-RYQCIY6F-DezUuSQG.js → chunk-RYQCIY6F-B8BtUiHF.js} +1 -1
  14. package/dist/client/assets/{chunk-V7JOEXUC-DubthR3B.js → chunk-V7JOEXUC-CdN7tlvn.js} +1 -1
  15. package/dist/client/assets/{chunk-VR4S4FIN-Br17FuD9.js → chunk-VR4S4FIN-UPjL_wl4.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY-BEp2DDT5.js → chunk-XXDRQBXY--eX5Na_l.js} +1 -1
  17. package/dist/client/assets/classDiagram-OUVF2IWQ-DMigd9mj.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-EOCWNBFH-DMigd9mj.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-JH36ORCC-De1yyf-M.js → cose-bilkent-JH36ORCC-CEAcZx3N.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-DESao676.js → cynefin-VYW2F7L2-up8zIMDo.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-BHRUq34L.js → cynefinDiagram-TSTJHNR4-DZ2SQpCq.js} +1 -1
  22. package/dist/client/assets/{dagre-VKFMJZFB-q7dQXBcZ.js → dagre-VKFMJZFB-DOoLtq9O.js} +1 -1
  23. package/dist/client/assets/{diagram-FQU43EPY-DK8KUQgs.js → diagram-FQU43EPY-x8umATxt.js} +1 -1
  24. package/dist/client/assets/{diagram-G47NLZAW-CttMqM35.js → diagram-G47NLZAW-Kle7Toxb.js} +1 -1
  25. package/dist/client/assets/{diagram-NH7WQ7WH-DdPuemYp.js → diagram-NH7WQ7WH-CezkkMqP.js} +1 -1
  26. package/dist/client/assets/{diagram-OA4YK3LP-BbRCM1am.js → diagram-OA4YK3LP-CaU0u6UQ.js} +1 -1
  27. package/dist/client/assets/{diagram-WEI45ONY-Bsx5Tgzq.js → diagram-WEI45ONY-B4m53TVj.js} +1 -1
  28. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-B_t6Kh6T.js → ebnfDiagram-CCIWWBDH-Dpwjo8_v.js} +1 -1
  29. package/dist/client/assets/{erDiagram-Q63AITRT-C9R1g3WF.js → erDiagram-Q63AITRT-BU4R1QVk.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-23GEKE2U-Cb9bCkNG.js → flowDiagram-23GEKE2U-BFtDsA0k.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-NO4QXBWP-BiDqptF0.js → ganttDiagram-NO4QXBWP-DtSEfub5.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-Bb5ly04l.js → gitGraphDiagram-IHSO6WYX-BGukYlT3.js} +1 -1
  33. package/dist/client/assets/index-CP3_puZd.js +395 -0
  34. package/dist/client/assets/index-CxBkmASY.css +1 -0
  35. package/dist/client/assets/{infoDiagram-FWYZ7A6U-CE_9WW2K.js → infoDiagram-FWYZ7A6U-Bx1NQNsL.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-D6Xq4-fM.js → ishikawaDiagram-FXEZZL3T-DHlxYJjl.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-5HDEW3XC-BR9hIye8.js → journeyDiagram-5HDEW3XC-BOZzlR6d.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-HUTT4EX6-CuCbS_Ki.js → kanban-definition-HUTT4EX6-C2nWuUXX.js} +1 -1
  39. package/dist/client/assets/{linear-SWu8Le4S.js → linear-DtblW0g4.js} +1 -1
  40. package/dist/client/assets/{mermaid.core-BBUMzzeH.js → mermaid.core-BKSuG721.js} +4 -4
  41. package/dist/client/assets/{mindmap-definition-LN4V7U3C-CQ0baFfF.js → mindmap-definition-LN4V7U3C-Co3LLQGt.js} +1 -1
  42. package/dist/client/assets/{pegDiagram-2B236MQR-ttatanL5.js → pegDiagram-2B236MQR-DSUG1nB1.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-ENE6RG2P-CPfxzHzu.js → pieDiagram-ENE6RG2P-DvEr0UPf.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-BXaRswdp.js → quadrantDiagram-ABIIQ3AL-C2diLBZ8.js} +1 -1
  45. package/dist/client/assets/{railroadDiagram-RFXS5EU6-DrjoYMhE.js → railroadDiagram-RFXS5EU6-CqYZHCvf.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-TGXJPOKE-DhVxD_8O.js → requirementDiagram-TGXJPOKE-CFAKdPQp.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-COK6i599.js → sankeyDiagram-HTMAVEWB-DV95NA9H.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-PVFMoTPN.js → sequenceDiagram-DBY2YBRQ-cbv0xzG-.js} +1 -1
  49. package/dist/client/assets/{sizeCapture-X5ZJPWSS-DOVi8Y5x.js → sizeCapture-X5ZJPWSS-DpkzYB1F.js} +1 -1
  50. package/dist/client/assets/{stateDiagram-2N3HPSRC-Bn0vvGOe.js → stateDiagram-2N3HPSRC-BnAwPP0V.js} +1 -1
  51. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DtPm_oHq.js +1 -0
  52. package/dist/client/assets/{swimlanes-5IMT3BWC-D5QZ4K6L.js → swimlanes-5IMT3BWC-kObRIKfj.js} +2 -2
  53. package/dist/client/assets/swimlanesDiagram-G3AALYLV-yeb4EUGj.js +8 -0
  54. package/dist/client/assets/{timeline-definition-FHXFAJF6-DUhdUNzM.js → timeline-definition-FHXFAJF6-BbnAJ8pO.js} +1 -1
  55. package/dist/client/assets/{vennDiagram-L72KCM5P-p95xTZY4.js → vennDiagram-L72KCM5P-sIu_hWKx.js} +1 -1
  56. package/dist/client/assets/{wardleyDiagram-EHGQE667-DjIHqD-A.js → wardleyDiagram-EHGQE667-DpGdJtdb.js} +1 -1
  57. package/dist/client/assets/{xychartDiagram-FW5EYKEG-DMeL47EZ.js → xychartDiagram-FW5EYKEG-C5F9faN2.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 +551 -0
  71. package/dist/server/agent/registry.js +244 -0
  72. package/dist/server/agent/session.js +162 -0
  73. package/dist/server/agentHook.js +174 -0
  74. package/dist/server/ptyHost.js +261 -0
  75. package/dist/server/ptyhost/manager.js +396 -0
  76. package/dist/server/ptyhost/protocol.js +80 -0
  77. package/dist/server/routes/terminal.js +724 -393
  78. package/dist/server/utils/gitStatus.js +114 -0
  79. package/package.json +1 -1
  80. package/dist/client/assets/channel-B_qG4XEr.js +0 -1
  81. package/dist/client/assets/classDiagram-OUVF2IWQ-DsBZBOre.js +0 -1
  82. package/dist/client/assets/classDiagram-v2-EOCWNBFH-DsBZBOre.js +0 -1
  83. package/dist/client/assets/index-BeJrvXOJ.js +0 -394
  84. package/dist/client/assets/index-iK4yVqAA.css +0 -1
  85. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-D_c5gxfu.js +0 -1
  86. package/dist/client/assets/swimlanesDiagram-G3AALYLV-DsiBwV8W.js +0 -8
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Lightweight git snapshot per working directory — current branch + working
3
+ * tree diff size — pushed to tabs/sidebar so each session shows
4
+ * `⎇ feat/x +6 −5`. (设计移植自 tty7 terminal/git_status.rs,Apache-2.0)
5
+ *
6
+ * Snapshots are shared through a process-wide cache keyed by work-tree root:
7
+ * every pane whose cwd resolves into the same repo reads the *same* entry, so
8
+ * ten tabs in one repo show one truth, refreshed by whichever pane probed
9
+ * last. Probes are per-trigger (cwd change, command end, agent tool activity)
10
+ * but deduped in-flight and throttled per root, so simultaneous triggers cost
11
+ * one `git` shell-out, not one per pane.
12
+ *
13
+ * Read-only — `GIT_OPTIONAL_LOCKS=0` keeps status polling from ever taking
14
+ * `index.lock` and fighting a real git command the user is running.
15
+ */
16
+ import { execFile } from 'node:child_process';
17
+ /** Default minimum interval between probes of the same work-tree root. */
18
+ const DEFAULT_MIN_INTERVAL_MS = 5_000;
19
+ /** One probe (two git invocations) must finish inside this budget. */
20
+ const PROBE_TIMEOUT_MS = 5_000;
21
+ function runGit(cwd, args) {
22
+ return new Promise((resolvePromise, rejectPromise) => {
23
+ execFile('git', args, {
24
+ cwd,
25
+ timeout: PROBE_TIMEOUT_MS,
26
+ maxBuffer: 4 * 1024 * 1024,
27
+ env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' },
28
+ }, (error, stdout) => {
29
+ if (error)
30
+ return rejectPromise(error);
31
+ resolvePromise(stdout);
32
+ });
33
+ });
34
+ }
35
+ /**
36
+ * Probe the git snapshot for `cwd`, or null when it isn't inside a git work
37
+ * tree. One `rev-parse` answers the root question (and gates non-repos), then
38
+ * branch + numstat. `counts` failure (e.g. racing a concurrent git write) is
39
+ * distinct from a clean tree: callers keep previous numbers.
40
+ */
41
+ export async function probeGitStatus(cwd) {
42
+ try {
43
+ const root = (await runGit(cwd, ['rev-parse', '--show-toplevel'])).trim();
44
+ if (!root)
45
+ return null;
46
+ let branch = (await runGit(root, ['branch', '--show-current'])).trim();
47
+ if (!branch) {
48
+ // Detached HEAD: short sha
49
+ branch = (await runGit(root, ['rev-parse', '--short', 'HEAD'])).trim();
50
+ }
51
+ let added = 0;
52
+ let removed = 0;
53
+ try {
54
+ const numstat = await runGit(root, ['diff', '--numstat', 'HEAD']);
55
+ for (const line of numstat.split('\n')) {
56
+ if (!line)
57
+ continue;
58
+ const parts = line.split('\t');
59
+ // Binary files report "-\t-\tpath" and don't contribute a line count.
60
+ const a = parseInt(parts[0], 10);
61
+ const r = parseInt(parts[1], 10);
62
+ if (Number.isFinite(a))
63
+ added += a;
64
+ if (Number.isFinite(r))
65
+ removed += r;
66
+ }
67
+ }
68
+ catch {
69
+ // diff raced a concurrent write: report branch-only rather than a
70
+ // fake clean tree.
71
+ }
72
+ return { branch, added, removed };
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ /**
79
+ * Process-wide cache keyed by work-tree root, with in-flight dedupe and
80
+ * per-root throttling. Probes run through `beginProbe`; the caller decides
81
+ * what to do with the result (cache it, broadcast it).
82
+ */
83
+ export class GitStatusCache {
84
+ entries = new Map();
85
+ inFlight = new Map();
86
+ get(root) {
87
+ return this.entries.get(root)?.status;
88
+ }
89
+ /**
90
+ * Start a probe for `cwd` unless one is already in flight for the same
91
+ * tree or the last probe finished less than `minIntervalMs` ago. Returns
92
+ * null when the trigger was dropped (throttled/deduped).
93
+ */
94
+ beginProbe(cwd, minIntervalMs = DEFAULT_MIN_INTERVAL_MS) {
95
+ const key = cwd;
96
+ const last = this.entries.get(key);
97
+ if (last && Date.now() - last.probedAt < minIntervalMs)
98
+ return null;
99
+ const pending = this.inFlight.get(key);
100
+ if (pending)
101
+ return pending;
102
+ const probe = probeGitStatus(cwd)
103
+ .then((status) => {
104
+ this.entries.set(key, { status, probedAt: Date.now() });
105
+ return status;
106
+ })
107
+ .finally(() => {
108
+ this.inFlight.delete(key);
109
+ });
110
+ this.inFlight.set(key, probe);
111
+ return probe;
112
+ }
113
+ }
114
+ export const gitStatusCache = new GitStatusCache();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-BBUMzzeH.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,a as s,c as t,C as e}from"./chunk-V7JOEXUC-DubthR3B.js";import{b as i}from"./mermaid.core-BBUMzzeH.js";import"./chunk-5VM5RSS4-YOIRo4TG.js";import"./chunk-XXDRQBXY-BEp2DDT5.js";import"./chunk-VR4S4FIN-Br17FuD9.js";import"./chunk-32BRIVSS-BjGUsxBo.js";import"./purify.es-CC4Brkr_.js";import"./index-BeJrvXOJ.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
@@ -1 +0,0 @@
1
- import{s as a,a as s,c as t,C as e}from"./chunk-V7JOEXUC-DubthR3B.js";import{b as i}from"./mermaid.core-BBUMzzeH.js";import"./chunk-5VM5RSS4-YOIRo4TG.js";import"./chunk-XXDRQBXY-BEp2DDT5.js";import"./chunk-VR4S4FIN-Br17FuD9.js";import"./chunk-32BRIVSS-BjGUsxBo.js";import"./purify.es-CC4Brkr_.js";import"./index-BeJrvXOJ.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};