ccjk 10.1.0 → 10.2.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 (109) hide show
  1. package/dist/chunks/agent-teams.mjs +1 -1
  2. package/dist/chunks/agent.mjs +1 -1
  3. package/dist/chunks/api-providers.mjs +1 -1
  4. package/dist/chunks/api.mjs +3 -3
  5. package/dist/chunks/auto-bootstrap.mjs +1 -1
  6. package/dist/chunks/auto-updater.mjs +1 -1
  7. package/dist/{shared/ccjk.Br91zBIG.mjs → chunks/banner.mjs} +52 -3
  8. package/dist/chunks/boost.mjs +2 -2
  9. package/dist/chunks/ccjk-agents.mjs +1 -1
  10. package/dist/chunks/ccjk-all.mjs +1 -1
  11. package/dist/chunks/ccjk-config.mjs +1 -1
  12. package/dist/chunks/ccjk-hooks.mjs +1 -1
  13. package/dist/chunks/ccjk-mcp.mjs +2 -2
  14. package/dist/chunks/ccjk-setup.mjs +1 -1
  15. package/dist/chunks/ccjk-skills.mjs +1 -1
  16. package/dist/chunks/ccr.mjs +10 -10
  17. package/dist/chunks/ccu.mjs +1 -1
  18. package/dist/chunks/check-updates.mjs +3 -3
  19. package/dist/chunks/claude-code-config-manager.mjs +7 -7
  20. package/dist/chunks/claude-code-incremental-manager.mjs +2 -2
  21. package/dist/chunks/claude-config.mjs +3 -3
  22. package/dist/chunks/claude-wrapper.mjs +2 -2
  23. package/dist/chunks/codex-config-switch.mjs +2 -2
  24. package/dist/chunks/codex-provider-manager.mjs +2 -2
  25. package/dist/chunks/codex-uninstaller.mjs +2 -2
  26. package/dist/chunks/codex.mjs +5 -5
  27. package/dist/chunks/commands.mjs +88 -391
  28. package/dist/chunks/commands2.mjs +391 -88
  29. package/dist/chunks/completion.mjs +1 -1
  30. package/dist/chunks/config-consolidator.mjs +2 -2
  31. package/dist/chunks/config-switch.mjs +3 -3
  32. package/dist/chunks/config.mjs +5 -5
  33. package/dist/chunks/config2.mjs +410 -400
  34. package/dist/chunks/config3.mjs +400 -410
  35. package/dist/chunks/constants.mjs +1 -1
  36. package/dist/chunks/context.mjs +283 -1
  37. package/dist/chunks/dashboard.mjs +365 -0
  38. package/dist/chunks/doctor.mjs +4 -4
  39. package/dist/chunks/features.mjs +11 -11
  40. package/dist/chunks/fs-operations.mjs +1 -1
  41. package/dist/chunks/health-alerts.mjs +304 -0
  42. package/dist/chunks/health-check.mjs +532 -0
  43. package/dist/chunks/index.mjs +10 -177
  44. package/dist/chunks/index2.mjs +168 -1162
  45. package/dist/chunks/index3.mjs +1076 -910
  46. package/dist/chunks/index4.mjs +947 -137
  47. package/dist/chunks/index5.mjs +167 -635
  48. package/dist/chunks/index6.mjs +663 -0
  49. package/dist/chunks/init.mjs +19 -19
  50. package/dist/chunks/installer.mjs +649 -147
  51. package/dist/chunks/installer2.mjs +147 -649
  52. package/dist/chunks/interview.mjs +2 -2
  53. package/dist/chunks/marketplace.mjs +1 -1
  54. package/dist/chunks/mcp.mjs +4 -4
  55. package/dist/chunks/menu.mjs +16 -9
  56. package/dist/chunks/metrics-display.mjs +152 -0
  57. package/dist/chunks/migrator.mjs +1 -1
  58. package/dist/chunks/monitor.mjs +2 -2
  59. package/dist/chunks/notification.mjs +1 -1
  60. package/dist/chunks/onboarding.mjs +2 -2
  61. package/dist/chunks/package.mjs +1 -1
  62. package/dist/chunks/permission-manager.mjs +2 -2
  63. package/dist/chunks/permissions.mjs +1 -1
  64. package/dist/chunks/persistence-manager.mjs +781 -0
  65. package/dist/chunks/persistence.mjs +667 -0
  66. package/dist/chunks/platform.mjs +1 -1
  67. package/dist/chunks/plugin.mjs +1 -1
  68. package/dist/chunks/prompts.mjs +1 -1
  69. package/dist/chunks/providers.mjs +1 -1
  70. package/dist/chunks/quick-actions.mjs +321 -0
  71. package/dist/chunks/quick-setup.mjs +8 -8
  72. package/dist/chunks/silent-updater.mjs +1 -1
  73. package/dist/chunks/simple-config.mjs +2 -2
  74. package/dist/chunks/skill.mjs +1 -1
  75. package/dist/chunks/skills-sync.mjs +1 -1
  76. package/dist/chunks/skills.mjs +1 -1
  77. package/dist/chunks/slash-commands.mjs +208 -0
  78. package/dist/chunks/smart-defaults.mjs +1 -1
  79. package/dist/chunks/startup.mjs +1 -1
  80. package/dist/chunks/stats.mjs +1 -1
  81. package/dist/chunks/status.mjs +31 -2
  82. package/dist/chunks/team.mjs +1 -1
  83. package/dist/chunks/thinking.mjs +2 -2
  84. package/dist/chunks/uninstall.mjs +5 -5
  85. package/dist/chunks/update.mjs +7 -7
  86. package/dist/chunks/upgrade-manager.mjs +2 -2
  87. package/dist/chunks/version-checker.mjs +3 -3
  88. package/dist/chunks/vim.mjs +1 -1
  89. package/dist/cli.mjs +191 -21
  90. package/dist/i18n/locales/en/cli.json +14 -1
  91. package/dist/i18n/locales/en/common.json +27 -0
  92. package/dist/i18n/locales/en/context.json +54 -1
  93. package/dist/i18n/locales/en/dashboard.json +78 -0
  94. package/dist/i18n/locales/en/persistence.json +127 -0
  95. package/dist/i18n/locales/en/quick-actions.json +78 -0
  96. package/dist/i18n/locales/zh-CN/cli.json +14 -1
  97. package/dist/i18n/locales/zh-CN/common.json +27 -0
  98. package/dist/i18n/locales/zh-CN/context.json +54 -1
  99. package/dist/i18n/locales/zh-CN/dashboard.json +78 -0
  100. package/dist/i18n/locales/zh-CN/persistence.json +127 -0
  101. package/dist/i18n/locales/zh-CN/quick-actions.json +78 -0
  102. package/dist/index.mjs +2 -2
  103. package/dist/shared/{ccjk.DE91nClQ.mjs → ccjk.BKoi8-Hy.mjs} +1 -1
  104. package/dist/shared/{ccjk.Dpw86UX0.mjs → ccjk.CxtuJxaS.mjs} +1 -1
  105. package/dist/shared/{ccjk.ClzTOz9n.mjs → ccjk.DB2UYcq0.mjs} +5 -5
  106. package/dist/shared/{ccjk.Bndhan7G.mjs → ccjk.DfwJOEok.mjs} +1 -1
  107. package/dist/shared/{ccjk.DvIrK0wz.mjs → ccjk.DrMygfCF.mjs} +1 -1
  108. package/dist/shared/{ccjk.CmsW23FN.mjs → ccjk.IbImMVWM.mjs} +3 -3
  109. package/package.json +19 -19
