@codemieai/code 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +78 -4
  2. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  3. package/dist/agents/core/AgentCLI.js +53 -4
  4. package/dist/agents/core/AgentCLI.js.map +1 -1
  5. package/dist/agents/plugins/claude/claude.models.d.ts +12 -0
  6. package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -0
  7. package/dist/agents/plugins/claude/claude.models.js +191 -0
  8. package/dist/agents/plugins/claude/claude.models.js.map +1 -0
  9. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  10. package/dist/agents/plugins/claude/claude.plugin.js +45 -1
  11. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  12. package/dist/agents/plugins/codex/codex-models.d.ts +11 -0
  13. package/dist/agents/plugins/codex/codex-models.d.ts.map +1 -1
  14. package/dist/agents/plugins/codex/codex-models.js +71 -0
  15. package/dist/agents/plugins/codex/codex-models.js.map +1 -1
  16. package/dist/agents/plugins/gemini/gemini.paths.d.ts +11 -0
  17. package/dist/agents/plugins/gemini/gemini.paths.d.ts.map +1 -0
  18. package/dist/agents/plugins/gemini/gemini.paths.js +21 -0
  19. package/dist/agents/plugins/gemini/gemini.paths.js.map +1 -0
  20. package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts +20 -0
  21. package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts.map +1 -1
  22. package/dist/agents/plugins/gemini/gemini.session-adapter.js +119 -3
  23. package/dist/agents/plugins/gemini/gemini.session-adapter.js.map +1 -1
  24. package/dist/agents/plugins/pi/pi.models.d.ts +14 -0
  25. package/dist/agents/plugins/pi/pi.models.d.ts.map +1 -1
  26. package/dist/agents/plugins/pi/pi.models.js +89 -0
  27. package/dist/agents/plugins/pi/pi.models.js.map +1 -1
  28. package/dist/cli/commands/analytics/agent-labels.d.ts.map +1 -1
  29. package/dist/cli/commands/analytics/agent-labels.js +1 -0
  30. package/dist/cli/commands/analytics/agent-labels.js.map +1 -1
  31. package/dist/cli/commands/analytics/aggregator.js +1 -1
  32. package/dist/cli/commands/analytics/aggregator.js.map +1 -1
  33. package/dist/cli/commands/analytics/cost/cost-calculator.d.ts +1 -1
  34. package/dist/cli/commands/analytics/cost/cost-calculator.d.ts.map +1 -1
  35. package/dist/cli/commands/analytics/cost/cost-enricher.js +2 -2
  36. package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
  37. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
  38. package/dist/cli/commands/analytics/data-loader.js +9 -0
  39. package/dist/cli/commands/analytics/data-loader.js.map +1 -1
  40. package/dist/cli/commands/analytics/native-loader.js +1 -1
  41. package/dist/cli/commands/analytics/native-loader.js.map +1 -1
  42. package/dist/cli/commands/analytics/otel-loader.js +1 -1
  43. package/dist/cli/commands/analytics/otel-loader.js.map +1 -1
  44. package/dist/cli/commands/analytics/report/client/app.js +1 -1
  45. package/dist/cli/commands/hook.d.ts.map +1 -1
  46. package/dist/cli/commands/hook.js +70 -1
  47. package/dist/cli/commands/hook.js.map +1 -1
  48. package/dist/cli/commands/proxy/connect-orchestrator.d.ts +95 -0
  49. package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -0
  50. package/dist/cli/commands/proxy/connect-orchestrator.js +501 -0
  51. package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -0
  52. package/dist/cli/commands/proxy/connectors/codex-config-toml.d.ts +81 -0
  53. package/dist/cli/commands/proxy/connectors/codex-config-toml.d.ts.map +1 -0
  54. package/dist/cli/commands/proxy/connectors/codex-config-toml.js +218 -0
  55. package/dist/cli/commands/proxy/connectors/codex-config-toml.js.map +1 -0
  56. package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts +85 -0
  57. package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts.map +1 -0
  58. package/dist/cli/commands/proxy/connectors/codex-desktop.js +299 -0
  59. package/dist/cli/commands/proxy/connectors/codex-desktop.js.map +1 -0
  60. package/dist/cli/commands/proxy/connectors/desktop.d.ts +94 -4
  61. package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
  62. package/dist/cli/commands/proxy/connectors/desktop.js +244 -17
  63. package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
  64. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts +25 -0
  65. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts.map +1 -1
  66. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js +59 -1
  67. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js.map +1 -1
  68. package/dist/cli/commands/proxy/connectors/vscode-claude-code.d.ts +26 -0
  69. package/dist/cli/commands/proxy/connectors/vscode-claude-code.d.ts.map +1 -0
  70. package/dist/cli/commands/proxy/connectors/vscode-claude-code.js +132 -0
  71. package/dist/cli/commands/proxy/connectors/vscode-claude-code.js.map +1 -0
  72. package/dist/cli/commands/proxy/connectors/vscode.d.ts +2 -0
  73. package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -1
  74. package/dist/cli/commands/proxy/connectors/vscode.js +2 -2
  75. package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -1
  76. package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts +8 -0
  77. package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts.map +1 -0
  78. package/dist/cli/commands/proxy/disconnect-orchestrator.js +43 -0
  79. package/dist/cli/commands/proxy/disconnect-orchestrator.js.map +1 -0
  80. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  81. package/dist/cli/commands/proxy/index.js +91 -361
  82. package/dist/cli/commands/proxy/index.js.map +1 -1
  83. package/dist/cli/index.js +7 -7
  84. package/dist/providers/integration/setup-ui.d.ts +14 -2
  85. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  86. package/dist/providers/integration/setup-ui.js +70 -33
  87. package/dist/providers/integration/setup-ui.js.map +1 -1
  88. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.d.ts.map +1 -1
  89. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.js +9 -2
  90. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.js.map +1 -1
  91. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -1
  92. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +18 -28
  93. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -1
  94. package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts.map +1 -1
  95. package/dist/providers/plugins/bedrock/bedrock.setup-steps.js +4 -4
  96. package/dist/providers/plugins/bedrock/bedrock.setup-steps.js.map +1 -1
  97. package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts.map +1 -1
  98. package/dist/providers/plugins/litellm/litellm.setup-steps.js +3 -1
  99. package/dist/providers/plugins/litellm/litellm.setup-steps.js.map +1 -1
  100. package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.d.ts.map +1 -1
  101. package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.js +5 -1
  102. package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.js.map +1 -1
  103. package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
  104. package/dist/providers/plugins/ollama/ollama.setup-steps.js +3 -2
  105. package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
  106. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.d.ts.map +1 -1
  107. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.js +4 -0
  108. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.js.map +1 -1
  109. package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.d.ts +45 -0
  110. package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.d.ts.map +1 -0
  111. package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.js +129 -0
  112. package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.js.map +1 -0
  113. package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.d.ts +27 -0
  114. package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.d.ts.map +1 -0
  115. package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js +242 -0
  116. package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js.map +1 -0
  117. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +2 -1
  118. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  119. package/dist/providers/plugins/sso/proxy/plugins/index.js +3 -1
  120. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  121. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.d.ts.map +1 -1
  122. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js +15 -1
  123. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js.map +1 -1
  124. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  125. package/dist/providers/plugins/sso/sso.auth.js +3 -0
  126. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  127. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts.map +1 -1
  128. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js +13 -1
  129. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js.map +1 -1
  130. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.d.ts +12 -0
  131. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.d.ts.map +1 -1
  132. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.js +28 -1
  133. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.js.map +1 -1
  134. package/dist/utils/analytics-auth-status.d.ts +48 -0
  135. package/dist/utils/analytics-auth-status.d.ts.map +1 -0
  136. package/dist/utils/analytics-auth-status.js +89 -0
  137. package/dist/utils/analytics-auth-status.js.map +1 -0
  138. package/dist/utils/model-normalizer.d.ts.map +1 -0
  139. package/dist/utils/model-normalizer.js.map +1 -0
  140. package/dist/utils/pricing.d.ts.map +1 -0
  141. package/dist/{cli/commands/analytics/cost → utils}/pricing.js +3 -3
  142. package/dist/utils/pricing.js.map +1 -0
  143. package/package.json +1 -1
  144. package/scripts/copy-plugins.js +3 -3
  145. package/dist/cli/commands/analytics/cost/pricing.d.ts.map +0 -1
  146. package/dist/cli/commands/analytics/cost/pricing.js.map +0 -1
  147. package/dist/cli/commands/analytics/model-normalizer.d.ts.map +0 -1
  148. package/dist/cli/commands/analytics/model-normalizer.js.map +0 -1
  149. /package/dist/{cli/commands/analytics → utils}/model-normalizer.d.ts +0 -0
  150. /package/dist/{cli/commands/analytics → utils}/model-normalizer.js +0 -0
  151. /package/dist/{cli/commands/analytics/cost → utils}/pricing.d.ts +0 -0
  152. /package/dist/{cli/commands/analytics/cost → utils}/pricing.json +0 -0
