@kaitranntt/ccs 7.71.0-dev.9 → 7.72.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 (141) hide show
  1. package/README.md +5 -2
  2. package/config/base-codex.settings.json +4 -4
  3. package/dist/ccs.js +18 -12
  4. package/dist/ccs.js.map +1 -1
  5. package/dist/cliproxy/auth/kiro-import.js +1 -1
  6. package/dist/cliproxy/auth/kiro-import.js.map +1 -1
  7. package/dist/cliproxy/auth/oauth-handler.js +1 -1
  8. package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
  9. package/dist/cliproxy/auth/provider-refreshers/index.d.ts +1 -2
  10. package/dist/cliproxy/auth/provider-refreshers/index.d.ts.map +1 -1
  11. package/dist/cliproxy/auth/provider-refreshers/index.js +6 -25
  12. package/dist/cliproxy/auth/provider-refreshers/index.js.map +1 -1
  13. package/dist/cliproxy/auth/token-manager.d.ts +1 -1
  14. package/dist/cliproxy/auth/token-manager.d.ts.map +1 -1
  15. package/dist/cliproxy/auth/token-manager.js +9 -6
  16. package/dist/cliproxy/auth/token-manager.js.map +1 -1
  17. package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -1
  18. package/dist/cliproxy/binary/lifecycle.js +12 -1
  19. package/dist/cliproxy/binary/lifecycle.js.map +1 -1
  20. package/dist/cliproxy/binary-manager.d.ts +5 -1
  21. package/dist/cliproxy/binary-manager.d.ts.map +1 -1
  22. package/dist/cliproxy/binary-manager.js +10 -2
  23. package/dist/cliproxy/binary-manager.js.map +1 -1
  24. package/dist/cliproxy/codex-plan-compatibility.d.ts.map +1 -1
  25. package/dist/cliproxy/codex-plan-compatibility.js +6 -6
  26. package/dist/cliproxy/codex-plan-compatibility.js.map +1 -1
  27. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  28. package/dist/cliproxy/executor/index.js +9 -6
  29. package/dist/cliproxy/executor/index.js.map +1 -1
  30. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  31. package/dist/cliproxy/model-catalog.js +14 -59
  32. package/dist/cliproxy/model-catalog.js.map +1 -1
  33. package/dist/cliproxy/model-id-normalizer.d.ts +2 -0
  34. package/dist/cliproxy/model-id-normalizer.d.ts.map +1 -1
  35. package/dist/cliproxy/model-id-normalizer.js +25 -1
  36. package/dist/cliproxy/model-id-normalizer.js.map +1 -1
  37. package/dist/cliproxy/provider-capabilities.js +1 -1
  38. package/dist/cliproxy/provider-capabilities.js.map +1 -1
  39. package/dist/cliproxy/quota-fetcher-gemini-cli.d.ts.map +1 -1
  40. package/dist/cliproxy/quota-fetcher-gemini-cli.js +221 -99
  41. package/dist/cliproxy/quota-fetcher-gemini-cli.js.map +1 -1
  42. package/dist/cliproxy/service-manager.d.ts.map +1 -1
  43. package/dist/cliproxy/service-manager.js +4 -1
  44. package/dist/cliproxy/service-manager.js.map +1 -1
  45. package/dist/cliproxy/types.d.ts +4 -0
  46. package/dist/cliproxy/types.d.ts.map +1 -1
  47. package/dist/cliproxy/types.js.map +1 -1
  48. package/dist/commands/browser-command.d.ts +5 -0
  49. package/dist/commands/browser-command.d.ts.map +1 -0
  50. package/dist/commands/browser-command.js +118 -0
  51. package/dist/commands/browser-command.js.map +1 -0
  52. package/dist/commands/command-catalog.d.ts +1 -1
  53. package/dist/commands/command-catalog.d.ts.map +1 -1
  54. package/dist/commands/command-catalog.js +8 -0
  55. package/dist/commands/command-catalog.js.map +1 -1
  56. package/dist/commands/help-command.d.ts.map +1 -1
  57. package/dist/commands/help-command.js +7 -1
  58. package/dist/commands/help-command.js.map +1 -1
  59. package/dist/commands/root-command-router.d.ts.map +1 -1
  60. package/dist/commands/root-command-router.js +7 -0
  61. package/dist/commands/root-command-router.js.map +1 -1
  62. package/dist/config/unified-config-loader.d.ts +6 -1
  63. package/dist/config/unified-config-loader.d.ts.map +1 -1
  64. package/dist/config/unified-config-loader.js +48 -1
  65. package/dist/config/unified-config-loader.js.map +1 -1
  66. package/dist/config/unified-config-types.d.ts +23 -0
  67. package/dist/config/unified-config-types.d.ts.map +1 -1
  68. package/dist/config/unified-config-types.js +15 -1
  69. package/dist/config/unified-config-types.js.map +1 -1
  70. package/dist/ui/assets/{accounts-up6O2Vw5.js → accounts-DfkqFx14.js} +1 -1
  71. package/dist/ui/assets/{alert-dialog-C26FA4KH.js → alert-dialog-BJ9GwHLZ.js} +1 -1
  72. package/dist/ui/assets/{api-CpnluwGG.js → api-BVo8Vm1B.js} +1 -1
  73. package/dist/ui/assets/{auth-section-Bb6bGMzd.js → auth-section-B-Ms1O_M.js} +1 -1
  74. package/dist/ui/assets/{backups-section-B3iJAm_q.js → backups-section-f8hvkPfH.js} +1 -1
  75. package/dist/ui/assets/{channels-BOUHONOp.js → channels-Bgvry5fT.js} +1 -1
  76. package/dist/ui/assets/{checkbox-Cv61ZJkR.js → checkbox-CbI3Vbww.js} +1 -1
  77. package/dist/ui/assets/{claude-extension-CpInsOGa.js → claude-extension-lDT7lp8C.js} +1 -1
  78. package/dist/ui/assets/{cliproxy-MrCeUYEj.js → cliproxy-D50Owb9u.js} +1 -1
  79. package/dist/ui/assets/{cliproxy-ai-providers-BdZUSR0c.js → cliproxy-ai-providers-Cjrk90aJ.js} +8 -8
  80. package/dist/ui/assets/{cliproxy-control-panel-CzoPb1L0.js → cliproxy-control-panel-DL8JoyKU.js} +1 -1
  81. package/dist/ui/assets/codex-B3bW7lzx.js +27 -0
  82. package/dist/ui/assets/{confirm-dialog-Cn0zRAZD.js → confirm-dialog-Bm2Y3ArL.js} +1 -1
  83. package/dist/ui/assets/{copilot-DEcOh5Ud.js → copilot-CPLBRpFA.js} +1 -1
  84. package/dist/ui/assets/{cursor-Chou-K9z.js → cursor-D1xhqEEF.js} +1 -1
  85. package/dist/ui/assets/{droid-CdCauq8o.js → droid-DiFtSJkl.js} +2 -2
  86. package/dist/ui/assets/{globalenv-section-oCXYuCaq.js → globalenv-section-BadlR8mm.js} +1 -1
  87. package/dist/ui/assets/{health-CJV8IW9a.js → health-Bxol1p1X.js} +1 -1
  88. package/dist/ui/assets/{icons-KVCk4_U8.js → icons-Dmi9qMuE.js} +1 -1
  89. package/dist/ui/assets/{index--MHgrdx1.js → index-BPCsEKJ8.js} +1 -1
  90. package/dist/ui/assets/{index-Dy8pF8lj.js → index-BZYBDV6A.js} +1 -1
  91. package/dist/ui/assets/index-C2-J9AKi.js +1 -0
  92. package/dist/ui/assets/{index-B76-jmCe.js → index-CA4r5qY8.js} +1 -1
  93. package/dist/ui/assets/index-CXRoMyUA.js +9 -0
  94. package/dist/ui/assets/index-DM7Qb4kd.js +72 -0
  95. package/dist/ui/assets/index-DuTB1_9r.css +1 -0
  96. package/dist/ui/assets/{index-C8sSjzXR.js → index-x07V45Iw.js} +1 -1
  97. package/dist/ui/assets/{logs-C9rsLdt2.js → logs-kvpMF-pw.js} +1 -1
  98. package/dist/ui/assets/{masked-input-JFwvyboM.js → masked-input-CFQ05toP.js} +1 -1
  99. package/dist/ui/assets/{proxy-status-widget-BkUL11eI.js → proxy-status-widget-Df_-wCR0.js} +1 -1
  100. package/dist/ui/assets/{raw-json-settings-editor-panel-Dig-H9J4.js → raw-json-settings-editor-panel-DeWgWDSP.js} +1 -1
  101. package/dist/ui/assets/{searchable-select-BEVzZw37.js → searchable-select-CPbVBSoE.js} +1 -1
  102. package/dist/ui/assets/{separator-Bz4dRRTZ.js → separator--T-CzItG.js} +1 -1
  103. package/dist/ui/assets/{shared-C5MGixn2.js → shared-Dx_5pa5N.js} +1 -1
  104. package/dist/ui/assets/{table-B55noG3_.js → table-wE_LUUUQ.js} +1 -1
  105. package/dist/ui/assets/{updates-DqxKK8Is.js → updates-mWDqf-fm.js} +1 -1
  106. package/dist/ui/index.html +3 -3
  107. package/dist/utils/browser/browser-settings.d.ts +21 -0
  108. package/dist/utils/browser/browser-settings.d.ts.map +1 -0
  109. package/dist/utils/browser/browser-settings.js +101 -0
  110. package/dist/utils/browser/browser-settings.js.map +1 -0
  111. package/dist/utils/browser/browser-status.d.ts +39 -0
  112. package/dist/utils/browser/browser-status.d.ts.map +1 -0
  113. package/dist/utils/browser/browser-status.js +134 -0
  114. package/dist/utils/browser/browser-status.js.map +1 -0
  115. package/dist/utils/browser/index.d.ts +3 -0
  116. package/dist/utils/browser/index.d.ts.map +1 -1
  117. package/dist/utils/browser/index.js +7 -1
  118. package/dist/utils/browser/index.js.map +1 -1
  119. package/dist/utils/browser/platform.d.ts +4 -0
  120. package/dist/utils/browser/platform.d.ts.map +1 -0
  121. package/dist/utils/browser/platform.js +12 -0
  122. package/dist/utils/browser/platform.js.map +1 -0
  123. package/dist/web-server/routes/browser-routes.d.ts +3 -0
  124. package/dist/web-server/routes/browser-routes.d.ts.map +1 -0
  125. package/dist/web-server/routes/browser-routes.js +116 -0
  126. package/dist/web-server/routes/browser-routes.js.map +1 -0
  127. package/dist/web-server/routes/index.d.ts.map +1 -1
  128. package/dist/web-server/routes/index.js +2 -0
  129. package/dist/web-server/routes/index.js.map +1 -1
  130. package/dist/web-server/services/compatible-cli-docs-registry.d.ts.map +1 -1
  131. package/dist/web-server/services/compatible-cli-docs-registry.js +1 -0
  132. package/dist/web-server/services/compatible-cli-docs-registry.js.map +1 -1
  133. package/package.json +1 -1
  134. package/dist/cliproxy/auth/gemini-token-refresh.d.ts +0 -40
  135. package/dist/cliproxy/auth/gemini-token-refresh.d.ts.map +0 -1
  136. package/dist/cliproxy/auth/gemini-token-refresh.js +0 -371
  137. package/dist/cliproxy/auth/gemini-token-refresh.js.map +0 -1
  138. package/dist/ui/assets/codex-SJfAqoC_.js +0 -27
  139. package/dist/ui/assets/index-CMw06WDy.js +0 -1
  140. package/dist/ui/assets/index-DzJi9m-K.css +0 -1
  141. package/dist/ui/assets/index-jK_rEzZ0.js +0 -72
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNodePlatformKey = void 0;
4
+ function getNodePlatformKey(platform = process.platform) {
5
+ if (platform === 'darwin')
6
+ return 'darwin';
7
+ if (platform === 'win32')
8
+ return 'win32';
9
+ return 'linux';
10
+ }
11
+ exports.getNodePlatformKey = getNodePlatformKey;
12
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/utils/browser/platform.ts"],"names":[],"mappings":";;;AAEA,SAAgB,kBAAkB,CAChC,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAND,gDAMC"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=browser-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-routes.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/browser-routes.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAoIxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
5
+ const browser_1 = require("../../utils/browser");
6
+ const auth_middleware_1 = require("../middleware/auth-middleware");
7
+ const router = (0, express_1.Router)();
8
+ const BROWSER_LOCAL_ACCESS_ERROR = 'Browser endpoints require localhost access when dashboard auth is disabled.';
9
+ function isValidDevtoolsPort(value) {
10
+ return Number.isInteger(value) && value >= 1 && value <= 65535;
11
+ }
12
+ router.use((req, res, next) => {
13
+ if ((0, auth_middleware_1.requireLocalAccessWhenAuthDisabled)(req, res, BROWSER_LOCAL_ACCESS_ERROR)) {
14
+ next();
15
+ }
16
+ });
17
+ router.get('/', async (_req, res) => {
18
+ try {
19
+ const config = (0, unified_config_loader_1.getBrowserConfig)();
20
+ const status = await (0, browser_1.getBrowserStatus)();
21
+ res.json({
22
+ config: toBrowserRouteConfig(config),
23
+ status,
24
+ });
25
+ }
26
+ catch (error) {
27
+ res.status(500).json({ error: error.message });
28
+ }
29
+ });
30
+ router.get('/status', async (_req, res) => {
31
+ try {
32
+ res.json(await (0, browser_1.getBrowserStatus)());
33
+ }
34
+ catch (error) {
35
+ res.status(500).json({ error: error.message });
36
+ }
37
+ });
38
+ router.put('/', async (req, res) => {
39
+ if (req.body === null ||
40
+ req.body === undefined ||
41
+ typeof req.body !== 'object' ||
42
+ Array.isArray(req.body)) {
43
+ res.status(400).json({ error: 'Invalid request body. Must be an object.' });
44
+ return;
45
+ }
46
+ const { claude, codex } = req.body;
47
+ if (claude && (typeof claude !== 'object' || Array.isArray(claude))) {
48
+ res.status(400).json({ error: 'Invalid value for claude. Must be an object.' });
49
+ return;
50
+ }
51
+ if (codex && (typeof codex !== 'object' || Array.isArray(codex))) {
52
+ res.status(400).json({ error: 'Invalid value for codex. Must be an object.' });
53
+ return;
54
+ }
55
+ if (claude?.enabled !== undefined && typeof claude.enabled !== 'boolean') {
56
+ res.status(400).json({ error: 'Invalid value for claude.enabled. Must be a boolean.' });
57
+ return;
58
+ }
59
+ if (claude?.userDataDir !== undefined && typeof claude.userDataDir !== 'string') {
60
+ res.status(400).json({ error: 'Invalid value for claude.userDataDir. Must be a string.' });
61
+ return;
62
+ }
63
+ if (claude?.devtoolsPort !== undefined &&
64
+ (typeof claude.devtoolsPort !== 'number' || !isValidDevtoolsPort(claude.devtoolsPort))) {
65
+ res.status(400).json({
66
+ error: 'Invalid value for claude.devtoolsPort. Must be an integer between 1 and 65535.',
67
+ });
68
+ return;
69
+ }
70
+ if (codex?.enabled !== undefined && typeof codex.enabled !== 'boolean') {
71
+ res.status(400).json({ error: 'Invalid value for codex.enabled. Must be a boolean.' });
72
+ return;
73
+ }
74
+ try {
75
+ const current = (0, unified_config_loader_1.getBrowserConfig)();
76
+ const nextClaudeUserDataDir = claude?.userDataDir === undefined ? current.claude.user_data_dir : claude.userDataDir.trim();
77
+ (0, unified_config_loader_1.mutateUnifiedConfig)((config) => {
78
+ config.browser = {
79
+ claude: {
80
+ enabled: claude?.enabled ?? current.claude.enabled,
81
+ user_data_dir: nextClaudeUserDataDir,
82
+ devtools_port: claude?.devtoolsPort ?? current.claude.devtools_port,
83
+ },
84
+ codex: {
85
+ enabled: codex?.enabled ?? current.codex.enabled,
86
+ },
87
+ };
88
+ });
89
+ const config = (0, unified_config_loader_1.getBrowserConfig)();
90
+ const status = await (0, browser_1.getBrowserStatus)();
91
+ res.json({
92
+ success: true,
93
+ browser: {
94
+ config: toBrowserRouteConfig(config),
95
+ status,
96
+ },
97
+ });
98
+ }
99
+ catch (error) {
100
+ res.status(500).json({ error: error.message });
101
+ }
102
+ });
103
+ function toBrowserRouteConfig(config) {
104
+ return {
105
+ claude: {
106
+ enabled: config.claude.enabled,
107
+ userDataDir: config.claude.user_data_dir,
108
+ devtoolsPort: config.claude.devtools_port,
109
+ },
110
+ codex: {
111
+ enabled: config.codex.enabled,
112
+ },
113
+ };
114
+ }
115
+ exports.default = router;
116
+ //# sourceMappingURL=browser-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-routes.js","sourceRoot":"","sources":["../../../src/web-server/routes/browser-routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH,eAAO,MAAM,SAAS,4CAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH,eAAO,MAAM,SAAS,4CAAW,CAAC"}
@@ -23,6 +23,7 @@ const settings_routes_1 = __importDefault(require("./settings-routes"));
23
23
  const channels_routes_1 = __importDefault(require("./channels-routes"));
