@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.
@@ -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 (the latter surfaces as
16
- * `400 {"detail":"System messages are not allowed"}`).
15
+ * sanitization and Codex system-message folding.
17
16
  *
18
- * To keep the proxy chain authoritative regardless of Claude's env precedence,
19
- * we write a runtime copy of the settings file whose `env` routing keys are
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
- * `env` keys overlaid from the resolved launch environment.
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;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAkCH;;;;;GAKG;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,CA0BzD;AAED;;;;;;;;GAQG;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,CA6C/C"}
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 (the latter surfaces as
17
- * `400 {"detail":"System messages are not allowed"}`).
16
+ * sanitization and Codex system-message folding.
18
17
  *
19
- * To keep the proxy chain authoritative regardless of Claude's env precedence,
20
- * we write a runtime copy of the settings file whose `env` routing keys are
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 fs = __importStar(require("fs"));
50
- const os = __importStar(require("os"));
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
- * `env` keys overlaid from the resolved launch environment.
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 (isRecord(parsed)) {
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 mergedEnv = isRecord(base.env) ? { ...base.env } : {};
97
- let changed = false;
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 noop = { settingsPath, cleanup: () => { } };
119
- let overlay;
120
- try {
121
- overlay = buildLaunchSettingsOverlay(settingsPath, env);
122
- }
123
- catch {
124
- return noop;
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":"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"}
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
- * location under ~/.ccs/cache/isolated-settings/ instead of an ephemeral $TMPDIR.
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":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iCAAiC;IAChD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAQD,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,iCAAiC,GAC1C,0BAA0B,CAoF5B"}
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 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
- // 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 launchSettings = JSON.parse(JSON.stringify(settings));
41
- const sanitizedEnv = Object.fromEntries(Object.entries((0, shell_executor_1.stripAnthropicRoutingEnv)({ ...(launchSettings.env ?? {}) })).filter((entry) => typeof entry[1] === 'string'));
42
- if (Object.keys(sanitizedEnv).length > 0) {
43
- launchSettings.env = sanitizedEnv;
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: launchSettingsPath,
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,mCAAgD;AAGhD,qDAA6C;AAC7C,qDAA4D;AAkB5D,mFAAmF;AACnF,2EAA2E;AAC3E,kFAAkF;AAClF,6EAA6E;AAC7E,iFAAiF;AACjF,8BAA8B;AAC9B,SAAgB,gCAAgC,CAC9C,YAAoB,EACpB,QAAkB,EAClB,OAA2C;IAE3C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAa,CAAC;IACxE,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACrC,MAAM,CAAC,OAAO,CAAC,IAAA,yCAAwB,EAAC,EAAE,GAAG,CAAC,cAAc,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAChF,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CACnE,CACF,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,cAAc,CAAC,GAAG,GAAG,YAAY,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,cAAc,CAAC,GAAG,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAElE,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,8EAA8E;QAC9E,4EAA4E;QAC5E,mFAAmF;QACnF,mEAAmE;QACnE,MAAM,QAAQ,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC;aAClC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;aAClC,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,0BAAS,GAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QAClF,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAA,mBAAU,GAAE,MAAM,CAAC,CAAC;QAE9F,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE;gBACrC,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YAC5C,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,iCAAiC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO;YACL,YAAY,EAAE,kBAAkB;YAChC,OAAO,EAAE,GAAG,EAAE;gBACZ,iFAAiF;YACnF,CAAC;SACF,CAAC;IACJ,CAAC;IAED,oGAAoG;IACpG,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACtF,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3E,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,UAAU,EAAE;QAC/C,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,kBAAkB;QAChC,OAAO;KACR,CAAC;AACJ,CAAC;AAxFD,4EAwFC"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaitranntt/ccs",
3
- "version": "8.10.0-dev.20",
3
+ "version": "8.10.0-dev.21",
4
4
  "description": "Claude Codex Switch - Instant profile switching between Claude, GLM, Kimi, and more",
5
5
  "keywords": [
6
6
  "cli",