@lgrammel/kiwix-tool 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # @lgrammel/kiwix-tool
2
+
3
+ AI SDK 7 canary tool for reading local Kiwix/ZIM archives in Node.js with `@openzim/libzim`.
4
+
5
+ ```ts
6
+ import { KiwixTools } from "@lgrammel/kiwix-tool";
7
+ import { ToolLoopAgent } from "ai";
8
+
9
+ const kiwix = new KiwixTools({
10
+ zimPath: "~/opt/zim/wikipedia.zim"
11
+ });
12
+
13
+ const agent = new ToolLoopAgent({
14
+ model,
15
+ instructions: "Answer using the local Wikipedia archive. Search before reading pages.",
16
+ tools: {
17
+ wikipediaSearch: kiwix.searchTool,
18
+ wikipediaRead: kiwix.readTool
19
+ }
20
+ });
21
+
22
+ const result = await agent.generate({
23
+ prompt: "What is Kiwix?"
24
+ });
25
+ ```
26
+
27
+ ## Tools
28
+
29
+ - `kiwixSearchTool`: full-text search. Input is only `{ query }`. Output is `results` with `title`, `path`, and optional `snippet`.
30
+ - `kiwixReadTool`: read a page by exact path. Input is only `{ path }`. Output is `title`, `path`, `content`, and `truncated`.
31
+
32
+ The model cannot choose limits. Search result count and page byte limits are fixed in `KiwixTools` constructor options so tool outputs stay small enough for agents. HTML pages are converted to UTF-8 text before returning them to the model.
@@ -0,0 +1,71 @@
1
+ import { type Tool } from "ai";
2
+ import { z } from "zod";
3
+ export declare const kiwixSearchInputSchema: z.ZodObject<{
4
+ query: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export declare const kiwixReadInputSchema: z.ZodObject<{
7
+ path: z.ZodString;
8
+ }, z.core.$strip>;
9
+ export type KiwixSearchInput = z.input<typeof kiwixSearchInputSchema>;
10
+ export type ParsedKiwixSearchInput = z.output<typeof kiwixSearchInputSchema>;
11
+ export type KiwixReadInput = z.input<typeof kiwixReadInputSchema>;
12
+ export type ParsedKiwixReadInput = z.output<typeof kiwixReadInputSchema>;
13
+ export interface CreateKiwixToolOptions {
14
+ /**
15
+ * Path to the `.zim` file. A leading `~/` is expanded to the current user's home directory.
16
+ */
17
+ zimPath: string;
18
+ /**
19
+ * Fixed number of search results returned to the agent. This is intentionally not model-controlled.
20
+ */
21
+ searchResultLimit?: number;
22
+ /**
23
+ * Fixed maximum page bytes read before HTML-to-text conversion. This is intentionally not model-controlled.
24
+ */
25
+ readMaxBytes?: number;
26
+ /**
27
+ * Preload the full-text index when opening the archive.
28
+ */
29
+ preloadXapianDb?: boolean;
30
+ /**
31
+ * Number of directory entry ranges to preload when opening the archive.
32
+ */
33
+ preloadDirentRanges?: number;
34
+ }
35
+ export interface KiwixSearchResult {
36
+ title: string;
37
+ path: string;
38
+ snippet?: string;
39
+ }
40
+ export interface KiwixSearchOutput {
41
+ results: KiwixSearchResult[];
42
+ }
43
+ export interface KiwixReadOutput {
44
+ title: string;
45
+ path: string;
46
+ content: string;
47
+ truncated: boolean;
48
+ }
49
+ export type KiwixSearchTool = Tool<ParsedKiwixSearchInput, KiwixSearchOutput>;
50
+ export type KiwixReadTool = Tool<ParsedKiwixReadInput, KiwixReadOutput>;
51
+ export declare class KiwixReader {
52
+ #private;
53
+ readonly zimPath: string;
54
+ readonly searchResultLimit: number;
55
+ readonly readMaxBytes: number;
56
+ constructor(options: CreateKiwixToolOptions);
57
+ search(query: string): Promise<KiwixSearchOutput>;
58
+ readPath(path: string): Promise<KiwixReadOutput>;
59
+ }
60
+ export declare class KiwixTools {
61
+ #private;
62
+ readonly reader: KiwixReader;
63
+ constructor(options: CreateKiwixToolOptions);
64
+ get searchTool(): KiwixSearchTool;
65
+ get readTool(): KiwixReadTool;
66
+ }
67
+ export declare function createKiwixSearchTool(options: CreateKiwixToolOptions): KiwixSearchTool;
68
+ export declare function createKiwixReadTool(options: CreateKiwixToolOptions): KiwixReadTool;
69
+ export declare function kiwixSearchTool(reader: KiwixReader): KiwixSearchTool;
70
+ export declare function kiwixReadTool(reader: KiwixReader): KiwixReadTool;
71
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAKrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAE/B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC7E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;AAC9E,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AAExE,qBAAa,WAAW;;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAOlB,OAAO,EAAE,sBAAsB;IASrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAejD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAsCvD;AAED,qBAAa,UAAU;;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;gBAKjB,OAAO,EAAE,sBAAsB;IAI3C,IAAI,UAAU,IAAI,eAAe,CAGhC;IAED,IAAI,QAAQ,IAAI,aAAa,CAG5B;CACF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAGtF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAGlF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAOpE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAMhE"}
package/dist/index.js ADDED
@@ -0,0 +1,167 @@
1
+ import { tool } from "ai";
2
+ import { convert as htmlToText } from "html-to-text";
3
+ import { homedir } from "node:os";
4
+ import { isAbsolute, join } from "node:path";
5
+ import { z } from "zod";
6
+ const DEFAULT_SEARCH_RESULT_LIMIT = 5;
7
+ const MAX_SEARCH_RESULT_LIMIT = 10;
8
+ const DEFAULT_READ_MAX_BYTES = 80 * 1024;
9
+ const HARD_READ_MAX_BYTES = 512 * 1024;
10
+ const MAX_SNIPPET_LENGTH = 600;
11
+ export const kiwixSearchInputSchema = z.object({
12
+ query: z.string().min(1).describe("Full-text search query for the Kiwix archive."),
13
+ });
14
+ export const kiwixReadInputSchema = z.object({
15
+ path: z.string().min(1).describe("Exact ZIM page path returned by the search tool."),
16
+ });
17
+ export class KiwixReader {
18
+ zimPath;
19
+ searchResultLimit;
20
+ readMaxBytes;
21
+ #archive;
22
+ #libzim;
23
+ #searcher;
24
+ #options;
25
+ constructor(options) {
26
+ this.zimPath = resolveHomePath(options.zimPath);
27
+ this.searchResultLimit = clampSearchResultLimit(options.searchResultLimit ?? DEFAULT_SEARCH_RESULT_LIMIT);
28
+ this.readMaxBytes = clampReadMaxBytes(options.readMaxBytes ?? DEFAULT_READ_MAX_BYTES);
29
+ this.#options = options;
30
+ }
31
+ async search(query) {
32
+ const { Searcher } = await this.#loadLibzim();
33
+ this.#searcher ??= new Searcher(await this.#getArchive());
34
+ const search = this.#searcher.search(query);
35
+ const results = Array.from(search.getResults(0, this.searchResultLimit)).map((result) => ({
36
+ title: result.title,
37
+ path: result.path,
38
+ snippet: cleanSnippet(result.snippet),
39
+ }));
40
+ return { results };
41
+ }
42
+ async readPath(path) {
43
+ const entry = (await this.#getArchive()).getEntryByPath(path);
44
+ const item = entry.getItem(true);
45
+ const size = toSafeNumber(item.size);
46
+ const data = item.getData(0, Math.min(this.readMaxBytes, size)).data;
47
+ return {
48
+ title: entry.title,
49
+ path: entry.path,
50
+ content: formatPageContent(item, data),
51
+ truncated: data.byteLength < size,
52
+ };
53
+ }
54
+ #getArchive() {
55
+ this.#archive ??= this.#openArchive();
56
+ return this.#archive;
57
+ }
58
+ async #openArchive() {
59
+ const { Archive, OpenConfig } = await this.#loadLibzim();
60
+ const config = new OpenConfig();
61
+ if (this.#options.preloadXapianDb !== undefined) {
62
+ config.preloadXapianDb(this.#options.preloadXapianDb);
63
+ }
64
+ if (this.#options.preloadDirentRanges !== undefined) {
65
+ config.preloadDirentRanges(this.#options.preloadDirentRanges);
66
+ }
67
+ return new Archive(this.zimPath, config);
68
+ }
69
+ #loadLibzim() {
70
+ this.#libzim ??= import("@openzim/libzim");
71
+ return this.#libzim;
72
+ }
73
+ }
74
+ export class KiwixTools {
75
+ reader;
76
+ #searchTool;
77
+ #readTool;
78
+ constructor(options) {
79
+ this.reader = new KiwixReader(options);
80
+ }
81
+ get searchTool() {
82
+ this.#searchTool ??= kiwixSearchTool(this.reader);
83
+ return this.#searchTool;
84
+ }
85
+ get readTool() {
86
+ this.#readTool ??= kiwixReadTool(this.reader);
87
+ return this.#readTool;
88
+ }
89
+ }
90
+ export function createKiwixSearchTool(options) {
91
+ const reader = new KiwixReader(options);
92
+ return kiwixSearchTool(reader);
93
+ }
94
+ export function createKiwixReadTool(options) {
95
+ const reader = new KiwixReader(options);
96
+ return kiwixReadTool(reader);
97
+ }
98
+ export function kiwixSearchTool(reader) {
99
+ return tool({
100
+ description: "Search the local Kiwix archive. Returns page paths, titles, and short snippets. Use the read tool with a returned path to read a page.",
101
+ inputSchema: kiwixSearchInputSchema,
102
+ execute: async ({ query }) => reader.search(query),
103
+ });
104
+ }
105
+ export function kiwixReadTool(reader) {
106
+ return tool({
107
+ description: "Read one page from the local Kiwix archive by exact path from the search tool.",
108
+ inputSchema: kiwixReadInputSchema,
109
+ execute: async ({ path }) => reader.readPath(path),
110
+ });
111
+ }
112
+ function formatPageContent(item, data) {
113
+ if (!isTextMimeType(item.mimetype)) {
114
+ return `[${item.mimetype} content omitted: this Kiwix entry is not a text page.]`;
115
+ }
116
+ const text = data.toString("utf8");
117
+ if (!isHtmlMimeType(item.mimetype)) {
118
+ return text;
119
+ }
120
+ return htmlToText(text, {
121
+ selectors: [
122
+ { selector: "a", options: { ignoreHref: true } },
123
+ { selector: "img", format: "skip" },
124
+ { selector: "script", format: "skip" },
125
+ { selector: "style", format: "skip" },
126
+ ],
127
+ wordwrap: false,
128
+ });
129
+ }
130
+ function cleanSnippet(snippet) {
131
+ const text = htmlToText(snippet, { wordwrap: false }).replace(/\s+/g, " ").trim();
132
+ if (!text) {
133
+ return undefined;
134
+ }
135
+ return text.length > MAX_SNIPPET_LENGTH ? `${text.slice(0, MAX_SNIPPET_LENGTH).trim()}...` : text;
136
+ }
137
+ function isTextMimeType(mimeType) {
138
+ return (mimeType.startsWith("text/") ||
139
+ isHtmlMimeType(mimeType) ||
140
+ mimeType === "application/json" ||
141
+ mimeType === "application/xml" ||
142
+ mimeType === "application/xhtml+xml" ||
143
+ mimeType.endsWith("+json") ||
144
+ mimeType.endsWith("+xml"));
145
+ }
146
+ function isHtmlMimeType(mimeType) {
147
+ return mimeType === "text/html" || mimeType === "application/xhtml+xml";
148
+ }
149
+ function resolveHomePath(path) {
150
+ if (path === "~") {
151
+ return homedir();
152
+ }
153
+ if (path.startsWith("~/")) {
154
+ return join(homedir(), path.slice(2));
155
+ }
156
+ return isAbsolute(path) ? path : join(process.cwd(), path);
157
+ }
158
+ function clampSearchResultLimit(limit) {
159
+ return Math.min(Math.max(Math.trunc(limit), 1), MAX_SEARCH_RESULT_LIMIT);
160
+ }
161
+ function clampReadMaxBytes(maxBytes) {
162
+ return Math.min(Math.max(Math.trunc(maxBytes), 1), HARD_READ_MAX_BYTES);
163
+ }
164
+ function toSafeNumber(value) {
165
+ return typeof value === "bigint" ? Number(value) : value;
166
+ }
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@lgrammel/kiwix-tool",
3
+ "version": "1.0.0",
4
+ "description": "AI SDK 7 tool for reading Kiwix/ZIM archives with Node.js libzim bindings.",
5
+ "license": "MIT",
6
+ "files": [
7
+ "dist",
8
+ "README.md"
9
+ ],
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.build.json",
25
+ "typecheck": "tsc --noEmit -p tsconfig.json"
26
+ },
27
+ "dependencies": {
28
+ "@openzim/libzim": "^4.1.0",
29
+ "html-to-text": "^10.0.0",
30
+ "zod": "^4.4.3"
31
+ },
32
+ "devDependencies": {
33
+ "@types/html-to-text": "^9.0.4",
34
+ "ai": "7.0.0-canary.120"
35
+ },
36
+ "peerDependencies": {
37
+ "ai": "7.0.0-canary.120"
38
+ }
39
+ }