@codemieai/code 0.13.1 → 0.14.1
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.
- package/README.md +44 -6
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +53 -4
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/plugins/claude/claude.models.d.ts +12 -0
- package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -0
- package/dist/agents/plugins/claude/claude.models.js +191 -0
- package/dist/agents/plugins/claude/claude.models.js.map +1 -0
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +45 -1
- package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/codex/codex-models.d.ts +11 -0
- package/dist/agents/plugins/codex/codex-models.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex-models.js +71 -0
- package/dist/agents/plugins/codex/codex-models.js.map +1 -1
- package/dist/agents/plugins/gemini/gemini.paths.d.ts +11 -0
- package/dist/agents/plugins/gemini/gemini.paths.d.ts.map +1 -0
- package/dist/agents/plugins/gemini/gemini.paths.js +21 -0
- package/dist/agents/plugins/gemini/gemini.paths.js.map +1 -0
- package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts +20 -0
- package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/gemini.session-adapter.js +119 -3
- package/dist/agents/plugins/gemini/gemini.session-adapter.js.map +1 -1
- package/dist/agents/plugins/pi/pi.models.d.ts +14 -0
- package/dist/agents/plugins/pi/pi.models.d.ts.map +1 -1
- package/dist/agents/plugins/pi/pi.models.js +89 -0
- package/dist/agents/plugins/pi/pi.models.js.map +1 -1
- package/dist/cli/commands/analytics/agent-labels.d.ts.map +1 -1
- package/dist/cli/commands/analytics/agent-labels.js +1 -0
- package/dist/cli/commands/analytics/agent-labels.js.map +1 -1
- package/dist/cli/commands/analytics/aggregator.js +1 -1
- package/dist/cli/commands/analytics/aggregator.js.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-calculator.d.ts +1 -1
- package/dist/cli/commands/analytics/cost/cost-calculator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.js +2 -2
- package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
- package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/data-loader.js +9 -0
- package/dist/cli/commands/analytics/data-loader.js.map +1 -1
- package/dist/cli/commands/analytics/native-loader.js +1 -1
- package/dist/cli/commands/analytics/native-loader.js.map +1 -1
- package/dist/cli/commands/analytics/otel-loader.js +1 -1
- package/dist/cli/commands/analytics/otel-loader.js.map +1 -1
- package/dist/cli/commands/analytics/report/client/app.js +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +70 -1
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/proxy/connect-orchestrator.d.ts +95 -0
- package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connect-orchestrator.js +501 -0
- package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -0
- package/dist/cli/commands/proxy/connectors/codex-config-toml.d.ts +81 -0
- package/dist/cli/commands/proxy/connectors/codex-config-toml.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/codex-config-toml.js +218 -0
- package/dist/cli/commands/proxy/connectors/codex-config-toml.js.map +1 -0
- package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts +85 -0
- package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/codex-desktop.js +299 -0
- package/dist/cli/commands/proxy/connectors/codex-desktop.js.map +1 -0
- package/dist/cli/commands/proxy/connectors/desktop.d.ts +5 -0
- package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop.js +48 -2
- package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts +10 -0
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/vscode-claude-code.d.ts +26 -0
- package/dist/cli/commands/proxy/connectors/vscode-claude-code.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/vscode-claude-code.js +132 -0
- package/dist/cli/commands/proxy/connectors/vscode-claude-code.js.map +1 -0
- package/dist/cli/commands/proxy/connectors/vscode.d.ts +2 -0
- package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/vscode.js +2 -2
- package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -1
- package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts +8 -0
- package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts.map +1 -0
- package/dist/cli/commands/proxy/disconnect-orchestrator.js +43 -0
- package/dist/cli/commands/proxy/disconnect-orchestrator.js.map +1 -0
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +91 -370
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/index.js +7 -7
- package/dist/providers/integration/setup-ui.d.ts +14 -2
- package/dist/providers/integration/setup-ui.d.ts.map +1 -1
- package/dist/providers/integration/setup-ui.js +70 -33
- package/dist/providers/integration/setup-ui.js.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.js +9 -2
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.setup-steps.js.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +18 -28
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -1
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.js +4 -4
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.js.map +1 -1
- package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/litellm/litellm.setup-steps.js +3 -1
- package/dist/providers/plugins/litellm/litellm.setup-steps.js.map +1 -1
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.js +5 -1
- package/dist/providers/plugins/moonshot-subscription/moonshot-subscription.setup-steps.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.js +3 -2
- package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.js +4 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.d.ts +45 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.js +129 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-model-resolver.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.d.ts +27 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js +242 -0
- package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +2 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js +3 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.d.ts.map +1 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js +15 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.js +3 -0
- package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
- package/dist/utils/analytics-auth-status.d.ts +48 -0
- package/dist/utils/analytics-auth-status.d.ts.map +1 -0
- package/dist/utils/analytics-auth-status.js +89 -0
- package/dist/utils/analytics-auth-status.js.map +1 -0
- package/dist/utils/model-normalizer.d.ts.map +1 -0
- package/dist/utils/model-normalizer.js.map +1 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/{cli/commands/analytics/cost → utils}/pricing.js +3 -3
- package/dist/utils/pricing.js.map +1 -0
- package/package.json +1 -1
- package/scripts/copy-plugins.js +3 -3
- package/dist/cli/commands/analytics/cost/pricing.d.ts.map +0 -1
- package/dist/cli/commands/analytics/cost/pricing.js.map +0 -1
- package/dist/cli/commands/analytics/model-normalizer.d.ts.map +0 -1
- package/dist/cli/commands/analytics/model-normalizer.js.map +0 -1
- /package/dist/{cli/commands/analytics → utils}/model-normalizer.d.ts +0 -0
- /package/dist/{cli/commands/analytics → utils}/model-normalizer.js +0 -0
- /package/dist/{cli/commands/analytics/cost → utils}/pricing.d.ts +0 -0
- /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"}
|