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.
Files changed (67) hide show
  1. package/cli.js +116 -6
  2. package/dist/assets/{App-hH0rDzOq.js → App-D-Apw-as.js} +16 -16
  3. package/dist/assets/AppHeader-B2WxpwwK.css +41 -0
  4. package/dist/assets/{AppHeader.module-_fn3e-3Y.js → AppHeader.module-DsVA04H2.js} +164 -164
  5. package/dist/assets/Mobile-RajPnX3l.js +10 -0
  6. package/dist/assets/{_basePickBy-Dwc6xlH0.js → _basePickBy-BJEP1GYD.js} +1 -1
  7. package/dist/assets/{_baseUniq-CIhWoRX6.js → _baseUniq-BubLHFZN.js} +1 -1
  8. package/dist/assets/{arc-ClMosRWS.js → arc-DQ_H2ge5.js} +1 -1
  9. package/dist/assets/{architectureDiagram-2XIMDMQ5-CiuBPipP.js → architectureDiagram-2XIMDMQ5-DxzXyiQV.js} +1 -1
  10. package/dist/assets/{blockDiagram-WCTKOSBZ-Bifbw0Pj.js → blockDiagram-WCTKOSBZ-Oko9Xh01.js} +1 -1
  11. package/dist/assets/{c4Diagram-IC4MRINW-Dwx54q11.js → c4Diagram-IC4MRINW-BWMun8B6.js} +1 -1
  12. package/dist/assets/channel-JA0OGVbb.js +1 -0
  13. package/dist/assets/{chunk-4BX2VUAB-BQo_Scg4.js → chunk-4BX2VUAB-D4f3BBSj.js} +1 -1
  14. package/dist/assets/{chunk-55IACEB6-DmMYL0yS.js → chunk-55IACEB6-DEELbrpC.js} +1 -1
  15. package/dist/assets/{chunk-FMBD7UC4-D54EDOVv.js → chunk-FMBD7UC4-BMDopkZI.js} +1 -1
  16. package/dist/assets/{chunk-JSJVCQXG-C4wM91-8.js → chunk-JSJVCQXG-Bl2ge6LE.js} +1 -1
  17. package/dist/assets/{chunk-KX2RTZJC-BuTQbTst.js → chunk-KX2RTZJC-D6-v2Nwr.js} +1 -1
  18. package/dist/assets/{chunk-NQ4KR5QH-pwWGt1sO.js → chunk-NQ4KR5QH-CPoQIkEQ.js} +1 -1
  19. package/dist/assets/{chunk-QZHKN3VN-DzdyrpMz.js → chunk-QZHKN3VN-5ObFPC7D.js} +1 -1
  20. package/dist/assets/{chunk-WL4C6EOR-BsqkjkKt.js → chunk-WL4C6EOR-Brx2xle-.js} +1 -1
  21. package/dist/assets/classDiagram-VBA2DB6C-DBQK8T70.js +1 -0
  22. package/dist/assets/classDiagram-v2-RAHNMMFH-DBQK8T70.js +1 -0
  23. package/dist/assets/clone-B_6tGAmz.js +1 -0
  24. package/dist/assets/{cose-bilkent-S5V4N54A-C_Zw3kps.js → cose-bilkent-S5V4N54A-BtTL0awI.js} +1 -1
  25. package/dist/assets/{dagre-KLK3FWXG-BBym-Z-r.js → dagre-KLK3FWXG-BnJdU6vj.js} +1 -1
  26. package/dist/assets/{diagram-E7M64L7V-CJK3xILI.js → diagram-E7M64L7V-DqmlnmsM.js} +1 -1
  27. package/dist/assets/{diagram-IFDJBPK2-CG0k9GmI.js → diagram-IFDJBPK2-CSfBzoTw.js} +1 -1
  28. package/dist/assets/{diagram-P4PSJMXO-BHJpgqgl.js → diagram-P4PSJMXO-W_YBtuzb.js} +1 -1
  29. package/dist/assets/{erDiagram-INFDFZHY-DY2TxE9e.js → erDiagram-INFDFZHY-BrXGXwQp.js} +1 -1
  30. package/dist/assets/{flowDiagram-PKNHOUZH-C6ujoYh5.js → flowDiagram-PKNHOUZH-D1qO_ftR.js} +1 -1
  31. package/dist/assets/{ganttDiagram-A5KZAMGK-DacCPw0V.js → ganttDiagram-A5KZAMGK-Dj8Dz895.js} +1 -1
  32. package/dist/assets/{gitGraphDiagram-K3NZZRJ6-1Hd4fFZI.js → gitGraphDiagram-K3NZZRJ6-CbtCyig0.js} +1 -1
  33. package/dist/assets/{graph-D8YLYosB.js → graph-BSyLsRRZ.js} +1 -1
  34. package/dist/assets/{index-DLkyZ-Zb.js → index-JcYe5KP6.js} +2 -2
  35. package/dist/assets/{infoDiagram-LFFYTUFH-ClN29cDZ.js → infoDiagram-LFFYTUFH-Dt7Cxc1A.js} +1 -1
  36. package/dist/assets/{ishikawaDiagram-PHBUUO56-DDgBFnJ4.js → ishikawaDiagram-PHBUUO56-BATp1eBz.js} +1 -1
  37. package/dist/assets/{journeyDiagram-4ABVD52K-Cl9xLEhq.js → journeyDiagram-4ABVD52K-Cuk87Qh1.js} +1 -1
  38. package/dist/assets/{kanban-definition-K7BYSVSG-CBfTb1XX.js → kanban-definition-K7BYSVSG-dNdjELb5.js} +1 -1
  39. package/dist/assets/{layout-BSGsZPU6.js → layout-ikzzHuR8.js} +1 -1
  40. package/dist/assets/{linear-Cm4oUzYV.js → linear-BBrDskBJ.js} +1 -1
  41. package/dist/assets/{mermaid.core-Bfq98W72.js → mermaid.core-TSkGvSH8.js} +4 -4
  42. package/dist/assets/{mindmap-definition-YRQLILUH-S_0pZiXc.js → mindmap-definition-YRQLILUH-CtDrb2x9.js} +1 -1
  43. package/dist/assets/{pieDiagram-SKSYHLDU-CUof-7Ag.js → pieDiagram-SKSYHLDU-bkNmBvtc.js} +1 -1
  44. package/dist/assets/{quadrantDiagram-337W2JSQ-74oAPb7-.js → quadrantDiagram-337W2JSQ-Byl5XeRq.js} +1 -1
  45. package/dist/assets/{requirementDiagram-Z7DCOOCP-Dx_1a8Sm.js → requirementDiagram-Z7DCOOCP-CZTVT8Rt.js} +1 -1
  46. package/dist/assets/{sankeyDiagram-WA2Y5GQK-Ollqup46.js → sankeyDiagram-WA2Y5GQK-xmaiO1U4.js} +1 -1
  47. package/dist/assets/{sequenceDiagram-2WXFIKYE-CUQdI1hH.js → sequenceDiagram-2WXFIKYE-DjXGcDqg.js} +1 -1
  48. package/dist/assets/{stateDiagram-RAJIS63D-DA4bEZTV.js → stateDiagram-RAJIS63D-42-_6Ebg.js} +1 -1
  49. package/dist/assets/stateDiagram-v2-FVOUBMTO-Dk8cVTL7.js +1 -0
  50. package/dist/assets/{timeline-definition-YZTLITO2-hIqAiIh9.js → timeline-definition-YZTLITO2-DMCYajRr.js} +1 -1
  51. package/dist/assets/{treemap-KZPCXAKY-BPMtLzV0.js → treemap-KZPCXAKY-BHYJalU8.js} +1 -1
  52. package/dist/assets/{vennDiagram-LZ73GAT5-8C63L59W.js → vennDiagram-LZ73GAT5-DlJJRJ0l.js} +1 -1
  53. package/dist/assets/{xychartDiagram-JWTSCODW-rb793_nJ.js → xychartDiagram-JWTSCODW-GeZvsPf-.js} +1 -1
  54. package/dist/index.html +2 -2
  55. package/i18n.js +3 -3
  56. package/lib/perm-bridge.js +27 -18
  57. package/lib/sdk-adapter.js +77 -0
  58. package/lib/sdk-manager.js +464 -0
  59. package/package.json +5 -2
  60. package/server.js +58 -4
  61. package/dist/assets/AppHeader-DN09T_4w.css +0 -41
  62. package/dist/assets/Mobile-DfiaHmP0.js +0 -10
  63. package/dist/assets/channel-CA7t6n2N.js +0 -1
  64. package/dist/assets/classDiagram-VBA2DB6C-iCP3aAMs.js +0 -1
  65. package/dist/assets/classDiagram-v2-RAHNMMFH-iCP3aAMs.js +0 -1
  66. package/dist/assets/clone-DykZ1sNt.js +0 -1
  67. 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 ensureAskHook() {
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 (for write/dangerous tools)
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 = 'Bash|Write|Edit|NotebookEdit';
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
- ensureAskHook();
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
- // 默认行为:所有参数透传给 claude(通过 PTY + Web Viewer)
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);