@gkorepanov/ccodex 0.3.0 → 0.3.4
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 +27 -9
- package/RELEASING.md +14 -15
- package/SSH_VERIFY.md +11 -0
- package/archive/README.md +23 -0
- package/compatibility.json +1 -2
- package/config.example.toml +12 -4
- package/dist/claude/asyncQueue.d.ts +3 -0
- package/dist/claude/asyncQueue.js +13 -2
- package/dist/claude/asyncQueue.js.map +1 -1
- package/dist/claude/commandActions.d.ts +6 -0
- package/dist/claude/commandActions.js +57 -0
- package/dist/claude/commandActions.js.map +1 -0
- package/dist/claude/compactCommand.d.ts +2 -0
- package/dist/claude/compactCommand.js +7 -0
- package/dist/claude/compactCommand.js.map +1 -0
- package/dist/claude/goalTools.d.ts +15 -0
- package/dist/claude/goalTools.js +173 -0
- package/dist/claude/goalTools.js.map +1 -0
- package/dist/claude/hookMapper.d.ts +17 -4
- package/dist/claude/hookMapper.js +7 -5
- package/dist/claude/hookMapper.js.map +1 -1
- package/dist/claude/rateLimits.d.ts +72 -0
- package/dist/claude/rateLimits.js +330 -0
- package/dist/claude/rateLimits.js.map +1 -0
- package/dist/claude/responseItemValidation.d.ts +2 -0
- package/dist/claude/responseItemValidation.js +40 -0
- package/dist/claude/responseItemValidation.js.map +1 -0
- package/dist/claude/resultClassifier.d.ts +8 -2
- package/dist/claude/resultClassifier.js +1 -1
- package/dist/claude/resultClassifier.js.map +1 -1
- package/dist/claude/service.d.ts +108 -28
- package/dist/claude/service.js +1276 -668
- package/dist/claude/service.js.map +1 -1
- package/dist/claude/session/backgroundOutput.d.ts +2 -0
- package/dist/claude/session/backgroundOutput.js +29 -0
- package/dist/claude/session/backgroundOutput.js.map +1 -0
- package/dist/claude/session/commands.d.ts +855 -0
- package/dist/claude/session/commands.js +2 -0
- package/dist/claude/session/commands.js.map +1 -0
- package/dist/claude/session/goalState.d.ts +49 -0
- package/dist/claude/session/goalState.js +407 -0
- package/dist/claude/session/goalState.js.map +1 -0
- package/dist/claude/session/mailbox.d.ts +52 -0
- package/dist/claude/session/mailbox.js +190 -0
- package/dist/claude/session/mailbox.js.map +1 -0
- package/dist/claude/session/outputAdapter.d.ts +11 -0
- package/dist/claude/session/outputAdapter.js +31 -0
- package/dist/claude/session/outputAdapter.js.map +1 -0
- package/dist/claude/session/providerFacts.d.ts +47 -0
- package/dist/claude/session/providerFacts.js +84 -0
- package/dist/claude/session/providerFacts.js.map +1 -0
- package/dist/claude/session/providerRuntime.d.ts +1 -0
- package/dist/claude/session/providerRuntime.js +2 -0
- package/dist/claude/session/providerRuntime.js.map +1 -0
- package/dist/claude/session/providerRuntimeFactory.d.ts +49 -0
- package/dist/claude/session/providerRuntimeFactory.js +127 -0
- package/dist/claude/session/providerRuntimeFactory.js.map +1 -0
- package/dist/claude/session/repository.d.ts +57 -0
- package/dist/claude/session/repository.js +161 -0
- package/dist/claude/session/repository.js.map +1 -0
- package/dist/claude/session/runtime.d.ts +46 -0
- package/dist/claude/session/runtime.js +140 -0
- package/dist/claude/session/runtime.js.map +1 -0
- package/dist/claude/session/scopeState.d.ts +61 -0
- package/dist/claude/session/scopeState.js +74 -0
- package/dist/claude/session/scopeState.js.map +1 -0
- package/dist/claude/session/session.d.ts +281 -0
- package/dist/claude/session/session.js +6664 -0
- package/dist/claude/session/session.js.map +1 -0
- package/dist/claude/session/shellRunner.d.ts +13 -0
- package/dist/claude/session/shellRunner.js +103 -0
- package/dist/claude/session/shellRunner.js.map +1 -0
- package/dist/claude/session/usage.d.ts +2 -0
- package/dist/claude/session/usage.js +10 -0
- package/dist/claude/session/usage.js.map +1 -0
- package/dist/claude/sessionRegistry.d.ts +26 -0
- package/dist/claude/sessionRegistry.js +118 -0
- package/dist/claude/sessionRegistry.js.map +1 -0
- package/dist/claude/shellSupervisor.d.ts +1 -0
- package/dist/claude/shellSupervisor.js +69 -0
- package/dist/claude/shellSupervisor.js.map +1 -0
- package/dist/claude/statusCommand.d.ts +21 -0
- package/dist/claude/statusCommand.js +97 -0
- package/dist/claude/statusCommand.js.map +1 -0
- package/dist/claude/toolMapper.d.ts +9 -1
- package/dist/claude/toolMapper.js +92 -16
- package/dist/claude/toolMapper.js.map +1 -1
- package/dist/claude/transcriptBrancher.d.ts +37 -0
- package/dist/claude/transcriptBrancher.js +103 -0
- package/dist/claude/transcriptBrancher.js.map +1 -0
- package/dist/cli/delegate.js +23 -1
- package/dist/cli/delegate.js.map +1 -1
- package/dist/cli/main.js +28 -12
- package/dist/cli/main.js.map +1 -1
- package/dist/codex/generated/ResponseItemRuntimeSchema.d.ts +8 -0
- package/dist/codex/generated/ResponseItemRuntimeSchema.js +7 -0
- package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -0
- package/dist/compatibility/probe.js +11 -6
- package/dist/compatibility/probe.js.map +1 -1
- package/dist/config/config.d.ts +9 -0
- package/dist/config/config.js +80 -11
- package/dist/config/config.js.map +1 -1
- package/dist/daemon/daemon.js +91 -43
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/ownership.d.ts +15 -0
- package/dist/daemon/ownership.js +185 -0
- package/dist/daemon/ownership.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +3 -0
- package/dist/daemon/supervisor.js +37 -1
- package/dist/daemon/supervisor.js.map +1 -1
- package/dist/gateway/clientConnection.d.ts +7 -1
- package/dist/gateway/clientConnection.js +435 -48
- package/dist/gateway/clientConnection.js.map +1 -1
- package/dist/gateway/remoteRelay.js +0 -1
- package/dist/gateway/remoteRelay.js.map +1 -1
- package/dist/gateway/server.d.ts +1 -1
- package/dist/gateway/server.js +37 -9
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/subscriptions.d.ts +9 -2
- package/dist/gateway/subscriptions.js +87 -9
- package/dist/gateway/subscriptions.js.map +1 -1
- package/dist/gateway/transientNotice.d.ts +2 -0
- package/dist/gateway/transientNotice.js +42 -1
- package/dist/gateway/transientNotice.js.map +1 -1
- package/dist/handoff/service.d.ts +32 -3
- package/dist/handoff/service.js +304 -26
- package/dist/handoff/service.js.map +1 -1
- package/dist/handoff/titleGeneration.d.ts +28 -0
- package/dist/handoff/titleGeneration.js +151 -0
- package/dist/handoff/titleGeneration.js.map +1 -0
- package/dist/management/doctor.d.ts +1 -1
- package/dist/management/doctor.js +32 -23
- package/dist/management/doctor.js.map +1 -1
- package/dist/management/lifecycle.js +14 -2
- package/dist/management/lifecycle.js.map +1 -1
- package/dist/management/remoteShim.d.ts +10 -0
- package/dist/management/remoteShim.js +65 -0
- package/dist/management/remoteShim.js.map +1 -0
- package/dist/management/setup.d.ts +4 -0
- package/dist/management/setup.js +108 -39
- package/dist/management/setup.js.map +1 -1
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +6 -0
- package/dist/observability/metrics.js.map +1 -1
- package/dist/protocol/errors.d.ts +1 -0
- package/dist/protocol/errors.js +4 -1
- package/dist/protocol/errors.js.map +1 -1
- package/dist/runtime/dependencies.js +2 -2
- package/dist/runtime/dependencies.js.map +1 -1
- package/dist/runtime/providerAvailability.d.ts +24 -0
- package/dist/runtime/providerAvailability.js +107 -0
- package/dist/runtime/providerAvailability.js.map +1 -0
- package/dist/state/stateCommand.d.ts +21 -0
- package/dist/state/stateCommand.js +198 -0
- package/dist/state/stateCommand.js.map +1 -0
- package/dist/state/stockStateTracker.d.ts +14 -0
- package/dist/state/stockStateTracker.js +120 -0
- package/dist/state/stockStateTracker.js.map +1 -0
- package/dist/store/HybridStore.d.ts +118 -2
- package/dist/store/HybridStore.js +23 -1
- package/dist/store/HybridStore.js.map +1 -1
- package/dist/store/memoryStore.d.ts +57 -7
- package/dist/store/memoryStore.js +337 -5
- package/dist/store/memoryStore.js.map +1 -1
- package/dist/store/sqliteStore.d.ts +30 -4
- package/dist/store/sqliteStore.js +395 -42
- package/dist/store/sqliteStore.js.map +1 -1
- package/install.sh +2 -2
- package/package.json +18 -10
- package/dist/claude/interactions.d.ts +0 -23
- package/dist/claude/interactions.js +0 -77
- package/dist/claude/interactions.js.map +0 -1
- package/dist/claude/sessionRuntime.d.ts +0 -102
- package/dist/claude/sessionRuntime.js +0 -1361
- package/dist/claude/sessionRuntime.js.map +0 -1
- /package/{BUILD_BENCHMARKS.md → archive/BUILD_BENCHMARKS.md} +0 -0
package/dist/config/config.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { delimiter, join, resolve } from "node:path";
|
|
3
|
+
import { delimiter, join, relative, resolve } from "node:path";
|
|
4
4
|
import { parse } from "smol-toml";
|
|
5
5
|
import { DEFAULT_CLAUDE_MODEL_ALIASES } from "../claude/modelSelection.js";
|
|
6
6
|
import { bundledClaudeExecutable, pinnedCodexExecutable } from "../runtime/dependencies.js";
|
|
7
|
+
export const DEFAULT_FEATURES = {
|
|
8
|
+
titleGenerationUx: true,
|
|
9
|
+
statusCommand: true,
|
|
10
|
+
};
|
|
7
11
|
function expandHome(value) {
|
|
8
12
|
return value === "~" ? homedir() : value.startsWith("~/") ? join(homedir(), value.slice(2)) : value;
|
|
9
13
|
}
|
|
@@ -27,6 +31,23 @@ function stringMap(value, fallback) {
|
|
|
27
31
|
}
|
|
28
32
|
return Object.fromEntries(entries);
|
|
29
33
|
}
|
|
34
|
+
function featureConfig(value) {
|
|
35
|
+
if (value === undefined)
|
|
36
|
+
return DEFAULT_FEATURES;
|
|
37
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
38
|
+
throw new Error("[features] must be a TOML table.");
|
|
39
|
+
}
|
|
40
|
+
const table = value;
|
|
41
|
+
for (const key of ["title_generation_ux", "status_command"]) {
|
|
42
|
+
if (table[key] !== undefined && typeof table[key] !== "boolean") {
|
|
43
|
+
throw new Error(`features.${key} must be a boolean.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
titleGenerationUx: table.title_generation_ux ?? true,
|
|
48
|
+
statusCommand: table.status_command ?? true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
30
51
|
function environment(primary, legacy) {
|
|
31
52
|
return process.env[primary] ?? process.env[legacy];
|
|
32
53
|
}
|
|
@@ -55,22 +76,55 @@ function findExecutable(command) {
|
|
|
55
76
|
}
|
|
56
77
|
return undefined;
|
|
57
78
|
}
|
|
58
|
-
function
|
|
79
|
+
function insideManagedTree(candidate, productHome) {
|
|
80
|
+
const home = existsSync(productHome) ? realpathSync(productHome) : resolve(productHome);
|
|
81
|
+
const path = realpathSync(candidate);
|
|
82
|
+
const child = relative(home, path);
|
|
83
|
+
return child === "" || (child !== ".." && !child.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`));
|
|
84
|
+
}
|
|
85
|
+
function externalExecutable(configured, label, productHome) {
|
|
86
|
+
const candidate = resolveExecutable(configured, label);
|
|
87
|
+
if (insideManagedTree(candidate, productHome)) {
|
|
88
|
+
throw new Error(`${label} resolves inside managed CCodex home '${productHome}'. Configure an external Codex executable.`);
|
|
89
|
+
}
|
|
90
|
+
return candidate;
|
|
91
|
+
}
|
|
92
|
+
function persistedDelegate(productHome) {
|
|
93
|
+
const path = join(productHome, "install.json");
|
|
94
|
+
if (!existsSync(path))
|
|
95
|
+
return undefined;
|
|
96
|
+
try {
|
|
97
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
98
|
+
return typeof value.delegateCodex === "string" && value.delegateCodex.length > 0
|
|
99
|
+
? value.delegateCodex
|
|
100
|
+
: undefined;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export function findDelegatedCodex(appServerCodex, productHome) {
|
|
59
107
|
const excluded = new Set();
|
|
60
|
-
for (const path of [
|
|
108
|
+
for (const path of [
|
|
109
|
+
appServerCodex,
|
|
110
|
+
process.argv[1],
|
|
111
|
+
join(productHome, "bin", "codex"),
|
|
112
|
+
join(productHome, "bin", "ccodex"),
|
|
113
|
+
join(productHome, "current", "node_modules", ".bin", "ccodex"),
|
|
114
|
+
]) {
|
|
61
115
|
if (!path || !existsSync(path))
|
|
62
116
|
continue;
|
|
63
117
|
excluded.add(realpathSync(path));
|
|
64
118
|
}
|
|
65
119
|
for (const directory of (process.env.PATH ?? "").split(delimiter)) {
|
|
66
|
-
const candidate =
|
|
120
|
+
const candidate = resolve(directory || ".", "codex");
|
|
67
121
|
if (!existsSync(candidate))
|
|
68
122
|
continue;
|
|
69
123
|
const resolved = realpathSync(candidate);
|
|
70
|
-
if (!excluded.has(resolved))
|
|
124
|
+
if (!excluded.has(resolved) && !insideManagedTree(candidate, productHome))
|
|
71
125
|
return candidate;
|
|
72
126
|
}
|
|
73
|
-
return
|
|
127
|
+
return undefined;
|
|
74
128
|
}
|
|
75
129
|
function resolveExecutable(configured, label) {
|
|
76
130
|
const candidate = findExecutable(configured);
|
|
@@ -87,6 +141,23 @@ function readConfigFile(path) {
|
|
|
87
141
|
return {};
|
|
88
142
|
return parse(readFileSync(path, "utf8"));
|
|
89
143
|
}
|
|
144
|
+
export function delegatedCodexExecutable(productHome, appServerCodex, configPath = join(productHome, "config.toml")) {
|
|
145
|
+
const file = readConfigFile(configPath);
|
|
146
|
+
const configured = process.env.CCODEX_DELEGATE_CODEX ??
|
|
147
|
+
(typeof file.delegate_codex === "string" ? file.delegate_codex : undefined);
|
|
148
|
+
if (configured)
|
|
149
|
+
return externalExecutable(configured, "Delegated Codex", productHome);
|
|
150
|
+
const persisted = persistedDelegate(productHome);
|
|
151
|
+
if (persisted) {
|
|
152
|
+
try {
|
|
153
|
+
return externalExecutable(persisted, "Persisted delegated Codex", productHome);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// A removed or moved global Codex is rediscovered from the current PATH below.
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return findDelegatedCodex(appServerCodex, productHome);
|
|
160
|
+
}
|
|
90
161
|
export function loadConfig() {
|
|
91
162
|
const productHome = expandHome(process.env.CCODEX_HOME ?? join(homedir(), ".ccodex"));
|
|
92
163
|
const defaultDataDir = join(productHome, "state");
|
|
@@ -97,17 +168,14 @@ export function loadConfig() {
|
|
|
97
168
|
const configuredAppServerCodex = realCodexOverride ??
|
|
98
169
|
stringValue(file.app_server_codex, stringValue(file.real_codex, pinnedCodexExecutable()));
|
|
99
170
|
const realCodex = resolveExecutable(configuredAppServerCodex, "App-server Codex");
|
|
100
|
-
const delegateCodexValue = process.env.CCODEX_DELEGATE_CODEX ??
|
|
101
|
-
(typeof file.delegate_codex === "string" ? file.delegate_codex : undefined);
|
|
102
171
|
const logLevel = stringValue(file.log_level, environment("CCODEX_LOG_LEVEL", "CODEX_HYBRID_LOG_LEVEL") ?? "info");
|
|
103
172
|
if (!["debug", "info", "warn", "error"].includes(logLevel)) {
|
|
104
173
|
throw new Error(`Invalid log level '${logLevel}'.`);
|
|
105
174
|
}
|
|
175
|
+
const delegateCodex = delegatedCodexExecutable(productHome, realCodex, configPath);
|
|
106
176
|
return {
|
|
107
177
|
realCodex,
|
|
108
|
-
delegateCodex:
|
|
109
|
-
? resolveExecutable(delegateCodexValue, "Delegated Codex")
|
|
110
|
-
: findDelegatedCodex(realCodex, dataDir),
|
|
178
|
+
...(delegateCodex ? { delegateCodex } : {}),
|
|
111
179
|
claudeBinary: process.env.CCODEX_CLAUDE_BINARY ?? process.env.CODEX_HYBRID_CLAUDE_BINARY ??
|
|
112
180
|
stringValue(file.claude_binary, bundledClaudeExecutable()),
|
|
113
181
|
dataDir,
|
|
@@ -124,6 +192,7 @@ export function loadConfig() {
|
|
|
124
192
|
rpcCapture: environmentBoolean("CCODEX_RPC_CAPTURE", "CODEX_HYBRID_RPC_CAPTURE", booleanValue(file.rpc_capture, true)),
|
|
125
193
|
rpcCaptureIncludeContent: environmentBoolean("CCODEX_RPC_CAPTURE_INCLUDE_CONTENT", "CODEX_HYBRID_RPC_CAPTURE_INCLUDE_CONTENT", booleanValue(file.rpc_capture_include_content, true)),
|
|
126
194
|
rpcCaptureMaxBytes: environmentNumber("CCODEX_RPC_CAPTURE_MAX_BYTES", "CODEX_HYBRID_RPC_CAPTURE_MAX_BYTES", numberValue(file.rpc_capture_max_bytes, 1_073_741_824)),
|
|
195
|
+
features: featureConfig(file.features),
|
|
127
196
|
};
|
|
128
197
|
}
|
|
129
198
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/daemon.js
CHANGED
|
@@ -2,15 +2,15 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
3
|
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { dirname, join, resolve } from "node:path";
|
|
5
|
-
import { homedir } from "node:os";
|
|
6
5
|
import { probeAppServer } from "./probe.js";
|
|
7
|
-
import { reconcileManagedProcess, spawnDetachedGateway, stopManagedProcess, withDaemonLock, } from "./supervisor.js";
|
|
6
|
+
import { daemonStateDirectory, killManagedProcess, reconcileManagedProcess, spawnDetachedGateway, stopManagedProcess, withDaemonLock, } from "./supervisor.js";
|
|
7
|
+
import { identifySocketOwner, reconcileOwnedGateway, socketOwnerPids, stopSocketOwner, } from "./ownership.js";
|
|
8
8
|
const execFileAsync = promisify(execFile);
|
|
9
9
|
const START_TIMEOUT_MS = 10_000;
|
|
10
10
|
const POLL_MS = 50;
|
|
11
11
|
const sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
12
12
|
function paths(config, wrapperPath) {
|
|
13
|
-
const stateDirectory =
|
|
13
|
+
const stateDirectory = daemonStateDirectory();
|
|
14
14
|
return {
|
|
15
15
|
stateDirectory,
|
|
16
16
|
settingsFile: join(stateDirectory, "settings.json"),
|
|
@@ -136,72 +136,117 @@ class HybridDaemon {
|
|
|
136
136
|
if (!current || current.pid !== expected.pid || current.processStartTime !== expected.processStartTime) {
|
|
137
137
|
throw new Error(`managed app server ${expected.pid} lost daemon ownership during readiness`);
|
|
138
138
|
}
|
|
139
|
+
if (!this.ownsSocket(current)) {
|
|
140
|
+
throw new Error(`managed app server ${expected.pid} does not own ${this.paths.socketPath}`);
|
|
141
|
+
}
|
|
139
142
|
return { pid: expected.pid, info };
|
|
140
143
|
}
|
|
141
144
|
catch (error) {
|
|
142
|
-
|
|
145
|
+
const current = reconcileManagedProcess(this.paths.pidFile);
|
|
146
|
+
if (current && current.pid === expected.pid && current.processStartTime === expected.processStartTime) {
|
|
147
|
+
const stop = this.ownsSocket(current) ? stopManagedProcess : killManagedProcess;
|
|
148
|
+
await stop(this.paths.pidFile, current).catch(() => undefined);
|
|
149
|
+
}
|
|
143
150
|
throw error;
|
|
144
151
|
}
|
|
145
152
|
}
|
|
153
|
+
async replaceEndpoint(settings) {
|
|
154
|
+
let failure;
|
|
155
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
156
|
+
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
157
|
+
if (managed) {
|
|
158
|
+
if (this.ownsSocket(managed))
|
|
159
|
+
await stopManagedProcess(this.paths.pidFile, managed);
|
|
160
|
+
else
|
|
161
|
+
await killManagedProcess(this.paths.pidFile, managed);
|
|
162
|
+
}
|
|
163
|
+
const owner = identifySocketOwner(this.paths.socketPath);
|
|
164
|
+
if (owner) {
|
|
165
|
+
const confirmed = await probeMaybe(this.paths.socketPath);
|
|
166
|
+
const afterProbe = identifySocketOwner(this.paths.socketPath, owner);
|
|
167
|
+
// Vacancy is safe under the startup lock; every present owner remains
|
|
168
|
+
// fenced by PID/start-time before it can receive a signal.
|
|
169
|
+
if (afterProbe) {
|
|
170
|
+
if (!confirmed) {
|
|
171
|
+
throw new Error("refusing app-server takeover: owner did not answer app-server identity probe");
|
|
172
|
+
}
|
|
173
|
+
await stopSocketOwner(this.paths.socketPath, afterProbe);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
return await this.spawnReady(settings);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
failure = error;
|
|
181
|
+
// Codex App may have launched once more between handoff and bind. The
|
|
182
|
+
// managed remote shim makes this bounded; only another probed app-server
|
|
183
|
+
// on the exact socket is eligible for the next takeover attempt.
|
|
184
|
+
if (!await probeMaybe(this.paths.socketPath))
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
throw new Error("app-server ownership did not stabilize after three takeover attempts", { cause: failure });
|
|
189
|
+
}
|
|
190
|
+
ownsSocket(record) {
|
|
191
|
+
const owners = socketOwnerPids(this.paths.socketPath);
|
|
192
|
+
return owners.length === 1 && owners[0] === record.pid;
|
|
193
|
+
}
|
|
146
194
|
async start(status) {
|
|
147
195
|
const settings = loadSettings(this.paths.settingsFile);
|
|
148
196
|
const info = await probeMaybe(this.paths.socketPath);
|
|
149
197
|
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
198
|
+
const managedOwnsSocket = managed ? this.ownsSocket(managed) : false;
|
|
199
|
+
if (info && managed && managedOwnsSocket) {
|
|
200
|
+
return this.lifecycleOutput("alreadyRunning", "pid", undefined, info.appServerVersion);
|
|
201
|
+
}
|
|
202
|
+
if (managed && managedOwnsSocket) {
|
|
153
203
|
const ready = await waitUntilReady(this.paths.socketPath);
|
|
154
204
|
return this.lifecycleOutput("alreadyRunning", "pid", undefined, ready.appServerVersion);
|
|
155
205
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
throw error;
|
|
166
|
-
}
|
|
206
|
+
const { pid, info: ready } = info || managed
|
|
207
|
+
? await this.replaceEndpoint(settings)
|
|
208
|
+
: await this.spawnReady(settings).catch(async (error) => {
|
|
209
|
+
if (!await probeMaybe(this.paths.socketPath))
|
|
210
|
+
throw error;
|
|
211
|
+
return this.replaceEndpoint(settings);
|
|
212
|
+
});
|
|
213
|
+
return this.lifecycleOutput(status, "pid", pid, ready.appServerVersion);
|
|
167
214
|
}
|
|
168
215
|
async restart() {
|
|
169
216
|
const settings = loadSettings(this.paths.settingsFile);
|
|
170
|
-
const info = await
|
|
171
|
-
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
172
|
-
if (info && !managed)
|
|
173
|
-
throw new Error("app server is running but is not managed by codex app-server daemon");
|
|
174
|
-
if (managed)
|
|
175
|
-
await stopManagedProcess(this.paths.pidFile);
|
|
176
|
-
const { pid, info: ready } = await this.spawnReady(settings);
|
|
217
|
+
const { pid, info: ready } = await this.replaceEndpoint(settings);
|
|
177
218
|
return this.lifecycleOutput("restarted", "pid", pid, ready.appServerVersion);
|
|
178
219
|
}
|
|
179
220
|
async stop() {
|
|
180
221
|
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
181
|
-
if (managed) {
|
|
222
|
+
if (managed && this.ownsSocket(managed)) {
|
|
182
223
|
await stopManagedProcess(this.paths.pidFile);
|
|
183
224
|
return this.lifecycleOutput("stopped", "pid");
|
|
184
225
|
}
|
|
226
|
+
// The recorded group is still ours by PID/start-time, but an unlink/rebind
|
|
227
|
+
// may have handed the pathname to another process. Reap only our stale group
|
|
228
|
+
// and then classify the current endpoint independently.
|
|
229
|
+
if (managed)
|
|
230
|
+
await killManagedProcess(this.paths.pidFile, managed);
|
|
231
|
+
const owned = reconcileOwnedGateway(this.paths.socketPath);
|
|
232
|
+
if (owned) {
|
|
233
|
+
await stopSocketOwner(this.paths.socketPath, owned);
|
|
234
|
+
return this.lifecycleOutput("stopped", "pid");
|
|
235
|
+
}
|
|
185
236
|
if (await probeMaybe(this.paths.socketPath)) {
|
|
186
|
-
|
|
237
|
+
return this.lifecycleOutput("notManaged");
|
|
187
238
|
}
|
|
188
|
-
return this.lifecycleOutput("notRunning");
|
|
239
|
+
return this.lifecycleOutput(managed ? "stopped" : "notRunning", managed ? "pid" : undefined);
|
|
189
240
|
}
|
|
190
241
|
async versionOutput() {
|
|
191
242
|
const info = await probeAppServer(this.paths.socketPath);
|
|
192
243
|
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
193
|
-
return this.lifecycleOutput("running", managed ? "pid" : undefined, undefined, info.appServerVersion);
|
|
244
|
+
return this.lifecycleOutput("running", managed && this.ownsSocket(managed) ? "pid" : undefined, undefined, info.appServerVersion);
|
|
194
245
|
}
|
|
195
246
|
async bootstrap(remoteControlEnabled) {
|
|
196
247
|
const settings = { remoteControlEnabled };
|
|
197
|
-
const info = await probeMaybe(this.paths.socketPath);
|
|
198
|
-
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
199
|
-
if (info && !managed)
|
|
200
|
-
throw new Error("app server is running but is not managed by codex app-server daemon");
|
|
201
248
|
saveSettings(this.paths.settingsFile, settings);
|
|
202
|
-
|
|
203
|
-
await stopManagedProcess(this.paths.pidFile);
|
|
204
|
-
const { info: ready } = await this.spawnReady(settings);
|
|
249
|
+
const { info: ready } = await this.replaceEndpoint(settings);
|
|
205
250
|
const version = await this.getVersion();
|
|
206
251
|
return {
|
|
207
252
|
status: "bootstrapped",
|
|
@@ -218,19 +263,22 @@ class HybridDaemon {
|
|
|
218
263
|
async setRemoteControl(enabled) {
|
|
219
264
|
const previous = loadSettings(this.paths.settingsFile);
|
|
220
265
|
const managed = reconcileManagedProcess(this.paths.pidFile);
|
|
221
|
-
|
|
222
|
-
throw new Error("app server is running but is not managed by codex app-server daemon");
|
|
223
|
-
}
|
|
266
|
+
const managedOwnsSocket = managed ? this.ownsSocket(managed) : false;
|
|
224
267
|
if (previous.remoteControlEnabled === enabled) {
|
|
225
|
-
const
|
|
226
|
-
|
|
268
|
+
const serving = await probeMaybe(this.paths.socketPath);
|
|
269
|
+
const info = managed && managedOwnsSocket
|
|
270
|
+
? await waitUntilReady(this.paths.socketPath)
|
|
271
|
+
: serving || managed ? (await this.replaceEndpoint(previous)).info : undefined;
|
|
272
|
+
return this.remoteControlOutput(enabled ? "alreadyEnabled" : "alreadyDisabled", enabled, managedOwnsSocket || info ? "pid" : undefined, info?.appServerVersion);
|
|
227
273
|
}
|
|
228
274
|
const settings = { remoteControlEnabled: enabled };
|
|
229
275
|
saveSettings(this.paths.settingsFile, settings);
|
|
230
276
|
let info;
|
|
231
277
|
if (managed) {
|
|
232
|
-
await
|
|
233
|
-
|
|
278
|
+
({ info } = await this.replaceEndpoint(settings));
|
|
279
|
+
}
|
|
280
|
+
else if (await probeMaybe(this.paths.socketPath)) {
|
|
281
|
+
({ info } = await this.replaceEndpoint(settings));
|
|
234
282
|
}
|
|
235
283
|
return this.remoteControlOutput(enabled ? "enabled" : "disabled", enabled, info ? "pid" : undefined, info?.appServerVersion);
|
|
236
284
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type PidRecord } from "./supervisor.js";
|
|
2
|
+
export interface SocketOwnershipRuntime {
|
|
3
|
+
readonly ownerPids: (socketPath: string) => number[];
|
|
4
|
+
readonly processStartTime: (pid: number) => string | undefined;
|
|
5
|
+
readonly processMatches: (record: PidRecord) => boolean;
|
|
6
|
+
readonly signal: (pid: number, signal: NodeJS.Signals) => void;
|
|
7
|
+
readonly now: () => number;
|
|
8
|
+
readonly sleep: (milliseconds: number) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare function gatewayOwnerFile(socketPath: string): string;
|
|
11
|
+
export declare function socketOwnerPids(socketPath: string): number[];
|
|
12
|
+
export declare function publishGatewayOwner(socketPath: string): () => void;
|
|
13
|
+
export declare function reconcileOwnedGateway(socketPath: string): PidRecord | undefined;
|
|
14
|
+
export declare function identifySocketOwner(socketPath: string, expected?: PidRecord, runtime?: SocketOwnershipRuntime): PidRecord | undefined;
|
|
15
|
+
export declare function stopSocketOwner(socketPath: string, expected: PidRecord, runtime?: SocketOwnershipRuntime): Promise<void>;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, readdirSync, readlinkSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { processMatches, processStartTime } from "./supervisor.js";
|
|
6
|
+
const POLL_MS = 50;
|
|
7
|
+
const STOP_GRACE_MS = 10_000;
|
|
8
|
+
const STOP_TIMEOUT_MS = 15_000;
|
|
9
|
+
const sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
10
|
+
export function gatewayOwnerFile(socketPath) {
|
|
11
|
+
return `${socketPath}.ccodex-owner.json`;
|
|
12
|
+
}
|
|
13
|
+
function linuxSocketOwners(socketPath) {
|
|
14
|
+
const inodes = new Set(readFileSync("/proc/net/unix", "utf8")
|
|
15
|
+
.split("\n")
|
|
16
|
+
.slice(1)
|
|
17
|
+
.map((line) => /^\S+:\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\d+)(?:\s+(.*))?$/u.exec(line.trim()))
|
|
18
|
+
.filter((match) => match?.[2] === socketPath)
|
|
19
|
+
.map((match) => match?.[1])
|
|
20
|
+
.filter((inode) => Boolean(inode)));
|
|
21
|
+
if (inodes.size === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const owners = new Set();
|
|
24
|
+
for (const entry of readdirSync("/proc")) {
|
|
25
|
+
if (!/^\d+$/u.test(entry))
|
|
26
|
+
continue;
|
|
27
|
+
try {
|
|
28
|
+
for (const descriptor of readdirSync(`/proc/${entry}/fd`)) {
|
|
29
|
+
const target = readlinkSync(`/proc/${entry}/fd/${descriptor}`);
|
|
30
|
+
const match = /^socket:\[(\d+)\]$/u.exec(target);
|
|
31
|
+
if (match?.[1] && inodes.has(match[1])) {
|
|
32
|
+
owners.add(Number(entry));
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Processes can exit, close descriptors, or be inaccessible during the scan.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...owners].sort((left, right) => left - right);
|
|
42
|
+
}
|
|
43
|
+
function lsofSocketOwners(socketPath) {
|
|
44
|
+
const command = process.platform === "darwin" ? "/usr/sbin/lsof" : "lsof";
|
|
45
|
+
const result = spawnSync(command, ["-n", "-P", "-t", "--", socketPath], { encoding: "utf8" });
|
|
46
|
+
if (result.error || (result.status !== 0 && result.status !== 1)) {
|
|
47
|
+
throw result.error ?? new Error(`lsof failed with status ${result.status}: ${result.stderr.trim()}`);
|
|
48
|
+
}
|
|
49
|
+
return [...new Set(result.stdout.split(/\s+/u).filter(Boolean).map(Number).filter(Number.isInteger))]
|
|
50
|
+
.sort((left, right) => left - right);
|
|
51
|
+
}
|
|
52
|
+
export function socketOwnerPids(socketPath) {
|
|
53
|
+
if (process.platform === "linux")
|
|
54
|
+
return linuxSocketOwners(socketPath);
|
|
55
|
+
if (process.platform === "darwin")
|
|
56
|
+
return lsofSocketOwners(socketPath);
|
|
57
|
+
throw new Error(`Unix socket ownership discovery is unsupported on ${process.platform}`);
|
|
58
|
+
}
|
|
59
|
+
const systemOwnershipRuntime = {
|
|
60
|
+
ownerPids: socketOwnerPids,
|
|
61
|
+
processStartTime,
|
|
62
|
+
processMatches,
|
|
63
|
+
signal: (pid, signal) => process.kill(pid, signal),
|
|
64
|
+
now: Date.now,
|
|
65
|
+
sleep,
|
|
66
|
+
};
|
|
67
|
+
function readOwner(path) {
|
|
68
|
+
try {
|
|
69
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
70
|
+
return value.schemaVersion === 1 && Number.isInteger(value.pid) &&
|
|
71
|
+
typeof value.processStartTime === "string" && typeof value.token === "string"
|
|
72
|
+
? value
|
|
73
|
+
: undefined;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function sameOwner(path, expected) {
|
|
80
|
+
const current = readOwner(path);
|
|
81
|
+
return current?.token === expected.token && current.pid === expected.pid &&
|
|
82
|
+
current.processStartTime === expected.processStartTime;
|
|
83
|
+
}
|
|
84
|
+
export function publishGatewayOwner(socketPath) {
|
|
85
|
+
const path = gatewayOwnerFile(socketPath);
|
|
86
|
+
const startTime = processStartTime(process.pid);
|
|
87
|
+
if (!startTime)
|
|
88
|
+
throw new Error(`failed to identify gateway process ${process.pid}`);
|
|
89
|
+
const owner = {
|
|
90
|
+
schemaVersion: 1,
|
|
91
|
+
pid: process.pid,
|
|
92
|
+
processStartTime: startTime,
|
|
93
|
+
token: randomUUID(),
|
|
94
|
+
};
|
|
95
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
96
|
+
const temporary = `${path}.${process.pid}.${owner.token}.tmp`;
|
|
97
|
+
writeFileSync(temporary, JSON.stringify(owner), { mode: 0o600 });
|
|
98
|
+
renameSync(temporary, path);
|
|
99
|
+
chmodSync(path, 0o600);
|
|
100
|
+
return () => {
|
|
101
|
+
if (sameOwner(path, owner))
|
|
102
|
+
rmSync(path, { force: true });
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function reconcileOwnedGateway(socketPath) {
|
|
106
|
+
const path = gatewayOwnerFile(socketPath);
|
|
107
|
+
if (!existsSync(path))
|
|
108
|
+
return undefined;
|
|
109
|
+
const owner = readOwner(path);
|
|
110
|
+
if (!owner || !processMatches(owner) || !socketOwnerPids(socketPath).includes(owner.pid)) {
|
|
111
|
+
rmSync(path, { force: true });
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
return { pid: owner.pid, processStartTime: owner.processStartTime };
|
|
115
|
+
}
|
|
116
|
+
function exactSocketOwnerPresent(socketPath, expected, runtime) {
|
|
117
|
+
const owners = runtime.ownerPids(socketPath);
|
|
118
|
+
if (owners.length === 0)
|
|
119
|
+
return false;
|
|
120
|
+
if (owners.length !== 1 || owners[0] !== expected.pid) {
|
|
121
|
+
throw new Error(`app-server socket owner changed (expected ${expected.pid}, found ${owners.join(", ") || "none"})`);
|
|
122
|
+
}
|
|
123
|
+
if (runtime.processMatches(expected))
|
|
124
|
+
return true;
|
|
125
|
+
if (runtime.ownerPids(socketPath).length === 0)
|
|
126
|
+
return false;
|
|
127
|
+
throw new Error(`app-server owner ${expected.pid} changed identity`);
|
|
128
|
+
}
|
|
129
|
+
function signalExactSocketOwner(socketPath, expected, signal, runtime) {
|
|
130
|
+
if (!exactSocketOwnerPresent(socketPath, expected, runtime))
|
|
131
|
+
return false;
|
|
132
|
+
try {
|
|
133
|
+
runtime.signal(expected.pid, signal);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error.code !== "ESRCH")
|
|
137
|
+
throw error;
|
|
138
|
+
return exactSocketOwnerPresent(socketPath, expected, runtime);
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
export function identifySocketOwner(socketPath, expected, runtime = systemOwnershipRuntime) {
|
|
143
|
+
const owners = runtime.ownerPids(socketPath);
|
|
144
|
+
if (owners.length === 0)
|
|
145
|
+
return undefined;
|
|
146
|
+
if (owners.length !== 1) {
|
|
147
|
+
throw new Error(`refusing app-server takeover: expected one owner for ${socketPath}, found ${owners.join(", ")}`);
|
|
148
|
+
}
|
|
149
|
+
const pid = owners[0];
|
|
150
|
+
if (expected && pid !== expected.pid) {
|
|
151
|
+
throw new Error(`refusing app-server takeover: socket owner changed from ${expected.pid} to ${pid}`);
|
|
152
|
+
}
|
|
153
|
+
const startTime = runtime.processStartTime(pid);
|
|
154
|
+
if (!startTime) {
|
|
155
|
+
if (runtime.ownerPids(socketPath).length === 0)
|
|
156
|
+
return undefined;
|
|
157
|
+
throw new Error(`refusing app-server takeover: owner ${pid} exited during identification`);
|
|
158
|
+
}
|
|
159
|
+
const record = { pid, processStartTime: startTime };
|
|
160
|
+
if (expected && startTime !== expected.processStartTime) {
|
|
161
|
+
throw new Error(`refusing app-server takeover: owner ${pid} changed identity`);
|
|
162
|
+
}
|
|
163
|
+
if (!exactSocketOwnerPresent(socketPath, record, runtime))
|
|
164
|
+
return undefined;
|
|
165
|
+
return record;
|
|
166
|
+
}
|
|
167
|
+
export async function stopSocketOwner(socketPath, expected, runtime = systemOwnershipRuntime) {
|
|
168
|
+
if (!signalExactSocketOwner(socketPath, expected, "SIGTERM", runtime))
|
|
169
|
+
return;
|
|
170
|
+
const startedAt = runtime.now();
|
|
171
|
+
let forced = false;
|
|
172
|
+
while (runtime.now() - startedAt < STOP_TIMEOUT_MS) {
|
|
173
|
+
if (!exactSocketOwnerPresent(socketPath, expected, runtime))
|
|
174
|
+
return;
|
|
175
|
+
if (!forced && runtime.now() - startedAt >= STOP_GRACE_MS) {
|
|
176
|
+
// Fence PID reuse and socket handoff again immediately before escalation.
|
|
177
|
+
if (!signalExactSocketOwner(socketPath, expected, "SIGKILL", runtime))
|
|
178
|
+
return;
|
|
179
|
+
forced = true;
|
|
180
|
+
}
|
|
181
|
+
await runtime.sleep(POLL_MS);
|
|
182
|
+
}
|
|
183
|
+
throw new Error(`timed out waiting for app-server socket owner ${expected.pid} to stop`);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=ownership.js.map
|