cc-viewer 1.7.2 → 1.7.4

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 (98) hide show
  1. package/cli.js +109 -20
  2. package/dist/assets/App-CKvCavmF.js +2 -0
  3. package/dist/assets/App-Dj37fluO.css +1 -0
  4. package/dist/assets/{MdxEditorPanel-BUubiE6Y.js → MdxEditorPanel-DeSJp_ct.js} +1 -1
  5. package/dist/assets/{Mobile-CKmfRRvo.js → Mobile-CWou-jtF.js} +1 -1
  6. package/dist/assets/{_baseUniq-D9_E5ZDp.js → _baseUniq-BK7Nhp_x.js} +1 -1
  7. package/dist/assets/{arc-D4iFrlhb.js → arc-Cm4HMXz6.js} +1 -1
  8. package/dist/assets/{architectureDiagram-Q4EWVU46-f1neo7hg.js → architectureDiagram-Q4EWVU46-Co8QCowN.js} +1 -1
  9. package/dist/assets/{blockDiagram-DXYQGD6D-DWi9e9tG.js → blockDiagram-DXYQGD6D-Cudecf7x.js} +1 -1
  10. package/dist/assets/{c4Diagram-AHTNJAMY-DAdj49A2.js → c4Diagram-AHTNJAMY-4JeFoCHX.js} +1 -1
  11. package/dist/assets/{channel-B3VthT0m.js → channel-K7eT7Hjr.js} +1 -1
  12. package/dist/assets/{chunk-4BX2VUAB-BrPcAHV3.js → chunk-4BX2VUAB-BBjl6EVW.js} +1 -1
  13. package/dist/assets/{chunk-4TB4RGXK-Bvopc1V9.js → chunk-4TB4RGXK-DBP9YnwO.js} +1 -1
  14. package/dist/assets/{chunk-55IACEB6-Juw-7Z3i.js → chunk-55IACEB6--A_i9gwR.js} +1 -1
  15. package/dist/assets/{chunk-EDXVE4YY-DVYP9tpB.js → chunk-EDXVE4YY-UBsL-3qr.js} +1 -1
  16. package/dist/assets/{chunk-FMBD7UC4-VQ7VOXl3.js → chunk-FMBD7UC4-DBO0asmI.js} +1 -1
  17. package/dist/assets/{chunk-OYMX7WX6-F8Rj4ZUZ.js → chunk-OYMX7WX6-DOCcEaE6.js} +1 -1
  18. package/dist/assets/{chunk-QZHKN3VN-Dn7K3yi9.js → chunk-QZHKN3VN-B-j8QbQh.js} +1 -1
  19. package/dist/assets/{chunk-YZCP3GAM-UjO-KTsn.js → chunk-YZCP3GAM-B0WO1U-U.js} +1 -1
  20. package/dist/assets/classDiagram-6PBFFD2Q-Ba3tOmih.js +1 -0
  21. package/dist/assets/classDiagram-v2-HSJHXN6E-Ba3tOmih.js +1 -0
  22. package/dist/assets/clone-DjURvTeN.js +1 -0
  23. package/dist/assets/{cose-bilkent-S5V4N54A-BDhNj8rq.js → cose-bilkent-S5V4N54A-DQgpss_a.js} +1 -1
  24. package/dist/assets/{dagre-KV5264BT-BzdcDuyt.js → dagre-KV5264BT-CCJBKmKv.js} +1 -1
  25. package/dist/assets/{diagram-5BDNPKRD-DP_SX65N.js → diagram-5BDNPKRD-DgUcnfkU.js} +1 -1
  26. package/dist/assets/{diagram-G4DWMVQ6-B-pBFw8Q.js → diagram-G4DWMVQ6-CRpVvexw.js} +1 -1
  27. package/dist/assets/{diagram-MMDJMWI5-6XSfN1eN.js → diagram-MMDJMWI5-C3IhpsM-.js} +1 -1
  28. package/dist/assets/{diagram-TYMM5635-DJvGxvpE.js → diagram-TYMM5635-BaVbsrwt.js} +1 -1
  29. package/dist/assets/{erDiagram-SMLLAGMA-CpqdpGYj.js → erDiagram-SMLLAGMA-BxRoBUR8.js} +1 -1
  30. package/dist/assets/{flowDiagram-DWJPFMVM-C9m7wjwI.js → flowDiagram-DWJPFMVM-Du2lIzoM.js} +1 -1
  31. package/dist/assets/{ganttDiagram-T4ZO3ILL-CU0XOfY3.js → ganttDiagram-T4ZO3ILL-DR1pDqLK.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-UUTBAWPF-ipyGULnP.js → gitGraphDiagram-UUTBAWPF-DHAmE20O.js} +1 -1
  33. package/dist/assets/{graph-BR2KmES9.js → graph-D8Yv0IU1.js} +1 -1
  34. package/dist/assets/{index-C-be29ey.js → index-AOmFG_I_.js} +1 -1
  35. package/dist/assets/{index-D5tSeMU7.js → index-B6ZWIxY0.js} +1 -1
  36. package/dist/assets/{index-D5YruOKD.js → index-Bq95HjYM.js} +1 -1
  37. package/dist/assets/{index--wgRW_OB.js → index-D0pvxpcl.js} +1 -1
  38. package/dist/assets/{index-DuZQ6FqR.js → index-D2c77__8.js} +1 -1
  39. package/dist/assets/{index-C16fiVhv.js → index-DgtUyP57.js} +1 -1
  40. package/dist/assets/{index-CjsQEQc2.js → index-Dpu92rw_.js} +2 -2
  41. package/dist/assets/{index-OWzSX2T8.js → index-cCB-lhEO.js} +1 -1
  42. package/dist/assets/{infoDiagram-42DDH7IO-BQWQjfFX.js → infoDiagram-42DDH7IO-BAqRIm2G.js} +1 -1
  43. package/dist/assets/{ishikawaDiagram-UXIWVN3A-Df-KH_Hz.js → ishikawaDiagram-UXIWVN3A-CzH4tezb.js} +1 -1
  44. package/dist/assets/{journeyDiagram-VCZTEJTY-CMbB_4G9.js → journeyDiagram-VCZTEJTY-Qs4eiyuI.js} +1 -1
  45. package/dist/assets/{jszip.min-B6k2t9Ch.js → jszip.min-C0OccDsk.js} +1 -1
  46. package/dist/assets/{kanban-definition-6JOO6SKY-CImdlKN3.js → kanban-definition-6JOO6SKY-BAjl0gpV.js} +1 -1
  47. package/dist/assets/{layout-DQl4aw09.js → layout-Cf6cd9xE.js} +1 -1
  48. package/dist/assets/{linear-CLD3aPlK.js → linear-PzdCkji6.js} +1 -1
  49. package/dist/assets/mermaid.core-DV9745Lq.js +7 -0
  50. package/dist/assets/{min-_D86henJ.js → min-CHgWxbzS.js} +1 -1
  51. package/dist/assets/{mindmap-definition-QFDTVHPH-2JVcu1nk.js → mindmap-definition-QFDTVHPH-CHUjMdpi.js} +1 -1
  52. package/dist/assets/{pieDiagram-DEJITSTG-Dik-m5u7.js → pieDiagram-DEJITSTG-D_r2QC0f.js} +1 -1
  53. package/dist/assets/{quadrantDiagram-34T5L4WZ-Bm5l40Jq.js → quadrantDiagram-34T5L4WZ-DPzGygdN.js} +1 -1
  54. package/dist/assets/{requirementDiagram-MS252O5E-Ck9w5rTj.js → requirementDiagram-MS252O5E-BA2ynnGb.js} +1 -1
  55. package/dist/assets/{sankeyDiagram-XADWPNL6-BbGVCFEf.js → sankeyDiagram-XADWPNL6-XHVvXuqU.js} +1 -1
  56. package/dist/assets/{seqResourceLoaders-DFrHmgnK.css → seqResourceLoaders-0RXZfUKp.css} +1 -1
  57. package/dist/assets/seqResourceLoaders-kBEzcKLh.js +2 -0
  58. package/dist/assets/{sequenceDiagram-FGHM5R23-vjvEdksk.js → sequenceDiagram-FGHM5R23-C47sA8YH.js} +1 -1
  59. package/dist/assets/{stateDiagram-FHFEXIEX-DTqMoiB2.js → stateDiagram-FHFEXIEX-BOmer839.js} +1 -1
  60. package/dist/assets/{stateDiagram-v2-QKLJ7IA2-CNbAwnhu.js → stateDiagram-v2-QKLJ7IA2-D-kVvTHA.js} +1 -1
  61. package/dist/assets/{timeline-definition-GMOUNBTQ-Cw8O-52d.js → timeline-definition-GMOUNBTQ-CTAKVZgs.js} +1 -1
  62. package/dist/assets/{vendor-antd-DI7JL-mE.js → vendor-antd-BuJ6oz45.js} +2 -2
  63. package/dist/assets/{vendor-codemirror-B9c49dtM.js → vendor-codemirror-D2KAW4ty.js} +1 -1
  64. package/dist/assets/{vendor-mdxeditor-B6cpBtIE.js → vendor-mdxeditor-BsFVVUcj.js} +2 -2
  65. package/dist/assets/{vendor-qrcode-Dn90-s-u.js → vendor-qrcode-BpxSq04x.js} +1 -1
  66. package/dist/assets/{vendor-virtuoso-CpdSKD_6.js → vendor-virtuoso-an4WvAvS.js} +1 -1
  67. package/dist/assets/{vennDiagram-DHZGUBPP-DCuqymb7.js → vennDiagram-DHZGUBPP-CuXzoroh.js} +1 -1
  68. package/dist/assets/{wardley-RL74JXVD-BJ20wJUU.js → wardley-RL74JXVD-CFCmxnck.js} +1 -1
  69. package/dist/assets/{wardleyDiagram-NUSXRM2D-Vz6US3qt.js → wardleyDiagram-NUSXRM2D-gfhDB9SR.js} +1 -1
  70. package/dist/assets/{xychartDiagram-5P7HB3ND-CzkLKrmi.js → xychartDiagram-5P7HB3ND-X-pj66qI.js} +1 -1
  71. package/dist/index.html +4 -4
  72. package/package.json +1 -1
  73. package/server/i18n.js +120 -55
  74. package/server/interceptor.js +72 -2
  75. package/server/lib/ccswitch-import.js +251 -0
  76. package/server/lib/ensure-hooks.js +28 -2
  77. package/server/lib/log-watcher.js +8 -0
  78. package/server/lib/pid-alive.js +15 -0
  79. package/server/lib/proxy-retry.js +716 -0
  80. package/server/lib/session-start-bridge.js +121 -0
  81. package/server/lib/settings-merge.js +170 -0
  82. package/server/lib/v2/live-feed.js +189 -48
  83. package/server/lib/v2/session-owner.js +135 -0
  84. package/server/lib/v2/session-select.js +15 -2
  85. package/server/lib/v2/v2-writer.js +181 -6
  86. package/server/proxy.js +115 -11
  87. package/server/pty-manager.js +28 -4
  88. package/server/routes/events.js +44 -0
  89. package/server/routes/preferences.js +184 -1
  90. package/server/server.js +15 -1
  91. package/src/utils/contentFilter.js +17 -1
  92. package/dist/assets/App-B224r-8M.js +0 -2
  93. package/dist/assets/App-dYPa5-df.css +0 -1
  94. package/dist/assets/classDiagram-6PBFFD2Q-DmSozxoO.js +0 -1
  95. package/dist/assets/classDiagram-v2-HSJHXN6E-DmSozxoO.js +0 -1
  96. package/dist/assets/clone-BQtvy9Ae.js +0 -1
  97. package/dist/assets/mermaid.core-CN35dvKJ.js +0 -7
  98. package/dist/assets/seqResourceLoaders-C-T_EMiO.js +0 -2