@@ -4,8 +4,8 @@ import { resolve, dirname, join } from 'node:path';
4
4
  import process__default from 'node:process';
5
5
  import ansis from 'ansis';
6
6
  import inquirer from 'inquirer';
7
- import { i18n } from './index.mjs';
8
- import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DvIrK0wz.mjs';
7
+ import { i18n } from './index2.mjs';
8
+ import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DrMygfCF.mjs';
9
9
  import { randomUUID } from 'node:crypto';
10
10
  import 'node:url';
11
11
  import 'i18next';
@@ -1,5 +1,5 @@
1
1
  import ansis from 'ansis';
2
- import { i18n } from './index.mjs';
2
+ import { i18n } from './index2.mjs';
3
3
  import { createHash } from 'node:crypto';
4
4
  import { existsSync, createWriteStream } from 'node:fs';
5
5
  import { readFile, mkdir, rm } from 'node:fs/promises';
@@ -1,12 +1,12 @@
1
1
  import ansis from 'ansis';
2
- import { i18n } from './index.mjs';
2
+ import { i18n } from './index2.mjs';
3
3
  import 'node:child_process';
4
4
  import 'node:process';
5
5
  import { M as MCP_SERVICE_TIERS, i as isCoreService, g as getServicesByTier, c as checkMcpPerformance, f as formatPerformanceWarning, a as calculateResourceUsage, b as getOptimizationSuggestions, d as getMcpTierConfig } from './mcp-performance.mjs';
