cc-viewer 1.6.93 → 1.6.95
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 +116 -6
- package/dist/assets/{App-hH0rDzOq.js → App-D-Apw-as.js} +16 -16
- package/dist/assets/AppHeader-B2WxpwwK.css +41 -0
- package/dist/assets/{AppHeader.module-_fn3e-3Y.js → AppHeader.module-DsVA04H2.js} +164 -164
- package/dist/assets/Mobile-RajPnX3l.js +10 -0
- package/dist/assets/{_basePickBy-Dwc6xlH0.js → _basePickBy-BJEP1GYD.js} +1 -1
- package/dist/assets/{_baseUniq-CIhWoRX6.js → _baseUniq-BubLHFZN.js} +1 -1
- package/dist/assets/{arc-ClMosRWS.js → arc-DQ_H2ge5.js} +1 -1
- package/dist/assets/{architectureDiagram-2XIMDMQ5-CiuBPipP.js → architectureDiagram-2XIMDMQ5-DxzXyiQV.js} +1 -1
- package/dist/assets/{blockDiagram-WCTKOSBZ-Bifbw0Pj.js → blockDiagram-WCTKOSBZ-Oko9Xh01.js} +1 -1
- package/dist/assets/{c4Diagram-IC4MRINW-Dwx54q11.js → c4Diagram-IC4MRINW-BWMun8B6.js} +1 -1
- package/dist/assets/channel-JA0OGVbb.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-BQo_Scg4.js → chunk-4BX2VUAB-D4f3BBSj.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-DmMYL0yS.js → chunk-55IACEB6-DEELbrpC.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-D54EDOVv.js → chunk-FMBD7UC4-BMDopkZI.js} +1 -1
- package/dist/assets/{chunk-JSJVCQXG-C4wM91-8.js → chunk-JSJVCQXG-Bl2ge6LE.js} +1 -1
- package/dist/assets/{chunk-KX2RTZJC-BuTQbTst.js → chunk-KX2RTZJC-D6-v2Nwr.js} +1 -1
- package/dist/assets/{chunk-NQ4KR5QH-pwWGt1sO.js → chunk-NQ4KR5QH-CPoQIkEQ.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-DzdyrpMz.js → chunk-QZHKN3VN-5ObFPC7D.js} +1 -1
- package/dist/assets/{chunk-WL4C6EOR-BsqkjkKt.js → chunk-WL4C6EOR-Brx2xle-.js} +1 -1
- package/dist/assets/classDiagram-VBA2DB6C-DBQK8T70.js +1 -0
- package/dist/assets/classDiagram-v2-RAHNMMFH-DBQK8T70.js +1 -0
- package/dist/assets/clone-B_6tGAmz.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-C_Zw3kps.js → cose-bilkent-S5V4N54A-BtTL0awI.js} +1 -1
- package/dist/assets/{dagre-KLK3FWXG-BBym-Z-r.js → dagre-KLK3FWXG-BnJdU6vj.js} +1 -1
- package/dist/assets/{diagram-E7M64L7V-CJK3xILI.js → diagram-E7M64L7V-DqmlnmsM.js} +1 -1
- package/dist/assets/{diagram-IFDJBPK2-CG0k9GmI.js → diagram-IFDJBPK2-CSfBzoTw.js} +1 -1
- package/dist/assets/{diagram-P4PSJMXO-BHJpgqgl.js → diagram-P4PSJMXO-W_YBtuzb.js} +1 -1
- package/dist/assets/{erDiagram-INFDFZHY-DY2TxE9e.js → erDiagram-INFDFZHY-BrXGXwQp.js} +1 -1
- package/dist/assets/{flowDiagram-PKNHOUZH-C6ujoYh5.js → flowDiagram-PKNHOUZH-D1qO_ftR.js} +1 -1
- package/dist/assets/{ganttDiagram-A5KZAMGK-DacCPw0V.js → ganttDiagram-A5KZAMGK-Dj8Dz895.js} +1 -1
- package/dist/assets/{gitGraphDiagram-K3NZZRJ6-1Hd4fFZI.js → gitGraphDiagram-K3NZZRJ6-CbtCyig0.js} +1 -1
- package/dist/assets/{graph-D8YLYosB.js → graph-BSyLsRRZ.js} +1 -1
- package/dist/assets/{index-DLkyZ-Zb.js → index-JcYe5KP6.js} +2 -2
- package/dist/assets/{infoDiagram-LFFYTUFH-ClN29cDZ.js → infoDiagram-LFFYTUFH-Dt7Cxc1A.js} +1 -1
- package/dist/assets/{ishikawaDiagram-PHBUUO56-DDgBFnJ4.js → ishikawaDiagram-PHBUUO56-BATp1eBz.js} +1 -1
- package/dist/assets/{journeyDiagram-4ABVD52K-Cl9xLEhq.js → journeyDiagram-4ABVD52K-Cuk87Qh1.js} +1 -1
- package/dist/assets/{kanban-definition-K7BYSVSG-CBfTb1XX.js → kanban-definition-K7BYSVSG-dNdjELb5.js} +1 -1
- package/dist/assets/{layout-BSGsZPU6.js → layout-ikzzHuR8.js} +1 -1
- package/dist/assets/{linear-Cm4oUzYV.js → linear-BBrDskBJ.js} +1 -1
- package/dist/assets/{mermaid.core-Bfq98W72.js → mermaid.core-TSkGvSH8.js} +4 -4
- package/dist/assets/{mindmap-definition-YRQLILUH-S_0pZiXc.js → mindmap-definition-YRQLILUH-CtDrb2x9.js} +1 -1
- package/dist/assets/{pieDiagram-SKSYHLDU-CUof-7Ag.js → pieDiagram-SKSYHLDU-bkNmBvtc.js} +1 -1
- package/dist/assets/{quadrantDiagram-337W2JSQ-74oAPb7-.js → quadrantDiagram-337W2JSQ-Byl5XeRq.js} +1 -1
- package/dist/assets/{requirementDiagram-Z7DCOOCP-Dx_1a8Sm.js → requirementDiagram-Z7DCOOCP-CZTVT8Rt.js} +1 -1
- package/dist/assets/{sankeyDiagram-WA2Y5GQK-Ollqup46.js → sankeyDiagram-WA2Y5GQK-xmaiO1U4.js} +1 -1
- package/dist/assets/{sequenceDiagram-2WXFIKYE-CUQdI1hH.js → sequenceDiagram-2WXFIKYE-DjXGcDqg.js} +1 -1
- package/dist/assets/{stateDiagram-RAJIS63D-DA4bEZTV.js → stateDiagram-RAJIS63D-42-_6Ebg.js} +1 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-Dk8cVTL7.js +1 -0
- package/dist/assets/{timeline-definition-YZTLITO2-hIqAiIh9.js → timeline-definition-YZTLITO2-DMCYajRr.js} +1 -1
- package/dist/assets/{treemap-KZPCXAKY-BPMtLzV0.js → treemap-KZPCXAKY-BHYJalU8.js} +1 -1
- package/dist/assets/{vennDiagram-LZ73GAT5-8C63L59W.js → vennDiagram-LZ73GAT5-DlJJRJ0l.js} +1 -1
- package/dist/assets/{xychartDiagram-JWTSCODW-rb793_nJ.js → xychartDiagram-JWTSCODW-GeZvsPf-.js} +1 -1
- package/dist/index.html +2 -2
- package/i18n.js +3 -3
- package/lib/perm-bridge.js +27 -18
- package/lib/sdk-adapter.js +77 -0
- package/lib/sdk-manager.js +464 -0
- package/package.json +5 -2
- package/server.js +58 -4
- package/dist/assets/AppHeader-DN09T_4w.css +0 -41
- package/dist/assets/Mobile-DfiaHmP0.js +0 -10
- package/dist/assets/channel-CA7t6n2N.js +0 -1
- package/dist/assets/classDiagram-VBA2DB6C-iCP3aAMs.js +0 -1
- package/dist/assets/classDiagram-v2-RAHNMMFH-iCP3aAMs.js +0 -1
- package/dist/assets/clone-DykZ1sNt.js +0 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-DaqDUk5Z.js +0 -1
package/cli.js
CHANGED
|
@@ -256,7 +256,7 @@ async function runProxyCommand(args) {
|
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
-
function
|
|
259
|
+
function ensureHooks() {
|
|
260
260
|
try {
|
|
261
261
|
const claudeDir = resolve(homedir(), '.claude');
|
|
262
262
|
const settingsPath = resolve(claudeDir, 'settings.json');
|
|
@@ -288,10 +288,22 @@ function ensureAskHook() {
|
|
|
288
288
|
changed = true;
|
|
289
289
|
}
|
|
290
290
|
|
|
291
|
-
// Permission approval hook → perm-bridge.js (
|
|
291
|
+
// Permission approval hook → perm-bridge.js (matcher: "" = match all tools)
|
|
292
292
|
const permBridgePath = resolve(__dirname, 'lib', 'perm-bridge.js');
|
|
293
293
|
const permCmd = `node "${permBridgePath}"`;
|
|
294
|
-
const permMatcher = '
|
|
294
|
+
const permMatcher = '';
|
|
295
|
+
// Clean up legacy entries: old narrow matchers, null matchers (invalid JSON)
|
|
296
|
+
for (let i = settings.hooks.PreToolUse.length - 1; i >= 0; i--) {
|
|
297
|
+
const h = settings.hooks.PreToolUse[i];
|
|
298
|
+
const cmd = h.hooks?.[0]?.command || '';
|
|
299
|
+
if (cmd.includes('perm-bridge.js') && h.matcher !== permMatcher) {
|
|
300
|
+
settings.hooks.PreToolUse.splice(i, 1);
|
|
301
|
+
changed = true;
|
|
302
|
+
} else if ((h.matcher === null || h.matcher === undefined) && cmd.includes('perm-bridge.js')) {
|
|
303
|
+
settings.hooks.PreToolUse.splice(i, 1);
|
|
304
|
+
changed = true;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
295
307
|
const permExisting = settings.hooks.PreToolUse.find(h => h.matcher === permMatcher);
|
|
296
308
|
if (permExisting) {
|
|
297
309
|
if ((permExisting.hooks?.[0]?.command || '') !== permCmd) {
|
|
@@ -338,7 +350,7 @@ async function runCliMode(extraClaudeArgs = [], cwd) {
|
|
|
338
350
|
registerWorkspace(workingDir);
|
|
339
351
|
|
|
340
352
|
// 确保 AskUserQuestion hook 已注册到 ~/.claude/settings.json
|
|
341
|
-
|
|
353
|
+
ensureHooks();
|
|
342
354
|
|
|
343
355
|
// 2. 设置 CLI 模式标记(必须在 import proxy.js 之前,
|
|
344
356
|
// 因为 proxy.js → interceptor.js 可能触发 server.js 加载,
|
|
@@ -346,6 +358,10 @@ async function runCliMode(extraClaudeArgs = [], cwd) {
|
|
|
346
358
|
process.env.CCV_CLI_MODE = '1';
|
|
347
359
|
process.env.CCV_PROJECT_DIR = workingDir;
|
|
348
360
|
process.env.CCV_PROXY_MODE = '1';
|
|
361
|
+
// 当 --dangerously-skip-permissions 生效时,通知 perm-bridge 不要拦截
|
|
362
|
+
if (extraClaudeArgs.includes('--dangerously-skip-permissions')) {
|
|
363
|
+
process.env.CCV_BYPASS_PERMISSIONS = '1';
|
|
364
|
+
}
|
|
349
365
|
|
|
350
366
|
// 1. 启动代理
|
|
351
367
|
const { startProxy } = await import('./proxy.js');
|
|
@@ -403,6 +419,93 @@ async function runCliMode(extraClaudeArgs = [], cwd) {
|
|
|
403
419
|
process.on('SIGTERM', cleanup);
|
|
404
420
|
}
|
|
405
421
|
|
|
422
|
+
async function runSdkMode(extraClaudeArgs = [], cwd) {
|
|
423
|
+
// 检查 SDK 是否可用
|
|
424
|
+
let sdkManager;
|
|
425
|
+
try {
|
|
426
|
+
sdkManager = await import('./lib/sdk-manager.js');
|
|
427
|
+
if (!sdkManager.isSdkAvailable()) throw new Error('query not available');
|
|
428
|
+
} catch {
|
|
429
|
+
console.warn('[CC Viewer] Agent SDK not available, falling back to PTY mode (-C)');
|
|
430
|
+
return runCliMode(extraClaudeArgs, cwd);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const workingDir = cwd || process.cwd();
|
|
434
|
+
|
|
435
|
+
// 注册工作区
|
|
436
|
+
const { registerWorkspace } = await import('./workspace-registry.js');
|
|
437
|
+
registerWorkspace(workingDir);
|
|
438
|
+
|
|
439
|
+
// 不需要 ensureHooks — SDK canUseTool 处理 AskUserQuestion + 权限
|
|
440
|
+
// 不需要 proxy — SDK 直接管理 API 通信
|
|
441
|
+
|
|
442
|
+
// 设置环境标记(必须在 import server.js 之前)
|
|
443
|
+
process.env.CCV_CLI_MODE = '1';
|
|
444
|
+
process.env.CCV_SDK_MODE = '1';
|
|
445
|
+
process.env.CCV_PROJECT_DIR = workingDir;
|
|
446
|
+
process.env.CCV_PROXY_MODE = '1'; // 使 interceptor.js 惰性
|
|
447
|
+
|
|
448
|
+
// 启动 HTTP 服务器
|
|
449
|
+
const serverMod = await import('./server.js');
|
|
450
|
+
|
|
451
|
+
await new Promise(resolve => {
|
|
452
|
+
const check = () => {
|
|
453
|
+
const port = serverMod.getPort();
|
|
454
|
+
if (port) resolve(port);
|
|
455
|
+
else setTimeout(check, 100);
|
|
456
|
+
};
|
|
457
|
+
setTimeout(check, 200);
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
const port = serverMod.getPort();
|
|
461
|
+
const { basename } = await import('node:path');
|
|
462
|
+
|
|
463
|
+
// 解析 permission mode from CLI args
|
|
464
|
+
// --d / --dangerously-skip-permissions → bypassPermissions(跳过所有权限检查)
|
|
465
|
+
// --ad / --allow-dangerously-skip-permissions → default(只是允许用户后续切换,不立即跳过)
|
|
466
|
+
let permissionMode = 'default';
|
|
467
|
+
if (extraClaudeArgs.includes('--dangerously-skip-permissions')) {
|
|
468
|
+
permissionMode = 'bypassPermissions';
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// 初始化 SDK 会话
|
|
472
|
+
sdkManager.initSdkSession(workingDir, basename(workingDir), {
|
|
473
|
+
onEntry: (entry) => serverMod.pushSdkEntry(entry),
|
|
474
|
+
onStreamingStatus: (data) => serverMod.setSdkStreamingState(data),
|
|
475
|
+
broadcastWs: (msg) => serverMod.broadcastWsMessage(msg),
|
|
476
|
+
permissionMode,
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
// 注册 SDK 回调到 server.js(WS 消息路由用)
|
|
480
|
+
serverMod.setSdkResolveApproval(sdkManager.resolveApproval);
|
|
481
|
+
serverMod.setSdkSendUserMessage(sdkManager.sendUserMessage);
|
|
482
|
+
|
|
483
|
+
// 自动打开浏览器
|
|
484
|
+
const protocol = serverMod.getProtocol();
|
|
485
|
+
const url = `${protocol}://127.0.0.1:${port}`;
|
|
486
|
+
try {
|
|
487
|
+
const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
488
|
+
const { execSync } = await import('node:child_process');
|
|
489
|
+
execSync(`${cmd} ${url}`, { stdio: 'ignore', timeout: 5000 });
|
|
490
|
+
} catch {}
|
|
491
|
+
|
|
492
|
+
console.log(`CC Viewer (SDK mode):`);
|
|
493
|
+
console.log(` ➜ Local: ${url}`);
|
|
494
|
+
const _lanIps = serverMod.getAllLocalIps();
|
|
495
|
+
const _token = serverMod.getAccessToken();
|
|
496
|
+
for (const _ip of _lanIps) {
|
|
497
|
+
console.log(` ➜ Network: ${protocol}://${_ip}:${port}?token=${_token}`);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// 注册退出处理
|
|
501
|
+
const cleanup = () => {
|
|
502
|
+
sdkManager.stopSession();
|
|
503
|
+
serverMod.stopViewer().finally(() => process.exit());
|
|
504
|
+
};
|
|
505
|
+
process.on('SIGINT', cleanup);
|
|
506
|
+
process.on('SIGTERM', cleanup);
|
|
507
|
+
}
|
|
508
|
+
|
|
406
509
|
async function runCliModeWorkspaceSelector(extraClaudeArgs = []) {
|
|
407
510
|
// 首先尝试 npm 版本(包括 nvm 安装),找不到再尝试 native 版本
|
|
408
511
|
let claudePath = resolveNpmClaudePath();
|
|
@@ -641,9 +744,16 @@ if (isLogger) {
|
|
|
641
744
|
|
|
642
745
|
if (args[0] === 'run') {
|
|
643
746
|
runProxyCommand(args);
|
|
747
|
+
} else if (args.includes('-SDK') || args.includes('--sdk')) {
|
|
748
|
+
// SDK 模式(显式 -SDK 切换)
|
|
749
|
+
const claudeArgs = args.filter(a => a !== '-SDK' && a !== '--sdk')
|
|
750
|
+
.map(a => a === '--d' ? '--dangerously-skip-permissions' : a === '--ad' ? '--allow-dangerously-skip-permissions' : a);
|
|
751
|
+
runSdkMode(claudeArgs, process.cwd()).catch(err => {
|
|
752
|
+
console.error('SDK mode error:', err);
|
|
753
|
+
process.exit(1);
|
|
754
|
+
});
|
|
644
755
|
} else {
|
|
645
|
-
//
|
|
646
|
-
// 展开快捷方式:--d → --dangerously-skip-permissions, --ad → --allow-dangerously-skip-permissions
|
|
756
|
+
// PTY 模式(默认)
|
|
647
757
|
const claudeArgs = args.map(a => a === '--d' ? '--dangerously-skip-permissions' : a === '--ad' ? '--allow-dangerously-skip-permissions' : a);
|
|
648
758
|
runCliMode(claudeArgs, process.cwd()).catch(err => {
|
|
649
759
|
console.error('CLI mode error:', err);
|