@cstart/coldstart 2.0.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 +236 -0
- package/dist/cache/disk-cache.d.ts +14 -0
- package/dist/cache/disk-cache.d.ts.map +1 -0
- package/dist/cache/disk-cache.js +371 -0
- package/dist/cache/disk-cache.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +206 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +111 -0
- package/dist/constants.js.map +1 -0
- package/dist/daemon-lock.d.ts +63 -0
- package/dist/daemon-lock.d.ts.map +1 -0
- package/dist/daemon-lock.js +218 -0
- package/dist/daemon-lock.js.map +1 -0
- package/dist/daemon-log.d.ts +26 -0
- package/dist/daemon-log.d.ts.map +1 -0
- package/dist/daemon-log.js +110 -0
- package/dist/daemon-log.js.map +1 -0
- package/dist/index-manager.d.ts +103 -0
- package/dist/index-manager.d.ts.map +1 -0
- package/dist/index-manager.js +361 -0
- package/dist/index-manager.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +724 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/content-tokens.d.ts +74 -0
- package/dist/indexer/content-tokens.d.ts.map +1 -0
- package/dist/indexer/content-tokens.js +406 -0
- package/dist/indexer/content-tokens.js.map +1 -0
- package/dist/indexer/cpp-include-roots.d.ts +7 -0
- package/dist/indexer/cpp-include-roots.d.ts.map +1 -0
- package/dist/indexer/cpp-include-roots.js +166 -0
- package/dist/indexer/cpp-include-roots.js.map +1 -0
- package/dist/indexer/csharp-synthetic.d.ts +9 -0
- package/dist/indexer/csharp-synthetic.d.ts.map +1 -0
- package/dist/indexer/csharp-synthetic.js +51 -0
- package/dist/indexer/csharp-synthetic.js.map +1 -0
- package/dist/indexer/django-synthetic.d.ts +12 -0
- package/dist/indexer/django-synthetic.d.ts.map +1 -0
- package/dist/indexer/django-synthetic.js +49 -0
- package/dist/indexer/django-synthetic.js.map +1 -0
- package/dist/indexer/extractors/angularjs.d.ts +16 -0
- package/dist/indexer/extractors/angularjs.d.ts.map +1 -0
- package/dist/indexer/extractors/angularjs.js +49 -0
- package/dist/indexer/extractors/angularjs.js.map +1 -0
- package/dist/indexer/extractors/cpp.d.ts +9 -0
- package/dist/indexer/extractors/cpp.d.ts.map +1 -0
- package/dist/indexer/extractors/cpp.js +254 -0
- package/dist/indexer/extractors/cpp.js.map +1 -0
- package/dist/indexer/extractors/csharp.d.ts +19 -0
- package/dist/indexer/extractors/csharp.d.ts.map +1 -0
- package/dist/indexer/extractors/csharp.js +327 -0
- package/dist/indexer/extractors/csharp.js.map +1 -0
- package/dist/indexer/extractors/env.d.ts +9 -0
- package/dist/indexer/extractors/env.d.ts.map +1 -0
- package/dist/indexer/extractors/env.js +43 -0
- package/dist/indexer/extractors/env.js.map +1 -0
- package/dist/indexer/extractors/go.d.ts +9 -0
- package/dist/indexer/extractors/go.d.ts.map +1 -0
- package/dist/indexer/extractors/go.js +227 -0
- package/dist/indexer/extractors/go.js.map +1 -0
- package/dist/indexer/extractors/graphql.d.ts +22 -0
- package/dist/indexer/extractors/graphql.d.ts.map +1 -0
- package/dist/indexer/extractors/graphql.js +88 -0
- package/dist/indexer/extractors/graphql.js.map +1 -0
- package/dist/indexer/extractors/groovy.d.ts +9 -0
- package/dist/indexer/extractors/groovy.d.ts.map +1 -0
- package/dist/indexer/extractors/groovy.js +356 -0
- package/dist/indexer/extractors/groovy.js.map +1 -0
- package/dist/indexer/extractors/java.d.ts +10 -0
- package/dist/indexer/extractors/java.d.ts.map +1 -0
- package/dist/indexer/extractors/java.js +586 -0
- package/dist/indexer/extractors/java.js.map +1 -0
- package/dist/indexer/extractors/kotlin.d.ts +10 -0
- package/dist/indexer/extractors/kotlin.d.ts.map +1 -0
- package/dist/indexer/extractors/kotlin.js +398 -0
- package/dist/indexer/extractors/kotlin.js.map +1 -0
- package/dist/indexer/extractors/node-helpers.d.ts +13 -0
- package/dist/indexer/extractors/node-helpers.d.ts.map +1 -0
- package/dist/indexer/extractors/node-helpers.js +17 -0
- package/dist/indexer/extractors/node-helpers.js.map +1 -0
- package/dist/indexer/extractors/parser-factory.d.ts +4 -0
- package/dist/indexer/extractors/parser-factory.d.ts.map +1 -0
- package/dist/indexer/extractors/parser-factory.js +28 -0
- package/dist/indexer/extractors/parser-factory.js.map +1 -0
- package/dist/indexer/extractors/php.d.ts +17 -0
- package/dist/indexer/extractors/php.d.ts.map +1 -0
- package/dist/indexer/extractors/php.js +363 -0
- package/dist/indexer/extractors/php.js.map +1 -0
- package/dist/indexer/extractors/python.d.ts +14 -0
- package/dist/indexer/extractors/python.d.ts.map +1 -0
- package/dist/indexer/extractors/python.js +449 -0
- package/dist/indexer/extractors/python.js.map +1 -0
- package/dist/indexer/extractors/ruby.d.ts +10 -0
- package/dist/indexer/extractors/ruby.d.ts.map +1 -0
- package/dist/indexer/extractors/ruby.js +996 -0
- package/dist/indexer/extractors/ruby.js.map +1 -0
- package/dist/indexer/extractors/rust.d.ts +9 -0
- package/dist/indexer/extractors/rust.d.ts.map +1 -0
- package/dist/indexer/extractors/rust.js +322 -0
- package/dist/indexer/extractors/rust.js.map +1 -0
- package/dist/indexer/extractors/toml.d.ts +9 -0
- package/dist/indexer/extractors/toml.d.ts.map +1 -0
- package/dist/indexer/extractors/toml.js +84 -0
- package/dist/indexer/extractors/toml.js.map +1 -0
- package/dist/indexer/extractors/xml.d.ts +9 -0
- package/dist/indexer/extractors/xml.d.ts.map +1 -0
- package/dist/indexer/extractors/xml.js +163 -0
- package/dist/indexer/extractors/xml.js.map +1 -0
- package/dist/indexer/extractors/yaml.d.ts +9 -0
- package/dist/indexer/extractors/yaml.d.ts.map +1 -0
- package/dist/indexer/extractors/yaml.js +117 -0
- package/dist/indexer/extractors/yaml.js.map +1 -0
- package/dist/indexer/git.d.ts +19 -0
- package/dist/indexer/git.d.ts.map +1 -0
- package/dist/indexer/git.js +55 -0
- package/dist/indexer/git.js.map +1 -0
- package/dist/indexer/graph.d.ts +7 -0
- package/dist/indexer/graph.d.ts.map +1 -0
- package/dist/indexer/graph.js +20 -0
- package/dist/indexer/graph.js.map +1 -0
- package/dist/indexer/indexed-file.d.ts +15 -0
- package/dist/indexer/indexed-file.d.ts.map +1 -0
- package/dist/indexer/indexed-file.js +50 -0
- package/dist/indexer/indexed-file.js.map +1 -0
- package/dist/indexer/invariants.d.ts +15 -0
- package/dist/indexer/invariants.d.ts.map +1 -0
- package/dist/indexer/invariants.js +96 -0
- package/dist/indexer/invariants.js.map +1 -0
- package/dist/indexer/laravel-synthetic.d.ts +10 -0
- package/dist/indexer/laravel-synthetic.d.ts.map +1 -0
- package/dist/indexer/laravel-synthetic.js +78 -0
- package/dist/indexer/laravel-synthetic.js.map +1 -0
- package/dist/indexer/parser.d.ts +4 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +499 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/patch.d.ts +3 -0
- package/dist/indexer/patch.d.ts.map +1 -0
- package/dist/indexer/patch.js +291 -0
- package/dist/indexer/patch.js.map +1 -0
- package/dist/indexer/rails-synthetic.d.ts +11 -0
- package/dist/indexer/rails-synthetic.d.ts.map +1 -0
- package/dist/indexer/rails-synthetic.js +80 -0
- package/dist/indexer/rails-synthetic.js.map +1 -0
- package/dist/indexer/reconcile.d.ts +9 -0
- package/dist/indexer/reconcile.d.ts.map +1 -0
- package/dist/indexer/reconcile.js +96 -0
- package/dist/indexer/reconcile.js.map +1 -0
- package/dist/indexer/resolvers/cpp.d.ts +15 -0
- package/dist/indexer/resolvers/cpp.d.ts.map +1 -0
- package/dist/indexer/resolvers/cpp.js +35 -0
- package/dist/indexer/resolvers/cpp.js.map +1 -0
- package/dist/indexer/resolvers/csharp.d.ts +2 -0
- package/dist/indexer/resolvers/csharp.d.ts.map +1 -0
- package/dist/indexer/resolvers/csharp.js +89 -0
- package/dist/indexer/resolvers/csharp.js.map +1 -0
- package/dist/indexer/resolvers/generic.d.ts +10 -0
- package/dist/indexer/resolvers/generic.d.ts.map +1 -0
- package/dist/indexer/resolvers/generic.js +35 -0
- package/dist/indexer/resolvers/generic.js.map +1 -0
- package/dist/indexer/resolvers/go.d.ts +2 -0
- package/dist/indexer/resolvers/go.d.ts.map +1 -0
- package/dist/indexer/resolvers/go.js +171 -0
- package/dist/indexer/resolvers/go.js.map +1 -0
- package/dist/indexer/resolvers/index.d.ts +26 -0
- package/dist/indexer/resolvers/index.d.ts.map +1 -0
- package/dist/indexer/resolvers/index.js +301 -0
- package/dist/indexer/resolvers/index.js.map +1 -0
- package/dist/indexer/resolvers/java.d.ts +17 -0
- package/dist/indexer/resolvers/java.d.ts.map +1 -0
- package/dist/indexer/resolvers/java.js +104 -0
- package/dist/indexer/resolvers/java.js.map +1 -0
- package/dist/indexer/resolvers/php.d.ts +2 -0
- package/dist/indexer/resolvers/php.d.ts.map +1 -0
- package/dist/indexer/resolvers/php.js +108 -0
- package/dist/indexer/resolvers/php.js.map +1 -0
- package/dist/indexer/resolvers/python.d.ts +17 -0
- package/dist/indexer/resolvers/python.d.ts.map +1 -0
- package/dist/indexer/resolvers/python.js +63 -0
- package/dist/indexer/resolvers/python.js.map +1 -0
- package/dist/indexer/resolvers/ruby.d.ts +13 -0
- package/dist/indexer/resolvers/ruby.d.ts.map +1 -0
- package/dist/indexer/resolvers/ruby.js +199 -0
- package/dist/indexer/resolvers/ruby.js.map +1 -0
- package/dist/indexer/resolvers/rust.d.ts +12 -0
- package/dist/indexer/resolvers/rust.d.ts.map +1 -0
- package/dist/indexer/resolvers/rust.js +61 -0
- package/dist/indexer/resolvers/rust.js.map +1 -0
- package/dist/indexer/resolvers/shared.d.ts +18 -0
- package/dist/indexer/resolvers/shared.d.ts.map +1 -0
- package/dist/indexer/resolvers/shared.js +71 -0
- package/dist/indexer/resolvers/shared.js.map +1 -0
- package/dist/indexer/rust-workspace.d.ts +25 -0
- package/dist/indexer/rust-workspace.d.ts.map +1 -0
- package/dist/indexer/rust-workspace.js +155 -0
- package/dist/indexer/rust-workspace.js.map +1 -0
- package/dist/indexer/symbol-edges.d.ts +19 -0
- package/dist/indexer/symbol-edges.d.ts.map +1 -0
- package/dist/indexer/symbol-edges.js +117 -0
- package/dist/indexer/symbol-edges.js.map +1 -0
- package/dist/indexer/tokenize.d.ts +26 -0
- package/dist/indexer/tokenize.d.ts.map +1 -0
- package/dist/indexer/tokenize.js +200 -0
- package/dist/indexer/tokenize.js.map +1 -0
- package/dist/indexer/ts-parser.d.ts +10 -0
- package/dist/indexer/ts-parser.d.ts.map +1 -0
- package/dist/indexer/ts-parser.js +605 -0
- package/dist/indexer/ts-parser.js.map +1 -0
- package/dist/indexer/walker.d.ts +9 -0
- package/dist/indexer/walker.d.ts.map +1 -0
- package/dist/indexer/walker.js +91 -0
- package/dist/indexer/walker.js.map +1 -0
- package/dist/init.d.ts +111 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +787 -0
- package/dist/init.js.map +1 -0
- package/dist/kb/cli.d.ts +2 -0
- package/dist/kb/cli.d.ts.map +1 -0
- package/dist/kb/cli.js +377 -0
- package/dist/kb/cli.js.map +1 -0
- package/dist/kb/commit.d.ts +6 -0
- package/dist/kb/commit.d.ts.map +1 -0
- package/dist/kb/commit.js +84 -0
- package/dist/kb/commit.js.map +1 -0
- package/dist/kb/fold.d.ts +42 -0
- package/dist/kb/fold.d.ts.map +1 -0
- package/dist/kb/fold.js +285 -0
- package/dist/kb/fold.js.map +1 -0
- package/dist/kb/freshness.d.ts +9 -0
- package/dist/kb/freshness.d.ts.map +1 -0
- package/dist/kb/freshness.js +52 -0
- package/dist/kb/freshness.js.map +1 -0
- package/dist/kb/git.d.ts +4 -0
- package/dist/kb/git.d.ts.map +1 -0
- package/dist/kb/git.js +28 -0
- package/dist/kb/git.js.map +1 -0
- package/dist/kb/ids.d.ts +8 -0
- package/dist/kb/ids.d.ts.map +1 -0
- package/dist/kb/ids.js +42 -0
- package/dist/kb/ids.js.map +1 -0
- package/dist/kb/lint.d.ts +23 -0
- package/dist/kb/lint.d.ts.map +1 -0
- package/dist/kb/lint.js +102 -0
- package/dist/kb/lint.js.map +1 -0
- package/dist/kb/lookup.d.ts +55 -0
- package/dist/kb/lookup.d.ts.map +1 -0
- package/dist/kb/lookup.js +92 -0
- package/dist/kb/lookup.js.map +1 -0
- package/dist/kb/notes-index.d.ts +31 -0
- package/dist/kb/notes-index.d.ts.map +1 -0
- package/dist/kb/notes-index.js +0 -0
- package/dist/kb/notes-index.js.map +1 -0
- package/dist/kb/raw-log.d.ts +34 -0
- package/dist/kb/raw-log.d.ts.map +1 -0
- package/dist/kb/raw-log.js +106 -0
- package/dist/kb/raw-log.js.map +1 -0
- package/dist/kb/render.d.ts +17 -0
- package/dist/kb/render.d.ts.map +1 -0
- package/dist/kb/render.js +101 -0
- package/dist/kb/render.js.map +1 -0
- package/dist/kb/search.d.ts +110 -0
- package/dist/kb/search.d.ts.map +1 -0
- package/dist/kb/search.js +453 -0
- package/dist/kb/search.js.map +1 -0
- package/dist/kb/store.d.ts +35 -0
- package/dist/kb/store.d.ts.map +1 -0
- package/dist/kb/store.js +160 -0
- package/dist/kb/store.js.map +1 -0
- package/dist/kb/types.d.ts +142 -0
- package/dist/kb/types.d.ts.map +1 -0
- package/dist/kb/types.js +13 -0
- package/dist/kb/types.js.map +1 -0
- package/dist/kb/view-template.d.ts +8 -0
- package/dist/kb/view-template.d.ts.map +1 -0
- package/dist/kb/view-template.js +8 -0
- package/dist/kb/view-template.js.map +1 -0
- package/dist/kb/view.d.ts +42 -0
- package/dist/kb/view.d.ts.map +1 -0
- package/dist/kb/view.js +118 -0
- package/dist/kb/view.js.map +1 -0
- package/dist/kb/write.d.ts +72 -0
- package/dist/kb/write.d.ts.map +1 -0
- package/dist/kb/write.js +345 -0
- package/dist/kb/write.js.map +1 -0
- package/dist/keeper-state.d.ts +29 -0
- package/dist/keeper-state.d.ts.map +1 -0
- package/dist/keeper-state.js +89 -0
- package/dist/keeper-state.js.map +1 -0
- package/dist/keeper.d.ts +23 -0
- package/dist/keeper.d.ts.map +1 -0
- package/dist/keeper.js +105 -0
- package/dist/keeper.js.map +1 -0
- package/dist/migrate.d.ts +9 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +102 -0
- package/dist/migrate.js.map +1 -0
- package/dist/restart.d.ts +15 -0
- package/dist/restart.d.ts.map +1 -0
- package/dist/restart.js +48 -0
- package/dist/restart.js.map +1 -0
- package/dist/server/find.d.ts +39 -0
- package/dist/server/find.d.ts.map +1 -0
- package/dist/server/find.js +979 -0
- package/dist/server/find.js.map +1 -0
- package/dist/server/mcp.d.ts +117 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +301 -0
- package/dist/server/mcp.js.map +1 -0
- package/dist/server/searcher.d.ts +14 -0
- package/dist/server/searcher.d.ts.map +1 -0
- package/dist/server/searcher.js +146 -0
- package/dist/server/searcher.js.map +1 -0
- package/dist/server/tools.d.ts +17 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +875 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/status.d.ts +12 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +157 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +138 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher.d.ts +11 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +67 -0
- package/dist/watcher.js.map +1 -0
- package/hooks/canonical-find-key.mjs +68 -0
- package/hooks/codex-find-nudge.mjs +15 -0
- package/hooks/codex-find-preguard.mjs +14 -0
- package/hooks/codex-kb-elicit.mjs +329 -0
- package/hooks/codex-kb-recall.mjs +151 -0
- package/hooks/codex-nudge-handler.mjs +370 -0
- package/hooks/codex-preguard-handler.mjs +75 -0
- package/hooks/codex-run-hook.mjs +132 -0
- package/hooks/coldstart-call.mjs +58 -0
- package/hooks/cursor-find-nudge.mjs +15 -0
- package/hooks/cursor-find-preguard.mjs +14 -0
- package/hooks/cursor-input.mjs +72 -0
- package/hooks/cursor-kb-elicit.mjs +335 -0
- package/hooks/cursor-kb-recall.mjs +138 -0
- package/hooks/cursor-nudge-handler.mjs +33 -0
- package/hooks/cursor-preguard-handler.mjs +39 -0
- package/hooks/cursor-run-hook.mjs +129 -0
- package/hooks/find-nudge.mjs +15 -0
- package/hooks/find-preguard.mjs +14 -0
- package/hooks/kb-elicit.mjs +334 -0
- package/hooks/kb-recall.mjs +151 -0
- package/hooks/nudge-handler.mjs +370 -0
- package/hooks/preguard-handler.mjs +75 -0
- package/hooks/run-hook.mjs +132 -0
- package/package.json +69 -0
- package/templates/coldstart.cli.md +60 -0
- package/templates/coldstart.mcp.md +59 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeper observability — two small files beside the cache segments:
|
|
3
|
+
*
|
|
4
|
+
* keeper-state.json — last reconcile / patch / rebuild / save, one record,
|
|
5
|
+
* overwritten in place (atomic). `coldstart status`
|
|
6
|
+
* renders it so "is my index fresh, and why?" is
|
|
7
|
+
* answerable without reading the daemon log.
|
|
8
|
+
* repair.jsonl — append-only log of FAILURES (patch failed, rebuild
|
|
9
|
+
* failed, invariant violation). Persistent across
|
|
10
|
+
* keeper restarts — a keeper that silently rebuilds
|
|
11
|
+
* every hour shows up here even if each individual
|
|
12
|
+
* log rotated away.
|
|
13
|
+
*
|
|
14
|
+
* Neither filename matches saveCachedIndex's cleanup sweep (index.json,
|
|
15
|
+
* graph.json, files-*, *.gz, *.gz.tmp, fingerprints.json) — same survival
|
|
16
|
+
* reasoning as kb-notes.json.
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
19
|
+
import { writeFile, rename, mkdir, appendFile, rm } from 'node:fs/promises';
|
|
20
|
+
import { join, dirname } from 'node:path';
|
|
21
|
+
import { getCacheDir } from './cache/disk-cache.js';
|
|
22
|
+
const STATE_FILE = 'keeper-state.json';
|
|
23
|
+
const REPAIR_FILE = 'repair.jsonl';
|
|
24
|
+
const REPAIR_MAX_BYTES = 256 * 1024;
|
|
25
|
+
export function keeperStatePath(rootDir, baseCacheDir) {
|
|
26
|
+
return join(getCacheDir(rootDir, baseCacheDir), STATE_FILE);
|
|
27
|
+
}
|
|
28
|
+
export function repairLogPath(rootDir, baseCacheDir) {
|
|
29
|
+
return join(getCacheDir(rootDir, baseCacheDir), REPAIR_FILE);
|
|
30
|
+
}
|
|
31
|
+
/** Read-merge-write. Best-effort and atomic — observability must never take
|
|
32
|
+
* the keeper down, so all failures are swallowed. */
|
|
33
|
+
export async function updateKeeperState(rootDir, patch, baseCacheDir) {
|
|
34
|
+
try {
|
|
35
|
+
const path = keeperStatePath(rootDir, baseCacheDir);
|
|
36
|
+
const current = readKeeperState(rootDir, baseCacheDir) ?? { pid: process.pid, startedAt: Date.now() };
|
|
37
|
+
const next = { ...current, ...patch, pid: process.pid };
|
|
38
|
+
await mkdir(dirname(path), { recursive: true });
|
|
39
|
+
const tmp = path + '.tmp';
|
|
40
|
+
await writeFile(tmp, JSON.stringify(next));
|
|
41
|
+
await rename(tmp, path);
|
|
42
|
+
}
|
|
43
|
+
catch { /* best-effort */ }
|
|
44
|
+
}
|
|
45
|
+
export function readKeeperState(rootDir, baseCacheDir) {
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse(readFileSync(keeperStatePath(rootDir, baseCacheDir), 'utf8'));
|
|
48
|
+
return typeof parsed?.pid === 'number' ? parsed : null;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Append one failure record. Size-capped: past the cap the file starts over
|
|
55
|
+
* (the tail is what matters; a growing failure log IS the signal). */
|
|
56
|
+
export async function appendRepairLog(rootDir, event, detail, baseCacheDir) {
|
|
57
|
+
try {
|
|
58
|
+
const path = repairLogPath(rootDir, baseCacheDir);
|
|
59
|
+
await mkdir(dirname(path), { recursive: true });
|
|
60
|
+
try {
|
|
61
|
+
if (statSync(path).size > REPAIR_MAX_BYTES)
|
|
62
|
+
await rm(path, { force: true });
|
|
63
|
+
}
|
|
64
|
+
catch { /* absent — fine */ }
|
|
65
|
+
const record = { at: Date.now(), event, detail: detail.slice(0, 500) };
|
|
66
|
+
await appendFile(path, JSON.stringify(record) + '\n');
|
|
67
|
+
}
|
|
68
|
+
catch { /* best-effort */ }
|
|
69
|
+
}
|
|
70
|
+
/** Last N repair events (tolerant reader — skips corrupt lines). */
|
|
71
|
+
export function readRepairTail(rootDir, n = 3, baseCacheDir) {
|
|
72
|
+
try {
|
|
73
|
+
const lines = readFileSync(repairLogPath(rootDir, baseCacheDir), 'utf8').trim().split('\n');
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const line of lines.slice(-n * 2)) {
|
|
76
|
+
try {
|
|
77
|
+
const parsed = JSON.parse(line);
|
|
78
|
+
if (typeof parsed?.at === 'number' && typeof parsed?.event === 'string')
|
|
79
|
+
out.push(parsed);
|
|
80
|
+
}
|
|
81
|
+
catch { /* skip corrupt line */ }
|
|
82
|
+
}
|
|
83
|
+
return out.slice(-n);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=keeper-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper-state.js","sourceRoot":"","sources":["../src/keeper-state.ts"],"names":[],"mappings":"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"}
|
package/dist/keeper.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure a background keeper is running for `finalRoot`. Spawns one (detached)
|
|
3
|
+
* if none is alive, or replaces a keeper left by an older coldstart version
|
|
4
|
+
* (cache-format compatibility). Best-effort — any failure is swallowed so the
|
|
5
|
+
* reader still works off the (possibly staler) cache.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureKeeper(finalRoot: string): Promise<void>;
|
|
8
|
+
export type CacheWait = 'ready' | 'no-keeper' | 'timeout';
|
|
9
|
+
/**
|
|
10
|
+
* Wait for the keeper's cache to exist. 'no-keeper' = no live keeper after a
|
|
11
|
+
* spawn grace period (caller may build in-process as a last resort);
|
|
12
|
+
* 'timeout' = a keeper is alive but still building (caller should tell the
|
|
13
|
+
* user to retry rather than start a competing build).
|
|
14
|
+
*/
|
|
15
|
+
export declare function waitForKeeperCache(rootDir: string, cacheDir: string | undefined, timeoutMs?: number, note?: (msg: string) => void): Promise<CacheWait>;
|
|
16
|
+
/**
|
|
17
|
+
* Wait for the cache to be REWRITTEN (meta.json mtime to advance past its
|
|
18
|
+
* value at call time). Used when a reader sees the cache behind the current
|
|
19
|
+
* git HEAD: the freshly ensured keeper reconciles and re-saves within a few
|
|
20
|
+
* seconds. false = no rewrite within the window (serve the stale index).
|
|
21
|
+
*/
|
|
22
|
+
export declare function waitForCacheAdvance(rootDir: string, cacheDir: string | undefined, timeoutMs?: number): Promise<boolean>;
|
|
23
|
+
//# sourceMappingURL=keeper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper.d.ts","sourceRoot":"","sources":["../src/keeper.ts"],"names":[],"mappings":"AAuBA;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBnE;AAaD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;AAE1D;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,SAAU,EACnB,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC,SAAS,CAAC,CAiBpB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,SAAS,GACjB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|
package/dist/keeper.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeper spawn helper — shared by the MCP reader (index.ts) and the CLI readers
|
|
3
|
+
* (cli.ts). Lives in its own module so cli.ts can use it without importing
|
|
4
|
+
* index.ts (whose top-level `main()` would run on import).
|
|
5
|
+
*
|
|
6
|
+
* The keeper is a detached background process (`--daemon`) that keeps the
|
|
7
|
+
* on-disk cache fresh. Readers call ensureKeeper() so a single keeper is alive
|
|
8
|
+
* per root; it short-circuits cheaply (one lock read + a liveness check) when
|
|
9
|
+
* one already runs.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { existsSync, statSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { readLock, isDaemonAlive, getCurrentVersion, killDaemon, deleteLock, tryAcquireSpawnLock, } from './daemon-lock.js';
|
|
15
|
+
import { getCacheDir } from './cache/disk-cache.js';
|
|
16
|
+
/**
|
|
17
|
+
* Ensure a background keeper is running for `finalRoot`. Spawns one (detached)
|
|
18
|
+
* if none is alive, or replaces a keeper left by an older coldstart version
|
|
19
|
+
* (cache-format compatibility). Best-effort — any failure is swallowed so the
|
|
20
|
+
* reader still works off the (possibly staler) cache.
|
|
21
|
+
*/
|
|
22
|
+
export async function ensureKeeper(finalRoot) {
|
|
23
|
+
try {
|
|
24
|
+
const lock = await readLock(finalRoot);
|
|
25
|
+
const version = getCurrentVersion();
|
|
26
|
+
if (lock && isDaemonAlive(lock.pid)) {
|
|
27
|
+
if (!lock.version || lock.version === version)
|
|
28
|
+
return; // alive & current
|
|
29
|
+
await killDaemon(lock.pid);
|
|
30
|
+
await deleteLock(finalRoot).catch(() => { });
|
|
31
|
+
}
|
|
32
|
+
const release = await tryAcquireSpawnLock(finalRoot);
|
|
33
|
+
if (!release)
|
|
34
|
+
return; // another reader is already spawning it
|
|
35
|
+
try {
|
|
36
|
+
const entry = process.argv[1];
|
|
37
|
+
const child = spawn(process.execPath, [entry, '--root', finalRoot, '--daemon', '--quiet'], { detached: true, stdio: 'ignore' });
|
|
38
|
+
child.unref();
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await release();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* best-effort */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Readers never build (B4): on a cache miss they wait for the keeper's first
|
|
50
|
+
// save instead of building a second index in-process (the double-build spike).
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
function metaPath(rootDir, cacheDir) {
|
|
53
|
+
return join(getCacheDir(rootDir, cacheDir), 'meta.json');
|
|
54
|
+
}
|
|
55
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
56
|
+
/**
|
|
57
|
+
* Wait for the keeper's cache to exist. 'no-keeper' = no live keeper after a
|
|
58
|
+
* spawn grace period (caller may build in-process as a last resort);
|
|
59
|
+
* 'timeout' = a keeper is alive but still building (caller should tell the
|
|
60
|
+
* user to retry rather than start a competing build).
|
|
61
|
+
*/
|
|
62
|
+
export async function waitForKeeperCache(rootDir, cacheDir, timeoutMs = 180_000, note) {
|
|
63
|
+
const meta = metaPath(rootDir, cacheDir);
|
|
64
|
+
const start = Date.now();
|
|
65
|
+
let lastNote = start;
|
|
66
|
+
while (Date.now() - start < timeoutMs) {
|
|
67
|
+
if (existsSync(meta))
|
|
68
|
+
return 'ready';
|
|
69
|
+
if (Date.now() - start > 3_000) {
|
|
70
|
+
const lock = await readLock(rootDir);
|
|
71
|
+
if (!lock || !isDaemonAlive(lock.pid))
|
|
72
|
+
return 'no-keeper';
|
|
73
|
+
}
|
|
74
|
+
if (note && Date.now() - lastNote >= 5_000) {
|
|
75
|
+
note(`[coldstart] keeper is building the index… (${Math.round((Date.now() - start) / 1000)}s)`);
|
|
76
|
+
lastNote = Date.now();
|
|
77
|
+
}
|
|
78
|
+
await sleep(250);
|
|
79
|
+
}
|
|
80
|
+
return existsSync(meta) ? 'ready' : 'timeout';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Wait for the cache to be REWRITTEN (meta.json mtime to advance past its
|
|
84
|
+
* value at call time). Used when a reader sees the cache behind the current
|
|
85
|
+
* git HEAD: the freshly ensured keeper reconciles and re-saves within a few
|
|
86
|
+
* seconds. false = no rewrite within the window (serve the stale index).
|
|
87
|
+
*/
|
|
88
|
+
export async function waitForCacheAdvance(rootDir, cacheDir, timeoutMs = 12_000) {
|
|
89
|
+
const meta = metaPath(rootDir, cacheDir);
|
|
90
|
+
const mtime = () => { try {
|
|
91
|
+
return statSync(meta).mtimeMs;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return 0;
|
|
95
|
+
} };
|
|
96
|
+
const baseline = mtime();
|
|
97
|
+
const start = Date.now();
|
|
98
|
+
while (Date.now() - start < timeoutMs) {
|
|
99
|
+
if (mtime() > baseline)
|
|
100
|
+
return true;
|
|
101
|
+
await sleep(250);
|
|
102
|
+
}
|
|
103
|
+
return mtime() > baseline;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=keeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper.js","sourceRoot":"","sources":["../src/keeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-migrate legacy npx-based .mcp.json entries to direct node invocation.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Auto-migrate legacy npx-based .mcp.json entries to direct node invocation.
|
|
6
|
+
* Called at server startup; failures are non-fatal (logged but don't block).
|
|
7
|
+
*/
|
|
8
|
+
export declare function migrateLegacyMcpConfig(rootDir: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8DH;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD3E"}
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-migrate legacy npx-based .mcp.json entries to direct node invocation.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
/**
|
|
9
|
+
* Detect if an MCP entry is the legacy npx-based coldstart form.
|
|
10
|
+
*/
|
|
11
|
+
function isLegacyNpxEntry(entry) {
|
|
12
|
+
if (!entry || typeof entry !== 'object')
|
|
13
|
+
return false;
|
|
14
|
+
const e = entry;
|
|
15
|
+
return (e.command === 'npx' &&
|
|
16
|
+
Array.isArray(e.args) &&
|
|
17
|
+
e.args.some(a => a === 'coldstart-mcp' || a === 'coldstart'));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the `dist/index.js` of the running coldstart install.
|
|
21
|
+
*
|
|
22
|
+
* Derived from this module's own location (`<install>/dist/migrate.js`), so it
|
|
23
|
+
* points at the live install regardless of how it was launched. There is no
|
|
24
|
+
* version-pinned copy to consult — `npx` is no longer a supported flow, so the
|
|
25
|
+
* running path is always stable.
|
|
26
|
+
*/
|
|
27
|
+
async function findStableInstall() {
|
|
28
|
+
try {
|
|
29
|
+
const entryPath = path.join(path.dirname(path.dirname(__filename)), 'dist', 'index.js');
|
|
30
|
+
return fs.existsSync(entryPath) ? entryPath : null;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build the new MCP entry for fast (direct node) invocation.
|
|
38
|
+
*/
|
|
39
|
+
async function buildFastEntry(rootDir) {
|
|
40
|
+
const entryPath = await findStableInstall();
|
|
41
|
+
if (!entryPath)
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
command: 'node',
|
|
45
|
+
args: [entryPath, '--root', rootDir],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Auto-migrate legacy npx-based .mcp.json entries to direct node invocation.
|
|
50
|
+
* Called at server startup; failures are non-fatal (logged but don't block).
|
|
51
|
+
*/
|
|
52
|
+
export async function migrateLegacyMcpConfig(rootDir) {
|
|
53
|
+
// Opt-out via environment variable
|
|
54
|
+
if (process.env.COLDSTART_NO_AUTO_MIGRATE === '1')
|
|
55
|
+
return;
|
|
56
|
+
const candidates = [
|
|
57
|
+
path.join(rootDir, '.mcp.json'),
|
|
58
|
+
path.join(rootDir, '.cursor', 'mcp.json'),
|
|
59
|
+
];
|
|
60
|
+
for (const file of candidates) {
|
|
61
|
+
if (!fs.existsSync(file))
|
|
62
|
+
continue;
|
|
63
|
+
let config;
|
|
64
|
+
try {
|
|
65
|
+
config = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const entry = config.mcpServers?.coldstart;
|
|
71
|
+
if (!entry)
|
|
72
|
+
continue;
|
|
73
|
+
// Only migrate if it's the exact legacy pattern we generated
|
|
74
|
+
if (!isLegacyNpxEntry(entry))
|
|
75
|
+
continue;
|
|
76
|
+
// Resolve a stable install
|
|
77
|
+
const newEntry = await buildFastEntry(rootDir);
|
|
78
|
+
if (!newEntry) {
|
|
79
|
+
process.stderr.write('[coldstart] Detected legacy npx-based .mcp.json but could not resolve the running install path. Reinstall (`npm i -g @cstart/coldstart`) and run `coldstart init` to migrate.\n');
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Create backup with timestamp
|
|
83
|
+
const backup = `${file}.bak-${Date.now()}`;
|
|
84
|
+
try {
|
|
85
|
+
fs.copyFileSync(file, backup);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
process.stderr.write(`[coldstart] Failed to create backup at ${backup}: ${err}\n`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Update the config
|
|
92
|
+
config.mcpServers.coldstart = newEntry;
|
|
93
|
+
try {
|
|
94
|
+
fs.writeFileSync(file, JSON.stringify(config, null, 2) + '\n');
|
|
95
|
+
process.stderr.write(`[coldstart] Migrated ${path.basename(file)} from npx to direct node (backup at ${path.basename(backup)}). Faster startup next session.\n`);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
process.stderr.write(`[coldstart] Failed to write migrated config: ${err}\n`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* coldstart restart [--all] [--root <dir>] — Kill the background keeper and
|
|
3
|
+
* clear its lock.
|
|
4
|
+
*
|
|
5
|
+
* Without flags: the keeper for the current working directory.
|
|
6
|
+
* With --root: the keeper for that directory (a silently-ignored --root
|
|
7
|
+
* killed the wrong keeper once — never accept-and-ignore a flag).
|
|
8
|
+
* With --all: every keeper the user has running.
|
|
9
|
+
*
|
|
10
|
+
* The keeper respawns lazily on the next `coldstart find` (or MCP call), so
|
|
11
|
+
* "restart" = stop now, fresh keeper on next use. Use this to clear a wedged
|
|
12
|
+
* keeper or a stale lockfile.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runRestart(): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=restart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../src/restart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgChD"}
|
package/dist/restart.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* coldstart restart [--all] [--root <dir>] — Kill the background keeper and
|
|
3
|
+
* clear its lock.
|
|
4
|
+
*
|
|
5
|
+
* Without flags: the keeper for the current working directory.
|
|
6
|
+
* With --root: the keeper for that directory (a silently-ignored --root
|
|
7
|
+
* killed the wrong keeper once — never accept-and-ignore a flag).
|
|
8
|
+
* With --all: every keeper the user has running.
|
|
9
|
+
*
|
|
10
|
+
* The keeper respawns lazily on the next `coldstart find` (or MCP call), so
|
|
11
|
+
* "restart" = stop now, fresh keeper on next use. Use this to clear a wedged
|
|
12
|
+
* keeper or a stale lockfile.
|
|
13
|
+
*/
|
|
14
|
+
import { resolve } from 'node:path';
|
|
15
|
+
import { readLock, listDaemonLocks, deleteLock, killDaemon } from './daemon-lock.js';
|
|
16
|
+
export async function runRestart() {
|
|
17
|
+
const all = process.argv.includes('--all');
|
|
18
|
+
let killed = 0;
|
|
19
|
+
if (all) {
|
|
20
|
+
// Kill every keeper.
|
|
21
|
+
const listings = await listDaemonLocks();
|
|
22
|
+
for (const listing of listings) {
|
|
23
|
+
await killDaemon(listing.lock.pid);
|
|
24
|
+
await deleteLock(listing.lock.rootDir || '.').catch(() => { });
|
|
25
|
+
process.stdout.write(`[coldstart] Killed keeper ${listing.basename} (PID ${listing.lock.pid})\n`);
|
|
26
|
+
killed++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Kill the keeper for --root <dir>, or cwd when absent.
|
|
31
|
+
const rootFlag = process.argv.indexOf('--root');
|
|
32
|
+
const target = rootFlag !== -1 ? process.argv[rootFlag + 1] : undefined;
|
|
33
|
+
const finalRoot = resolve(target ?? process.cwd());
|
|
34
|
+
const lock = await readLock(finalRoot);
|
|
35
|
+
if (!lock) {
|
|
36
|
+
process.stdout.write(`[coldstart] No keeper found for ${finalRoot}\n`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
await killDaemon(lock.pid);
|
|
40
|
+
await deleteLock(finalRoot).catch(() => { });
|
|
41
|
+
process.stdout.write(`[coldstart] Killed keeper (PID ${lock.pid}) — respawns on next \`coldstart find\`\n`);
|
|
42
|
+
killed++;
|
|
43
|
+
}
|
|
44
|
+
if (killed === 0) {
|
|
45
|
+
process.stdout.write(`[coldstart] No keepers to restart\n`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../src/restart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,GAAG,EAAE,CAAC;QACR,qBAAqB;QACrB,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,QAAQ,SAAS,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAClG,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wDAAwD;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,IAAI,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,GAAG,2CAA2C,CAAC,CAAC;QAC5G,MAAM,EAAE,CAAC;IACX,CAAC;IAED,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { CodebaseIndex } from '../types.js';
|
|
2
|
+
import type { FoldedNote } from '../kb/types.js';
|
|
3
|
+
/** Separator-fold for the NAME/PATH/SYMBOL channels: query vocabulary and code
|
|
4
|
+
* naming disagree on separators for the same compound — `spatial-view` vs
|
|
5
|
+
* `spatial_view` vs `SpatialView` vs `spatialview` are one concept. Folding
|
|
6
|
+
* `-`/`_` out of BOTH sides makes those channels separator-invariant (a strict
|
|
7
|
+
* superset of the literal matches). Body/grep matching stays literal — text is
|
|
8
|
+
* matched as written. (Root-caused from the q16 three-arm trace: the gold
|
|
9
|
+
* migration ranked tail-[1/3] purely because the agent hyphenated its query.) */
|
|
10
|
+
export declare function foldSep(s: string): string;
|
|
11
|
+
/** Clean a raw query into distinct, matchable terms (identifiers ≥3 chars). */
|
|
12
|
+
export declare function parseTerms(raw: string): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Build term-coverage per indexed file. External searchers run per-term; the
|
|
15
|
+
* Node fallback reads each indexed file once and tests all terms together.
|
|
16
|
+
* Only files present in the index count (restricts to indexed code files).
|
|
17
|
+
*/
|
|
18
|
+
export declare function collectCoverage(index: CodebaseIndex, root: string, terms: string[]): Promise<Map<string, Set<string>>>;
|
|
19
|
+
export declare function buildNoteMap(root: string, lterms: string[]): Map<string, {
|
|
20
|
+
note: FoldedNote;
|
|
21
|
+
role?: string;
|
|
22
|
+
}>;
|
|
23
|
+
/** Empty line → the caller drops it: a Summary: that only restates the path is
|
|
24
|
+
* noise, not evidence (a file note's title IS the path).
|
|
25
|
+
* `summary` — the gist is summary-grade prose (a single's body sentence or a
|
|
26
|
+
* query-matched facet detail): a past agent's verified description of THIS
|
|
27
|
+
* file. find then drops the convergence preview for the file — the summary
|
|
28
|
+
* IS the preview (user ruling 2026-07-06: file summaries live in find; flows
|
|
29
|
+
* live in kb search). Stale notes still surface — most of a note survives
|
|
30
|
+
* an edit — with [evidence changed] marking what to re-verify. */
|
|
31
|
+
export declare function noteLine(root: string, rel: string, entry: {
|
|
32
|
+
note: FoldedNote;
|
|
33
|
+
role?: string;
|
|
34
|
+
}, lterms?: string[]): {
|
|
35
|
+
line: string;
|
|
36
|
+
summary: boolean;
|
|
37
|
+
};
|
|
38
|
+
export declare function buildRichPage(index: CodebaseIndex, root: string, rawQuery: string, asData?: boolean, via?: boolean): Promise<string>;
|
|
39
|
+
//# sourceMappingURL=find.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/server/find.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmJjD;;;;;;iFAMiF;AACjF,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhD;AA4DD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CA6D5H;AA+ID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B7G;AAWD;;;;;;;mEAOmE;AACnE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAyCzJ;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAQ,EAAE,GAAG,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CA4XtI"}
|