@sourcepress/knowledge 0.1.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.
Files changed (100) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-test.log +21 -0
  3. package/dist/__tests__/graph-builder.test.d.ts +2 -0
  4. package/dist/__tests__/graph-builder.test.d.ts.map +1 -0
  5. package/dist/__tests__/graph-builder.test.js +122 -0
  6. package/dist/__tests__/graph-builder.test.js.map +1 -0
  7. package/dist/__tests__/graph-ops.test.d.ts +2 -0
  8. package/dist/__tests__/graph-ops.test.d.ts.map +1 -0
  9. package/dist/__tests__/graph-ops.test.js +181 -0
  10. package/dist/__tests__/graph-ops.test.js.map +1 -0
  11. package/dist/__tests__/ingestion.test.d.ts +2 -0
  12. package/dist/__tests__/ingestion.test.d.ts.map +1 -0
  13. package/dist/__tests__/ingestion.test.js +108 -0
  14. package/dist/__tests__/ingestion.test.js.map +1 -0
  15. package/dist/__tests__/json-file-store.test.d.ts +2 -0
  16. package/dist/__tests__/json-file-store.test.d.ts.map +1 -0
  17. package/dist/__tests__/json-file-store.test.js +180 -0
  18. package/dist/__tests__/json-file-store.test.js.map +1 -0
  19. package/dist/__tests__/knowledge-engine.test.d.ts +2 -0
  20. package/dist/__tests__/knowledge-engine.test.d.ts.map +1 -0
  21. package/dist/__tests__/knowledge-engine.test.js +152 -0
  22. package/dist/__tests__/knowledge-engine.test.js.map +1 -0
  23. package/dist/__tests__/knowledge-store.test.d.ts +2 -0
  24. package/dist/__tests__/knowledge-store.test.d.ts.map +1 -0
  25. package/dist/__tests__/knowledge-store.test.js +97 -0
  26. package/dist/__tests__/knowledge-store.test.js.map +1 -0
  27. package/dist/__tests__/scraper.test.d.ts +2 -0
  28. package/dist/__tests__/scraper.test.d.ts.map +1 -0
  29. package/dist/__tests__/scraper.test.js +66 -0
  30. package/dist/__tests__/scraper.test.js.map +1 -0
  31. package/dist/__tests__/sitemap-parser.test.d.ts +2 -0
  32. package/dist/__tests__/sitemap-parser.test.d.ts.map +1 -0
  33. package/dist/__tests__/sitemap-parser.test.js +75 -0
  34. package/dist/__tests__/sitemap-parser.test.js.map +1 -0
  35. package/dist/graph-builder.d.ts +17 -0
  36. package/dist/graph-builder.d.ts.map +1 -0
  37. package/dist/graph-builder.js +98 -0
  38. package/dist/graph-builder.js.map +1 -0
  39. package/dist/graph-ops.d.ts +21 -0
  40. package/dist/graph-ops.d.ts.map +1 -0
  41. package/dist/graph-ops.js +108 -0
  42. package/dist/graph-ops.js.map +1 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +8 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/ingestion/index.d.ts +4 -0
  48. package/dist/ingestion/index.d.ts.map +1 -0
  49. package/dist/ingestion/index.js +3 -0
  50. package/dist/ingestion/index.js.map +1 -0
  51. package/dist/ingestion/scraper.d.ts +22 -0
  52. package/dist/ingestion/scraper.d.ts.map +1 -0
  53. package/dist/ingestion/scraper.js +118 -0
  54. package/dist/ingestion/scraper.js.map +1 -0
  55. package/dist/ingestion/sitemap-parser.d.ts +32 -0
  56. package/dist/ingestion/sitemap-parser.d.ts.map +1 -0
  57. package/dist/ingestion/sitemap-parser.js +104 -0
  58. package/dist/ingestion/sitemap-parser.js.map +1 -0
  59. package/dist/ingestion/types.d.ts +58 -0
  60. package/dist/ingestion/types.d.ts.map +1 -0
  61. package/dist/ingestion/types.js +2 -0
  62. package/dist/ingestion/types.js.map +1 -0
  63. package/dist/json-file-store.d.ts +19 -0
  64. package/dist/json-file-store.d.ts.map +1 -0
  65. package/dist/json-file-store.js +100 -0
  66. package/dist/json-file-store.js.map +1 -0
  67. package/dist/knowledge-engine.d.ts +45 -0
  68. package/dist/knowledge-engine.d.ts.map +1 -0
  69. package/dist/knowledge-engine.js +160 -0
  70. package/dist/knowledge-engine.js.map +1 -0
  71. package/dist/knowledge-store.d.ts +14 -0
  72. package/dist/knowledge-store.d.ts.map +1 -0
  73. package/dist/knowledge-store.js +40 -0
  74. package/dist/knowledge-store.js.map +1 -0
  75. package/dist/types.d.ts +67 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +2 -0
  78. package/dist/types.js.map +1 -0
  79. package/package.json +26 -0
  80. package/src/__tests__/graph-builder.test.ts +129 -0
  81. package/src/__tests__/graph-ops.test.ts +189 -0
  82. package/src/__tests__/ingestion.test.ts +127 -0
  83. package/src/__tests__/json-file-store.test.ts +206 -0
  84. package/src/__tests__/knowledge-engine.test.ts +177 -0
  85. package/src/__tests__/knowledge-store.test.ts +111 -0
  86. package/src/__tests__/scraper.test.ts +74 -0
  87. package/src/__tests__/sitemap-parser.test.ts +85 -0
  88. package/src/graph-builder.ts +109 -0
  89. package/src/graph-ops.ts +129 -0
  90. package/src/index.ts +27 -0
  91. package/src/ingestion/index.ts +10 -0
  92. package/src/ingestion/scraper.ts +137 -0
  93. package/src/ingestion/sitemap-parser.ts +119 -0
  94. package/src/ingestion/types.ts +57 -0
  95. package/src/json-file-store.ts +127 -0
  96. package/src/knowledge-engine.ts +217 -0
  97. package/src/knowledge-store.ts +49 -0
  98. package/src/types.ts +76 -0
  99. package/tsconfig.json +5 -0
  100. package/vitest.config.ts +2 -0