@@ -78,7 +78,7 @@ function _looksStaleManagedCommand(cmd) {
78
78
 
79
79
  function _purgeStaleManagedHooks(settings) {
80
80
  let removed = 0;
81
- for (const sectionKey of ['PreToolUse', 'Stop']) {
81
+ for (const sectionKey of ['PreToolUse', 'Stop', 'SessionStart']) {
82
82
  const arr = settings.hooks?.[sectionKey];
83
83
  if (!Array.isArray(arr)) continue;
84
84
  for (let i = arr.length - 1; i >= 0; i--) {
@@ -99,7 +99,7 @@ function _purgeStaleManagedHooks(settings) {
99
99
  // 调用方负责 atomic write-back。返回 removed 数量。
100
100
  export function removeAllManagedHooks(settings) {
101
101
  let removed = 0;
102
- for (const sectionKey of ['PreToolUse', 'Stop']) {
102
+ for (const sectionKey of ['PreToolUse', 'Stop', 'SessionStart']) {
103
103
  const arr = settings.hooks?.[sectionKey];
104
104
  if (!Array.isArray(arr)) continue;
105
105
  for (let i = arr.length - 1; i >= 0; i--) {
@@ -129,6 +129,7 @@ export function ensureHooks() {
129
129
  if (!settings.hooks) settings.hooks = {};
130
130
  if (!Array.isArray(settings.hooks.PreToolUse)) settings.hooks.PreToolUse = [];
131
131
  if (!Array.isArray(settings.hooks.Stop)) settings.hooks.Stop = [];
132
+ if (!Array.isArray(settings.hooks.SessionStart)) settings.hooks.SessionStart = [];
132
133
 
133
134
  let changed = false;
134
135
  // 先一次性清掉「path 已 stale 但还带 cc-viewer-managed marker」的老条目,
@@ -214,6 +215,31 @@ export function ensureHooks() {
214
215
  changed = true;
215
216
  }
216
217
 
218
+ // SessionStart hook → session-start-bridge.js. Fires on startup/resume/
219
+ // clear/compact; no matcher (= all sources) — the bridge forwards `source`
220
+ // and the server gates on it. The `resume` source is the conversation-
221
+ // switch signal the V2Writer needs to re-bind routing after an in-terminal
222
+ // /resume (the wire session_id may not change, so no wire-level signal
223
+ // exists). Same CCVIEWER_PORT guard pattern as the other bridges.
224
+ const sessionStartBridgePath = resolve(SERVER_LIB, 'session-start-bridge.js');
225
+ const sessionStartCmd = `[ -n "$CCVIEWER_PORT" ] && node "${sessionStartBridgePath}" || true ${CCV_HOOK_MARKER}`;
226
+ const sessionStartDesired = _buildHookObj(sessionStartCmd);
227
+ const sessionStartExisting = settings.hooks.SessionStart.find(h => {
228
+ const cmd = h.hooks?.[0]?.command || '';
229
+ return cmd.includes('session-start-bridge.js');
230
+ });
231
+ if (sessionStartExisting) {
232
+ if (!_hookObjEqual(sessionStartExisting.hooks?.[0], sessionStartDesired)) {
233
+ sessionStartExisting.hooks = [_mergeHookObj(sessionStartExisting.hooks?.[0], sessionStartDesired)];
234
+ changed = true;
235
+ }
236
+ } else {
237
+ settings.hooks.SessionStart.push({
238
+ hooks: [sessionStartDesired],
239
+ });
240
+ changed = true;
241
+ }
242
+
217
243
  if (changed) {
218
244
  mkdirSync(claudeDir, { recursive: true });
219
245
  // Atomic write(): write to a sibling temp file then rename. Concurrent
@@ -92,7 +92,12 @@ function _safeSseWrite(clients, client, payload) {
92
92
  return true;
93
93
  }
94
94
 
95
+ // Zero-client short-circuit (all four senders): the payload template is built
96
+ // BEFORE the client loop, so with no SSE consumer connected every broadcast
97
+ // still paid a full JSON.stringify — for reconstructed entries carrying
98
+ // cumulative messages that is a giant allocation for nothing.
95
99
  export function sendToClients(clients, entry) {
100
+ if (clients.length === 0) return;
96
101
  const payload = `data: ${JSON.stringify(entry)}\n\n`;
97
102
  for (let i = clients.length - 1; i >= 0; i--) {
98
103
  _safeSseWrite(clients, clients[i], payload);
@@ -100,6 +105,7 @@ export function sendToClients(clients, entry) {
100
105
  }
101
106
 
102
107
  export function sendEventToClients(clients, eventName, data) {
108
+ if (clients.length === 0) return;
103
109
  const payload = `event: ${eventName}\ndata: ${JSON.stringify(data)}\n\n`;
104
110
  for (let i = clients.length - 1; i >= 0; i--) {
105
111
  _safeSseWrite(clients, clients[i], payload);
@@ -109,6 +115,7 @@ export function sendEventToClients(clients, eventName, data) {
109
115
  /** Like sendEventToClients but `json` is an ALREADY-serialized JSON string —
110
116
  * wire v3 forwards raw stored lines verbatim without a parse/stringify trip. */
111
117
  export function sendEventRawToClients(clients, eventName, json) {
118
+ if (clients.length === 0) return;
112
119
  const payload = `event: ${eventName}\ndata: ${json}\n\n`;
113
120
  for (let i = clients.length - 1; i >= 0; i--) {
114
121
  _safeSseWrite(clients, clients[i], payload);
@@ -116,6 +123,7 @@ export function sendEventRawToClients(clients, eventName, json) {
116
123
  }
117
124
 
118
125
  export function sendChunkToClients(clients, dataJson) {
126
+ if (clients.length === 0) return;
119
127
  const payload = `event: load_chunk\ndata: ${dataJson}\n\n`;
120
128
  for (let i = clients.length - 1; i >= 0; i--) {
121
129
  _safeSseWrite(clients, clients[i], payload);
@@ -0,0 +1,15 @@
1
+ // Process-liveness probe shared by pid-validity claims (session-owner.js).
2
+ // Deliberately dependency-free: im-lock.js's identical helper drags findcc.js
3
+ // (LOG_DIR env resolution, a top-level node:worker_threads threadId import)
4
+ // into every importer's module graph — the stats worker's loader shim has no
5
+ // threadId export, and the v2 writer's synchronous ingest path doesn't want
6
+ // node:http along for the ride. im-lock.js / async-file-lock.js keep their
7
+ // local copies (same semantics); consolidation is backlog.
8
+
9
+ /** Is `pid` alive? Signal 0 probes without delivering; EPERM means the
10
+ * process exists but belongs to another user (still alive). */
11
+ export function isPidAlive(pid) {
12
+ if (!Number.isInteger(pid) || pid <= 0) return false;
13
+ try { process.kill(pid, 0); return true; }
14
+ catch (e) { return e && e.code === 'EPERM'; }
15
+ }