@@ -0,0 +1,501 @@
1
+ /**
2
+ * Orchestrates `codemie proxy connect` across one or more targets over a single
3
+ * daemon lifecycle. The unified `connect` command and the two deprecated aliases
4
+ * (`desktop`, `vscode`) are thin wrappers that build a target set and delegate here.
5
+ *
6
+ * Config writers (`connectors/desktop.ts`, `connectors/vscode.ts`,
7
+ * `connectors/vscode-claude-code.ts`) are composed unchanged.
8
+ */
9
+ import chalk from 'chalk';
10
+ import { ConfigLoader } from '../../../utils/config.js';
11
+ import { ProviderRegistry } from '../../../providers/index.js';
12
+ import { displaySetupInstructions } from '../../../providers/integration/setup-ui.js';
13
+ import { ConfigurationError, createErrorContext, formatErrorForUser, } from '../../../utils/errors.js';
14
+ import { logger } from '../../../utils/logger.js';
15
+ import { sanitizeLogArgs } from '../../../utils/security.js';
16
+ import { syncRegisteredSkills } from '../skills/setup/sync.js';
17
+ import { syncPluginSkills } from '../skills/setup/sync-plugin.js';
18
+ import { checkStatus, spawnDaemon, stopDaemon, } from './daemon-manager.js';
19
+ import { writeDesktopConfig, getDesktopBaseDir, mapCanonicalToDesktop, describeManagedSettingsOverride, summarizeManagedOauthShapes, } from './connectors/desktop.js';
20
+ import { fetchManagedMcpServers } from './connectors/managed-mcp-remote.js';
21
+ import { writeVsCodeClaudeCodeConfig } from './connectors/vscode-claude-code.js';
22
+ import { writeVsCodeLanguageModelsConfig } from './connectors/vscode.js';
23
+ import { VS_CODE_SUPPORTED_MODELS } from './connectors/vscode-models.js';
24
+ import { checkProxyHealth } from './health-check.js';
25
+ import { discoverCodexModels, findCodexDesktopApp, getCodexDesktopAppCandidates, getCodexDesktopConfigPath, getCodexDesktopStatePath, selectCodexModel, writeCodexDesktopConfig, } from './connectors/codex-desktop.js';
26
+ export const DEFAULT_DAEMON_PORT = 4001;
27
+ /**
28
+ * Derive the single daemon identity for a target set (spec §3.3 — primary by
29
+ * priority: `claude-desktop` > `vscode-claude-code` > `vscode-byok`). The two
30
+ * Anthropic-gateway targets share the `claude-desktop` identity, so the priority
31
+ * collapses onto exactly the two existing identities — no new telemetry value.
32
+ */
33
+ export function deriveDaemonIdentity(targets) {
34
+ if (targets.claudeDesktop || targets.vscodeClaudeCode) {
35
+ return { clientType: 'claude-desktop', spawnOptions: { telemetryMode: 'claude-desktop' } };
36
+ }
37
+ if (targets.codexDesktop) {
38
+ return { clientType: 'codex-desktop', spawnOptions: { clientType: 'codex-desktop' } };
39
+ }
40
+ return { clientType: 'vscode-byok', spawnOptions: { clientType: 'vscode-byok' } };
41
+ }
42
+ export function getEffectiveClientType(state) {
43
+ return state.clientType ?? (state.telemetryMode === 'claude-desktop'
44
+ ? 'claude-desktop'
45
+ : 'codemie-daemon');
46
+ }
47
+ /**
48
+ * Strict daemon match — the single reconciled matcher used for every target
49
+ * (spec §3.2). Replaces the pre-unification loose desktop gate
50
+ * (`telemetryMode !== 'claude-desktop'`).
51
+ */
52
+ export function daemonMatchesRequest(state, requested) {
53
+ return state.profile === requested.profile &&
54
+ state.port === requested.port &&
55
+ state.project === requested.project &&
56
+ (!requested.provider || state.provider === requested.provider) &&
57
+ (!requested.targetUrl || state.targetUrl === requested.targetUrl) &&
58
+ getEffectiveClientType(state) === requested.clientType;
59
+ }
60
+ // ── Config resolution + credential/error helpers ─────────────────────────────
61
+ /**
62
+ * Resolve an SSO-backed CodeMie profile for the proxy. `commandExample` is the
63
+ * base command echoed back in remediation messages (e.g.
64
+ * `codemie proxy connect --claude-desktop`).
65
+ */
66
+ export async function resolveSsoProxyConfig(profileName, clientLabel, commandExample) {
67
+ const listCodeMieProfiles = async () => {
68
+ const profiles = await ConfigLoader.listProfiles(process.cwd());
69
+ return profiles
70
+ .filter(({ profile }) => {
71
+ const provider = ProviderRegistry.getProvider(profile.provider ?? '');
72
+ return provider?.authType === 'sso';
73
+ })
74
+ .map(({ name }) => name);
75
+ };
76
+ if (profileName) {
77
+ const explicitConfig = await ConfigLoader.load(process.cwd(), { name: profileName });
78
+ const explicitProvider = ProviderRegistry.getProvider(explicitConfig.provider ?? '');
79
+ if (explicitProvider?.authType !== 'sso') {
80
+ const available = await listCodeMieProfiles();
81
+ const details = available.length > 0
82
+ ? `Profiles to try:\n- ${available.join('\n- ')}`
83
+ : 'No SSO-backed CodeMie profiles were found. Run: codemie setup';
84
+ throw new ConfigurationError(`Profile "${profileName}" cannot be used for ${clientLabel} proxy because it is not SSO-backed.\n\n` +
85
+ `Next step:\n` +
86
+ ` ${commandExample} --profile <name>\n\n` +
87
+ `${details}`);
88
+ }
89
+ return {
90
+ config: explicitConfig,
91
+ profileSource: 'explicit'
92
+ };
93
+ }
94
+ const activeConfig = await ConfigLoader.load(process.cwd());
95
+ const activeProvider = ProviderRegistry.getProvider(activeConfig.provider ?? '');
96
+ if (activeProvider?.authType === 'sso') {
97
+ return { config: activeConfig, profileSource: 'active' };
98
+ }
99
+ const activeProfileName = await ConfigLoader.getActiveProfileName(process.cwd());
100
+ const available = await listCodeMieProfiles();
101
+ const providerName = activeConfig.provider ?? 'unknown';
102
+ const details = available.length > 0
103
+ ? `Next step:\n` +
104
+ ` codemie profile switch <codemie-profile>\n` +
105
+ ` ${commandExample}\n\n` +
106
+ `Or run once with a specific profile:\n` +
107
+ ` ${commandExample} --profile <codemie-profile>\n\n` +
108
+ `Profiles to try:\n- ${available.join('\n- ')}`
109
+ : `No SSO-backed CodeMie profiles were found.\n\n` +
110
+ `Next step:\n` +
111
+ ` codemie setup`;
112
+ throw new ConfigurationError(`${clientLabel} proxy needs an SSO-backed CodeMie profile.\n` +
113
+ `Current active profile: "${activeProfileName ?? 'unknown'}" (provider: ${providerName})\n\n` +
114
+ `${details}`);
115
+ }
116
+ export async function verifySsoCredentials(baseUrl, profileName) {
117
+ try {
118
+ const { CodeMieSSO } = await import('../../../providers/plugins/sso/sso.auth.js');
119
+ const sso = new CodeMieSSO();
120
+ const creds = await sso.getStoredCredentials(baseUrl);
121
+ if (!creds) {
122
+ console.error(chalk.red(`✗ No SSO credentials found for profile '${profileName}'.`));
123
+ console.error(` Run: codemie profile login --url ${baseUrl}`);
124
+ process.exit(1);
125
+ }
126
+ }
127
+ catch (err) {
128
+ console.error(chalk.red(`✗ Failed to verify credentials: ${err.message}`));
129
+ process.exit(1);
130
+ }
131
+ }
132
+ export function printProxyError(error, label) {
133
+ const context = createErrorContext(error);
134
+ logger.error(label, error);
135
+ if (error instanceof ConfigurationError) {
136
+ console.error(chalk.red(`✗ ${error.message}`));
137
+ }
138
+ else {
139
+ console.error(formatErrorForUser(context, { showSystem: false }));
140
+ }
141
+ process.exit(1);
142
+ }
143
+ // ── Unified connect orchestrator ─────────────────────────────────────────────
144
+ const TARGET_LIST = [
145
+ 'Select at least one target to configure:',
146
+ '',
147
+ ' --claude-desktop Claude Desktop app (MCP servers)',
148
+ ' --vscode VS Code Copilot Chat models (BYOK)',
149
+ ' --vscode-claude-code VS Code Claude Code extension',
150
+ ' --codex-desktop Codex desktop app (writes ~/.codex/config.toml)',
151
+ '',
152
+ 'Examples:',
153
+ ' codemie proxy connect --claude-desktop',
154
+ ' codemie proxy connect --codex-desktop',
155
+ ' codemie proxy connect --vscode --vscode-claude-code',
156
+ ' codemie proxy connect --claude-desktop --vscode --insiders',
157
+ '',
158
+ "Run 'codemie proxy connect --help' for all options.",
159
+ ].join('\n');
160
+ function hasAnyTarget(t) {
161
+ return Boolean(t.claudeDesktop || t.vscode || t.vscodeClaudeCode || t.codexDesktop);
162
+ }
163
+ /** A human label and the base command to echo in remediation messages. */
164
+ function describeTargets(t) {
165
+ const flags = [];
166
+ const labels = [];
167
+ if (t.claudeDesktop) {
168
+ flags.push('--claude-desktop');
169
+ labels.push('Claude Desktop');
170
+ }
171
+ if (t.vscode) {
172
+ flags.push('--vscode');
173
+ labels.push('VS Code');
174
+ }
175
+ if (t.vscodeClaudeCode) {
176
+ flags.push('--vscode-claude-code');
177
+ labels.push('VS Code Claude Code');
178
+ }
179
+ if (t.codexDesktop) {
180
+ flags.push('--codex-desktop');
181
+ labels.push('Codex Desktop');
182
+ }
183
+ const label = labels.length === 1 ? labels[0] : 'CodeMie';
184
+ return { label, commandExample: `codemie proxy connect ${flags.join(' ')}` };
185
+ }
186
+ async function rollbackDaemon() {
187
+ try {
188
+ await stopDaemon();
189
+ logger.info('[proxy] Proxy startup rolled back after configuration failure');
190
+ }
191
+ catch (stopError) {
192
+ logger.warn('[proxy] Failed to stop proxy after configuration failure', ...sanitizeLogArgs({
193
+ error: stopError instanceof Error ? stopError.message : String(stopError),
194
+ }));
195
+ }
196
+ }
197
+ /**
198
+ * Ensure a single daemon matching `requested` is running and healthy, spawning
199
+ * or restarting it as needed (the reconciled strict-match lifecycle, spec §3.2).
200
+ */
201
+ async function ensureDaemon(requested, identity, config, force, verbose) {
202
+ let { running, state } = await checkStatus();
203
+ const matches = Boolean(running && state && daemonMatchesRequest(state, requested));
204
+ let unhealthy = false;
205
+ if (running && state && matches && !force) {
206
+ const health = await checkProxyHealth({
207
+ port: state.port,
208
+ gatewayKey: state.gatewayKey,
209
+ deep: true,
210
+ });
211
+ unhealthy = !health.healthy;
212
+ if (unhealthy) {
213
+ console.log(chalk.yellow(`Existing proxy is unhealthy (${health.reason ?? 'unknown'}). Restarting...`));
214
+ }
215
+ }
216
+ if (running && (!matches || unhealthy || force)) {
217
+ if (force) {
218
+ console.log('Forcing a fresh proxy restart...');
219
+ }
220
+ else if (!matches) {
221
+ console.log('Restarting proxy to match the requested client...');
222
+ }
223
+ await stopDaemon();
224
+ running = false;
225
+ state = null;
226
+ }
227
+ let startedInThisRun = false;
228
+ if (!running || !state) {
229
+ console.log('Starting proxy...');
230
+ state = await spawnDaemon({
231
+ targetUrl: config.baseUrl,
232
+ provider: config.provider ?? 'ai-run-sso',
233
+ profile: config.name ?? 'default',
234
+ port: DEFAULT_DAEMON_PORT,
235
+ project: config.codeMieProject,
236
+ ...identity.spawnOptions,
237
+ syncApiUrl: config.ssoConfig?.apiUrl,
238
+ syncCodeMieUrl: config.codeMieUrl,
239
+ });
240
+ startedInThisRun = true;
241
+ console.log(verbose
242
+ ? chalk.green(`✓ Proxy started at ${state.url}`)
243
+ : chalk.green('✓ Proxy started'));
244
+ }
245
+ return { state, startedInThisRun };
246
+ }
247
+ function printSummary(results) {
248
+ console.log(chalk.bold('\nTargets configured:'));
249
+ for (const r of results) {
250
+ if (r.ok) {
251
+ console.log(chalk.green(` ✓ ${r.label}`));
252
+ }
253
+ else {
254
+ console.log(chalk.red(` ✗ ${r.label} — ${r.error ?? 'failed'}`));
255
+ }
256
+ }
257
+ }
258
+ async function runClaudeDesktop(state, verbose) {
259
+ try {
260
+ const canonical = state.syncCodeMieUrl
261
+ ? await fetchManagedMcpServers('claude-desktop', state.syncCodeMieUrl)
262
+ : null;
263
+ const orgMcpServers = canonical ? mapCanonicalToDesktop(canonical) : null;
264
+ const oauthShapes = summarizeManagedOauthShapes(orgMcpServers);
265
+ logger.info('[proxy] Resolved managed MCP servers for Claude Desktop', ...sanitizeLogArgs({
266
+ codeMieUrl: state.syncCodeMieUrl,
267
+ fetchSucceeded: canonical !== null,
268
+ canonicalCount: canonical?.length ?? 0,
269
+ mappedCount: orgMcpServers?.length ?? 0,
270
+ mappedNames: orgMcpServers?.map((s) => s.name) ?? [],
271
+ oauthConfiguredCount: oauthShapes.oauthConfigured,
272
+ oauthFlaggedCount: oauthShapes.oauthFlagged,
273
+ noAuthCount: oauthShapes.noAuth,
274
+ }));
275
+ const configPath = await writeDesktopConfig(state.url, state.gatewayKey, getDesktopBaseDir(), orgMcpServers);
276
+ logger.info('[proxy] Claude Desktop proxy configuration written', ...sanitizeLogArgs({
277
+ configPath,
278
+ gatewayUrl: state.url,
279
+ telemetryMode: state.telemetryMode,
280
+ profile: state.profile,
281
+ inferenceGatewayApiKey: state.gatewayKey,
282
+ }));
283
+ console.log(chalk.green('✓ Claude Desktop configured'));
284
+ const managedSettingsWarning = describeManagedSettingsOverride();
285
+ if (managedSettingsWarning) {
286
+ console.log(chalk.yellow(`⚠ ${managedSettingsWarning}`));
287
+ logger.warn('[proxy] Claude Desktop managed settings source present', ...sanitizeLogArgs({ managedSettingsWarning }));
288
+ }
289
+ if (verbose) {
290
+ console.log(` Config: ${configPath}`);
291
+ console.log(` Gateway: ${state.url}`);
292
+ console.log(chalk.dim(' Telemetry: metrics and conversations will sync as claude-desktop.'));
293
+ }
294
+ console.log(chalk.yellow(' Restart Claude Desktop to apply changes.'));
295
+ return { label: 'Claude Desktop', ok: true };
296
+ }
297
+ catch (error) {
298
+ const message = error instanceof Error ? error.message : String(error);
299
+ logger.warn('[proxy] Failed to configure Claude Desktop', ...sanitizeLogArgs({ error: message }));
300
+ console.log(chalk.yellow(` Could not configure Claude Desktop: ${message}`));
301
+ return { label: 'Claude Desktop', ok: false, error: message };
302
+ }
303
+ }
304
+ async function runVscodeByok(state, insiders, config, verbose) {
305
+ try {
306
+ const result = await writeVsCodeLanguageModelsConfig(state.url, insiders);
307
+ logger.info('[proxy] VS Code BYOK configuration written', ...sanitizeLogArgs({
308
+ configPath: result.configPath,
309
+ gatewayUrl: state.url,
310
+ profile: state.profile,
311
+ project: state.project,
312
+ modelCount: VS_CODE_SUPPORTED_MODELS.length,
313
+ clientType: state.clientType,
314
+ requiresSecretConfiguration: result.requiresSecretConfiguration,
315
+ }));
316
+ console.log(chalk.green(`✓ ${insiders ? 'VS Code Insiders' : 'VS Code'} configured`));
317
+ if (verbose) {
318
+ console.log(` Config: ${result.configPath}`);
319
+ console.log(` Gateway: ${state.url}`);
320
+ console.log(` Models: ${VS_CODE_SUPPORTED_MODELS.length}`);
321
+ console.log(` Project: ${config.codeMieProject || '(not configured)'}`);
322
+ }
323
+ if (result.requiresSecretConfiguration) {
324
+ displaySetupInstructions({
325
+ setupInstructions: [
326
+ 'One-time VS Code secret setup required:\n',
327
+ '1. Open VS Code and Press ⇧⌘P (macOS) or Ctrl+Shift+P (Windows/Linux).',
328
+ '2. Find Chat: Manage Language Models',
329
+ '3. In opened dialog Right-click any CodeMie model → Update API Key',
330
+ `4. Enter API key: ${state.gatewayKey}\n`,
331
+ 'Reload VS Code, then select a CodeMie model from the model picker.',
332
+ ].join('\n'),
333
+ });
334
+ }
335
+ else {
336
+ console.log(chalk.dim(` If VS Code reports a missing or invalid key, open Chat: Manage Language Models, ` +
337
+ `then right-click any CodeMie model → Update API Key and enter ${state.gatewayKey}.`));
338
+ }
339
+ return { label: 'VS Code (Copilot models)', ok: true };
340
+ }
341
+ catch (error) {
342
+ const message = error instanceof Error ? error.message : String(error);
343
+ logger.warn('[proxy] Failed to configure VS Code BYOK', ...sanitizeLogArgs({ error: message }));
344
+ console.log(chalk.yellow(` Could not configure VS Code Copilot models: ${message}`));
345
+ return { label: 'VS Code (Copilot models)', ok: false, error: message };
346
+ }
347
+ }
348
+ async function runVscodeClaudeCode(state, insiders) {
349
+ try {
350
+ const vsCodeResult = await writeVsCodeClaudeCodeConfig(state.url, state.gatewayKey, insiders);
351
+ console.log(chalk.green(`✓ VS Code Claude Code extension configured (${vsCodeResult.path})`));
352
+ console.log(chalk.yellow(' Reload VS Code to apply changes.'));
353
+ return { label: 'VS Code Claude Code extension', ok: true };
354
+ }
355
+ catch (error) {
356
+ const message = error instanceof Error ? error.message : String(error);
357
+ logger.warn('[proxy] Failed to configure VS Code Claude Code extension', ...sanitizeLogArgs({ error: message, insiders }));
358
+ console.log(chalk.yellow(` Could not configure the VS Code Claude Code extension: ${message}`));
359
+ return { label: 'VS Code Claude Code extension', ok: false, error: message };
360
+ }
361
+ }
362
+ async function runCodexDesktop(state, options) {
363
+ const label = 'Codex Desktop';
364
+ try {
365
+ const candidates = getCodexDesktopAppCandidates();
366
+ if (!findCodexDesktopApp(candidates) && !options.force) {
367
+ throw new ConfigurationError(candidates.length === 0
368
+ ? `The Codex desktop app is not supported on ${process.platform} ` +
369
+ '(macOS and Windows only). Re-run with --force to write the config anyway.'
370
+ : 'Could not find the ChatGPT desktop app (which ships Codex). Looked in: ' +
371
+ `${candidates.join(', ')}. ` +
372
+ 'Install it, or re-run with --force to write the config anyway.');
373
+ }
374
+ // Printed unconditionally: this command edits a file the user's own Codex CLI
375
+ // also reads, so which file was touched is not a debugging detail.
376
+ const configPath = getCodexDesktopConfigPath();
377
+ console.log(chalk.cyan(`Codex config: ${configPath}`));
378
+ const discovered = await discoverCodexModels(state.url, state.gatewayKey);
379
+ const model = selectCodexModel(discovered, options.model);
380
+ await writeCodexDesktopConfig({
381
+ configPath,
382
+ statePath: getCodexDesktopStatePath(),
383
+ proxyUrl: state.url,
384
+ baseUrl: new URL('/v1', state.url).toString(),
385
+ gatewayKey: state.gatewayKey,
386
+ model,
387
+ force: options.force,
388
+ });
389
+ console.log(chalk.green(`\u2713 Codex Desktop configured (model: ${model})`));
390
+ console.log(chalk.yellow('\u26a0 Quit and reopen the ChatGPT desktop app to apply the change.'));
391
+ console.log(chalk.dim(' Switching models in the app\'s picker is supported \u2014 the proxy'));
392
+ console.log(chalk.dim(' maps its model names onto CodeMie deployments.'));
393
+ return { label, ok: true };
394
+ }
395
+ catch (error) {
396
+ const message = error instanceof Error ? error.message : String(error);
397
+ logger.warn('[proxy] Codex Desktop configuration failed', ...sanitizeLogArgs({ error: message }));
398
+ return { label, ok: false, error: message };
399
+ }
400
+ }
401
+ /** Test seam \u2014 the runner is otherwise only reachable through `connectTargets`. */
402
+ export const runCodexDesktopForTest = runCodexDesktop;
403
+ export async function connectTargets(opts) {
404
+ const { targets } = opts;
405
+ if (!hasAnyTarget(targets)) {
406
+ console.log(TARGET_LIST);
407
+ return;
408
+ }
409
+ const verbose = Boolean(opts.verbose);
410
+ const insiders = Boolean(opts.insiders);
411
+ if (insiders && !targets.vscode && !targets.vscodeClaudeCode) {
412
+ console.log(chalk.yellow('Note: --insiders has no effect without a VS Code target (--vscode / --vscode-claude-code).'));
413
+ }
414
+ if (opts.model && !targets.codexDesktop) {
415
+ console.log(chalk.yellow('Note: --model has no effect without --codex-desktop.'));
416
+ }
417
+ // One daemon serves the whole run and carries a single client type. The Codex
418
+ // model normalizer is gated on that type, so a higher-priority target silently
419
+ // turns off the resolution the Codex app depends on.
420
+ if (targets.codexDesktop && deriveDaemonIdentity(targets).clientType !== 'codex-desktop') {
421
+ console.log(chalk.yellow('Warning: --codex-desktop was combined with a target that owns the shared daemon, so\n' +
422
+ ' Codex model-name resolution is disabled for this run. Selecting a model in the Codex\n' +
423
+ ' app will fail. Run `codemie proxy connect --codex-desktop` on its own instead.'));
424
+ }
425
+ const { label, commandExample } = describeTargets(targets);
426
+ let startedInThisRun = false;
427
+ let state;
428
+ let config;
429
+ try {
430
+ const resolved = await resolveSsoProxyConfig(opts.profile, label, commandExample);
431
+ config = resolved.config;
432
+ if (!config.baseUrl) {
433
+ throw new ConfigurationError('No API URL configured. Run: codemie setup');
434
+ }
435
+ // The Claude Desktop target fetches org-managed MCP servers via codeMieUrl.
436
+ if (targets.claudeDesktop && !config.codeMieUrl) {
437
+ throw new ConfigurationError('Selected profile is missing CodeMie URL.\n' +
438
+ 'Run: codemie setup or codemie profile login');
439
+ }
440
+ const profile = config.name ?? 'default';
441
+ console.log(verbose
442
+ ? chalk.cyan(`Using profile: ${profile} ` +
443
+ `(source: ${resolved.profileSource === 'explicit' ? '--profile' : 'active profile'})`)
444
+ : chalk.cyan(`Using profile: ${profile}`));
445
+ await verifySsoCredentials(config.baseUrl, profile);
446
+ const cwd = process.cwd();
447
+ await Promise.allSettled([
448
+ syncRegisteredSkills(profile, cwd),
449
+ syncPluginSkills(),
450
+ ]);
451
+ const identity = deriveDaemonIdentity(targets);
452
+ const requested = {
453
+ profile,
454
+ port: DEFAULT_DAEMON_PORT,
455
+ project: config.codeMieProject,
456
+ clientType: identity.clientType,
457
+ provider: config.provider ?? 'ai-run-sso',
458
+ targetUrl: config.baseUrl,
459
+ };
460
+ const ensured = await ensureDaemon(requested, identity, config, Boolean(opts.force), verbose);
461
+ state = ensured.state;
462
+ startedInThisRun = ensured.startedInThisRun;
463
+ }
464
+ catch (error) {
465
+ if (startedInThisRun) {
466
+ await rollbackDaemon();
467
+ }
468
+ printProxyError(error, 'Failed to connect proxy');
469
+ // printProxyError calls process.exit and never returns; this explicit return
470
+ // guarantees control can never fall through to the dispatch below with
471
+ // `state`/`config` unassigned, independent of process.exit behavior.
472
+ return;
473
+ }
474
+ // Per-target dispatch (spec §3.4) — each writer runs independently.
475
+ const results = [];
476
+ if (targets.claudeDesktop)
477
+ results.push(await runClaudeDesktop(state, verbose));
478
+ if (targets.vscode)
479
+ results.push(await runVscodeByok(state, insiders, config, verbose));
480
+ if (targets.vscodeClaudeCode)
481
+ results.push(await runVscodeClaudeCode(state, insiders));
482
+ if (targets.codexDesktop) {
483
+ results.push(await runCodexDesktop(state, {
484
+ force: Boolean(opts.force),
485
+ model: opts.model,
486
+ verbose,
487
+ }));
488
+ }
489
+ const anyFailed = results.some((r) => !r.ok);
490
+ const allFailed = results.every((r) => !r.ok);
491
+ // Spec §3.4: print the per-target summary after all requested targets run,
492
+ // unconditionally — a single-target success gets the summary block too.
493
+ printSummary(results);
494
+ if (anyFailed) {
495
+ process.exitCode = 1;
496
+ }
497
+ if (allFailed && startedInThisRun) {
498
+ await rollbackDaemon();
499
+ }
500
+ }
501
+ //# sourceMappingURL=connect-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-orchestrator.js","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/connect-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Pure string surgery for the CodeMie-managed regions of `~/.codex/config.toml`.
3
+ *
4
+ * Nothing here touches the filesystem, the network, or the logger. The Codex
5
+ * config file is user-owned, so the managed content is spliced in as delimited
6
+ * text rather than round-tripped through a TOML serializer: `@iarna/toml`'s
7
+ * `stringify` discards comments and key order, which would silently rewrite the
8
+ * user's file on every connect.
9
+ *
10
+ * TOML permits bare top-level keys only *before* the first table header, so the
11
+ * managed content cannot be one contiguous block. It is two regions: a header
12
+ * region prepended to the file (holding `model_provider` and `model`) and a
13
+ * table region appended to it (holding `[model_providers.codemie]`).
14
+ */
15
+ export declare const HEADER_OPEN = "# >>> codemie proxy connect (codex-desktop) header - managed block, do not edit";
16
+ export declare const HEADER_CLOSE = "# <<< codemie proxy connect (codex-desktop) header";
17
+ export declare const TABLE_OPEN = "# >>> codemie proxy connect (codex-desktop) provider - managed block, do not edit";
18
+ export declare const TABLE_CLOSE = "# <<< codemie proxy connect (codex-desktop) provider";
19
+ /** A half-open character range `[start, end)` covering a managed region. */
20
+ export interface Region {
21
+ start: number;
22
+ end: number;
23
+ }
24
+ export interface ManagedRegions {
25
+ header: Region | null;
26
+ table: Region | null;
27
+ }
28
+ /**
29
+ * Locate both managed regions. A region whose close sentinel is missing is
30
+ * reported as absent rather than guessed at — a truncated block is treated as
31
+ * unmanaged text so the writer never deletes content it cannot delimit.
32
+ */
33
+ export declare function findManagedRegions(text: string): ManagedRegions;
34
+ /** Marks a user key the connector commented out so it can be restored verbatim. */
35
+ export declare const DISPLACED_PREFIX = "#codemie-displaced# ";
36
+ /**
37
+ * Comment out unmanaged root-level `model` / `model_provider` assignments.
38
+ *
39
+ * Only the document root matters: once the scan passes the first table header,
40
+ * any same-named key belongs to that table and is none of our business.
41
+ * Idempotent — a line already carrying `DISPLACED_PREFIX` is left alone.
42
+ */
43
+ export declare function commentDisplacedKeys(text: string): string;
44
+ /** Exact inverse of `commentDisplacedKeys`. */
45
+ export declare function restoreDisplacedKeys(text: string): string;
46
+ export interface ManagedBlocks {
47
+ /** Body of the header region — bare top-level keys, no sentinels. */
48
+ header: string;
49
+ /** Body of the table region — the `[model_providers.codemie]` table. */
50
+ table: string;
51
+ }
52
+ /**
53
+ * Insert both managed regions, replacing any that already exist. The header is
54
+ * prepended (TOML bare keys must precede the first table header) and the table
55
+ * is appended. Every line outside the two regions is preserved verbatim.
56
+ */
57
+ export declare function spliceManagedBlocks(text: string, blocks: ManagedBlocks): string;
58
+ /**
59
+ * Remove both managed regions and restore any keys the splice displaced,
60
+ * yielding the text the file held before `spliceManagedBlocks` ran.
61
+ */
62
+ export declare function stripManagedRegions(text: string): string;
63
+ /** The provider id CodeMie owns in the user's Codex config. */
64
+ export declare const CODEMIE_PROVIDER_ID = "codemie";
65
+ export interface ManagedBlockInput {
66
+ baseUrl: string;
67
+ gatewayKey: string;
68
+ model: string;
69
+ }
70
+ /**
71
+ * Render the two managed region bodies.
72
+ *
73
+ * `wire_api` is always `responses`: Codex removed the `chat` wire API in
74
+ * February 2026, so a custom provider declaring anything else fails at startup.
75
+ * The gateway key travels as a static `http_headers` entry rather than an
76
+ * `env_key`, because a desktop app does not inherit the shell environment — and
77
+ * never via `~/.codex/auth.json`, because writing there flips the app into
78
+ * API-key auth mode and disables its ChatGPT-account features.
79
+ */
80
+ export declare function buildManagedBlocks(input: ManagedBlockInput): ManagedBlocks;
81
+ //# sourceMappingURL=codex-config-toml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-config-toml.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/proxy/connectors/codex-config-toml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,WAAW,oFAAoF,CAAC;AAC7G,eAAO,MAAM,YAAY,uDAAuD,CAAC;AACjF,eAAO,MAAM,UAAU,sFAAsF,CAAC;AAC9G,eAAO,MAAM,WAAW,yDAAyD,CAAC;AAElF,4EAA4E;AAC5E,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AA4BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAK/D;AAED,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAYvD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBzD;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;CACf;AAkED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAQ/E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAWD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CAgB1E"}