@fodx/codelens 2.2.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,6 +19,8 @@ Cursor, Gemini CLI, opencode, Codex CLI) or directly from the terminal.
19
19
  ranked alongside FTS5 + symbol-name matches.
20
20
  - **Fresh** — query tools auto-refresh changed files before answering, flag
21
21
  budget-limited stale results, and `cl_expand` always reads from disk.
22
+ - **Singleton runtime** — MCP entry processes for the same repo/worktree share
23
+ one local daemon, so one watcher/index coordinator serves many agent sessions.
22
24
  - **Compact** — returns ranked handles; expand only what you need.
23
25
  - **Durable** — saved contexts live in a separate DB and survive index rebuilds.
24
26
  - **Self-cleaning** — automatic TTL prunes inactive indexes.
@@ -27,7 +29,8 @@ Cursor, Gemini CLI, opencode, Codex CLI) or directly from the terminal.
27
29
 
28
30
  One command builds the tool, installs the `codelens` launcher, and wires the MCP
29
31
  server into detected agents/IDEs automatically (Claude Code, Cursor, Gemini CLI,
30
- opencode, Codex CLI). Requires Node.js ≥ 22.5.
32
+ opencode, Codex CLI). Requires Node.js ≥ 22.5. The package is published on
33
+ [npm as `@fodx/codelens`](https://www.npmjs.com/package/@fodx/codelens).
31
34
 
32
35
  **macOS / Linux:**
33
36
  ```bash
@@ -92,7 +95,10 @@ local) attaches to the active workspace via `--cwd ${workspaceFolder}`. Other
92
95
  hosts pin the concrete workspace path for local installs and rely on MCP Roots
93
96
  for global installs. Installed MCP configs default to `--auto-index missing`, so
94
97
  CodeLens starts a detached background index when a workspace/branch has no
95
- complete index yet; pass `--auto-index never` to disable.
98
+ complete index yet; pass `--auto-index never` to disable. For MCP usage,
99
+ default entry processes proxy to one local daemon per repo/worktree; that daemon
100
+ owns the file watcher and index coordinator, so multiple agent sessions do not
101
+ multiply watchers for the same checkout.
96
102
 
97
103
  **Routing instructions** are also written so the host prefers codelens tools for
98
104
  discovery over raw grep/read:
@@ -218,11 +224,13 @@ npm run eval:agent # deterministic with/without-CodeLens discovery proxy
218
224
  - **Auto-index is eager per branch** — installed MCP configs start a detached
219
225
  `--auto-index missing` build when a workspace/branch has no complete index.
220
226
  `cl_refresh` remains available for explicit rebuilds and is guarded against
221
- duplicating an active background index. The file watcher
222
- handles incremental freshness thereafter (cold index ~3.5s for 2000 files).
227
+ duplicating an active background index. A singleton repo/worktree daemon owns
228
+ the file watcher and handles incremental freshness thereafter (cold index
229
+ ~3.5s for 2000 files).
223
230
  - **Routing hooks are advisory** (soft nudges, not hard blocks) per the no-
224
231
  throttling design decision — raw reads remain allowed for editing/verification.
225
- - **npm package** — published on npm as `@fodx/codelens`; releases are
232
+ - **npm package** — published on npm as
233
+ [`@fodx/codelens`](https://www.npmjs.com/package/@fodx/codelens); releases are
226
234
  published automatically from `v*` git tags via the `publish` workflow. Use
227
235
  `npx -y @fodx/codelens` for manual MCP configuration. See
228
236
  `.github/workflows/publish.yml`.
@@ -0,0 +1,307 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
+ import { createConnection, createServer } from "node:net";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+ const DEFAULT_STALE_MS = 30_000;
8
+ function nowMs(opts) {
9
+ return opts?.now?.() ?? Date.now();
10
+ }
11
+ /** Stable daemon key: one daemon per real repo/worktree path. */
12
+ export function daemonKey(repoRoot) {
13
+ return createHash("sha256").update(repoRoot).digest("hex").slice(0, 32);
14
+ }
15
+ function daemonRoot(home) {
16
+ return join(home ?? homedir(), ".codelens", "daemons");
17
+ }
18
+ function daemonPathsForKey(key, home) {
19
+ const dir = join(daemonRoot(home), key);
20
+ const socketPath = process.platform === "win32"
21
+ ? `\\\\.\\pipe\\codelens-${key}`
22
+ : join(dir, "daemon.sock");
23
+ return {
24
+ key,
25
+ dir,
26
+ lockDir: join(dir, "lock"),
27
+ metadataPath: join(dir, "daemon.json"),
28
+ socketPath,
29
+ };
30
+ }
31
+ /** Runtime coordination files for a repo/worktree daemon. */
32
+ export function daemonPaths(repoRoot, opts) {
33
+ return daemonPathsForKey(daemonKey(repoRoot), opts?.home);
34
+ }
35
+ export function readDaemonMetadata(paths) {
36
+ try {
37
+ const parsed = JSON.parse(readFileSync(paths.metadataPath, "utf-8"));
38
+ if (parsed.key !== paths.key)
39
+ return null;
40
+ if (typeof parsed.repoRoot !== "string" || typeof parsed.socketPath !== "string")
41
+ return null;
42
+ if (typeof parsed.pid !== "number" || typeof parsed.startedAt !== "number" || typeof parsed.heartbeatAt !== "number")
43
+ return null;
44
+ return {
45
+ key: parsed.key,
46
+ repoRoot: parsed.repoRoot,
47
+ pid: parsed.pid,
48
+ startedAt: parsed.startedAt,
49
+ heartbeatAt: parsed.heartbeatAt,
50
+ socketPath: parsed.socketPath,
51
+ };
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ export function writeDaemonMetadata(paths, metadata) {
58
+ mkdirSync(paths.dir, { recursive: true });
59
+ writeFileSync(paths.metadataPath, JSON.stringify(metadata, null, 2) + "\n", "utf-8");
60
+ }
61
+ export function isProcessAlive(pid) {
62
+ if (!Number.isInteger(pid) || pid <= 0)
63
+ return false;
64
+ try {
65
+ process.kill(pid, 0);
66
+ return true;
67
+ }
68
+ catch (err) {
69
+ const code = err.code;
70
+ return code === "EPERM";
71
+ }
72
+ }
73
+ export function isDaemonStale(paths, opts) {
74
+ const metadata = readDaemonMetadata(paths);
75
+ if (!metadata)
76
+ return true;
77
+ if (!isProcessAlive(metadata.pid))
78
+ return true;
79
+ return nowMs(opts) - metadata.heartbeatAt > (opts?.staleMs ?? DEFAULT_STALE_MS);
80
+ }
81
+ export function cleanupDaemonState(paths) {
82
+ if (process.platform !== "win32")
83
+ rmSync(paths.socketPath, { force: true });
84
+ rmSync(paths.metadataPath, { force: true });
85
+ rmSync(paths.lockDir, { recursive: true, force: true });
86
+ }
87
+ export function cleanupStaleDaemon(paths, opts) {
88
+ if (!isDaemonStale(paths, opts))
89
+ return false;
90
+ cleanupDaemonState(paths);
91
+ return true;
92
+ }
93
+ function createMetadata(repoRoot, paths, pid, at) {
94
+ return {
95
+ key: paths.key,
96
+ repoRoot,
97
+ pid,
98
+ startedAt: at,
99
+ heartbeatAt: at,
100
+ socketPath: paths.socketPath,
101
+ };
102
+ }
103
+ function tryAcquireLock(repoRoot, paths, opts) {
104
+ try {
105
+ mkdirSync(paths.dir, { recursive: true });
106
+ mkdirSync(paths.lockDir);
107
+ }
108
+ catch (err) {
109
+ if (err.code === "EEXIST")
110
+ return null;
111
+ throw err;
112
+ }
113
+ const metadata = createMetadata(repoRoot, paths, opts?.pid ?? process.pid, nowMs(opts));
114
+ writeDaemonMetadata(paths, metadata);
115
+ return {
116
+ paths,
117
+ metadata,
118
+ heartbeat: () => {
119
+ metadata.heartbeatAt = Date.now();
120
+ writeDaemonMetadata(paths, metadata);
121
+ },
122
+ release: () => cleanupDaemonState(paths),
123
+ };
124
+ }
125
+ /** Acquire daemon ownership, reclaiming stale owner state once if needed. */
126
+ export function acquireDaemonLock(repoRoot, opts) {
127
+ const paths = daemonPaths(repoRoot, opts);
128
+ const first = tryAcquireLock(repoRoot, paths, opts);
129
+ if (first)
130
+ return first;
131
+ if (!cleanupStaleDaemon(paths, opts))
132
+ return null;
133
+ return tryAcquireLock(repoRoot, paths, opts);
134
+ }
135
+ function listDaemonPathEntries(home) {
136
+ try {
137
+ return readdirSync(daemonRoot(home), { withFileTypes: true })
138
+ .filter((entry) => entry.isDirectory())
139
+ .map((entry) => daemonPathsForKey(entry.name, home));
140
+ }
141
+ catch {
142
+ return [];
143
+ }
144
+ }
145
+ async function waitForProcessExit(pid, timeoutMs, pollMs) {
146
+ const start = Date.now();
147
+ while (Date.now() - start < timeoutMs) {
148
+ if (!isProcessAlive(pid))
149
+ return true;
150
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
151
+ }
152
+ return !isProcessAlive(pid);
153
+ }
154
+ /** Best-effort shutdown/cleanup for all known CodeLens daemon state. */
155
+ export async function shutdownAllDaemons(opts) {
156
+ const result = { scanned: 0, signaled: 0, stopped: 0, staleCleaned: 0, skippedCurrent: 0, failed: 0 };
157
+ const timeoutMs = opts?.timeoutMs ?? 2_000;
158
+ const pollMs = opts?.pollMs ?? 100;
159
+ const signal = opts?.signal ?? "SIGTERM";
160
+ for (const paths of listDaemonPathEntries(opts?.home)) {
161
+ result.scanned++;
162
+ const metadata = readDaemonMetadata(paths);
163
+ if (!metadata || !isProcessAlive(metadata.pid)) {
164
+ cleanupDaemonState(paths);
165
+ result.staleCleaned++;
166
+ continue;
167
+ }
168
+ if (metadata.pid === process.pid) {
169
+ result.skippedCurrent++;
170
+ continue;
171
+ }
172
+ try {
173
+ process.kill(metadata.pid, signal);
174
+ result.signaled++;
175
+ }
176
+ catch {
177
+ if (!isProcessAlive(metadata.pid)) {
178
+ cleanupDaemonState(paths);
179
+ result.staleCleaned++;
180
+ }
181
+ else {
182
+ result.failed++;
183
+ }
184
+ continue;
185
+ }
186
+ if (await waitForProcessExit(metadata.pid, timeoutMs, pollMs)) {
187
+ cleanupDaemonState(paths);
188
+ result.stopped++;
189
+ }
190
+ else {
191
+ result.failed++;
192
+ }
193
+ }
194
+ return result;
195
+ }
196
+ /** Listen for local daemon clients on the repo/worktree socket. */
197
+ export async function startDaemonSocketServer(paths, onConnection, opts) {
198
+ if (process.platform !== "win32")
199
+ rmSync(paths.socketPath, { force: true });
200
+ mkdirSync(paths.dir, { recursive: true });
201
+ const sockets = new Set();
202
+ let idleTimer = null;
203
+ const clearIdleTimer = () => {
204
+ if (!idleTimer)
205
+ return;
206
+ clearTimeout(idleTimer);
207
+ idleTimer = null;
208
+ };
209
+ const scheduleIdle = () => {
210
+ if (!opts?.onIdle || sockets.size > 0)
211
+ return;
212
+ clearIdleTimer();
213
+ idleTimer = setTimeout(() => {
214
+ idleTimer = null;
215
+ void Promise.resolve(opts.onIdle?.()).catch(() => { });
216
+ }, opts.idleMs ?? 30_000);
217
+ };
218
+ const server = createServer((socket) => {
219
+ clearIdleTimer();
220
+ sockets.add(socket);
221
+ socket.once("close", () => {
222
+ sockets.delete(socket);
223
+ scheduleIdle();
224
+ });
225
+ void Promise.resolve(onConnection(socket)).catch(() => socket.destroy());
226
+ });
227
+ await new Promise((resolve, reject) => {
228
+ const onError = (err) => {
229
+ server.off("listening", onListening);
230
+ reject(err);
231
+ };
232
+ const onListening = () => {
233
+ server.off("error", onError);
234
+ resolve();
235
+ };
236
+ server.once("error", onError);
237
+ server.once("listening", onListening);
238
+ server.listen(paths.socketPath);
239
+ });
240
+ scheduleIdle();
241
+ return {
242
+ activeConnections: () => sockets.size,
243
+ close: () => new Promise((resolve, reject) => {
244
+ clearIdleTimer();
245
+ for (const socket of sockets)
246
+ socket.destroy();
247
+ server.close((err) => {
248
+ if (err)
249
+ reject(err);
250
+ else
251
+ resolve();
252
+ });
253
+ }),
254
+ };
255
+ }
256
+ function connectDaemonSocket(paths) {
257
+ return new Promise((resolve, reject) => {
258
+ const socket = createConnection(paths.socketPath);
259
+ socket.once("connect", () => resolve(socket));
260
+ socket.once("error", (err) => {
261
+ socket.destroy();
262
+ reject(err);
263
+ });
264
+ });
265
+ }
266
+ async function waitForDaemonSocket(paths, timeoutMs) {
267
+ const start = Date.now();
268
+ let lastError;
269
+ while (Date.now() - start < timeoutMs) {
270
+ try {
271
+ return await connectDaemonSocket(paths);
272
+ }
273
+ catch (err) {
274
+ lastError = err;
275
+ await new Promise((resolve) => setTimeout(resolve, 100));
276
+ }
277
+ }
278
+ throw lastError instanceof Error ? lastError : new Error(`timed out waiting for daemon socket ${paths.socketPath}`);
279
+ }
280
+ /** Connect to an existing daemon, or spawn one and wait for its socket. */
281
+ export async function connectOrStartDaemon(repoRoot, opts) {
282
+ const paths = daemonPaths(repoRoot);
283
+ try {
284
+ return await connectDaemonSocket(paths);
285
+ }
286
+ catch {
287
+ // No reachable daemon yet; check for stale owner state below.
288
+ }
289
+ cleanupStaleDaemon(paths);
290
+ try {
291
+ return await connectDaemonSocket(paths);
292
+ }
293
+ catch {
294
+ // Still no reachable daemon; spawn below.
295
+ }
296
+ const args = [opts.serverJs, "--cwd", repoRoot, "--daemon"];
297
+ if (opts.autoIndex)
298
+ args.splice(3, 0, "--auto-index", opts.autoIndex);
299
+ const child = spawn(process.execPath, args, {
300
+ detached: true,
301
+ stdio: "ignore",
302
+ env: opts.env ?? process.env,
303
+ });
304
+ child.unref();
305
+ return await waitForDaemonSocket(paths, opts.timeoutMs ?? 10_000);
306
+ }
307
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/runtime/daemon.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ import { registerWatcher } from "./index/reindex.js";
16
16
  import { VERSION } from "./version.js";
17
17
  import { detectScope } from "./git/scope.js";
18
18
  import { parseCwdArg, resolveCwd, isUsableCwd } from "./runtime/root.js";
19
+ import { acquireDaemonLock, connectOrStartDaemon, startDaemonSocketServer } from "./runtime/daemon.js";
19
20
  import { createHash } from "node:crypto";
20
21
  import { mkdirSync, rmSync } from "node:fs";
21
22
  import { homedir } from "node:os";
@@ -71,50 +72,25 @@ function repoRootFromCwd(cwd) {
71
72
  return resolveCwd(cwd);
72
73
  }
73
74
  const CLI_COMMANDS = new Set(["current", "index", "refresh", "search", "related", "stats", "usage", "doctor", "install", "uninstall", "upgrade", "version", "--print-config", "-v", "--version", "--help", "-h"]);
74
- export async function main() {
75
- // CLI dispatch: if the first arg is a known subcommand (bare word like
76
- // `install` or a flag-style one like `--print-config`/`--version`), run the
77
- // CLI with the FULL arg list so --target/--command/--yes are preserved.
78
- // Otherwise start the MCP stdio server.
79
- const parsed = parseCwdArg(process.argv.slice(2));
80
- const fullArgs = parsed.args;
81
- const head = fullArgs[0];
82
- if (head && CLI_COMMANDS.has(head)) {
83
- const code = await cli(process.argv.slice(2));
84
- process.exit(code);
85
- return;
86
- }
87
- // Smoke mode: register tools against an in-memory context and print names.
88
- if (process.argv.includes("--smoke")) {
89
- const ctx = { coreDb: openMemoryDb(), ctxDb: openMemoryContextDb(), repoRoot: "/tmp" };
90
- const server = createServer(ctx);
91
- void server;
92
- console.log(JSON.stringify({ ok: true, tools: TOOLS.map((t) => t.name) }));
93
- return;
94
- }
95
- const initialRoot = repoRootFromCwd(parsed.cwd);
75
+ function createRuntimeController(initialRoot, opts) {
96
76
  const runtime = openRuntime(initialRoot);
97
77
  const ctx = runtime.ctx;
98
78
  let watcher = runtime.watcher;
99
79
  let stopPrune = runtime.stopPrune;
100
- // Only treat root resolution as settled when an explicit, usable --cwd was
101
- // given. If --cwd was missing/unusable (e.g. unexpanded ${workspaceFolder}),
102
- // we fell back to process.cwd() and should still query MCP Roots.
103
- let rootsChecked = isUsableCwd(parsed.cwd);
80
+ let rootsChecked = opts.rootsChecked;
104
81
  const serverRef = {};
105
- const autoIndexMode = normalizeAutoIndexMode(parsed.autoIndex, "missing");
106
82
  let autoIndexTriggeredFor = null;
107
83
  function activateReadyIndex(scope) {
108
84
  activatePersistentIndexIfReady(ctx.coreDb, scope);
109
85
  }
110
86
  function checkAndTriggerAutoIndex(scope) {
111
- if (!rootsChecked || autoIndexMode === "never" || !ctx.repoRoot)
87
+ if (!rootsChecked || opts.autoIndexMode === "never" || !ctx.repoRoot)
112
88
  return;
113
89
  const indexId = computeIndexId(scope);
114
90
  if (autoIndexTriggeredFor === indexId)
115
91
  return;
116
92
  activateReadyIndex(scope);
117
- const shouldIndex = autoIndexMode === "always" || (autoIndexMode === "missing" && !hasPersistentIndex(ctx.coreDb, scope));
93
+ const shouldIndex = opts.autoIndexMode === "always" || (opts.autoIndexMode === "missing" && !hasPersistentIndex(ctx.coreDb, scope));
118
94
  if (!shouldIndex)
119
95
  return;
120
96
  autoIndexTriggeredFor = indexId;
@@ -155,24 +131,143 @@ export async function main() {
155
131
  activateReadyIndex(scope);
156
132
  checkAndTriggerAutoIndex(scope);
157
133
  }
158
- async function beforeTool() {
159
- await settleRootAndTriggerAutoIndex();
160
- }
161
- const server = createServer(ctx, beforeTool);
162
- serverRef.current = server;
134
+ return {
135
+ ctx,
136
+ bindServer(server) { serverRef.current = server; },
137
+ beforeTool: settleRootAndTriggerAutoIndex,
138
+ settleRootAndTriggerAutoIndex,
139
+ rootsSettled: () => rootsChecked,
140
+ close: () => {
141
+ try {
142
+ watcher.stop();
143
+ }
144
+ catch { /* ignore */ }
145
+ try {
146
+ registerWatcher(null);
147
+ }
148
+ catch { /* ignore */ }
149
+ try {
150
+ stopPrune();
151
+ }
152
+ catch { /* ignore */ }
153
+ try {
154
+ ctx.coreDb.close();
155
+ }
156
+ catch { /* ignore */ }
157
+ try {
158
+ ctx.ctxDb.close();
159
+ }
160
+ catch { /* ignore */ }
161
+ },
162
+ };
163
+ }
164
+ async function startDirectMcpServer(parsed) {
165
+ const controller = createRuntimeController(repoRootFromCwd(parsed.cwd), {
166
+ rootsChecked: isUsableCwd(parsed.cwd),
167
+ autoIndexMode: normalizeAutoIndexMode(parsed.autoIndex, "missing"),
168
+ });
169
+ const server = createServer(controller.ctx, controller.beforeTool);
170
+ controller.bindServer(server);
163
171
  const transport = new StdioServerTransport();
164
172
  await server.connect(transport);
165
173
  // Explicit --cwd roots (Cursor's ${workspaceFolder}) are ready immediately;
166
174
  // roots-only clients may need initialize to complete first, so retry briefly.
167
175
  void (async () => {
168
176
  for (let i = 0; i < 10; i++) {
169
- await settleRootAndTriggerAutoIndex();
170
- if (rootsChecked)
177
+ await controller.settleRootAndTriggerAutoIndex();
178
+ if (controller.rootsSettled())
171
179
  break;
172
180
  await new Promise((resolve) => setTimeout(resolve, 100));
173
181
  }
174
182
  })();
175
183
  }
184
+ async function proxyStdioToDaemon(socket) {
185
+ await new Promise((resolve) => {
186
+ socket.once("close", resolve);
187
+ socket.once("end", resolve);
188
+ socket.once("error", resolve);
189
+ process.stdin.once("end", () => socket.end());
190
+ process.stdin.once("close", () => socket.end());
191
+ process.stdin.pipe(socket);
192
+ socket.pipe(process.stdout);
193
+ });
194
+ }
195
+ async function startProxyMcpServer(parsed) {
196
+ const repoRoot = repoRootFromCwd(parsed.cwd);
197
+ if (!isUsableCwd(parsed.cwd) && !detectScope(repoRoot)) {
198
+ await startDirectMcpServer(parsed);
199
+ return;
200
+ }
201
+ const socket = await connectOrStartDaemon(repoRoot, {
202
+ autoIndex: parsed.autoIndex,
203
+ serverJs: fileURLToPath(import.meta.url),
204
+ });
205
+ await proxyStdioToDaemon(socket);
206
+ }
207
+ async function startDaemon(parsed) {
208
+ const repoRoot = repoRootFromCwd(parsed.cwd);
209
+ const lock = acquireDaemonLock(repoRoot);
210
+ if (!lock)
211
+ throw new Error(`codelens daemon already running for ${repoRoot}`);
212
+ const daemonLock = lock;
213
+ const heartbeatMs = Number.parseInt(process.env.CODELENS_DAEMON_HEARTBEAT_MS ?? "5000", 10);
214
+ const idleMs = Number.parseInt(process.env.CODELENS_DAEMON_IDLE_MS ?? "30000", 10);
215
+ const heartbeat = setInterval(() => daemonLock.heartbeat(), Number.isFinite(heartbeatMs) ? heartbeatMs : 5000);
216
+ const controller = createRuntimeController(repoRoot, {
217
+ rootsChecked: true,
218
+ autoIndexMode: normalizeAutoIndexMode(parsed.autoIndex, "missing"),
219
+ });
220
+ let socketServer = null;
221
+ async function cleanup() {
222
+ clearInterval(heartbeat);
223
+ try {
224
+ await socketServer?.close();
225
+ }
226
+ catch { /* ignore */ }
227
+ controller.close();
228
+ daemonLock.release();
229
+ }
230
+ function shutdown() {
231
+ void cleanup().finally(() => process.exit(0));
232
+ }
233
+ process.once("SIGTERM", shutdown);
234
+ process.once("SIGINT", shutdown);
235
+ process.once("exit", () => { daemonLock.release(); });
236
+ socketServer = await startDaemonSocketServer(daemonLock.paths, async (socket) => {
237
+ const server = createServer(controller.ctx, controller.beforeTool);
238
+ controller.bindServer(server);
239
+ const transport = new StdioServerTransport(socket, socket);
240
+ await server.connect(transport);
241
+ }, { idleMs: Number.isFinite(idleMs) ? idleMs : 30000, onIdle: shutdown });
242
+ await controller.settleRootAndTriggerAutoIndex();
243
+ }
244
+ export async function main() {
245
+ // CLI dispatch: if the first arg is a known subcommand (bare word like
246
+ // `install` or a flag-style one like `--print-config`/`--version`), run the
247
+ // CLI with the FULL arg list so --target/--command/--yes are preserved.
248
+ // Otherwise start the MCP stdio server.
249
+ const parsed = parseCwdArg(process.argv.slice(2));
250
+ const fullArgs = parsed.args;
251
+ const head = fullArgs[0];
252
+ if (head && CLI_COMMANDS.has(head)) {
253
+ const code = await cli(process.argv.slice(2));
254
+ process.exit(code);
255
+ return;
256
+ }
257
+ // Smoke mode: register tools against an in-memory context and print names.
258
+ if (process.argv.includes("--smoke")) {
259
+ const ctx = { coreDb: openMemoryDb(), ctxDb: openMemoryContextDb(), repoRoot: "/tmp" };
260
+ const server = createServer(ctx);
261
+ void server;
262
+ console.log(JSON.stringify({ ok: true, tools: TOOLS.map((t) => t.name) }));
263
+ return;
264
+ }
265
+ if (head === "--daemon") {
266
+ await startDaemon(parsed);
267
+ return;
268
+ }
269
+ await startProxyMcpServer(parsed);
270
+ }
176
271
  function openRuntime(repoRoot) {
177
272
  let coreDb;
178
273
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAsB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAChJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClI,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;GAMG;AAEH,SAAS,YAAY,CAAC,GAAkB,EAAE,UAAgC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAErE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,IAAI,UAAU;oBAAE,MAAM,UAAU,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAA+B,CAAC,CAAC;gBACxE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,aAAiC,CAAC;gBACtC,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;wBACnC,IAAI,OAAO;4BAAE,aAAa,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBACjI,CAAC;oBAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,CAAC;gBACD,IAAI,CAAC;oBAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBAC9I,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1E,IAAI,CAAC;oBAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBAC9H,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvE,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,SAAS,EAAC,gBAAgB,EAAC,IAAI,EAAC,WAAW,EAAC,QAAQ,EAAC,IAAI,CAAC,CAAC,CAAC;AAWlM,SAAS,uBAAuB,CAC9B,WAAmB,EACnB,IAAyF;IAEzF,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,GAAG,GAAkB,OAAO,CAAC,GAAG,CAAC;IACvC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC9B,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,IAAI,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACrC,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,IAAI,qBAAqB,GAAkB,IAAI,CAAC;IAEhD,SAAS,kBAAkB,CAAC,KAAe;QACzC,8BAA8B,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,SAAS,wBAAwB,CAAC,KAAe;QAC/C,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,OAAO;QAE7E,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,qBAAqB,KAAK,OAAO;YAAE,OAAO;QAC9C,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACpI,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,qBAAqB,GAAG,OAAO,CAAC;QAChC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,QAAgB;QACxC,IAAI,QAAQ,KAAK,GAAG,CAAC,QAAQ;YAAE,OAAO;QACtC,4EAA4E;QAC5E,uEAAuE;QACvE,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACjC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAC7B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,UAAU,kBAAkB;QAC/B,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAC/C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACtE,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,YAAY,GAAG,IAAI,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,IAAI;YAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,UAAU,6BAA6B;QAC1C,MAAM,kBAAkB,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,GAAG;QACH,UAAU,CAAC,MAAiB,IAAU,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;QACnE,UAAU,EAAE,6BAA6B;QACzC,6BAA6B;QAC7B,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY;QAChC,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC;gBAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,CAAC;gBAAC,SAAS,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC;gBAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAAsC;IACxE,MAAM,UAAU,GAAG,uBAAuB,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QACtE,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;QACrC,aAAa,EAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC;KACnE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACnE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,4EAA4E;IAC5E,8EAA8E;IAC9E,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,UAAU,CAAC,6BAA6B,EAAE,CAAC;YACjD,IAAI,UAAU,CAAC,YAAY,EAAE;gBAAE,MAAM;YACrC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAA8B;IAC9D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,MAAsC;IACvE,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE;QAClD,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsC;IAC/D,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,IAAI,CAAC;IAExB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/G,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,EAAE;QACnD,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC;KACnE,CAAC,CAAC;IACH,IAAI,YAAY,GAA+D,IAAI,CAAC;IAEpF,KAAK,UAAU,OAAO;QACpB,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC;YAAC,MAAM,YAAY,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC3D,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,UAAU,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,QAAQ;QACf,KAAK,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,YAAY,GAAG,MAAM,uBAAuB,CAC1C,UAAU,CAAC,KAAK,EAChB,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QACnE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,EACD,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CACvE,CAAC;IAEF,MAAM,UAAU,CAAC,6BAA6B,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,uEAAuE;IACvE,4EAA4E;IAC5E,wEAAwE;IACxE,wCAAwC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,GAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACtG,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,+EAA+E;YAC/E,IAAI,CAAC;gBAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC3D,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IAC/C,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,SAAS;YAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,WAAW,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACpD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,8 +1,11 @@
1
1
  import { spawnSync } from "node:child_process";
2
- import { existsSync, readFileSync } from "node:fs";
2
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
3
3
  import { homedir } from "node:os";
4
4
  import { join, dirname } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
+ import { openDb } from "./db/db.js";
7
+ import { pruneIndexes } from "./index/ttl.js";
8
+ import { shutdownAllDaemons } from "./runtime/daemon.js";
6
9
  import { VERSION } from "./version.js";
7
10
  /**
8
11
  * Upgrade check + perform (mirrors codegraph's `upgrade --check` / `upgrade`).
@@ -54,6 +57,35 @@ export async function checkUpgrade() {
54
57
  const behind = git(root, ["rev-list", "--count", `HEAD..origin/${branch}`]).stdout;
55
58
  return { upToDate: false, message: `codelens ${VERSION}: update available (${behind} commit(s) behind origin/${branch}). Run \`codelens upgrade\` to update.`, local, remote };