@@ -0,0 +1,4 @@
1
+
2
+ > @sourcepress/knowledge@0.1.0 build /Users/fabianvontiedemann/Developer/org/sourcepress/packages/knowledge
3
+ > tsc
4
+
@@ -0,0 +1,21 @@
1
+
2
+ > @sourcepress/knowledge@0.1.0 test /Users/fabianvontiedemann/Developer/org/sourcepress/packages/knowledge
3
+ > vitest run
4
+
5
+
6
+ RUN v3.2.4 /Users/fabianvontiedemann/Developer/org/sourcepress/packages/knowledge
7
+
8
+ ✓ src/__tests__/json-file-store.test.ts (16 tests) 12ms
9
+ ✓ src/__tests__/graph-builder.test.ts (5 tests) 3ms
10
+ ✓ src/__tests__/knowledge-store.test.ts (11 tests) 3ms
11
+ ✓ src/__tests__/graph-ops.test.ts (8 tests) 5ms
12
+ ✓ src/__tests__/sitemap-parser.test.ts (6 tests) 4ms
13
+ ✓ src/__tests__/scraper.test.ts (4 tests) 12ms
14
+ ✓ src/__tests__/ingestion.test.ts (5 tests) 18ms
15
+ ✓ src/__tests__/knowledge-engine.test.ts (5 tests) 5ms
16
+
17
+ Test Files 8 passed (8)
18
+ Tests 60 passed (60)
19
+ Start at 13:53:38
20
+ Duration 1.21s (transform 285ms, setup 0ms, collect 932ms, tests 61ms, environment 2ms, prepare 1.12s)
21
+
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=graph-builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/graph-builder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { GraphBuilder } from "../graph-builder.js";
3
+ function makeEntities() {
4
+ return [
5
+ {
6
+ type: "client",
7
+ name: "Acme Corp",
8
+ aliases: ["Acme", "ACME"],
9
+ confidence: 0.95,
10
+ source_file: "knowledge/clients/acme.md",
11
+ },
12
+ {
13
+ type: "technology",
14
+ name: "Next.js",
15
+ aliases: ["NextJS"],
16
+ confidence: 0.99,
17
+ source_file: "knowledge/clients/acme.md",
18
+ },
19
+ {
20
+ type: "technology",
21
+ name: "React",
22
+ aliases: [],
23
+ confidence: 0.9,
24
+ source_file: "knowledge/tech/react.md",
25
+ },
26
+ {
27
+ type: "service",
28
+ name: "Web Development",
29
+ aliases: ["Webbutveckling"],
30
+ confidence: 0.85,
31
+ source_file: "knowledge/services/web.md",
32
+ },
33
+ ];
34
+ }
35
+ function makeRelations() {
36
+ return [
37
+ {
38
+ from_entity: "Acme Corp",
39
+ to_entity: "Next.js",
40
+ relation_type: "uses",
41
+ confidence: 0.9,
42
+ evidence: "Acme Corp is migrating to Next.js",
43
+ source_file: "knowledge/clients/acme.md",
44
+ },
45
+ {
46
+ from_entity: "Next.js",
47
+ to_entity: "React",
48
+ relation_type: "built_on",
49
+ confidence: 0.99,
50
+ evidence: "Next.js is a React framework",
51
+ source_file: "knowledge/tech/react.md",
52
+ },
53
+ {
54
+ from_entity: "Acme Corp",
55
+ to_entity: "Web Development",
56
+ relation_type: "needs",
57
+ confidence: 0.85,
58
+ evidence: "Acme needs web development services",
59
+ source_file: "knowledge/clients/acme.md",
60
+ },
61
+ ];
62
+ }
63
+ describe("GraphBuilder", () => {
64
+ it("builds a graph from entities and relations", () => {
65
+ const builder = new GraphBuilder();
66
+ builder.addEntities(makeEntities());
67
+ builder.addRelations(makeRelations());
68
+ const graph = builder.build();
69
+ expect(graph.entities.size).toBe(4);
70
+ expect(graph.relations).toHaveLength(3);
71
+ expect(graph.file_count).toBe(3);
72
+ expect(graph.built_at).toBeTruthy();
73
+ });
74
+ it("deduplicates entities by name", () => {
75
+ const builder = new GraphBuilder();
76
+ builder.addEntities(makeEntities());
77
+ builder.addEntities([
78
+ {
79
+ type: "client",
80
+ name: "Acme Corp",
81
+ aliases: ["Acme Inc"],
82
+ confidence: 0.8,
83
+ source_file: "knowledge/other.md",
84
+ },
85
+ ]);
86
+ const graph = builder.build();
87
+ const acme = graph.entities.get("Acme Corp");
88
+ expect(acme).toBeDefined();
89
+ // biome-ignore lint/style/noNonNullAssertion: asserted defined on line above
90
+ expect(acme.confidence).toBe(0.95);
91
+ // biome-ignore lint/style/noNonNullAssertion: asserted defined on line above
92
+ expect(acme.aliases).toContain("Acme");
93
+ // biome-ignore lint/style/noNonNullAssertion: asserted defined on line above
94
+ expect(acme.aliases).toContain("ACME");
95
+ // biome-ignore lint/style/noNonNullAssertion: asserted defined on line above
96
+ expect(acme.aliases).toContain("Acme Inc");
97
+ });
98
+ it("filters relations below confidence threshold", () => {
99
+ const builder = new GraphBuilder({ minConfidence: 0.88 });
100
+ builder.addEntities(makeEntities());
101
+ builder.addRelations(makeRelations());
102
+ const graph = builder.build();
103
+ expect(graph.relations).toHaveLength(2);
104
+ expect(graph.relations.every((r) => r.confidence >= 0.88)).toBe(true);
105
+ });
106
+ it("computes clusters from connected entities", () => {
107
+ const builder = new GraphBuilder();
108
+ builder.addEntities(makeEntities());
109
+ builder.addRelations(makeRelations());
110
+ const graph = builder.build();
111
+ expect(graph.clusters.length).toBeGreaterThanOrEqual(1);
112
+ expect(graph.clusters[0].entities.length).toBeGreaterThanOrEqual(2);
113
+ });
114
+ it("handles empty input", () => {
115
+ const builder = new GraphBuilder();
116
+ const graph = builder.build();
117
+ expect(graph.entities.size).toBe(0);
118
+ expect(graph.relations).toHaveLength(0);
119
+ expect(graph.clusters).toHaveLength(0);
120
+ });
121
+ });
122
+ //# sourceMappingURL=graph-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.test.js","sourceRoot":"","sources":["../../src/__tests__/graph-builder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=graph-ops.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-ops.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/graph-ops.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { GraphOps } from "../graph-ops.js";
3
+ function makeGraph() {
4
+ const entities = new Map([
5
+ [
6
+ "Acme Corp",
7
+ {
8
+ type: "client",
9
+ name: "Acme Corp",
10
+ aliases: ["Acme"],
11
+ confidence: 0.95,
12
+ source_file: "knowledge/clients/acme.md",
13
+ },
14
+ ],
15
+ [
16
+ "Next.js",
17
+ {
18
+ type: "technology",
19
+ name: "Next.js",
20
+ aliases: ["NextJS"],
21
+ confidence: 0.99,
22
+ source_file: "knowledge/tech/nextjs.md",
23
+ },
24
+ ],
25
+ [
26
+ "React",
27
+ {
28
+ type: "technology",
29
+ name: "React",
30
+ aliases: [],
31
+ confidence: 0.9,
32
+ source_file: "knowledge/tech/react.md",
33
+ },
34
+ ],
35
+ [
36
+ "Orphan Entity",
37
+ {
38
+ type: "concept",
39
+ name: "Orphan Entity",
40
+ aliases: [],
41
+ confidence: 0.7,
42
+ source_file: "knowledge/misc/orphan.md",
43
+ },
44
+ ],
45
+ ]);
46
+ const relations = [
47
+ {
48
+ from_entity: "Acme Corp",
49
+ to_entity: "Next.js",
50
+ relation_type: "uses",
51
+ confidence: 0.9,
52
+ evidence: "Acme uses Next.js",
53
+ source_file: "knowledge/clients/acme.md",
54
+ },
55
+ {
56
+ from_entity: "Next.js",
57
+ to_entity: "React",
58
+ relation_type: "built_on",
59
+ confidence: 0.99,
60
+ evidence: "Next.js is built on React",
61
+ source_file: "knowledge/tech/nextjs.md",
62
+ },
63
+ ];
64
+ return {
65
+ entities,
66
+ relations,
67
+ clusters: [
68
+ {
69
+ id: "cluster-0",
70
+ name: "Acme Corp",
71
+ entities: ["Acme Corp", "Next.js", "React"],
72
+ coherence_score: 0.95,
73
+ },
74
+ ],
75
+ built_at: "2026-04-04T10:00:00Z",
76
+ file_count: 4,
77
+ };
78
+ }
79
+ function makeContentFiles() {
80
+ return [
81
+ {
82
+ collection: "cases",
83
+ slug: "acme",
84
+ path: "content/cases/acme.mdx",
85
+ frontmatter: { title: "Acme Corp Case Study", client: "acme-corp" },
86
+ body: "Acme Corp migrated to Next.js with our help.",
87
+ provenance: {
88
+ generated_by: "claude-sonnet-4-5-20250514",
89
+ generated_at: "2026-04-01T10:00:00Z",
90
+ source_files: ["knowledge/clients/acme.md"],
91
+ },
92
+ },
93
+ {
94
+ collection: "posts",
95
+ slug: "react-guide",
96
+ path: "content/posts/react-guide.mdx",
97
+ frontmatter: { title: "React Guide" },
98
+ body: "A guide to React.",
99
+ provenance: {
100
+ generated_by: "claude-sonnet-4-5-20250514",
101
+ generated_at: "2026-04-03T10:00:00Z",
102
+ source_files: ["knowledge/tech/react.md"],
103
+ },
104
+ },
105
+ ];
106
+ }
107
+ describe("GraphOps", () => {
108
+ let ops;
109
+ beforeEach(() => {
110
+ ops = new GraphOps(makeGraph());
111
+ });
112
+ describe("query", () => {
113
+ it("returns entity with relations and related entities", () => {
114
+ const result = ops.query("Acme Corp");
115
+ expect(result).not.toBeNull();
116
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
117
+ expect(result.entity.name).toBe("Acme Corp");
118
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
119
+ expect(result.relations).toHaveLength(1);
120
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
121
+ expect(result.related_entities).toHaveLength(1);
122
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
123
+ expect(result.related_entities[0].name).toBe("Next.js");
124
+ });
125
+ it("returns null for unknown entity", () => {
126
+ expect(ops.query("Unknown")).toBeNull();
127
+ });
128
+ it("finds entity by alias", () => {
129
+ const result = ops.query("Acme");
130
+ expect(result).not.toBeNull();
131
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
132
+ expect(result.entity.name).toBe("Acme Corp");
133
+ });
134
+ it("collects source files for entity", () => {
135
+ const result = ops.query("Next.js");
136
+ expect(result).not.toBeNull();
137
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
138
+ expect(result.files).toContain("knowledge/tech/nextjs.md");
139
+ // biome-ignore lint/style/noNonNullAssertion: asserted not null on line above
140
+ expect(result.files).toContain("knowledge/clients/acme.md");
141
+ });
142
+ });
143
+ describe("findGaps", () => {
144
+ it("finds entities with knowledge but no content", () => {
145
+ const gaps = ops.findGaps(makeContentFiles());
146
+ expect(gaps.length).toBeGreaterThanOrEqual(1);
147
+ const orphanGap = gaps.find((g) => g.entity_name === "Orphan Entity");
148
+ expect(orphanGap).toBeDefined();
149
+ // biome-ignore lint/style/noNonNullAssertion: asserted defined on line above
150
+ expect(orphanGap.content_file_count).toBe(0);
151
+ });
152
+ });
153
+ describe("findStale", () => {
154
+ it("detects content older than source knowledge", () => {
155
+ const stale = ops.findStale(makeContentFiles(), {
156
+ "knowledge/clients/acme.md": "2026-04-03T10:00:00Z",
157
+ "knowledge/tech/react.md": "2026-04-02T10:00:00Z",
158
+ });
159
+ expect(stale).toHaveLength(1);
160
+ expect(stale[0].content_path).toBe("content/cases/acme.mdx");
161
+ expect(stale[0].stale_sources).toContain("knowledge/clients/acme.md");
162
+ });
163
+ it("returns empty when all content is fresh", () => {
164
+ const stale = ops.findStale(makeContentFiles(), {
165
+ "knowledge/clients/acme.md": "2026-03-01T10:00:00Z",
166
+ "knowledge/tech/react.md": "2026-03-01T10:00:00Z",
167
+ });
168
+ expect(stale).toHaveLength(0);
169
+ });
170
+ });
171
+ describe("getStats", () => {
172
+ it("returns graph statistics", () => {
173
+ const stats = ops.getStats();
174
+ expect(stats.entity_count).toBe(4);
175
+ expect(stats.relation_count).toBe(2);
176
+ expect(stats.cluster_count).toBe(1);
177
+ expect(stats.file_count).toBe(4);
178
+ });
179
+ });
180
+ });
181
+ //# sourceMappingURL=graph-ops.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-ops.test.js","sourceRoot":"","sources":["../../src/__tests__/graph-ops.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ingestion.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ingestion.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,108 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { KnowledgeEngine } from "../knowledge-engine.js";
3
+ import { InMemoryKnowledgeStore } from "../knowledge-store.js";
4
+ // Mock AI functions
5
+ vi.mock("@sourcepress/ai", () => ({
6
+ classify: vi.fn().mockResolvedValue({
7
+ type: "article",
8
+ quality: "structured",
9
+ quality_score: 0.8,
10
+ }),
11
+ extract: vi.fn().mockResolvedValue({
12
+ entities: [{ type: "company", name: "Acme Corp", confidence: 0.9 }],
13
+ relations: [],
14
+ }),
15
+ }));
16
+ const ARTICLE_HTML = `<!DOCTYPE html>
17
+ <html><head><title>Acme Services</title></head>
18
+ <body><article>
19
+ <h1>Acme Corp Services</h1>
20
+ <p>Acme Corp provides enterprise software solutions for modern businesses.
21
+ Their platform handles everything from customer management to analytics.
22
+ Founded in 2010, Acme has grown to serve over 500 enterprise clients
23
+ worldwide with their innovative approach to business software.</p>
24
+ <h2>Key Offerings</h2>
25
+ <p>The company specializes in cloud-native applications, data pipelines,
26
+ and AI-powered automation tools that help businesses scale efficiently.</p>
27
+ </article></body></html>`;
28
+ const SITEMAP_XML = `<?xml version="1.0" encoding="UTF-8"?>
29
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
30
+ <url><loc>https://acme.com/services/web</loc></url>
31
+ <url><loc>https://acme.com/services/cloud</loc></url>
32
+ <url><loc>https://acme.com/blog/post-1</loc></url>
33
+ </urlset>`;
34
+ function createMockFetcher() {
35
+ return vi.fn().mockImplementation(async (url) => {
36
+ if (url.endsWith("sitemap.xml")) {
37
+ return { ok: true, status: 200, text: () => Promise.resolve(SITEMAP_XML) };
38
+ }
39
+ return { ok: true, status: 200, text: () => Promise.resolve(ARTICLE_HTML) };
40
+ });
41
+ }
42
+ function createEngine(fetcher) {
43
+ const store = new InMemoryKnowledgeStore();
44
+ const mockProvider = {
45
+ provider: "mock",
46
+ model: "mock",
47
+ apiKey: "mock",
48
+ };
49
+ const mockBudget = { check: vi.fn(), record: vi.fn() };
50
+ return new KnowledgeEngine(store, mockProvider, mockBudget, fetcher);
51
+ }
52
+ describe("KnowledgeEngine ingestion", () => {
53
+ it("importUrl scrapes and stores a single URL", async () => {
54
+ const fetcher = createMockFetcher();
55
+ const engine = createEngine(fetcher);
56
+ const result = await engine.importUrl("https://acme.com/services/web");
57
+ expect(result.path).toBe("knowledge/acme.com/services/web.md");
58
+ expect(result.source).toBe("url");
59
+ expect(result.source_url).toBe("https://acme.com/services/web");
60
+ expect(result.body).toContain("Acme Corp");
61
+ });
62
+ it("parseSitemap returns grouped sections", async () => {
63
+ const fetcher = createMockFetcher();
64
+ const engine = createEngine(fetcher);
65
+ const result = await engine.parseSitemap("https://acme.com/sitemap.xml");
66
+ expect(result.total_urls).toBe(3);
67
+ const services = result.sections.find((s) => s.pattern === "/services/*");
68
+ expect(services).toBeDefined();
69
+ expect(services?.count).toBe(2);
70
+ });
71
+ it("importBatch processes multiple URLs with progress", async () => {
72
+ const fetcher = createMockFetcher();
73
+ const engine = createEngine(fetcher);
74
+ const progress = vi.fn();
75
+ const result = await engine.importBatch(["https://acme.com/services/web", "https://acme.com/services/cloud"], progress);
76
+ expect(result.completed).toBe(2);
77
+ expect(result.failed).toBe(0);
78
+ expect(result.results).toHaveLength(2);
79
+ expect(progress).toHaveBeenCalledTimes(2);
80
+ });
81
+ it("importBatch handles failures gracefully", async () => {
82
+ const fetcher = vi
83
+ .fn()
84
+ .mockResolvedValueOnce({ ok: true, status: 200, text: () => Promise.resolve(ARTICLE_HTML) })
85
+ .mockResolvedValueOnce({
86
+ ok: false,
87
+ status: 500,
88
+ statusText: "Server Error",
89
+ });
90
+ const engine = createEngine(fetcher);
91
+ const result = await engine.importBatch([
92
+ "https://acme.com/services/web",
93
+ "https://acme.com/broken",
94
+ ]);
95
+ expect(result.completed).toBe(2);
96
+ expect(result.failed).toBe(1);
97
+ expect(result.results[0].success).toBe(true);
98
+ expect(result.results[1].success).toBe(false);
99
+ expect(result.results[1].error).toContain("500");
100
+ });
101
+ it("urlToPath converts URLs to knowledge paths", async () => {
102
+ const fetcher = createMockFetcher();
103
+ const engine = createEngine(fetcher);
104
+ const result = await engine.importUrl("https://example.com/blog/my-post");
105
+ expect(result.path).toBe("knowledge/example.com/blog/my-post.md");
106
+ });
107
+ });
108
+ //# sourceMappingURL=ingestion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion.test.js","sourceRoot":"","sources":["../../src/__tests__/ingestion.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json-file-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-file-store.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/json-file-store.test.ts"],"names":[],"mappings":""}