6
6
  import { r as readMcpConfig, b as backupMcpConfig, w as writeMcpConfig } from './claude-config.mjs';
7
7
  import inquirer from 'inquirer';
8
8
  import { M as MCP_SERVICE_CONFIGS } from './codex.mjs';
9
- import { d as displayInstalledMcpServices, i as isMcpServiceInstalled, a as installMcpService, u as uninstallMcpService } from '../shared/ccjk.ClzTOz9n.mjs';
9
+ import { d as displayInstalledMcpServices, a as isMcpServiceInstalled, b as installMcpService, u as uninstallMcpService } from '../shared/ccjk.DB2UYcq0.mjs';
10
10
  import { existsSync, unlinkSync, statSync, mkdirSync, readFileSync } from 'node:fs';
11
11
  import { homedir } from 'node:os';
12
12
  import { join } from 'pathe';
@@ -17,6 +17,8 @@ import 'i18next-fs-backend';
17
17
  import './constants.mjs';
18
18
  import './json-config.mjs';
19
19
  import 'dayjs';
20
+ import 'node:crypto';
21
+ import 'node:fs/promises';
20
22
  import './platform.mjs';
21
23
  import 'tinyexec';
22
24
  import 'ora';
@@ -29,8 +31,6 @@ import './prompts.mjs';
29
31
  import './package.mjs';
30
32
  import '../shared/ccjk.DHbrGcgg.mjs';
31
33
  import 'inquirer-toggle';
32
- import 'node:crypto';
33
- import 'node:fs/promises';
34
34
 
