backpack-ontology 0.5.2 → 0.6.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 +38 -0
- package/dist/core/discovery-audit.d.ts +29 -0
- package/dist/core/discovery-audit.d.ts.map +1 -0
- package/dist/core/discovery-audit.js +251 -0
- package/dist/core/discovery-audit.js.map +1 -0
- package/dist/core/draft.d.ts +1 -1
- package/dist/core/draft.d.ts.map +1 -1
- package/dist/core/draft.js +28 -0
- package/dist/core/draft.js.map +1 -1
- package/dist/core/extraction-quality.d.ts +10 -0
- package/dist/core/extraction-quality.d.ts.map +1 -0
- package/dist/core/extraction-quality.js +30 -0
- package/dist/core/extraction-quality.js.map +1 -0
- package/dist/core/pattern-analyzer.d.ts +3 -0
- package/dist/core/pattern-analyzer.d.ts.map +1 -0
- package/dist/core/pattern-analyzer.js +348 -0
- package/dist/core/pattern-analyzer.js.map +1 -0
- package/dist/core/processor-pipeline.d.ts +7 -0
- package/dist/core/processor-pipeline.d.ts.map +1 -0
- package/dist/core/processor-pipeline.js +55 -0
- package/dist/core/processor-pipeline.js.map +1 -0
- package/dist/core/processors/duplicate-detector.d.ts +10 -0
- package/dist/core/processors/duplicate-detector.d.ts.map +1 -0
- package/dist/core/processors/duplicate-detector.js +62 -0
- package/dist/core/processors/duplicate-detector.js.map +1 -0
- package/dist/core/processors/relationship-threshold.d.ts +10 -0
- package/dist/core/processors/relationship-threshold.d.ts.map +1 -0
- package/dist/core/processors/relationship-threshold.js +165 -0
- package/dist/core/processors/relationship-threshold.js.map +1 -0
- package/dist/core/processors/role-audit-validator.d.ts +10 -0
- package/dist/core/processors/role-audit-validator.d.ts.map +1 -0
- package/dist/core/processors/role-audit-validator.js +56 -0
- package/dist/core/processors/role-audit-validator.js.map +1 -0
- package/dist/core/processors/vagueness-filter.d.ts +10 -0
- package/dist/core/processors/vagueness-filter.d.ts.map +1 -0
- package/dist/core/processors/vagueness-filter.js +158 -0
- package/dist/core/processors/vagueness-filter.js.map +1 -0
- package/dist/core/recommendation-formatter.d.ts +39 -0
- package/dist/core/recommendation-formatter.d.ts.map +1 -0
- package/dist/core/recommendation-formatter.js +120 -0
- package/dist/core/recommendation-formatter.js.map +1 -0
- package/dist/core/telemetry.d.ts +6 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js +18 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/types.d.ts +74 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/bulk-tools.d.ts.map +1 -1
- package/dist/mcp/tools/bulk-tools.js +91 -3
- package/dist/mcp/tools/bulk-tools.js.map +1 -1
- package/dist/mcp/tools/intelligence-tools.d.ts.map +1 -1
- package/dist/mcp/tools/intelligence-tools.js +270 -6
- package/dist/mcp/tools/intelligence-tools.js.map +1 -1
- package/dist/mcp/tools/node-tools.d.ts.map +1 -1
- package/dist/mcp/tools/node-tools.js +26 -3
- package/dist/mcp/tools/node-tools.js.map +1 -1
- package/dist/mcp/tools/ontology-tools.d.ts +1 -0
- package/dist/mcp/tools/ontology-tools.d.ts.map +1 -1
- package/dist/mcp/tools/ontology-tools.js +79 -6
- package/dist/mcp/tools/ontology-tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -255,6 +255,44 @@ npx -p backpack-ontology@latest backpack-benchmark
|
|
|
255
255
|
|
|
256
256
|
Across sessions, the real value is that the graph exists at all. It's built once and queried forever — every future conversation uses structured lookups instead of re-explaining context from scratch.
|
|
257
257
|
|
|
258
|
+
## Source metadata (automatic)
|
|
259
|
+
|
|
260
|
+
Every node extracted from an external source — email, JIRA, web page, document — automatically carries metadata that points back to where it came from. This enables traceability and staleness detection.
|
|
261
|
+
|
|
262
|
+
When Claude mines or extracts data, it attaches four properties to every node:
|
|
263
|
+
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"id": "n_vendor_abc",
|
|
267
|
+
"type": "Vendor",
|
|
268
|
+
"properties": {
|
|
269
|
+
"name": "ABC Maintenance",
|
|
270
|
+
|
|
271
|
+
// Automatic source metadata
|
|
272
|
+
"source": "email:outlook/thread-xyz789",
|
|
273
|
+
"source_type": "email",
|
|
274
|
+
"source_date": "2026-04-10T14:22:00Z",
|
|
275
|
+
"source_reference": "Subject: Vendor consolidation plan"
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
| Field | What it is | Example |
|
|
281
|
+
|---|---|---|
|
|
282
|
+
| `source` | Pointer to original data | `https://example.com/team`, `email:outlook/thread-123`, `jira:myproject/ISSUE-42` |
|
|
283
|
+
| `source_type` | System that owns this data | `web`, `email`, `jira`, `slack`, `document` |
|
|
284
|
+
| `source_date` | When the data was created/modified | ISO 8601 timestamp |
|
|
285
|
+
| `source_reference` | Human-readable context | `"Team page"`, `"Subject: Q2 planning"`, `"ISSUE-42: Pricing"` |
|
|
286
|
+
|
|
287
|
+
**Why this matters:**
|
|
288
|
+
|
|
289
|
+
- **Traceability** — You (or Claude) can always click back to the original source
|
|
290
|
+
- **Staleness detection** — Queries can see how fresh extracted data is and when to re-fetch
|
|
291
|
+
- **No lock-in** — Source pointers mean Backpack is an index layer, not a data warehouse. Original data stays where it is.
|
|
292
|
+
- **Trust** — You can show exactly where insights and recommendations come from
|
|
293
|
+
|
|
294
|
+
Claude always adds this metadata automatically. You never need to think about it — just let your AI mine data naturally.
|
|
295
|
+
|
|
258
296
|
## Data and privacy
|
|
259
297
|
|
|
260
298
|
**Backpack Local**: your data is stored at `~/.local/share/backpack/graphs/<graph-name>/` as an append-only event log per branch (`branches/<branch>/events.jsonl`) plus a materialized snapshot cache (`branches/<branch>/snapshot.json`). Both are human-readable, backupable, and version-controlable. Graphs from earlier versions are migrated to this format automatically on first start — nothing to do.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type SourceType = "email" | "document" | "api" | "system" | "interview" | "spreadsheet" | "database" | "chat" | "ticket" | "other";
|
|
2
|
+
export interface DiscoveredSource {
|
|
3
|
+
name: string;
|
|
4
|
+
category: string;
|
|
5
|
+
type: SourceType;
|
|
6
|
+
}
|
|
7
|
+
export interface CategoryScore {
|
|
8
|
+
category: string;
|
|
9
|
+
sourcesFound: string[];
|
|
10
|
+
coveragePct: number;
|
|
11
|
+
gapPct: number;
|
|
12
|
+
nextSteps: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface DiscoveryAudit {
|
|
15
|
+
categories: CategoryScore[];
|
|
16
|
+
totalCoverage: number;
|
|
17
|
+
criticalGaps: string[];
|
|
18
|
+
recommendations: string[];
|
|
19
|
+
}
|
|
20
|
+
interface CategoryDef {
|
|
21
|
+
name: string;
|
|
22
|
+
keywords: string[];
|
|
23
|
+
expectedSourceTypes: SourceType[];
|
|
24
|
+
nextStepHints: string[];
|
|
25
|
+
}
|
|
26
|
+
export declare function auditDiscovery(sources: DiscoveredSource[], additionalCategories?: CategoryDef[]): DiscoveryAudit;
|
|
27
|
+
export declare const HOSPITALITY_CATEGORIES: CategoryDef[];
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=discovery-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-audit.d.ts","sourceRoot":"","sources":["../../src/core/discovery-audit.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,UAAU,GACV,KAAK,GACL,QAAQ,GACR,WAAW,GACX,aAAa,GACb,UAAU,GACV,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB,EAAE,UAAU,EAAE,CAAC;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyMD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,oBAAoB,GAAE,WAAW,EAAO,GACvC,cAAc,CAoChB;AAGD,eAAO,MAAM,sBAAsB,EAAE,WAAW,EA+B/C,CAAC"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Discovery audit — structured coverage checker for mining phase.
|
|
3
|
+
//
|
|
4
|
+
// Maps declared sources against universal data categories and
|
|
5
|
+
// returns coverage scores + gap analysis. Pure: no I/O.
|
|
6
|
+
//
|
|
7
|
+
// Universal categories (vertical-agnostic):
|
|
8
|
+
// Communications, Operations, Financial, People/Org,
|
|
9
|
+
// Systems, External, Historical
|
|
10
|
+
//
|
|
11
|
+
// Vertical extensions can be passed in as additionalCategories.
|
|
12
|
+
// ============================================================
|
|
13
|
+
const UNIVERSAL_CATEGORIES = [
|
|
14
|
+
{
|
|
15
|
+
name: "Communications",
|
|
16
|
+
keywords: [
|
|
17
|
+
"communication",
|
|
18
|
+
"email",
|
|
19
|
+
"slack",
|
|
20
|
+
"chat",
|
|
21
|
+
"meeting",
|
|
22
|
+
"transcript",
|
|
23
|
+
"message",
|
|
24
|
+
"correspondence",
|
|
25
|
+
"notification",
|
|
26
|
+
],
|
|
27
|
+
expectedSourceTypes: ["email", "chat", "interview"],
|
|
28
|
+
nextStepHints: [
|
|
29
|
+
"Check email archives (Gmail, Outlook)",
|
|
30
|
+
"Export Slack/Teams channel history",
|
|
31
|
+
"Review meeting transcripts or notes",
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "Operations",
|
|
36
|
+
keywords: [
|
|
37
|
+
"operation",
|
|
38
|
+
"process",
|
|
39
|
+
"runbook",
|
|
40
|
+
"ticket",
|
|
41
|
+
"log",
|
|
42
|
+
"incident",
|
|
43
|
+
"jira",
|
|
44
|
+
"workflow",
|
|
45
|
+
"procedure",
|
|
46
|
+
"sop",
|
|
47
|
+
],
|
|
48
|
+
expectedSourceTypes: ["ticket", "document", "system"],
|
|
49
|
+
nextStepHints: [
|
|
50
|
+
"Pull open tickets from JIRA/Linear/GitHub Issues",
|
|
51
|
+
"Review runbooks or SOPs",
|
|
52
|
+
"Export incident logs or post-mortems",
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "Financial",
|
|
57
|
+
keywords: [
|
|
58
|
+
"financial",
|
|
59
|
+
"finance",
|
|
60
|
+
"contract",
|
|
61
|
+
"invoice",
|
|
62
|
+
"budget",
|
|
63
|
+
"expense",
|
|
64
|
+
"revenue",
|
|
65
|
+
"cost",
|
|
66
|
+
"accounting",
|
|
67
|
+
"payroll",
|
|
68
|
+
"vendor",
|
|
69
|
+
"spend",
|
|
70
|
+
],
|
|
71
|
+
expectedSourceTypes: ["document", "spreadsheet", "api"],
|
|
72
|
+
nextStepHints: [
|
|
73
|
+
"Request vendor contracts and invoices",
|
|
74
|
+
"Pull P&L or budget spreadsheets",
|
|
75
|
+
"Export accounting system data (QuickBooks, Xero, NetSuite)",
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "People/Org",
|
|
80
|
+
keywords: [
|
|
81
|
+
"people",
|
|
82
|
+
"org",
|
|
83
|
+
"hr",
|
|
84
|
+
"team",
|
|
85
|
+
"role",
|
|
86
|
+
"employee",
|
|
87
|
+
"staff",
|
|
88
|
+
"hiring",
|
|
89
|
+
"performance",
|
|
90
|
+
"org chart",
|
|
91
|
+
"directory",
|
|
92
|
+
],
|
|
93
|
+
expectedSourceTypes: ["document", "spreadsheet", "interview"],
|
|
94
|
+
nextStepHints: [
|
|
95
|
+
"Get org chart or team roster",
|
|
96
|
+
"Review role descriptions and responsibilities",
|
|
97
|
+
"Interview key stakeholders about ownership",
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: "Systems",
|
|
102
|
+
keywords: [
|
|
103
|
+
"system",
|
|
104
|
+
"api",
|
|
105
|
+
"integration",
|
|
106
|
+
"dashboard",
|
|
107
|
+
"config",
|
|
108
|
+
"infrastructure",
|
|
109
|
+
"tool",
|
|
110
|
+
"software",
|
|
111
|
+
"platform",
|
|
112
|
+
"database",
|
|
113
|
+
"service",
|
|
114
|
+
],
|
|
115
|
+
expectedSourceTypes: ["api", "system", "document"],
|
|
116
|
+
nextStepHints: [
|
|
117
|
+
"Document all third-party tools and integrations",
|
|
118
|
+
"Review architecture diagrams or system docs",
|
|
119
|
+
"Audit API connections and data flows",
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "External",
|
|
124
|
+
keywords: [
|
|
125
|
+
"external",
|
|
126
|
+
"competitor",
|
|
127
|
+
"market",
|
|
128
|
+
"regulation",
|
|
129
|
+
"compliance",
|
|
130
|
+
"benchmark",
|
|
131
|
+
"industry",
|
|
132
|
+
"customer",
|
|
133
|
+
"partner",
|
|
134
|
+
"vendor",
|
|
135
|
+
],
|
|
136
|
+
expectedSourceTypes: ["document", "interview", "other"],
|
|
137
|
+
nextStepHints: [
|
|
138
|
+
"Research competitor landscape",
|
|
139
|
+
"Review relevant regulations or compliance requirements",
|
|
140
|
+
"Gather customer or partner feedback",
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: "Historical",
|
|
145
|
+
keywords: [
|
|
146
|
+
"historical",
|
|
147
|
+
"history",
|
|
148
|
+
"archive",
|
|
149
|
+
"past",
|
|
150
|
+
"previous",
|
|
151
|
+
"legacy",
|
|
152
|
+
"decision",
|
|
153
|
+
"trend",
|
|
154
|
+
"case study",
|
|
155
|
+
"retrospective",
|
|
156
|
+
"report",
|
|
157
|
+
],
|
|
158
|
+
expectedSourceTypes: ["document", "database", "other"],
|
|
159
|
+
nextStepHints: [
|
|
160
|
+
"Pull historical reports and archives",
|
|
161
|
+
"Review past decision logs or post-mortems",
|
|
162
|
+
"Check for trend data or time-series records",
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
// --- Scoring ---
|
|
167
|
+
function matchesCategory(source, cat) {
|
|
168
|
+
const categoryNorm = source.category.toLowerCase();
|
|
169
|
+
return cat.keywords.some((kw) => categoryNorm.includes(kw) || kw.includes(categoryNorm));
|
|
170
|
+
}
|
|
171
|
+
function scoreCoverage(sources, cat) {
|
|
172
|
+
const matched = sources.filter((s) => matchesCategory(s, cat));
|
|
173
|
+
const foundTypes = new Set(matched.map((s) => s.type));
|
|
174
|
+
const expectedCount = cat.expectedSourceTypes.length;
|
|
175
|
+
const foundCount = cat.expectedSourceTypes.filter((t) => foundTypes.has(t)).length;
|
|
176
|
+
// Coverage = % of expected source types found, weighted by count
|
|
177
|
+
const typeCoverage = expectedCount > 0 ? foundCount / expectedCount : 0;
|
|
178
|
+
const sourceCoverage = matched.length > 0 ? Math.min(1, matched.length / 2) : 0;
|
|
179
|
+
const coveragePct = Math.round(((typeCoverage + sourceCoverage) / 2) * 100);
|
|
180
|
+
const nextSteps = coveragePct < 80
|
|
181
|
+
? cat.nextStepHints.filter((_, i) => {
|
|
182
|
+
// Surface hints for missing source types
|
|
183
|
+
const expectedType = cat.expectedSourceTypes[i];
|
|
184
|
+
return expectedType ? !foundTypes.has(expectedType) : true;
|
|
185
|
+
})
|
|
186
|
+
: [];
|
|
187
|
+
return {
|
|
188
|
+
category: cat.name,
|
|
189
|
+
sourcesFound: matched.map((s) => s.name),
|
|
190
|
+
coveragePct,
|
|
191
|
+
gapPct: 100 - coveragePct,
|
|
192
|
+
nextSteps,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// --- Main entry ---
|
|
196
|
+
export function auditDiscovery(sources, additionalCategories = []) {
|
|
197
|
+
const allCategories = [...UNIVERSAL_CATEGORIES, ...additionalCategories];
|
|
198
|
+
const categoryScores = allCategories.map((cat) => scoreCoverage(sources, cat));
|
|
199
|
+
const totalCoverage = Math.round(categoryScores.reduce((sum, c) => sum + c.coveragePct, 0) /
|
|
200
|
+
categoryScores.length);
|
|
201
|
+
const criticalGaps = categoryScores
|
|
202
|
+
.filter((c) => c.coveragePct < 30)
|
|
203
|
+
.map((c) => c.category);
|
|
204
|
+
const recommendations = [];
|
|
205
|
+
for (const score of categoryScores) {
|
|
206
|
+
if (score.coveragePct === 0) {
|
|
207
|
+
recommendations.push(`No ${score.category} sources found — this is a critical blind spot. ${score.nextSteps[0] ?? ""}`);
|
|
208
|
+
}
|
|
209
|
+
else if (score.coveragePct < 30) {
|
|
210
|
+
recommendations.push(`${score.category} coverage is weak (${score.coveragePct}%). ${score.nextSteps[0] ?? ""}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (totalCoverage < 50) {
|
|
214
|
+
recommendations.push("Overall discovery coverage is below 50% — mining will produce an incomplete picture. Prioritize finding sources in critical gap categories before synthesizing.");
|
|
215
|
+
}
|
|
216
|
+
return { categories: categoryScores, totalCoverage, criticalGaps, recommendations };
|
|
217
|
+
}
|
|
218
|
+
// Hospitality vertical extension — importable by consumers
|
|
219
|
+
export const HOSPITALITY_CATEGORIES = [
|
|
220
|
+
{
|
|
221
|
+
name: "Pricing & Revenue",
|
|
222
|
+
keywords: ["pricing", "rate", "revenue", "yield", "channel", "booking", "occupancy", "adr", "revpar"],
|
|
223
|
+
expectedSourceTypes: ["spreadsheet", "api", "system"],
|
|
224
|
+
nextStepHints: [
|
|
225
|
+
"Export channel rate history (Expedia, Airbnb, VRBO, Booking.com)",
|
|
226
|
+
"Pull ADR/RevPAR reports from PMS",
|
|
227
|
+
"Review seasonal pricing strategy documents",
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: "Property & Maintenance",
|
|
232
|
+
keywords: ["property", "maintenance", "repair", "unit", "room", "amenity", "inspection", "work order"],
|
|
233
|
+
expectedSourceTypes: ["ticket", "document", "system"],
|
|
234
|
+
nextStepHints: [
|
|
235
|
+
"Export work order history from property management system",
|
|
236
|
+
"Review maintenance logs and inspection records",
|
|
237
|
+
"Check vendor contracts for maintenance services",
|
|
238
|
+
],
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: "Owner & HOA",
|
|
242
|
+
keywords: ["owner", "hoa", "bylaw", "association", "board", "dues", "meeting minutes"],
|
|
243
|
+
expectedSourceTypes: ["document", "email", "interview"],
|
|
244
|
+
nextStepHints: [
|
|
245
|
+
"Request HOA bylaws and board meeting minutes",
|
|
246
|
+
"Pull owner correspondence and financial statements",
|
|
247
|
+
"Interview board members about recurring issues",
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
];
|
|
251
|
+
//# sourceMappingURL=discovery-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-audit.js","sourceRoot":"","sources":["../../src/core/discovery-audit.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kEAAkE;AAClE,EAAE;AACF,8DAA8D;AAC9D,wDAAwD;AACxD,EAAE;AACF,4CAA4C;AAC5C,uDAAuD;AACvD,kCAAkC;AAClC,EAAE;AACF,gEAAgE;AAChE,+DAA+D;AA4C/D,MAAM,oBAAoB,GAAkB;IAC1C;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE;YACR,eAAe;YACf,OAAO;YACP,OAAO;YACP,MAAM;YACN,SAAS;YACT,YAAY;YACZ,SAAS;YACT,gBAAgB;YAChB,cAAc;SACf;QACD,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;QACnD,aAAa,EAAE;YACb,uCAAuC;YACvC,oCAAoC;YACpC,qCAAqC;SACtC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,WAAW;YACX,SAAS;YACT,SAAS;YACT,QAAQ;YACR,KAAK;YACL,UAAU;YACV,MAAM;YACN,UAAU;YACV,WAAW;YACX,KAAK;SACN;QACD,mBAAmB,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;QACrD,aAAa,EAAE;YACb,kDAAkD;YAClD,yBAAyB;YACzB,sCAAsC;SACvC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE;YACR,WAAW;YACX,SAAS;YACT,UAAU;YACV,SAAS;YACT,QAAQ;YACR,SAAS;YACT,SAAS;YACT,MAAM;YACN,YAAY;YACZ,SAAS;YACT,QAAQ;YACR,OAAO;SACR;QACD,mBAAmB,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC;QACvD,aAAa,EAAE;YACb,uCAAuC;YACvC,iCAAiC;YACjC,4DAA4D;SAC7D;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,QAAQ;YACR,KAAK;YACL,IAAI;YACJ,MAAM;YACN,MAAM;YACN,UAAU;YACV,OAAO;YACP,QAAQ;YACR,aAAa;YACb,WAAW;YACX,WAAW;SACZ;QACD,mBAAmB,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,WAAW,CAAC;QAC7D,aAAa,EAAE;YACb,8BAA8B;YAC9B,+CAA+C;YAC/C,4CAA4C;SAC7C;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE;YACR,QAAQ;YACR,KAAK;YACL,aAAa;YACb,WAAW;YACX,QAAQ;YACR,gBAAgB;YAChB,MAAM;YACN,UAAU;YACV,UAAU;YACV,UAAU;YACV,SAAS;SACV;QACD,mBAAmB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;QAClD,aAAa,EAAE;YACb,iDAAiD;YACjD,6CAA6C;YAC7C,sCAAsC;SACvC;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,YAAY;YACZ,YAAY;YACZ,WAAW;YACX,UAAU;YACV,UAAU;YACV,SAAS;YACT,QAAQ;SACT;QACD,mBAAmB,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC;QACvD,aAAa,EAAE;YACb,+BAA+B;YAC/B,wDAAwD;YACxD,qCAAqC;SACtC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,YAAY;YACZ,SAAS;YACT,SAAS;YACT,MAAM;YACN,UAAU;YACV,QAAQ;YACR,UAAU;YACV,OAAO;YACP,YAAY;YACZ,eAAe;YACf,QAAQ;SACT;QACD,mBAAmB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC;QACtD,aAAa,EAAE;YACb,sCAAsC;YACtC,2CAA2C;YAC3C,6CAA6C;SAC9C;KACF;CACF,CAAC;AAEF,kBAAkB;AAElB,SAAS,eAAe,CAAC,MAAwB,EAAE,GAAgB;IACjE,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACnD,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CACtB,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,OAA2B,EAC3B,GAAgB;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC;IACrD,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAClB,CAAC,MAAM,CAAC;IAET,iEAAiE;IACjE,MAAM,YAAY,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAE5E,MAAM,SAAS,GACb,WAAW,GAAG,EAAE;QACd,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAChC,yCAAyC;YACzC,MAAM,YAAY,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,CAAC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IAET,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,WAAW;QACX,MAAM,EAAE,GAAG,GAAG,WAAW;QACzB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,qBAAqB;AAErB,MAAM,UAAU,cAAc,CAC5B,OAA2B,EAC3B,uBAAsC,EAAE;IAExC,MAAM,aAAa,GAAG,CAAC,GAAG,oBAAoB,EAAE,GAAG,oBAAoB,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAC5B,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,cAAc,CAAC,MAAM,CACxB,CAAC;IAEF,MAAM,YAAY,GAAG,cAAc;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC5B,eAAe,CAAC,IAAI,CAClB,MAAM,KAAK,CAAC,QAAQ,mDAAmD,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAClG,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAClC,eAAe,CAAC,IAAI,CAClB,GAAG,KAAK,CAAC,QAAQ,sBAAsB,KAAK,CAAC,WAAW,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAG,EAAE,EAAE,CAAC;QACvB,eAAe,CAAC,IAAI,CAClB,iKAAiK,CAClK,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;AACtF,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD;QACE,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrG,mBAAmB,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC;QACrD,aAAa,EAAE;YACb,kEAAkE;YAClE,kCAAkC;YAClC,4CAA4C;SAC7C;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC;QACtG,mBAAmB,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;QACrD,aAAa,EAAE;YACb,2DAA2D;YAC3D,gDAAgD;YAChD,iDAAiD;SAClD;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC;QACtF,mBAAmB,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC;QACvD,aAAa,EAAE;YACb,8CAA8C;YAC9C,oDAAoD;YACpD,gDAAgD;SACjD;KACF;CACF,CAAC"}
|
package/dist/core/draft.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface ProposedEdge {
|
|
|
9
9
|
target: number | string;
|
|
10
10
|
properties?: Record<string, unknown>;
|
|
11
11
|
}
|
|
12
|
-
export type DraftWarningKind = "type_drift" | "duplicate_node" | "role_violation_procedural" | "role_violation_briefing";
|
|
12
|
+
export type DraftWarningKind = "type_drift" | "duplicate_node" | "role_violation_procedural" | "role_violation_briefing" | "missing_summary" | "summary_too_long";
|
|
13
13
|
export interface DraftWarning {
|
|
14
14
|
kind: DraftWarningKind;
|
|
15
15
|
/** Index into the proposed nodes array, when the warning is about a node */
|
package/dist/core/draft.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/core/draft.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAQ,MAAM,YAAY,CAAC;AAK1D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,gBAAgB,GAChB,2BAA2B,GAC3B,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/core/draft.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAQ,MAAM,YAAY,CAAC;AAK1D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,gBAAgB,GAChB,2BAA2B,GAC3B,yBAAyB,GACzB,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,qBAAqB,GACrB,wBAAwB,GACxB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,EAAE,EAAE,OAAO,CAAC;IACZ,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,0CAA0C;IAC1C,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAmFD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,YAAY,EAAE,EAC7B,aAAa,GAAE,YAAY,EAAO,GACjC,WAAW,CA2Mb"}
|
package/dist/core/draft.js
CHANGED
|
@@ -151,6 +151,34 @@ export function validateProposal(graph, proposedNodes, proposedEdges = []) {
|
|
|
151
151
|
suggestion: candidate.suggestion,
|
|
152
152
|
});
|
|
153
153
|
}
|
|
154
|
+
// --- Source metadata completeness ---
|
|
155
|
+
//
|
|
156
|
+
// When a node declares a source, we strongly encourage a summary too.
|
|
157
|
+
// Summary must be present (non-empty) and <= 150 chars.
|
|
158
|
+
for (let i = 0; i < proposedNodes.length; i++) {
|
|
159
|
+
const node = proposedNodes[i];
|
|
160
|
+
const hasSource = typeof node.properties.source === "string" &&
|
|
161
|
+
node.properties.source.length > 0;
|
|
162
|
+
if (!hasSource)
|
|
163
|
+
continue;
|
|
164
|
+
const summary = node.properties.summary;
|
|
165
|
+
if (summary === undefined || summary === null || summary === "") {
|
|
166
|
+
warnings.push({
|
|
167
|
+
kind: "missing_summary",
|
|
168
|
+
nodeIndex: i,
|
|
169
|
+
message: `node[${i}] has a source but no summary property`,
|
|
170
|
+
suggestion: 'Add a summary: 1-2 sentences describing the key fact this node represents (max 150 chars). Example: "Vendor ABC charges $50k/year for HVAC maintenance across all 8 properties."',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else if (typeof summary === "string" && summary.length > 150) {
|
|
174
|
+
warnings.push({
|
|
175
|
+
kind: "summary_too_long",
|
|
176
|
+
nodeIndex: i,
|
|
177
|
+
message: `node[${i}] summary is ${summary.length} chars — exceeds 150 char limit`,
|
|
178
|
+
suggestion: "Trim the summary to 1-2 sentences, max 150 characters. Focus on the single most important fact.",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
154
182
|
// --- Validate edges ---
|
|
155
183
|
for (let i = 0; i < proposedEdges.length; i++) {
|
|
156
184
|
const edge = proposedEdges[i];
|
package/dist/core/draft.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/core/draft.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wCAAwC;AACxC,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,yDAAyD;AACzD,EAAE;AACF,iEAAiE;AACjE,iEAAiE;AACjE,sDAAsD;AACtD,EAAE;AACF,kEAAkE;AAClE,sCAAsC;AACtC,+DAA+D;AAG/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/core/draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExtractionProcessor, ExtractionQualityReport, ProposedEdgeInput, ProposedNodeInput } from "./types.js";
|
|
2
|
+
import type { Node, Edge } from "./types.js";
|
|
3
|
+
export declare class ExtractionQualityValidator {
|
|
4
|
+
private pipeline;
|
|
5
|
+
constructor();
|
|
6
|
+
/** Register a custom processor (Marker, Llama, GPU, domain extension). */
|
|
7
|
+
register(processor: ExtractionProcessor): void;
|
|
8
|
+
validate(nodes: ProposedNodeInput[], edges: ProposedEdgeInput[], existingNodes: Node[], existingEdges: Edge[]): ExtractionQualityReport;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=extraction-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-quality.d.ts","sourceRoot":"","sources":["../../src/core/extraction-quality.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAO7C,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAsB;;IAUtC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI;IAI9C,QAAQ,CACN,KAAK,EAAE,iBAAiB,EAAE,EAC1B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,aAAa,EAAE,IAAI,EAAE,EACrB,aAAa,EAAE,IAAI,EAAE,GACpB,uBAAuB;CAG3B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// ExtractionQualityValidator — orchestrates the processor pipeline.
|
|
3
|
+
//
|
|
4
|
+
// Built-in processors are registered at construction time.
|
|
5
|
+
// Custom processors (Marker, Llama, GPU agents, domain extensions)
|
|
6
|
+
// can be registered via register() before calling validate().
|
|
7
|
+
// ============================================================
|
|
8
|
+
import { ExtractionValidator } from "./processor-pipeline.js";
|
|
9
|
+
import { VaguenessFilter } from "./processors/vagueness-filter.js";
|
|
10
|
+
import { RelationshipThreshold } from "./processors/relationship-threshold.js";
|
|
11
|
+
import { RoleAuditValidator } from "./processors/role-audit-validator.js";
|
|
12
|
+
import { DuplicateDetector } from "./processors/duplicate-detector.js";
|
|
13
|
+
export class ExtractionQualityValidator {
|
|
14
|
+
pipeline;
|
|
15
|
+
constructor() {
|
|
16
|
+
this.pipeline = new ExtractionValidator();
|
|
17
|
+
this.pipeline.register(new VaguenessFilter());
|
|
18
|
+
this.pipeline.register(new RelationshipThreshold());
|
|
19
|
+
this.pipeline.register(new RoleAuditValidator());
|
|
20
|
+
this.pipeline.register(new DuplicateDetector());
|
|
21
|
+
}
|
|
22
|
+
/** Register a custom processor (Marker, Llama, GPU, domain extension). */
|
|
23
|
+
register(processor) {
|
|
24
|
+
this.pipeline.register(processor);
|
|
25
|
+
}
|
|
26
|
+
validate(nodes, edges, existingNodes, existingEdges) {
|
|
27
|
+
return this.pipeline.validate(nodes, edges, { existingNodes, existingEdges });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=extraction-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-quality.js","sourceRoot":"","sources":["../../src/core/extraction-quality.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oEAAoE;AACpE,EAAE;AACF,2DAA2D;AAC3D,mEAAmE;AACnE,8DAA8D;AAC9D,+DAA+D;AAS/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,MAAM,OAAO,0BAA0B;IAC7B,QAAQ,CAAsB;IAEtC;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,0EAA0E;IAC1E,QAAQ,CAAC,SAA8B;QACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CACN,KAA0B,EAC1B,KAA0B,EAC1B,aAAqB,EACrB,aAAqB;QAErB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;IAChF,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-analyzer.d.ts","sourceRoot":"","sources":["../../src/core/pattern-analyzer.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,iBAAiB,EACjB,eAAe,EACf,WAAW,EAGZ,MAAM,YAAY,CAAC;AAuUpB,wBAAgB,eAAe,CAC7B,KAAK,EAAE,iBAAiB,EACxB,YAAY,GAAE,WAAW,EAAkE,GAC1F,eAAe,CA0DjB"}
|