@agent-wiki/mcp-server 0.3.3 → 0.4.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 +5 -5
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +18 -6
- package/dist/server.js.map +1 -1
- package/dist/server.test.d.ts +8 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +178 -0
- package/dist/server.test.js.map +1 -0
- package/dist/wiki.d.ts +15 -4
- package/dist/wiki.d.ts.map +1 -1
- package/dist/wiki.js +124 -11
- package/dist/wiki.js.map +1 -1
- package/dist/wiki.test.d.ts +8 -0
- package/dist/wiki.test.d.ts.map +1 -0
- package/dist/wiki.test.js +740 -0
- package/dist/wiki.test.js.map +1 -0
- package/package.json +12 -3
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ The key insight: **LLMs are better editors than search engines.** Let them curat
|
|
|
30
30
|
| **Memory** | Stateless — forgets after each query | Persistent — knowledge accumulates |
|
|
31
31
|
| **Quality** | Raw chunks, often noisy | Curated, structured, interlinked |
|
|
32
32
|
| **Cost** | Embedding + retrieval every query | One-time compilation, free reads |
|
|
33
|
-
| **Contradictions** | Invisible — buried in source docs |
|
|
33
|
+
| **Contradictions** | Invisible — buried in source docs | Surface-level conflicts flagged by lint (dates, numbers) |
|
|
34
34
|
| **Source tracking** | Lost after retrieval | Full provenance chain (raw → wiki) |
|
|
35
35
|
|
|
36
36
|
## Architecture
|
|
@@ -119,9 +119,9 @@ Resolution priority: CLI `--workspace` > `AGENT_WIKI_WORKSPACE` env > config fil
|
|
|
119
119
|
|
|
120
120
|
### Self-Checking Lint Engine
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
The lint system catches common problems automatically:
|
|
123
123
|
|
|
124
|
-
- **Contradictions** — conflicting dates
|
|
124
|
+
- **Contradictions** — detects conflicting dates and numeric claims across pages (regex + local-context heuristic — useful for catching obvious conflicts, not a substitute for human review)
|
|
125
125
|
- **Orphan pages** — pages with no incoming links
|
|
126
126
|
- **Broken links** — `[[page]]` references to non-existent pages
|
|
127
127
|
- **Missing sources** — wiki claims not traceable to raw documents
|
|
@@ -149,7 +149,7 @@ Pure heuristic — no LLM calls, no API keys, zero latency. Supports English and
|
|
|
149
149
|
| `raw_add` | Add a source document (content string or local file copy, SHA-256 hashed, .meta.yaml sidecar) |
|
|
150
150
|
| `raw_fetch` | Download from URL to raw/ (smart arXiv handling, auto-provenance) |
|
|
151
151
|
| `raw_list` | List all raw documents with metadata (path, source URL, hash, size) |
|
|
152
|
-
| `raw_read` | Read a raw document
|
|
152
|
+
| `raw_read` | Read a raw document — text/SVG return content; PDF/DOCX/XLSX/PPTX extracted via Python preprocessor; other binary files return metadata only |
|
|
153
153
|
| `raw_verify` | Verify integrity of all raw files via SHA-256 re-check |
|
|
154
154
|
|
|
155
155
|
### Wiki Layer — Compiled Knowledge
|
|
@@ -233,7 +233,7 @@ npx @agent-wiki/mcp-server lint # run health checks
|
|
|
233
233
|
1. **Raw is immutable** — Source documents are write-once, SHA-256 verified. The ground truth never changes.
|
|
234
234
|
2. **Wiki is mutable** — Compiled knowledge improves with every interaction. Pages are refined, not replaced.
|
|
235
235
|
3. **No LLM dependency** — Zero API keys, zero cost per operation. The agent calling the tools IS the intelligence.
|
|
236
|
-
4. **Self-checking** — Lint catches
|
|
236
|
+
4. **Self-checking** — Lint catches structural issues (broken links, orphans, stale pages) and flags potential contradictions via heuristic pattern matching. Semantic review still benefits from human or LLM judgment.
|
|
237
237
|
5. **Knowledge compounds** — Every write enriches the whole wiki. Synthesis creates higher-order understanding.
|
|
238
238
|
6. **Provenance matters** — Every wiki claim traces back to raw sources. No hallucination without accountability.
|
|
239
239
|
7. **Code and data separate** — Configurable workspace keeps your knowledge portable and independent.
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAWnE,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CA6U1E;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAWnE,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CA6U1E;AAqMD,wBAAsB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpF"}
|
package/dist/server.js
CHANGED
|
@@ -69,7 +69,7 @@ export function createServer(wikiPath, workspace) {
|
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
name: "raw_read",
|
|
72
|
-
description: "Read a raw source document's content and metadata. Raw files are immutable — this is read-only.",
|
|
72
|
+
description: "Read a raw source document's content and metadata. Raw files are immutable — this is read-only. Text/SVG files return content as string; document files (PDF, DOCX, XLSX, PPTX) have text extracted automatically; other binary files (images, etc.) return metadata only.",
|
|
73
73
|
inputSchema: {
|
|
74
74
|
type: "object",
|
|
75
75
|
properties: {
|
|
@@ -340,14 +340,23 @@ async function handleTool(wiki, name, args) {
|
|
|
340
340
|
return JSON.stringify({ documents: docs, count: docs.length }, null, 2);
|
|
341
341
|
}
|
|
342
342
|
case "raw_read": {
|
|
343
|
-
const result = wiki.rawRead(args.filename);
|
|
343
|
+
const result = await wiki.rawRead(args.filename);
|
|
344
344
|
if (!result)
|
|
345
345
|
return `Raw file not found: ${args.filename}`;
|
|
346
|
+
if (result.binary) {
|
|
347
|
+
return JSON.stringify({
|
|
348
|
+
meta: result.meta,
|
|
349
|
+
binary: true,
|
|
350
|
+
note: `Binary file (${result.meta?.mimeType ?? "unknown type"}, ${result.meta?.size != null ? result.meta.size + " bytes" : "unknown size"}). Content cannot be read as text. Use the file path directly if you need to process it.`,
|
|
351
|
+
}, null, 2);
|
|
352
|
+
}
|
|
353
|
+
const content = result.content;
|
|
346
354
|
return JSON.stringify({
|
|
347
355
|
meta: result.meta,
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
356
|
+
binary: false,
|
|
357
|
+
content: content.length > 10000
|
|
358
|
+
? content.slice(0, 10000) + "\n\n... (truncated, " + content.length + " chars total)"
|
|
359
|
+
: content,
|
|
351
360
|
}, null, 2);
|
|
352
361
|
}
|
|
353
362
|
case "raw_verify": {
|
|
@@ -375,8 +384,11 @@ async function handleTool(wiki, name, args) {
|
|
|
375
384
|
const page = wiki.read(args.page);
|
|
376
385
|
if (!page)
|
|
377
386
|
return `Page not found: ${args.page}`;
|
|
387
|
+
// wiki.read() already validates the path via safePath, so we
|
|
388
|
+
// reconstruct the full path from wiki.config + validated pagePath
|
|
389
|
+
const fullPath = join(wiki.config.wikiDir, page.path);
|
|
378
390
|
try {
|
|
379
|
-
return readFileSync(
|
|
391
|
+
return readFileSync(fullPath, "utf-8");
|
|
380
392
|
}
|
|
381
393
|
catch {
|
|
382
394
|
return `Page not found: ${args.page}`;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MCP server tool handlers.
|
|
3
|
+
*
|
|
4
|
+
* These test the handleTool dispatch and JSON serialization
|
|
5
|
+
* without starting a real MCP transport.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
8
|
+
import { existsSync, rmSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { Wiki } from "./wiki.js";
|
|
11
|
+
const TEST_ROOT = join(import.meta.dirname ?? ".", "__test_server__");
|
|
12
|
+
function freshWiki() {
|
|
13
|
+
return Wiki.init(TEST_ROOT);
|
|
14
|
+
}
|
|
15
|
+
function cleanUp() {
|
|
16
|
+
if (existsSync(TEST_ROOT)) {
|
|
17
|
+
rmSync(TEST_ROOT, { recursive: true, force: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// We test the Wiki methods that the server handlers call,
|
|
21
|
+
// since createServer() requires MCP transport setup.
|
|
22
|
+
// This verifies the data layer that backs every tool.
|
|
23
|
+
describe("server tool: raw_add + raw_list", () => {
|
|
24
|
+
beforeEach(cleanUp);
|
|
25
|
+
afterEach(cleanUp);
|
|
26
|
+
it("add then list returns the document", () => {
|
|
27
|
+
const wiki = freshWiki();
|
|
28
|
+
wiki.rawAdd("article.md", {
|
|
29
|
+
content: "# Article\nBody text.",
|
|
30
|
+
sourceUrl: "https://example.com/article",
|
|
31
|
+
description: "Test article",
|
|
32
|
+
tags: ["test"],
|
|
33
|
+
});
|
|
34
|
+
const docs = wiki.rawList();
|
|
35
|
+
expect(docs).toHaveLength(1);
|
|
36
|
+
expect(docs[0].path).toBe("article.md");
|
|
37
|
+
expect(docs[0].sourceUrl).toBe("https://example.com/article");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("server tool: raw_read", () => {
|
|
41
|
+
beforeEach(cleanUp);
|
|
42
|
+
afterEach(cleanUp);
|
|
43
|
+
it("reads text content", async () => {
|
|
44
|
+
const wiki = freshWiki();
|
|
45
|
+
wiki.rawAdd("text.txt", { content: "Hello MCP" });
|
|
46
|
+
const result = await wiki.rawRead("text.txt");
|
|
47
|
+
expect(result.binary).toBe(false);
|
|
48
|
+
expect(result.content).toBe("Hello MCP");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("server tool: raw_verify", () => {
|
|
52
|
+
beforeEach(cleanUp);
|
|
53
|
+
afterEach(cleanUp);
|
|
54
|
+
it("validates integrity", () => {
|
|
55
|
+
const wiki = freshWiki();
|
|
56
|
+
wiki.rawAdd("ok.txt", { content: "safe" });
|
|
57
|
+
const results = wiki.rawVerify();
|
|
58
|
+
expect(results.every(r => r.status === "ok")).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("server tool: wiki_write + wiki_read", () => {
|
|
62
|
+
beforeEach(cleanUp);
|
|
63
|
+
afterEach(cleanUp);
|
|
64
|
+
it("write then read round-trips", () => {
|
|
65
|
+
const wiki = freshWiki();
|
|
66
|
+
wiki.write("note-test.md", "---\ntitle: Note\ntype: note\n---\nTest body.");
|
|
67
|
+
const page = wiki.read("note-test.md");
|
|
68
|
+
expect(page.title).toBe("Note");
|
|
69
|
+
expect(page.content).toContain("Test body.");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("server tool: wiki_delete", () => {
|
|
73
|
+
beforeEach(cleanUp);
|
|
74
|
+
afterEach(cleanUp);
|
|
75
|
+
it("deletes a page", () => {
|
|
76
|
+
const wiki = freshWiki();
|
|
77
|
+
wiki.write("deleteme.md", "---\ntitle: D\n---\nBody");
|
|
78
|
+
expect(wiki.delete("deleteme.md")).toBe(true);
|
|
79
|
+
expect(wiki.read("deleteme.md")).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe("server tool: wiki_list", () => {
|
|
83
|
+
beforeEach(cleanUp);
|
|
84
|
+
afterEach(cleanUp);
|
|
85
|
+
it("lists pages with filter", () => {
|
|
86
|
+
const wiki = freshWiki();
|
|
87
|
+
wiki.write("concept-x.md", "---\ntitle: X\ntype: concept\n---\nX");
|
|
88
|
+
wiki.write("event-y.md", "---\ntitle: Y\ntype: event\n---\nY");
|
|
89
|
+
const concepts = wiki.list("concept");
|
|
90
|
+
expect(concepts).toContain("concept-x.md");
|
|
91
|
+
expect(concepts).not.toContain("event-y.md");
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe("server tool: wiki_search", () => {
|
|
95
|
+
beforeEach(cleanUp);
|
|
96
|
+
afterEach(cleanUp);
|
|
97
|
+
it("finds by keyword", () => {
|
|
98
|
+
const wiki = freshWiki();
|
|
99
|
+
wiki.write("search-target.md", "---\ntitle: Transformer Architecture\n---\nAttention is all you need.");
|
|
100
|
+
const results = wiki.search("attention");
|
|
101
|
+
expect(results.length).toBeGreaterThan(0);
|
|
102
|
+
expect(results[0].path).toBe("search-target.md");
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("server tool: wiki_lint", () => {
|
|
106
|
+
beforeEach(cleanUp);
|
|
107
|
+
afterEach(cleanUp);
|
|
108
|
+
it("returns a valid report", () => {
|
|
109
|
+
const wiki = freshWiki();
|
|
110
|
+
wiki.write("lint-target.md", "---\ntitle: Lint Target\ntype: concept\n---\nSee [[broken-link]].");
|
|
111
|
+
const report = wiki.lint();
|
|
112
|
+
expect(report.pagesChecked).toBeGreaterThan(0);
|
|
113
|
+
expect(report.issues.some(i => i.category === "broken-link")).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("server tool: wiki_classify", () => {
|
|
117
|
+
beforeEach(cleanUp);
|
|
118
|
+
afterEach(cleanUp);
|
|
119
|
+
it("classifies content", () => {
|
|
120
|
+
const wiki = freshWiki();
|
|
121
|
+
const result = wiki.classify("---\ntitle: Step by Step Guide\n---\nStep 1: Do this. Step 2: Do that. Install the software.");
|
|
122
|
+
expect(result.type).toBe("how-to");
|
|
123
|
+
expect(result.confidence).toBeGreaterThan(0);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("server tool: wiki_synthesize", () => {
|
|
127
|
+
beforeEach(cleanUp);
|
|
128
|
+
afterEach(cleanUp);
|
|
129
|
+
it("synthesizes context from pages", () => {
|
|
130
|
+
const wiki = freshWiki();
|
|
131
|
+
wiki.write("src-1.md", "---\ntitle: Source 1\ntags: [ai]\n---\nInsight one.");
|
|
132
|
+
wiki.write("src-2.md", "---\ntitle: Source 2\ntags: [ml]\n---\nInsight two.");
|
|
133
|
+
const ctx = wiki.synthesizeContext(["src-1.md", "src-2.md"]);
|
|
134
|
+
expect(ctx.pages).toHaveLength(2);
|
|
135
|
+
expect(ctx.suggestions.length).toBeGreaterThan(0);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe("server tool: wiki_schemas", () => {
|
|
139
|
+
beforeEach(cleanUp);
|
|
140
|
+
afterEach(cleanUp);
|
|
141
|
+
it("returns all schemas", () => {
|
|
142
|
+
const wiki = freshWiki();
|
|
143
|
+
const schemas = wiki.schemas();
|
|
144
|
+
expect(schemas.length).toBe(9);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe("server tool: wiki_log", () => {
|
|
148
|
+
beforeEach(cleanUp);
|
|
149
|
+
afterEach(cleanUp);
|
|
150
|
+
it("returns log entries", () => {
|
|
151
|
+
const wiki = freshWiki();
|
|
152
|
+
wiki.write("log-page.md", "---\ntitle: L\n---\nBody");
|
|
153
|
+
const log = wiki.getLog(5);
|
|
154
|
+
expect(log.length).toBeGreaterThan(0);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe("server tool: wiki_rebuild_index + wiki_rebuild_timeline", () => {
|
|
158
|
+
beforeEach(cleanUp);
|
|
159
|
+
afterEach(cleanUp);
|
|
160
|
+
it("rebuilds without error", () => {
|
|
161
|
+
const wiki = freshWiki();
|
|
162
|
+
wiki.write("p1.md", "---\ntitle: P1\ntype: concept\n---\nX");
|
|
163
|
+
expect(() => wiki.rebuildIndex()).not.toThrow();
|
|
164
|
+
expect(() => wiki.rebuildTimeline()).not.toThrow();
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe("server tool: wiki_config", () => {
|
|
168
|
+
beforeEach(cleanUp);
|
|
169
|
+
afterEach(cleanUp);
|
|
170
|
+
it("returns config object", () => {
|
|
171
|
+
const wiki = freshWiki();
|
|
172
|
+
const cfg = wiki.config;
|
|
173
|
+
expect(cfg.configRoot).toBe(TEST_ROOT);
|
|
174
|
+
expect(cfg.wikiDir).toContain("wiki");
|
|
175
|
+
expect(cfg.rawDir).toContain("raw");
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"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"}
|
package/dist/wiki.d.ts
CHANGED
|
@@ -86,6 +86,12 @@ export interface WikiConfig {
|
|
|
86
86
|
checkIntegrity: boolean;
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Validate that a user-supplied relative path stays within the base directory.
|
|
91
|
+
* Prevents directory traversal attacks (e.g. "../../etc/passwd").
|
|
92
|
+
* Returns the resolved absolute path if safe, throws otherwise.
|
|
93
|
+
*/
|
|
94
|
+
export declare function safePath(base: string, userPath: string): string;
|
|
89
95
|
export declare class Wiki {
|
|
90
96
|
readonly config: WikiConfig;
|
|
91
97
|
/**
|
|
@@ -127,11 +133,16 @@ export declare class Wiki {
|
|
|
127
133
|
}): RawDocument;
|
|
128
134
|
/** List all raw documents with metadata. */
|
|
129
135
|
rawList(): RawDocument[];
|
|
130
|
-
/** Read a raw document's content.
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
/** Read a raw document's content and metadata.
|
|
137
|
+
* Text/SVG/JSON/XML files return content as UTF-8 string.
|
|
138
|
+
* Document files (PDF, DOCX, XLSX, PPTX) are extracted via Node.js libraries.
|
|
139
|
+
* Other binary files (images, etc.) return metadata only. */
|
|
140
|
+
rawRead(filename: string): Promise<{
|
|
141
|
+
content: string | null;
|
|
133
142
|
meta: RawDocument | null;
|
|
134
|
-
|
|
143
|
+
binary: boolean;
|
|
144
|
+
note?: string;
|
|
145
|
+
} | null>;
|
|
135
146
|
/** Verify integrity of all raw files against their stored hashes. */
|
|
136
147
|
rawVerify(): Array<{
|
|
137
148
|
path: string;
|
package/dist/wiki.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../src/wiki.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,eAAe,GAAG,QAAQ,GAAG,aAAa,GAAG,gBAAgB,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;CAChH;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../src/wiki.ts"],"names":[],"mappings":"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"}
|
package/dist/wiki.js
CHANGED
|
@@ -29,6 +29,30 @@ import yaml from "js-yaml";
|
|
|
29
29
|
import { VERSION } from "./version.js";
|
|
30
30
|
// System pages that lint should treat specially
|
|
31
31
|
const SYSTEM_PAGES = new Set(["index.md", "log.md", "timeline.md"]);
|
|
32
|
+
/**
|
|
33
|
+
* Validate that a user-supplied relative path stays within the base directory.
|
|
34
|
+
* Prevents directory traversal attacks (e.g. "../../etc/passwd").
|
|
35
|
+
* Returns the resolved absolute path if safe, throws otherwise.
|
|
36
|
+
*/
|
|
37
|
+
export function safePath(base, userPath) {
|
|
38
|
+
if (!userPath || typeof userPath !== "string") {
|
|
39
|
+
throw new Error("Path must be a non-empty string");
|
|
40
|
+
}
|
|
41
|
+
// Reject absolute paths outright
|
|
42
|
+
if (userPath.startsWith("/") || userPath.startsWith("\\")) {
|
|
43
|
+
throw new Error(`Absolute paths are not allowed: "${userPath}"`);
|
|
44
|
+
}
|
|
45
|
+
// Reject null bytes (poison byte attack)
|
|
46
|
+
if (userPath.includes("\0")) {
|
|
47
|
+
throw new Error("Path contains null bytes");
|
|
48
|
+
}
|
|
49
|
+
const resolved = resolve(base, userPath);
|
|
50
|
+
const normalizedBase = resolve(base);
|
|
51
|
+
if (!resolved.startsWith(normalizedBase + "/")) {
|
|
52
|
+
throw new Error(`Path traversal detected: "${userPath}" escapes the allowed directory`);
|
|
53
|
+
}
|
|
54
|
+
return resolved;
|
|
55
|
+
}
|
|
32
56
|
// ── Wiki Class ────────────────────────────────────────────────────
|
|
33
57
|
export class Wiki {
|
|
34
58
|
config;
|
|
@@ -197,7 +221,7 @@ _Chronological view of all knowledge in this wiki._
|
|
|
197
221
|
* If sourcePath is an existing file, copies it.
|
|
198
222
|
* Raw files are IMMUTABLE — re-adding the same path is an error. */
|
|
199
223
|
rawAdd(filename, opts) {
|
|
200
|
-
const rawPath =
|
|
224
|
+
const rawPath = safePath(this.config.rawDir, filename);
|
|
201
225
|
const metaPath = rawPath + ".meta.yaml";
|
|
202
226
|
// Immutability guard — never overwrite existing raw files
|
|
203
227
|
if (existsSync(rawPath)) {
|
|
@@ -262,17 +286,45 @@ _Chronological view of all knowledge in this wiki._
|
|
|
262
286
|
}
|
|
263
287
|
return docs;
|
|
264
288
|
}
|
|
265
|
-
/** Read a raw document's content.
|
|
266
|
-
|
|
267
|
-
|
|
289
|
+
/** Read a raw document's content and metadata.
|
|
290
|
+
* Text/SVG/JSON/XML files return content as UTF-8 string.
|
|
291
|
+
* Document files (PDF, DOCX, XLSX, PPTX) are extracted via Node.js libraries.
|
|
292
|
+
* Other binary files (images, etc.) return metadata only. */
|
|
293
|
+
async rawRead(filename) {
|
|
294
|
+
const fullPath = safePath(this.config.rawDir, filename);
|
|
268
295
|
if (!existsSync(fullPath))
|
|
269
296
|
return null;
|
|
270
|
-
const content = readFileSync(fullPath, "utf-8");
|
|
271
297
|
const metaPath = fullPath + ".meta.yaml";
|
|
272
298
|
const meta = existsSync(metaPath)
|
|
273
299
|
? yaml.load(readFileSync(metaPath, "utf-8"))
|
|
274
300
|
: null;
|
|
275
|
-
|
|
301
|
+
const mime = meta?.mimeType ?? guessMime(filename);
|
|
302
|
+
const isText = mime.startsWith("text/")
|
|
303
|
+
|| mime === "application/json"
|
|
304
|
+
|| mime === "application/xml"
|
|
305
|
+
|| mime === "image/svg+xml"; // SVG is XML text
|
|
306
|
+
if (isText) {
|
|
307
|
+
const content = readFileSync(fullPath, "utf-8");
|
|
308
|
+
return { content, meta, binary: false };
|
|
309
|
+
}
|
|
310
|
+
// Document formats — extract text via Node.js libraries
|
|
311
|
+
const ext = extname(filename).toLowerCase();
|
|
312
|
+
const extractable = new Set([".pdf", ".docx", ".xlsx", ".pptx", ".html", ".htm"]);
|
|
313
|
+
if (extractable.has(ext)) {
|
|
314
|
+
try {
|
|
315
|
+
const text = await extractTextNode(fullPath);
|
|
316
|
+
return { content: text, meta, binary: false };
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
const stat = statSync(fullPath);
|
|
320
|
+
return {
|
|
321
|
+
content: null, meta, binary: true,
|
|
322
|
+
note: `Text extraction failed: ${e.message}. File size: ${formatBytes(stat.size)}.`,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Other binary files — metadata only
|
|
327
|
+
return { content: null, meta, binary: true };
|
|
276
328
|
}
|
|
277
329
|
/** Verify integrity of all raw files against their stored hashes. */
|
|
278
330
|
rawVerify() {
|
|
@@ -332,7 +384,7 @@ _Chronological view of all knowledge in this wiki._
|
|
|
332
384
|
}
|
|
333
385
|
}
|
|
334
386
|
// ── Immutability guard ──
|
|
335
|
-
const rawPath =
|
|
387
|
+
const rawPath = safePath(this.config.rawDir, inferredFilename);
|
|
336
388
|
if (existsSync(rawPath)) {
|
|
337
389
|
throw new Error(`Raw file already exists: ${inferredFilename}. Raw files are immutable.`);
|
|
338
390
|
}
|
|
@@ -369,7 +421,7 @@ _Chronological view of all knowledge in this wiki._
|
|
|
369
421
|
}
|
|
370
422
|
}
|
|
371
423
|
// Re-check with potentially updated filename
|
|
372
|
-
const finalPath =
|
|
424
|
+
const finalPath = safePath(this.config.rawDir, inferredFilename);
|
|
373
425
|
if (finalPath !== rawPath && existsSync(finalPath)) {
|
|
374
426
|
throw new Error(`Raw file already exists: ${inferredFilename}. Raw files are immutable.`);
|
|
375
427
|
}
|
|
@@ -406,9 +458,10 @@ _Chronological view of all knowledge in this wiki._
|
|
|
406
458
|
// ── CRUD ──────────────────────────────────────────────────────
|
|
407
459
|
/** Read a wiki page. Returns null if not found. */
|
|
408
460
|
read(pagePath) {
|
|
409
|
-
const fullPath =
|
|
461
|
+
const fullPath = safePath(this.config.wikiDir, pagePath);
|
|
410
462
|
if (!existsSync(fullPath)) {
|
|
411
463
|
const withMd = fullPath.endsWith(".md") ? fullPath : fullPath + ".md";
|
|
464
|
+
// withMd is derived from already-validated fullPath, so no re-check needed
|
|
412
465
|
if (!existsSync(withMd))
|
|
413
466
|
return null;
|
|
414
467
|
return this.parsePage(relative(this.config.wikiDir, withMd), readFileSync(withMd, "utf-8"));
|
|
@@ -418,7 +471,7 @@ _Chronological view of all knowledge in this wiki._
|
|
|
418
471
|
/** Write (create or update) a wiki page. Content must include frontmatter.
|
|
419
472
|
* Automatically injects/updates created and updated timestamps. */
|
|
420
473
|
write(pagePath, content, source) {
|
|
421
|
-
const fullPath =
|
|
474
|
+
const fullPath = safePath(this.config.wikiDir, pagePath);
|
|
422
475
|
const dir = dirname(fullPath);
|
|
423
476
|
mkdirSync(dir, { recursive: true });
|
|
424
477
|
const now = new Date().toISOString();
|
|
@@ -446,7 +499,7 @@ _Chronological view of all knowledge in this wiki._
|
|
|
446
499
|
if (SYSTEM_PAGES.has(pagePath)) {
|
|
447
500
|
throw new Error(`Cannot delete system page: ${pagePath}`);
|
|
448
501
|
}
|
|
449
|
-
const fullPath =
|
|
502
|
+
const fullPath = safePath(this.config.wikiDir, pagePath);
|
|
450
503
|
if (!existsSync(fullPath))
|
|
451
504
|
return false;
|
|
452
505
|
unlinkSync(fullPath);
|
|
@@ -1125,6 +1178,66 @@ function listAllFiles(dir, root) {
|
|
|
1125
1178
|
}
|
|
1126
1179
|
return result.sort();
|
|
1127
1180
|
}
|
|
1181
|
+
/** Extract text from document files using pure Node.js libraries (no Python). */
|
|
1182
|
+
async function extractTextNode(filePath) {
|
|
1183
|
+
const ext = extname(filePath).toLowerCase();
|
|
1184
|
+
if (ext === ".pdf") {
|
|
1185
|
+
const pdfParse = (await import("pdf-parse")).default;
|
|
1186
|
+
const buf = readFileSync(filePath);
|
|
1187
|
+
const data = await pdfParse(buf);
|
|
1188
|
+
return data.text;
|
|
1189
|
+
}
|
|
1190
|
+
if (ext === ".docx") {
|
|
1191
|
+
const mammoth = await import("mammoth");
|
|
1192
|
+
const result = await mammoth.extractRawText({ path: filePath });
|
|
1193
|
+
return result.value;
|
|
1194
|
+
}
|
|
1195
|
+
if (ext === ".xlsx") {
|
|
1196
|
+
const XLSX = await import("xlsx");
|
|
1197
|
+
const wb = XLSX.readFile(filePath);
|
|
1198
|
+
const sheets = [];
|
|
1199
|
+
for (const name of wb.SheetNames) {
|
|
1200
|
+
const ws = wb.Sheets[name];
|
|
1201
|
+
if (!ws)
|
|
1202
|
+
continue;
|
|
1203
|
+
const csv = XLSX.utils.sheet_to_csv(ws);
|
|
1204
|
+
if (csv.trim()) {
|
|
1205
|
+
sheets.push(`--- Sheet: ${name} ---\n${csv.trim()}`);
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
return sheets.join("\n\n");
|
|
1209
|
+
}
|
|
1210
|
+
if (ext === ".pptx") {
|
|
1211
|
+
const AdmZip = (await import("adm-zip")).default;
|
|
1212
|
+
const zip = new AdmZip(filePath);
|
|
1213
|
+
const slides = [];
|
|
1214
|
+
const entries = zip.getEntries()
|
|
1215
|
+
.filter(e => /^ppt\/slides\/slide\d+\.xml$/.test(e.entryName))
|
|
1216
|
+
.sort((a, b) => a.entryName.localeCompare(b.entryName, undefined, { numeric: true }));
|
|
1217
|
+
for (const entry of entries) {
|
|
1218
|
+
const xml = entry.getData().toString("utf-8");
|
|
1219
|
+
// Strip XML tags, keep text content
|
|
1220
|
+
const text = xml.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
1221
|
+
if (text) {
|
|
1222
|
+
const num = entry.entryName.match(/slide(\d+)/)?.[1] ?? "?";
|
|
1223
|
+
slides.push(`--- Slide ${num} ---\n${text}`);
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
return slides.join("\n\n");
|
|
1227
|
+
}
|
|
1228
|
+
if (ext === ".html" || ext === ".htm") {
|
|
1229
|
+
const html = readFileSync(filePath, "utf-8");
|
|
1230
|
+
// Strip script/style blocks, then tags
|
|
1231
|
+
const cleaned = html
|
|
1232
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
1233
|
+
.replace(/<style[\s\S]*?<\/style>/gi, "")
|
|
1234
|
+
.replace(/<[^>]+>/g, "\n")
|
|
1235
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
1236
|
+
.trim();
|
|
1237
|
+
return cleaned;
|
|
1238
|
+
}
|
|
1239
|
+
throw new Error(`Unsupported document format: ${ext}`);
|
|
1240
|
+
}
|
|
1128
1241
|
function guessMime(filename) {
|
|
1129
1242
|
const ext = extname(filename).toLowerCase();
|
|
1130
1243
|
const map = {
|