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.
- package/cli.js +109 -20
- package/dist/assets/App-CKvCavmF.js +2 -0
- package/dist/assets/App-Dj37fluO.css +1 -0
- package/dist/assets/{MdxEditorPanel-BUubiE6Y.js → MdxEditorPanel-DeSJp_ct.js} +1 -1
- package/dist/assets/{Mobile-CKmfRRvo.js → Mobile-CWou-jtF.js} +1 -1
- package/dist/assets/{_baseUniq-D9_E5ZDp.js → _baseUniq-BK7Nhp_x.js} +1 -1
- package/dist/assets/{arc-D4iFrlhb.js → arc-Cm4HMXz6.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-f1neo7hg.js → architectureDiagram-Q4EWVU46-Co8QCowN.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-DWi9e9tG.js → blockDiagram-DXYQGD6D-Cudecf7x.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-DAdj49A2.js → c4Diagram-AHTNJAMY-4JeFoCHX.js} +1 -1
- package/dist/assets/{channel-B3VthT0m.js → channel-K7eT7Hjr.js} +1 -1
- package/dist/assets/{chunk-4BX2VUAB-BrPcAHV3.js → chunk-4BX2VUAB-BBjl6EVW.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-Bvopc1V9.js → chunk-4TB4RGXK-DBP9YnwO.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-Juw-7Z3i.js → chunk-55IACEB6--A_i9gwR.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-DVYP9tpB.js → chunk-EDXVE4YY-UBsL-3qr.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-VQ7VOXl3.js → chunk-FMBD7UC4-DBO0asmI.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-F8Rj4ZUZ.js → chunk-OYMX7WX6-DOCcEaE6.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-Dn7K3yi9.js → chunk-QZHKN3VN-B-j8QbQh.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-UjO-KTsn.js → chunk-YZCP3GAM-B0WO1U-U.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-Ba3tOmih.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-Ba3tOmih.js +1 -0
- package/dist/assets/clone-DjURvTeN.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-BDhNj8rq.js → cose-bilkent-S5V4N54A-DQgpss_a.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-BzdcDuyt.js → dagre-KV5264BT-CCJBKmKv.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-DP_SX65N.js → diagram-5BDNPKRD-DgUcnfkU.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-B-pBFw8Q.js → diagram-G4DWMVQ6-CRpVvexw.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-6XSfN1eN.js → diagram-MMDJMWI5-C3IhpsM-.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-DJvGxvpE.js → diagram-TYMM5635-BaVbsrwt.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-CpqdpGYj.js → erDiagram-SMLLAGMA-BxRoBUR8.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-C9m7wjwI.js → flowDiagram-DWJPFMVM-Du2lIzoM.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-CU0XOfY3.js → ganttDiagram-T4ZO3ILL-DR1pDqLK.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-ipyGULnP.js → gitGraphDiagram-UUTBAWPF-DHAmE20O.js} +1 -1
- package/dist/assets/{graph-BR2KmES9.js → graph-D8Yv0IU1.js} +1 -1
- package/dist/assets/{index-C-be29ey.js → index-AOmFG_I_.js} +1 -1
- package/dist/assets/{index-D5tSeMU7.js → index-B6ZWIxY0.js} +1 -1
- package/dist/assets/{index-D5YruOKD.js → index-Bq95HjYM.js} +1 -1
- package/dist/assets/{index--wgRW_OB.js → index-D0pvxpcl.js} +1 -1
- package/dist/assets/{index-DuZQ6FqR.js → index-D2c77__8.js} +1 -1
- package/dist/assets/{index-C16fiVhv.js → index-DgtUyP57.js} +1 -1
- package/dist/assets/{index-CjsQEQc2.js → index-Dpu92rw_.js} +2 -2
- package/dist/assets/{index-OWzSX2T8.js → index-cCB-lhEO.js} +1 -1
- package/dist/assets/{infoDiagram-42DDH7IO-BQWQjfFX.js → infoDiagram-42DDH7IO-BAqRIm2G.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-Df-KH_Hz.js → ishikawaDiagram-UXIWVN3A-CzH4tezb.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-CMbB_4G9.js → journeyDiagram-VCZTEJTY-Qs4eiyuI.js} +1 -1
- package/dist/assets/{jszip.min-B6k2t9Ch.js → jszip.min-C0OccDsk.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-CImdlKN3.js → kanban-definition-6JOO6SKY-BAjl0gpV.js} +1 -1
- package/dist/assets/{layout-DQl4aw09.js → layout-Cf6cd9xE.js} +1 -1
- package/dist/assets/{linear-CLD3aPlK.js → linear-PzdCkji6.js} +1 -1
- package/dist/assets/mermaid.core-DV9745Lq.js +7 -0
- package/dist/assets/{min-_D86henJ.js → min-CHgWxbzS.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-2JVcu1nk.js → mindmap-definition-QFDTVHPH-CHUjMdpi.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-Dik-m5u7.js → pieDiagram-DEJITSTG-D_r2QC0f.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-Bm5l40Jq.js → quadrantDiagram-34T5L4WZ-DPzGygdN.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-Ck9w5rTj.js → requirementDiagram-MS252O5E-BA2ynnGb.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-BbGVCFEf.js → sankeyDiagram-XADWPNL6-XHVvXuqU.js} +1 -1
- package/dist/assets/{seqResourceLoaders-DFrHmgnK.css → seqResourceLoaders-0RXZfUKp.css} +1 -1
- package/dist/assets/seqResourceLoaders-kBEzcKLh.js +2 -0
- package/dist/assets/{sequenceDiagram-FGHM5R23-vjvEdksk.js → sequenceDiagram-FGHM5R23-C47sA8YH.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-DTqMoiB2.js → stateDiagram-FHFEXIEX-BOmer839.js} +1 -1
- package/dist/assets/{stateDiagram-v2-QKLJ7IA2-CNbAwnhu.js → stateDiagram-v2-QKLJ7IA2-D-kVvTHA.js} +1 -1
- package/dist/assets/{timeline-definition-GMOUNBTQ-Cw8O-52d.js → timeline-definition-GMOUNBTQ-CTAKVZgs.js} +1 -1
- package/dist/assets/{vendor-antd-DI7JL-mE.js → vendor-antd-BuJ6oz45.js} +2 -2
- package/dist/assets/{vendor-codemirror-B9c49dtM.js → vendor-codemirror-D2KAW4ty.js} +1 -1
- package/dist/assets/{vendor-mdxeditor-B6cpBtIE.js → vendor-mdxeditor-BsFVVUcj.js} +2 -2
- package/dist/assets/{vendor-qrcode-Dn90-s-u.js → vendor-qrcode-BpxSq04x.js} +1 -1
- package/dist/assets/{vendor-virtuoso-CpdSKD_6.js → vendor-virtuoso-an4WvAvS.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-DCuqymb7.js → vennDiagram-DHZGUBPP-CuXzoroh.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-BJ20wJUU.js → wardley-RL74JXVD-CFCmxnck.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-Vz6US3qt.js → wardleyDiagram-NUSXRM2D-gfhDB9SR.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-CzkLKrmi.js → xychartDiagram-5P7HB3ND-X-pj66qI.js} +1 -1
- package/dist/index.html +4 -4
- package/package.json +1 -1
- package/server/i18n.js +120 -55
- package/server/interceptor.js +72 -2
- package/server/lib/ccswitch-import.js +251 -0
- package/server/lib/ensure-hooks.js +28 -2
- package/server/lib/log-watcher.js +8 -0
- package/server/lib/pid-alive.js +15 -0
- package/server/lib/proxy-retry.js +716 -0
- package/server/lib/session-start-bridge.js +121 -0
- package/server/lib/settings-merge.js +170 -0
- package/server/lib/v2/live-feed.js +189 -48
- package/server/lib/v2/session-owner.js +135 -0
- package/server/lib/v2/session-select.js +15 -2
- package/server/lib/v2/v2-writer.js +181 -6
- package/server/proxy.js +115 -11
- package/server/pty-manager.js +28 -4
- package/server/routes/events.js +44 -0
- package/server/routes/preferences.js +184 -1
- package/server/server.js +15 -1
- package/src/utils/contentFilter.js +17 -1
- package/dist/assets/App-B224r-8M.js +0 -2
- package/dist/assets/App-dYPa5-df.css +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-DmSozxoO.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-DmSozxoO.js +0 -1
- package/dist/assets/clone-BQtvy9Ae.js +0 -1
- package/dist/assets/mermaid.core-CN35dvKJ.js +0 -7
- 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
|
+
}
|