@codemieai/code 0.8.0 → 0.10.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.
- package/README.md +12 -0
- package/dist/agents/core/AgentCLI.d.ts +4 -1
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +113 -6
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts +8 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +57 -1
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/session/session-origin-audit.d.ts +4 -0
- package/dist/agents/core/session/session-origin-audit.d.ts.map +1 -0
- package/dist/agents/core/session/session-origin-audit.js +67 -0
- package/dist/agents/core/session/session-origin-audit.js.map +1 -0
- package/dist/agents/core/session/session-ownership.d.ts +2 -0
- package/dist/agents/core/session/session-ownership.d.ts.map +1 -0
- package/dist/agents/core/session/session-ownership.js +27 -0
- package/dist/agents/core/session/session-ownership.js.map +1 -0
- package/dist/agents/core/types.d.ts +33 -1
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts +11 -2
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +55 -83
- package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +301 -0
- package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +25 -2
- package/dist/agents/plugins/claude/plugin/statusline.mjs +147 -93
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +2 -0
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
- package/dist/agents/plugins/claude/statusline-installer.d.ts +5 -2
- package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
- package/dist/agents/plugins/claude/statusline-installer.js +12 -59
- package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.d.ts +8 -0
- package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.js +18 -3
- package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js +2 -0
- package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js +2 -0
- package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js.map +1 -1
- package/dist/agents/plugins/kimi/kimi.plugin.d.ts +1 -1
- package/dist/agents/plugins/kimi/kimi.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/kimi/kimi.plugin.js +3 -2
- package/dist/agents/plugins/kimi/kimi.plugin.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.js +5 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode-model-configs.js +29 -0
- package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode.plugin.js +1 -0
- package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
- package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +2 -0
- package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js.map +1 -1
- package/dist/bin/proxy-daemon.js +3 -1
- package/dist/bin/proxy-daemon.js.map +1 -1
- package/dist/cli/commands/analytics/data-loader.d.ts +11 -3
- package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/data-loader.js +33 -6
- package/dist/cli/commands/analytics/data-loader.js.map +1 -1
- package/dist/cli/commands/analytics/formatter.d.ts.map +1 -1
- package/dist/cli/commands/analytics/formatter.js +4 -1
- package/dist/cli/commands/analytics/formatter.js.map +1 -1
- package/dist/cli/commands/analytics/index.d.ts +3 -0
- package/dist/cli/commands/analytics/index.d.ts.map +1 -1
- package/dist/cli/commands/analytics/index.js +25 -7
- package/dist/cli/commands/analytics/index.js.map +1 -1
- package/dist/cli/commands/analytics/native-loader.d.ts +2 -0
- package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/native-loader.js +85 -3
- package/dist/cli/commands/analytics/native-loader.js.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.d.ts +3 -0
- package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.js +3 -0
- package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
- package/dist/cli/commands/analytics/report/report-generator.d.ts +3 -2
- package/dist/cli/commands/analytics/report/report-generator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/report-generator.js +9 -4
- package/dist/cli/commands/analytics/report/report-generator.js.map +1 -1
- package/dist/cli/commands/analytics/report/session-report.d.ts +24 -0
- package/dist/cli/commands/analytics/report/session-report.d.ts.map +1 -0
- package/dist/cli/commands/analytics/report/session-report.js +50 -0
- package/dist/cli/commands/analytics/report/session-report.js.map +1 -0
- package/dist/cli/commands/analytics/report/types.d.ts +3 -0
- package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/sources/sessions-source.js +3 -1
- package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -1
- package/dist/cli/commands/analytics/sources/types.d.ts +2 -0
- package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/types.d.ts +2 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/index.js +8 -0
- package/dist/cli/commands/assistants/chat/index.js.map +1 -1
- package/dist/cli/commands/assistants/chat/types.d.ts +1 -0
- package/dist/cli/commands/assistants/chat/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/index.js +2 -2
- package/dist/cli/commands/assistants/setup/index.js.map +1 -1
- package/dist/cli/commands/doctor/checks/JWTAuthCheck.d.ts.map +1 -1
- package/dist/cli/commands/doctor/checks/JWTAuthCheck.js +4 -2
- package/dist/cli/commands/doctor/checks/JWTAuthCheck.js.map +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +26 -0
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +26 -17
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/models.js +1 -1
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/vscode.d.ts +9 -0
- package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/vscode.js +209 -0
- package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -0
- package/dist/cli/commands/proxy/daemon-manager.d.ts +2 -0
- package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
- package/dist/cli/commands/proxy/daemon-manager.js +2 -0
- package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
- package/dist/cli/commands/proxy/health-check.js +1 -1
- package/dist/cli/commands/proxy/health-check.js.map +1 -1
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +213 -33
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +2 -1
- package/dist/env/types.d.ts.map +1 -1
- package/dist/providers/core/default-agent-hooks.d.ts +10 -0
- package/dist/providers/core/default-agent-hooks.d.ts.map +1 -0
- package/dist/providers/core/default-agent-hooks.js +54 -0
- package/dist/providers/core/default-agent-hooks.js.map +1 -0
- package/dist/providers/core/types.d.ts +20 -0
- package/dist/providers/core/types.d.ts.map +1 -1
- package/dist/providers/core/types.js +20 -0
- package/dist/providers/core/types.js.map +1 -1
- package/dist/providers/integration/setup-ui.d.ts +1 -1
- package/dist/providers/integration/setup-ui.d.ts.map +1 -1
- package/dist/providers/integration/setup-ui.js.map +1 -1
- package/dist/providers/plugins/jwt/index.d.ts +2 -0
- package/dist/providers/plugins/jwt/index.d.ts.map +1 -1
- package/dist/providers/plugins/jwt/index.js +6 -3
- package/dist/providers/plugins/jwt/index.js.map +1 -1
- package/dist/providers/plugins/jwt/jwt.models.d.ts +12 -0
- package/dist/providers/plugins/jwt/jwt.models.d.ts.map +1 -0
- package/dist/providers/plugins/jwt/jwt.models.js +28 -0
- package/dist/providers/plugins/jwt/jwt.models.js.map +1 -0
- package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts +1 -1
- package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/jwt/jwt.setup-steps.js +10 -9
- package/dist/providers/plugins/jwt/jwt.setup-steps.js.map +1 -1
- package/dist/providers/plugins/jwt/jwt.template.d.ts +1 -1
- package/dist/providers/plugins/jwt/jwt.template.d.ts.map +1 -1
- package/dist/providers/plugins/jwt/jwt.template.js +9 -6
- package/dist/providers/plugins/jwt/jwt.template.js.map +1 -1
- package/dist/providers/plugins/jwt/jwt.utils.d.ts +16 -0
- package/dist/providers/plugins/jwt/jwt.utils.d.ts.map +1 -0
- package/dist/providers/plugins/jwt/jwt.utils.js +21 -0
- package/dist/providers/plugins/jwt/jwt.utils.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +14 -14
- package/dist/providers/plugins/sso/proxy/plugins/index.js +16 -16
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.js +3 -2
- package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
- package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.d.ts.map +1 -1
- package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +4 -0
- package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.js +10 -1
- package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
- package/dist/providers/plugins/sso/sso.template.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.template.js +6 -82
- package/dist/providers/plugins/sso/sso.template.js.map +1 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +3 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
- package/dist/utils/auth.d.ts +1 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +18 -1
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +16 -6
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -3
- package/dist/utils/errors.js.map +1 -1
- package/package.json +16 -11
- package/scripts/postinstall.mjs +14 -2
- package/scripts/validate-secrets.js +20 -4
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { ConfigurationError } from '../../../../utils/errors.js';
|
|
6
|
+
const MANAGED_MODEL_NAME = 'CodeMie Profile Model';
|
|
7
|
+
const SECRET_REFERENCE_PATTERN = /^\$\{input:chat\.lm\.secret\.[^}]+\}$/;
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function isManagedModel(model, currentModelId) {
|
|
12
|
+
if (!isRecord(model))
|
|
13
|
+
return false;
|
|
14
|
+
return model.name === MANAGED_MODEL_NAME ||
|
|
15
|
+
(currentModelId !== undefined && model.id === currentModelId);
|
|
16
|
+
}
|
|
17
|
+
function isManagedProvider(provider) {
|
|
18
|
+
if (!isRecord(provider))
|
|
19
|
+
return false;
|
|
20
|
+
const hasManagedModel = Array.isArray(provider.models) &&
|
|
21
|
+
provider.models.some(model => isManagedModel(model));
|
|
22
|
+
return hasManagedModel || (provider.vendor === 'customendpoint' && provider.name === 'CodeMie');
|
|
23
|
+
}
|
|
24
|
+
export function isVsCodeSecretReference(value) {
|
|
25
|
+
return typeof value === 'string' && SECRET_REFERENCE_PATTERN.test(value);
|
|
26
|
+
}
|
|
27
|
+
function getVsCodeProductDir(insiders) {
|
|
28
|
+
const productName = insiders ? 'Code - Insiders' : 'Code';
|
|
29
|
+
if (process.platform === 'darwin') {
|
|
30
|
+
return join(homedir(), 'Library', 'Application Support', productName);
|
|
31
|
+
}
|
|
32
|
+
if (process.platform === 'win32') {
|
|
33
|
+
const roamingDir = process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming');
|
|
34
|
+
return join(roamingDir, productName);
|
|
35
|
+
}
|
|
36
|
+
if (process.platform === 'linux') {
|
|
37
|
+
const configDir = process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');
|
|
38
|
+
return join(configDir, productName);
|
|
39
|
+
}
|
|
40
|
+
throw new ConfigurationError(`VS Code BYOK configuration is not supported on platform "${process.platform}".`);
|
|
41
|
+
}
|
|
42
|
+
export function getVsCodeLanguageModelsPath(insiders = false) {
|
|
43
|
+
const productDir = getVsCodeProductDir(insiders);
|
|
44
|
+
if (!existsSync(productDir)) {
|
|
45
|
+
const edition = insiders ? 'VS Code Insiders' : 'VS Code';
|
|
46
|
+
const alternative = insiders
|
|
47
|
+
? 'Remove --insiders to configure stable VS Code.'
|
|
48
|
+
: 'Use --insiders if only VS Code Insiders is installed.';
|
|
49
|
+
throw new ConfigurationError(`${edition} user data directory was not found at ${productDir}.\n${alternative}`);
|
|
50
|
+
}
|
|
51
|
+
return join(productDir, 'User', 'chatLanguageModels.json');
|
|
52
|
+
}
|
|
53
|
+
function buildManagedModel(proxyUrl, profileModel) {
|
|
54
|
+
return {
|
|
55
|
+
id: profileModel,
|
|
56
|
+
name: MANAGED_MODEL_NAME,
|
|
57
|
+
url: new URL('/v1/chat/completions', proxyUrl).toString(),
|
|
58
|
+
toolCalling: true,
|
|
59
|
+
vision: true,
|
|
60
|
+
streaming: true,
|
|
61
|
+
thinking: true,
|
|
62
|
+
supportsReasoningEffort: ['minimal', 'low', 'medium', 'high'],
|
|
63
|
+
reasoningEffortFormat: 'chat-completions',
|
|
64
|
+
maxInputTokens: 224000,
|
|
65
|
+
maxOutputTokens: 32000,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function reconcileModels(existingModels, managedModel) {
|
|
69
|
+
const models = Array.isArray(existingModels) ? existingModels : [];
|
|
70
|
+
const reconciled = [];
|
|
71
|
+
let inserted = false;
|
|
72
|
+
for (const model of models) {
|
|
73
|
+
if (isManagedModel(model, managedModel.id)) {
|
|
74
|
+
if (!inserted) {
|
|
75
|
+
reconciled.push(managedModel);
|
|
76
|
+
inserted = true;
|
|
77
|
+
}
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
reconciled.push(model);
|
|
81
|
+
}
|
|
82
|
+
if (!inserted)
|
|
83
|
+
reconciled.push(managedModel);
|
|
84
|
+
return reconciled;
|
|
85
|
+
}
|
|
86
|
+
function mergeManagedProviders(providers, proxyUrl, profileModel) {
|
|
87
|
+
const existingProvider = Object.assign({}, ...providers);
|
|
88
|
+
const existingModels = providers.flatMap(provider => Array.isArray(provider.models) ? provider.models : []);
|
|
89
|
+
const existingSettings = Object.assign({}, ...providers.map(provider => isRecord(provider.settings) ? provider.settings : {}));
|
|
90
|
+
const previousManagedModelIds = existingModels
|
|
91
|
+
.filter(model => isManagedModel(model))
|
|
92
|
+
.map(model => isRecord(model) ? model.id : undefined)
|
|
93
|
+
.filter((id) => typeof id === 'string');
|
|
94
|
+
for (const modelId of new Set([
|
|
95
|
+
profileModel,
|
|
96
|
+
...previousManagedModelIds,
|
|
97
|
+
])) {
|
|
98
|
+
delete existingSettings[modelId];
|
|
99
|
+
}
|
|
100
|
+
const existingSecretReference = providers
|
|
101
|
+
.map(provider => provider.apiKey)
|
|
102
|
+
.find(isVsCodeSecretReference);
|
|
103
|
+
const provider = {
|
|
104
|
+
...existingProvider,
|
|
105
|
+
name: 'CodeMie',
|
|
106
|
+
vendor: 'customendpoint',
|
|
107
|
+
apiType: 'chat-completions',
|
|
108
|
+
models: reconcileModels(existingModels, buildManagedModel(proxyUrl, profileModel)),
|
|
109
|
+
};
|
|
110
|
+
// VS Code owns model configuration state and derives "medium" as the default for this
|
|
111
|
+
// non-Claude model. Writing the same setting here races with VS Code's editor and can
|
|
112
|
+
// produce duplicate `settings` keys in its unsaved buffer.
|
|
113
|
+
if (Object.keys(existingSettings).length > 0)
|
|
114
|
+
provider.settings = existingSettings;
|
|
115
|
+
else
|
|
116
|
+
delete provider.settings;
|
|
117
|
+
if (existingSecretReference)
|
|
118
|
+
provider.apiKey = existingSecretReference;
|
|
119
|
+
else
|
|
120
|
+
delete provider.apiKey;
|
|
121
|
+
return {
|
|
122
|
+
provider,
|
|
123
|
+
requiresSecretConfiguration: !existingSecretReference,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function readProviders(configPath) {
|
|
127
|
+
if (!existsSync(configPath))
|
|
128
|
+
return [];
|
|
129
|
+
let raw;
|
|
130
|
+
try {
|
|
131
|
+
raw = await readFile(configPath, 'utf-8');
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new ConfigurationError(`Failed to read VS Code language model configuration at ${configPath}: ` +
|
|
135
|
+
`${error instanceof Error ? error.message : String(error)}`);
|
|
136
|
+
}
|
|
137
|
+
if (raw.trim().length === 0)
|
|
138
|
+
return [];
|
|
139
|
+
try {
|
|
140
|
+
const parsed = JSON.parse(raw);
|
|
141
|
+
if (!Array.isArray(parsed)) {
|
|
142
|
+
throw new ConfigurationError(`VS Code language model configuration must contain a JSON array: ${configPath}`);
|
|
143
|
+
}
|
|
144
|
+
return parsed;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (error instanceof ConfigurationError)
|
|
148
|
+
throw error;
|
|
149
|
+
throw new ConfigurationError(`VS Code language model configuration is not valid JSON and was not changed: ${configPath}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async function writeAtomically(configPath, content) {
|
|
153
|
+
const configDir = dirname(configPath);
|
|
154
|
+
await mkdir(configDir, { recursive: true });
|
|
155
|
+
const tempPath = `${configPath}.${process.pid}.tmp`;
|
|
156
|
+
const mode = existsSync(configPath)
|
|
157
|
+
? (await stat(configPath)).mode & 0o777
|
|
158
|
+
: 0o600;
|
|
159
|
+
try {
|
|
160
|
+
await writeFile(tempPath, content, { encoding: 'utf-8', mode });
|
|
161
|
+
await rename(tempPath, configPath);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
try {
|
|
165
|
+
await unlink(tempPath);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// The temporary file may not have been created or may already be renamed.
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
export async function writeVsCodeLanguageModelsConfig(proxyUrl, profileModel, insiders = false) {
|
|
174
|
+
return writeVsCodeLanguageModelsConfigAtPath(getVsCodeLanguageModelsPath(insiders), proxyUrl, profileModel);
|
|
175
|
+
}
|
|
176
|
+
export async function writeVsCodeLanguageModelsConfigAtPath(configPath, proxyUrl, profileModel) {
|
|
177
|
+
const normalizedProfileModel = profileModel.trim();
|
|
178
|
+
if (!normalizedProfileModel) {
|
|
179
|
+
throw new ConfigurationError('VS Code model configuration requires a profile model.');
|
|
180
|
+
}
|
|
181
|
+
const providers = await readProviders(configPath);
|
|
182
|
+
const managedProviderIndexes = providers
|
|
183
|
+
.map((provider, index) => isManagedProvider(provider) ? index : -1)
|
|
184
|
+
.filter(index => index >= 0);
|
|
185
|
+
const managedProviders = managedProviderIndexes
|
|
186
|
+
.map(index => providers[index])
|
|
187
|
+
.filter(isManagedProvider);
|
|
188
|
+
const { provider: managedProvider, requiresSecretConfiguration } = mergeManagedProviders(managedProviders, proxyUrl, normalizedProfileModel);
|
|
189
|
+
const firstManagedProviderIndex = managedProviderIndexes[0] ?? providers.length;
|
|
190
|
+
const managedProviderIndexSet = new Set(managedProviderIndexes);
|
|
191
|
+
const reconciledProviders = providers.flatMap((provider, index) => {
|
|
192
|
+
if (index === firstManagedProviderIndex)
|
|
193
|
+
return [managedProvider];
|
|
194
|
+
if (managedProviderIndexSet.has(index))
|
|
195
|
+
return [];
|
|
196
|
+
return [provider];
|
|
197
|
+
});
|
|
198
|
+
if (managedProviderIndexes.length === 0)
|
|
199
|
+
reconciledProviders.push(managedProvider);
|
|
200
|
+
try {
|
|
201
|
+
await writeAtomically(configPath, `${JSON.stringify(reconciledProviders, null, '\t')}\n`);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
throw new ConfigurationError(`Failed to update VS Code language model configuration at ${configPath}: ` +
|
|
205
|
+
`${error instanceof Error ? error.message : String(error)}`);
|
|
206
|
+
}
|
|
207
|
+
return { configPath, requiresSecretConfiguration };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=vscode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../../../../src/cli/commands/proxy/connectors/vscode.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export interface DaemonState {
|
|
|
7
7
|
telemetryMode?: 'none' | 'claude-desktop';
|
|
8
8
|
targetUrl?: string;
|
|
9
9
|
provider?: string;
|
|
10
|
+
project?: string;
|
|
10
11
|
clientType?: string;
|
|
11
12
|
syncApiUrl?: string;
|
|
12
13
|
syncCodeMieUrl?: string;
|
|
@@ -32,6 +33,7 @@ export interface SpawnOptions {
|
|
|
32
33
|
port?: number;
|
|
33
34
|
gatewayKey?: string;
|
|
34
35
|
project?: string;
|
|
36
|
+
clientType?: string;
|
|
35
37
|
telemetryMode?: 'none' | 'claude-desktop';
|
|
36
38
|
syncApiUrl?: string;
|
|
37
39
|
syncCodeMieUrl?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/daemon-manager.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,wBAAsB,SAAS,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAOnG;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,WAAW,EAClB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,UAAU,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAsB,WAAW,CAC/B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC,CAU1D;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/daemon-manager.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,wBAAsB,SAAS,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAOnG;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,WAAW,EAClB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,UAAU,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAsB,WAAW,CAC/B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC,CAU1D;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAqD1E;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAqChD"}
|
|
@@ -60,6 +60,7 @@ export async function spawnDaemon(opts) {
|
|
|
60
60
|
'--profile', opts.profile,
|
|
61
61
|
'--gateway-key', gatewayKey,
|
|
62
62
|
...(opts.project ? ['--project', opts.project] : []),
|
|
63
|
+
...(opts.clientType ? ['--client-type', opts.clientType] : []),
|
|
63
64
|
'--state-file', stateFile,
|
|
64
65
|
...(opts.port ? ['--port', String(opts.port)] : []),
|
|
65
66
|
...(opts.telemetryMode ? ['--telemetry-mode', opts.telemetryMode] : []),
|
|
@@ -74,6 +75,7 @@ export async function spawnDaemon(opts) {
|
|
|
74
75
|
port: opts.port,
|
|
75
76
|
gatewayKey,
|
|
76
77
|
project: opts.project,
|
|
78
|
+
clientType: opts.clientType,
|
|
77
79
|
telemetryMode: opts.telemetryMode,
|
|
78
80
|
syncApiUrl: opts.syncApiUrl,
|
|
79
81
|
syncCodeMieUrl: opts.syncCodeMieUrl
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/daemon-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/daemon-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,7 +55,7 @@ export async function checkProxyHealth(opts) {
|
|
|
55
55
|
healthy: false,
|
|
56
56
|
level: 'deep',
|
|
57
57
|
code: 'unauthorized',
|
|
58
|
-
reason: 'SSO session expired — run `codemie
|
|
58
|
+
reason: 'SSO session expired — run `codemie profile login` and restart the proxy.',
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
if (!res.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/health-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAwBlD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,IAAiB,EACjB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAwB;IAExB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAE3C,sBAAsB;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,4BAA4B,GAAG,CAAC,MAAM,EAAE;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,2BAA2B,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACrG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,GAAG,IAAI,iCAAiC,EACxC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,EAC1E,eAAe,CAChB,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/health-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/proxy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmMpC,wBAAgB,kBAAkB,IAAI,OAAO,CAgf5C"}
|
|
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { ConfigLoader } from '../../../utils/config.js';
|
|
4
4
|
import { ProviderRegistry } from '../../../providers/index.js';
|
|
5
|
+
import { displaySetupInstructions } from '../../../providers/integration/setup-ui.js';
|
|
5
6
|
import { ConfigurationError, createErrorContext, formatErrorForUser, } from '../../../utils/errors.js';
|
|
6
7
|
import { logger } from '../../../utils/logger.js';
|
|
7
8
|
import { sanitizeLogArgs } from '../../../utils/security.js';
|
|
@@ -10,6 +11,7 @@ import { syncPluginSkills } from '../skills/setup/sync-plugin.js';
|
|
|
10
11
|
import { checkStatus, readState, spawnDaemon, stopDaemon, } from './daemon-manager.js';
|
|
11
12
|
import { writeDesktopConfig, getDesktopBaseDir, mapCanonicalToDesktop } from './connectors/desktop.js';
|
|
12
13
|
import { fetchManagedMcpServers } from './connectors/managed-mcp-remote.js';
|
|
14
|
+
import { writeVsCodeLanguageModelsConfig } from './connectors/vscode.js';
|
|
13
15
|
import { checkProxyHealth } from './health-check.js';
|
|
14
16
|
import { printDesktopInspection } from './inspect-desktop.js';
|
|
15
17
|
const DEFAULT_DAEMON_PORT = 4001;
|
|
@@ -24,7 +26,33 @@ function parsePortOption(value, fallback) {
|
|
|
24
26
|
}
|
|
25
27
|
return parsed;
|
|
26
28
|
}
|
|
27
|
-
|
|
29
|
+
function getEffectiveClientType(state) {
|
|
30
|
+
return state.clientType ?? (state.telemetryMode === 'claude-desktop'
|
|
31
|
+
? 'claude-desktop'
|
|
32
|
+
: 'codemie-daemon');
|
|
33
|
+
}
|
|
34
|
+
function daemonMatchesRequest(state, requested) {
|
|
35
|
+
return state.profile === requested.profile &&
|
|
36
|
+
state.port === requested.port &&
|
|
37
|
+
state.project === requested.project &&
|
|
38
|
+
(!requested.provider || state.provider === requested.provider) &&
|
|
39
|
+
(!requested.targetUrl || state.targetUrl === requested.targetUrl) &&
|
|
40
|
+
getEffectiveClientType(state) === requested.clientType;
|
|
41
|
+
}
|
|
42
|
+
function formatDaemonConflict(state) {
|
|
43
|
+
const details = [
|
|
44
|
+
'A proxy is already running with different settings:',
|
|
45
|
+
` profile: ${state.profile}`,
|
|
46
|
+
` port: ${state.port}`,
|
|
47
|
+
];
|
|
48
|
+
if (state.clientType)
|
|
49
|
+
details.push(` client: ${state.clientType}`);
|
|
50
|
+
if (state.project)
|
|
51
|
+
details.push(` project: ${state.project}`);
|
|
52
|
+
details.push('', 'Stop it first:', ' codemie proxy stop');
|
|
53
|
+
return details.join('\n');
|
|
54
|
+
}
|
|
55
|
+
async function resolveSsoProxyConfig(profileName, clientLabel, connectTarget) {
|
|
28
56
|
const listCodeMieProfiles = async () => {
|
|
29
57
|
const profiles = await ConfigLoader.listProfiles(process.cwd());
|
|
30
58
|
return profiles
|
|
@@ -42,9 +70,9 @@ async function resolveDesktopProxyConfig(profileName) {
|
|
|
42
70
|
const details = available.length > 0
|
|
43
71
|
? `Profiles to try:\n- ${available.join('\n- ')}`
|
|
44
72
|
: 'No SSO-backed CodeMie profiles were found. Run: codemie setup';
|
|
45
|
-
throw new ConfigurationError(`Profile "${profileName}" cannot be used for
|
|
73
|
+
throw new ConfigurationError(`Profile "${profileName}" cannot be used for ${clientLabel} proxy because it is not SSO-backed.\n\n` +
|
|
46
74
|
`Next step:\n` +
|
|
47
|
-
` codemie proxy connect
|
|
75
|
+
` codemie proxy connect ${connectTarget} --profile <name>\n\n` +
|
|
48
76
|
`${details}`);
|
|
49
77
|
}
|
|
50
78
|
return {
|
|
@@ -63,14 +91,14 @@ async function resolveDesktopProxyConfig(profileName) {
|
|
|
63
91
|
const details = available.length > 0
|
|
64
92
|
? `Next step:\n` +
|
|
65
93
|
` codemie profile switch <codemie-profile>\n` +
|
|
66
|
-
` codemie proxy connect
|
|
94
|
+
` codemie proxy connect ${connectTarget}\n\n` +
|
|
67
95
|
`Or run once with a specific profile:\n` +
|
|
68
|
-
` codemie proxy connect
|
|
96
|
+
` codemie proxy connect ${connectTarget} --profile <codemie-profile>\n\n` +
|
|
69
97
|
`Profiles to try:\n- ${available.join('\n- ')}`
|
|
70
98
|
: `No SSO-backed CodeMie profiles were found.\n\n` +
|
|
71
99
|
`Next step:\n` +
|
|
72
100
|
` codemie setup`;
|
|
73
|
-
throw new ConfigurationError(
|
|
101
|
+
throw new ConfigurationError(`${clientLabel} proxy needs an SSO-backed CodeMie profile.\n` +
|
|
74
102
|
`Current active profile: "${activeProfileName ?? 'unknown'}" (provider: ${providerName})\n\n` +
|
|
75
103
|
`${details}`);
|
|
76
104
|
}
|
|
@@ -111,34 +139,50 @@ export function createProxyCommand() {
|
|
|
111
139
|
.option('--port <port>', `Fixed port to listen on (default: ${DEFAULT_DAEMON_PORT})`)
|
|
112
140
|
.option('--profile <name>', 'Profile whose credentials to use')
|
|
113
141
|
.action(async (opts) => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
142
|
+
try {
|
|
143
|
+
const requestedPort = parsePortOption(opts.port, DEFAULT_DAEMON_PORT);
|
|
144
|
+
const config = await ConfigLoader.load(process.cwd(), opts.profile ? { name: opts.profile } : undefined);
|
|
145
|
+
const profile = config.name ?? 'default';
|
|
146
|
+
const requestedDaemon = {
|
|
147
|
+
profile,
|
|
148
|
+
port: requestedPort,
|
|
149
|
+
project: config.codeMieProject,
|
|
150
|
+
clientType: 'codemie-daemon',
|
|
151
|
+
provider: config.provider ?? 'ai-run-sso',
|
|
152
|
+
targetUrl: config.baseUrl,
|
|
153
|
+
};
|
|
154
|
+
const { running, state } = await checkStatus();
|
|
155
|
+
if (running && state) {
|
|
156
|
+
if (daemonMatchesRequest(state, requestedDaemon)) {
|
|
157
|
+
console.log(chalk.green(`✓ Proxy already running at ${state.url} (profile: ${state.profile})`));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
throw new ConfigurationError(formatDaemonConflict(state));
|
|
161
|
+
}
|
|
162
|
+
if (!config.baseUrl) {
|
|
163
|
+
throw new ConfigurationError('No API URL configured for this profile.\nRun: codemie setup');
|
|
164
|
+
}
|
|
165
|
+
await verifySsoCredentials(config.baseUrl, profile);
|
|
166
|
+
const cwd = process.cwd();
|
|
167
|
+
await Promise.allSettled([
|
|
168
|
+
syncRegisteredSkills(profile, cwd),
|
|
169
|
+
syncPluginSkills(),
|
|
170
|
+
]);
|
|
171
|
+
console.log('Starting proxy daemon...');
|
|
172
|
+
const daemonState = await spawnDaemon({
|
|
173
|
+
targetUrl: config.baseUrl,
|
|
174
|
+
provider: config.provider ?? 'ai-run-sso',
|
|
175
|
+
profile,
|
|
176
|
+
port: requestedPort,
|
|
177
|
+
project: config.codeMieProject,
|
|
178
|
+
syncApiUrl: config.ssoConfig?.apiUrl,
|
|
179
|
+
syncCodeMieUrl: config.codeMieUrl,
|
|
180
|
+
});
|
|
181
|
+
console.log(chalk.green(`✓ Proxy running at ${daemonState.url} (profile: ${daemonState.profile})`));
|
|
118
182
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
console.error(chalk.red('✗ No API URL configured for this profile.'));
|
|
122
|
-
console.error(' Run: codemie setup');
|
|
123
|
-
process.exit(1);
|
|
183
|
+
catch (error) {
|
|
184
|
+
printProxyError(error, 'Failed to start proxy');
|
|
124
185
|
}
|
|
125
|
-
await verifySsoCredentials(config.baseUrl, config.name ?? 'default');
|
|
126
|
-
const cwd = process.cwd();
|
|
127
|
-
await Promise.allSettled([
|
|
128
|
-
syncRegisteredSkills(config.name ?? 'default', cwd),
|
|
129
|
-
syncPluginSkills(),
|
|
130
|
-
]);
|
|
131
|
-
console.log('Starting proxy daemon...');
|
|
132
|
-
const daemonState = await spawnDaemon({
|
|
133
|
-
targetUrl: config.baseUrl,
|
|
134
|
-
provider: config.provider ?? 'ai-run-sso',
|
|
135
|
-
profile: config.name ?? 'default',
|
|
136
|
-
port: parsePortOption(opts.port, DEFAULT_DAEMON_PORT),
|
|
137
|
-
project: config.codeMieProject,
|
|
138
|
-
syncApiUrl: config.ssoConfig?.apiUrl,
|
|
139
|
-
syncCodeMieUrl: config.codeMieUrl,
|
|
140
|
-
});
|
|
141
|
-
console.log(chalk.green(`✓ Proxy running at ${daemonState.url} (profile: ${daemonState.profile})`));
|
|
142
186
|
});
|
|
143
187
|
// ── proxy stop ──────────────────────────────────────────────────────────────
|
|
144
188
|
proxy
|
|
@@ -186,6 +230,12 @@ export function createProxyCommand() {
|
|
|
186
230
|
console.log(` URL: ${state.url}`);
|
|
187
231
|
console.log(` Port: ${state.port}`);
|
|
188
232
|
console.log(` Profile: ${state.profile}`);
|
|
233
|
+
if (state.clientType) {
|
|
234
|
+
console.log(` Client: ${state.clientType}`);
|
|
235
|
+
}
|
|
236
|
+
if (state.project) {
|
|
237
|
+
console.log(` Project: ${state.project}`);
|
|
238
|
+
}
|
|
189
239
|
console.log(` Uptime: ${uptime}`);
|
|
190
240
|
// Surface a recorded give-up reason even when a fresh ping happens to pass.
|
|
191
241
|
if (state.health === 'unhealthy' && state.healthReason && health.healthy) {
|
|
@@ -233,7 +283,7 @@ export function createProxyCommand() {
|
|
|
233
283
|
}
|
|
234
284
|
if (!running) {
|
|
235
285
|
console.log('Starting proxy...');
|
|
236
|
-
const { config, profileSource } = await
|
|
286
|
+
const { config, profileSource } = await resolveSsoProxyConfig(opts.profile, 'Claude Desktop', 'desktop');
|
|
237
287
|
if (!config.baseUrl) {
|
|
238
288
|
throw new ConfigurationError('No API URL configured. Run: codemie setup');
|
|
239
289
|
}
|
|
@@ -341,6 +391,136 @@ export function createProxyCommand() {
|
|
|
341
391
|
printProxyError(error, 'Failed to connect Claude Desktop proxy');
|
|
342
392
|
}
|
|
343
393
|
});
|
|
394
|
+
connect
|
|
395
|
+
.command('vscode')
|
|
396
|
+
.description('Configure VS Code BYOK to use the local proxy')
|
|
397
|
+
.option('--profile <name>', 'Profile whose credentials and model to use')
|
|
398
|
+
.option('--insiders', 'Configure VS Code Insiders instead of stable VS Code')
|
|
399
|
+
.option('--verbose', 'Show detailed connection info (URLs, config paths) for debugging')
|
|
400
|
+
.option('--force', 'Stop any existing proxy and start a fresh one, even if it looks healthy')
|
|
401
|
+
.action(async (opts) => {
|
|
402
|
+
const verbose = Boolean(opts.verbose);
|
|
403
|
+
let startedInThisRun = false;
|
|
404
|
+
try {
|
|
405
|
+
const { config, profileSource } = await resolveSsoProxyConfig(opts.profile, 'VS Code', 'vscode');
|
|
406
|
+
if (!config.baseUrl) {
|
|
407
|
+
throw new ConfigurationError('No API URL configured. Run: codemie setup');
|
|
408
|
+
}
|
|
409
|
+
const profile = config.name ?? 'default';
|
|
410
|
+
const profileModel = config.model?.trim();
|
|
411
|
+
if (!profileModel) {
|
|
412
|
+
throw new ConfigurationError(`Profile "${profile}" has no model configured.\nRun: codemie setup`);
|
|
413
|
+
}
|
|
414
|
+
if (verbose) {
|
|
415
|
+
console.log(chalk.cyan(`Using profile: ${profile} ` +
|
|
416
|
+
`(source: ${profileSource === 'explicit' ? '--profile' : 'active profile'})`));
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
console.log(chalk.cyan(`Using profile: ${profile}`));
|
|
420
|
+
}
|
|
421
|
+
await verifySsoCredentials(config.baseUrl, profile);
|
|
422
|
+
const cwd = process.cwd();
|
|
423
|
+
await Promise.allSettled([
|
|
424
|
+
syncRegisteredSkills(profile, cwd),
|
|
425
|
+
syncPluginSkills(),
|
|
426
|
+
]);
|
|
427
|
+
let { running, state } = await checkStatus();
|
|
428
|
+
const matchesRequestedDaemon = running && state
|
|
429
|
+
? state.profile === profile &&
|
|
430
|
+
state.project === config.codeMieProject &&
|
|
431
|
+
state.provider === (config.provider ?? 'ai-run-sso') &&
|
|
432
|
+
state.targetUrl === config.baseUrl &&
|
|
433
|
+
getEffectiveClientType(state) === 'vscode-byok'
|
|
434
|
+
: false;
|
|
435
|
+
let unhealthy = false;
|
|
436
|
+
if (running && state && matchesRequestedDaemon && !opts.force) {
|
|
437
|
+
const health = await checkProxyHealth({
|
|
438
|
+
port: state.port,
|
|
439
|
+
gatewayKey: state.gatewayKey,
|
|
440
|
+
deep: true,
|
|
441
|
+
});
|
|
442
|
+
unhealthy = !health.healthy;
|
|
443
|
+
if (unhealthy) {
|
|
444
|
+
console.log(chalk.yellow(`Existing proxy is unhealthy (${health.reason ?? 'unknown'}). Restarting...`));
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (running && (!matchesRequestedDaemon || unhealthy || opts.force)) {
|
|
448
|
+
if (opts.force) {
|
|
449
|
+
console.log('Forcing a fresh proxy restart...');
|
|
450
|
+
}
|
|
451
|
+
else if (!matchesRequestedDaemon) {
|
|
452
|
+
console.log('Restarting proxy in VS Code mode...');
|
|
453
|
+
}
|
|
454
|
+
await stopDaemon();
|
|
455
|
+
running = false;
|
|
456
|
+
state = null;
|
|
457
|
+
}
|
|
458
|
+
if (!running) {
|
|
459
|
+
console.log('Starting proxy...');
|
|
460
|
+
state = await spawnDaemon({
|
|
461
|
+
targetUrl: config.baseUrl,
|
|
462
|
+
provider: config.provider ?? 'ai-run-sso',
|
|
463
|
+
profile,
|
|
464
|
+
port: DEFAULT_DAEMON_PORT,
|
|
465
|
+
project: config.codeMieProject,
|
|
466
|
+
clientType: 'vscode-byok',
|
|
467
|
+
syncApiUrl: config.ssoConfig?.apiUrl,
|
|
468
|
+
syncCodeMieUrl: config.codeMieUrl,
|
|
469
|
+
});
|
|
470
|
+
startedInThisRun = true;
|
|
471
|
+
console.log(verbose
|
|
472
|
+
? chalk.green(`✓ Proxy started at ${state.url}`)
|
|
473
|
+
: chalk.green('✓ Proxy started'));
|
|
474
|
+
}
|
|
475
|
+
const result = await writeVsCodeLanguageModelsConfig(state.url, profileModel, Boolean(opts.insiders));
|
|
476
|
+
logger.info('[proxy] VS Code BYOK configuration written', ...sanitizeLogArgs({
|
|
477
|
+
configPath: result.configPath,
|
|
478
|
+
gatewayUrl: state.url,
|
|
479
|
+
profile: state.profile,
|
|
480
|
+
project: state.project,
|
|
481
|
+
model: profileModel,
|
|
482
|
+
clientType: state.clientType,
|
|
483
|
+
requiresSecretConfiguration: result.requiresSecretConfiguration,
|
|
484
|
+
}));
|
|
485
|
+
console.log(chalk.green(`✓ ${opts.insiders ? 'VS Code Insiders' : 'VS Code'} configured`));
|
|
486
|
+
if (verbose) {
|
|
487
|
+
console.log(` Config: ${result.configPath}`);
|
|
488
|
+
console.log(` Gateway: ${state.url}`);
|
|
489
|
+
console.log(` Model: ${profileModel}`);
|
|
490
|
+
console.log(` Project: ${config.codeMieProject || '(not configured)'}`);
|
|
491
|
+
}
|
|
492
|
+
if (result.requiresSecretConfiguration) {
|
|
493
|
+
displaySetupInstructions({
|
|
494
|
+
setupInstructions: [
|
|
495
|
+
'One-time VS Code secret setup required:\n',
|
|
496
|
+
'1. Press ⇧⌘P (macOS) or Ctrl+Shift+P (Windows/Linux).',
|
|
497
|
+
'2. Run: Chat: Manage Language Models',
|
|
498
|
+
'3. Right-click CodeMie Profile Model → Update API Key',
|
|
499
|
+
`4. Enter API key: ${state.gatewayKey}\n`,
|
|
500
|
+
'Reload VS Code to apply changes.',
|
|
501
|
+
].join('\n'),
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
console.log(chalk.dim(` If VS Code reports a missing or invalid key, open Chat: Manage Language Models, ` +
|
|
506
|
+
`then right-click CodeMie Profile Model → Update API Key and enter ${state.gatewayKey}.`));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
if (startedInThisRun) {
|
|
511
|
+
try {
|
|
512
|
+
await stopDaemon();
|
|
513
|
+
logger.info('[proxy] VS Code proxy startup rolled back after configuration failure');
|
|
514
|
+
}
|
|
515
|
+
catch (stopError) {
|
|
516
|
+
logger.warn('[proxy] Failed to stop VS Code proxy after configuration failure', ...sanitizeLogArgs({
|
|
517
|
+
error: stopError instanceof Error ? stopError.message : String(stopError),
|
|
518
|
+
}));
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
printProxyError(error, 'Failed to connect VS Code proxy');
|
|
522
|
+
}
|
|
523
|
+
});
|
|
344
524
|
const inspect = new Command('inspect');
|
|
345
525
|
inspect.description('Inspect proxy integrations and telemetry state');
|
|
346
526
|
inspect
|