@lgrammel/kiwix-tool 1.0.0 → 2.0.1

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 CHANGED
@@ -1,32 +1,108 @@
1
1
  # @lgrammel/kiwix-tool
2
2
 
3
- AI SDK 7 canary tool for reading local Kiwix/ZIM archives in Node.js with `@openzim/libzim`.
3
+ AI SDK 7 tool package for searching and reading local [Kiwix](https://kiwix.org/) `.zim` archives from Node.js.
4
+
5
+ Use it when a local agent should answer from an offline knowledge base such as Wikipedia, Stack Exchange, project docs, or another ZIM archive.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ bun add @lgrammel/kiwix-tool
11
+ ```
12
+
13
+ This package uses `@openzim/libzim` under the hood and must run in a Node.js-compatible environment.
14
+
15
+ ## Usage
4
16
 
5
17
  ```ts
6
- import { KiwixTools } from "@lgrammel/kiwix-tool";
18
+ import { kiwixReadPage, kiwixSearch } from "@lgrammel/kiwix-tool";
19
+ import { openai } from "@ai-sdk/openai";
7
20
  import { ToolLoopAgent } from "ai";
8
21
 
9
- const kiwix = new KiwixTools({
10
- zimPath: "~/opt/zim/wikipedia.zim"
11
- });
22
+ const prompt =
23
+ process.argv.slice(2).join(" ") || "Explain what Kiwix is in three concise bullet points.";
24
+
25
+ const kiwixArchiveContext = {
26
+ zimPath: process.env.WIKIPEDIA_ZIM_PATH ?? "~/opt/zim/wikipedia.zim"
27
+ };
12
28
 
13
29
  const agent = new ToolLoopAgent({
14
- model,
15
- instructions: "Answer using the local Wikipedia archive. Search before reading pages.",
30
+ model: openai("gpt-5.5"),
31
+ instructions:
32
+ "Answer using the local Wikipedia archive. Search before reading pages, and cite the page titles you used.",
16
33
  tools: {
17
- wikipediaSearch: kiwix.searchTool,
18
- wikipediaRead: kiwix.readTool
34
+ wikipediaSearch: kiwixSearch,
35
+ wikipediaRead: kiwixReadPage
36
+ },
37
+ toolsContext: {
38
+ wikipediaSearch: {
39
+ ...kiwixArchiveContext,
40
+ searchResultLimit: 5,
41
+ searchCandidateLimit: 100
42
+ },
43
+ wikipediaRead: {
44
+ ...kiwixArchiveContext,
45
+ readMaxBytes: 80 * 1024
46
+ }
19
47
  }
20
48
  });
21
49
 
22
50
  const result = await agent.generate({
23
- prompt: "What is Kiwix?"
51
+ prompt
24
52
  });
53
+
54
+ console.log(result.text);
25
55
  ```
26
56
 
27
57
  ## Tools
28
58
 
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`.
59
+ - `kiwixSearch`: full-text search over the archive. It fetches a configurable number of raw libzim results, reranks them to prefer exact and prefix title/path matches, then returns the configured number of results. Input is `{ query }`. Output is `results` with `title`, `path`, and optional `snippet`.
60
+ - `kiwixReadPage`: read a page by exact path returned from search. Input is `{ path }`. Output is `title`, `path`, `content`, and `truncated`.
61
+
62
+ The model cannot choose result, candidate, or read limits. Search result count, internal search candidate count, and page byte limits are configured only on the tool that uses them through each tool's `toolsContext` entry, validated by that tool's `contextSchema`, so tool outputs stay predictable for agents. HTML pages are converted to UTF-8 text before returning them to the model.
63
+
64
+ ## API
65
+
66
+ Use the exported tools directly and pass tool-specific configuration through `toolsContext`:
67
+
68
+ ```ts
69
+ import { kiwixReadPage, kiwixSearch } from "@lgrammel/kiwix-tool";
70
+
71
+ const kiwixArchiveContext = {
72
+ zimPath: "~/opt/zim/wikipedia.zim"
73
+ };
74
+
75
+ const tools = {
76
+ wikipediaSearch: kiwixSearch,
77
+ wikipediaRead: kiwixReadPage
78
+ };
79
+
80
+ const toolsContext = {
81
+ wikipediaSearch: {
82
+ ...kiwixArchiveContext,
83
+ searchResultLimit: 5,
84
+ searchCandidateLimit: 100
85
+ },
86
+ wikipediaRead: {
87
+ ...kiwixArchiveContext,
88
+ readMaxBytes: 80 * 1024
89
+ }
90
+ };
91
+ ```
92
+
93
+ Each tool keeps its archive connection private and refreshes it if the archive context changes.
94
+
95
+ ## Shared Archive Context
96
+
97
+ - `zimPath`: path to the `.zim` file. `~/` is expanded to the current user's home directory.
98
+ - `preloadXapianDb`: preload the full-text index when opening the archive. Defaults to `true`.
99
+ - `preloadDirentRanges`: number of directory entry ranges to preload when opening the archive.
100
+
101
+ ## Search Context
102
+
103
+ - `searchResultLimit`: fixed number of search results returned to the agent. Defaults to `5` and is capped at `10`.
104
+ - `searchCandidateLimit`: number of raw libzim results fetched before title-aware reranking. Defaults to `100` and is capped at `500`. The effective candidate limit is never lower than `searchResultLimit`.
105
+
106
+ ## Read Context
31
107
 
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.
108
+ - `readMaxBytes`: maximum page bytes read before conversion to text. Defaults to `81920` and is capped at `524288`.
package/dist/index.d.ts CHANGED
@@ -1,71 +1,72 @@
1
- import { type Tool } from "ai";
1
+ import type { ToolExecutionOptions } from "ai";
2
2
  import { z } from "zod";
3
- export declare const kiwixSearchInputSchema: z.ZodObject<{
3
+ declare const kiwixSearchInputSchema: z.ZodObject<{
4
4
  query: z.ZodString;
5
5
  }, z.core.$strip>;
6
- export declare const kiwixReadInputSchema: z.ZodObject<{
6
+ declare const kiwixReadInputSchema: z.ZodObject<{
7
7
  path: z.ZodString;
8
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 {
9
+ declare const kiwixSearchContextSchema: z.ZodObject<{
10
+ zimPath: z.ZodString;
11
+ preloadXapianDb: z.ZodOptional<z.ZodBoolean>;
12
+ preloadDirentRanges: z.ZodOptional<z.ZodNumber>;
13
+ searchResultLimit: z.ZodOptional<z.ZodNumber>;
14
+ searchCandidateLimit: z.ZodOptional<z.ZodNumber>;
15
+ }, z.core.$strip>;
16
+ declare const kiwixReadPageContextSchema: z.ZodObject<{
17
+ zimPath: z.ZodString;
18
+ preloadXapianDb: z.ZodOptional<z.ZodBoolean>;
19
+ preloadDirentRanges: z.ZodOptional<z.ZodNumber>;
20
+ readMaxBytes: z.ZodOptional<z.ZodNumber>;
21
+ }, z.core.$strip>;
22
+ type ParsedKiwixSearchInput = z.output<typeof kiwixSearchInputSchema>;
23
+ type ParsedKiwixReadInput = z.output<typeof kiwixReadInputSchema>;
24
+ type KiwixSearchContext = z.output<typeof kiwixSearchContextSchema>;
25
+ type KiwixReadPageContext = z.output<typeof kiwixReadPageContextSchema>;
26
+ interface KiwixSearchResult {
36
27
  title: string;
37
28
  path: string;
38
29
  snippet?: string;
39
30
  }
40
- export interface KiwixSearchOutput {
31
+ interface KiwixSearchOutput {
41
32
  results: KiwixSearchResult[];
42
33
  }
43
- export interface KiwixReadOutput {
34
+ interface KiwixReadOutput {
44
35
  title: string;
45
36
  path: string;
46
37
  content: string;
47
38
  truncated: boolean;
48
39
  }
49
- export type KiwixSearchTool = Tool<ParsedKiwixSearchInput, KiwixSearchOutput>;
50
- export type KiwixReadTool = Tool<ParsedKiwixReadInput, KiwixReadOutput>;
51
- export declare class KiwixReader {
40
+ declare class KiwixSearchTool {
52
41
  #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>;
42
+ readonly 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.";
43
+ readonly inputSchema: z.ZodObject<{
44
+ query: z.ZodString;
45
+ }, z.core.$strip>;
46
+ readonly contextSchema: z.ZodObject<{
47
+ zimPath: z.ZodString;
48
+ preloadXapianDb: z.ZodOptional<z.ZodBoolean>;
49
+ preloadDirentRanges: z.ZodOptional<z.ZodNumber>;
50
+ searchResultLimit: z.ZodOptional<z.ZodNumber>;
51
+ searchCandidateLimit: z.ZodOptional<z.ZodNumber>;
52
+ }, z.core.$strip>;
53
+ execute: ({ query }: ParsedKiwixSearchInput, { context }: ToolExecutionOptions<KiwixSearchContext>) => Promise<KiwixSearchOutput>;
59
54
  }
60
- export declare class KiwixTools {
55
+ declare class KiwixReadPageTool {
61
56
  #private;
62
- readonly reader: KiwixReader;
63
- constructor(options: CreateKiwixToolOptions);
64
- get searchTool(): KiwixSearchTool;
65
- get readTool(): KiwixReadTool;
57
+ readonly description = "Read one page from the local Kiwix archive by exact path from the search tool.";
58
+ readonly inputSchema: z.ZodObject<{
59
+ path: z.ZodString;
60
+ }, z.core.$strip>;
61
+ readonly contextSchema: z.ZodObject<{
62
+ zimPath: z.ZodString;
63
+ preloadXapianDb: z.ZodOptional<z.ZodBoolean>;
64
+ preloadDirentRanges: z.ZodOptional<z.ZodNumber>;
65
+ readMaxBytes: z.ZodOptional<z.ZodNumber>;
66
+ }, z.core.$strip>;
67
+ execute: ({ path }: ParsedKiwixReadInput, { context }: ToolExecutionOptions<KiwixReadPageContext>) => Promise<KiwixReadOutput>;
66
68
  }
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;
69
+ export declare const kiwixSearch: KiwixSearchTool;
70
+ export declare const kiwixReadPage: KiwixReadPageTool;
71
+ export {};
71
72
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAKrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,QAAA,MAAM,sBAAsB;;iBAE1B,CAAC;AAEH,QAAA,MAAM,oBAAoB;;iBAExB,CAAC;AAqBH,QAAA,MAAM,wBAAwB;;;;;;iBAmB5B,CAAC;AAEH,QAAA,MAAM,0BAA0B;;;;;iBAQ9B,CAAC;AAEH,KAAK,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,KAAK,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,KAAK,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AACpE,KAAK,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAExE,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,UAAU,iBAAiB;IACzB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAsCD,cAAM,eAAe;;IACnB,QAAQ,CAAC,WAAW,4IACuH;IAC3I,QAAQ,CAAC,WAAW;;sBAA0B;IAC9C,QAAQ,CAAC,aAAa;;;;;;sBAA4B;IAMlD,OAAO,GACL,WAAW,sBAAsB,EACjC,aAAa,oBAAoB,CAAC,kBAAkB,CAAC,KACpD,OAAO,CAAC,iBAAiB,CAAC,CA8B3B;CAiBH;AAED,cAAM,iBAAiB;;IACrB,QAAQ,CAAC,WAAW,oFAC+D;IACnF,QAAQ,CAAC,WAAW;;sBAAwB;IAC5C,QAAQ,CAAC,aAAa;;;;;sBAA8B;IAKpD,OAAO,GACL,UAAU,oBAAoB,EAC9B,aAAa,oBAAoB,CAAC,oBAAoB,CAAC,KACtD,OAAO,CAAC,eAAe,CAAC,CAazB;CAgBH;AAED,eAAO,MAAM,WAAW,iBAIvB,CAAC;AAEF,eAAO,MAAM,aAAa,mBAIzB,CAAC"}
package/dist/index.js CHANGED
@@ -1,112 +1,170 @@
1
- import { tool } from "ai";
2
1
  import { convert as htmlToText } from "html-to-text";
3
2
  import { homedir } from "node:os";
4
3
  import { isAbsolute, join } from "node:path";
5
4
  import { z } from "zod";
6
5
  const DEFAULT_SEARCH_RESULT_LIMIT = 5;
7
6
  const MAX_SEARCH_RESULT_LIMIT = 10;
7
+ const DEFAULT_SEARCH_CANDIDATE_LIMIT = 100;
8
+ const MAX_SEARCH_CANDIDATE_LIMIT = 500;
8
9
  const DEFAULT_READ_MAX_BYTES = 80 * 1024;
9
10
  const HARD_READ_MAX_BYTES = 512 * 1024;
10
11
  const MAX_SNIPPET_LENGTH = 600;
11
- export const kiwixSearchInputSchema = z.object({
12
+ const kiwixSearchInputSchema = z.object({
12
13
  query: z.string().min(1).describe("Full-text search query for the Kiwix archive."),
13
14
  });
14
- export const kiwixReadInputSchema = z.object({
15
+ const kiwixReadInputSchema = z.object({
15
16
  path: z.string().min(1).describe("Exact ZIM page path returned by the search tool."),
16
17
  });
17
- export class KiwixReader {
18
+ const kiwixArchiveContextSchema = z.object({
19
+ zimPath: z
20
+ .string()
21
+ .min(1)
22
+ .describe("Path to the `.zim` file. A leading `~/` is expanded to the current user's home directory."),
23
+ preloadXapianDb: z
24
+ .boolean()
25
+ .optional()
26
+ .describe("Preload the full-text index when opening the archive. Defaults to true."),
27
+ preloadDirentRanges: z
28
+ .number()
29
+ .int()
30
+ .nonnegative()
31
+ .optional()
32
+ .describe("Number of directory entry ranges to preload when opening the archive."),
33
+ });
34
+ const kiwixSearchContextSchema = kiwixArchiveContextSchema.extend({
35
+ searchResultLimit: z
36
+ .number()
37
+ .int()
38
+ .positive()
39
+ .max(MAX_SEARCH_RESULT_LIMIT)
40
+ .optional()
41
+ .describe("Fixed number of search results returned to the agent. Defaults to 5 and is capped at 10."),
42
+ searchCandidateLimit: z
43
+ .number()
44
+ .int()
45
+ .positive()
46
+ .max(MAX_SEARCH_CANDIDATE_LIMIT)
47
+ .optional()
48
+ .describe("Number of raw libzim results fetched before title-aware reranking. Defaults to 100 and is capped at 500."),
49
+ });
50
+ const kiwixReadPageContextSchema = kiwixArchiveContextSchema.extend({
51
+ readMaxBytes: z
52
+ .number()
53
+ .int()
54
+ .positive()
55
+ .max(HARD_READ_MAX_BYTES)
56
+ .optional()
57
+ .describe("Fixed maximum page bytes read before HTML-to-text conversion. Defaults to 81920."),
58
+ });
59
+ class KiwixArchive {
18
60
  zimPath;
19
- searchResultLimit;
20
- readMaxBytes;
21
61
  #archive;
22
62
  #libzim;
63
+ #context;
64
+ constructor(context) {
65
+ this.zimPath = resolveHomePath(context.zimPath);
66
+ this.#context = context;
67
+ }
68
+ get() {
69
+ this.#archive ??= this.#openArchive();
70
+ return this.#archive;
71
+ }
72
+ loadLibzim() {
73
+ this.#libzim ??= import("@openzim/libzim");
74
+ return this.#libzim;
75
+ }
76
+ async #openArchive() {
77
+ const { Archive, OpenConfig } = await this.loadLibzim();
78
+ const config = new OpenConfig();
79
+ config.preloadXapianDb(this.#context.preloadXapianDb ?? true);
80
+ if (this.#context.preloadDirentRanges !== undefined) {
81
+ config.preloadDirentRanges(this.#context.preloadDirentRanges);
82
+ }
83
+ return new Archive(this.zimPath, config);
84
+ }
85
+ }
86
+ class KiwixSearchTool {
87
+ 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.";
88
+ inputSchema = kiwixSearchInputSchema;
89
+ contextSchema = kiwixSearchContextSchema;
23
90
  #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());
91
+ #archive;
92
+ #archiveCacheKey;
93
+ execute = async ({ query }, { context }) => {
94
+ const archive = this.#getArchive(context);
95
+ const { Searcher } = await archive.loadLibzim();
96
+ this.#searcher ??= new Searcher(await archive.get());
34
97
  const search = this.#searcher.search(query);
35
- const results = Array.from(search.getResults(0, this.searchResultLimit)).map((result) => ({
98
+ const searchResultLimit = clampSearchResultLimit(context.searchResultLimit ?? DEFAULT_SEARCH_RESULT_LIMIT);
99
+ const searchCandidateLimit = clampSearchCandidateLimit(Math.max(context.searchCandidateLimit ?? DEFAULT_SEARCH_CANDIDATE_LIMIT, searchResultLimit));
100
+ const results = Array.from(search.getResults(0, searchCandidateLimit))
101
+ .map((result, index) => ({
36
102
  title: result.title,
37
103
  path: result.path,
38
104
  snippet: cleanSnippet(result.snippet),
105
+ score: scoreSearchResult(query, result.title, result.path),
106
+ index,
107
+ }))
108
+ .sort((a, b) => b.score - a.score || a.index - b.index)
109
+ .slice(0, searchResultLimit)
110
+ .map(({ title, path, snippet }) => ({
111
+ title,
112
+ path,
113
+ snippet,
39
114
  }));
40
115
  return { results };
116
+ };
117
+ #getArchive(context) {
118
+ const archiveCacheKey = getArchiveCacheKey(context);
119
+ if (archiveCacheKey !== this.#archiveCacheKey) {
120
+ this.#archive = new KiwixArchive(context);
121
+ this.#archiveCacheKey = archiveCacheKey;
122
+ this.#searcher = undefined;
123
+ }
124
+ if (!this.#archive) {
125
+ throw new Error("Kiwix archive was not initialized.");
126
+ }
127
+ return this.#archive;
41
128
  }
42
- async readPath(path) {
43
- const entry = (await this.#getArchive()).getEntryByPath(path);
129
+ }
130
+ class KiwixReadPageTool {
131
+ description = "Read one page from the local Kiwix archive by exact path from the search tool.";
132
+ inputSchema = kiwixReadInputSchema;
133
+ contextSchema = kiwixReadPageContextSchema;
134
+ #archive;
135
+ #archiveCacheKey;
136
+ execute = async ({ path }, { context }) => {
137
+ const entry = (await this.#getArchive(context).get()).getEntryByPath(path);
44
138
  const item = entry.getItem(true);
45
139
  const size = toSafeNumber(item.size);
46
- const data = item.getData(0, Math.min(this.readMaxBytes, size)).data;
140
+ const readMaxBytes = clampReadMaxBytes(context.readMaxBytes ?? DEFAULT_READ_MAX_BYTES);
141
+ const data = item.getData(0, Math.min(readMaxBytes, size)).data;
47
142
  return {
48
143
  title: entry.title,
49
144
  path: entry.path,
50
145
  content: formatPageContent(item, data),
51
146
  truncated: data.byteLength < size,
52
147
  };
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);
148
+ };
149
+ #getArchive(context) {
150
+ const archiveCacheKey = getArchiveCacheKey(context);
151
+ if (archiveCacheKey !== this.#archiveCacheKey) {
152
+ this.#archive = new KiwixArchive(context);
153
+ this.#archiveCacheKey = archiveCacheKey;
63
154
  }
64
- if (this.#options.preloadDirentRanges !== undefined) {
65
- config.preloadDirentRanges(this.#options.preloadDirentRanges);
155
+ if (!this.#archive) {
156
+ throw new Error("Kiwix archive was not initialized.");
66
157
  }
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;
158
+ return this.#archive;
88
159
  }
89
160
  }
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),
161
+ export const kiwixSearch = new KiwixSearchTool();
162
+ export const kiwixReadPage = new KiwixReadPageTool();
163
+ function getArchiveCacheKey(context) {
164
+ return JSON.stringify({
165
+ zimPath: resolveHomePath(context.zimPath),
166
+ preloadXapianDb: context.preloadXapianDb,
167
+ preloadDirentRanges: context.preloadDirentRanges,
110
168
  });
111
169
  }
112
170
  function formatPageContent(item, data) {
@@ -134,6 +192,62 @@ function cleanSnippet(snippet) {
134
192
  }
135
193
  return text.length > MAX_SNIPPET_LENGTH ? `${text.slice(0, MAX_SNIPPET_LENGTH).trim()}...` : text;
136
194
  }
195
+ function scoreSearchResult(query, title, path) {
196
+ const normalizedQuery = normalizeSearchText(query);
197
+ if (!normalizedQuery) {
198
+ return 0;
199
+ }
200
+ const normalizedTitle = normalizeSearchText(title);
201
+ const normalizedPathTitle = normalizePathTitle(path);
202
+ const queryTerms = normalizedQuery.split(" ");
203
+ let score = 0;
204
+ if (normalizedTitle === normalizedQuery) {
205
+ score += 1000;
206
+ }
207
+ if (normalizedPathTitle === normalizedQuery) {
208
+ score += 900;
209
+ }
210
+ if (normalizedTitle.startsWith(`${normalizedQuery} `)) {
211
+ score += 700;
212
+ }
213
+ if (normalizedPathTitle.startsWith(`${normalizedQuery} `)) {
214
+ score += 600;
215
+ }
216
+ if (normalizedTitle.includes(normalizedQuery)) {
217
+ score += 300;
218
+ }
219
+ if (normalizedPathTitle.includes(normalizedQuery)) {
220
+ score += 200;
221
+ }
222
+ for (const term of queryTerms) {
223
+ if (normalizedTitle.includes(term)) {
224
+ score += 20;
225
+ }
226
+ if (normalizedPathTitle.includes(term)) {
227
+ score += 10;
228
+ }
229
+ }
230
+ return score;
231
+ }
232
+ function normalizePathTitle(path) {
233
+ const pathTitle = path.split("/").pop() ?? path;
234
+ try {
235
+ return normalizeSearchText(decodeURIComponent(pathTitle.replace(/\.[^.]+$/, "")));
236
+ }
237
+ catch {
238
+ return normalizeSearchText(pathTitle.replace(/\.[^.]+$/, ""));
239
+ }
240
+ }
241
+ function normalizeSearchText(text) {
242
+ return text
243
+ .normalize("NFKD")
244
+ .replace(/[\u0300-\u036f]/g, "")
245
+ .replace(/[_-]+/g, " ")
246
+ .replace(/[^\p{L}\p{N}]+/gu, " ")
247
+ .toLowerCase()
248
+ .replace(/\s+/g, " ")
249
+ .trim();
250
+ }
137
251
  function isTextMimeType(mimeType) {
138
252
  return (mimeType.startsWith("text/") ||
139
253
  isHtmlMimeType(mimeType) ||
@@ -158,6 +272,9 @@ function resolveHomePath(path) {
158
272
  function clampSearchResultLimit(limit) {
159
273
  return Math.min(Math.max(Math.trunc(limit), 1), MAX_SEARCH_RESULT_LIMIT);
160
274
  }
275
+ function clampSearchCandidateLimit(limit) {
276
+ return Math.min(Math.max(Math.trunc(limit), 1), MAX_SEARCH_CANDIDATE_LIMIT);
277
+ }
161
278
  function clampReadMaxBytes(maxBytes) {
162
279
  return Math.min(Math.max(Math.trunc(maxBytes), 1), HARD_READ_MAX_BYTES);
163
280
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lgrammel/kiwix-tool",
3
- "version": "1.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "AI SDK 7 tool for reading Kiwix/ZIM archives with Node.js libzim bindings.",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -31,9 +31,9 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/html-to-text": "^9.0.4",
34
- "ai": "7.0.0-canary.120"
34
+ "ai": "^7.0.0-canary.133"
35
35
  },
36
36
  "peerDependencies": {
37
- "ai": "7.0.0-canary.120"
37
+ "ai": "^7.0.0-canary.133"
38
38
  }
39
39
  }