@kaitranntt/ccs 8.10.0-dev.20 → 8.10.0-dev.21
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/dist/cliproxy/executor/launch-settings.d.ts +6 -15
- package/dist/cliproxy/executor/launch-settings.d.ts.map +1 -1
- package/dist/cliproxy/executor/launch-settings.js +19 -119
- package/dist/cliproxy/executor/launch-settings.js.map +1 -1
- package/dist/utils/launch-settings.d.ts +51 -0
- package/dist/utils/launch-settings.d.ts.map +1 -0
- package/dist/utils/launch-settings.js +190 -0
- package/dist/utils/launch-settings.js.map +1 -0
- package/dist/utils/openai-compat-launch-settings.d.ts +6 -4
- package/dist/utils/openai-compat-launch-settings.d.ts.map +1 -1
- package/dist/utils/openai-compat-launch-settings.js +14 -107
- package/dist/utils/openai-compat-launch-settings.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,21 +12,18 @@
|
|
|
12
12
|
* inherited process environment, so the persisted `ANTHROPIC_BASE_URL` (which
|
|
13
13
|
* points straight at CLIProxy) overrides the proxy-chain URL CCS injected via
|
|
14
14
|
* env. Claude then bypasses the proxy chain entirely — breaking tool-name
|
|
15
|
-
* sanitization and Codex system-message folding
|
|
16
|
-
* `400 {"detail":"System messages are not allowed"}`).
|
|
15
|
+
* sanitization and Codex system-message folding.
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* overlaid with the resolved launch environment, and pass that copy to
|
|
21
|
-
* `--settings`.
|
|
17
|
+
* This module delegates to the canonical `src/utils/launch-settings.ts` helper
|
|
18
|
+
* which unifies overlay and strip-based launch settings.
|
|
22
19
|
*/
|
|
23
20
|
/// <reference types="node" />
|
|
24
21
|
/// <reference types="bun-types" />
|
|
22
|
+
import { LAUNCH_ROUTING_ENV_KEYS } from '../../utils/launch-settings';
|
|
23
|
+
export { LAUNCH_ROUTING_ENV_KEYS as ROUTING_ENV_KEYS };
|
|
25
24
|
/**
|
|
26
25
|
* Build a settings object based on the persisted settings file, with routing
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* @returns The merged settings and whether any routing key actually changed.
|
|
26
|
+
* env vars overlaid from the resolved launch environment.
|
|
30
27
|
*/
|
|
31
28
|
export declare function buildLaunchSettingsOverlay(settingsPath: string, env: NodeJS.ProcessEnv): {
|
|
32
29
|
settings: Record<string, unknown>;
|
|
@@ -34,12 +31,6 @@ export declare function buildLaunchSettingsOverlay(settingsPath: string, env: No
|
|
|
34
31
|
};
|
|
35
32
|
/**
|
|
36
33
|
* Prepare the settings file path to hand to `claude --settings`.
|
|
37
|
-
*
|
|
38
|
-
* When the resolved launch environment changes any routing key relative to the
|
|
39
|
-
* persisted settings file (i.e. a proxy chain is active), a runtime overlay
|
|
40
|
-
* file is written and its path returned together with a cleanup callback that
|
|
41
|
-
* removes it. Otherwise the original `settingsPath` is returned unchanged and
|
|
42
|
-
* cleanup is a no-op.
|
|
43
34
|
*/
|
|
44
35
|
export declare function prepareLaunchSettings(settingsPath: string, env: NodeJS.ProcessEnv): {
|
|
45
36
|
settingsPath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-settings.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/executor/launch-settings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launch-settings.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/executor/launch-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAEH,OAAO,EAGL,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAgBzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAU/C"}
|
|
@@ -13,149 +13,49 @@
|
|
|
13
13
|
* inherited process environment, so the persisted `ANTHROPIC_BASE_URL` (which
|
|
14
14
|
* points straight at CLIProxy) overrides the proxy-chain URL CCS injected via
|
|
15
15
|
* env. Claude then bypasses the proxy chain entirely — breaking tool-name
|
|
16
|
-
* sanitization and Codex system-message folding
|
|
17
|
-
* `400 {"detail":"System messages are not allowed"}`).
|
|
16
|
+
* sanitization and Codex system-message folding.
|
|
18
17
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* overlaid with the resolved launch environment, and pass that copy to
|
|
22
|
-
* `--settings`.
|
|
18
|
+
* This module delegates to the canonical `src/utils/launch-settings.ts` helper
|
|
19
|
+
* which unifies overlay and strip-based launch settings.
|
|
23
20
|
*/
|
|
24
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
-
if (k2 === undefined) k2 = k;
|
|
26
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
-
}
|
|
30
|
-
Object.defineProperty(o, k2, desc);
|
|
31
|
-
}) : (function(o, m, k, k2) {
|
|
32
|
-
if (k2 === undefined) k2 = k;
|
|
33
|
-
o[k2] = m[k];
|
|
34
|
-
}));
|
|
35
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
-
}) : function(o, v) {
|
|
38
|
-
o["default"] = v;
|
|
39
|
-
});
|
|
40
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
41
|
-
if (mod && mod.__esModule) return mod;
|
|
42
|
-
var result = {};
|
|
43
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
44
|
-
__setModuleDefault(result, mod);
|
|
45
|
-
return result;
|
|
46
|
-
};
|
|
47
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.prepareLaunchSettings = exports.buildLaunchSettingsOverlay = void 0;
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
const path = __importStar(require("path"));
|
|
52
|
-
const shell_executor_1 = require("../../utils/shell-executor");
|
|
53
|
-
const extended_context_utils_1 = require("../../shared/extended-context-utils");
|
|
54
|
-
// SIBLING HELPER: src/utils/openai-compat-launch-settings.ts solves the same
|
|
55
|
-
// "persisted --settings env clobbers runtime routing env" problem by STRIPPING
|
|
56
|
-
// routing keys (process env wins by absence). This module instead OVERLAYS the
|
|
57
|
-
// resolved values (settings wins by overwrite). The two differ intentionally:
|
|
58
|
-
// strip vs overlay diverge when a key is present on disk but absent from the
|
|
59
|
-
// process env. Unifying them needs an explicit force-absent API — see issue #1609.
|
|
60
|
-
/**
|
|
61
|
-
* Environment keys that control provider routing/model selection and are read
|
|
62
|
-
* by Claude from the settings `env` block. These must reflect the resolved
|
|
63
|
-
* proxy-chain environment, not the persisted on-disk values. Reuses the
|
|
64
|
-
* canonical routing/model key lists from shell-executor, plus the extra model
|
|
65
|
-
* keys the [1m] preference manages (subagent + startup default): a saved bare
|
|
66
|
-
* value there would otherwise clobber the resolved --1m/--no-1m result.
|
|
67
|
-
*/
|
|
68
|
-
const ROUTING_ENV_KEYS = [
|
|
69
|
-
...shell_executor_1.ANTHROPIC_ROUTING_ENV_KEYS,
|
|
70
|
-
...shell_executor_1.ANTHROPIC_MODEL_ENV_KEYS,
|
|
71
|
-
...extended_context_utils_1.EXTRA_EXTENDED_CONTEXT_MODEL_ENV_KEYS,
|
|
72
|
-
];
|
|
73
|
-
function isRecord(value) {
|
|
74
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
75
|
-
}
|
|
22
|
+
exports.prepareLaunchSettings = exports.buildLaunchSettingsOverlay = exports.ROUTING_ENV_KEYS = void 0;
|
|
23
|
+
const launch_settings_1 = require("../../utils/launch-settings");
|
|
24
|
+
Object.defineProperty(exports, "ROUTING_ENV_KEYS", { enumerable: true, get: function () { return launch_settings_1.LAUNCH_ROUTING_ENV_KEYS; } });
|
|
76
25
|
/**
|
|
77
26
|
* Build a settings object based on the persisted settings file, with routing
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* @returns The merged settings and whether any routing key actually changed.
|
|
27
|
+
* env vars overlaid from the resolved launch environment.
|
|
81
28
|
*/
|
|
82
29
|
function buildLaunchSettingsOverlay(settingsPath, env) {
|
|
83
30
|
let base = {};
|
|
84
31
|
try {
|
|
32
|
+
const fs = require('fs');
|
|
85
33
|
if (fs.existsSync(settingsPath)) {
|
|
86
34
|
const parsed = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
87
|
-
if (
|
|
35
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
88
36
|
base = parsed;
|
|
89
37
|
}
|
|
90
38
|
}
|
|
91
39
|
}
|
|
92
40
|
catch {
|
|
93
|
-
// Corrupt/unreadable settings file: fall back to an env-only overlay.
|
|
94
41
|
base = {};
|
|
95
42
|
}
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
for (const key of ROUTING_ENV_KEYS) {
|
|
99
|
-
const resolved = env[key];
|
|
100
|
-
if (typeof resolved === 'string' && mergedEnv[key] !== resolved) {
|
|
101
|
-
mergedEnv[key] = resolved;
|
|
102
|
-
changed = true;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return { settings: { ...base, env: mergedEnv }, changed };
|
|
43
|
+
const { settings, changed } = (0, launch_settings_1.buildUnifiedLaunchSettings)(base, { overlayEnv: env });
|
|
44
|
+
return { settings: settings, changed };
|
|
106
45
|
}
|
|
107
46
|
exports.buildLaunchSettingsOverlay = buildLaunchSettingsOverlay;
|
|
108
47
|
/**
|
|
109
48
|
* Prepare the settings file path to hand to `claude --settings`.
|
|
110
|
-
*
|
|
111
|
-
* When the resolved launch environment changes any routing key relative to the
|
|
112
|
-
* persisted settings file (i.e. a proxy chain is active), a runtime overlay
|
|
113
|
-
* file is written and its path returned together with a cleanup callback that
|
|
114
|
-
* removes it. Otherwise the original `settingsPath` is returned unchanged and
|
|
115
|
-
* cleanup is a no-op.
|
|
116
49
|
*/
|
|
117
50
|
function prepareLaunchSettings(settingsPath, env) {
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
if (!overlay.changed) {
|
|
127
|
-
return noop;
|
|
128
|
-
}
|
|
129
|
-
try {
|
|
130
|
-
// Write to a private temp dir (matches createOpenAICompatLaunchSettings) so
|
|
131
|
-
// the overlay never lands in the user's ~/.ccs and is trivially isolated.
|
|
132
|
-
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-launch-settings-'));
|
|
133
|
-
fs.chmodSync(tempDir, 0o700);
|
|
134
|
-
const runtimePath = path.join(tempDir, path.basename(settingsPath) || 'settings.json');
|
|
135
|
-
fs.writeFileSync(runtimePath, JSON.stringify(overlay.settings, null, 2) + '\n', {
|
|
136
|
-
encoding: 'utf8',
|
|
137
|
-
mode: 0o600,
|
|
138
|
-
});
|
|
139
|
-
let cleanedUp = false;
|
|
140
|
-
const cleanup = () => {
|
|
141
|
-
if (cleanedUp) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
cleanedUp = true;
|
|
145
|
-
try {
|
|
146
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
// best-effort cleanup
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
return { settingsPath: runtimePath, cleanup };
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
// If we cannot write the overlay, fall back to the persisted file. Routing
|
|
156
|
-
// may bypass the proxy chain, but the session still launches.
|
|
157
|
-
return noop;
|
|
158
|
-
}
|
|
51
|
+
const result = (0, launch_settings_1.createUnifiedLaunchSettings)(settingsPath, undefined, {
|
|
52
|
+
overlayEnv: env,
|
|
53
|
+
forceWrite: false,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
settingsPath: result.settingsPath,
|
|
57
|
+
cleanup: result.cleanup,
|
|
58
|
+
};
|
|
159
59
|
}
|
|
160
60
|
exports.prepareLaunchSettings = prepareLaunchSettings;
|
|
161
61
|
//# sourceMappingURL=launch-settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-settings.js","sourceRoot":"","sources":["../../../src/cliproxy/executor/launch-settings.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"launch-settings.js","sourceRoot":"","sources":["../../../src/cliproxy/executor/launch-settings.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAEH,iEAIqC;AAED,iGAHlC,yCAAuB,OAG2B;AAEpD;;;GAGG;AACH,SAAgB,0BAA0B,CACxC,YAAoB,EACpB,GAAsB;IAEtB,IAAI,IAAI,GAA4B,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5E,IAAI,GAAG,MAAiC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAA,4CAA0B,EAAC,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,OAAO,EAAE,QAAQ,EAAE,QAAmC,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC;AAnBD,gEAmBC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,YAAoB,EACpB,GAAsB;IAEtB,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,YAAY,EAAE,SAAS,EAAE;QAClE,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAbD,sDAaC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="bun-types" />
|
|
3
|
+
import type { Settings } from '../types/config';
|
|
4
|
+
/**
|
|
5
|
+
* Environment keys that control provider routing/model selection and are read
|
|
6
|
+
* by Claude CLI. Overlaid by default when an active proxy chain is resolved.
|
|
7
|
+
*/
|
|
8
|
+
export declare const LAUNCH_ROUTING_ENV_KEYS: readonly string[];
|
|
9
|
+
export interface UnifiedLaunchSettingsOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Key-value map of environment variables to overlay into the settings file's `env` block.
|
|
12
|
+
*/
|
|
13
|
+
overlayEnv?: NodeJS.ProcessEnv | Record<string, string | undefined>;
|
|
14
|
+
/**
|
|
15
|
+
* Keys to explicitly strip/delete from the settings file's `env` block.
|
|
16
|
+
* Runs AFTER overlayEnv, guaranteeing these keys are completely absent from the output.
|
|
17
|
+
*/
|
|
18
|
+
stripKeys?: readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* If true, also strip all default Anthropic routing keys via stripAnthropicRoutingEnv.
|
|
21
|
+
*/
|
|
22
|
+
stripAnthropicRouting?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* When true, snapshot the isolated settings to a durable, profile-scoped
|
|
25
|
+
* cache directory (~/.ccs/cache/isolated-settings/<hash>/) using atomic temp-and-rename.
|
|
26
|
+
* Required for background fleet daemon respawns (Issue #1734).
|
|
27
|
+
*/
|
|
28
|
+
durable?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* If false and no routing/strip changes occurred, ephemeral mode returns the original
|
|
31
|
+
* settingsPath without writing a temporary file. Defaults to false.
|
|
32
|
+
*/
|
|
33
|
+
forceWrite?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface UnifiedLaunchSettingsResult {
|
|
36
|
+
settingsPath: string;
|
|
37
|
+
cleanup: () => void;
|
|
38
|
+
changed: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Builds the modified settings JSON object by applying overlayEnv and stripKeys.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildUnifiedLaunchSettings(initialSettings: Settings | Record<string, unknown>, options?: UnifiedLaunchSettingsOptions): {
|
|
44
|
+
settings: Settings;
|
|
45
|
+
changed: boolean;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Prepares launch settings with unified overlay, strip, and durable/ephemeral isolation.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createUnifiedLaunchSettings(sourceSettingsPath: string, initialSettings?: Settings | Record<string, unknown>, options?: UnifiedLaunchSettingsOptions): UnifiedLaunchSettingsResult;
|
|
51
|
+
//# sourceMappingURL=launch-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-settings.d.ts","sourceRoot":"","sources":["../../src/utils/launch-settings.ts"],"names":[],"mappings":";;AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAShD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAIpD,CAAC;AAEF,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACpE;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,OAAO,CAAC,EAAE,4BAA4B,GACrC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAiD1C;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,kBAAkB,EAAE,MAAM,EAC1B,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,OAAO,CAAC,EAAE,4BAA4B,GACrC,2BAA2B,CAoG7B"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.createUnifiedLaunchSettings = exports.buildUnifiedLaunchSettings = exports.LAUNCH_ROUTING_ENV_KEYS = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const os = __importStar(require("os"));
|
|
29
|
+
const path = __importStar(require("path"));
|
|
30
|
+
const crypto_1 = require("crypto");
|
|
31
|
+
const config_manager_1 = require("./config-manager");
|
|
32
|
+
const shell_executor_1 = require("./shell-executor");
|
|
33
|
+
const extended_context_utils_1 = require("../shared/extended-context-utils");
|
|
34
|
+
/**
|
|
35
|
+
* Environment keys that control provider routing/model selection and are read
|
|
36
|
+
* by Claude CLI. Overlaid by default when an active proxy chain is resolved.
|
|
37
|
+
*/
|
|
38
|
+
exports.LAUNCH_ROUTING_ENV_KEYS = [
|
|
39
|
+
...shell_executor_1.ANTHROPIC_ROUTING_ENV_KEYS,
|
|
40
|
+
...shell_executor_1.ANTHROPIC_MODEL_ENV_KEYS,
|
|
41
|
+
...extended_context_utils_1.EXTRA_EXTENDED_CONTEXT_MODEL_ENV_KEYS,
|
|
42
|
+
];
|
|
43
|
+
function isRecord(value) {
|
|
44
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds the modified settings JSON object by applying overlayEnv and stripKeys.
|
|
48
|
+
*/
|
|
49
|
+
function buildUnifiedLaunchSettings(initialSettings, options) {
|
|
50
|
+
const base = JSON.parse(JSON.stringify(initialSettings));
|
|
51
|
+
let mergedEnv = isRecord(base.env) ? { ...base.env } : {};
|
|
52
|
+
let changed = false;
|
|
53
|
+
// 1. Apply overlayEnv if provided
|
|
54
|
+
if (options?.overlayEnv) {
|
|
55
|
+
const keysToCheck = exports.LAUNCH_ROUTING_ENV_KEYS;
|
|
56
|
+
for (const key of keysToCheck) {
|
|
57
|
+
const resolved = options.overlayEnv[key];
|
|
58
|
+
if (typeof resolved === 'string' && mergedEnv[key] !== resolved) {
|
|
59
|
+
mergedEnv[key] = resolved;
|
|
60
|
+
changed = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 2. Strip Anthropic routing keys if requested
|
|
65
|
+
if (options?.stripAnthropicRouting) {
|
|
66
|
+
const beforeCount = Object.keys(mergedEnv).length;
|
|
67
|
+
mergedEnv = Object.fromEntries(Object.entries((0, shell_executor_1.stripAnthropicRoutingEnv)(mergedEnv)).filter((entry) => typeof entry[1] === 'string'));
|
|
68
|
+
if (Object.keys(mergedEnv).length !== beforeCount) {
|
|
69
|
+
changed = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 3. Apply explicit stripKeys (forced-absent keys, e.g. ANTHROPIC_API_KEY)
|
|
73
|
+
if (options?.stripKeys && options.stripKeys.length > 0) {
|
|
74
|
+
for (const key of options.stripKeys) {
|
|
75
|
+
if (key in mergedEnv) {
|
|
76
|
+
delete mergedEnv[key];
|
|
77
|
+
changed = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Clean up empty env
|
|
82
|
+
if (Object.keys(mergedEnv).length > 0) {
|
|
83
|
+
base.env = mergedEnv;
|
|
84
|
+
}
|
|
85
|
+
else if ('env' in base) {
|
|
86
|
+
delete base.env;
|
|
87
|
+
changed = true;
|
|
88
|
+
}
|
|
89
|
+
return { settings: base, changed };
|
|
90
|
+
}
|
|
91
|
+
exports.buildUnifiedLaunchSettings = buildUnifiedLaunchSettings;
|
|
92
|
+
/**
|
|
93
|
+
* Prepares launch settings with unified overlay, strip, and durable/ephemeral isolation.
|
|
94
|
+
*/
|
|
95
|
+
function createUnifiedLaunchSettings(sourceSettingsPath, initialSettings, options) {
|
|
96
|
+
const noopResult = (changed) => ({
|
|
97
|
+
settingsPath: sourceSettingsPath,
|
|
98
|
+
cleanup: () => { },
|
|
99
|
+
changed,
|
|
100
|
+
});
|
|
101
|
+
let baseSettings = initialSettings ?? {};
|
|
102
|
+
if (!initialSettings && fs.existsSync(sourceSettingsPath)) {
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse(fs.readFileSync(sourceSettingsPath, 'utf8'));
|
|
105
|
+
if (isRecord(parsed)) {
|
|
106
|
+
baseSettings = parsed;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
baseSettings = {};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const { settings, changed } = buildUnifiedLaunchSettings(baseSettings, options);
|
|
114
|
+
// If no change and forceWrite is false and not durable, return original path
|
|
115
|
+
if (!changed && !options?.forceWrite && !options?.durable) {
|
|
116
|
+
return noopResult(false);
|
|
117
|
+
}
|
|
118
|
+
const contentStr = JSON.stringify(settings, null, 2) + '\n';
|
|
119
|
+
const fileName = path.basename(sourceSettingsPath) || 'settings.json';
|
|
120
|
+
// 1. Durable mode: stored in ~/.ccs/cache/isolated-settings/<hash>/
|
|
121
|
+
if (options?.durable) {
|
|
122
|
+
const pathHash = (0, crypto_1.createHash)('sha256')
|
|
123
|
+
.update(path.resolve(sourceSettingsPath))
|
|
124
|
+
.digest('hex')
|
|
125
|
+
.slice(0, 16);
|
|
126
|
+
const durableDir = path.join((0, config_manager_1.getCcsDir)(), 'cache', 'isolated-settings', pathHash);
|
|
127
|
+
fs.mkdirSync(durableDir, { recursive: true, mode: 0o700 });
|
|
128
|
+
fs.chmodSync(durableDir, 0o700);
|
|
129
|
+
const targetPath = path.join(durableDir, fileName);
|
|
130
|
+
const tempFile = path.join(durableDir, `.${fileName}.${(0, crypto_1.randomUUID)()}.tmp`);
|
|
131
|
+
let renamed = false;
|
|
132
|
+
try {
|
|
133
|
+
fs.writeFileSync(tempFile, contentStr, {
|
|
134
|
+
encoding: 'utf8',
|
|
135
|
+
mode: 0o600,
|
|
136
|
+
flag: 'wx',
|
|
137
|
+
});
|
|
138
|
+
fs.renameSync(tempFile, targetPath);
|
|
139
|
+
renamed = true;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
if (!renamed) {
|
|
143
|
+
try {
|
|
144
|
+
fs.unlinkSync(tempFile);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// ignore
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
settingsPath: targetPath,
|
|
153
|
+
cleanup: () => { },
|
|
154
|
+
changed,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// 2. Ephemeral mode: os.tmpdir() with 0o700 / 0o600
|
|
158
|
+
try {
|
|
159
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-launch-settings-'));
|
|
160
|
+
fs.chmodSync(tempDir, 0o700);
|
|
161
|
+
const runtimePath = path.join(tempDir, fileName);
|
|
162
|
+
fs.writeFileSync(runtimePath, contentStr, {
|
|
163
|
+
encoding: 'utf8',
|
|
164
|
+
mode: 0o600,
|
|
165
|
+
});
|
|
166
|
+
let cleanedUp = false;
|
|
167
|
+
const cleanup = () => {
|
|
168
|
+
if (cleanedUp) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
cleanedUp = true;
|
|
172
|
+
try {
|
|
173
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// ignore
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
return {
|
|
180
|
+
settingsPath: runtimePath,
|
|
181
|
+
cleanup,
|
|
182
|
+
changed,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return noopResult(changed);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.createUnifiedLaunchSettings = createUnifiedLaunchSettings;
|
|
190
|
+
//# sourceMappingURL=launch-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-settings.js","sourceRoot":"","sources":["../../src/utils/launch-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,14 @@ export interface OpenAICompatLaunchSettings {
|
|
|
6
6
|
export interface OpenAICompatLaunchSettingsOptions {
|
|
7
7
|
/**
|
|
8
8
|
* When true, snapshot the isolated settings to a durable, profile-scoped
|
|
9
|
-
*
|
|
10
|
-
* This ensures background fleet daemons respawning sessions can continue to read
|
|
11
|
-
* the settings file after the parent CCS launch process exits (Issue #1734).
|
|
12
|
-
* Default: false (ephemeral tempdir with automatic deletion on cleanup).
|
|
9
|
+
* cache directory (~/.ccs/cache/isolated-settings/<hash>/) using atomic temp-and-rename.
|
|
13
10
|
*/
|
|
14
11
|
durable?: boolean;
|
|
15
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates isolated launch settings for OpenAI-compatible profiles.
|
|
15
|
+
* Strips Anthropic routing variables and guarantees ANTHROPIC_API_KEY is absent
|
|
16
|
+
* so spawned processes route exclusively through proxyEnv without auth bypass.
|
|
17
|
+
*/
|
|
16
18
|
export declare function createOpenAICompatLaunchSettings(settingsPath: string, settings: Settings, options?: OpenAICompatLaunchSettingsOptions): OpenAICompatLaunchSettings;
|
|
17
19
|
//# sourceMappingURL=openai-compat-launch-settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compat-launch-settings.d.ts","sourceRoot":"","sources":["../../src/utils/openai-compat-launch-settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-compat-launch-settings.d.ts","sourceRoot":"","sources":["../../src/utils/openai-compat-launch-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAOhD,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iCAAiC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,iCAAiC,GAC1C,0BAA0B,CAkB5B"}
|
|
@@ -1,116 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
3
|
exports.createOpenAICompatLaunchSettings = void 0;
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// SIBLING HELPER: src/cliproxy/executor/launch-settings.ts (prepareLaunchSettings)
|
|
34
|
-
// solves the same problem by OVERLAYING resolved routing values instead of
|
|
35
|
-
// stripping them. This strip-based variant is required where callers deliberately
|
|
36
|
-
// delete a routing key (e.g. ANTHROPIC_API_KEY in settings-flow) and need it
|
|
37
|
-
// ABSENT from the launch settings. Do not unify without an explicit force-absent
|
|
38
|
-
// key list — see issue #1609.
|
|
4
|
+
const launch_settings_1 = require("./launch-settings");
|
|
5
|
+
/**
|
|
6
|
+
* Creates isolated launch settings for OpenAI-compatible profiles.
|
|
7
|
+
* Strips Anthropic routing variables and guarantees ANTHROPIC_API_KEY is absent
|
|
8
|
+
* so spawned processes route exclusively through proxyEnv without auth bypass.
|
|
9
|
+
*/
|
|
39
10
|
function createOpenAICompatLaunchSettings(settingsPath, settings, options) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
else {
|
|
46
|
-
delete launchSettings.env;
|
|
47
|
-
}
|
|
48
|
-
const contentStr = JSON.stringify(launchSettings, null, 2) + '\n';
|
|
49
|
-
if (options?.durable) {
|
|
50
|
-
// Durable mode: key one private directory per canonical settings path so each
|
|
51
|
-
// profile has exactly one snapshot, atomically replaced on content updates.
|
|
52
|
-
// Do not fall back to $TMPDIR: failure here must fail the launch early rather than
|
|
53
|
-
// causing a deferred background fleet respawn crash (Issue #1734).
|
|
54
|
-
const pathHash = (0, crypto_1.createHash)('sha256')
|
|
55
|
-
.update(path.resolve(settingsPath))
|
|
56
|
-
.digest('hex')
|
|
57
|
-
.slice(0, 16);
|
|
58
|
-
const durableDir = path.join((0, config_manager_1.getCcsDir)(), 'cache', 'isolated-settings', pathHash);
|
|
59
|
-
fs.mkdirSync(durableDir, { recursive: true, mode: 0o700 });
|
|
60
|
-
fs.chmodSync(durableDir, 0o700);
|
|
61
|
-
const launchSettingsPath = path.join(durableDir, path.basename(settingsPath));
|
|
62
|
-
const tempFile = path.join(durableDir, `.${path.basename(settingsPath)}.${(0, crypto_1.randomUUID)()}.tmp`);
|
|
63
|
-
let renamed = false;
|
|
64
|
-
try {
|
|
65
|
-
fs.writeFileSync(tempFile, contentStr, {
|
|
66
|
-
encoding: 'utf8',
|
|
67
|
-
mode: 0o600,
|
|
68
|
-
flag: 'wx',
|
|
69
|
-
});
|
|
70
|
-
fs.renameSync(tempFile, launchSettingsPath);
|
|
71
|
-
renamed = true;
|
|
72
|
-
}
|
|
73
|
-
finally {
|
|
74
|
-
if (!renamed) {
|
|
75
|
-
try {
|
|
76
|
-
fs.unlinkSync(tempFile);
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// best-effort cleanup on failure
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
settingsPath: launchSettingsPath,
|
|
85
|
-
cleanup: () => {
|
|
86
|
-
// No-op in durable mode: snapshot persists for background fleet daemon respawns.
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
// Ephemeral mode (default / headless): create isolated tempdir in os.tmpdir() and purge on cleanup.
|
|
91
|
-
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-openai-compat-settings-'));
|
|
92
|
-
fs.chmodSync(tempDir, 0o700);
|
|
93
|
-
const launchSettingsPath = path.join(tempDir, path.basename(settingsPath));
|
|
94
|
-
fs.writeFileSync(launchSettingsPath, contentStr, {
|
|
95
|
-
encoding: 'utf8',
|
|
96
|
-
mode: 0o600,
|
|
97
|
-
});
|
|
98
|
-
let cleanedUp = false;
|
|
99
|
-
const cleanup = () => {
|
|
100
|
-
if (cleanedUp) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
cleanedUp = true;
|
|
104
|
-
try {
|
|
105
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
// best-effort cleanup
|
|
109
|
-
}
|
|
11
|
+
const unifiedOptions = {
|
|
12
|
+
stripAnthropicRouting: true,
|
|
13
|
+
stripKeys: ['ANTHROPIC_API_KEY'],
|
|
14
|
+
durable: options?.durable,
|
|
15
|
+
forceWrite: true,
|
|
110
16
|
};
|
|
17
|
+
const result = (0, launch_settings_1.createUnifiedLaunchSettings)(settingsPath, settings, unifiedOptions);
|
|
111
18
|
return {
|
|
112
|
-
settingsPath:
|
|
113
|
-
cleanup,
|
|
19
|
+
settingsPath: result.settingsPath,
|
|
20
|
+
cleanup: result.cleanup,
|
|
114
21
|
};
|
|
115
22
|
}
|
|
116
23
|
exports.createOpenAICompatLaunchSettings = createOpenAICompatLaunchSettings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compat-launch-settings.js","sourceRoot":"","sources":["../../src/utils/openai-compat-launch-settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-compat-launch-settings.js","sourceRoot":"","sources":["../../src/utils/openai-compat-launch-settings.ts"],"names":[],"mappings":";;;AACA,uDAI2B;AAe3B;;;;GAIG;AACH,SAAgB,gCAAgC,CAC9C,YAAoB,EACpB,QAAkB,EAClB,OAA2C;IAE3C,MAAM,cAAc,GAAiC;QACnD,qBAAqB,EAAE,IAAI;QAC3B,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,UAAU,EAAE,IAAI;KACjB,CAAC;IAEF,MAAM,MAAM,GAAgC,IAAA,6CAA2B,EACrE,YAAY,EACZ,QAAQ,EACR,cAAc,CACf,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAtBD,4EAsBC"}
|