@kaitranntt/ccs 7.45.0 → 7.46.0-dev.2

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 (204) hide show
  1. package/README.md +12 -0
  2. package/config/base-kimi.settings.json +8 -9
  3. package/config/base-km.settings.json +10 -0
  4. package/dist/api/services/provider-presets.js +2 -2
  5. package/dist/api/services/provider-presets.js.map +1 -1
  6. package/dist/auth/profile-detector.d.ts +4 -1
  7. package/dist/auth/profile-detector.d.ts.map +1 -1
  8. package/dist/auth/profile-detector.js +4 -1
  9. package/dist/auth/profile-detector.js.map +1 -1
  10. package/dist/ccs.js +235 -63
  11. package/dist/ccs.js.map +1 -1
  12. package/dist/cliproxy/auth/auth-types.d.ts +2 -1
  13. package/dist/cliproxy/auth/auth-types.d.ts.map +1 -1
  14. package/dist/cliproxy/auth/auth-types.js +20 -50
  15. package/dist/cliproxy/auth/auth-types.js.map +1 -1
  16. package/dist/cliproxy/auth/gemini-token-refresh.d.ts +5 -3
  17. package/dist/cliproxy/auth/gemini-token-refresh.d.ts.map +1 -1
  18. package/dist/cliproxy/auth/gemini-token-refresh.js +51 -35
  19. package/dist/cliproxy/auth/gemini-token-refresh.js.map +1 -1
  20. package/dist/cliproxy/auth/provider-refreshers/index.d.ts +3 -3
  21. package/dist/cliproxy/auth/provider-refreshers/index.d.ts.map +1 -1
  22. package/dist/cliproxy/auth/provider-refreshers/index.js +35 -33
  23. package/dist/cliproxy/auth/provider-refreshers/index.js.map +1 -1
  24. package/dist/cliproxy/codex-reasoning-proxy.d.ts.map +1 -1
  25. package/dist/cliproxy/codex-reasoning-proxy.js +23 -9
  26. package/dist/cliproxy/codex-reasoning-proxy.js.map +1 -1
  27. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  28. package/dist/cliproxy/config/env-builder.js +37 -0
  29. package/dist/cliproxy/config/env-builder.js.map +1 -1
  30. package/dist/cliproxy/config/generator.d.ts.map +1 -1
  31. package/dist/cliproxy/config/generator.js +2 -16
  32. package/dist/cliproxy/config/generator.js.map +1 -1
  33. package/dist/cliproxy/management-api-client.d.ts.map +1 -1
  34. package/dist/cliproxy/management-api-client.js +16 -4
  35. package/dist/cliproxy/management-api-client.js.map +1 -1
  36. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  37. package/dist/cliproxy/model-catalog.js +36 -0
  38. package/dist/cliproxy/model-catalog.js.map +1 -1
  39. package/dist/cliproxy/provider-capabilities.d.ts +21 -0
  40. package/dist/cliproxy/provider-capabilities.d.ts.map +1 -1
  41. package/dist/cliproxy/provider-capabilities.js +122 -13
  42. package/dist/cliproxy/provider-capabilities.js.map +1 -1
  43. package/dist/cliproxy/quota-fetcher-codex.d.ts +8 -2
  44. package/dist/cliproxy/quota-fetcher-codex.d.ts.map +1 -1
  45. package/dist/cliproxy/quota-fetcher-codex.js +101 -1
  46. package/dist/cliproxy/quota-fetcher-codex.js.map +1 -1
  47. package/dist/cliproxy/quota-types.d.ts +20 -0
  48. package/dist/cliproxy/quota-types.d.ts.map +1 -1
  49. package/dist/cliproxy/session-tracker.d.ts +6 -1
  50. package/dist/cliproxy/session-tracker.d.ts.map +1 -1
  51. package/dist/cliproxy/session-tracker.js +97 -36
  52. package/dist/cliproxy/session-tracker.js.map +1 -1
  53. package/dist/cliproxy/types.d.ts +2 -1
  54. package/dist/cliproxy/types.d.ts.map +1 -1
  55. package/dist/cliproxy/types.js.map +1 -1
  56. package/dist/commands/cliproxy/help-subcommand.js +1 -1
  57. package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
  58. package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
  59. package/dist/commands/cliproxy/quota-subcommand.js +73 -4
  60. package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
  61. package/dist/commands/help-command.d.ts.map +1 -1
  62. package/dist/commands/help-command.js +18 -4
  63. package/dist/commands/help-command.js.map +1 -1
  64. package/dist/commands/setup-command.d.ts.map +1 -1
  65. package/dist/commands/setup-command.js +4 -3
  66. package/dist/commands/setup-command.js.map +1 -1
  67. package/dist/config/migration-manager.d.ts.map +1 -1
  68. package/dist/config/migration-manager.js +2 -1
  69. package/dist/config/migration-manager.js.map +1 -1
  70. package/dist/config/unified-config-types.d.ts +14 -6
  71. package/dist/config/unified-config-types.d.ts.map +1 -1
  72. package/dist/config/unified-config-types.js +5 -12
  73. package/dist/config/unified-config-types.js.map +1 -1
  74. package/dist/cursor/cursor-auth.d.ts.map +1 -1
  75. package/dist/cursor/cursor-auth.js +11 -1
  76. package/dist/cursor/cursor-auth.js.map +1 -1
  77. package/dist/cursor/cursor-client-policy.d.ts +16 -0
  78. package/dist/cursor/cursor-client-policy.d.ts.map +1 -0
  79. package/dist/cursor/cursor-client-policy.js +137 -0
  80. package/dist/cursor/cursor-client-policy.js.map +1 -0
  81. package/dist/cursor/cursor-daemon-entry.d.ts.map +1 -1
  82. package/dist/cursor/cursor-daemon-entry.js +59 -19
  83. package/dist/cursor/cursor-daemon-entry.js.map +1 -1
  84. package/dist/cursor/cursor-default-models.d.ts +21 -0
  85. package/dist/cursor/cursor-default-models.d.ts.map +1 -0
  86. package/dist/cursor/cursor-default-models.js +173 -0
  87. package/dist/cursor/cursor-default-models.js.map +1 -0
  88. package/dist/cursor/cursor-executor.d.ts +4 -6
  89. package/dist/cursor/cursor-executor.d.ts.map +1 -1
  90. package/dist/cursor/cursor-executor.js +57 -76
  91. package/dist/cursor/cursor-executor.js.map +1 -1
  92. package/dist/cursor/cursor-models.d.ts +14 -17
  93. package/dist/cursor/cursor-models.d.ts.map +1 -1
  94. package/dist/cursor/cursor-models.js +174 -185
  95. package/dist/cursor/cursor-models.js.map +1 -1
  96. package/dist/cursor/cursor-protobuf-decoder.d.ts.map +1 -1
  97. package/dist/cursor/cursor-protobuf-decoder.js +4 -1
  98. package/dist/cursor/cursor-protobuf-decoder.js.map +1 -1
  99. package/dist/cursor/cursor-protobuf-schema.d.ts +1 -1
  100. package/dist/cursor/cursor-protobuf-schema.d.ts.map +1 -1
  101. package/dist/cursor/index.d.ts +1 -1
  102. package/dist/cursor/index.d.ts.map +1 -1
  103. package/dist/cursor/index.js +4 -1
  104. package/dist/cursor/index.js.map +1 -1
  105. package/dist/targets/claude-adapter.d.ts +29 -0
  106. package/dist/targets/claude-adapter.d.ts.map +1 -0
  107. package/dist/targets/claude-adapter.js +130 -0
  108. package/dist/targets/claude-adapter.js.map +1 -0
  109. package/dist/targets/droid-adapter.d.ts +34 -0
  110. package/dist/targets/droid-adapter.d.ts.map +1 -0
  111. package/dist/targets/droid-adapter.js +174 -0
  112. package/dist/targets/droid-adapter.js.map +1 -0
  113. package/dist/targets/droid-config-manager.d.ts +33 -0
  114. package/dist/targets/droid-config-manager.d.ts.map +1 -0
  115. package/dist/targets/droid-config-manager.js +387 -0
  116. package/dist/targets/droid-config-manager.js.map +1 -0
  117. package/dist/targets/droid-detector.d.ts +25 -0
  118. package/dist/targets/droid-detector.d.ts.map +1 -0
  119. package/dist/targets/droid-detector.js +140 -0
  120. package/dist/targets/droid-detector.js.map +1 -0
  121. package/dist/targets/index.d.ts +14 -0
  122. package/dist/targets/index.d.ts.map +1 -0
  123. package/dist/targets/index.js +31 -0
  124. package/dist/targets/index.js.map +1 -0
  125. package/dist/targets/target-adapter.d.ts +83 -0
  126. package/dist/targets/target-adapter.d.ts.map +1 -0
  127. package/dist/targets/target-adapter.js +9 -0
  128. package/dist/targets/target-adapter.js.map +1 -0
  129. package/dist/targets/target-registry.d.ts +30 -0
  130. package/dist/targets/target-registry.d.ts.map +1 -0
  131. package/dist/targets/target-registry.js +53 -0
  132. package/dist/targets/target-registry.js.map +1 -0
  133. package/dist/targets/target-resolver.d.ts +26 -0
  134. package/dist/targets/target-resolver.d.ts.map +1 -0
  135. package/dist/targets/target-resolver.js +146 -0
  136. package/dist/targets/target-resolver.js.map +1 -0
  137. package/dist/types/config.d.ts +2 -1
  138. package/dist/types/config.d.ts.map +1 -1
  139. package/dist/types/config.js.map +1 -1
  140. package/dist/types/index.d.ts +1 -0
  141. package/dist/types/index.d.ts.map +1 -1
  142. package/dist/types/profile.d.ts +5 -0
  143. package/dist/types/profile.d.ts.map +1 -0
  144. package/dist/types/profile.js +3 -0
  145. package/dist/types/profile.js.map +1 -0
  146. package/dist/ui/assets/{accounts-B8J62kJ6.js → accounts-CJHXisjx.js} +1 -1
  147. package/dist/ui/assets/{alert-dialog-B5t_5_UL.js → alert-dialog-DvRUIk2A.js} +1 -1
  148. package/dist/ui/assets/{api-DuZyDFf7.js → api-BFsWwFfJ.js} +1 -1
  149. package/dist/ui/assets/{auth-section-Dnaxf97q.js → auth-section-BUqJUH8k.js} +1 -1
  150. package/dist/ui/assets/{backups-section-DUIq9Rxi.js → backups-section-B0Dk_ghY.js} +1 -1
  151. package/dist/ui/assets/cliproxy-DPjyDY8C.js +3 -0
  152. package/dist/ui/assets/cliproxy-control-panel-iy3uvshV.js +1 -0
  153. package/dist/ui/assets/{confirm-dialog-D7hNt3ez.js → confirm-dialog-BUoEw-06.js} +1 -1
  154. package/dist/ui/assets/copilot-xPWvOKWZ.js +3 -0
  155. package/dist/ui/assets/cursor-BhPxJvIp.js +1 -0
  156. package/dist/ui/assets/default-ports-1QQSffYX.js +1 -0
  157. package/dist/ui/assets/{globalenv-section-DuUcheRN.js → globalenv-section-CppHO-5c.js} +1 -1
  158. package/dist/ui/assets/{health-Ddkl8zIJ.js → health-C9qhmoTa.js} +1 -1
  159. package/dist/ui/assets/index-BBNL3emu.css +1 -0
  160. package/dist/ui/assets/index-BGbgkw9t.js +1 -0
  161. package/dist/ui/assets/index-BqElo-QK.js +1 -0
  162. package/dist/ui/assets/{index-D0I8OsQ3.js → index-CTXrydZe.js} +1 -1
  163. package/dist/ui/assets/{index-BRCdKMse.js → index-Cg8gb5M3.js} +1 -1
  164. package/dist/ui/assets/index-wjh3KdFc.js +47 -0
  165. package/dist/ui/assets/providers/kimi.svg +1 -0
  166. package/dist/ui/assets/{proxy-status-widget-DKYj4dWI.js → proxy-status-widget-BLmbEbsS.js} +1 -1
  167. package/dist/ui/assets/{separator-DrDw3JjB.js → separator-08pRfpz8.js} +1 -1
  168. package/dist/ui/assets/{shared-psG1uSqB.js → shared-CBRj6Qfm.js} +1 -1
  169. package/dist/ui/assets/{switch-C0ri2ChT.js → switch-D60SH-YX.js} +1 -1
  170. package/dist/ui/index.html +2 -2
  171. package/dist/utils/shell-executor.d.ts.map +1 -1
  172. package/dist/utils/shell-executor.js +32 -10
  173. package/dist/utils/shell-executor.js.map +1 -1
  174. package/dist/utils/signal-forwarder.d.ts +23 -0
  175. package/dist/utils/signal-forwarder.d.ts.map +1 -0
  176. package/dist/utils/signal-forwarder.js +70 -0
  177. package/dist/utils/signal-forwarder.js.map +1 -0
  178. package/dist/web-server/jsonl-parser.d.ts +1 -0
  179. package/dist/web-server/jsonl-parser.d.ts.map +1 -1
  180. package/dist/web-server/jsonl-parser.js +3 -0
  181. package/dist/web-server/jsonl-parser.js.map +1 -1
  182. package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -1
  183. package/dist/web-server/routes/cliproxy-stats-routes.js +2 -1
  184. package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -1
  185. package/dist/web-server/routes/proxy-routes.d.ts.map +1 -1
  186. package/dist/web-server/routes/proxy-routes.js +2 -1
  187. package/dist/web-server/routes/proxy-routes.js.map +1 -1
  188. package/dist/web-server/usage/data-aggregator.d.ts.map +1 -1
  189. package/dist/web-server/usage/data-aggregator.js +7 -1
  190. package/dist/web-server/usage/data-aggregator.js.map +1 -1
  191. package/dist/web-server/usage/handlers.d.ts.map +1 -1
  192. package/dist/web-server/usage/handlers.js +1 -0
  193. package/dist/web-server/usage/handlers.js.map +1 -1
  194. package/dist/web-server/usage/types.d.ts +2 -0
  195. package/dist/web-server/usage/types.d.ts.map +1 -1
  196. package/package.json +5 -2
  197. package/dist/ui/assets/cliproxy-aK19VC4f.js +0 -3
  198. package/dist/ui/assets/cliproxy-control-panel-9OS_kdTh.js +0 -1
  199. package/dist/ui/assets/copilot-B5dVoOMQ.js +0 -3
  200. package/dist/ui/assets/cursor-4zDGbBRA.js +0 -1
  201. package/dist/ui/assets/index-BRxqvMyp.js +0 -1
  202. package/dist/ui/assets/index-C6u1zYVL.css +0 -1
  203. package/dist/ui/assets/index-DOxNxHpI.js +0 -1
  204. package/dist/ui/assets/index-Dv5jtphl.js +0 -47
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Claude Adapter
3
+ *
4
+ * TargetAdapter implementation for Claude Code CLI.
5
+ * Wraps existing detection, spawning, and execution logic.
6
+ */
7
+ /// <reference types="node" />
8
+ import { TargetAdapter, TargetBinaryInfo, TargetCredentials, TargetType } from './target-adapter';
9
+ import type { ProfileType } from '../types/profile';
10
+ export declare class ClaudeAdapter implements TargetAdapter {
11
+ readonly type: TargetType;
12
+ readonly displayName = "Claude Code";
13
+ detectBinary(): TargetBinaryInfo | null;
14
+ /**
15
+ * Claude uses env vars for credential delivery — no config file writes needed.
16
+ */
17
+ prepareCredentials(_creds: TargetCredentials): Promise<void>;
18
+ buildArgs(_profile: string, userArgs: string[]): string[];
19
+ buildEnv(creds: TargetCredentials, profileType: ProfileType): NodeJS.ProcessEnv;
20
+ exec(args: string[], env: NodeJS.ProcessEnv, _options?: {
21
+ cwd?: string;
22
+ binaryInfo?: TargetBinaryInfo;
23
+ }): void;
24
+ /**
25
+ * Claude supports all CCS profile types.
26
+ */
27
+ supportsProfileType(_profileType: ProfileType): boolean;
28
+ }
29
+ //# sourceMappingURL=claude-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../src/targets/claude-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAGH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOpD,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAY;IACrC,QAAQ,CAAC,WAAW,iBAAiB;IAErC,YAAY,IAAI,gBAAgB,GAAG,IAAI;IAMvC;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAIzD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,UAAU;IAuB/E,IAAI,CACF,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,gBAAgB,CAAA;KAAE,GACzD,IAAI;IAoEP;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,WAAW,GAAG,OAAO;CAGxD"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Adapter
4
+ *
5
+ * TargetAdapter implementation for Claude Code CLI.
6
+ * Wraps existing detection, spawning, and execution logic.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ClaudeAdapter = void 0;
10
+ const child_process_1 = require("child_process");
11
+ const claude_detector_1 = require("../utils/claude-detector");
12
+ const shell_executor_1 = require("../utils/shell-executor");
13
+ const error_manager_1 = require("../utils/error-manager");
14
+ const websearch_manager_1 = require("../utils/websearch-manager");
15
+ const signal_forwarder_1 = require("../utils/signal-forwarder");
16
+ const errors_1 = require("../errors");
17
+ class ClaudeAdapter {
18
+ constructor() {
19
+ this.type = 'claude';
20
+ this.displayName = 'Claude Code';
21
+ }
22
+ detectBinary() {
23
+ const info = (0, claude_detector_1.getClaudeCliInfo)();
24
+ if (!info)
25
+ return null;
26
+ return { path: info.path, needsShell: info.needsShell };
27
+ }
28
+ /**
29
+ * Claude uses env vars for credential delivery — no config file writes needed.
30
+ */
31
+ async prepareCredentials(_creds) {
32
+ // No-op: Claude receives credentials via environment variables
33
+ }
34
+ buildArgs(_profile, userArgs) {
35
+ return userArgs;
36
+ }
37
+ buildEnv(creds, profileType) {
38
+ const webSearchEnv = (0, websearch_manager_1.getWebSearchHookEnv)();
39
+ // For account/default profiles, strip ANTHROPIC_* from parent env to prevent
40
+ // stale proxy config from interfering with native Claude API routing.
41
+ const baseEnv = profileType === 'account' || profileType === 'default'
42
+ ? (0, shell_executor_1.stripAnthropicEnv)(process.env)
43
+ : process.env;
44
+ const env = { ...baseEnv, ...webSearchEnv };
45
+ if (creds.envVars) {
46
+ Object.assign(env, creds.envVars);
47
+ }
48
+ if (creds.baseUrl)
49
+ env['ANTHROPIC_BASE_URL'] = creds.baseUrl;
50
+ if (creds.apiKey)
51
+ env['ANTHROPIC_AUTH_TOKEN'] = creds.apiKey;
52
+ if (creds.model)
53
+ env['ANTHROPIC_MODEL'] = creds.model;
54
+ return env;
55
+ }
56
+ exec(args, env, _options) {
57
+ const exitWithCleanup = (code) => {
58
+ try {
59
+ (0, errors_1.runCleanup)();
60
+ }
61
+ catch {
62
+ // Cleanup should be best-effort on launch errors.
63
+ }
64
+ process.exit(code);
65
+ };
66
+ const claudeCli = (0, claude_detector_1.detectClaudeCli)();
67
+ if (!claudeCli) {
68
+ void error_manager_1.ErrorManager.showClaudeNotFound();
69
+ return exitWithCleanup(1);
70
+ }
71
+ const isWindows = process.platform === 'win32';
72
+ const isPowerShellScript = isWindows && /\.ps1$/i.test(claudeCli);
73
+ const needsShell = isWindows && /\.(cmd|bat)$/i.test(claudeCli);
74
+ let child;
75
+ if (isPowerShellScript) {
76
+ child = (0, child_process_1.spawn)('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', claudeCli, ...args], {
77
+ stdio: 'inherit',
78
+ windowsHide: true,
79
+ env,
80
+ });
81
+ }
82
+ else if (needsShell) {
83
+ const cmdString = [claudeCli, ...args].map(shell_executor_1.escapeShellArg).join(' ');
84
+ child = (0, child_process_1.spawn)(cmdString, {
85
+ stdio: 'inherit',
86
+ windowsHide: true,
87
+ shell: true,
88
+ env,
89
+ });
90
+ }
91
+ else {
92
+ child = (0, child_process_1.spawn)(claudeCli, args, {
93
+ stdio: 'inherit',
94
+ windowsHide: true,
95
+ env,
96
+ });
97
+ }
98
+ (0, signal_forwarder_1.wireChildProcessSignals)(child, async (err) => {
99
+ if (err.code === 'EACCES') {
100
+ console.error(`[X] Claude CLI is not executable: ${claudeCli}`);
101
+ console.error(' Check file permissions and executable bit.');
102
+ }
103
+ else if (err.code === 'ENOENT') {
104
+ if (isPowerShellScript) {
105
+ console.error('[X] PowerShell executable not found (required for .ps1 wrapper launch).');
106
+ console.error(' Ensure powershell.exe is available in PATH.');
107
+ }
108
+ else if (needsShell) {
109
+ console.error('[X] Windows command shell not found for Claude wrapper launch.');
110
+ console.error(' Ensure cmd.exe is available and accessible.');
111
+ }
112
+ else {
113
+ await error_manager_1.ErrorManager.showClaudeNotFound();
114
+ }
115
+ }
116
+ else {
117
+ console.error(`[X] Failed to start Claude CLI (${claudeCli}): ${err.message}`);
118
+ }
119
+ return exitWithCleanup(1);
120
+ });
121
+ }
122
+ /**
123
+ * Claude supports all CCS profile types.
124
+ */
125
+ supportsProfileType(_profileType) {
126
+ return true;
127
+ }
128
+ }
129
+ exports.ClaudeAdapter = ClaudeAdapter;
130
+ //# sourceMappingURL=claude-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../src/targets/claude-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Droid Adapter
3
+ *
4
+ * TargetAdapter implementation for Factory Droid CLI.
5
+ * Writes credentials to ~/.factory/settings.json and spawns `droid -m custom:ccs-<profile>`.
6
+ */
7
+ /// <reference types="node" />
8
+ import { TargetAdapter, TargetBinaryInfo, TargetCredentials, TargetType } from './target-adapter';
9
+ import type { ProfileType } from '../types/profile';
10
+ export declare class DroidAdapter implements TargetAdapter {
11
+ readonly type: TargetType;
12
+ readonly displayName = "Factory Droid";
13
+ private validateCredentials;
14
+ detectBinary(): TargetBinaryInfo | null;
15
+ /**
16
+ * Write CCS credentials to ~/.factory/settings.json as a custom model entry.
17
+ * This is the key difference from Claude — Droid reads config files, not env vars.
18
+ */
19
+ prepareCredentials(creds: TargetCredentials): Promise<void>;
20
+ buildArgs(profile: string, userArgs: string[]): string[];
21
+ /**
22
+ * Droid uses config file for credentials — minimal env needed.
23
+ */
24
+ buildEnv(_creds: TargetCredentials, _profileType: ProfileType): NodeJS.ProcessEnv;
25
+ exec(args: string[], env: NodeJS.ProcessEnv, options?: {
26
+ cwd?: string;
27
+ binaryInfo?: TargetBinaryInfo;
28
+ }): void;
29
+ /**
30
+ * Droid currently supports direct settings-based and default flows only.
31
+ */
32
+ supportsProfileType(profileType: ProfileType): boolean;
33
+ }
34
+ //# sourceMappingURL=droid-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-adapter.d.ts","sourceRoot":"","sources":["../../src/targets/droid-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAIH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAW;IACpC,QAAQ,CAAC,WAAW,mBAAmB;IAEvC,OAAO,CAAC,mBAAmB;IAS3B,YAAY,IAAI,gBAAgB,GAAG,IAAI;IASvC;;;OAGG;IACG,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IASxD;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,GAAG,MAAM,CAAC,UAAU;IAIjF,IAAI,CACF,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,gBAAgB,CAAA;KAAE,GACxD,IAAI;IAkFP;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;CAGvD"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Droid Adapter
4
+ *
5
+ * TargetAdapter implementation for Factory Droid CLI.
6
+ * Writes credentials to ~/.factory/settings.json and spawns `droid -m custom:ccs-<profile>`.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.DroidAdapter = void 0;
33
+ const child_process_1 = require("child_process");
34
+ const fs = __importStar(require("fs"));
35
+ const droid_detector_1 = require("./droid-detector");
36
+ const droid_config_manager_1 = require("./droid-config-manager");
37
+ const shell_executor_1 = require("../utils/shell-executor");
38
+ const signal_forwarder_1 = require("../utils/signal-forwarder");
39
+ const errors_1 = require("../errors");
40
+ class DroidAdapter {
41
+ constructor() {
42
+ this.type = 'droid';
43
+ this.displayName = 'Factory Droid';
44
+ }
45
+ validateCredentials(creds) {
46
+ if (!creds.baseUrl?.trim()) {
47
+ throw new Error('Droid target requires ANTHROPIC_BASE_URL');
48
+ }
49
+ if (!creds.apiKey?.trim()) {
50
+ throw new Error('Droid target requires ANTHROPIC_AUTH_TOKEN');
51
+ }
52
+ }
53
+ detectBinary() {
54
+ const info = (0, droid_detector_1.getDroidBinaryInfo)();
55
+ if (!info)
56
+ return null;
57
+ // Version compatibility check (non-blocking warning)
58
+ (0, droid_detector_1.checkDroidVersion)(info.path);
59
+ return info;
60
+ }
61
+ /**
62
+ * Write CCS credentials to ~/.factory/settings.json as a custom model entry.
63
+ * This is the key difference from Claude — Droid reads config files, not env vars.
64
+ */
65
+ async prepareCredentials(creds) {
66
+ this.validateCredentials(creds);
67
+ await (0, droid_config_manager_1.upsertCcsModel)(creds.profile, {
68
+ model: creds.model || 'claude-opus-4-6',
69
+ displayName: `CCS ${creds.profile}`,
70
+ baseUrl: creds.baseUrl,
71
+ apiKey: creds.apiKey,
72
+ provider: creds.provider || 'anthropic',
73
+ });
74
+ }
75
+ buildArgs(profile, userArgs) {
76
+ if (!/^[a-zA-Z0-9_-]+$/.test(profile)) {
77
+ throw new Error(`Invalid profile name "${profile}" for Droid target: only alphanumeric, underscore, hyphen allowed`);
78
+ }
79
+ return ['-m', `custom:ccs-${profile}`, ...userArgs];
80
+ }
81
+ /**
82
+ * Droid uses config file for credentials — minimal env needed.
83
+ */
84
+ buildEnv(_creds, _profileType) {
85
+ return { ...process.env };
86
+ }
87
+ exec(args, env, options) {
88
+ const exitWithCleanup = (code) => {
89
+ try {
90
+ (0, errors_1.runCleanup)();
91
+ }
92
+ catch {
93
+ // Cleanup should be best-effort on launch errors.
94
+ }
95
+ process.exit(code);
96
+ };
97
+ const droidPath = options?.binaryInfo?.path || (0, droid_detector_1.detectDroidCli)();
98
+ if (!droidPath) {
99
+ console.error('[X] Droid CLI not found. Install: npm i -g @factory/cli');
100
+ return exitWithCleanup(1);
101
+ }
102
+ try {
103
+ const stat = fs.statSync(droidPath);
104
+ if (!stat.isFile()) {
105
+ console.error(`[X] Droid CLI path is not a file: ${droidPath}`);
106
+ return exitWithCleanup(1);
107
+ }
108
+ }
109
+ catch (err) {
110
+ const error = err;
111
+ console.error(`[X] Droid CLI path is not accessible (${error.code || 'unknown'}): ${droidPath}`);
112
+ return exitWithCleanup(1);
113
+ }
114
+ const isWindows = process.platform === 'win32';
115
+ const isPowerShellScript = isWindows && /\.ps1$/i.test(droidPath);
116
+ const needsShell = isWindows && /\.(cmd|bat)$/i.test(droidPath);
117
+ let child;
118
+ if (isPowerShellScript) {
119
+ child = (0, child_process_1.spawn)('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', droidPath, ...args], {
120
+ stdio: 'inherit',
121
+ windowsHide: true,
122
+ env,
123
+ });
124
+ }
125
+ else if (needsShell) {
126
+ const cmdString = [droidPath, ...args].map(shell_executor_1.escapeShellArg).join(' ');
127
+ child = (0, child_process_1.spawn)(cmdString, {
128
+ stdio: 'inherit',
129
+ windowsHide: true,
130
+ shell: true,
131
+ env,
132
+ });
133
+ }
134
+ else {
135
+ child = (0, child_process_1.spawn)(droidPath, args, {
136
+ stdio: 'inherit',
137
+ windowsHide: true,
138
+ env,
139
+ });
140
+ }
141
+ (0, signal_forwarder_1.wireChildProcessSignals)(child, (err) => {
142
+ if (err.code === 'EACCES') {
143
+ console.error(`[X] Droid CLI is not executable: ${droidPath}`);
144
+ console.error(' Check file permissions and executable bit.');
145
+ }
146
+ else if (err.code === 'ENOENT') {
147
+ if (isPowerShellScript) {
148
+ console.error('[X] PowerShell executable not found (required for .ps1 wrapper launch).');
149
+ console.error(' Ensure powershell.exe is available in PATH.');
150
+ }
151
+ else if (needsShell) {
152
+ console.error('[X] Windows command shell not found for Droid wrapper launch.');
153
+ console.error(' Ensure cmd.exe is available and accessible.');
154
+ }
155
+ else {
156
+ console.error(`[X] Droid CLI not found: ${droidPath}`);
157
+ console.error(' Install: npm i -g @factory/cli');
158
+ }
159
+ }
160
+ else {
161
+ console.error(`[X] Failed to start Droid CLI (${droidPath}):`, err.message);
162
+ }
163
+ return exitWithCleanup(1);
164
+ });
165
+ }
166
+ /**
167
+ * Droid currently supports direct settings-based and default flows only.
168
+ */
169
+ supportsProfileType(profileType) {
170
+ return profileType === 'settings' || profileType === 'default';
171
+ }
172
+ }
173
+ exports.DroidAdapter = DroidAdapter;
174
+ //# sourceMappingURL=droid-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-adapter.js","sourceRoot":"","sources":["../../src/targets/droid-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Droid Config Manager
3
+ *
4
+ * Read/write ~/.factory/settings.json safely.
5
+ * Only touches ccs-* prefixed entries in customModels[].
6
+ */
7
+ export interface DroidCustomModel {
8
+ model: string;
9
+ displayName: string;
10
+ baseUrl: string;
11
+ apiKey: string;
12
+ provider: 'anthropic' | 'openai' | 'generic-chat-completion-api';
13
+ maxOutputTokens?: number;
14
+ }
15
+ /**
16
+ * Upsert a CCS-managed custom model entry.
17
+ * Acquires file lock to prevent concurrent write races.
18
+ */
19
+ export declare function upsertCcsModel(profile: string, model: DroidCustomModel): Promise<void>;
20
+ /**
21
+ * Remove a CCS-managed custom model entry.
22
+ */
23
+ export declare function removeCcsModel(profile: string): Promise<void>;
24
+ /**
25
+ * List all CCS-managed custom model entries.
26
+ */
27
+ export declare function listCcsModels(): Promise<Map<string, DroidCustomModel>>;
28
+ /**
29
+ * Prune orphaned CCS entries from settings.json.
30
+ * Removes ccs-* entries whose profile no longer exists in active profiles.
31
+ */
32
+ export declare function pruneOrphanedModels(activeProfiles: string[]): Promise<number>;
33
+ //# sourceMappingURL=droid-config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-config-manager.d.ts","sourceRoot":"","sources":["../../src/targets/droid-config-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,6BAA6B,CAAC;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiQD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B5F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAe5E;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2CnF"}