56
59
  }
60
+ export function pruneInstalledIndexes(home = homedir()) {
61
+ const dir = join(home, ".codelens", "indexes");
62
+ const result = { scannedDbs: 0, deletedIndexes: 0, failedDbs: 0 };
63
+ let entries;
64
+ try {
65
+ entries = readdirSync(dir).filter((entry) => entry.endsWith(".db"));
66
+ }
67
+ catch {
68
+ return result;
69
+ }
70
+ for (const entry of entries) {
71
+ result.scannedDbs++;
72
+ let db = null;
73
+ try {
74
+ db = openDb(join(dir, entry));
75
+ result.deletedIndexes += pruneIndexes(db).deletedIndexes.length;
76
+ }
77
+ catch {
78
+ result.failedDbs++;
79
+ }
80
+ finally {
81
+ try {
82
+ db?.close();
83
+ }
84
+ catch { /* ignore */ }
85
+ }
86
+ }
87
+ return result;
88
+ }
57
89
  /** Read the version from the (freshly pulled/built) app package.json. */
58
90
  export function readRootVersion(root) {
59
91
  try {
@@ -90,6 +122,8 @@ export async function performUpgrade(_version) {
90
122
  return { ok: false, message: "could not locate the install dir; re-run the installer script." };
91
123
  if (!existsSync(join(root, ".git")))
92
124
  return { ok: false, message: "not a git checkout; re-run the installer script to update." };
125
+ const daemonCleanup = await shutdownAllDaemons();
126
+ const indexPrune = pruneInstalledIndexes();
93
127
  const branch = git(root, ["rev-parse", "--abbrev-ref", "HEAD"]).stdout || "main";
94
128
  const pull = git(root, ["pull", "--ff-only", "origin", branch]);
95
129
  if (!pull.ok)
@@ -105,9 +139,11 @@ export async function performUpgrade(_version) {
105
139
  const refreshNote = refresh.ok
106
140
  ? "Refreshed global agent config + routing."
107
141
  : `Could not auto-refresh agent config (${refresh.detail}); run \`codelens install --target all --yes\`.`;
142
+ const daemonNote = `Daemon cleanup: scanned ${daemonCleanup.scanned}, signaled ${daemonCleanup.signaled}, stopped ${daemonCleanup.stopped}, stale cleaned ${daemonCleanup.staleCleaned}${daemonCleanup.failed ? `, failed ${daemonCleanup.failed}` : ""}.`;
143
+ const pruneNote = `Index prune: scanned ${indexPrune.scannedDbs} DBs, deleted ${indexPrune.deletedIndexes} expired indexes${indexPrune.failedDbs ? `, failed ${indexPrune.failedDbs} DBs` : ""}.`;
108
144
  return {
109
145
  ok: true,
110
- message: `upgraded to ${newVersion} (pulled origin/${branch}, rebuilt). ${refreshNote} Restart your agent(s) to pick up the new build (Cursor's global config attaches to the workspace via \${workspaceFolder}).`,
146
+ message: `upgraded to ${newVersion} (pulled origin/${branch}, rebuilt). ${daemonNote} ${pruneNote} ${refreshNote} Restart your agent(s) to pick up the new build (Cursor's global config attaches to the workspace via \${workspaceFolder}).`,
111
147
  };
112
148
  }
113
149
  //# sourceMappingURL=upgrade.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fodx/codelens",
3
- "version": "2.2.2",
3
+ "version": "2.3.0",
4
4
  "description": "Local, branch-aware code search & relation graph. SQLite FTS5 + tree-sitter symbols + source-graph edges, exposed as an MCP server and CLI. No chat LLM required.",
5
5
  "license": "MIT",
6
6
  "type": "module",