35
35
  function getReleasableServices(configuredServices, tier) {
36
36
  return configuredServices.filter((serviceId) => {
@@ -5,17 +5,17 @@ import inquirer from 'inquirer';
5
5
  import { join } from 'pathe';
6
6
  import { M as MCP_SERVICE_CONFIGS } from './codex.mjs';
7
7
  import { CODE_TOOL_BANNERS, CLAUDE_DIR, isCodeToolType, DEFAULT_CODE_TOOL_TYPE } from './constants.mjs';
8
- import { ensureI18nInitialized, i18n } from './index.mjs';
9
- import { d as displayBannerWithInfo } from '../shared/ccjk.Br91zBIG.mjs';
8
+ import { ensureI18nInitialized, i18n } from './index2.mjs';
9
+ import { displayBannerWithInfo } from './banner.mjs';
10
10
  import { updateZcfConfig, readZcfConfig } from './ccjk-config.mjs';
11
11
  import { r as readMcpConfig } from './claude-config.mjs';
12
- import { r as resolveCodeType } from '../shared/ccjk.Dpw86UX0.mjs';
13
- import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DvIrK0wz.mjs';
12
+ import { r as resolveCodeType } from '../shared/ccjk.CxtuJxaS.mjs';
13
+ import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DrMygfCF.mjs';
14
14
  import { changeScriptLanguageFeature, configureMcpFeature, configureEnvPermissionFeature, configureAiMemoryFeature, configureDefaultModelFeature, configureApiFeature } from './features.mjs';
15
15
  import { p as promptBoolean } from '../shared/ccjk.DHbrGcgg.mjs';
16
16
  import { homedir } from 'node:os';
17
- import { runCcrStop, runCcrStart, runCcrRestart, runCcrStatus, runCcrUi } from './commands2.mjs';
18
- import { readCcrConfig, configureCcrFeature } from './config3.mjs';
17
+ import { runCcrStop, runCcrStart, runCcrRestart, runCcrStatus, runCcrUi } from './commands.mjs';
18
+ import { readCcrConfig, configureCcrFeature } from './config2.mjs';
19
19
  import { a as isCcrInstalled, b as installCcr, i as init } from './init.mjs';
20
20
  import { ccjkAgents } from './ccjk-agents.mjs';
21
21
  import { ccjkSkills } from './ccjk-skills.mjs';
@@ -368,6 +368,7 @@ async function showSimplifiedMenu() {
368
368
  console.log(` ${ansis.green("K.")} ${isZh ? "Skills \u7BA1\u7406" : "Skills Manager"} ${ansis.dim(isZh ? "- \u5B89\u88C5/\u66F4\u65B0/\u5220\u9664\u5DE5\u4F5C\u6D41\u6280\u80FD" : "- Install/update/remove workflow skills")}`);
369
369
  console.log(` ${ansis.green("M.")} ${isZh ? "MCP \u7BA1\u7406" : "MCP Manager"} ${ansis.dim(isZh ? "- \u914D\u7F6E Model Context Protocol \u670D\u52A1" : "- Configure MCP services")}`);
370
370
  console.log(` ${ansis.green("A.")} ${isZh ? "Agents \u7BA1\u7406" : "Agents Manager"} ${ansis.dim(isZh ? "- \u521B\u5EFA/\u7BA1\u7406 AI \u667A\u80FD\u4F53" : "- Create/manage AI agents")}`);
371
+ console.log(` ${ansis.green("P.")} ${isZh ? "\u6301\u4E45\u5316\u7BA1\u7406" : "Persistence Manager"} ${ansis.dim(isZh ? "- \u7BA1\u7406\u4E0A\u4E0B\u6587\u5B58\u50A8\u548C\u5C42\u7EA7" : "- Manage context storage and tiers")}`);
371
372
  console.log(` ${ansis.green("R.")} ${isZh ? "CCR" : "CCR"} ${ansis.dim(isZh ? "- \u914D\u7F6E Claude Code Router \u4EE5\u4F7F\u7528\u591A\u4E2A AI \u6A21\u578B" : "- Configure Claude Code Router for multiple AI models")}`);
372
373
  console.log("");
373
374
  console.log(ansis.dim(` ------------ CCJK ------------`));
@@ -386,7 +387,7 @@ async function showSimplifiedMenu() {
386
387
  message: isZh ? "\u8BF7\u8F93\u5165\u9009\u9879:" : "Enter option:",
387
388
  validate: (value) => {
388
389
  const normalized2 = normalizeMenuInput(value);
389
- const valid = ["0", "1", "2", "3", "4", "5", "6", "7", "k", "m", "a", "r", "b", "s", "-", "+", "d", "h", "q"];
390
+ const valid = ["0", "1", "2", "3", "4", "5", "6", "7", "k", "m", "a", "p", "r", "b", "s", "-", "+", "d", "h", "q"];
390
391
  return valid.includes(normalized2) || (isZh ? "\u8BF7\u8F93\u5165\u6709\u6548\u9009\u9879" : "Please enter a valid option");
391
392
  }
392
393
  });
@@ -438,14 +439,20 @@ async function showSimplifiedMenu() {
438
439
  await ccjkAgents({});
439
440
  break;
440
441
  }
442
+ case "p": {
443
+ const { persistenceManager } = await import('./persistence-manager.mjs');
444
+ await persistenceManager();
445
+ printSeparator();
446
+ return void 0;
447
+ }
441
448
  case "r": {
442
449
  await runCcrMenuFeature();
443
450
  printSeparator();
444
451
  return void 0;
445
452
  }
446
453
  case "b": {
447
- const { statusCommand } = await import('./status.mjs');
448
- await statusCommand();
454
+ const { dashboardCommand } = await import('./dashboard.mjs');
455
+ await dashboardCommand();
449
456
  await inquirer.prompt({ type: "input", name: "_", message: isZh ? "\u6309\u56DE\u8F66\u8FD4\u56DE\u83DC\u5355..." : "Press Enter to return..." });
450
457
  return void 0;
451
458
  }
@@ -0,0 +1,152 @@
1
+ import ansis from 'ansis';
2
+
3
+ function formatTokenCount(tokens) {
4
+ if (tokens >= 1e6) {
5
+ return `${(tokens / 1e6).toFixed(1)}M`;
6
+ }
7
+ if (tokens >= 1e3) {
8
+ return `${(tokens / 1e3).toFixed(1)}K`;
9
+ }
10
+ return tokens.toString();
11
+ }
12
+ function formatCost(cost) {
13
+ if (cost >= 1) {
14
+ return `$${cost.toFixed(2)}`;
15
+ }
16
+ if (cost >= 0.01) {
17
+ return `$${cost.toFixed(3)}`;
18
+ }
19
+ return `$${cost.toFixed(4)}`;
20
+ }
21
+ function formatRatio(ratio) {
22
+ return `${Math.round(ratio * 100)}%`;
23
+ }
24
+ function formatTime(ms) {
25
+ if (ms >= 1e3) {
26
+ return `${(ms / 1e3).toFixed(2)}s`;
27
+ }
28
+ return `${Math.round(ms)}ms`;
29
+ }
30
+ function displayCompressionResult(originalTokens, compressedTokens, compressionRatio, timeTakenMs) {
31
+ const reductionPercent = Math.round(compressionRatio * 100);
32
+ const originalFormatted = formatTokenCount(originalTokens);
33
+ const compressedFormatted = formatTokenCount(compressedTokens);
34
+ console.log(
35
+ ansis.green("\u2705") + " Compressed " + ansis.cyan(originalFormatted) + " tokens \u2192 " + ansis.cyan(compressedFormatted) + " " + ansis.yellow(`(${reductionPercent}% reduction)`) + " " + ansis.gray(`[${formatTime(timeTakenMs)}]`)
36
+ );
37
+ }
38
+ function displayCompressionStats(stats) {
39
+ console.log();
40
+ console.log(ansis.cyan.bold("\u{1F4CA} Compression Statistics"));
41
+ console.log(ansis.gray("\u2500".repeat(60)));
42
+ console.log();
43
+ console.log(ansis.white.bold("Overall:"));
44
+ console.log(` ${ansis.gray("Total Compressions:")} ${ansis.white(stats.totalCompressions.toLocaleString())}`);
45
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.totalTokensSaved))}`);
46
+ console.log(` ${ansis.gray("Avg Compression:")} ${ansis.yellow(formatRatio(stats.averageCompressionRatio))}`);
47
+ console.log(` ${ansis.gray("Avg Time:")} ${ansis.cyan(formatTime(stats.averageTimeTakenMs))}`);
48
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green.bold(formatCost(stats.estimatedCostSavings))}`);
49
+ if (stats.sessionStats && stats.sessionStats.compressions > 0) {
50
+ console.log();
51
+ console.log(ansis.white.bold("Session (24h):"));
52
+ console.log(` ${ansis.gray("Compressions:")} ${ansis.white(stats.sessionStats.compressions.toLocaleString())}`);
53
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.sessionStats.tokensSaved))}`);
54
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green(formatCost(stats.sessionStats.costSavings))}`);
55
+ }
56
+ if (stats.weeklyStats && stats.weeklyStats.compressions > 0) {
57
+ console.log();
58
+ console.log(ansis.white.bold("Weekly (7d):"));
59
+ console.log(` ${ansis.gray("Compressions:")} ${ansis.white(stats.weeklyStats.compressions.toLocaleString())}`);
60
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.weeklyStats.tokensSaved))}`);
61
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green(formatCost(stats.weeklyStats.costSavings))}`);
62
+ }
63
+ if (stats.monthlyStats && stats.monthlyStats.compressions > 0) {
64
+ console.log();
65
+ console.log(ansis.white.bold("Monthly (30d):"));
66
+ console.log(` ${ansis.gray("Compressions:")} ${ansis.white(stats.monthlyStats.compressions.toLocaleString())}`);
67
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.monthlyStats.tokensSaved))}`);
68
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green(formatCost(stats.monthlyStats.costSavings))}`);
69
+ }
70
+ console.log();
71
+ console.log(ansis.gray("\u2500".repeat(60)));
72
+ console.log(ansis.gray("\u{1F4A1} Cost based on $0.015 per 1K tokens (Claude Opus pricing)"));
73
+ console.log();
74
+ }
75
+ function displayCompactCompressionStats(stats) {
76
+ const lines = [];
77
+ lines.push(ansis.cyan.bold("Compression Metrics"));
78
+ lines.push(` ${ansis.gray("Total Saved:")} ${ansis.green(formatTokenCount(stats.totalTokensSaved))} tokens`);
79
+ lines.push(` ${ansis.gray("Avg Reduction:")} ${ansis.yellow(formatRatio(stats.averageCompressionRatio))}`);
80
+ lines.push(` ${ansis.gray("Cost Savings:")} ${ansis.green.bold(formatCost(stats.estimatedCostSavings))}`);
81
+ if (stats.sessionStats && stats.sessionStats.compressions > 0) {
82
+ lines.push(` ${ansis.gray("Session (24h):")} ${ansis.white(stats.sessionStats.compressions)} compressions, ${ansis.green(formatCost(stats.sessionStats.costSavings))} saved`);
83
+ }
84
+ return lines;
85
+ }
86
+ function createCompressionBar(ratio, width = 20) {
87
+ const filled = Math.round(ratio * width);
88
+ const empty = width - filled;
89
+ let bar = "";
90
+ if (ratio >= 0.7) {
91
+ bar = ansis.green("\u2588".repeat(filled));
92
+ } else if (ratio >= 0.4) {
93
+ bar = ansis.yellow("\u2588".repeat(filled));
94
+ } else {
95
+ bar = ansis.red("\u2588".repeat(filled));
96
+ }
97
+ bar += ansis.gray("\u2591".repeat(empty));
98
+ return bar;
99
+ }
100
+ function displayCompressionTable(metrics, limit = 10) {
101
+ if (metrics.length === 0) {
102
+ console.log(ansis.gray("No compression metrics available"));
103
+ return;
104
+ }
105
+ console.log();
106
+ console.log(ansis.cyan.bold("Recent Compressions"));
107
+ console.log(ansis.gray("\u2500".repeat(80)));
108
+ console.log(
109
+ ansis.white.bold("Original".padEnd(12)) + ansis.white.bold("Compressed".padEnd(12)) + ansis.white.bold("Ratio".padEnd(10)) + ansis.white.bold("Time".padEnd(10)) + ansis.white.bold("Strategy".padEnd(15)) + ansis.white.bold("Algorithm")
110
+ );
111
+ console.log(ansis.gray("\u2500".repeat(80)));
112
+ const displayMetrics = metrics.slice(0, limit);
113
+ for (const metric of displayMetrics) {
114
+ const original = formatTokenCount(metric.originalTokens).padEnd(12);
115
+ const compressed = formatTokenCount(metric.compressedTokens).padEnd(12);
116
+ const ratio = formatRatio(metric.compressionRatio).padEnd(10);
117
+ const time = formatTime(metric.timeTakenMs).padEnd(10);
118
+ const strategy = metric.strategy.padEnd(15);
119
+ const algorithm = metric.algorithm;
120
+ console.log(
121
+ ansis.cyan(original) + ansis.green(compressed) + ansis.yellow(ratio) + ansis.gray(time) + ansis.white(strategy) + ansis.gray(algorithm)
122
+ );
123
+ }
124
+ console.log(ansis.gray("\u2500".repeat(80)));
125
+ console.log();
126
+ }
127
+ function formatBytes(bytes) {
128
+ if (bytes >= 1073741824) {
129
+ return `${(bytes / 1073741824).toFixed(2)} GB`;
130
+ }
131
+ if (bytes >= 1048576) {
132
+ return `${(bytes / 1048576).toFixed(2)} MB`;
133
+ }
134
+ if (bytes >= 1024) {
135
+ return `${(bytes / 1024).toFixed(2)} KB`;
136
+ }
137
+ return `${bytes} bytes`;
138
+ }
139
+ const MetricsDisplay = {
140
+ displayCompressionResult,
141
+ displayCompressionStats,
142
+ displayCompactCompressionStats,
143
+ displayCompressionTable,
144
+ createCompressionBar,
145
+ formatTokenCount,
146
+ formatCost,
147
+ formatRatio,
148
+ formatTime,
149
+ formatBytes
150
+ };
151
+
152
+ export { MetricsDisplay, createCompressionBar, displayCompactCompressionStats, displayCompressionResult, displayCompressionStats, displayCompressionTable };
@@ -3,7 +3,7 @@ import { exists } from './fs-operations.mjs';
3
3
  import { readJsonConfig, writeJsonConfig } from './json-config.mjs';