24
24
  const websearch_routes_1 = __importDefault(require("./websearch-routes"));
25
25
  const image_analysis_routes_1 = __importDefault(require("./image-analysis-routes"));
26
+ const browser_routes_1 = __importDefault(require("./browser-routes"));
26
27
  const cliproxy_auth_routes_1 = __importDefault(require("./cliproxy-auth-routes"));
27
28
  const cliproxy_stats_routes_1 = __importDefault(require("./cliproxy-stats-routes"));
28
29
  const cliproxy_routing_routes_1 = __importDefault(require("./cliproxy-routing-routes"));
@@ -86,6 +87,7 @@ exports.apiRoutes.use('/cliproxy/ai-providers', ai_provider_routes_1.default);
86
87
  exports.apiRoutes.use('/cliproxy/openai-compat', provider_routes_1.default);
87
88
  // ==================== WebSearch ====================
88
89
  exports.apiRoutes.use('/websearch', websearch_routes_1.default);
90
+ exports.apiRoutes.use('/browser', browser_routes_1.default);
89
91
  exports.apiRoutes.use('/image-analysis', image_analysis_routes_1.default);
90
92
  // ==================== Copilot ====================
91
93
  exports.apiRoutes.use('/copilot', copilot_routes_1.default);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web-server/routes/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web-server/routes/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compatible-cli-docs-registry.d.ts","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-docs-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9D,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,YAAY,EAAE,4BAA4B,EAAE,CAAC;CAC9C;AAgJD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,0BAA0B,CAMvF"}
