@seanhogg/builderforce-memory 2026.10.28 → 2026.10.29
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/dist/ingest/IngestionPipeline.d.ts +1 -8
- package/dist/ingest/IngestionPipeline.d.ts.map +1 -1
- package/dist/ingest/IngestionPipeline.js +3 -15
- package/dist/ingest/IngestionPipeline.js.map +1 -1
- package/dist/ingest/docsExtract.d.ts +30 -0
- package/dist/ingest/docsExtract.d.ts.map +1 -0
- package/dist/ingest/docsExtract.js +221 -0
- package/dist/ingest/docsExtract.js.map +1 -0
- package/dist/ingest/hash.d.ts +15 -0
- package/dist/ingest/hash.d.ts.map +1 -0
- package/dist/ingest/hash.js +22 -0
- package/dist/ingest/hash.js.map +1 -0
- package/dist/ingest/parsers.d.ts.map +1 -1
- package/dist/ingest/parsers.js +4 -0
- package/dist/ingest/parsers.js.map +1 -1
- package/dist/ingest/types.d.ts +7 -0
- package/dist/ingest/types.d.ts.map +1 -1
- package/dist/ingest/types.js.map +1 -1
- package/dist/knowledge/build.d.ts +24 -0
- package/dist/knowledge/build.d.ts.map +1 -0
- package/dist/knowledge/build.js +263 -0
- package/dist/knowledge/build.js.map +1 -0
- package/dist/knowledge/cards.d.ts +17 -0
- package/dist/knowledge/cards.d.ts.map +1 -0
- package/dist/knowledge/cards.js +118 -0
- package/dist/knowledge/cards.js.map +1 -0
- package/dist/knowledge/findings.d.ts +24 -0
- package/dist/knowledge/findings.d.ts.map +1 -0
- package/dist/knowledge/findings.js +152 -0
- package/dist/knowledge/findings.js.map +1 -0
- package/dist/knowledge/importance.d.ts +21 -0
- package/dist/knowledge/importance.d.ts.map +1 -0
- package/dist/knowledge/importance.js +70 -0
- package/dist/knowledge/importance.js.map +1 -0
- package/dist/knowledge/index.d.ts +31 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +26 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/judge.d.ts +86 -0
- package/dist/knowledge/judge.d.ts.map +1 -0
- package/dist/knowledge/judge.js +213 -0
- package/dist/knowledge/judge.js.map +1 -0
- package/dist/knowledge/model.d.ts +333 -0
- package/dist/knowledge/model.d.ts.map +1 -0
- package/dist/knowledge/model.js +13 -0
- package/dist/knowledge/model.js.map +1 -0
- package/dist/knowledge/packs/docs.d.ts +17 -0
- package/dist/knowledge/packs/docs.d.ts.map +1 -0
- package/dist/knowledge/packs/docs.js +89 -0
- package/dist/knowledge/packs/docs.js.map +1 -0
- package/dist/knowledge/partitions.d.ts +31 -0
- package/dist/knowledge/partitions.d.ts.map +1 -0
- package/dist/knowledge/partitions.js +135 -0
- package/dist/knowledge/partitions.js.map +1 -0
- package/dist/knowledge/plan.d.ts +33 -0
- package/dist/knowledge/plan.d.ts.map +1 -0
- package/dist/knowledge/plan.js +89 -0
- package/dist/knowledge/plan.js.map +1 -0
- package/dist/knowledge/refs.d.ts +40 -0
- package/dist/knowledge/refs.d.ts.map +1 -0
- package/dist/knowledge/refs.js +102 -0
- package/dist/knowledge/refs.js.map +1 -0
- package/dist/knowledge/resolve.d.ts +35 -0
- package/dist/knowledge/resolve.d.ts.map +1 -0
- package/dist/knowledge/resolve.js +67 -0
- package/dist/knowledge/resolve.js.map +1 -0
- package/dist/knowledge/review.d.ts +23 -0
- package/dist/knowledge/review.d.ts.map +1 -0
- package/dist/knowledge/review.js +233 -0
- package/dist/knowledge/review.js.map +1 -0
- package/dist/knowledge/sources.d.ts +47 -0
- package/dist/knowledge/sources.d.ts.map +1 -0
- package/dist/knowledge/sources.js +136 -0
- package/dist/knowledge/sources.js.map +1 -0
- package/dist/knowledge/stores/localSnapshotStore.d.ts +50 -0
- package/dist/knowledge/stores/localSnapshotStore.d.ts.map +1 -0
- package/dist/knowledge/stores/localSnapshotStore.js +125 -0
- package/dist/knowledge/stores/localSnapshotStore.js.map +1 -0
- package/dist/knowledge/trace.d.ts +32 -0
- package/dist/knowledge/trace.d.ts.map +1 -0
- package/dist/knowledge/trace.js +102 -0
- package/dist/knowledge/trace.js.map +1 -0
- package/dist/knowledge/truncate.d.ts +24 -0
- package/dist/knowledge/truncate.d.ts.map +1 -0
- package/dist/knowledge/truncate.js +128 -0
- package/dist/knowledge/truncate.js.map +1 -0
- package/dist/memory/SemanticRecall.d.ts.map +1 -1
- package/dist/memory/SemanticRecall.js +3 -1
- package/dist/memory/SemanticRecall.js.map +1 -1
- package/dist/retrieval/HybridRetriever.d.ts.map +1 -1
- package/dist/retrieval/HybridRetriever.js +3 -1
- package/dist/retrieval/HybridRetriever.js.map +1 -1
- package/dist/retrieval/bm25.d.ts +3 -2
- package/dist/retrieval/bm25.d.ts.map +1 -1
- package/dist/retrieval/bm25.js +5 -3
- package/dist/retrieval/bm25.js.map +1 -1
- package/dist/retrieval/fusion.d.ts +2 -1
- package/dist/retrieval/fusion.d.ts.map +1 -1
- package/dist/retrieval/fusion.js +4 -2
- package/dist/retrieval/fusion.js.map +1 -1
- package/dist/retrieval/hnsw.d.ts +49 -11
- package/dist/retrieval/hnsw.d.ts.map +1 -1
- package/dist/retrieval/hnsw.js +57 -29
- package/dist/retrieval/hnsw.js.map +1 -1
- package/dist/retrieval/index.d.ts +7 -3
- package/dist/retrieval/index.d.ts.map +1 -1
- package/dist/retrieval/index.js +5 -2
- package/dist/retrieval/index.js.map +1 -1
- package/dist/retrieval/knowledge-index/bytes.d.ts +43 -0
- package/dist/retrieval/knowledge-index/bytes.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/bytes.js +151 -0
- package/dist/retrieval/knowledge-index/bytes.js.map +1 -0
- package/dist/retrieval/knowledge-index/cascade.d.ts +37 -0
- package/dist/retrieval/knowledge-index/cascade.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/cascade.js +111 -0
- package/dist/retrieval/knowledge-index/cascade.js.map +1 -0
- package/dist/retrieval/knowledge-index/compact.d.ts +18 -0
- package/dist/retrieval/knowledge-index/compact.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/compact.js +64 -0
- package/dist/retrieval/knowledge-index/compact.js.map +1 -0
- package/dist/retrieval/knowledge-index/csr.d.ts +41 -0
- package/dist/retrieval/knowledge-index/csr.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/csr.js +76 -0
- package/dist/retrieval/knowledge-index/csr.js.map +1 -0
- package/dist/retrieval/knowledge-index/digest.d.ts +21 -0
- package/dist/retrieval/knowledge-index/digest.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/digest.js +50 -0
- package/dist/retrieval/knowledge-index/digest.js.map +1 -0
- package/dist/retrieval/knowledge-index/embeddings.d.ts +32 -0
- package/dist/retrieval/knowledge-index/embeddings.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/embeddings.js +78 -0
- package/dist/retrieval/knowledge-index/embeddings.js.map +1 -0
- package/dist/retrieval/knowledge-index/expand.d.ts +19 -0
- package/dist/retrieval/knowledge-index/expand.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/expand.js +49 -0
- package/dist/retrieval/knowledge-index/expand.js.map +1 -0
- package/dist/retrieval/knowledge-index/index.d.ts +40 -0
- package/dist/retrieval/knowledge-index/index.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/index.js +134 -0
- package/dist/retrieval/knowledge-index/index.js.map +1 -0
- package/dist/retrieval/knowledge-index/lexical.d.ts +26 -0
- package/dist/retrieval/knowledge-index/lexical.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/lexical.js +76 -0
- package/dist/retrieval/knowledge-index/lexical.js.map +1 -0
- package/dist/retrieval/knowledge-index/pairs.d.ts +22 -0
- package/dist/retrieval/knowledge-index/pairs.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/pairs.js +51 -0
- package/dist/retrieval/knowledge-index/pairs.js.map +1 -0
- package/dist/retrieval/knowledge-index/prune.d.ts +21 -0
- package/dist/retrieval/knowledge-index/prune.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/prune.js +43 -0
- package/dist/retrieval/knowledge-index/prune.js.map +1 -0
- package/dist/retrieval/knowledge-index/quantize.d.ts +37 -0
- package/dist/retrieval/knowledge-index/quantize.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/quantize.js +77 -0
- package/dist/retrieval/knowledge-index/quantize.js.map +1 -0
- package/dist/retrieval/knowledge-index/serialize.d.ts +18 -0
- package/dist/retrieval/knowledge-index/serialize.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/serialize.js +123 -0
- package/dist/retrieval/knowledge-index/serialize.js.map +1 -0
- package/dist/retrieval/knowledge-index/sha256.d.ts +30 -0
- package/dist/retrieval/knowledge-index/sha256.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/sha256.js +130 -0
- package/dist/retrieval/knowledge-index/sha256.js.map +1 -0
- package/dist/retrieval/knowledge-index/state.d.ts +55 -0
- package/dist/retrieval/knowledge-index/state.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/state.js +67 -0
- package/dist/retrieval/knowledge-index/state.js.map +1 -0
- package/dist/retrieval/knowledge-index/tokenize.d.ts +20 -0
- package/dist/retrieval/knowledge-index/tokenize.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/tokenize.js +42 -0
- package/dist/retrieval/knowledge-index/tokenize.js.map +1 -0
- package/dist/retrieval/knowledge-index/traverse.d.ts +26 -0
- package/dist/retrieval/knowledge-index/traverse.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/traverse.js +90 -0
- package/dist/retrieval/knowledge-index/traverse.js.map +1 -0
- package/dist/retrieval/knowledge-index/types.d.ts +85 -0
- package/dist/retrieval/knowledge-index/types.d.ts.map +1 -0
- package/dist/retrieval/knowledge-index/types.js +9 -0
- package/dist/retrieval/knowledge-index/types.js.map +1 -0
- package/dist/retrieval/mmr.d.ts +11 -4
- package/dist/retrieval/mmr.d.ts.map +1 -1
- package/dist/retrieval/mmr.js +28 -8
- package/dist/retrieval/mmr.js.map +1 -1
- package/dist/retrieval/order.d.ts +41 -0
- package/dist/retrieval/order.d.ts.map +1 -0
- package/dist/retrieval/order.js +54 -0
- package/dist/retrieval/order.js.map +1 -0
- package/dist/retrieval/weightedFusion.d.ts +2 -1
- package/dist/retrieval/weightedFusion.d.ts.map +1 -1
- package/dist/retrieval/weightedFusion.js +7 -5
- package/dist/retrieval/weightedFusion.js.map +1 -1
- package/dist/vectorstore/MemoryVectorStore.d.ts.map +1 -1
- package/dist/vectorstore/MemoryVectorStore.js +2 -1
- package/dist/vectorstore/MemoryVectorStore.js.map +1 -1
- package/package.json +8 -3
- package/src/ingest/IngestionPipeline.ts +3 -15
- package/src/ingest/docsExtract.ts +219 -0
- package/src/ingest/hash.ts +22 -0
- package/src/ingest/parsers.ts +4 -0
- package/src/ingest/types.ts +7 -0
- package/src/knowledge/build.test.ts +150 -0
- package/src/knowledge/build.ts +266 -0
- package/src/knowledge/cards.ts +130 -0
- package/src/knowledge/docs.test.ts +118 -0
- package/src/knowledge/findings.ts +159 -0
- package/src/knowledge/importance.ts +72 -0
- package/src/knowledge/index.ts +53 -0
- package/src/knowledge/judge.ts +231 -0
- package/src/knowledge/model.ts +312 -0
- package/src/knowledge/packs/docs.ts +91 -0
- package/src/knowledge/partitions.test.ts +98 -0
- package/src/knowledge/partitions.ts +119 -0
- package/src/knowledge/plan.ts +115 -0
- package/src/knowledge/refs.ts +108 -0
- package/src/knowledge/resolve.ts +78 -0
- package/src/knowledge/review.test.ts +180 -0
- package/src/knowledge/review.ts +235 -0
- package/src/knowledge/sources.ts +146 -0
- package/src/knowledge/stores/localSnapshotStore.test.ts +82 -0
- package/src/knowledge/stores/localSnapshotStore.ts +159 -0
- package/src/knowledge/testkit.test-util.ts +92 -0
- package/src/knowledge/trace.test.ts +91 -0
- package/src/knowledge/trace.ts +111 -0
- package/src/knowledge/truncate.ts +118 -0
- package/src/memory/SemanticRecall.ts +3 -1
- package/src/retrieval/HybridRetriever.ts +3 -1
- package/src/retrieval/bm25.ts +5 -3
- package/src/retrieval/fusion.ts +5 -2
- package/src/retrieval/hnsw.ts +82 -35
- package/src/retrieval/index.ts +17 -3
- package/src/retrieval/knowledge-index/bytes.ts +166 -0
- package/src/retrieval/knowledge-index/cascade.ts +125 -0
- package/src/retrieval/knowledge-index/compact.ts +68 -0
- package/src/retrieval/knowledge-index/csr.ts +102 -0
- package/src/retrieval/knowledge-index/digest.ts +54 -0
- package/src/retrieval/knowledge-index/embeddings.ts +85 -0
- package/src/retrieval/knowledge-index/expand.ts +55 -0
- package/src/retrieval/knowledge-index/index.ts +162 -0
- package/src/retrieval/knowledge-index/lexical.ts +78 -0
- package/src/retrieval/knowledge-index/pairs.ts +57 -0
- package/src/retrieval/knowledge-index/prune.ts +48 -0
- package/src/retrieval/knowledge-index/quantize.ts +78 -0
- package/src/retrieval/knowledge-index/serialize.ts +124 -0
- package/src/retrieval/knowledge-index/sha256.ts +122 -0
- package/src/retrieval/knowledge-index/state.ts +108 -0
- package/src/retrieval/knowledge-index/tokenize.ts +41 -0
- package/src/retrieval/knowledge-index/traverse.ts +95 -0
- package/src/retrieval/knowledge-index/types.ts +78 -0
- package/src/retrieval/mmr.ts +35 -10
- package/src/retrieval/order.ts +68 -0
- package/src/retrieval/weightedFusion.ts +8 -5
- package/src/vectorstore/MemoryVectorStore.ts +2 -1
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The knowledge graph model — memory's structure for KNOWLEDGE: facts connected to each
|
|
3
|
+
* other and to the sources they came from (PRD: Builderforce.ai/docs/specs/38-prd-knowledge-graph.md).
|
|
4
|
+
*
|
|
5
|
+
* Generic: it knows sources, entities, facts and relations — never imports or headings.
|
|
6
|
+
* Packs (docs builtin, code registered by the host) supply that meaning as DATA.
|
|
7
|
+
*
|
|
8
|
+
* Store judgement, compute perception: `extracted` nodes/edges are recomputed from sources
|
|
9
|
+
* (cached by content hash) and are NEVER written to a KnowledgeStore; `model`/`human`/`agent`
|
|
10
|
+
* ones are stored with the content hash they were judged from and go stale when it changes.
|
|
11
|
+
*/
|
|
12
|
+
import type { IngestManifest, SourceDocument, ParsedSection } from '../ingest/types.js';
|
|
13
|
+
import type { IndexDoc, SimilarPair } from '../retrieval/knowledge-index/types.js';
|
|
14
|
+
/** `src:${rootId}::${path}` · `ent:${pack}:${normalizedName}` · `fact:${key}` (claims are `fact:claim:${hash}`). */
|
|
15
|
+
export type NodeRef = `src:${string}` | `ent:${string}` | `fact:${string}`;
|
|
16
|
+
export type Origin = 'extracted' | 'model' | 'human' | 'agent';
|
|
17
|
+
export type StoredOrigin = Exclude<Origin, 'extracted'>;
|
|
18
|
+
export interface KNode {
|
|
19
|
+
ref: NodeRef;
|
|
20
|
+
/** Pack-defined: 'file' | 'section' | 'symbol' | 'area' | 'entity' | 'claim' | 'fact' … */
|
|
21
|
+
kind: string;
|
|
22
|
+
label: string;
|
|
23
|
+
pack: string;
|
|
24
|
+
partition?: string;
|
|
25
|
+
area?: NodeRef;
|
|
26
|
+
/** PageRank over the joined graph, normalized 0–1 (areas: sum of members, renormalized). */
|
|
27
|
+
importance: number;
|
|
28
|
+
origin: Origin;
|
|
29
|
+
sourceHash?: string;
|
|
30
|
+
stale?: boolean;
|
|
31
|
+
/** Pack data, e.g. { added, removed }, { unused: 'file' }, { line: 12 }. */
|
|
32
|
+
badges?: Record<string, number | string>;
|
|
33
|
+
}
|
|
34
|
+
export type EdgeVerdict = 'allowed' | 'same' | 'skips' | 'upward';
|
|
35
|
+
export interface KEdge {
|
|
36
|
+
from: NodeRef;
|
|
37
|
+
to: NodeRef;
|
|
38
|
+
/** 'references' | 'links' | 'contains' | 'mentions' | 'duplicate' | 'near-duplicate'
|
|
39
|
+
* | 'contradicts' | 'agrees' | 'supersedes' | 'about' | 'co-changed' — a new kind is a value. */
|
|
40
|
+
kind: string;
|
|
41
|
+
weight: number;
|
|
42
|
+
origin: Origin;
|
|
43
|
+
confidence?: number;
|
|
44
|
+
verdict?: EdgeVerdict;
|
|
45
|
+
cycle?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Output of a pack's deterministic extractor (or analyzer) for one source. Never stored. */
|
|
48
|
+
export interface Extracted {
|
|
49
|
+
sourceRef: NodeRef;
|
|
50
|
+
sourceHash: string;
|
|
51
|
+
nodes: KNode[];
|
|
52
|
+
edges: KEdge[];
|
|
53
|
+
/** Exact keys for entity resolution and the index's exact tier. */
|
|
54
|
+
keys: Array<{
|
|
55
|
+
ref: NodeRef;
|
|
56
|
+
key: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export interface ExtractContext {
|
|
60
|
+
rootId: string;
|
|
61
|
+
/** Normalized entity keys known so far (for `mentions`). */
|
|
62
|
+
knownKeys: ReadonlyMap<string, NodeRef>;
|
|
63
|
+
/** Resolves a relative link/import from `fromPath` to a root-relative path, or undefined. */
|
|
64
|
+
resolvePath(fromPath: string, target: string): string | undefined;
|
|
65
|
+
}
|
|
66
|
+
/** A finding a person can act on. `kind` is pack-defined; `requestKey` names an i18n template. */
|
|
67
|
+
export interface Finding {
|
|
68
|
+
id: string;
|
|
69
|
+
kind: string;
|
|
70
|
+
pack: string;
|
|
71
|
+
nodes: NodeRef[];
|
|
72
|
+
severity: 'info' | 'warn' | 'error';
|
|
73
|
+
/** Numbers/strings for the label and the Fix-with-agent template. */
|
|
74
|
+
params: Record<string, string | number>;
|
|
75
|
+
/** i18n key of the fixed Fix-with-agent request (e.g. 'knowledgeGraph.fix.cloneGroup'). */
|
|
76
|
+
requestKey?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface FindingRule {
|
|
79
|
+
id: string;
|
|
80
|
+
find(graph: KnowledgeGraph): Finding[];
|
|
81
|
+
}
|
|
82
|
+
export interface PartitionRule {
|
|
83
|
+
id: string;
|
|
84
|
+
/** 0 = top. */
|
|
85
|
+
order: number;
|
|
86
|
+
/** Globs over the source path; first matching rule wins. */
|
|
87
|
+
match: string[];
|
|
88
|
+
}
|
|
89
|
+
export interface PartitionRegistry {
|
|
90
|
+
partitions: PartitionRule[];
|
|
91
|
+
/** from-partition → partitions it may use. Absent ⇒ no verdicts. */
|
|
92
|
+
allow?: Record<string, string[]>;
|
|
93
|
+
}
|
|
94
|
+
/** What the judgement model is asked for one section kind; output is schema-validated. */
|
|
95
|
+
export interface JudgementSpec {
|
|
96
|
+
/** Node kinds whose text is judged (e.g. ['section']). */
|
|
97
|
+
nodeKinds: string[];
|
|
98
|
+
/** Ask for claims[] / entities[] per node; and contradicts|agrees for near-duplicate claim pairs. */
|
|
99
|
+
claims: boolean;
|
|
100
|
+
entities: boolean;
|
|
101
|
+
contradictions: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface JudgementRequest {
|
|
104
|
+
kind: 'extract' | 'compare';
|
|
105
|
+
/** extract: one node's text; compare: two claims. */
|
|
106
|
+
items: Array<{
|
|
107
|
+
ref: NodeRef;
|
|
108
|
+
text: string;
|
|
109
|
+
sourceHash: string;
|
|
110
|
+
}>;
|
|
111
|
+
signal?: AbortSignal;
|
|
112
|
+
}
|
|
113
|
+
export interface JudgedClaim {
|
|
114
|
+
subject: string;
|
|
115
|
+
predicate: string;
|
|
116
|
+
object: string;
|
|
117
|
+
quote: string;
|
|
118
|
+
}
|
|
119
|
+
export interface JudgedEntity {
|
|
120
|
+
name: string;
|
|
121
|
+
type: string;
|
|
122
|
+
}
|
|
123
|
+
export interface JudgementResult {
|
|
124
|
+
extract?: Array<{
|
|
125
|
+
ref: NodeRef;
|
|
126
|
+
claims: JudgedClaim[];
|
|
127
|
+
entities: JudgedEntity[];
|
|
128
|
+
}>;
|
|
129
|
+
compare?: Array<{
|
|
130
|
+
a: NodeRef;
|
|
131
|
+
b: NodeRef;
|
|
132
|
+
relation: 'contradicts' | 'agrees' | 'unrelated';
|
|
133
|
+
confidence: number;
|
|
134
|
+
}>;
|
|
135
|
+
/** Items dropped for invalid output. */
|
|
136
|
+
invalid: number;
|
|
137
|
+
}
|
|
138
|
+
/** A routed model call. Hosts implement it (VS Code/on-prem: local engines → gateway; web: POST …/knowledge/judge). */
|
|
139
|
+
export interface JudgementPort {
|
|
140
|
+
judge(req: JudgementRequest): Promise<JudgementResult>;
|
|
141
|
+
}
|
|
142
|
+
/** Host-run tools for a pack (code: dependency-cruiser/jscpd/knip). Returns extra extracted edges/badges. */
|
|
143
|
+
export interface AnalyzerPort {
|
|
144
|
+
analyse(rootId: string, signal?: AbortSignal): Promise<Extracted[]>;
|
|
145
|
+
}
|
|
146
|
+
/** A host-supplied parser that also extracts graph structure. `extract` is the optional ingest extension. */
|
|
147
|
+
export interface KnowledgeParser {
|
|
148
|
+
id: string;
|
|
149
|
+
accepts(source: SourceDocument): boolean;
|
|
150
|
+
parse(source: SourceDocument): ParsedSection[];
|
|
151
|
+
extract?(source: SourceDocument, sections: ParsedSection[], ctx: ExtractContext): Extracted;
|
|
152
|
+
}
|
|
153
|
+
export interface KnowledgePack {
|
|
154
|
+
/** 'docs' | 'code' */
|
|
155
|
+
id: string;
|
|
156
|
+
parsers: KnowledgeParser[];
|
|
157
|
+
partitions?: PartitionRegistry;
|
|
158
|
+
findings?: FindingRule[];
|
|
159
|
+
judgement?: JudgementSpec;
|
|
160
|
+
analyzers?: AnalyzerPort;
|
|
161
|
+
}
|
|
162
|
+
export interface StoredFact {
|
|
163
|
+
/** project_facts.key — judgement nodes use `ent:<pack>:<name>` / `claim:<hash>` namespaces. */
|
|
164
|
+
key: string;
|
|
165
|
+
content: string;
|
|
166
|
+
source: string;
|
|
167
|
+
importance: number;
|
|
168
|
+
origin: StoredOrigin;
|
|
169
|
+
fileAnchors: Array<{
|
|
170
|
+
path: string;
|
|
171
|
+
line?: number;
|
|
172
|
+
contentHash?: string;
|
|
173
|
+
}>;
|
|
174
|
+
updatedAt?: string;
|
|
175
|
+
createdBy?: number | null;
|
|
176
|
+
}
|
|
177
|
+
export interface StoredRelation {
|
|
178
|
+
from: NodeRef;
|
|
179
|
+
to: NodeRef;
|
|
180
|
+
kind: string;
|
|
181
|
+
weight: number;
|
|
182
|
+
origin: StoredOrigin;
|
|
183
|
+
confidence?: number;
|
|
184
|
+
sourceHash?: string;
|
|
185
|
+
staleAt?: string | null;
|
|
186
|
+
}
|
|
187
|
+
export interface Scope {
|
|
188
|
+
rootId: string;
|
|
189
|
+
}
|
|
190
|
+
export interface ScopeRecord {
|
|
191
|
+
rootId: string;
|
|
192
|
+
title: string;
|
|
193
|
+
packs: string[];
|
|
194
|
+
lastDigest?: string;
|
|
195
|
+
lastReviewedAt?: string;
|
|
196
|
+
}
|
|
197
|
+
/** Where knowledge is persisted: the platform API adapter or the local snapshot adapter. */
|
|
198
|
+
export interface KnowledgeStore {
|
|
199
|
+
scopes(): Promise<ScopeRecord[]>;
|
|
200
|
+
facts(scope: Scope): Promise<StoredFact[]>;
|
|
201
|
+
relations(scope: Scope): Promise<StoredRelation[]>;
|
|
202
|
+
write(batch: {
|
|
203
|
+
scope: ScopeRecord;
|
|
204
|
+
facts: StoredFact[];
|
|
205
|
+
relations: StoredRelation[];
|
|
206
|
+
}): Promise<void>;
|
|
207
|
+
/** Marks model facts/relations judged from `sourceRef` at a hash other than `currentHash` stale. */
|
|
208
|
+
markStale(scope: Scope, sourceRef: NodeRef, currentHash: string): Promise<void>;
|
|
209
|
+
/** Extracted output cache, by content hash (never knowledge — perception). */
|
|
210
|
+
getExtracted?(hash: string): Promise<Extracted[] | undefined>;
|
|
211
|
+
putExtracted?(hash: string, extracted: Extracted[]): Promise<void>;
|
|
212
|
+
}
|
|
213
|
+
/** Where files come from: one adapter per host. */
|
|
214
|
+
export interface DirectorySource {
|
|
215
|
+
rootId: string;
|
|
216
|
+
title: string;
|
|
217
|
+
list(): AsyncIterable<{
|
|
218
|
+
path: string;
|
|
219
|
+
hash: string;
|
|
220
|
+
size: number;
|
|
221
|
+
}>;
|
|
222
|
+
read(path: string): Promise<SourceDocument>;
|
|
223
|
+
watch?(cb: (paths: string[]) => void): () => void;
|
|
224
|
+
}
|
|
225
|
+
export interface LiveOverlay {
|
|
226
|
+
changes: Array<{
|
|
227
|
+
path: string;
|
|
228
|
+
status: string;
|
|
229
|
+
added: number;
|
|
230
|
+
removed: number;
|
|
231
|
+
}>;
|
|
232
|
+
/** Files touched together in one run → co-changed edges. */
|
|
233
|
+
runFiles?: string[];
|
|
234
|
+
}
|
|
235
|
+
export interface KnowledgeGraph {
|
|
236
|
+
scope: {
|
|
237
|
+
rootId: string;
|
|
238
|
+
packs: string[];
|
|
239
|
+
digest: string;
|
|
240
|
+
};
|
|
241
|
+
nodes: KNode[];
|
|
242
|
+
edges: KEdge[];
|
|
243
|
+
findings: Finding[];
|
|
244
|
+
stats: {
|
|
245
|
+
sources: number;
|
|
246
|
+
nodes: number;
|
|
247
|
+
edges: number;
|
|
248
|
+
stale: number;
|
|
249
|
+
truncated: boolean;
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
export interface ReviewPlan {
|
|
253
|
+
rootId: string;
|
|
254
|
+
files: number;
|
|
255
|
+
byPack: Record<string, number>;
|
|
256
|
+
unchanged: number;
|
|
257
|
+
changed: string[];
|
|
258
|
+
removed: string[];
|
|
259
|
+
skipped: Array<{
|
|
260
|
+
path: string;
|
|
261
|
+
reason: 'ignored' | 'binary' | 'too-large' | 'no-pack';
|
|
262
|
+
}>;
|
|
263
|
+
/** ≈ judgement calls for changed files (sections of judged kinds). */
|
|
264
|
+
estimatedModelCalls: number;
|
|
265
|
+
}
|
|
266
|
+
export interface ReviewProgress {
|
|
267
|
+
phase: 'plan' | 'extract' | 'resolve' | 'judge' | 'write' | 'index' | 'done';
|
|
268
|
+
done: number;
|
|
269
|
+
total: number;
|
|
270
|
+
path?: string;
|
|
271
|
+
}
|
|
272
|
+
export interface ReviewReport {
|
|
273
|
+
rootId: string;
|
|
274
|
+
digest: string;
|
|
275
|
+
extracted: number;
|
|
276
|
+
judged: number;
|
|
277
|
+
/** Sections left extracted-only because the budget ran out. */
|
|
278
|
+
unjudged: number;
|
|
279
|
+
invalidJudgements: number;
|
|
280
|
+
factsWritten: number;
|
|
281
|
+
relationsWritten: number;
|
|
282
|
+
staleMarked: number;
|
|
283
|
+
aborted: boolean;
|
|
284
|
+
durationMs: number;
|
|
285
|
+
}
|
|
286
|
+
export interface ReviewArgs {
|
|
287
|
+
source: DirectorySource;
|
|
288
|
+
store: KnowledgeStore;
|
|
289
|
+
packs: KnowledgePack[];
|
|
290
|
+
manifest: IngestManifest;
|
|
291
|
+
judgement?: JudgementPort;
|
|
292
|
+
/** Near-duplicate claim pairs to compare / possible-same entities; from the knowledge index. */
|
|
293
|
+
similar?: (ids: string[]) => Promise<SimilarPair[]>;
|
|
294
|
+
budget: {
|
|
295
|
+
modelCalls: number;
|
|
296
|
+
ms: number;
|
|
297
|
+
};
|
|
298
|
+
signal?: AbortSignal;
|
|
299
|
+
onProgress?(p: ReviewProgress): void;
|
|
300
|
+
}
|
|
301
|
+
export interface BuildGraphInput {
|
|
302
|
+
rootId: string;
|
|
303
|
+
extracted: Extracted[];
|
|
304
|
+
facts: StoredFact[];
|
|
305
|
+
relations: StoredRelation[];
|
|
306
|
+
packs: KnowledgePack[];
|
|
307
|
+
live?: LiveOverlay;
|
|
308
|
+
nearDuplicates?: SimilarPair[];
|
|
309
|
+
}
|
|
310
|
+
export interface BuildGraphOptions {
|
|
311
|
+
/** Default 400; cap 2000. */
|
|
312
|
+
maxNodes?: number;
|
|
313
|
+
focus?: NodeRef[];
|
|
314
|
+
}
|
|
315
|
+
export interface TraceStep {
|
|
316
|
+
from: NodeRef;
|
|
317
|
+
to: NodeRef;
|
|
318
|
+
depth: number;
|
|
319
|
+
kind: string;
|
|
320
|
+
verdict?: EdgeVerdict;
|
|
321
|
+
cycle?: boolean;
|
|
322
|
+
back?: boolean;
|
|
323
|
+
}
|
|
324
|
+
export interface Trace {
|
|
325
|
+
from: NodeRef;
|
|
326
|
+
/** Partitions present, in registry order (lanes). */
|
|
327
|
+
lanes: string[];
|
|
328
|
+
steps: TraceStep[];
|
|
329
|
+
truncated: boolean;
|
|
330
|
+
}
|
|
331
|
+
/** Re-exported for card consumers. */
|
|
332
|
+
export type { IndexDoc };
|
|
333
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/knowledge/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The knowledge graph model — memory's structure for KNOWLEDGE: facts connected to each
|
|
3
|
+
* other and to the sources they came from (PRD: Builderforce.ai/docs/specs/38-prd-knowledge-graph.md).
|
|
4
|
+
*
|
|
5
|
+
* Generic: it knows sources, entities, facts and relations — never imports or headings.
|
|
6
|
+
* Packs (docs builtin, code registered by the host) supply that meaning as DATA.
|
|
7
|
+
*
|
|
8
|
+
* Store judgement, compute perception: `extracted` nodes/edges are recomputed from sources
|
|
9
|
+
* (cached by content hash) and are NEVER written to a KnowledgeStore; `model`/`human`/`agent`
|
|
10
|
+
* ones are stored with the content hash they were judged from and go stale when it changes.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/knowledge/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* knowledge/packs/docs.ts — the docs pack, built into memory (PRD 38 §4.5).
|
|
3
|
+
*
|
|
4
|
+
* Parsers are the ONE builtin ingest parsers (markdown, HTML, plain text); their `extract`
|
|
5
|
+
* lives in `ingest/docsExtract.ts`. Partitions: one plane per top-level folder, no `allow`
|
|
6
|
+
* (so no verdicts). Findings: broken links and orphan documents. Judgement: claims,
|
|
7
|
+
* entities and contradictions per section.
|
|
8
|
+
*/
|
|
9
|
+
import { DOCS_PACK_ID } from '../../ingest/docsExtract.js';
|
|
10
|
+
import type { FindingRule, KnowledgePack } from '../model.js';
|
|
11
|
+
export { DOCS_PACK_ID };
|
|
12
|
+
/** Links to documents that are not in the directory, grouped per linking file. */
|
|
13
|
+
export declare const brokenLinkRule: FindingRule;
|
|
14
|
+
/** Documents no other document links to (entry documents aside), as one finding. */
|
|
15
|
+
export declare const orphanDocumentRule: FindingRule;
|
|
16
|
+
export declare const DOCS_PACK: KnowledgePack;
|
|
17
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/knowledge/packs/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAW,WAAW,EAAkB,aAAa,EAAW,MAAM,aAAa,CAAC;AAKhG,OAAO,EAAE,YAAY,EAAE,CAAC;AAWxB,kFAAkF;AAClF,eAAO,MAAM,cAAc,EAAE,WAyB5B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,WAqBhC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,aAWvB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* knowledge/packs/docs.ts — the docs pack, built into memory (PRD 38 §4.5).
|
|
3
|
+
*
|
|
4
|
+
* Parsers are the ONE builtin ingest parsers (markdown, HTML, plain text); their `extract`
|
|
5
|
+
* lives in `ingest/docsExtract.ts`. Partitions: one plane per top-level folder, no `allow`
|
|
6
|
+
* (so no verdicts). Findings: broken links and orphan documents. Judgement: claims,
|
|
7
|
+
* entities and contradictions per section.
|
|
8
|
+
*/
|
|
9
|
+
import { htmlParser, markdownParser, plainTextParser } from '../../ingest/parsers.js';
|
|
10
|
+
import { DOCS_PACK_ID } from '../../ingest/docsExtract.js';
|
|
11
|
+
import { findingId, MAX_FINDING_NODES, requestKeyFor } from '../findings.js';
|
|
12
|
+
import { TOP_LEVEL_FOLDER } from '../partitions.js';
|
|
13
|
+
import { basenameOf, compareStr, fileRefOf, pathOfRef } from '../refs.js';
|
|
14
|
+
export { DOCS_PACK_ID };
|
|
15
|
+
/** Targets with these extensions (or none) are documents; a link to anything else is not judged broken. */
|
|
16
|
+
const DOC_TARGET = /(?:\.(?:md|markdown|mdx|html?|txt|rst|adoc)|\/[^./]*|^[^./]*)$/i;
|
|
17
|
+
/** Entry documents are expected to have no inbound links. */
|
|
18
|
+
const ENTRY_DOC = /^(readme|index|home|_index|summary)\.[a-z]+$/i;
|
|
19
|
+
function fileOf(g) {
|
|
20
|
+
return new Map(g.nodes.map((n) => [n.ref, fileRefOf(n.ref)]));
|
|
21
|
+
}
|
|
22
|
+
/** Links to documents that are not in the directory, grouped per linking file. */
|
|
23
|
+
export const brokenLinkRule = {
|
|
24
|
+
id: 'docs.broken-link',
|
|
25
|
+
find(g) {
|
|
26
|
+
const kind = new Map(g.nodes.map((n) => [n.ref, n.kind]));
|
|
27
|
+
const file = fileOf(g);
|
|
28
|
+
const bySource = new Map();
|
|
29
|
+
for (const e of g.edges) {
|
|
30
|
+
if (e.kind !== 'links' || kind.get(e.to) !== 'missing')
|
|
31
|
+
continue;
|
|
32
|
+
if (!DOC_TARGET.test(pathOfRef(e.to) ?? ''))
|
|
33
|
+
continue;
|
|
34
|
+
const source = file.get(e.from) ?? e.from;
|
|
35
|
+
const list = bySource.get(source) ?? [];
|
|
36
|
+
list.push(e.to);
|
|
37
|
+
bySource.set(source, list);
|
|
38
|
+
}
|
|
39
|
+
return [...bySource].sort((a, b) => compareStr(a[0], b[0])).map(([source, targets]) => {
|
|
40
|
+
const unique = [...new Set(targets)].sort(compareStr);
|
|
41
|
+
const nodes = [source, ...unique];
|
|
42
|
+
return {
|
|
43
|
+
id: findingId('broken-link', nodes), kind: 'broken-link', pack: DOCS_PACK_ID,
|
|
44
|
+
nodes: nodes.slice(0, MAX_FINDING_NODES), severity: 'warn',
|
|
45
|
+
params: { count: unique.length, file: pathOfRef(source) ?? source },
|
|
46
|
+
requestKey: requestKeyFor('broken-link'),
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/** Documents no other document links to (entry documents aside), as one finding. */
|
|
52
|
+
export const orphanDocumentRule = {
|
|
53
|
+
id: 'docs.orphan',
|
|
54
|
+
find(g) {
|
|
55
|
+
const file = fileOf(g);
|
|
56
|
+
const linked = new Set();
|
|
57
|
+
for (const e of g.edges) {
|
|
58
|
+
if (e.kind !== 'links')
|
|
59
|
+
continue;
|
|
60
|
+
const from = file.get(e.from) ?? e.from, to = file.get(e.to) ?? e.to;
|
|
61
|
+
if (from !== to)
|
|
62
|
+
linked.add(to);
|
|
63
|
+
}
|
|
64
|
+
const orphans = g.nodes
|
|
65
|
+
.filter((n) => n.pack === DOCS_PACK_ID && n.kind === 'file' && !linked.has(n.ref))
|
|
66
|
+
.filter((n) => !ENTRY_DOC.test(basenameOf(pathOfRef(n.ref) ?? '')))
|
|
67
|
+
.map((n) => n.ref).sort(compareStr);
|
|
68
|
+
if (orphans.length === 0)
|
|
69
|
+
return [];
|
|
70
|
+
return [{
|
|
71
|
+
id: findingId('orphan', orphans), kind: 'orphan', pack: DOCS_PACK_ID,
|
|
72
|
+
nodes: orphans.slice(0, MAX_FINDING_NODES), severity: 'info',
|
|
73
|
+
params: { count: orphans.length }, requestKey: requestKeyFor('orphan'),
|
|
74
|
+
}];
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
export const DOCS_PACK = {
|
|
78
|
+
id: DOCS_PACK_ID,
|
|
79
|
+
parsers: [markdownParser, htmlParser, plainTextParser],
|
|
80
|
+
partitions: {
|
|
81
|
+
partitions: [
|
|
82
|
+
{ id: TOP_LEVEL_FOLDER, order: 0, match: ['*/**'] },
|
|
83
|
+
{ id: '(root)', order: 0, match: ['*'] },
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
findings: [brokenLinkRule, orphanDocumentRule],
|
|
87
|
+
judgement: { nodeKinds: ['section'], claims: true, entities: true, contradictions: true },
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/knowledge/packs/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* knowledge/partitions.ts — ordered groups of sources and who may use whom (PRD 38 §4.4).
|
|
3
|
+
*
|
|
4
|
+
* Generic: code layers and doc folders are both a {@link PartitionRegistry}. An edge's
|
|
5
|
+
* verdict is `same`, `allowed`, `upward` (to a lower order, i.e. a layer above) or
|
|
6
|
+
* `skips` (anything else), and is set only when the registry defines `allow` and both
|
|
7
|
+
* ends are partitioned.
|
|
8
|
+
*
|
|
9
|
+
* A rule whose id is {@link TOP_LEVEL_FOLDER} names its partition after the path's first
|
|
10
|
+
* folder — the docs pack's "one plane per top-level folder" with no per-folder rows.
|
|
11
|
+
*/
|
|
12
|
+
import type { EdgeVerdict, KnowledgePack, PartitionRegistry } from './model.js';
|
|
13
|
+
/** Rule id meaning "the matched path's top-level folder". */
|
|
14
|
+
export declare const TOP_LEVEL_FOLDER = "*";
|
|
15
|
+
/**
|
|
16
|
+
* A glob as a RegExp over `/`-separated paths: `**` spans folders (`**\/` may match none),
|
|
17
|
+
* `*` and `?` stay within one segment, `{a,b}` is alternation.
|
|
18
|
+
*/
|
|
19
|
+
export declare function globToRegExp(glob: string): RegExp;
|
|
20
|
+
export declare function matchGlob(path: string, glob: string): boolean;
|
|
21
|
+
/** The partition a root-relative path belongs to: the first matching rule, in registry order. */
|
|
22
|
+
export declare function partitionOf(path: string, reg: PartitionRegistry): string | undefined;
|
|
23
|
+
/** The order of a partition (folder partitions from {@link TOP_LEVEL_FOLDER} share that rule's). */
|
|
24
|
+
export declare function partitionOrder(id: string, reg: PartitionRegistry): number | undefined;
|
|
25
|
+
export declare function verdictOf(from: string | undefined, to: string | undefined, reg: PartitionRegistry): EdgeVerdict | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* A pack's registry, or a validated `.builderforce/partitions.json` override. Throws a
|
|
28
|
+
* `TypeError` naming the first problem when the override is not a {@link PartitionRegistry}.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadPartitions(pack: KnowledgePack, override?: unknown): PartitionRegistry;
|
|
31
|
+
//# sourceMappingURL=partitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partitions.d.ts","sourceRoot":"","sources":["../../src/knowledge/partitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAC;AAE/F,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAIpC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBjD;AAMD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAQpF;AAED,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAGrF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAQ3H;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,iBAAiB,CA+BzF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* knowledge/partitions.ts — ordered groups of sources and who may use whom (PRD 38 §4.4).
|
|
3
|
+
*
|
|
4
|
+
* Generic: code layers and doc folders are both a {@link PartitionRegistry}. An edge's
|
|
5
|
+
* verdict is `same`, `allowed`, `upward` (to a lower order, i.e. a layer above) or
|
|
6
|
+
* `skips` (anything else), and is set only when the registry defines `allow` and both
|
|
7
|
+
* ends are partitioned.
|
|
8
|
+
*
|
|
9
|
+
* A rule whose id is {@link TOP_LEVEL_FOLDER} names its partition after the path's first
|
|
10
|
+
* folder — the docs pack's "one plane per top-level folder" with no per-folder rows.
|
|
11
|
+
*/
|
|
12
|
+
/** Rule id meaning "the matched path's top-level folder". */
|
|
13
|
+
export const TOP_LEVEL_FOLDER = '*';
|
|
14
|
+
const globCache = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* A glob as a RegExp over `/`-separated paths: `**` spans folders (`**\/` may match none),
|
|
17
|
+
* `*` and `?` stay within one segment, `{a,b}` is alternation.
|
|
18
|
+
*/
|
|
19
|
+
export function globToRegExp(glob) {
|
|
20
|
+
const cached = globCache.get(glob);
|
|
21
|
+
if (cached)
|
|
22
|
+
return cached;
|
|
23
|
+
let re = '';
|
|
24
|
+
for (let i = 0; i < glob.length; i++) {
|
|
25
|
+
const ch = glob[i];
|
|
26
|
+
if (ch === '*') {
|
|
27
|
+
if (glob[i + 1] === '*') {
|
|
28
|
+
const slashAfter = glob[i + 2] === '/';
|
|
29
|
+
re += slashAfter ? '(?:.*/)?' : '.*';
|
|
30
|
+
i += slashAfter ? 2 : 1;
|
|
31
|
+
}
|
|
32
|
+
else
|
|
33
|
+
re += '[^/]*';
|
|
34
|
+
}
|
|
35
|
+
else if (ch === '?')
|
|
36
|
+
re += '[^/]';
|
|
37
|
+
else if (ch === '{') {
|
|
38
|
+
const close = glob.indexOf('}', i);
|
|
39
|
+
if (close < 0) {
|
|
40
|
+
re += '\\{';
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
re += `(?:${glob.slice(i + 1, close).split(',').map(escapeRe).join('|')})`;
|
|
44
|
+
i = close;
|
|
45
|
+
}
|
|
46
|
+
else
|
|
47
|
+
re += escapeRe(ch);
|
|
48
|
+
}
|
|
49
|
+
const compiled = new RegExp(`^${re}$`);
|
|
50
|
+
globCache.set(glob, compiled);
|
|
51
|
+
return compiled;
|
|
52
|
+
}
|
|
53
|
+
function escapeRe(s) {
|
|
54
|
+
return s.replace(/[.+^${}()|[\]\\*?]/g, '\\$&');
|
|
55
|
+
}
|
|
56
|
+
export function matchGlob(path, glob) {
|
|
57
|
+
return globToRegExp(glob).test(path);
|
|
58
|
+
}
|
|
59
|
+
/** The partition a root-relative path belongs to: the first matching rule, in registry order. */
|
|
60
|
+
export function partitionOf(path, reg) {
|
|
61
|
+
for (const rule of reg.partitions) {
|
|
62
|
+
if (!rule.match.some((g) => matchGlob(path, g)))
|
|
63
|
+
continue;
|
|
64
|
+
if (rule.id !== TOP_LEVEL_FOLDER)
|
|
65
|
+
return rule.id;
|
|
66
|
+
const slash = path.indexOf('/');
|
|
67
|
+
return slash > 0 ? path.slice(0, slash) : undefined;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
/** The order of a partition (folder partitions from {@link TOP_LEVEL_FOLDER} share that rule's). */
|
|
72
|
+
export function partitionOrder(id, reg) {
|
|
73
|
+
const rule = reg.partitions.find((r) => r.id === id) ?? reg.partitions.find((r) => r.id === TOP_LEVEL_FOLDER);
|
|
74
|
+
return rule?.order;
|
|
75
|
+
}
|
|
76
|
+
export function verdictOf(from, to, reg) {
|
|
77
|
+
if (!reg.allow || from === undefined || to === undefined)
|
|
78
|
+
return undefined;
|
|
79
|
+
if (from === to)
|
|
80
|
+
return 'same';
|
|
81
|
+
if (reg.allow[from]?.includes(to))
|
|
82
|
+
return 'allowed';
|
|
83
|
+
const fromOrder = partitionOrder(from, reg);
|
|
84
|
+
const toOrder = partitionOrder(to, reg);
|
|
85
|
+
if (fromOrder !== undefined && toOrder !== undefined && toOrder < fromOrder)
|
|
86
|
+
return 'upward';
|
|
87
|
+
return 'skips';
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A pack's registry, or a validated `.builderforce/partitions.json` override. Throws a
|
|
91
|
+
* `TypeError` naming the first problem when the override is not a {@link PartitionRegistry}.
|
|
92
|
+
*/
|
|
93
|
+
export function loadPartitions(pack, override) {
|
|
94
|
+
if (override === undefined || override === null)
|
|
95
|
+
return pack.partitions ?? { partitions: [] };
|
|
96
|
+
const fail = (why) => { throw new TypeError(`partitions.json: ${why}`); };
|
|
97
|
+
if (typeof override !== 'object' || Array.isArray(override))
|
|
98
|
+
fail('expected an object');
|
|
99
|
+
const o = override;
|
|
100
|
+
if (!Array.isArray(o['partitions']))
|
|
101
|
+
fail('`partitions` must be an array');
|
|
102
|
+
const partitions = o['partitions'].map((raw, i) => {
|
|
103
|
+
const r = raw;
|
|
104
|
+
if (!r || typeof r !== 'object')
|
|
105
|
+
fail(`partitions[${i}] must be an object`);
|
|
106
|
+
if (typeof r['id'] !== 'string' || !r['id'])
|
|
107
|
+
fail(`partitions[${i}].id must be a non-empty string`);
|
|
108
|
+
if (typeof r['order'] !== 'number' || !Number.isFinite(r['order']))
|
|
109
|
+
fail(`partitions[${i}].order must be a number`);
|
|
110
|
+
const match = r['match'];
|
|
111
|
+
if (!Array.isArray(match) || !match.every((g) => typeof g === 'string' && g)) {
|
|
112
|
+
fail(`partitions[${i}].match must be an array of globs`);
|
|
113
|
+
}
|
|
114
|
+
return { id: r['id'], order: r['order'], match: [...match] };
|
|
115
|
+
});
|
|
116
|
+
const ids = new Set(partitions.map((p) => p.id));
|
|
117
|
+
if (ids.size !== partitions.length)
|
|
118
|
+
fail('partition ids must be unique');
|
|
119
|
+
if (o['allow'] === undefined)
|
|
120
|
+
return { partitions };
|
|
121
|
+
const allowRaw = o['allow'];
|
|
122
|
+
if (!allowRaw || typeof allowRaw !== 'object' || Array.isArray(allowRaw))
|
|
123
|
+
fail('`allow` must be an object');
|
|
124
|
+
const allow = {};
|
|
125
|
+
for (const [from, to] of Object.entries(allowRaw)) {
|
|
126
|
+
if (!ids.has(from))
|
|
127
|
+
fail(`allow.${from} names an unknown partition`);
|
|
128
|
+
if (!Array.isArray(to) || !to.every((t) => typeof t === 'string' && ids.has(t))) {
|
|
129
|
+
fail(`allow.${from} must list known partition ids`);
|
|
130
|
+
}
|
|
131
|
+
allow[from] = [...to];
|
|
132
|
+
}
|
|
133
|
+
return { partitions, allow };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=partitions.js.map
|