@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,387 @@
1
+ "use strict";
2
+ /**
3
+ * Droid Config Manager
4
+ *
5
+ * Read/write ~/.factory/settings.json safely.
6
+ * Only touches ccs-* prefixed entries in customModels[].
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.pruneOrphanedModels = exports.listCcsModels = exports.removeCcsModel = exports.upsertCcsModel = void 0;
33
+ const fs = __importStar(require("fs"));
34
+ const path = __importStar(require("path"));
35
+ const os = __importStar(require("os"));
36
+ const lockfile = __importStar(require("proper-lockfile"));
37
+ const CCS_MODEL_PREFIX = 'ccs-';
38
+ const CCS_DISPLAY_PREFIX = 'CCS ';
39
+ /** Lock configuration for concurrent write safety */
40
+ const LOCK_STALE_MS = 10000;
41
+ const LOCK_RETRY_MIN_MS = 200;
42
+ const LOCK_RETRY_MAX_MS = 1000;
43
+ /**
44
+ * Validate profile name to prevent filesystem/security issues.
45
+ * Only alphanumeric, underscore, hyphen allowed.
46
+ */
47
+ function isValidProfileName(profile) {
48
+ return !!profile && /^[a-zA-Z0-9_-]+$/.test(profile);
49
+ }
50
+ function validateProfileName(profile) {
51
+ if (!isValidProfileName(profile)) {
52
+ throw new Error(`Invalid profile name "${profile}": must contain only alphanumeric characters, underscores, or hyphens`);
53
+ }
54
+ }
55
+ function isSupportedProvider(value) {
56
+ return value === 'anthropic' || value === 'openai' || value === 'generic-chat-completion-api';
57
+ }
58
+ function isDroidCustomModelEntry(value) {
59
+ if (!value || typeof value !== 'object')
60
+ return false;
61
+ const record = value;
62
+ return (typeof record.displayName === 'string' &&
63
+ record.displayName.trim() !== '' &&
64
+ typeof record.model === 'string' &&
65
+ typeof record.baseUrl === 'string' &&
66
+ typeof record.apiKey === 'string' &&
67
+ typeof record.provider === 'string' &&
68
+ record.provider.trim() !== '');
69
+ }
70
+ function isManagedDisplayName(displayName) {
71
+ return displayName.startsWith(CCS_DISPLAY_PREFIX) || displayName.startsWith(CCS_MODEL_PREFIX);
72
+ }
73
+ function parseManagedProfile(displayName) {
74
+ let profile = null;
75
+ if (displayName.startsWith(CCS_DISPLAY_PREFIX)) {
76
+ profile = displayName.slice(CCS_DISPLAY_PREFIX.length).trim();
77
+ }
78
+ else if (displayName.startsWith(CCS_MODEL_PREFIX)) {
79
+ profile = displayName.slice(CCS_MODEL_PREFIX.length).trim();
80
+ }
81
+ if (!profile || !isValidProfileName(profile))
82
+ return null;
83
+ return profile;
84
+ }
85
+ function asModelEntry(value) {
86
+ return isDroidCustomModelEntry(value) ? value : null;
87
+ }
88
+ function normalizeCustomModels(value) {
89
+ if (Array.isArray(value)) {
90
+ return value
91
+ .map((entry) => asModelEntry(entry))
92
+ .filter((entry) => !!entry);
93
+ }
94
+ // Accept legacy object-map shapes and normalize to array.
95
+ if (value && typeof value === 'object') {
96
+ return Object.values(value)
97
+ .map((entry) => asModelEntry(entry))
98
+ .filter((entry) => !!entry);
99
+ }
100
+ return [];
101
+ }
102
+ /**
103
+ * Get path to ~/.factory/settings.json.
104
+ * Respects CCS_HOME for test isolation (uses CCS_HOME/.factory/ in tests).
105
+ */
106
+ function getFactoryDir() {
107
+ const base = process.env.CCS_HOME || os.homedir();
108
+ return path.join(base, '.factory');
109
+ }
110
+ function getSettingsPath() {
111
+ return path.join(getFactoryDir(), 'settings.json');
112
+ }
113
+ /**
114
+ * Ensure ~/.factory/ directory exists.
115
+ */
116
+ function ensureFactoryDir() {
117
+ const dir = getFactoryDir();
118
+ try {
119
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
120
+ }
121
+ catch (err) {
122
+ const error = err;
123
+ if (error.code !== 'EEXIST')
124
+ throw error;
125
+ }
126
+ }
127
+ function getNoFollowFlag() {
128
+ const candidate = fs.constants['O_NOFOLLOW'];
129
+ if (process.platform !== 'win32' && typeof candidate === 'number') {
130
+ return candidate;
131
+ }
132
+ return 0;
133
+ }
134
+ function openFileNoFollow(filePath, flags, mode) {
135
+ const safeFlags = flags | getNoFollowFlag();
136
+ if (mode === undefined) {
137
+ return fs.openSync(filePath, safeFlags);
138
+ }
139
+ return fs.openSync(filePath, safeFlags, mode);
140
+ }
141
+ function readFileUtf8NoFollow(filePath) {
142
+ const fd = openFileNoFollow(filePath, fs.constants.O_RDONLY);
143
+ try {
144
+ const stat = fs.fstatSync(fd);
145
+ if (!stat.isFile()) {
146
+ throw new Error('Refusing to read: settings.json is not a regular file');
147
+ }
148
+ return fs.readFileSync(fd, 'utf8');
149
+ }
150
+ finally {
151
+ fs.closeSync(fd);
152
+ }
153
+ }
154
+ /**
155
+ * Read ~/.factory/settings.json, creating empty structure if missing.
156
+ */
157
+ function readDroidSettings() {
158
+ const settingsPath = getSettingsPath();
159
+ if (!fs.existsSync(settingsPath)) {
160
+ return { customModels: [] };
161
+ }
162
+ const fileStat = fs.lstatSync(settingsPath);
163
+ if (fileStat.isSymbolicLink()) {
164
+ throw new Error('Refusing to read: settings.json is a symlink');
165
+ }
166
+ if (!fileStat.isFile()) {
167
+ throw new Error('Refusing to read: settings.json is not a regular file');
168
+ }
169
+ const raw = readFileUtf8NoFollow(settingsPath);
170
+ try {
171
+ const parsed = JSON.parse(raw);
172
+ return {
173
+ ...parsed,
174
+ customModels: normalizeCustomModels(parsed.customModels),
175
+ };
176
+ }
177
+ catch {
178
+ // Corrupted file — preserve as backup, start fresh
179
+ const backup = settingsPath + '.bak';
180
+ try {
181
+ fs.copyFileSync(settingsPath, backup);
182
+ fs.chmodSync(backup, 0o600); // Secure backup permissions
183
+ console.warn(`[!] Corrupted ${settingsPath}, backed up to ${backup}`);
184
+ }
185
+ catch (error) {
186
+ console.warn(`[!] Corrupted ${settingsPath}; backup failed: ${error.message}`);
187
+ }
188
+ return { customModels: [] };
189
+ }
190
+ }
191
+ async function acquireFactoryLock(retries) {
192
+ ensureFactoryDir();
193
+ const factoryDir = getFactoryDir();
194
+ try {
195
+ return await lockfile.lock(factoryDir, {
196
+ stale: LOCK_STALE_MS,
197
+ retries: { retries, minTimeout: LOCK_RETRY_MIN_MS, maxTimeout: LOCK_RETRY_MAX_MS },
198
+ });
199
+ }
200
+ catch (error) {
201
+ throw new Error(`Failed to lock Droid settings directory (${factoryDir}): ${error.message}`);
202
+ }
203
+ }
204
+ function fsyncDir(dirPath) {
205
+ try {
206
+ const dirFd = fs.openSync(dirPath, fs.constants.O_RDONLY);
207
+ try {
208
+ fs.fsyncSync(dirFd);
209
+ }
210
+ finally {
211
+ fs.closeSync(dirFd);
212
+ }
213
+ }
214
+ catch {
215
+ // Best-effort directory fsync (platform dependent).
216
+ }
217
+ }
218
+ /**
219
+ * Write ~/.factory/settings.json atomically with safe permissions.
220
+ * Uses temp file + rename for atomicity on same filesystem.
221
+ */
222
+ function writeDroidSettings(settings) {
223
+ ensureFactoryDir();
224
+ const settingsPath = getSettingsPath();
225
+ // Refuse to write if target is a symlink (prevents symlink attacks)
226
+ if (fs.existsSync(settingsPath)) {
227
+ const stat = fs.lstatSync(settingsPath);
228
+ if (stat.isSymbolicLink()) {
229
+ throw new Error('Refusing to write: settings.json is a symlink');
230
+ }
231
+ }
232
+ const tmpPath = settingsPath + '.tmp';
233
+ if (fs.existsSync(tmpPath)) {
234
+ const tmpStat = fs.lstatSync(tmpPath);
235
+ if (tmpStat.isSymbolicLink()) {
236
+ throw new Error('Refusing to write: settings.json.tmp is a symlink');
237
+ }
238
+ }
239
+ const payload = JSON.stringify({
240
+ ...settings,
241
+ customModels: normalizeCustomModels(settings.customModels),
242
+ }, null, 2);
243
+ const fd = openFileNoFollow(tmpPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_TRUNC, 0o600);
244
+ try {
245
+ const tmpFdStat = fs.fstatSync(fd);
246
+ if (!tmpFdStat.isFile()) {
247
+ throw new Error('Refusing to write: settings.json.tmp is not a regular file');
248
+ }
249
+ fs.writeFileSync(fd, payload + '\n', { encoding: 'utf8' });
250
+ fs.fsyncSync(fd);
251
+ }
252
+ finally {
253
+ fs.closeSync(fd);
254
+ }
255
+ fs.renameSync(tmpPath, settingsPath);
256
+ fsyncDir(path.dirname(settingsPath));
257
+ // Fix permissions on existing file if world-readable
258
+ try {
259
+ const stat = fs.statSync(settingsPath);
260
+ if (stat.mode & 0o077) {
261
+ fs.chmodSync(settingsPath, 0o600);
262
+ console.warn('[!] Fixed permissions on ~/.factory/settings.json (was world-readable)');
263
+ }
264
+ }
265
+ catch {
266
+ // Best-effort permission check
267
+ }
268
+ }
269
+ /**
270
+ * Upsert a CCS-managed custom model entry.
271
+ * Acquires file lock to prevent concurrent write races.
272
+ */
273
+ async function upsertCcsModel(profile, model) {
274
+ validateProfileName(profile);
275
+ ensureFactoryDir();
276
+ let release;
277
+ try {
278
+ release = await acquireFactoryLock(10);
279
+ const settings = readDroidSettings();
280
+ settings.customModels = normalizeCustomModels(settings.customModels);
281
+ const entry = {
282
+ ...model,
283
+ displayName: `CCS ${profile}`,
284
+ };
285
+ // Find existing current or legacy entry for this profile.
286
+ const idx = settings.customModels.findIndex((m) => parseManagedProfile(m.displayName) === profile);
287
+ if (idx >= 0) {
288
+ settings.customModels[idx] = entry;
289
+ }
290
+ else {
291
+ settings.customModels.push(entry);
292
+ }
293
+ writeDroidSettings(settings);
294
+ }
295
+ finally {
296
+ if (release)
297
+ await release();
298
+ }
299
+ }
300
+ exports.upsertCcsModel = upsertCcsModel;
301
+ /**
302
+ * Remove a CCS-managed custom model entry.
303
+ */
304
+ async function removeCcsModel(profile) {
305
+ validateProfileName(profile);
306
+ ensureFactoryDir();
307
+ const settingsPath = getSettingsPath();
308
+ let release;
309
+ try {
310
+ release = await acquireFactoryLock(3);
311
+ if (!fs.existsSync(settingsPath))
312
+ return;
313
+ const settings = readDroidSettings();
314
+ settings.customModels = normalizeCustomModels(settings.customModels);
315
+ settings.customModels = settings.customModels.filter((m) => parseManagedProfile(m.displayName) !== profile);
316
+ writeDroidSettings(settings);
317
+ }
318
+ finally {
319
+ if (release)
320
+ await release();
321
+ }
322
+ }
323
+ exports.removeCcsModel = removeCcsModel;
324
+ /**
325
+ * List all CCS-managed custom model entries.
326
+ */
327
+ async function listCcsModels() {
328
+ const result = new Map();
329
+ const settings = readDroidSettings();
330
+ for (const entry of normalizeCustomModels(settings.customModels)) {
331
+ const profile = parseManagedProfile(entry.displayName);
332
+ if (!profile)
333
+ continue;
334
+ if (!isSupportedProvider(entry.provider))
335
+ continue;
336
+ result.set(profile, {
337
+ ...entry,
338
+ provider: entry.provider,
339
+ });
340
+ }
341
+ return result;
342
+ }
343
+ exports.listCcsModels = listCcsModels;
344
+ /**
345
+ * Prune orphaned CCS entries from settings.json.
346
+ * Removes ccs-* entries whose profile no longer exists in active profiles.
347
+ */
348
+ async function pruneOrphanedModels(activeProfiles) {
349
+ // Snapshot at call time so caller-side mutation cannot affect filtering while lock is pending.
350
+ const activeProfilesSnapshot = [...activeProfiles];
351
+ ensureFactoryDir();
352
+ const settingsPath = getSettingsPath();
353
+ let release;
354
+ let removed = 0;
355
+ try {
356
+ release = await acquireFactoryLock(3);
357
+ const activeProfileSet = new Set();
358
+ for (const profile of activeProfilesSnapshot) {
359
+ validateProfileName(profile);
360
+ activeProfileSet.add(profile);
361
+ }
362
+ if (!fs.existsSync(settingsPath))
363
+ return 0;
364
+ const settings = readDroidSettings();
365
+ settings.customModels = normalizeCustomModels(settings.customModels);
366
+ const before = settings.customModels.length;
367
+ settings.customModels = settings.customModels.filter((m) => {
368
+ const profile = parseManagedProfile(m.displayName);
369
+ if (profile) {
370
+ return activeProfileSet.has(profile);
371
+ }
372
+ // Drop malformed managed entries; keep user-managed entries.
373
+ return !isManagedDisplayName(m.displayName);
374
+ });
375
+ removed = before - settings.customModels.length;
376
+ if (removed > 0) {
377
+ writeDroidSettings(settings);
378
+ }
379
+ }
380
+ finally {
381
+ if (release)
382
+ await release();
383
+ }
384
+ return removed;
385
+ }
386
+ exports.pruneOrphanedModels = pruneOrphanedModels;
387
+ //# sourceMappingURL=droid-config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-config-manager.js","sourceRoot":"","sources":["../../src/targets/droid-config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Droid CLI Detector
3
+ *
4
+ * Detects Factory Droid CLI binary in PATH.
5
+ * Mirrors claude-detector.ts pattern.
6
+ */
7
+ import { TargetBinaryInfo } from './target-adapter';
8
+ /**
9
+ * Detect Droid CLI executable.
10
+ *
11
+ * Priority:
12
+ * 1. CCS_DROID_PATH env var (user override)
13
+ * 2. PATH lookup via which/where.exe
14
+ */
15
+ export declare function detectDroidCli(): string | null;
16
+ /**
17
+ * Get Droid CLI binary info for target adapter.
18
+ */
19
+ export declare function getDroidBinaryInfo(): TargetBinaryInfo | null;
20
+ /**
21
+ * Check Droid CLI version for compatibility warnings.
22
+ * Non-blocking — logs warning and continues.
23
+ */
24
+ export declare function checkDroidVersion(droidPath: string): void;
25
+ //# sourceMappingURL=droid-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-detector.d.ts","sourceRoot":"","sources":["../../src/targets/droid-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CA+D9C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,GAAG,IAAI,CAQ5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAqBzD"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * Droid CLI Detector
4
+ *
5
+ * Detects Factory Droid CLI binary in PATH.
6
+ * Mirrors claude-detector.ts pattern.
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.checkDroidVersion = exports.getDroidBinaryInfo = exports.detectDroidCli = void 0;
33
+ const fs = __importStar(require("fs"));
34
+ const child_process_1 = require("child_process");
35
+ const helpers_1 = require("../utils/helpers");
36
+ /**
37
+ * Detect Droid CLI executable.
38
+ *
39
+ * Priority:
40
+ * 1. CCS_DROID_PATH env var (user override)
41
+ * 2. PATH lookup via which/where.exe
42
+ */
43
+ function detectDroidCli() {
44
+ // Priority 1: CCS_DROID_PATH environment variable
45
+ if (process.env.CCS_DROID_PATH) {
46
+ const customPath = (0, helpers_1.expandPath)(process.env.CCS_DROID_PATH);
47
+ try {
48
+ if (fs.statSync(customPath).isFile()) {
49
+ return customPath;
50
+ }
51
+ console.warn('[!] CCS_DROID_PATH points to a directory, not a file:', customPath);
52
+ console.warn(' Refusing PATH fallback while CCS_DROID_PATH is explicitly set.');
53
+ return null;
54
+ }
55
+ catch (err) {
56
+ const error = err;
57
+ if (error.code === 'ENOENT') {
58
+ console.warn('[!] Warning: CCS_DROID_PATH is set but file not found:', customPath);
59
+ }
60
+ else {
61
+ console.warn(`[!] Warning: CCS_DROID_PATH is not accessible (${error.code || 'unknown error'}):`, customPath);
62
+ }
63
+ console.warn(' Refusing PATH fallback while CCS_DROID_PATH is explicitly set.');
64
+ return null;
65
+ }
66
+ }
67
+ // Priority 2: Resolve 'droid' from PATH
68
+ const isWindows = process.platform === 'win32';
69
+ try {
70
+ const cmd = isWindows ? 'where.exe droid' : 'which droid';
71
+ const result = (0, child_process_1.execSync)(cmd, {
72
+ encoding: 'utf8',
73
+ stdio: ['ignore', 'pipe', 'ignore'],
74
+ timeout: 5000,
75
+ }).trim();
76
+ const matches = result
77
+ .split('\n')
78
+ .map((p) => p.trim())
79
+ .filter((p) => p);
80
+ const candidates = isWindows
81
+ ? [
82
+ ...matches.filter((p) => /\.(exe|cmd|bat|ps1)$/i.test(p)),
83
+ ...matches.filter((p) => !/\.(exe|cmd|bat|ps1)$/i.test(p)),
84
+ ]
85
+ : matches;
86
+ for (const candidate of candidates) {
87
+ try {
88
+ if (fs.statSync(candidate).isFile()) {
89
+ return candidate;
90
+ }
91
+ }
92
+ catch {
93
+ // Ignore unreadable or disappearing path candidates and try next one
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ // droid not in PATH
99
+ }
100
+ return null;
101
+ }
102
+ exports.detectDroidCli = detectDroidCli;
103
+ /**
104
+ * Get Droid CLI binary info for target adapter.
105
+ */
106
+ function getDroidBinaryInfo() {
107
+ const droidPath = detectDroidCli();
108
+ if (!droidPath)
109
+ return null;
110
+ const isWindows = process.platform === 'win32';
111
+ const needsShell = isWindows && /\.(cmd|bat|ps1)$/i.test(droidPath);
112
+ return { path: droidPath, needsShell };
113
+ }
114
+ exports.getDroidBinaryInfo = getDroidBinaryInfo;
115
+ /**
116
+ * Check Droid CLI version for compatibility warnings.
117
+ * Non-blocking — logs warning and continues.
118
+ */
119
+ function checkDroidVersion(droidPath) {
120
+ try {
121
+ const version = (0, child_process_1.execFileSync)(droidPath, ['--version'], {
122
+ encoding: 'utf8',
123
+ stdio: ['ignore', 'pipe', 'ignore'],
124
+ timeout: 5000,
125
+ }).trim();
126
+ // Parse semver major version
127
+ const match = version.match(/(\d+)\.\d+\.\d+/);
128
+ if (match) {
129
+ const major = parseInt(match[1]);
130
+ if (major >= 2) {
131
+ console.warn(`[!] Droid version ${version} not verified with CCS. Config format may differ.`);
132
+ }
133
+ }
134
+ }
135
+ catch {
136
+ // Version check is best-effort — don't block execution
137
+ }
138
+ }
139
+ exports.checkDroidVersion = checkDroidVersion;
140
+ //# sourceMappingURL=droid-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-detector.js","sourceRoot":"","sources":["../../src/targets/droid-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Target Adapter Module
3
+ *
4
+ * Re-exports for convenient access to target adapter types and registry.
5
+ */
6
+ export type { TargetAdapter, TargetBinaryInfo, TargetCredentials, TargetType, } from './target-adapter';
7
+ export { registerTarget, getTarget, getDefaultTarget, hasTarget, getRegisteredTargets, } from './target-registry';
8
+ export { ClaudeAdapter } from './claude-adapter';
9
+ export { DroidAdapter } from './droid-adapter';
10
+ export { getDroidBinaryInfo, detectDroidCli, checkDroidVersion } from './droid-detector';
11
+ export { upsertCcsModel, removeCcsModel, listCcsModels, pruneOrphanedModels, } from './droid-config-manager';
12
+ export type { DroidCustomModel } from './droid-config-manager';
13
+ export { resolveTargetType, stripTargetFlag } from './target-resolver';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/targets/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,EACL,cAAc,EACd,cAAc,EACd,aAAa,EACb,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Target Adapter Module
4
+ *
5
+ * Re-exports for convenient access to target adapter types and registry.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.stripTargetFlag = exports.resolveTargetType = exports.pruneOrphanedModels = exports.listCcsModels = exports.removeCcsModel = exports.upsertCcsModel = exports.checkDroidVersion = exports.detectDroidCli = exports.getDroidBinaryInfo = exports.DroidAdapter = exports.ClaudeAdapter = exports.getRegisteredTargets = exports.hasTarget = exports.getDefaultTarget = exports.getTarget = exports.registerTarget = void 0;
9
+ var target_registry_1 = require("./target-registry");
10
+ Object.defineProperty(exports, "registerTarget", { enumerable: true, get: function () { return target_registry_1.registerTarget; } });
11
+ Object.defineProperty(exports, "getTarget", { enumerable: true, get: function () { return target_registry_1.getTarget; } });
12
+ Object.defineProperty(exports, "getDefaultTarget", { enumerable: true, get: function () { return target_registry_1.getDefaultTarget; } });
13
+ Object.defineProperty(exports, "hasTarget", { enumerable: true, get: function () { return target_registry_1.hasTarget; } });
14
+ Object.defineProperty(exports, "getRegisteredTargets", { enumerable: true, get: function () { return target_registry_1.getRegisteredTargets; } });
15
+ var claude_adapter_1 = require("./claude-adapter");
16
+ Object.defineProperty(exports, "ClaudeAdapter", { enumerable: true, get: function () { return claude_adapter_1.ClaudeAdapter; } });
17
+ var droid_adapter_1 = require("./droid-adapter");
18
+ Object.defineProperty(exports, "DroidAdapter", { enumerable: true, get: function () { return droid_adapter_1.DroidAdapter; } });
19
+ var droid_detector_1 = require("./droid-detector");
20
+ Object.defineProperty(exports, "getDroidBinaryInfo", { enumerable: true, get: function () { return droid_detector_1.getDroidBinaryInfo; } });
21
+ Object.defineProperty(exports, "detectDroidCli", { enumerable: true, get: function () { return droid_detector_1.detectDroidCli; } });
22
+ Object.defineProperty(exports, "checkDroidVersion", { enumerable: true, get: function () { return droid_detector_1.checkDroidVersion; } });
23
+ var droid_config_manager_1 = require("./droid-config-manager");
24
+ Object.defineProperty(exports, "upsertCcsModel", { enumerable: true, get: function () { return droid_config_manager_1.upsertCcsModel; } });
25
+ Object.defineProperty(exports, "removeCcsModel", { enumerable: true, get: function () { return droid_config_manager_1.removeCcsModel; } });
26
+ Object.defineProperty(exports, "listCcsModels", { enumerable: true, get: function () { return droid_config_manager_1.listCcsModels; } });
27
+ Object.defineProperty(exports, "pruneOrphanedModels", { enumerable: true, get: function () { return droid_config_manager_1.pruneOrphanedModels; } });
28
+ var target_resolver_1 = require("./target-resolver");
29
+ Object.defineProperty(exports, "resolveTargetType", { enumerable: true, get: function () { return target_resolver_1.resolveTargetType; } });
30
+ Object.defineProperty(exports, "stripTargetFlag", { enumerable: true, get: function () { return target_resolver_1.stripTargetFlag; } });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/targets/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAQH,qDAM2B;AALzB,iHAAA,cAAc,OAAA;AACd,4GAAA,SAAS,OAAA;AACT,mHAAA,gBAAgB,OAAA;AAChB,4GAAA,SAAS,OAAA;AACT,uHAAA,oBAAoB,OAAA;AAEtB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,mDAAyF;AAAhF,oHAAA,kBAAkB,OAAA;AAAE,gHAAA,cAAc,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAC9D,+DAKgC;AAJ9B,sHAAA,cAAc,OAAA;AACd,sHAAA,cAAc,OAAA;AACd,qHAAA,aAAa,OAAA;AACb,2HAAA,mBAAmB,OAAA;AAGrB,qDAAuE;AAA9D,oHAAA,iBAAiB,OAAA;AAAE,kHAAA,eAAe,OAAA"}