@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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kb lookup — everything the notebook knows at an exact (path[, symbol])
|
|
3
|
+
* address. This is the read side of the address-based dedup story: before
|
|
4
|
+
* recording a file-anchored fact, an agent looks the address up; the same
|
|
5
|
+
* surface answers "what do we know about this file?" during navigation.
|
|
6
|
+
*
|
|
7
|
+
* Flow back-links are DERIVED here at read time from flow steps (which already
|
|
8
|
+
* carry {path, symbols}) — nothing is stored on the file note, so the links
|
|
9
|
+
* can never go stale and there is nothing for a writer to forget.
|
|
10
|
+
*/
|
|
11
|
+
import type { AnchorState, Facet, Feature, FileCharacter, LessonKind } from './types.js';
|
|
12
|
+
export interface LookupFileNote {
|
|
13
|
+
id: string;
|
|
14
|
+
character?: FileCharacter;
|
|
15
|
+
summary?: string;
|
|
16
|
+
/** All facets, or just the addressed one when a symbol was given. */
|
|
17
|
+
facets: Facet[];
|
|
18
|
+
/** Manual part-of pointers recorded on the note itself. */
|
|
19
|
+
features: Feature[];
|
|
20
|
+
state: AnchorState;
|
|
21
|
+
}
|
|
22
|
+
export interface LookupFlowHit {
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
/** 1-based step positions in the flow that touch the address. */
|
|
26
|
+
steps: {
|
|
27
|
+
index: number;
|
|
28
|
+
role: string;
|
|
29
|
+
symbols?: string[];
|
|
30
|
+
}[];
|
|
31
|
+
/** True when the flow matched ONLY because the address is one of its anchors
|
|
32
|
+
* (its freshness contract) and it has no step at this exact path. Without
|
|
33
|
+
* this, a flow that watches a file but narrates its story elsewhere would be
|
|
34
|
+
* invisible to the pre-edit gate — a real false-negative (see arches: ~14%
|
|
35
|
+
* of flows anchor a file they have no step at). */
|
|
36
|
+
viaAnchor?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface LookupLessonHit {
|
|
39
|
+
id: string;
|
|
40
|
+
kind?: LessonKind;
|
|
41
|
+
title: string;
|
|
42
|
+
gist: string;
|
|
43
|
+
}
|
|
44
|
+
export interface LookupResult {
|
|
45
|
+
path: string;
|
|
46
|
+
symbol?: string;
|
|
47
|
+
fileNote: LookupFileNote | null;
|
|
48
|
+
flows: LookupFlowHit[];
|
|
49
|
+
lessons: LookupLessonHit[];
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
export declare function kbLookup(root: string, rawPath: string, symbol?: string): LookupResult;
|
|
53
|
+
/** CLI text view. Empty result → a single "nothing recorded" line. */
|
|
54
|
+
export declare function renderLookup(r: LookupResult): string;
|
|
55
|
+
//# sourceMappingURL=lookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../src/kb/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKzF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC7D;;;;wDAIoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAkDrF;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CA2BpD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { fileNoteId } from './ids.js';
|
|
2
|
+
import { loadAll } from './store.js';
|
|
3
|
+
import { stampAnchors } from './freshness.js';
|
|
4
|
+
const normPath = (p) => p.replace(/^\.\//, '');
|
|
5
|
+
export function kbLookup(root, rawPath, symbol) {
|
|
6
|
+
const path = normPath(rawPath);
|
|
7
|
+
const { notes, warnings } = loadAll(root);
|
|
8
|
+
const result = { path, ...(symbol ? { symbol } : {}), fileNote: null, flows: [], lessons: [], warnings };
|
|
9
|
+
const fnote = notes.find((n) => n.id === fileNoteId(path) && n.status === 'active');
|
|
10
|
+
if (fnote) {
|
|
11
|
+
const facets = symbol ? fnote.facets.filter((f) => f.symbol === symbol) : fnote.facets;
|
|
12
|
+
result.fileNote = {
|
|
13
|
+
id: fnote.id,
|
|
14
|
+
...(fnote.character ? { character: fnote.character } : {}),
|
|
15
|
+
...(fnote.summary ? { summary: fnote.summary } : {}),
|
|
16
|
+
facets,
|
|
17
|
+
features: fnote.features,
|
|
18
|
+
state: stampAnchors(root, fnote.anchors.filter((a) => normPath(a.path) === path))[0]?.state ?? 'unverified',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
for (const n of notes) {
|
|
22
|
+
if (n.status !== 'active')
|
|
23
|
+
continue;
|
|
24
|
+
if (n.type === 'flow') {
|
|
25
|
+
// A step with no declared symbols can't be ruled out for a symbol query —
|
|
26
|
+
// include it (surface, don't steer); symbol-declared steps must overlap.
|
|
27
|
+
const steps = n.steps
|
|
28
|
+
.map((s, i) => ({ s, index: i + 1 }))
|
|
29
|
+
.filter(({ s }) => normPath(s.path) === path && (!symbol || !s.symbols?.length || s.symbols.includes(symbol)))
|
|
30
|
+
.map(({ s, index }) => ({ index, role: s.role, ...(s.symbols?.length ? { symbols: s.symbols } : {}) }));
|
|
31
|
+
if (steps.length) {
|
|
32
|
+
result.flows.push({ id: n.id, title: n.title, steps });
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// No step at this exact path — but the flow may still ANCHOR it (its
|
|
36
|
+
// freshness contract). Surface it as an anchor-only hit so the pre-edit
|
|
37
|
+
// gate never hides a flow that depends on the file being edited.
|
|
38
|
+
const anchored = n.anchors.some((a) => normPath(a.path) === path && (!symbol || !a.symbols?.length || a.symbols.includes(symbol)));
|
|
39
|
+
if (anchored)
|
|
40
|
+
result.flows.push({ id: n.id, title: n.title, steps: [], viaAnchor: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (n.type === 'lesson') {
|
|
44
|
+
const hit = n.anchors.some((a) => normPath(a.path) === path && (!symbol || !a.symbols?.length || a.symbols.includes(symbol)));
|
|
45
|
+
if (hit) {
|
|
46
|
+
result.lessons.push({
|
|
47
|
+
id: n.id,
|
|
48
|
+
...(n.kind ? { kind: n.kind } : {}),
|
|
49
|
+
title: n.title,
|
|
50
|
+
gist: (n.body ?? '').split('\n')[0].slice(0, 160),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
/** CLI text view. Empty result → a single "nothing recorded" line. */
|
|
58
|
+
export function renderLookup(r) {
|
|
59
|
+
const addr = r.symbol ? `${r.path} :: ${r.symbol}` : r.path;
|
|
60
|
+
if (!r.fileNote && !r.flows.length && !r.lessons.length) {
|
|
61
|
+
return `no notebook knowledge at ${addr} — nothing recorded yet.`;
|
|
62
|
+
}
|
|
63
|
+
const out = [addr];
|
|
64
|
+
if (r.fileNote) {
|
|
65
|
+
const f = r.fileNote;
|
|
66
|
+
out.push(`file note: ${f.id}${f.character ? ` (${f.character})` : ''} [${f.state}]`);
|
|
67
|
+
if (f.summary && (!r.symbol || f.character !== 'hub'))
|
|
68
|
+
out.push(` ${f.summary.split('\n')[0]}`);
|
|
69
|
+
for (const facet of f.facets) {
|
|
70
|
+
out.push(` facet ${facet.symbol}: ${facet.detail}${facet.flows?.length ? ` — flows: ${facet.flows.map((x) => `[[${x}]]`).join(' ')}` : ''}`);
|
|
71
|
+
}
|
|
72
|
+
for (const feat of f.features)
|
|
73
|
+
out.push(` part of [[${feat.concept_id}]]${feat.role ? ` — ${feat.role}` : ''}`);
|
|
74
|
+
}
|
|
75
|
+
if (r.flows.length) {
|
|
76
|
+
out.push(`flows touching ${addr}:`);
|
|
77
|
+
for (const fl of r.flows) {
|
|
78
|
+
if (fl.viaAnchor)
|
|
79
|
+
out.push(` [[${fl.id}]] — depends on this file (no step here; re-verify the flow if you change it)`);
|
|
80
|
+
else
|
|
81
|
+
for (const s of fl.steps)
|
|
82
|
+
out.push(` [[${fl.id}]] step ${s.index} — ${s.role}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (r.lessons.length) {
|
|
86
|
+
out.push(`lessons anchored here:`);
|
|
87
|
+
for (const l of r.lessons)
|
|
88
|
+
out.push(` [[${l.id}]]${l.kind ? ` (${l.kind})` : ''} — ${l.title}${l.gist ? `: ${l.gist}` : ''}`);
|
|
89
|
+
}
|
|
90
|
+
return out.join('\n');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/kb/lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CodebaseIndex } from '../types.js';
|
|
2
|
+
export declare const KB_NOTES_INDEX_VERSION = 1;
|
|
3
|
+
export interface KbAbsenceStamp {
|
|
4
|
+
/** Echo of the terms that were re-run — a reader ignores the stamp when the
|
|
5
|
+
* note's scope.terms have changed since the keeper last looked. */
|
|
6
|
+
terms: string[];
|
|
7
|
+
/** Live matches after the note's glob filter. Empty = the absence holds. */
|
|
8
|
+
matches: string[];
|
|
9
|
+
checkedAt: number;
|
|
10
|
+
}
|
|
11
|
+
export interface KbNotesIndex {
|
|
12
|
+
v: typeof KB_NOTES_INDEX_VERSION;
|
|
13
|
+
builtAt: number;
|
|
14
|
+
/** anchored path → symbol names declared in that file (per the code index) */
|
|
15
|
+
anchors: Record<string, string[]>;
|
|
16
|
+
/** absence-note id → verdict stamp */
|
|
17
|
+
absence: Record<string, KbAbsenceStamp>;
|
|
18
|
+
}
|
|
19
|
+
export declare function kbNotesIndexPath(rootDir: string, baseCacheDir?: string): string;
|
|
20
|
+
/** Does this stamp cover the note's CURRENT terms? Order-insensitive — the
|
|
21
|
+
* search semantics don't depend on term order, so a reordering edit must not
|
|
22
|
+
* invalidate an otherwise-valid stamp. */
|
|
23
|
+
export declare function stampCoversTerms(stamp: KbAbsenceStamp | undefined, terms: string[]): stamp is KbAbsenceStamp;
|
|
24
|
+
/** Derive the notes index from the live code index + the folded notebook. */
|
|
25
|
+
export declare function buildKbNotesIndex(index: CodebaseIndex, rootDir: string): Promise<KbNotesIndex>;
|
|
26
|
+
/** Atomic write (temp + rename) — a reader never sees a half-written index. */
|
|
27
|
+
export declare function saveKbNotesIndex(rootDir: string, kb: KbNotesIndex, baseCacheDir?: string): Promise<void>;
|
|
28
|
+
/** Sync read for the query surfaces. null = absent/corrupt/wrong version —
|
|
29
|
+
* callers degrade (no lane 2, absence prints "not re-verified"). */
|
|
30
|
+
export declare function loadKbNotesIndex(rootDir: string, baseCacheDir?: string): KbNotesIndex | null;
|
|
31
|
+
//# sourceMappingURL=notes-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes-index.d.ts","sourceRoot":"","sources":["../../src/kb/notes-index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAGxC,MAAM,WAAW,cAAc;IAC7B;wEACoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,OAAO,sBAAsB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACzC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;2CAE2C;AAC3C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,cAAc,CAI5G;AAYD,6EAA6E;AAC7E,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAyBpG;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9G;AAED;qEACqE;AACrE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQ5F"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes-index.js","sourceRoot":"","sources":["../../src/kb/notes-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { NewRecordInput, RawRecord } from './types.js';
|
|
2
|
+
export declare const KB_RAW_VERSION = 1;
|
|
3
|
+
/** Repo-relative notes dir — the openable-path pointer printed on query
|
|
4
|
+
* surfaces (find Summary: line, kb search results). Agents run from the repo
|
|
5
|
+
* root, so `<NOTES_REL>/<id>.md` is directly Read-able. */
|
|
6
|
+
export declare const NOTES_REL = ".coldstart/notebook/notes";
|
|
7
|
+
export declare function notebookDir(root: string): string;
|
|
8
|
+
export declare function rawDir(root: string): string;
|
|
9
|
+
export declare function rawPath(root: string, id: string): string;
|
|
10
|
+
export interface AppendOptions {
|
|
11
|
+
/** Fail with EEXIST if the log already exists (O_EXCL). Used when a freshly
|
|
12
|
+
* COINED flow/lesson id is first written: two concurrent sessions can coin
|
|
13
|
+
* the same id (both list the dir before either creates the file), and
|
|
14
|
+
* without exclusivity their records silently merge into one note. The
|
|
15
|
+
* caller catches EEXIST and re-coins. Never used for file notes — their id
|
|
16
|
+
* is derived from the path, so concurrent writers SHOULD share one log. */
|
|
17
|
+
exclusive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Stamp `v`/`ts`, inject hashes for `verified` paths, append one line.
|
|
21
|
+
* Returns the record as written. Throws on an invalid envelope — append is the
|
|
22
|
+
* write gate; tolerance belongs to the READ side.
|
|
23
|
+
*/
|
|
24
|
+
export declare function appendRecord(root: string, input: NewRecordInput, opts?: AppendOptions): RawRecord;
|
|
25
|
+
export interface ReadLogResult {
|
|
26
|
+
/** Parsed objects in file order — structural validation happens in fold(). */
|
|
27
|
+
records: unknown[];
|
|
28
|
+
warnings: string[];
|
|
29
|
+
}
|
|
30
|
+
/** Tolerant line-by-line read. Missing file → empty log (not an error). */
|
|
31
|
+
export declare function readLog(root: string, id: string): ReadLogResult;
|
|
32
|
+
/** All note ids present in the raw dir (one log file per note). */
|
|
33
|
+
export declare function listIds(root: string): string[];
|
|
34
|
+
//# sourceMappingURL=raw-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-log.d.ts","sourceRoot":"","sources":["../../src/kb/raw-log.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAU,MAAM,YAAY,CAAC;AAKpE,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;4DAE4D;AAC5D,eAAO,MAAM,SAAS,8BAA8B,CAAC;AAErD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AACD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AACD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;gFAK4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,GAAE,aAAkB,GAAG,SAAS,CAyBrG;AAED,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CAoB/D;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAW9C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `.raw` log — append + tolerant read of `.coldstart/notebook/.raw/<id>.jsonl`.
|
|
3
|
+
*
|
|
4
|
+
* Append is the ONLY writer of records; it stamps `v` and `ts` and injects a
|
|
5
|
+
* live hash for every path the agent marked `verified` (the agent never writes
|
|
6
|
+
* a hash). Read is tolerant: bad JSON lines and structurally-invalid records
|
|
7
|
+
* are skipped with a warning, never a hard error — the log is a forever-format
|
|
8
|
+
* shared across coldstart versions and git branches.
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, appendFileSync, mkdirSync, readdirSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { hashFile } from './freshness.js';
|
|
13
|
+
import { gitHeadSha } from './git.js';
|
|
14
|
+
import { isValidId } from './ids.js';
|
|
15
|
+
export const KB_RAW_VERSION = 1;
|
|
16
|
+
/** Repo-relative notes dir — the openable-path pointer printed on query
|
|
17
|
+
* surfaces (find Summary: line, kb search results). Agents run from the repo
|
|
18
|
+
* root, so `<NOTES_REL>/<id>.md` is directly Read-able. */
|
|
19
|
+
export const NOTES_REL = '.coldstart/notebook/notes';
|
|
20
|
+
export function notebookDir(root) {
|
|
21
|
+
return join(root, '.coldstart', 'notebook');
|
|
22
|
+
}
|
|
23
|
+
export function rawDir(root) {
|
|
24
|
+
return join(notebookDir(root), '.raw');
|
|
25
|
+
}
|
|
26
|
+
export function rawPath(root, id) {
|
|
27
|
+
return join(rawDir(root), `${id}.jsonl`);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Stamp `v`/`ts`, inject hashes for `verified` paths, append one line.
|
|
31
|
+
* Returns the record as written. Throws on an invalid envelope — append is the
|
|
32
|
+
* write gate; tolerance belongs to the READ side.
|
|
33
|
+
*/
|
|
34
|
+
export function appendRecord(root, input, opts = {}) {
|
|
35
|
+
if (!input.id || !isValidId(input.id))
|
|
36
|
+
throw new Error(`invalid note id: ${JSON.stringify(input.id)}`);
|
|
37
|
+
if (!['file', 'flow', 'lesson'].includes(input.type))
|
|
38
|
+
throw new Error(`invalid note type: ${JSON.stringify(input.type)}`);
|
|
39
|
+
if (!['put', 'retract', 'supersede'].includes(input.op))
|
|
40
|
+
throw new Error(`invalid op: ${JSON.stringify(input.op)}`);
|
|
41
|
+
const record = { ...input, v: KB_RAW_VERSION, ts: new Date().toISOString() };
|
|
42
|
+
// Provenance stamp — tool-supplied like ts; an agent-written head is overridden.
|
|
43
|
+
const head = gitHeadSha(root);
|
|
44
|
+
if (head)
|
|
45
|
+
record.head = head;
|
|
46
|
+
else
|
|
47
|
+
delete record.head;
|
|
48
|
+
if (record.op === 'put' && Array.isArray(record.verified) && record.verified.length) {
|
|
49
|
+
const anchors = Array.isArray(record.anchors) ? record.anchors.map((a) => ({ ...a })) : [];
|
|
50
|
+
for (const rel of record.verified) {
|
|
51
|
+
const hash = hashFile(root, rel);
|
|
52
|
+
const existing = anchors.find((a) => a.path === rel);
|
|
53
|
+
if (existing) {
|
|
54
|
+
existing.hash = hash;
|
|
55
|
+
if (head)
|
|
56
|
+
existing.head = head;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
anchors.push({ path: rel, hash, ...(head ? { head } : {}) });
|
|
60
|
+
}
|
|
61
|
+
record.anchors = anchors;
|
|
62
|
+
}
|
|
63
|
+
mkdirSync(rawDir(root), { recursive: true });
|
|
64
|
+
appendFileSync(rawPath(root, record.id), JSON.stringify(record) + '\n', opts.exclusive ? { flag: 'ax' } : undefined);
|
|
65
|
+
return record;
|
|
66
|
+
}
|
|
67
|
+
/** Tolerant line-by-line read. Missing file → empty log (not an error). */
|
|
68
|
+
export function readLog(root, id) {
|
|
69
|
+
const records = [];
|
|
70
|
+
const warnings = [];
|
|
71
|
+
let text = '';
|
|
72
|
+
try {
|
|
73
|
+
text = readFileSync(rawPath(root, id), 'utf8');
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return { records, warnings };
|
|
77
|
+
}
|
|
78
|
+
const lines = text.split('\n');
|
|
79
|
+
for (let i = 0; i < lines.length; i++) {
|
|
80
|
+
const line = lines[i].trim();
|
|
81
|
+
if (!line)
|
|
82
|
+
continue;
|
|
83
|
+
try {
|
|
84
|
+
records.push(JSON.parse(line));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
warnings.push(`${id}.jsonl line ${i + 1}: unparseable JSON — skipped`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { records, warnings };
|
|
91
|
+
}
|
|
92
|
+
/** All note ids present in the raw dir (one log file per note). */
|
|
93
|
+
export function listIds(root) {
|
|
94
|
+
let entries = [];
|
|
95
|
+
try {
|
|
96
|
+
entries = readdirSync(rawDir(root));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
return entries
|
|
102
|
+
.filter((f) => f.endsWith('.jsonl'))
|
|
103
|
+
.map((f) => f.slice(0, -'.jsonl'.length))
|
|
104
|
+
.sort();
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=raw-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-log.js","sourceRoot":"","sources":["../../src/kb/raw-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render — FoldedNote → derived markdown (never load-bearing for retrieval;
|
|
3
|
+
* search consumes the FoldedNote directly, so this file is the human/Obsidian
|
|
4
|
+
* view and what recall inlines).
|
|
5
|
+
*
|
|
6
|
+
* Dual layer: frontmatter = machine contract (OKF-conformant: `type` present,
|
|
7
|
+
* unknown fields preserved), body = agent prose (grepped, never parsed).
|
|
8
|
+
* Anchors render as one JSON object per line (valid YAML flow mapping, and
|
|
9
|
+
* trivially machine-readable back). Freshness is NEVER rendered — it is
|
|
10
|
+
* computed at read time; a rendered stamp would be stale-at-write.
|
|
11
|
+
*
|
|
12
|
+
* Ecosystem conventions: `aliases` (Obsidian frontmatter), `[[wikilink]]`
|
|
13
|
+
* concept references in prose.
|
|
14
|
+
*/
|
|
15
|
+
import type { FoldedNote } from './types.js';
|
|
16
|
+
export declare function renderNote(note: FoldedNote): string;
|
|
17
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/kb/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAqCnD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const yamlStr = (s) => JSON.stringify(String(s));
|
|
2
|
+
export function renderNote(note) {
|
|
3
|
+
const fm = ['---'];
|
|
4
|
+
fm.push(`id: ${note.id}`);
|
|
5
|
+
fm.push(`type: ${note.type}`);
|
|
6
|
+
if (note.character)
|
|
7
|
+
fm.push(`character: ${note.character}`);
|
|
8
|
+
if (note.kind)
|
|
9
|
+
fm.push(`kind: ${note.kind}`);
|
|
10
|
+
fm.push(`title: ${yamlStr(note.title)}`);
|
|
11
|
+
if (note.aliases.length)
|
|
12
|
+
fm.push(`aliases: [${note.aliases.map(yamlStr).join(', ')}]`);
|
|
13
|
+
if (note.anchors.length) {
|
|
14
|
+
fm.push('anchors:');
|
|
15
|
+
for (const a of note.anchors)
|
|
16
|
+
fm.push(` - ${JSON.stringify(a)}`);
|
|
17
|
+
}
|
|
18
|
+
if (note.scope)
|
|
19
|
+
fm.push(`scope: ${JSON.stringify(note.scope)}`);
|
|
20
|
+
fm.push(`status: ${note.status}`);
|
|
21
|
+
if (note.supersededBy)
|
|
22
|
+
fm.push(`superseded_by: ${note.supersededBy}`);
|
|
23
|
+
fm.push(`updated: ${note.updated}`);
|
|
24
|
+
fm.push(`edits: ${note.edits}`);
|
|
25
|
+
// Tolerant reader: unknown record fields survive into the frontmatter.
|
|
26
|
+
for (const [k, v] of Object.entries(note.extra)) {
|
|
27
|
+
if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(k))
|
|
28
|
+
fm.push(`${k}: ${JSON.stringify(v)}`);
|
|
29
|
+
}
|
|
30
|
+
fm.push('---');
|
|
31
|
+
const body = ['', `# ${note.title}`, ''];
|
|
32
|
+
if (note.status === 'superseded' && note.supersededBy) {
|
|
33
|
+
body.push(`> Superseded by [[${note.supersededBy}]].`, '');
|
|
34
|
+
}
|
|
35
|
+
if (note.status === 'retracted') {
|
|
36
|
+
body.push(`> Retracted — kept for history; do not rely on this note.`, '');
|
|
37
|
+
}
|
|
38
|
+
if (note.type === 'file')
|
|
39
|
+
renderFileBody(note, body);
|
|
40
|
+
else if (note.type === 'flow')
|
|
41
|
+
renderFlowBody(note, body);
|
|
42
|
+
else
|
|
43
|
+
renderLessonBody(note, body);
|
|
44
|
+
return fm.join('\n') + '\n' + body.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
|
|
45
|
+
}
|
|
46
|
+
function renderFileBody(note, body) {
|
|
47
|
+
if (note.summary)
|
|
48
|
+
body.push(note.summary, '');
|
|
49
|
+
if (note.facets.length) {
|
|
50
|
+
body.push('## Facets', '');
|
|
51
|
+
for (const f of note.facets) {
|
|
52
|
+
const flows = f.flows?.length ? ` — ${f.flows.map((x) => `[[${x}]]`).join(' ')}` : '';
|
|
53
|
+
body.push(`- **${f.symbol}** — ${f.detail}${flows}`);
|
|
54
|
+
}
|
|
55
|
+
body.push('');
|
|
56
|
+
}
|
|
57
|
+
if (note.behaviors.length) {
|
|
58
|
+
body.push('## Behaviors', '');
|
|
59
|
+
for (const b of note.behaviors) {
|
|
60
|
+
const sym = b.symbols?.length ? ` (\`${b.symbols.join('`, `')}\`)` : '';
|
|
61
|
+
body.push(`- **${b.concept_id}**${sym} — ${b.detail}`);
|
|
62
|
+
}
|
|
63
|
+
body.push('');
|
|
64
|
+
}
|
|
65
|
+
if (note.features.length) {
|
|
66
|
+
body.push('## Part of', '');
|
|
67
|
+
for (const f of note.features)
|
|
68
|
+
body.push(`- [[${f.concept_id}]]${f.role ? ` — ${f.role}` : ''}`);
|
|
69
|
+
body.push('');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function renderFlowBody(note, body) {
|
|
73
|
+
if (note.summary)
|
|
74
|
+
body.push(note.summary, '');
|
|
75
|
+
if (note.steps.length) {
|
|
76
|
+
body.push('## Steps', '');
|
|
77
|
+
note.steps.forEach((s, i) => {
|
|
78
|
+
const sym = s.symbols?.length ? ` (\`${s.symbols.join('`, `')}\`)` : '';
|
|
79
|
+
body.push(`${i + 1}. \`${s.path}\`${sym} — ${s.role}`);
|
|
80
|
+
});
|
|
81
|
+
body.push('');
|
|
82
|
+
}
|
|
83
|
+
if (note.invariants.length) {
|
|
84
|
+
body.push('## Invariants', '');
|
|
85
|
+
for (const inv of note.invariants)
|
|
86
|
+
body.push(`- ${inv}`);
|
|
87
|
+
body.push('');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function renderLessonBody(note, body) {
|
|
91
|
+
if (note.body)
|
|
92
|
+
body.push(note.body, '');
|
|
93
|
+
if (note.scope) {
|
|
94
|
+
body.push('## Scope (absence — freshness = re-run this search)', '');
|
|
95
|
+
body.push(`- terms: ${note.scope.terms.map((t) => `\`${t}\``).join(', ')}`);
|
|
96
|
+
if (note.scope.globs?.length)
|
|
97
|
+
body.push(`- globs: ${note.scope.globs.map((g) => `\`${g}\``).join(', ')}`);
|
|
98
|
+
body.push('');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/kb/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kb search — the 3rd core tool. A cold agent arrives with WORDS, no filenames;
|
|
3
|
+
* this is tried before `find`.
|
|
4
|
+
*
|
|
5
|
+
* Lane 1 (words→notes): task words vs title/aliases (weight 3), anchor
|
|
6
|
+
* paths+symbols+facet symbols (weight 2), prose incl. facet details (weight 1)
|
|
7
|
+
* — scored by in-house BM25 over the NOTE corpus (idf · tf-saturation · length
|
|
8
|
+
* normalization; defaults k1=1.2 b=0.75, weights tuned on real corpora).
|
|
9
|
+
* Lane 2 (code→notes): a term naming a symbol DECLARED in an anchored file
|
|
10
|
+
* surfaces the note even when the note never stored the symbol — resolved via
|
|
11
|
+
* the keeper-maintained notes index (per-anchor symbol inventories), never by
|
|
12
|
+
* scanning the code index here (C1 decoupling).
|
|
13
|
+
*
|
|
14
|
+
* Results carry freshness computed NOW (never trusted from write time);
|
|
15
|
+
* absence notes print the keeper's re-run verdict stamp. Active+fresh
|
|
16
|
+
* notes outrank stale/superseded ones as a hard tier, score within tier.
|
|
17
|
+
*
|
|
18
|
+
* Every zero-hit query is appended to the miss-log — the alias bet's failure
|
|
19
|
+
* mode is SILENT (the agent just falls through to `find`), so the miss-log is
|
|
20
|
+
* the health metric and the future source of real aliases.
|
|
21
|
+
*/
|
|
22
|
+
import type { FoldedNote, StampedAnchor } from './types.js';
|
|
23
|
+
import { type KbNotesIndex } from './notes-index.js';
|
|
24
|
+
export interface KbSearchOptions {
|
|
25
|
+
/** Keeper-maintained notes index for lane 2, absence stamps, and the
|
|
26
|
+
* convergence implant gate. Load via loadKbNotesIndex(root) — a plain
|
|
27
|
+
* sidecar read, safe in hook mode too. Omit → those channels degrade. */
|
|
28
|
+
notesIndex?: KbNotesIndex | null;
|
|
29
|
+
maxResults?: number;
|
|
30
|
+
/** Where the query came from — recorded in the miss-log. */
|
|
31
|
+
source?: 'tool' | 'hook';
|
|
32
|
+
/** Suppress miss-log writes (used by write-time candidate matching). */
|
|
33
|
+
noMissLog?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Precision mode for the recall hook, whose "query" is an arbitrary user
|
|
36
|
+
* sentence: match AND score on the name/alias/anchor channels only (body
|
|
37
|
+
* coverage is trivially satisfied by long prompts sharing the repo's domain
|
|
38
|
+
* vocabulary — phase-1 arches: 12/12 body-graze injections, all irrelevant,
|
|
39
|
+
* and body coverage let padding outrank the true hit), then drop hits far
|
|
40
|
+
* below the best one (padding, not signal). Explicit tool calls stay loose
|
|
41
|
+
* (the agent chose its terms).
|
|
42
|
+
*/
|
|
43
|
+
strongOnly?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface KbSearchHit {
|
|
46
|
+
note: FoldedNote;
|
|
47
|
+
score: number;
|
|
48
|
+
/** 0 = active+all-anchors-fresh · 1 = active but stale · 2 = superseded/retracted */
|
|
49
|
+
tier: number;
|
|
50
|
+
stamped: StampedAnchor[];
|
|
51
|
+
/** Absence-note re-run verdict line, when applicable. */
|
|
52
|
+
absence?: string;
|
|
53
|
+
/** A code-shaped query term is DECLARED (per the keeper's per-anchor symbol
|
|
54
|
+
* inventory) in one of this note's anchor files — the code index agreeing
|
|
55
|
+
* with the text match. The high-precision implant gate; false when the
|
|
56
|
+
* notes index wasn't provided. */
|
|
57
|
+
convergence: boolean;
|
|
58
|
+
/** Distinct eligible query terms that hit this note's NAME/ANCHOR channels.
|
|
59
|
+
* In hook mode only eligible (minority + shape-ok) terms count, so this is
|
|
60
|
+
* a scale-free convergence measure: a boilerplate graze shares ONE word
|
|
61
|
+
* with the top note; a task that names a mechanism lands several. */
|
|
62
|
+
strongTerms: number;
|
|
63
|
+
}
|
|
64
|
+
export interface KbSearchResult {
|
|
65
|
+
hits: KbSearchHit[];
|
|
66
|
+
terms: string[];
|
|
67
|
+
warnings: string[];
|
|
68
|
+
/** Hits the cap dropped that still cleared the results floor — a real second
|
|
69
|
+
* page, not tail grazes. The number the --max footer advertises; absent/0
|
|
70
|
+
* means nothing was worth widening for. */
|
|
71
|
+
omitted?: number;
|
|
72
|
+
/** The cap actually applied (opts.maxResults ?? default) — the base for the
|
|
73
|
+
* footer's suggested --max value. */
|
|
74
|
+
maxUsed?: number;
|
|
75
|
+
}
|
|
76
|
+
export declare function kbSearch(root: string, query: string, opts?: KbSearchOptions): Promise<KbSearchResult>;
|
|
77
|
+
/** Implant gate — should the TOP hit's full body ride in the injection?
|
|
78
|
+
*
|
|
79
|
+
* Layered, no absolute score constant (27q calibration, 2026-07-05):
|
|
80
|
+
* 1. convergence — a code-shaped query term is a declared symbol in the
|
|
81
|
+
* note's anchor files (index agrees with text): 11/11 precise at rank 0.
|
|
82
|
+
* 2. dominance — sole surviving hit, or top score ≥ 1.8× the runner-up. A
|
|
83
|
+
* scale-free ratio within one query's own result list; unlike an absolute
|
|
84
|
+
* cut it doesn't drift with notebook size or repo vocabulary.
|
|
85
|
+
* Together: 22/23 relevant implanted, zero false implants on that corpus.
|
|
86
|
+
* Neither fires → gist tier, which is the pre-implant behavior. */
|
|
87
|
+
export declare function shouldImplantTop(result: KbSearchResult): boolean;
|
|
88
|
+
/** Hook-mode page — PREVIEW GRADE, never full-body (structural ruling
|
|
89
|
+
* 2026-07-06, after the boilerplate-poisoning incident: a wrong full-body
|
|
90
|
+
* implant demotes the right notes; a wrong preview costs one glance).
|
|
91
|
+
* Every hit renders as title + freshness + `→ open:` path + the same
|
|
92
|
+
* ~340-char wrapped preview as the kb search results page (2026-07-08:
|
|
93
|
+
* a lone surgical gist gave the agent nothing to judge it against — q14
|
|
94
|
+
* wrong-prime; candidates with previews let it pick or reject). Full depth
|
|
95
|
+
* is one Read of the open: path. shouldImplantTop stays exported for a
|
|
96
|
+
* future injection A/B. Injected context is re-read every turn, so the
|
|
97
|
+
* page stays small. */
|
|
98
|
+
export declare function renderCompactPage(query: string, result: KbSearchResult): string;
|
|
99
|
+
/** Tool-mode results page — search-engine shape (user ruling 2026-07-08):
|
|
100
|
+
* many ranked results, each title + live freshness + an OPENABLE note-file
|
|
101
|
+
* path + a ~3-line preview. Depth is one Read away, so breadth is cheap and
|
|
102
|
+
* a ranker miss costs a glance, not the answer. The relative score floor
|
|
103
|
+
* drops tail grazes (a generic path segment matching one anchor) that a
|
|
104
|
+
* wider page would otherwise pad with. */
|
|
105
|
+
export declare function renderResultsPage(query: string, result: KbSearchResult): string;
|
|
106
|
+
/** Full-body page: every hit inlined whole. Kept for `--json` (programmatic
|
|
107
|
+
* consumers get the complete page per hit) — tool mode now renders the
|
|
108
|
+
* search-engine page above. */
|
|
109
|
+
export declare function renderSearchPage(root: string, query: string, result: KbSearchResult): string;
|
|
110
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/kb/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOvE,MAAM,WAAW,eAAe;IAC9B;;8EAE0E;IAC1E,UAAU,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAgBD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;uCAGmC;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB;;;0EAGsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;gDAE4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;0CACsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsJD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2I/G;AASD;;;;;;;;;oEASoE;AACpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAKhE;AA4BD;;;;;;;;;wBASwB;AACxB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAO/E;AAED;;;;;2CAK2C;AAC3C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAoC/E;AAeD;;gCAEgC;AAChC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAkB5F"}
|