4
4
  import 'node:os';
5
5
  import 'pathe';
6
- import './index.mjs';
6
+ import './index2.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:process';
9
9
  import 'node:url';
@@ -1,6 +1,6 @@
1
1
  import ansis from 'ansis';
2
- import { i18n } from './index.mjs';
3
- import { d as displayBannerWithInfo } from '../shared/ccjk.Br91zBIG.mjs';
2
+ import { i18n } from './index2.mjs';
3
+ import { displayBannerWithInfo } from './banner.mjs';
4
4
  import process__default from 'node:process';
5
5
  import { nanoid } from 'nanoid';
6
6
  import 'node:fs';
@@ -1,6 +1,6 @@
1
1
  import ansis from 'ansis';
2
2
  import inquirer from 'inquirer';
3
- import { i18n } from './index.mjs';
3
+ import { i18n } from './index2.mjs';
4
4
  import * as nodeFs from 'node:fs';
5
5
  import nodeFs__default, { existsSync, readFileSync, mkdirSync, unlinkSync } from 'node:fs';
6
6
  import * as os from 'node:os';
@@ -7,10 +7,10 @@ import ora from 'ora';
7
7
  import { join, basename } from 'pathe';
8
8
  import { CCJK_CONFIG_DIR } from './constants.mjs';
