@vizalice/codegraph 1.5.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -18
- package/dist/bin/codegraph.js +127 -25
- package/dist/bin/codegraph.js.map +1 -1
- package/dist/context/index.d.ts +12 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +47 -8
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +23 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/queries.d.ts +39 -2
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +104 -19
- package/dist/db/queries.js.map +1 -1
- package/dist/directory.d.ts +29 -0
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +52 -0
- package/dist/directory.js.map +1 -1
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +38 -2
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +59 -0
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +175 -53
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/erlang.d.ts.map +1 -1
- package/dist/extraction/languages/erlang.js +58 -22
- package/dist/extraction/languages/erlang.js.map +1 -1
- package/dist/extraction/languages/rust.d.ts +20 -0
- package/dist/extraction/languages/rust.d.ts.map +1 -1
- package/dist/extraction/languages/rust.js +44 -20
- package/dist/extraction/languages/rust.js.map +1 -1
- package/dist/extraction/parse-pool.d.ts +7 -0
- package/dist/extraction/parse-pool.d.ts.map +1 -1
- package/dist/extraction/parse-pool.js +20 -1
- package/dist/extraction/parse-pool.js.map +1 -1
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +66 -35
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +2 -2
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +8 -7
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/targets/codex.d.ts +22 -8
- package/dist/installer/targets/codex.d.ts.map +1 -1
- package/dist/installer/targets/codex.js +65 -48
- package/dist/installer/targets/codex.js.map +1 -1
- package/dist/installer/targets/types.d.ts +4 -4
- package/dist/mcp/daemon-manager.d.ts +1 -1
- package/dist/mcp/daemon-manager.d.ts.map +1 -1
- package/dist/mcp/daemon-manager.js +1 -1
- package/dist/mcp/daemon-manager.js.map +1 -1
- package/dist/mcp/daemon-paths.d.ts +6 -0
- package/dist/mcp/daemon-paths.d.ts.map +1 -1
- package/dist/mcp/daemon-paths.js +54 -0
- package/dist/mcp/daemon-paths.js.map +1 -1
- package/dist/mcp/daemon-registry.d.ts +10 -0
- package/dist/mcp/daemon-registry.d.ts.map +1 -1
- package/dist/mcp/daemon-registry.js +51 -3
- package/dist/mcp/daemon-registry.js.map +1 -1
- package/dist/mcp/daemon.d.ts +9 -6
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +10 -8
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/engine.d.ts +3 -0
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +45 -3
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/explore-diagnostics.d.ts +2 -0
- package/dist/mcp/explore-diagnostics.d.ts.map +1 -1
- package/dist/mcp/explore-diagnostics.js +3 -0
- package/dist/mcp/explore-diagnostics.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +17 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +17 -12
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +17 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +164 -25
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-config.d.ts +23 -0
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +39 -2
- package/dist/project-config.js.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.js +2 -2
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +38 -10
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/swift.d.ts.map +1 -1
- package/dist/resolution/frameworks/swift.js +11 -1
- package/dist/resolution/frameworks/swift.js.map +1 -1
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +16 -1
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +5 -1
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/name-matcher.d.ts +30 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +278 -0
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/path-aliases.d.ts +6 -4
- package/dist/resolution/path-aliases.d.ts.map +1 -1
- package/dist/resolution/path-aliases.js +125 -17
- package/dist/resolution/path-aliases.js.map +1 -1
- package/dist/search/identifier-segments.d.ts +10 -0
- package/dist/search/identifier-segments.d.ts.map +1 -1
- package/dist/search/identifier-segments.js +29 -0
- package/dist/search/identifier-segments.js.map +1 -1
- package/dist/search/query-paths.d.ts +57 -0
- package/dist/search/query-paths.d.ts.map +1 -0
- package/dist/search/query-paths.js +298 -0
- package/dist/search/query-paths.js.map +1 -0
- package/dist/search/query-utils.d.ts +1 -1
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +12 -3
- package/dist/search/query-utils.js.map +1 -1
- package/dist/sync/watcher.d.ts +22 -0
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +51 -5
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/upgrade/index.d.ts +1 -1
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +6 -1
- package/dist/upgrade/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,15 +2,29 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* OpenAI Codex CLI target.
|
|
4
4
|
*
|
|
5
|
-
* - MCP server entry to
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - Instructions to
|
|
5
|
+
* - MCP server entry to `config.toml` as the dotted-key table
|
|
6
|
+
* `[mcp_servers.codegraph]`. TOML — not JSON — handled by the
|
|
7
|
+
* narrow serializer in `./toml.ts`.
|
|
8
|
+
* - Instructions to `AGENTS.md`.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Both locations are supported (#1531):
|
|
11
|
+
* - global: `~/.codex/config.toml` + `~/.codex/AGENTS.md`
|
|
12
|
+
* - local: `<cwd>/.codex/config.toml` + `<cwd>/AGENTS.md`
|
|
13
|
+
*
|
|
14
|
+
* Codex has a first-class project config layer: `.codex/config.toml`
|
|
15
|
+
* is layer 4 of the loader's stack, above the user config (layer 6),
|
|
16
|
+
* merged recursively top-over-bottom
|
|
17
|
+
* (`codex-rs/config/src/loader/README.md` in openai/codex). It landed
|
|
18
|
+
* in openai/codex#8354 (2025-12-22), so the "Codex has no
|
|
19
|
+
* project-local config" note this file used to carry was never
|
|
20
|
+
* accurate. The project layer strips a denylist of settings that
|
|
21
|
+
* repo contents shouldn't get to choose (base URLs, model providers,
|
|
22
|
+
* `notify`, profiles, otel — `loader/mod.rs`), and `mcp_servers` is
|
|
23
|
+
* NOT on it, so a project-scoped `[mcp_servers.codegraph]` is honored.
|
|
24
|
+
*
|
|
25
|
+
* Caveat surfaced as an install note: project layers are "loaded but
|
|
26
|
+
* disabled when untrusted," so a local install only takes effect in a
|
|
27
|
+
* project the user has marked trusted.
|
|
14
28
|
*
|
|
15
29
|
* No permissions concept.
|
|
16
30
|
*/
|
|
@@ -56,27 +70,40 @@ const shared_1 = require("./shared");
|
|
|
56
70
|
const instructions_template_1 = require("../instructions-template");
|
|
57
71
|
const toml_1 = require("./toml");
|
|
58
72
|
const TOML_HEADER = 'mcp_servers.codegraph';
|
|
59
|
-
function configDir() {
|
|
60
|
-
return
|
|
73
|
+
function configDir(loc) {
|
|
74
|
+
return loc === 'global'
|
|
75
|
+
? path.join(os.homedir(), '.codex')
|
|
76
|
+
: path.join(process.cwd(), '.codex');
|
|
77
|
+
}
|
|
78
|
+
function tomlConfigPath(loc) {
|
|
79
|
+
return path.join(configDir(loc), 'config.toml');
|
|
61
80
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
81
|
+
function instructionsPath(loc) {
|
|
82
|
+
// Global AGENTS.md lives under ~/.codex/; project-local AGENTS.md
|
|
83
|
+
// lives at the project root (NOT under .codex/) — that's the file
|
|
84
|
+
// Codex reads for repo instructions, and it matches the local
|
|
85
|
+
// layout the opencode and gemini targets already use.
|
|
86
|
+
return loc === 'global'
|
|
87
|
+
? path.join(configDir('global'), 'AGENTS.md')
|
|
88
|
+
: path.join(process.cwd(), 'AGENTS.md');
|
|
64
89
|
}
|
|
65
|
-
|
|
66
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Project layers are "loaded but disabled when untrusted" (openai/codex
|
|
92
|
+
* `loader/mod.rs`), so a local install can be written correctly and
|
|
93
|
+
* still do nothing. Say so rather than reporting silent success.
|
|
94
|
+
*/
|
|
95
|
+
function trustNote() {
|
|
96
|
+
return `Codex applies ${tomlConfigPath('local')} only in a project marked trusted — otherwise the layer is loaded but disabled. Trust this project in Codex to activate it.`;
|
|
67
97
|
}
|
|
68
98
|
class CodexTarget {
|
|
69
99
|
id = 'codex';
|
|
70
100
|
displayName = 'Codex CLI';
|
|
71
101
|
docsUrl = 'https://github.com/openai/codex';
|
|
72
|
-
supportsLocation(
|
|
73
|
-
return
|
|
102
|
+
supportsLocation(_loc) {
|
|
103
|
+
return true;
|
|
74
104
|
}
|
|
75
105
|
detect(loc) {
|
|
76
|
-
|
|
77
|
-
return { installed: false, alreadyConfigured: false };
|
|
78
|
-
}
|
|
79
|
-
const tomlPath = tomlConfigPath();
|
|
106
|
+
const tomlPath = tomlConfigPath(loc);
|
|
80
107
|
let alreadyConfigured = false;
|
|
81
108
|
if (fs.existsSync(tomlPath)) {
|
|
82
109
|
try {
|
|
@@ -85,29 +112,24 @@ class CodexTarget {
|
|
|
85
112
|
}
|
|
86
113
|
catch { /* ignore */ }
|
|
87
114
|
}
|
|
88
|
-
|
|
115
|
+
// Global: ~/.codex/ existing means Codex has run here. Local: the
|
|
116
|
+
// project only counts as "Codex-enabled" once it actually has a
|
|
117
|
+
// .codex/ dir or config file of its own.
|
|
118
|
+
const installed = fs.existsSync(configDir(loc)) || fs.existsSync(tomlPath);
|
|
89
119
|
return { installed, alreadyConfigured, configPath: tomlPath };
|
|
90
120
|
}
|
|
91
121
|
install(loc, _opts) {
|
|
92
|
-
if (loc !== 'global') {
|
|
93
|
-
return {
|
|
94
|
-
files: [],
|
|
95
|
-
notes: ['Codex CLI has no project-local config — re-run with --location=global to install.'],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
122
|
const files = [];
|
|
99
|
-
files.push(writeMcpEntry());
|
|
123
|
+
files.push(writeMcpEntry(loc));
|
|
100
124
|
// AGENTS.md gets the short marker-fenced CodeGraph block (#704):
|
|
101
125
|
// subagents and non-MCP harnesses read AGENTS.md but never the MCP
|
|
102
126
|
// initialize instructions. Upsert self-heals a stale pre-#529 block.
|
|
103
|
-
files.push((0, shared_1.upsertInstructionsEntry)(instructionsPath()));
|
|
104
|
-
return { files };
|
|
127
|
+
files.push((0, shared_1.upsertInstructionsEntry)(instructionsPath(loc)));
|
|
128
|
+
return loc === 'local' ? { files, notes: [trustNote()] } : { files };
|
|
105
129
|
}
|
|
106
130
|
uninstall(loc) {
|
|
107
|
-
if (loc !== 'global')
|
|
108
|
-
return { files: [] };
|
|
109
131
|
const files = [];
|
|
110
|
-
const tomlPath = tomlConfigPath();
|
|
132
|
+
const tomlPath = tomlConfigPath(loc);
|
|
111
133
|
if (fs.existsSync(tomlPath)) {
|
|
112
134
|
const content = fs.readFileSync(tomlPath, 'utf-8');
|
|
113
135
|
const { content: nextContent, action } = (0, toml_1.removeTomlTable)(content, TOML_HEADER);
|
|
@@ -130,20 +152,15 @@ class CodexTarget {
|
|
|
130
152
|
else {
|
|
131
153
|
files.push({ path: tomlPath, action: 'not-found' });
|
|
132
154
|
}
|
|
133
|
-
files.push(removeInstructionsEntry());
|
|
155
|
+
files.push(removeInstructionsEntry(loc));
|
|
134
156
|
return { files };
|
|
135
157
|
}
|
|
136
158
|
printConfig(loc) {
|
|
137
|
-
if (loc !== 'global') {
|
|
138
|
-
return '# Codex CLI has no project-local config — use --location=global.\n';
|
|
139
|
-
}
|
|
140
159
|
const block = buildCodegraphBlock();
|
|
141
|
-
return `# Add to ${tomlConfigPath()}\n\n${block}\n`;
|
|
160
|
+
return `# Add to ${tomlConfigPath(loc)}\n\n${block}\n`;
|
|
142
161
|
}
|
|
143
162
|
describePaths(loc) {
|
|
144
|
-
|
|
145
|
-
return [];
|
|
146
|
-
return [tomlConfigPath(), instructionsPath()];
|
|
163
|
+
return [tomlConfigPath(loc), instructionsPath(loc)];
|
|
147
164
|
}
|
|
148
165
|
}
|
|
149
166
|
function buildCodegraphBlock() {
|
|
@@ -153,8 +170,8 @@ function buildCodegraphBlock() {
|
|
|
153
170
|
args: mcp.args,
|
|
154
171
|
});
|
|
155
172
|
}
|
|
156
|
-
function writeMcpEntry() {
|
|
157
|
-
const file = tomlConfigPath();
|
|
173
|
+
function writeMcpEntry(loc) {
|
|
174
|
+
const file = tomlConfigPath(loc);
|
|
158
175
|
const dir = path.dirname(file);
|
|
159
176
|
if (!fs.existsSync(dir))
|
|
160
177
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -172,12 +189,12 @@ function writeMcpEntry() {
|
|
|
172
189
|
return { path: file, action: created ? 'created' : 'updated' };
|
|
173
190
|
}
|
|
174
191
|
/**
|
|
175
|
-
* Strip the marker-delimited CodeGraph block from
|
|
176
|
-
* if a prior install wrote one. Used by both install
|
|
177
|
-
* upgrade) and uninstall — see issue #529.
|
|
192
|
+
* Strip the marker-delimited CodeGraph block from this location's
|
|
193
|
+
* AGENTS.md if a prior install wrote one. Used by both install
|
|
194
|
+
* (self-heal on upgrade) and uninstall — see issue #529.
|
|
178
195
|
*/
|
|
179
|
-
function removeInstructionsEntry() {
|
|
180
|
-
const file = instructionsPath();
|
|
196
|
+
function removeInstructionsEntry(loc) {
|
|
197
|
+
const file = instructionsPath(loc);
|
|
181
198
|
const action = (0, shared_1.removeMarkedSection)(file, instructions_template_1.CODEGRAPH_SECTION_START, instructions_template_1.CODEGRAPH_SECTION_END);
|
|
182
199
|
return { path: file, action };
|
|
183
200
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/installer/targets/codex.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/installer/targets/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,10 +82,10 @@ export interface AgentTarget {
|
|
|
82
82
|
/**
|
|
83
83
|
* Whether this target supports the given install location.
|
|
84
84
|
*
|
|
85
|
-
* Some agents (
|
|
86
|
-
* config concept — only a single
|
|
87
|
-
* for an unsupported (target, location)
|
|
88
|
-
* skip cleanly with a clear message.
|
|
85
|
+
* Some agents (GitHub Copilot CLI, the Copilot JetBrains plugin)
|
|
86
|
+
* have no project-local config concept — only a single per-user
|
|
87
|
+
* config dir. Returning false for an unsupported (target, location)
|
|
88
|
+
* pair lets the orchestrator skip cleanly with a clear message.
|
|
89
89
|
*/
|
|
90
90
|
supportsLocation(loc: Location): boolean;
|
|
91
91
|
detect(loc: Location): DetectionResult;
|
|
@@ -16,7 +16,7 @@ export declare function formatUptime(ms: number): string;
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function buildPickItems(daemons: DaemonRecord[], cwdRoot: string | null, now: number): PickItem[];
|
|
18
18
|
export interface PickerDeps {
|
|
19
|
-
list: () => DaemonRecord[]
|
|
19
|
+
list: () => DaemonRecord[] | Promise<DaemonRecord[]>;
|
|
20
20
|
stop: (root: string) => Promise<StopResult>;
|
|
21
21
|
stopAll: () => Promise<StopResult[]>;
|
|
22
22
|
/** Realpath'd root of the current project's daemon, or null. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon-manager.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,0FAA0F;AAC1F,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AACvC,eAAO,MAAM,MAAM,eAAe,CAAC;AAEnC,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwBvG;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon-manager.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,0FAA0F;AAC1F,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AACvC,eAAO,MAAM,MAAM,eAAe,CAAC;AAEnC,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwBvG;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACrC,gEAAgE;IAChE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnG,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAClC,iDAAiD;IACjD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrE"}
|
|
@@ -97,7 +97,7 @@ function buildPickItems(daemons, cwdRoot, now) {
|
|
|
97
97
|
*/
|
|
98
98
|
async function runDaemonPicker(deps) {
|
|
99
99
|
for (;;) {
|
|
100
|
-
const daemons = deps.list();
|
|
100
|
+
const daemons = await deps.list();
|
|
101
101
|
if (daemons.length === 0) {
|
|
102
102
|
deps.done('All daemons stopped.');
|
|
103
103
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../../src/mcp/daemon-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,oCAOC;AAOD,wCAwBC;AAsBD,0CAkCC;AApHD;;;;;;;GAOG;AACH,2CAA6B;AAG7B,0FAA0F;AAC7E,QAAA,QAAQ,GAAG,cAAc,CAAC;AAC1B,QAAA,MAAM,GAAG,YAAY,CAAC;AAQnC,6CAA6C;AAC7C,SAAgB,YAAY,CAAC,EAAU;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,OAAuB,EAAE,OAAsB,EAAE,GAAW;IACzF,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;YAC1C,IAAI,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC,CAAC;YAC7B,IAAI,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,eAAe;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAe,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;QAC5D,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACxD,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,YAAY;SACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC;AACf,CAAC;AAkBD;;;GAGG;AACI,KAAK,UAAU,eAAe,CAAC,IAAgB;IACpD,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-manager.js","sourceRoot":"","sources":["../../src/mcp/daemon-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,12 @@ export interface DaemonLockInfo {
|
|
|
59
59
|
socketPath: string;
|
|
60
60
|
startedAt: number;
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Verify that the process named by a lockfile is the CodeGraph daemon serving
|
|
64
|
+
* its socket. A bare PID liveness probe is insufficient because OSes reuse PIDs
|
|
65
|
+
* after an OOM/SIGKILL (#1553).
|
|
66
|
+
*/
|
|
67
|
+
export declare function probeDaemonIdentity(info: DaemonLockInfo, timeoutMs?: number): Promise<boolean>;
|
|
62
68
|
/**
|
|
63
69
|
* Serialize a {@link DaemonLockInfo} for writing to the pidfile. JSON for
|
|
64
70
|
* human readability — operators occasionally `cat` this when debugging.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-paths.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;
|
|
1
|
+
{"version":3,"file":"daemon-paths.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA2BH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAQvE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CA0C7F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAuBjE"}
|
package/dist/mcp/daemon-paths.js
CHANGED
|
@@ -65,9 +65,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
65
65
|
exports.getDaemonSocketCandidates = getDaemonSocketCandidates;
|
|
66
66
|
exports.getDaemonSocketPath = getDaemonSocketPath;
|
|
67
67
|
exports.getDaemonPidPath = getDaemonPidPath;
|
|
68
|
+
exports.probeDaemonIdentity = probeDaemonIdentity;
|
|
68
69
|
exports.encodeLockInfo = encodeLockInfo;
|
|
69
70
|
exports.decodeLockInfo = decodeLockInfo;
|
|
70
71
|
const crypto = __importStar(require("crypto"));
|
|
72
|
+
const net = __importStar(require("net"));
|
|
71
73
|
const os = __importStar(require("os"));
|
|
72
74
|
const path = __importStar(require("path"));
|
|
73
75
|
const directory_1 = require("../directory");
|
|
@@ -126,6 +128,58 @@ function getDaemonSocketPath(projectRoot) {
|
|
|
126
128
|
function getDaemonPidPath(projectRoot) {
|
|
127
129
|
return path.join((0, directory_1.getCodeGraphDir)(projectRoot), 'daemon.pid');
|
|
128
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Verify that the process named by a lockfile is the CodeGraph daemon serving
|
|
133
|
+
* its socket. A bare PID liveness probe is insufficient because OSes reuse PIDs
|
|
134
|
+
* after an OOM/SIGKILL (#1553).
|
|
135
|
+
*/
|
|
136
|
+
function probeDaemonIdentity(info, timeoutMs = 1_000) {
|
|
137
|
+
if (!Number.isInteger(info.pid) || info.pid <= 0 || !info.socketPath)
|
|
138
|
+
return Promise.resolve(false);
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
let socket;
|
|
141
|
+
let buffer = '';
|
|
142
|
+
let done = false;
|
|
143
|
+
const finish = (ok) => {
|
|
144
|
+
if (done)
|
|
145
|
+
return;
|
|
146
|
+
done = true;
|
|
147
|
+
clearTimeout(timer);
|
|
148
|
+
socket.destroy();
|
|
149
|
+
resolve(ok);
|
|
150
|
+
};
|
|
151
|
+
const timer = setTimeout(() => finish(false), timeoutMs);
|
|
152
|
+
timer.unref?.();
|
|
153
|
+
try {
|
|
154
|
+
socket = net.createConnection(info.socketPath);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
resolve(false);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
socket.setEncoding('utf8');
|
|
162
|
+
socket.on('data', (chunk) => {
|
|
163
|
+
buffer += String(chunk);
|
|
164
|
+
if (buffer.length > 4096)
|
|
165
|
+
return finish(false);
|
|
166
|
+
const newline = buffer.indexOf('\n');
|
|
167
|
+
if (newline < 0)
|
|
168
|
+
return;
|
|
169
|
+
try {
|
|
170
|
+
const hello = JSON.parse(buffer.slice(0, newline));
|
|
171
|
+
finish(hello.protocol === 1 &&
|
|
172
|
+
hello.pid === info.pid &&
|
|
173
|
+
(info.version === 'unknown' || hello.codegraph === info.version));
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
finish(false);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
socket.on('error', () => finish(false));
|
|
180
|
+
socket.on('close', () => finish(false));
|
|
181
|
+
});
|
|
182
|
+
}
|
|
129
183
|
/**
|
|
130
184
|
* Serialize a {@link DaemonLockInfo} for writing to the pidfile. JSON for
|
|
131
185
|
* human readability — operators occasionally `cat` this when debugging.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-paths.js","sourceRoot":"","sources":["../../src/mcp/daemon-paths.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"daemon-paths.js","sourceRoot":"","sources":["../../src/mcp/daemon-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,16 @@ export declare function deregisterDaemon(root: string): void;
|
|
|
29
29
|
export declare function listDaemons(opts?: {
|
|
30
30
|
prune?: boolean;
|
|
31
31
|
}): DaemonRecord[];
|
|
32
|
+
/**
|
|
33
|
+
* Registry entries whose socket hello proves the recorded process is the
|
|
34
|
+
* daemon. Used by every user-facing list/stop-all path so a reused PID cannot
|
|
35
|
+
* appear as a phantom running daemon (#1553).
|
|
36
|
+
*/
|
|
37
|
+
export declare function listVerifiedDaemons(opts?: {
|
|
38
|
+
prune?: boolean;
|
|
39
|
+
}): Promise<DaemonRecord[]>;
|
|
40
|
+
/** Remove daemon artifacts only when no matching daemon answers the socket hello. */
|
|
41
|
+
export declare function clearStaleDaemonArtifacts(root: string): Promise<boolean>;
|
|
32
42
|
export interface StopResult {
|
|
33
43
|
root: string;
|
|
34
44
|
pid: number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon-registry.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAOD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAOtD;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMnD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,YAAY,EAAE,CA2B1E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAajG;AAgBD,qFAAqF;AACrF,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW9E;AAaD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,uFAAuF;IACvF,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;CACxD;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA2CpE;AAED,0CAA0C;AAC1C,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAM5D"}
|
|
@@ -38,6 +38,8 @@ exports.isProcessAlive = isProcessAlive;
|
|
|
38
38
|
exports.registerDaemon = registerDaemon;
|
|
39
39
|
exports.deregisterDaemon = deregisterDaemon;
|
|
40
40
|
exports.listDaemons = listDaemons;
|
|
41
|
+
exports.listVerifiedDaemons = listVerifiedDaemons;
|
|
42
|
+
exports.clearStaleDaemonArtifacts = clearStaleDaemonArtifacts;
|
|
41
43
|
exports.stopDaemonAt = stopDaemonAt;
|
|
42
44
|
exports.stopAllDaemons = stopAllDaemons;
|
|
43
45
|
/**
|
|
@@ -148,6 +150,27 @@ function listDaemons(opts = {}) {
|
|
|
148
150
|
}
|
|
149
151
|
return live.sort((a, b) => b.startedAt - a.startedAt);
|
|
150
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Registry entries whose socket hello proves the recorded process is the
|
|
155
|
+
* daemon. Used by every user-facing list/stop-all path so a reused PID cannot
|
|
156
|
+
* appear as a phantom running daemon (#1553).
|
|
157
|
+
*/
|
|
158
|
+
async function listVerifiedDaemons(opts = {}) {
|
|
159
|
+
const prune = opts.prune ?? true;
|
|
160
|
+
const candidates = listDaemons({ prune });
|
|
161
|
+
const checks = await Promise.all(candidates.map(async (rec) => ({
|
|
162
|
+
rec,
|
|
163
|
+
verified: await (0, daemon_paths_1.probeDaemonIdentity)(rec),
|
|
164
|
+
})));
|
|
165
|
+
const verified = [];
|
|
166
|
+
for (const check of checks) {
|
|
167
|
+
if (check.verified)
|
|
168
|
+
verified.push(check.rec);
|
|
169
|
+
else if (prune)
|
|
170
|
+
deregisterDaemon(check.rec.root);
|
|
171
|
+
}
|
|
172
|
+
return verified;
|
|
173
|
+
}
|
|
151
174
|
/** Remove a stopped daemon's leftover lockfile + socket + registry record. */
|
|
152
175
|
function cleanupDaemonArtifacts(root) {
|
|
153
176
|
try {
|
|
@@ -167,6 +190,22 @@ function cleanupDaemonArtifacts(root) {
|
|
|
167
190
|
}
|
|
168
191
|
deregisterDaemon(root);
|
|
169
192
|
}
|
|
193
|
+
/** Remove daemon artifacts only when no matching daemon answers the socket hello. */
|
|
194
|
+
async function clearStaleDaemonArtifacts(root) {
|
|
195
|
+
const pidPath = (0, daemon_paths_1.getDaemonPidPath)(root);
|
|
196
|
+
const hadArtifacts = fs.existsSync(pidPath) || (process.platform !== 'win32' && (0, daemon_paths_1.getDaemonSocketCandidates)(root).some((p) => fs.existsSync(p)));
|
|
197
|
+
if (!hadArtifacts)
|
|
198
|
+
return false;
|
|
199
|
+
let info = null;
|
|
200
|
+
try {
|
|
201
|
+
info = (0, daemon_paths_1.decodeLockInfo)(fs.readFileSync(pidPath, 'utf8'));
|
|
202
|
+
}
|
|
203
|
+
catch { /* missing/corrupt */ }
|
|
204
|
+
if (info && isProcessAlive(info.pid) && await (0, daemon_paths_1.probeDaemonIdentity)(info))
|
|
205
|
+
return false;
|
|
206
|
+
cleanupDaemonArtifacts(root);
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
170
209
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
171
210
|
async function waitForDeath(pid, timeoutMs) {
|
|
172
211
|
const deadline = Date.now() + timeoutMs;
|
|
@@ -185,9 +224,10 @@ async function waitForDeath(pid, timeoutMs) {
|
|
|
185
224
|
*/
|
|
186
225
|
async function stopDaemonAt(root) {
|
|
187
226
|
let pid = null;
|
|
227
|
+
let identity = null;
|
|
188
228
|
try {
|
|
189
|
-
|
|
190
|
-
pid =
|
|
229
|
+
identity = (0, daemon_paths_1.decodeLockInfo)(fs.readFileSync((0, daemon_paths_1.getDaemonPidPath)(root), 'utf8'));
|
|
230
|
+
pid = identity?.pid ?? null;
|
|
191
231
|
}
|
|
192
232
|
catch {
|
|
193
233
|
/* no lockfile */
|
|
@@ -195,6 +235,8 @@ async function stopDaemonAt(root) {
|
|
|
195
235
|
if (pid == null) {
|
|
196
236
|
const rec = listDaemons({ prune: false }).find((r) => path.resolve(r.root) === path.resolve(root));
|
|
197
237
|
pid = rec?.pid ?? null;
|
|
238
|
+
if (rec)
|
|
239
|
+
identity = rec;
|
|
198
240
|
}
|
|
199
241
|
if (pid == null) {
|
|
200
242
|
cleanupDaemonArtifacts(root);
|
|
@@ -204,6 +246,12 @@ async function stopDaemonAt(root) {
|
|
|
204
246
|
cleanupDaemonArtifacts(root);
|
|
205
247
|
return { root, pid, outcome: 'not-running' };
|
|
206
248
|
}
|
|
249
|
+
// Never signal a process merely because it reused a stale daemon PID. The
|
|
250
|
+
// daemon's immediate hello is the process-identity proof (#1553).
|
|
251
|
+
if (!identity || !await (0, daemon_paths_1.probeDaemonIdentity)(identity)) {
|
|
252
|
+
cleanupDaemonArtifacts(root);
|
|
253
|
+
return { root, pid, outcome: 'not-running' };
|
|
254
|
+
}
|
|
207
255
|
// POSIX: SIGTERM runs the daemon's graceful shutdown. Windows: TerminateProcess
|
|
208
256
|
// (no graceful path), so we always sweep artifacts ourselves below.
|
|
209
257
|
try {
|
|
@@ -225,7 +273,7 @@ async function stopDaemonAt(root) {
|
|
|
225
273
|
/** Stop every registered, live daemon. */
|
|
226
274
|
async function stopAllDaemons() {
|
|
227
275
|
const results = [];
|
|
228
|
-
for (const rec of
|
|
276
|
+
for (const rec of await listVerifiedDaemons()) {
|
|
229
277
|
results.push(await stopDaemonAt(rec.root));
|
|
230
278
|
}
|
|
231
279
|
return results;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-registry.js","sourceRoot":"","sources":["../../src/mcp/daemon-registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"daemon-registry.js","sourceRoot":"","sources":["../../src/mcp/daemon-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/daemon.d.ts
CHANGED
|
@@ -234,17 +234,20 @@ export declare function tryAcquireDaemonLock(projectRoot: string): AcquireResult
|
|
|
234
234
|
*/
|
|
235
235
|
export declare function acquireLockViaExclusiveOpen(pidPath: string, info: DaemonLockInfo): boolean;
|
|
236
236
|
/**
|
|
237
|
-
* Remove a stale pidfile
|
|
238
|
-
*
|
|
239
|
-
* daemon (re)acquired in the meantime.
|
|
237
|
+
* Remove a stale pidfile. Re-reads the file immediately before unlinking so a
|
|
238
|
+
* different daemon that acquired the lock in the meantime is never disturbed.
|
|
240
239
|
*
|
|
241
240
|
* must-fix 1 (issue #411 review): the original unconditionally `unlink`'d,
|
|
242
241
|
* which let a racing candidate delete a healthy daemon's lock. Passing
|
|
243
242
|
* `expectedDeadPid` (the pid the caller believed was dead) makes the clear a
|
|
244
|
-
* compare-and-delete: bail if the file now holds a different pid
|
|
245
|
-
* pid
|
|
243
|
+
* compare-and-delete: bail if the file now holds a different pid. By default a
|
|
244
|
+
* live pid is also preserved; `allowLivePid` is reserved for callers that have
|
|
245
|
+
* already disproved daemon identity with the socket hello (#1553). Returns true
|
|
246
|
+
* when the stale lock is gone (or was already gone).
|
|
246
247
|
*/
|
|
247
|
-
export declare function clearStaleDaemonLock(pidPath: string, expectedDeadPid?: number
|
|
248
|
+
export declare function clearStaleDaemonLock(pidPath: string, expectedDeadPid?: number, opts?: {
|
|
249
|
+
allowLivePid?: boolean;
|
|
250
|
+
}): boolean;
|
|
248
251
|
/**
|
|
249
252
|
* Probe whether `pid` is currently alive (signal-0). Treats EPERM as alive on
|
|
250
253
|
* every platform (the process exists, it's just not ours to signal) so we never
|
package/dist/mcp/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/mcp/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/daemon.js
CHANGED
|
@@ -616,17 +616,18 @@ function acquireLockViaExclusiveOpen(pidPath, info) {
|
|
|
616
616
|
return true;
|
|
617
617
|
}
|
|
618
618
|
/**
|
|
619
|
-
* Remove a stale pidfile
|
|
620
|
-
*
|
|
621
|
-
* daemon (re)acquired in the meantime.
|
|
619
|
+
* Remove a stale pidfile. Re-reads the file immediately before unlinking so a
|
|
620
|
+
* different daemon that acquired the lock in the meantime is never disturbed.
|
|
622
621
|
*
|
|
623
622
|
* must-fix 1 (issue #411 review): the original unconditionally `unlink`'d,
|
|
624
623
|
* which let a racing candidate delete a healthy daemon's lock. Passing
|
|
625
624
|
* `expectedDeadPid` (the pid the caller believed was dead) makes the clear a
|
|
626
|
-
* compare-and-delete: bail if the file now holds a different pid
|
|
627
|
-
* pid
|
|
625
|
+
* compare-and-delete: bail if the file now holds a different pid. By default a
|
|
626
|
+
* live pid is also preserved; `allowLivePid` is reserved for callers that have
|
|
627
|
+
* already disproved daemon identity with the socket hello (#1553). Returns true
|
|
628
|
+
* when the stale lock is gone (or was already gone).
|
|
628
629
|
*/
|
|
629
|
-
function clearStaleDaemonLock(pidPath, expectedDeadPid) {
|
|
630
|
+
function clearStaleDaemonLock(pidPath, expectedDeadPid, opts = {}) {
|
|
630
631
|
try {
|
|
631
632
|
const raw = fs.readFileSync(pidPath, 'utf8');
|
|
632
633
|
const info = (0, daemon_paths_1.decodeLockInfo)(raw);
|
|
@@ -634,8 +635,9 @@ function clearStaleDaemonLock(pidPath, expectedDeadPid) {
|
|
|
634
635
|
// A different pid took over since we read it — not ours to clear.
|
|
635
636
|
if (expectedDeadPid !== undefined && info.pid !== expectedDeadPid)
|
|
636
637
|
return false;
|
|
637
|
-
//
|
|
638
|
-
|
|
638
|
+
// PID liveness is normally sufficient. The takeover caller may override
|
|
639
|
+
// it only after a failed identity handshake proves PID reuse.
|
|
640
|
+
if (!opts.allowLivePid && info.pid > 0 && isProcessAlive(info.pid))
|
|
639
641
|
return false;
|
|
640
642
|
}
|
|
641
643
|
fs.unlinkSync(pidPath);
|