@kaitranntt/ccs 7.71.0-dev.7 → 7.71.0-dev.8

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 (115) hide show
  1. package/README.md +34 -0
  2. package/dist/ccs.js +31 -0
  3. package/dist/ccs.js.map +1 -1
  4. package/dist/commands/command-catalog.d.ts +1 -0
  5. package/dist/commands/command-catalog.d.ts.map +1 -1
  6. package/dist/commands/command-catalog.js +8 -1
  7. package/dist/commands/command-catalog.js.map +1 -1
  8. package/dist/commands/completion-backend.d.ts.map +1 -1
  9. package/dist/commands/completion-backend.js +4 -0
  10. package/dist/commands/completion-backend.js.map +1 -1
  11. package/dist/commands/help-command.d.ts.map +1 -1
  12. package/dist/commands/help-command.js +2 -0
  13. package/dist/commands/help-command.js.map +1 -1
  14. package/dist/commands/index.d.ts +1 -0
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +3 -1
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/proxy-command.d.ts +2 -0
  19. package/dist/commands/proxy-command.d.ts.map +1 -0
  20. package/dist/commands/proxy-command.js +156 -0
  21. package/dist/commands/proxy-command.js.map +1 -0
  22. package/dist/commands/root-command-router.d.ts.map +1 -1
  23. package/dist/commands/root-command-router.js +7 -0
  24. package/dist/commands/root-command-router.js.map +1 -1
  25. package/dist/config/reserved-names.d.ts +1 -1
  26. package/dist/config/reserved-names.d.ts.map +1 -1
  27. package/dist/config/reserved-names.js +1 -0
  28. package/dist/config/reserved-names.js.map +1 -1
  29. package/dist/config/unified-config-loader.d.ts.map +1 -1
  30. package/dist/config/unified-config-loader.js +19 -0
  31. package/dist/config/unified-config-loader.js.map +1 -1
  32. package/dist/config/unified-config-types.d.ts +14 -0
  33. package/dist/config/unified-config-types.d.ts.map +1 -1
  34. package/dist/config/unified-config-types.js +11 -1
  35. package/dist/config/unified-config-types.js.map +1 -1
  36. package/dist/cursor/cursor-anthropic-response.d.ts +1 -6
  37. package/dist/cursor/cursor-anthropic-response.d.ts.map +1 -1
  38. package/dist/cursor/cursor-anthropic-response.js +3 -186
  39. package/dist/cursor/cursor-anthropic-response.js.map +1 -1
  40. package/dist/glmt/sse-parser.d.ts.map +1 -1
  41. package/dist/glmt/sse-parser.js +46 -41
  42. package/dist/glmt/sse-parser.js.map +1 -1
  43. package/dist/proxy/index.d.ts +8 -0
  44. package/dist/proxy/index.d.ts.map +1 -0
  45. package/dist/proxy/index.js +24 -0
  46. package/dist/proxy/index.js.map +1 -0
  47. package/dist/proxy/profile-router.d.ts +28 -0
  48. package/dist/proxy/profile-router.d.ts.map +1 -0
  49. package/dist/proxy/profile-router.js +43 -0
  50. package/dist/proxy/profile-router.js.map +1 -0
  51. package/dist/proxy/proxy-daemon-entry.d.ts +2 -0
  52. package/dist/proxy/proxy-daemon-entry.d.ts.map +1 -0
  53. package/dist/proxy/proxy-daemon-entry.js +68 -0
  54. package/dist/proxy/proxy-daemon-entry.js.map +1 -0
  55. package/dist/proxy/proxy-daemon-paths.d.ts +6 -0
  56. package/dist/proxy/proxy-daemon-paths.d.ts.map +1 -0
  57. package/dist/proxy/proxy-daemon-paths.js +43 -0
  58. package/dist/proxy/proxy-daemon-paths.js.map +1 -0
  59. package/dist/proxy/proxy-daemon-state.d.ts +18 -0
  60. package/dist/proxy/proxy-daemon-state.d.ts.map +1 -0
  61. package/dist/proxy/proxy-daemon-state.js +92 -0
  62. package/dist/proxy/proxy-daemon-state.js.map +1 -0
  63. package/dist/proxy/proxy-daemon.d.ts +26 -0
  64. package/dist/proxy/proxy-daemon.d.ts.map +1 -0
  65. package/dist/proxy/proxy-daemon.js +350 -0
  66. package/dist/proxy/proxy-daemon.js.map +1 -0
  67. package/dist/proxy/proxy-env.d.ts +3 -0
  68. package/dist/proxy/proxy-env.d.ts.map +1 -0
  69. package/dist/proxy/proxy-env.js +26 -0
  70. package/dist/proxy/proxy-env.js.map +1 -0
  71. package/dist/proxy/request-router.d.ts +12 -0
  72. package/dist/proxy/request-router.d.ts.map +1 -0
  73. package/dist/proxy/request-router.js +163 -0
  74. package/dist/proxy/request-router.js.map +1 -0
  75. package/dist/proxy/routing-config.d.ts +10 -0
  76. package/dist/proxy/routing-config.d.ts.map +1 -0
  77. package/dist/proxy/routing-config.js +79 -0
  78. package/dist/proxy/routing-config.js.map +1 -0
  79. package/dist/proxy/server/http-helpers.d.ts +8 -0
  80. package/dist/proxy/server/http-helpers.d.ts.map +1 -0
  81. package/dist/proxy/server/http-helpers.js +73 -0
  82. package/dist/proxy/server/http-helpers.js.map +1 -0
  83. package/dist/proxy/server/messages-route.d.ts +12 -0
  84. package/dist/proxy/server/messages-route.d.ts.map +1 -0
  85. package/dist/proxy/server/messages-route.js +208 -0
  86. package/dist/proxy/server/messages-route.js.map +1 -0
  87. package/dist/proxy/server/proxy-server.d.ts +12 -0
  88. package/dist/proxy/server/proxy-server.d.ts.map +1 -0
  89. package/dist/proxy/server/proxy-server.js +110 -0
  90. package/dist/proxy/server/proxy-server.js.map +1 -0
  91. package/dist/proxy/transformers/request-transformer.d.ts +52 -0
  92. package/dist/proxy/transformers/request-transformer.d.ts.map +1 -0
  93. package/dist/proxy/transformers/request-transformer.js +254 -0
  94. package/dist/proxy/transformers/request-transformer.js.map +1 -0
  95. package/dist/proxy/transformers/sse-stream-transformer.d.ts +11 -0
  96. package/dist/proxy/transformers/sse-stream-transformer.d.ts.map +1 -0
  97. package/dist/proxy/transformers/sse-stream-transformer.js +199 -0
  98. package/dist/proxy/transformers/sse-stream-transformer.js.map +1 -0
  99. package/dist/proxy/upstream-url.d.ts +3 -0
  100. package/dist/proxy/upstream-url.d.ts.map +1 -0
  101. package/dist/proxy/upstream-url.js +35 -0
  102. package/dist/proxy/upstream-url.js.map +1 -0
  103. package/dist/targets/droid-provider.d.ts.map +1 -1
  104. package/dist/targets/droid-provider.js +2 -0
  105. package/dist/targets/droid-provider.js.map +1 -1
  106. package/dist/types/config.d.ts +13 -0
  107. package/dist/types/config.d.ts.map +1 -1
  108. package/dist/types/config.js.map +1 -1
  109. package/dist/types/index.d.ts +1 -1
  110. package/dist/types/index.d.ts.map +1 -1
  111. package/dist/types/index.js.map +1 -1
  112. package/dist/web-server/routes/config-routes.d.ts.map +1 -1
  113. package/dist/web-server/routes/config-routes.js +3 -0
  114. package/dist/web-server/routes/config-routes.js.map +1 -1
  115. package/package.json +1 -1
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.getOpenAICompatProxySessionPath = exports.getOpenAICompatProxyPidPath = exports.getOpenAICompatProxyDir = exports.OPENAI_COMPAT_PROXY_SERVICE_NAME = exports.OPENAI_COMPAT_PROXY_DEFAULT_PORT = void 0;
27
+ const path = __importStar(require("path"));
28
+ const config_manager_1 = require("../utils/config-manager");
29
+ exports.OPENAI_COMPAT_PROXY_DEFAULT_PORT = 3456;
30
+ exports.OPENAI_COMPAT_PROXY_SERVICE_NAME = 'ccs-openai-compat-proxy';
31
+ function getOpenAICompatProxyDir() {
32
+ return path.join((0, config_manager_1.getCcsDir)(), 'proxy');
33
+ }
34
+ exports.getOpenAICompatProxyDir = getOpenAICompatProxyDir;
35
+ function getOpenAICompatProxyPidPath() {
36
+ return path.join(getOpenAICompatProxyDir(), 'daemon.pid');
37
+ }
38
+ exports.getOpenAICompatProxyPidPath = getOpenAICompatProxyPidPath;
39
+ function getOpenAICompatProxySessionPath() {
40
+ return path.join(getOpenAICompatProxyDir(), 'session.json');
41
+ }
42
+ exports.getOpenAICompatProxySessionPath = getOpenAICompatProxySessionPath;
43
+ //# sourceMappingURL=proxy-daemon-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-daemon-paths.js","sourceRoot":"","sources":["../../src/proxy/proxy-daemon-paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,4DAAoD;AAEvC,QAAA,gCAAgC,GAAG,IAAI,CAAC;AACxC,QAAA,gCAAgC,GAAG,yBAAyB,CAAC;AAE1E,SAAgB,uBAAuB;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,0BAAS,GAAE,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAFD,0DAEC;AAED,SAAgB,2BAA2B;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,YAAY,CAAC,CAAC;AAC5D,CAAC;AAFD,kEAEC;AAED,SAAgB,+BAA+B;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,cAAc,CAAC,CAAC;AAC9D,CAAC;AAFD,0EAEC"}
@@ -0,0 +1,18 @@
1
+ export interface OpenAICompatProxySession {
2
+ profileName: string;
3
+ settingsPath: string;
4
+ host: string;
5
+ port: number;
6
+ baseUrl: string;
7
+ authToken: string;
8
+ model?: string;
9
+ insecure?: boolean;
10
+ }
11
+ export declare function getOpenAICompatProxyPid(): number | null;
12
+ export declare function writeOpenAICompatProxyPid(pid: number): void;
13
+ export declare function removeOpenAICompatProxyPid(): void;
14
+ export declare function readOpenAICompatProxySession(): OpenAICompatProxySession | null;
15
+ export declare function writeOpenAICompatProxySession(session: OpenAICompatProxySession): void;
16
+ export declare function removeOpenAICompatProxySession(): void;
17
+ export declare function resolveOpenAICompatProxyEntrypointCandidates(): string[];
18
+ //# sourceMappingURL=proxy-daemon-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-daemon-state.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-daemon-state.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAQvD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG3D;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAMjD;AAED,wBAAgB,4BAA4B,IAAI,wBAAwB,GAAG,IAAI,CAQ9E;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAOrF;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAMrD;AAED,wBAAgB,4CAA4C,IAAI,MAAM,EAAE,CASvE"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.resolveOpenAICompatProxyEntrypointCandidates = exports.removeOpenAICompatProxySession = exports.writeOpenAICompatProxySession = exports.readOpenAICompatProxySession = exports.removeOpenAICompatProxyPid = exports.writeOpenAICompatProxyPid = exports.getOpenAICompatProxyPid = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ const proxy_daemon_paths_1 = require("./proxy-daemon-paths");
30
+ function ensureProxyDir() {
31
+ fs.mkdirSync((0, proxy_daemon_paths_1.getOpenAICompatProxyDir)(), { recursive: true });
32
+ }
33
+ function getOpenAICompatProxyPid() {
34
+ try {
35
+ const raw = fs.readFileSync((0, proxy_daemon_paths_1.getOpenAICompatProxyPidPath)(), 'utf8').trim();
36
+ const pid = Number.parseInt(raw, 10);
37
+ return Number.isInteger(pid) ? pid : null;
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ exports.getOpenAICompatProxyPid = getOpenAICompatProxyPid;
44
+ function writeOpenAICompatProxyPid(pid) {
45
+ ensureProxyDir();
46
+ fs.writeFileSync((0, proxy_daemon_paths_1.getOpenAICompatProxyPidPath)(), String(pid), 'utf8');
47
+ }
48
+ exports.writeOpenAICompatProxyPid = writeOpenAICompatProxyPid;
49
+ function removeOpenAICompatProxyPid() {
50
+ try {
51
+ fs.unlinkSync((0, proxy_daemon_paths_1.getOpenAICompatProxyPidPath)());
52
+ }
53
+ catch {
54
+ // Best-effort cleanup.
55
+ }
56
+ }
57
+ exports.removeOpenAICompatProxyPid = removeOpenAICompatProxyPid;
58
+ function readOpenAICompatProxySession() {
59
+ try {
60
+ return JSON.parse(fs.readFileSync((0, proxy_daemon_paths_1.getOpenAICompatProxySessionPath)(), 'utf8'));
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ exports.readOpenAICompatProxySession = readOpenAICompatProxySession;
67
+ function writeOpenAICompatProxySession(session) {
68
+ ensureProxyDir();
69
+ fs.writeFileSync((0, proxy_daemon_paths_1.getOpenAICompatProxySessionPath)(), JSON.stringify(session, null, 2) + '\n', 'utf8');
70
+ }
71
+ exports.writeOpenAICompatProxySession = writeOpenAICompatProxySession;
72
+ function removeOpenAICompatProxySession() {
73
+ try {
74
+ fs.unlinkSync((0, proxy_daemon_paths_1.getOpenAICompatProxySessionPath)());
75
+ }
76
+ catch {
77
+ // Best-effort cleanup.
78
+ }
79
+ }
80
+ exports.removeOpenAICompatProxySession = removeOpenAICompatProxySession;
81
+ function resolveOpenAICompatProxyEntrypointCandidates() {
82
+ const jsEntry = path.join(__dirname, 'proxy-daemon-entry.js');
83
+ const tsEntry = path.join(__dirname, 'proxy-daemon-entry.ts');
84
+ const isBunRuntime = process.execPath.toLowerCase().includes('bun');
85
+ const runningFromDist = __filename.endsWith('.js');
86
+ if (runningFromDist) {
87
+ return [jsEntry];
88
+ }
89
+ return isBunRuntime ? [tsEntry, jsEntry] : [jsEntry];
90
+ }
91
+ exports.resolveOpenAICompatProxyEntrypointCandidates = resolveOpenAICompatProxyEntrypointCandidates;
92
+ //# sourceMappingURL=proxy-daemon-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-daemon-state.js","sourceRoot":"","sources":["../../src/proxy/proxy-daemon-state.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,6DAI8B;AAa9B,SAAS,cAAc;IACrB,EAAE,CAAC,SAAS,CAAC,IAAA,4CAAuB,GAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,uBAAuB;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAA,gDAA2B,GAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AARD,0DAQC;AAED,SAAgB,yBAAyB,CAAC,GAAW;IACnD,cAAc,EAAE,CAAC;IACjB,EAAE,CAAC,aAAa,CAAC,IAAA,gDAA2B,GAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAHD,8DAGC;AAED,SAAgB,0BAA0B;IACxC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,IAAA,gDAA2B,GAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;AACH,CAAC;AAND,gEAMC;AAED,SAAgB,4BAA4B;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CACf,EAAE,CAAC,YAAY,CAAC,IAAA,oDAA+B,GAAE,EAAE,MAAM,CAAC,CAC/B,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AARD,oEAQC;AAED,SAAgB,6BAA6B,CAAC,OAAiC;IAC7E,cAAc,EAAE,CAAC;IACjB,EAAE,CAAC,aAAa,CACd,IAAA,oDAA+B,GAAE,EACjC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACvC,MAAM,CACP,CAAC;AACJ,CAAC;AAPD,sEAOC;AAED,SAAgB,8BAA8B;IAC5C,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,IAAA,oDAA+B,GAAE,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;AACH,CAAC;AAND,wEAMC;AAED,SAAgB,4CAA4C;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC;AATD,oGASC"}
@@ -0,0 +1,26 @@
1
+ import type { OpenAICompatProfileConfig } from './profile-router';
2
+ import { type OpenAICompatProxySession } from './proxy-daemon-state';
3
+ export interface OpenAICompatProxyStatus extends Partial<OpenAICompatProxySession> {
4
+ running: boolean;
5
+ pid?: number;
6
+ }
7
+ export interface StartOpenAICompatProxyResult {
8
+ success: boolean;
9
+ alreadyRunning?: boolean;
10
+ authToken?: string;
11
+ pid?: number;
12
+ port: number;
13
+ error?: string;
14
+ }
15
+ export declare function isOpenAICompatProxyRunning(port: number): Promise<boolean>;
16
+ export declare function getOpenAICompatProxyStatus(): Promise<OpenAICompatProxyStatus>;
17
+ export declare function stopOpenAICompatProxy(): Promise<{
18
+ success: boolean;
19
+ error?: string;
20
+ }>;
21
+ export declare function startOpenAICompatProxy(profile: OpenAICompatProfileConfig, options?: {
22
+ port?: number;
23
+ host?: string;
24
+ insecure?: boolean;
25
+ }): Promise<StartOpenAICompatProxyResult>;
26
+ //# sourceMappingURL=proxy-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-daemon.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-daemon.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAMlE,OAAO,EAML,KAAK,wBAAwB,EAG9B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,uBAAwB,SAAQ,OAAO,CAAC,wBAAwB,CAAC;IAChF,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+ED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6B/E;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,uBAAuB,CAAC,CASnF;AAkED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAE3F;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,yBAAyB,EAClC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,OAAO,CAAC,4BAA4B,CAAC,CAgKvC"}
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.startOpenAICompatProxy = exports.stopOpenAICompatProxy = exports.getOpenAICompatProxyStatus = exports.isOpenAICompatProxyRunning = void 0;
27
+ const child_process_1 = require("child_process");
28
+ const crypto = __importStar(require("crypto"));
29
+ const fs = __importStar(require("fs"));
30
+ const http = __importStar(require("http"));
31
+ const net = __importStar(require("net"));
32
+ const lockfile = __importStar(require("proper-lockfile"));
33
+ const daemon_process_ownership_1 = require("../cursor/daemon-process-ownership");
34
+ const proxy_daemon_paths_1 = require("./proxy-daemon-paths");
35
+ const proxy_daemon_state_1 = require("./proxy-daemon-state");
36
+ function generateProxyAuthToken() {
37
+ return crypto.randomBytes(24).toString('hex');
38
+ }
39
+ async function withOpenAICompatProxyLock(operation) {
40
+ const proxyDir = (0, proxy_daemon_paths_1.getOpenAICompatProxyDir)();
41
+ await fs.promises.mkdir(proxyDir, { recursive: true });
42
+ let release;
43
+ try {
44
+ release = await lockfile.lock(proxyDir, {
45
+ stale: 10000,
46
+ retries: { retries: 20, minTimeout: 50, maxTimeout: 250 },
47
+ realpath: false,
48
+ });
49
+ }
50
+ catch (error) {
51
+ throw new Error(`Failed to lock OpenAI-compatible proxy directory (${proxyDir}): ${error.message}`);
52
+ }
53
+ try {
54
+ return await operation();
55
+ }
56
+ finally {
57
+ if (release) {
58
+ try {
59
+ await release();
60
+ }
61
+ catch {
62
+ // Best-effort release.
63
+ }
64
+ }
65
+ }
66
+ }
67
+ async function isPortOccupied(port) {
68
+ return new Promise((resolve) => {
69
+ const socket = net.createConnection({ host: '127.0.0.1', port });
70
+ const finish = (occupied) => {
71
+ socket.removeAllListeners();
72
+ socket.destroy();
73
+ resolve(occupied);
74
+ };
75
+ socket.once('connect', () => finish(true));
76
+ socket.once('error', () => finish(false));
77
+ socket.setTimeout(500, () => {
78
+ finish(false);
79
+ });
80
+ });
81
+ }
82
+ async function findOpenAICompatProxyPort() {
83
+ for (let candidate = proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_DEFAULT_PORT; candidate <= proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_DEFAULT_PORT + 10; candidate += 1) {
84
+ if (!(await isPortOccupied(candidate))) {
85
+ return candidate;
86
+ }
87
+ }
88
+ return 0;
89
+ }
90
+ async function resolveDaemonEntrypoint() {
91
+ for (const candidate of (0, proxy_daemon_state_1.resolveOpenAICompatProxyEntrypointCandidates)()) {
92
+ try {
93
+ await fs.promises.access(candidate, fs.constants.R_OK);
94
+ return candidate;
95
+ }
96
+ catch {
97
+ // Try next candidate.
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ async function isOpenAICompatProxyRunning(port) {
103
+ return new Promise((resolve) => {
104
+ const req = http.request({ hostname: '127.0.0.1', port, path: '/health', method: 'GET', timeout: 3000 }, (res) => {
105
+ let body = '';
106
+ res.setEncoding('utf8');
107
+ res.on('data', (chunk) => (body += chunk));
108
+ res.on('end', () => {
109
+ if (res.statusCode !== 200) {
110
+ resolve(false);
111
+ return;
112
+ }
113
+ try {
114
+ const payload = JSON.parse(body);
115
+ resolve(payload.service === proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_SERVICE_NAME);
116
+ }
117
+ catch {
118
+ resolve(false);
119
+ }
120
+ });
121
+ });
122
+ req.on('error', () => resolve(false));
123
+ req.on('timeout', () => {
124
+ req.destroy();
125
+ resolve(false);
126
+ });
127
+ req.end();
128
+ });
129
+ }
130
+ exports.isOpenAICompatProxyRunning = isOpenAICompatProxyRunning;
131
+ async function getOpenAICompatProxyStatus() {
132
+ const session = (0, proxy_daemon_state_1.readOpenAICompatProxySession)();
133
+ const port = session?.port ?? proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_DEFAULT_PORT;
134
+ const running = await isOpenAICompatProxyRunning(port);
135
+ return {
136
+ running,
137
+ pid: running ? (0, proxy_daemon_state_1.getOpenAICompatProxyPid)() || undefined : undefined,
138
+ ...session,
139
+ };
140
+ }
141
+ exports.getOpenAICompatProxyStatus = getOpenAICompatProxyStatus;
142
+ async function stopOpenAICompatProxyUnlocked() {
143
+ const pid = (0, proxy_daemon_state_1.getOpenAICompatProxyPid)();
144
+ if (!pid) {
145
+ (0, proxy_daemon_state_1.removeOpenAICompatProxySession)();
146
+ return { success: true };
147
+ }
148
+ const ownership = (0, daemon_process_ownership_1.verifyProcessOwnership)(pid, (commandLine) => commandLine.includes('--ccs-openai-proxy-daemon') &&
149
+ commandLine.includes('proxy-daemon-entry'));
150
+ if (ownership === 'not-owned') {
151
+ (0, proxy_daemon_state_1.removeOpenAICompatProxyPid)();
152
+ return { success: true };
153
+ }
154
+ if (ownership === 'unknown') {
155
+ return {
156
+ success: false,
157
+ error: `Refusing to stop PID ${pid}: unable to verify daemon ownership`,
158
+ };
159
+ }
160
+ if (ownership === 'not-running') {
161
+ (0, proxy_daemon_state_1.removeOpenAICompatProxyPid)();
162
+ (0, proxy_daemon_state_1.removeOpenAICompatProxySession)();
163
+ return { success: true };
164
+ }
165
+ try {
166
+ process.kill(pid, 'SIGTERM');
167
+ let attempts = 0;
168
+ while (attempts < 10) {
169
+ await new Promise((resolve) => setTimeout(resolve, 500));
170
+ try {
171
+ process.kill(pid, 0);
172
+ attempts += 1;
173
+ }
174
+ catch {
175
+ break;
176
+ }
177
+ }
178
+ if (attempts >= 10) {
179
+ try {
180
+ process.kill(pid, 'SIGKILL');
181
+ }
182
+ catch {
183
+ // Already exited.
184
+ }
185
+ }
186
+ }
187
+ catch (error) {
188
+ const err = error;
189
+ if (err.code !== 'ESRCH') {
190
+ return { success: false, error: `Failed to stop daemon: ${err.message}` };
191
+ }
192
+ }
193
+ (0, proxy_daemon_state_1.removeOpenAICompatProxyPid)();
194
+ (0, proxy_daemon_state_1.removeOpenAICompatProxySession)();
195
+ return { success: true };
196
+ }
197
+ async function stopOpenAICompatProxy() {
198
+ return withOpenAICompatProxyLock(() => stopOpenAICompatProxyUnlocked());
199
+ }
200
+ exports.stopOpenAICompatProxy = stopOpenAICompatProxy;
201
+ async function startOpenAICompatProxy(profile, options = {}) {
202
+ return withOpenAICompatProxyLock(async () => {
203
+ const status = await getOpenAICompatProxyStatus();
204
+ const host = options.host?.trim() || status.host || '127.0.0.1';
205
+ const port = typeof options.port === 'number'
206
+ ? options.port
207
+ : status.running && status.profileName === profile.profileName && status.port
208
+ ? status.port
209
+ : await findOpenAICompatProxyPort();
210
+ if (port === 0) {
211
+ return {
212
+ success: false,
213
+ port: proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_DEFAULT_PORT,
214
+ error: `No free proxy port found in range ${proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_DEFAULT_PORT}-${proxy_daemon_paths_1.OPENAI_COMPAT_PROXY_DEFAULT_PORT + 10}`,
215
+ };
216
+ }
217
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
218
+ return { success: false, port, error: `Invalid port: ${port}` };
219
+ }
220
+ if (status.running &&
221
+ status.profileName === profile.profileName &&
222
+ status.port === port &&
223
+ (status.host || '127.0.0.1') === host) {
224
+ return {
225
+ success: true,
226
+ alreadyRunning: true,
227
+ pid: status.pid,
228
+ port,
229
+ authToken: status.authToken,
230
+ };
231
+ }
232
+ if (status.running) {
233
+ if (status.profileName !== profile.profileName) {
234
+ return {
235
+ success: false,
236
+ port,
237
+ error: `Proxy already running for profile "${status.profileName}" on port ${status.port}. Stop it before starting a different profile.`,
238
+ };
239
+ }
240
+ const stopped = await stopOpenAICompatProxyUnlocked();
241
+ if (!stopped.success) {
242
+ return {
243
+ success: false,
244
+ port,
245
+ error: stopped.error || 'Failed to restart the running proxy',
246
+ };
247
+ }
248
+ }
249
+ const daemonEntry = await resolveDaemonEntrypoint();
250
+ if (!daemonEntry) {
251
+ return {
252
+ success: false,
253
+ port,
254
+ error: 'OpenAI proxy daemon entrypoint not found. Run `bun run build` and retry.',
255
+ };
256
+ }
257
+ return new Promise((resolve) => {
258
+ let resolved = false;
259
+ let timeout = null;
260
+ const authToken = generateProxyAuthToken();
261
+ const finish = (result) => {
262
+ if (resolved)
263
+ return;
264
+ resolved = true;
265
+ if (timeout)
266
+ clearTimeout(timeout);
267
+ if (!result.success) {
268
+ (0, proxy_daemon_state_1.removeOpenAICompatProxyPid)();
269
+ (0, proxy_daemon_state_1.removeOpenAICompatProxySession)();
270
+ }
271
+ resolve(result);
272
+ };
273
+ const proc = (0, child_process_1.spawn)(process.execPath, [
274
+ daemonEntry,
275
+ '--port',
276
+ String(port),
277
+ '--host',
278
+ host,
279
+ '--profile',
280
+ profile.profileName,
281
+ '--settings-path',
282
+ profile.settingsPath,
283
+ '--auth-token',
284
+ authToken,
285
+ ...(options.insecure ? ['--insecure'] : []),
286
+ '--ccs-openai-proxy-daemon',
287
+ ], { stdio: 'ignore', detached: true });
288
+ proc.unref();
289
+ if (proc.pid) {
290
+ (0, proxy_daemon_state_1.writeOpenAICompatProxyPid)(proc.pid);
291
+ }
292
+ (0, proxy_daemon_state_1.writeOpenAICompatProxySession)({
293
+ profileName: profile.profileName,
294
+ settingsPath: profile.settingsPath,
295
+ host,
296
+ port,
297
+ baseUrl: profile.baseUrl,
298
+ authToken,
299
+ model: profile.model,
300
+ insecure: options.insecure,
301
+ });
302
+ let attempts = 0;
303
+ const poll = async () => {
304
+ attempts += 1;
305
+ if (await isOpenAICompatProxyRunning(port)) {
306
+ finish({ success: true, pid: proc.pid, port, authToken });
307
+ return;
308
+ }
309
+ if (attempts >= 30) {
310
+ finish({
311
+ success: false,
312
+ port,
313
+ error: `Proxy daemon did not start within 30 seconds on port ${port}`,
314
+ });
315
+ return;
316
+ }
317
+ timeout = setTimeout(poll, 1000);
318
+ };
319
+ timeout = setTimeout(poll, 1000);
320
+ proc.on('error', (error) => {
321
+ finish({ success: false, port, error: error.message });
322
+ });
323
+ proc.on('exit', (code, signal) => {
324
+ if (code === 0) {
325
+ finish({
326
+ success: false,
327
+ port,
328
+ error: 'Proxy daemon exited before becoming healthy',
329
+ });
330
+ return;
331
+ }
332
+ if (code !== null) {
333
+ finish({
334
+ success: false,
335
+ port,
336
+ error: `Proxy daemon exited with code ${code}`,
337
+ });
338
+ return;
339
+ }
340
+ finish({
341
+ success: false,
342
+ port,
343
+ error: `Proxy daemon was killed by signal ${signal}`,
344
+ });
345
+ });
346
+ });
347
+ });
348
+ }
349
+ exports.startOpenAICompatProxy = startOpenAICompatProxy;
350
+ //# sourceMappingURL=proxy-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-daemon.js","sourceRoot":"","sources":["../../src/proxy/proxy-daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OpenAICompatProfileConfig } from './profile-router';
2
+ export declare function buildOpenAICompatProxyEnv(profile: OpenAICompatProfileConfig, port: number, authToken: string, claudeConfigDir?: string, host?: string): Record<string, string>;
3
+ //# sourceMappingURL=proxy-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-env.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElE,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,yBAAyB,EAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,EACxB,IAAI,SAAc,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildOpenAICompatProxyEnv = void 0;
4
+ function buildOpenAICompatProxyEnv(profile, port, authToken, claudeConfigDir, host = '127.0.0.1') {
5
+ const localBaseUrl = `http://${host}:${port}`;
6
+ return {
7
+ ANTHROPIC_BASE_URL: localBaseUrl,
8
+ ANTHROPIC_AUTH_TOKEN: authToken,
9
+ DISABLE_TELEMETRY: '1',
10
+ DISABLE_COST_WARNINGS: '1',
11
+ API_TIMEOUT_MS: '600000',
12
+ NO_PROXY: host === '127.0.0.1' ? '127.0.0.1,localhost' : `${host},127.0.0.1,localhost`,
13
+ ...(profile.model ? { ANTHROPIC_MODEL: profile.model } : {}),
14
+ ...(profile.opusModel ? { ANTHROPIC_DEFAULT_OPUS_MODEL: profile.opusModel } : {}),
15
+ ...(profile.sonnetModel ? { ANTHROPIC_DEFAULT_SONNET_MODEL: profile.sonnetModel } : {}),
16
+ ...(profile.haikuModel
17
+ ? {
18
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: profile.haikuModel,
19
+ ANTHROPIC_SMALL_FAST_MODEL: profile.haikuModel,
20
+ }
21
+ : {}),
22
+ ...(claudeConfigDir ? { CLAUDE_CONFIG_DIR: claudeConfigDir } : {}),
23
+ };
24
+ }
25
+ exports.buildOpenAICompatProxyEnv = buildOpenAICompatProxyEnv;
26
+ //# sourceMappingURL=proxy-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-env.js","sourceRoot":"","sources":["../../src/proxy/proxy-env.ts"],"names":[],"mappings":";;;AAEA,SAAgB,yBAAyB,CACvC,OAAkC,EAClC,IAAY,EACZ,SAAiB,EACjB,eAAwB,EACxB,IAAI,GAAG,WAAW;IAElB,MAAM,YAAY,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,kBAAkB,EAAE,YAAY;QAChC,oBAAoB,EAAE,SAAS;QAC/B,iBAAiB,EAAE,GAAG;QACtB,qBAAqB,EAAE,GAAG;QAC1B,cAAc,EAAE,QAAQ;QACxB,QAAQ,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,sBAAsB;QACtF,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,4BAA4B,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,8BAA8B,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC;gBACE,6BAA6B,EAAE,OAAO,CAAC,UAAU;gBACjD,0BAA0B,EAAE,OAAO,CAAC,UAAU;aAC/C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AA1BD,8DA0BC"}
@@ -0,0 +1,12 @@
1
+ import type { ProxyOpenAIRequest } from './transformers/request-transformer';
2
+ import { type OpenAICompatProfileConfig } from './profile-router';
3
+ export type ProxyRoutingScenario = 'default' | 'background' | 'think' | 'longContext' | 'webSearch';
4
+ export interface ProxyRequestRoute {
5
+ profile: OpenAICompatProfileConfig;
6
+ model?: string;
7
+ scenario?: ProxyRoutingScenario;
8
+ estimatedTokens: number;
9
+ source: 'explicit-profile' | 'scenario' | 'profile-model-match' | 'profile-name' | 'request-model' | 'active-default';
10
+ }
11
+ export declare function resolveProxyRequestRoute(activeProfile: OpenAICompatProfileConfig, request: ProxyOpenAIRequest): ProxyRequestRoute;
12
+ //# sourceMappingURL=request-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-router.d.ts","sourceRoot":"","sources":["../../src/proxy/request-router.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAK7E,OAAO,EAAoC,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAEpG,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,yBAAyB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EACF,kBAAkB,GAClB,UAAU,GACV,qBAAqB,GACrB,cAAc,GACd,eAAe,GACf,gBAAgB,CAAC;CACtB;AAgID,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,yBAAyB,EACxC,OAAO,EAAE,kBAAkB,GAC1B,iBAAiB,CAmEnB"}