9
9
  import { d as detectProject, g as getProjectSummary, a as generateSuggestions } from '../shared/ccjk.CBhIZiPz.mjs';
10
- import { b as boxify, t as theme, S as STATUS } from '../shared/ccjk.Br91zBIG.mjs';
10
+ import { boxify, COLORS as theme, STATUS } from './banner.mjs';
11
11
  import { writeFileAtomic } from './fs-operations.mjs';
12
12
  import 'node:os';
13
- import './index.mjs';
13
+ import './index2.mjs';
14
14
  import 'node:url';
15
15
  import 'i18next';
16
16
  import 'i18next-fs-backend';
@@ -1,4 +1,4 @@
1
- const version = "10.1.0";
1
+ const version = "10.2.0";
2
2
  const homepage = "https://github.com/miounet11/ccjk";
3
3
 
4
4
  export { homepage, version };
@@ -2,9 +2,9 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import ansis from 'ansis';
3
3
  import { join } from 'pathe';
4
4
  import { SETTINGS_FILE, CCJK_CONFIG_DIR } from './constants.mjs';
5
- import { S as STATUS } from '../shared/ccjk.Br91zBIG.mjs';
5
+ import { STATUS } from './banner.mjs';
6
6
  import 'node:os';
7
- import './index.mjs';
7
+ import './index2.mjs';
8
8
  import 'node:process';
9
9
  import 'node:url';
10
10
  import 'i18next';
@@ -2,7 +2,7 @@ import process__default from 'node:process';
2
2
  import ansis from 'ansis';
3
3
  import inquirer from 'inquirer';
4
4
  import 'tinyexec';
5
- import { i18n } from './index.mjs';
5
+ import { i18n } from './index2.mjs';
6
6
  import { g as getPermissionManager } from '../shared/ccjk.h7_W-wTs.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:url';