1
+ {"version":3,"file":"compatible-cli-docs-registry.d.ts","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-docs-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;IAC9D,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,YAAY,EAAE,4BAA4B,EAAE,CAAC;CAC9C;AAiJD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,0BAA0B,CAMvF"}
@@ -87,6 +87,7 @@ const COMPATIBLE_CLI_DOCS_REGISTRY = {
87
87
  'CLI --profile selects a named [profiles.<name>] overlay on top of base config',
88
88
  'CCS-backed Codex launches may apply transient -c overrides and CCS_CODEX_API_KEY',
89
89
  'Official docs treat model_providers, mcp_servers, features, and project trust as schema-backed config surfaces',
90
+ 'CCS-managed browser tooling for Codex should be configured from Settings > Browser, not by editing the ccs_browser MCP entry directly',
90
91
  ],
91
92
  links: [
92
93
  {
@@ -1 +1 @@
1
- {"version":3,"file":"compatible-cli-docs-registry.js","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-docs-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compatible-cli-docs-registry.js","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-docs-registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaitranntt/ccs",
3
- "version": "7.71.0-dev.9",
3
+ "version": "7.72.0",
4
4
  "description": "Claude Code Switch - Instant profile switching between Claude, GLM, Kimi, and more",
5
5
  "keywords": [
6
6
  "cli",
@@ -1,40 +0,0 @@
1
- /**
2
- * Gemini Token Refresh
3
- *
4
- * Handles proactive token validation and refresh for Gemini OAuth tokens.
5
- * Prevents UND_ERR_SOCKET errors by ensuring tokens are valid before use.
6
- *
7
- * Token sources (priority order):
8
- * 1. CLIProxy auth dir (~/.ccs/cliproxy/auth/) - CCS-managed tokens
9
- * 2. Standard Gemini CLI (~/.gemini/oauth_creds.json) - backward compatibility
10
- */
11
- /**
12
- * Get path to Gemini OAuth credentials file
13
- */
14
- export declare function getGeminiOAuthPath(): string;
15
- /**
16
- * Check if Gemini token is expired or expiring soon
17
- */
18
- export declare function isGeminiTokenExpiringSoon(accountId?: string): boolean;
19
- /**
20
- * Refresh Gemini access token using refresh_token
21
- * @param accountId Optional account ID for account-scoped refresh
22
- * @returns Result with success status, optional error, and expiry time
23
- */
24
- export declare function refreshGeminiToken(accountId?: string): Promise<{
25
- success: boolean;
26
- error?: string;
27
- expiresAt?: number;
28
- }>;
29
- /**
30
- * Ensure Gemini token is valid, refreshing if needed
31
- * @param verbose Log progress if true
32
- * @param accountId Optional account ID for account-scoped refresh
33
- * @returns true if token is valid (or was refreshed), false if refresh failed
34
- */
35
- export declare function ensureGeminiTokenValid(verbose?: boolean, accountId?: string): Promise<{
36
- valid: boolean;
37
- refreshed: boolean;
38
- error?: string;
39
- }>;
40
- //# sourceMappingURL=gemini-token-refresh.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-token-refresh.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/auth/gemini-token-refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsEH;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AA+ND;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAUrE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAkED;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,UAAQ,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IACT,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAwBD"}
@@ -1,371 +0,0 @@
1
- "use strict";
2
- /**
3
- * Gemini Token Refresh
4
- *
5
- * Handles proactive token validation and refresh for Gemini OAuth tokens.
6
- * Prevents UND_ERR_SOCKET errors by ensuring tokens are valid before use.
7
- *
8
- * Token sources (priority order):
9
- * 1. CLIProxy auth dir (~/.ccs/cliproxy/auth/) - CCS-managed tokens
10
- * 2. Standard Gemini CLI (~/.gemini/oauth_creds.json) - backward compatibility
11
- */
12
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- var desc = Object.getOwnPropertyDescriptor(m, k);
15
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
- desc = { enumerable: true, get: function() { return m[k]; } };
17
- }
18
- Object.defineProperty(o, k2, desc);
19
- }) : (function(o, m, k, k2) {
20
- if (k2 === undefined) k2 = k;
21
- o[k2] = m[k];
22
- }));
23
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
- Object.defineProperty(o, "default", { enumerable: true, value: v });
25
- }) : function(o, v) {
26
- o["default"] = v;
27
- });
28
- var __importStar = (this && this.__importStar) || function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ensureGeminiTokenValid = exports.refreshGeminiToken = exports.isGeminiTokenExpiringSoon = exports.getGeminiOAuthPath = void 0;
37
- const fs = __importStar(require("fs"));
38
- const path = __importStar(require("path"));
39
- const os = __importStar(require("os"));
40
- const config_generator_1 = require("../config-generator");
41
- const account_manager_1 = require("../account-manager");
42
- const token_manager_1 = require("./token-manager");
43
- /** Google OAuth token endpoint */
44
- const GOOGLE_TOKEN_URL = 'https://oauth2.googleapis.com/token';
45
- /** Refresh tokens 5 minutes before expiry */
46
- const REFRESH_LEAD_TIME_MS = 5 * 60 * 1000;
47
- const GEMINI_CLIENT_ID_ENV_KEYS = ['CCS_GEMINI_OAUTH_CLIENT_ID', 'OPENCLAW_GEMINI_OAUTH_CLIENT_ID'];
48
- const GEMINI_CLIENT_SECRET_ENV_KEYS = [
49
- 'CCS_GEMINI_OAUTH_CLIENT_SECRET',
50
- 'OPENCLAW_GEMINI_OAUTH_CLIENT_SECRET',
51
- ];
52
- /**
53
- * Get path to Gemini OAuth credentials file
54
- */
55
- function getGeminiOAuthPath() {
56
- return path.join(os.homedir(), '.gemini', 'oauth_creds.json');
57
- }
58
- exports.getGeminiOAuthPath = getGeminiOAuthPath;
59
- /**
60
- * Map CLIProxyAPI token format to internal GeminiOAuthCreds format
61
- */
62
- function mapCliproxyToGeminiCreds(cliproxy) {
63
- return {
64
- access_token: cliproxy.token.access_token,
65
- refresh_token: cliproxy.token.refresh_token,
66
- expiry_date: cliproxy.token.expiry,
67
- token_type: 'Bearer',
68
- client_id: cliproxy.token.client_id,
69
- client_secret: cliproxy.token.client_secret,
70
- token_uri: cliproxy.token.token_uri,
71
- };
72
- }
73
- /**
74
- * Validate CLIProxyAPI token structure has required fields
75
- */
76
- function isValidCliproxyToken(data) {
77
- if (typeof data !== 'object' || data === null)
78
- return false;
79
- const obj = data;
80
- if (obj.type !== 'gemini')
81
- return false;
82
- if (typeof obj.token !== 'object' || obj.token === null)
83
- return false;
84
- const token = obj.token;
85
- return typeof token.access_token === 'string';
86
- }
87
- function getFirstEnvValue(keys) {
88
- for (const key of keys) {
89
- const value = process.env[key]?.trim();
90
- if (value) {
91
- return value;
92
- }
93
- }
94
- return undefined;
95
- }
96
- function resolveGeminiRefreshCredentials(creds) {
97
- const clientId = creds.client_id?.trim() || getFirstEnvValue(GEMINI_CLIENT_ID_ENV_KEYS);
98
- const clientSecret = creds.client_secret?.trim() || getFirstEnvValue(GEMINI_CLIENT_SECRET_ENV_KEYS);
99
- if (!clientId || !clientSecret) {
100
- return {
101
- error: 'Gemini token refresh unavailable: missing OAuth client credentials in the token file. ' +
102
- 'Re-authenticate with CLIProxy or set CCS_GEMINI_OAUTH_CLIENT_ID and CCS_GEMINI_OAUTH_CLIENT_SECRET.',
103
- };
104
- }
105
- return {
106
- credentials: {
107
- clientId,
108
- clientSecret,
109
- tokenUrl: creds.token_uri?.trim() || GOOGLE_TOKEN_URL,
110
- },
111
- };
112
- }
113
- /**
114
- * Read Gemini token from CLIProxy auth directory
115
- * Returns credentials with source path, or null if no valid token found
116
- */
117
- function readCliproxyGeminiCreds(accountId) {
118
- const authDir = (0, config_generator_1.getProviderAuthDir)('gemini');
119
- if (!fs.existsSync(authDir))
120
- return null;
121
- let tokenPath = null;
122
- const normalizedAccountId = accountId?.trim();
123
- const accounts = (0, account_manager_1.getProviderAccounts)('gemini');
124
- // Account-specific refresh path (used by background worker)
125
- if (normalizedAccountId) {
126
- const targetAccount = accounts.find((account) => account.id === normalizedAccountId);
127
- if (!targetAccount) {
128
- return null;
129
- }
130
- tokenPath = path.join(authDir, targetAccount.tokenFile);
131
- }
132
- if (!normalizedAccountId) {
133
- // Try to find default account's token file
134
- const defaultAccount = (0, account_manager_1.getDefaultAccount)('gemini');
135
- if (defaultAccount) {
136
- tokenPath = path.join(authDir, defaultAccount.tokenFile);
137
- if (!fs.existsSync(tokenPath))
138
- tokenPath = null;
139
- }
140
- // Fallback: find any gemini account token file
141
- if (!tokenPath && accounts.length > 0) {
142
- tokenPath = path.join(authDir, accounts[0].tokenFile);
143
- if (!fs.existsSync(tokenPath))
144
- tokenPath = null;
145
- }
146
- // Last fallback: scan directory for gemini token files
147
- if (!tokenPath) {
148
- try {
149
- const files = fs.readdirSync(authDir).filter((f) => f.endsWith('.json'));
150
- for (const file of files) {
151
- const filePath = path.join(authDir, file);
152
- if (file.startsWith('gemini-') || (0, token_manager_1.isTokenFileForProvider)(filePath, 'gemini')) {
153
- tokenPath = filePath;
154
- break;
155
- }
156
- }
157
- }
158
- catch {
159
- // Directory read failed - continue to return null
160
- return null;
161
- }
162
- }
163
- }
164
- if (!tokenPath)
165
- return null;
166
- try {
167
- const content = fs.readFileSync(tokenPath, 'utf8');
168
- const data = JSON.parse(content);
169
- // Validate CLIProxyAPI format with proper type checking
170
- if (isValidCliproxyToken(data)) {
171
- return {
172
- creds: mapCliproxyToGeminiCreds(data),
173
- sourcePath: tokenPath,
174
- };
175
- }
176
- return null;
177
- }
178
- catch {
179
- return null;
180
- }
181
- }
182
- /**
183
- * Read Gemini OAuth credentials
184
- * Priority: CLIProxy auth dir first, then ~/.gemini/oauth_creds.json
185
- * Returns credentials with source path for correct write-back
186
- */
187
- function readGeminiCreds(accountId) {
188
- // 1. Try CLIProxy auth directory first (CCS-managed tokens)
189
- const cliproxyResult = readCliproxyGeminiCreds(accountId);
190
- if (cliproxyResult) {
191
- return cliproxyResult;
192
- }
193
- // Account-scoped refresh is only supported for CLIProxy account files.
194
- // Do not fall back to ~/.gemini for a specific accountId.
195
- if (accountId?.trim()) {
196
- return null;
197
- }
198
- // 2. Fall back to standard Gemini CLI location
199
- const oauthPath = getGeminiOAuthPath();
200
- if (!fs.existsSync(oauthPath)) {
201
- return null;
202
- }
203
- try {
204
- const content = fs.readFileSync(oauthPath, 'utf8');
205
- return {
206
- creds: JSON.parse(content),
207
- sourcePath: oauthPath,
208
- };
209
- }
210
- catch {
211
- return null;
212
- }
213
- }
214
- /**
215
- * Write updated credentials to CLIProxy token file
216
- * Preserves existing fields (email, project_id), only updates token subfields
217
- */
218
- function writeCliproxyGeminiCreds(tokenPath, creds) {
219
- try {
220
- const existing = JSON.parse(fs.readFileSync(tokenPath, 'utf8'));
221
- const updated = {
222
- ...existing,
223
- token: {
224
- ...existing.token,
225
- access_token: creds.access_token,
226
- refresh_token: creds.refresh_token,
227
- expiry: creds.expiry_date,
228
- },
229
- };
230
- fs.writeFileSync(tokenPath, JSON.stringify(updated, null, 2), { mode: 0o600 });
231
- return undefined;
232
- }
233
- catch (err) {
234
- return err instanceof Error ? err.message : 'Failed to write credentials';
235
- }
236
- }
237
- /**
238
- * Write Gemini OAuth credentials
239
- * Writes back to the specified source location (CLIProxy or ~/.gemini)
240
- * @param creds - The credentials to write
241
- * @param sourcePath - The path where credentials were originally read from
242
- * @returns error message if write failed, undefined on success
243
- */
244
- function writeGeminiCreds(creds, sourcePath) {
245
- const geminiOAuthPath = getGeminiOAuthPath();
246
- // If source is not the standard Gemini path, write to CLIProxy format
247
- if (sourcePath !== geminiOAuthPath) {
248
- return writeCliproxyGeminiCreds(sourcePath, creds);
249
- }
250
- // Otherwise write to standard Gemini CLI location
251
- const dir = path.dirname(geminiOAuthPath);
252
- try {
253
- if (!fs.existsSync(dir)) {
254
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
255
- }
256
- fs.writeFileSync(geminiOAuthPath, JSON.stringify(creds, null, 2), { mode: 0o600 });
257
- return undefined;
258
- }
259
- catch (err) {
260
- return err instanceof Error ? err.message : 'Failed to write credentials';
261
- }
262
- }
263
- /**
264
- * Check if Gemini token is expired or expiring soon
265
- */
266
- function isGeminiTokenExpiringSoon(accountId) {
267
- const result = readGeminiCreds(accountId);
268
- if (!result || !result.creds.access_token) {
269
- return true; // No token = needs auth
270
- }
271
- if (!result.creds.expiry_date) {
272
- return false; // No expiry info = assume valid
273
- }
274
- const expiresIn = result.creds.expiry_date - Date.now();
275
- return expiresIn < REFRESH_LEAD_TIME_MS;
276
- }
277
- exports.isGeminiTokenExpiringSoon = isGeminiTokenExpiringSoon;
278
- /**
279
- * Refresh Gemini access token using refresh_token
280
- * @param accountId Optional account ID for account-scoped refresh
281
- * @returns Result with success status, optional error, and expiry time
282
- */
283
- async function refreshGeminiToken(accountId) {
284
- const result = readGeminiCreds(accountId);
285
- if (!result || !result.creds.refresh_token) {
286
- return { success: false, error: 'No refresh token available' };
287
- }
288
- const { creds, sourcePath } = result;
289
- const resolvedCredentials = resolveGeminiRefreshCredentials(creds);
290
- if (!resolvedCredentials.credentials) {
291
- return { success: false, error: resolvedCredentials.error };
292
- }
293
- const { clientId, clientSecret, tokenUrl } = resolvedCredentials.credentials;
294
- const controller = new AbortController();
295
- const timeoutId = setTimeout(() => controller.abort(), 10000);
296
- try {
297
- const response = await fetch(tokenUrl, {
298
- method: 'POST',
299
- signal: controller.signal,
300
- headers: {
301
- 'Content-Type': 'application/x-www-form-urlencoded',
302
- },
303
- body: new URLSearchParams({
304
- grant_type: 'refresh_token',
305
- refresh_token: creds.refresh_token, // Already validated above
306
- client_id: clientId,
307
- client_secret: clientSecret,
308
- }).toString(),
309
- });
310
- clearTimeout(timeoutId);
311
- const data = (await response.json());
312
- if (!response.ok || data.error) {
313
- return {
314
- success: false,
315
- error: data.error_description || data.error || `OAuth error: ${response.status}`,
316
- };
317
- }
318
- if (!data.access_token) {
319
- return { success: false, error: 'No access_token in response' };
320
- }
321
- // Update credentials file with new token
322
- const expiresAt = Date.now() + (data.expires_in ?? 3600) * 1000;
323
- const updatedCreds = {
324
- ...creds,
325
- access_token: data.access_token,
326
- expiry_date: expiresAt,
327
- };
328
- const writeError = writeGeminiCreds(updatedCreds, sourcePath);
329
- if (writeError) {
330
- return { success: false, error: `Token refreshed but failed to save: ${writeError}` };
331
- }
332
- return { success: true, expiresAt };
333
- }
334
- catch (err) {
335
- clearTimeout(timeoutId);
336
- if (err instanceof Error && err.name === 'AbortError') {
337
- return { success: false, error: 'Token refresh timeout' };
338
- }
339
- return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };
340
- }
341
- }
342
- exports.refreshGeminiToken = refreshGeminiToken;
343
- /**
344
- * Ensure Gemini token is valid, refreshing if needed
345
- * @param verbose Log progress if true
346
- * @param accountId Optional account ID for account-scoped refresh
347
- * @returns true if token is valid (or was refreshed), false if refresh failed
348
- */
349
- async function ensureGeminiTokenValid(verbose = false, accountId) {
350
- const result = readGeminiCreds(accountId);
351
- if (!result || !result.creds.access_token) {
352
- return { valid: false, refreshed: false, error: 'No Gemini credentials found' };
353
- }
354
- if (!isGeminiTokenExpiringSoon(accountId)) {
355
- return { valid: true, refreshed: false };
356
- }
357
- // Token is expired or expiring soon - try to refresh
358
- if (verbose) {
359
- console.log('[i] Gemini token expired or expiring soon, refreshing...');
360
- }
361
- const refreshResult = await refreshGeminiToken(accountId);
362
- if (refreshResult.success) {
363
- if (verbose) {
364
- console.log('[OK] Gemini token refreshed successfully');
365
- }
366
- return { valid: true, refreshed: true };
367
- }
368
- return { valid: false, refreshed: false, error: refreshResult.error };
369
- }
370
- exports.ensureGeminiTokenValid = ensureGeminiTokenValid;
371
- //# sourceMappingURL=gemini-token-refresh.js.map