hoomanjs 1.28.2 → 1.29.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 (153) hide show
  1. package/README.md +32 -71
  2. package/dist/acp/acp-agent.js +1 -1
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/acp/sessions/{config-options.d.ts → options.d.ts} +0 -2
  5. package/dist/acp/sessions/{config-options.js → options.js} +3 -52
  6. package/dist/acp/sessions/options.js.map +1 -0
  7. package/dist/acp/utils/tool-kind.js +3 -9
  8. package/dist/acp/utils/tool-kind.js.map +1 -1
  9. package/dist/acp/utils/tool-locations.js +0 -2
  10. package/dist/acp/utils/tool-locations.js.map +1 -1
  11. package/dist/chat/app.js +1 -1
  12. package/dist/chat/app.js.map +1 -1
  13. package/dist/chat/index.js +1 -1
  14. package/dist/chat/index.js.map +1 -1
  15. package/dist/configure/app.js +227 -72
  16. package/dist/configure/app.js.map +1 -1
  17. package/dist/configure/types.d.ts +8 -0
  18. package/dist/core/agent/index.d.ts +1 -1
  19. package/dist/core/agent/index.js +10 -9
  20. package/dist/core/agent/index.js.map +1 -1
  21. package/dist/core/agents/registry.js +1 -1
  22. package/dist/core/agents/registry.js.map +1 -1
  23. package/dist/core/config.d.ts +5 -24
  24. package/dist/core/config.js +8 -43
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/context/flat-file-storage.js.map +1 -0
  27. package/dist/core/{memory/stm → context}/index.js +1 -1
  28. package/dist/core/context/index.js.map +1 -0
  29. package/dist/core/{memory/stm → context}/lazy-session-manager.js +1 -1
  30. package/dist/core/context/lazy-session-manager.js.map +1 -0
  31. package/dist/core/inference/embedder.d.ts +26 -0
  32. package/dist/core/inference/embedder.js +85 -0
  33. package/dist/core/inference/embedder.js.map +1 -0
  34. package/dist/core/inference/index.d.ts +12 -0
  35. package/dist/core/inference/index.js +20 -0
  36. package/dist/core/inference/index.js.map +1 -0
  37. package/dist/core/inference/loader.d.ts +8 -0
  38. package/dist/core/inference/loader.js +85 -0
  39. package/dist/core/inference/loader.js.map +1 -0
  40. package/dist/core/memory/brain.d.ts +24 -0
  41. package/dist/core/memory/brain.js +133 -0
  42. package/dist/core/memory/brain.js.map +1 -0
  43. package/dist/core/memory/database.d.ts +4 -0
  44. package/dist/core/memory/database.js +87 -0
  45. package/dist/core/memory/database.js.map +1 -0
  46. package/dist/core/memory/index.d.ts +5 -3
  47. package/dist/core/memory/index.js +3 -2
  48. package/dist/core/memory/index.js.map +1 -1
  49. package/dist/core/memory/tools.d.ts +16 -0
  50. package/dist/core/memory/tools.js +105 -0
  51. package/dist/core/memory/tools.js.map +1 -0
  52. package/dist/core/memory/types.d.ts +11 -0
  53. package/dist/core/memory/{ltm/types.js.map → types.js.map} +1 -1
  54. package/dist/core/models/index.js +1 -3
  55. package/dist/core/models/index.js.map +1 -1
  56. package/dist/core/models/openai.js +9 -0
  57. package/dist/core/models/openai.js.map +1 -0
  58. package/dist/core/prompts/static/memory.md +125 -0
  59. package/dist/core/prompts/static/wiki.md +15 -71
  60. package/dist/core/prompts/system.d.ts +4 -0
  61. package/dist/core/prompts/system.js +40 -9
  62. package/dist/core/prompts/system.js.map +1 -1
  63. package/dist/core/skills/built-in/hooman-config/SKILL.md +14 -50
  64. package/dist/core/state/tool-approvals.js +4 -15
  65. package/dist/core/state/tool-approvals.js.map +1 -1
  66. package/dist/core/tools/index.d.ts +0 -1
  67. package/dist/core/tools/index.js +0 -1
  68. package/dist/core/tools/index.js.map +1 -1
  69. package/dist/core/utils/hashing.d.ts +1 -0
  70. package/dist/core/utils/hashing.js +5 -0
  71. package/dist/core/utils/hashing.js.map +1 -0
  72. package/dist/core/utils/paths.d.ts +3 -0
  73. package/dist/core/utils/paths.js +11 -24
  74. package/dist/core/utils/paths.js.map +1 -1
  75. package/dist/core/utils/strands-usage-accumulate.js.map +1 -0
  76. package/dist/core/wiki/converters.d.ts +12 -0
  77. package/dist/core/wiki/converters.js +73 -0
  78. package/dist/core/wiki/converters.js.map +1 -0
  79. package/dist/core/wiki/database.d.ts +38 -0
  80. package/dist/core/wiki/database.js +173 -0
  81. package/dist/core/wiki/database.js.map +1 -0
  82. package/dist/core/wiki/index.d.ts +7 -0
  83. package/dist/core/wiki/index.js +5 -0
  84. package/dist/core/wiki/index.js.map +1 -0
  85. package/dist/core/wiki/storage.d.ts +35 -0
  86. package/dist/core/wiki/storage.js +196 -0
  87. package/dist/core/wiki/storage.js.map +1 -0
  88. package/dist/core/wiki/tools.d.ts +5 -0
  89. package/dist/core/wiki/tools.js +32 -0
  90. package/dist/core/wiki/tools.js.map +1 -0
  91. package/dist/index.d.ts +11 -18
  92. package/dist/index.js +8 -13
  93. package/dist/index.js.map +1 -1
  94. package/package.json +13 -8
  95. package/dist/acp/sessions/config-options.js.map +0 -1
  96. package/dist/core/memory/ltm/embed.d.ts +0 -16
  97. package/dist/core/memory/ltm/embed.js +0 -49
  98. package/dist/core/memory/ltm/embed.js.map +0 -1
  99. package/dist/core/memory/ltm/index.d.ts +0 -3
  100. package/dist/core/memory/ltm/index.js +0 -3
  101. package/dist/core/memory/ltm/index.js.map +0 -1
  102. package/dist/core/memory/ltm/store.d.ts +0 -20
  103. package/dist/core/memory/ltm/store.js +0 -271
  104. package/dist/core/memory/ltm/store.js.map +0 -1
  105. package/dist/core/memory/ltm/tools.d.ts +0 -21
  106. package/dist/core/memory/ltm/tools.js +0 -127
  107. package/dist/core/memory/ltm/tools.js.map +0 -1
  108. package/dist/core/memory/ltm/types.d.ts +0 -79
  109. package/dist/core/memory/ltm/utils.d.ts +0 -40
  110. package/dist/core/memory/ltm/utils.js +0 -145
  111. package/dist/core/memory/ltm/utils.js.map +0 -1
  112. package/dist/core/memory/stm/flat-file-storage.js.map +0 -1
  113. package/dist/core/memory/stm/index.js.map +0 -1
  114. package/dist/core/memory/stm/lazy-session-manager.js.map +0 -1
  115. package/dist/core/models/bifrost/bifrost-base-url.d.ts +0 -6
  116. package/dist/core/models/bifrost/bifrost-base-url.js +0 -27
  117. package/dist/core/models/bifrost/bifrost-base-url.js.map +0 -1
  118. package/dist/core/models/bifrost/index.d.ts +0 -11
  119. package/dist/core/models/bifrost/index.js +0 -29
  120. package/dist/core/models/bifrost/index.js.map +0 -1
  121. package/dist/core/models/bifrost/strands-bifrost.d.ts +0 -14
  122. package/dist/core/models/bifrost/strands-bifrost.js +0 -168
  123. package/dist/core/models/bifrost/strands-bifrost.js.map +0 -1
  124. package/dist/core/models/openai/index.js +0 -13
  125. package/dist/core/models/openai/index.js.map +0 -1
  126. package/dist/core/models/openai/kimi-reasoning-wire.d.ts +0 -40
  127. package/dist/core/models/openai/kimi-reasoning-wire.js +0 -109
  128. package/dist/core/models/openai/kimi-reasoning-wire.js.map +0 -1
  129. package/dist/core/models/openai/openai-stream-shims.d.ts +0 -13
  130. package/dist/core/models/openai/openai-stream-shims.js +0 -48
  131. package/dist/core/models/openai/openai-stream-shims.js.map +0 -1
  132. package/dist/core/models/tensorzero/index.d.ts +0 -12
  133. package/dist/core/models/tensorzero/index.js +0 -17
  134. package/dist/core/models/tensorzero/index.js.map +0 -1
  135. package/dist/core/models/tensorzero/openai-chat-request-shims.d.ts +0 -25
  136. package/dist/core/models/tensorzero/openai-chat-request-shims.js +0 -45
  137. package/dist/core/models/tensorzero/openai-chat-request-shims.js.map +0 -1
  138. package/dist/core/models/tensorzero/strands-tensorzero.d.ts +0 -14
  139. package/dist/core/models/tensorzero/strands-tensorzero.js +0 -140
  140. package/dist/core/models/tensorzero/strands-tensorzero.js.map +0 -1
  141. package/dist/core/prompts/static/ltm.md +0 -50
  142. package/dist/core/tools/wiki.d.ts +0 -11
  143. package/dist/core/tools/wiki.js +0 -560
  144. package/dist/core/tools/wiki.js.map +0 -1
  145. package/dist/lib/strands-usage-accumulate.js.map +0 -1
  146. /package/dist/core/{memory/stm → context}/flat-file-storage.d.ts +0 -0
  147. /package/dist/core/{memory/stm → context}/flat-file-storage.js +0 -0
  148. /package/dist/core/{memory/stm → context}/index.d.ts +0 -0
  149. /package/dist/core/{memory/stm → context}/lazy-session-manager.d.ts +0 -0
  150. /package/dist/core/memory/{ltm/types.js → types.js} +0 -0
  151. /package/dist/core/models/{openai/index.d.ts → openai.d.ts} +0 -0
  152. /package/dist/{lib → core/utils}/strands-usage-accumulate.d.ts +0 -0
  153. /package/dist/{lib → core/utils}/strands-usage-accumulate.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACrC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE;IAC9B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,eAAe,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strands-usage-accumulate.js","sourceRoot":"","sources":["../../../src/core/utils/strands-usage-accumulate.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAa,EAAE,MAAa;IAC1D,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC;IACzC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;IAC3C,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC;IACzC,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,CAAC,oBAAoB;YACzB,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,CAAC,qBAAqB;YAC1B,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type SupportedWikiMimeType = "application/pdf" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
2
+ export type ConvertFileOptions = {
3
+ filePath: string;
4
+ mimeType?: string;
5
+ };
6
+ export type ConvertedMarkdown = {
7
+ fileName: string;
8
+ originalPath: string;
9
+ mimeType: SupportedWikiMimeType;
10
+ markdown: string;
11
+ };
12
+ export declare function convertFileToMarkdown(options: ConvertFileOptions): Promise<ConvertedMarkdown>;
@@ -0,0 +1,73 @@
1
+ import path from "node:path";
2
+ import { convert } from "@opendataloader/pdf";
3
+ import mammoth from "mammoth";
4
+ const EXTENSION_MIME = {
5
+ ".pdf": "application/pdf",
6
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
7
+ };
8
+ function normalizeText(text) {
9
+ return text.replace(/\r\n/g, "\n").trim();
10
+ }
11
+ function detectMimeType(filePath, provided) {
12
+ if (provided &&
13
+ Object.values(EXTENSION_MIME).includes(provided)) {
14
+ return provided;
15
+ }
16
+ const ext = path.extname(filePath).toLowerCase();
17
+ const fallback = EXTENSION_MIME[ext];
18
+ if (fallback) {
19
+ return fallback;
20
+ }
21
+ throw new Error(`Unsupported file type: ${filePath}. Wiki indexing accepts only .pdf and .docx.`);
22
+ }
23
+ async function convertDocxToMarkdown(filePath, fileName) {
24
+ try {
25
+ const { value, messages } = await mammoth.convertToMarkdown({ path: filePath });
26
+ const errors = messages.filter((m) => m.type === "error");
27
+ if (errors.length > 0) {
28
+ throw new Error(errors.map((e) => e.message).join("; "));
29
+ }
30
+ return value;
31
+ }
32
+ catch (error) {
33
+ const msg = error instanceof Error ? error.message : String(error);
34
+ throw new Error(`DOCX conversion failed for ${fileName}: ${msg}`);
35
+ }
36
+ }
37
+ async function convertPdfToMarkdown(filePath, fileName) {
38
+ try {
39
+ const markdown = await convert(filePath, {
40
+ format: "markdown",
41
+ toStdout: true,
42
+ quiet: true,
43
+ });
44
+ return markdown;
45
+ }
46
+ catch (error) {
47
+ const msg = error instanceof Error ? error.message : String(error);
48
+ throw new Error(`PDF conversion failed for ${fileName}: ${msg}. ` +
49
+ "OpenDataLoader PDF needs Java 11+ on your PATH (`java -version`).");
50
+ }
51
+ }
52
+ export async function convertFileToMarkdown(options) {
53
+ const fileName = path.basename(options.filePath);
54
+ const mimeType = detectMimeType(options.filePath, options.mimeType);
55
+ let markdown;
56
+ if (mimeType === "application/pdf") {
57
+ markdown = await convertPdfToMarkdown(options.filePath, fileName);
58
+ }
59
+ else {
60
+ markdown = await convertDocxToMarkdown(options.filePath, fileName);
61
+ }
62
+ const finalMarkdown = normalizeText(markdown);
63
+ if (!finalMarkdown) {
64
+ throw new Error(`Converted markdown is empty for ${fileName}`);
65
+ }
66
+ return {
67
+ fileName,
68
+ originalPath: options.filePath,
69
+ mimeType,
70
+ markdown: `${finalMarkdown}\n`,
71
+ };
72
+ }
73
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/core/wiki/converters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import BetterSqlite from "better-sqlite3";
2
+ export type Sqlite = BetterSqlite.Database;
3
+ export type WikiDocRecord = {
4
+ doc_id: string;
5
+ file_name: string;
6
+ md_path: string;
7
+ original_path: string;
8
+ original_mime_type: string;
9
+ content_hash: string;
10
+ updated_at_ms: number;
11
+ };
12
+ export type WikiChunkRecord = {
13
+ chunk_id: string;
14
+ doc_id: string;
15
+ chunk_index: number;
16
+ content: string;
17
+ };
18
+ export type WikiSearchRow = WikiChunkRecord & Pick<WikiDocRecord, "file_name" | "md_path" | "original_path" | "original_mime_type">;
19
+ export declare class Database {
20
+ private readonly db;
21
+ constructor(file: string);
22
+ close(): void;
23
+ prepare(modelId: string, dimensions: number): void;
24
+ listDocs(page: number, pageSize: number): WikiDocRecord[];
25
+ getDocById(docId: string): WikiDocRecord | null;
26
+ getDocByOriginalPath(originalPath: string): WikiDocRecord | null;
27
+ removeDoc(docId: string): void;
28
+ addDocAndChunks(doc: WikiDocRecord, chunks: Array<{
29
+ chunk_id: string;
30
+ chunk_index: number;
31
+ content: string;
32
+ }>, embeddings: Float32Array[]): void;
33
+ vectorSearch(embedding: Float32Array, k: number): Array<{
34
+ chunk_id: string;
35
+ distance: number;
36
+ }>;
37
+ getSearchRowsByChunkIds(chunkIds: string[]): WikiSearchRow[];
38
+ }
@@ -0,0 +1,173 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import BetterSqlite from "better-sqlite3";
4
+ import * as vector from "sqlite-vec";
5
+ const META_DIMS = "embedding_dims";
6
+ const META_MODEL = "embedding_model_id";
7
+ function getStoreMeta(db, key) {
8
+ const row = db
9
+ .prepare(`SELECT value FROM wiki_store_meta WHERE key = ?`)
10
+ .get(key);
11
+ return row?.value ?? null;
12
+ }
13
+ function setStoreMeta(db, key, value) {
14
+ db.prepare(`INSERT INTO wiki_store_meta (key, value) VALUES (?, ?)
15
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value`).run(key, value);
16
+ }
17
+ function migrate(db) {
18
+ vector.load(db);
19
+ try {
20
+ const row = db.prepare(`SELECT vec_version() AS version`).get();
21
+ if (!row?.version || typeof row.version !== "string") {
22
+ throw new Error("vec_version() returned no version");
23
+ }
24
+ }
25
+ catch (err) {
26
+ const msg = err instanceof Error ? err.message : String(err);
27
+ throw new Error(`sqlite-vec extension is unavailable (probe failed: ${msg}). ` +
28
+ "Ensure sqlite-vec native bindings are installed for your platform.");
29
+ }
30
+ db.exec(`
31
+ CREATE TABLE IF NOT EXISTS wiki_store_meta (
32
+ key TEXT PRIMARY KEY,
33
+ value TEXT NOT NULL
34
+ );
35
+
36
+ CREATE TABLE IF NOT EXISTS wiki_docs (
37
+ doc_id TEXT PRIMARY KEY NOT NULL,
38
+ file_name TEXT NOT NULL,
39
+ md_path TEXT NOT NULL,
40
+ original_path TEXT NOT NULL,
41
+ original_mime_type TEXT NOT NULL,
42
+ content_hash TEXT NOT NULL,
43
+ updated_at_ms INTEGER NOT NULL
44
+ );
45
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_wiki_docs_md_path ON wiki_docs(md_path);
46
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_wiki_docs_original_path ON wiki_docs(original_path);
47
+
48
+ CREATE TABLE IF NOT EXISTS wiki_chunks (
49
+ chunk_id TEXT PRIMARY KEY NOT NULL,
50
+ doc_id TEXT NOT NULL,
51
+ chunk_index INTEGER NOT NULL,
52
+ content TEXT NOT NULL,
53
+ FOREIGN KEY(doc_id) REFERENCES wiki_docs(doc_id) ON DELETE CASCADE
54
+ );
55
+ CREATE INDEX IF NOT EXISTS idx_wiki_chunks_doc_id ON wiki_chunks(doc_id);
56
+ `);
57
+ }
58
+ export class Database {
59
+ db;
60
+ constructor(file) {
61
+ const dir = path.dirname(file);
62
+ if (!fs.existsSync(dir)) {
63
+ fs.mkdirSync(dir, { recursive: true });
64
+ }
65
+ this.db = new BetterSqlite(file);
66
+ this.db.pragma("journal_mode = WAL");
67
+ this.db.pragma("foreign_keys = ON");
68
+ migrate(this.db);
69
+ }
70
+ close() {
71
+ this.db.close();
72
+ }
73
+ prepare(modelId, dimensions) {
74
+ const existing = this.db
75
+ .prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='wiki_chunk_vec'`)
76
+ .get();
77
+ if (existing) {
78
+ const match = existing.sql.match(/float\[(\d+)\]/);
79
+ const hasId = existing.sql.includes("chunk_id");
80
+ const hasCosine = existing.sql.includes("distance_metric=cosine");
81
+ const existingDims = match?.[1] ? Number.parseInt(match[1], 10) : null;
82
+ if (existingDims === dimensions && hasId && hasCosine) {
83
+ return;
84
+ }
85
+ if (existingDims !== null && existingDims !== dimensions) {
86
+ throw new Error(`Wiki embedding dimension mismatch: index is ${existingDims}d but the model produces ${dimensions}d. ` +
87
+ "Use the previous model or delete the wiki database (data loss).");
88
+ }
89
+ this.db.exec("DROP TABLE IF EXISTS wiki_chunk_vec");
90
+ }
91
+ this.db.exec(`CREATE VIRTUAL TABLE wiki_chunk_vec USING vec0(chunk_id TEXT PRIMARY KEY, embedding float[${dimensions}] distance_metric=cosine)`);
92
+ const existingModel = getStoreMeta(this.db, META_MODEL);
93
+ if (existingModel != null && existingModel !== modelId) {
94
+ throw new Error(`Wiki index was built with model "${existingModel}" but config uses "${modelId}". ` +
95
+ "Align models or delete the wiki database (data loss).");
96
+ }
97
+ setStoreMeta(this.db, META_MODEL, modelId);
98
+ setStoreMeta(this.db, META_DIMS, String(dimensions));
99
+ }
100
+ listDocs(page, pageSize) {
101
+ const offset = Math.max(0, (Math.max(1, page) - 1) * Math.max(1, pageSize));
102
+ const limit = Math.max(1, pageSize);
103
+ return this.db
104
+ .prepare(`SELECT doc_id, file_name, md_path, original_path, original_mime_type, content_hash, updated_at_ms
105
+ FROM wiki_docs ORDER BY updated_at_ms DESC LIMIT ? OFFSET ?`)
106
+ .all(limit, offset);
107
+ }
108
+ getDocById(docId) {
109
+ const row = this.db
110
+ .prepare(`SELECT doc_id, file_name, md_path, original_path, original_mime_type, content_hash, updated_at_ms
111
+ FROM wiki_docs WHERE doc_id = ?`)
112
+ .get(docId);
113
+ return row ?? null;
114
+ }
115
+ getDocByOriginalPath(originalPath) {
116
+ const row = this.db
117
+ .prepare(`SELECT doc_id, file_name, md_path, original_path, original_mime_type, content_hash, updated_at_ms
118
+ FROM wiki_docs WHERE original_path = ?`)
119
+ .get(originalPath);
120
+ return row ?? null;
121
+ }
122
+ removeDoc(docId) {
123
+ const chunkRows = this.db
124
+ .prepare(`SELECT chunk_id FROM wiki_chunks WHERE doc_id = ?`)
125
+ .all(docId);
126
+ const delVec = this.db.prepare(`DELETE FROM wiki_chunk_vec WHERE chunk_id = ?`);
127
+ const delChunks = this.db.prepare(`DELETE FROM wiki_chunks WHERE doc_id = ?`);
128
+ const delDoc = this.db.prepare(`DELETE FROM wiki_docs WHERE doc_id = ?`);
129
+ this.db.transaction(() => {
130
+ for (const row of chunkRows) {
131
+ delVec.run(row.chunk_id);
132
+ }
133
+ delChunks.run(docId);
134
+ delDoc.run(docId);
135
+ })();
136
+ }
137
+ addDocAndChunks(doc, chunks, embeddings) {
138
+ if (chunks.length !== embeddings.length) {
139
+ throw new Error("Chunk/embedding count mismatch");
140
+ }
141
+ const insDoc = this.db.prepare(`INSERT INTO wiki_docs (doc_id, file_name, md_path, original_path, original_mime_type, content_hash, updated_at_ms)
142
+ VALUES (?, ?, ?, ?, ?, ?, ?)`);
143
+ const insChunk = this.db.prepare(`INSERT INTO wiki_chunks (chunk_id, doc_id, chunk_index, content) VALUES (?, ?, ?, ?)`);
144
+ const insVec = this.db.prepare(`INSERT INTO wiki_chunk_vec (chunk_id, embedding) VALUES (?, ?)`);
145
+ this.db.transaction(() => {
146
+ insDoc.run(doc.doc_id, doc.file_name, doc.md_path, doc.original_path, doc.original_mime_type, doc.content_hash, doc.updated_at_ms);
147
+ for (let i = 0; i < chunks.length; i += 1) {
148
+ const chunk = chunks[i];
149
+ insChunk.run(chunk.chunk_id, doc.doc_id, chunk.chunk_index, chunk.content);
150
+ insVec.run(chunk.chunk_id, embeddings[i]);
151
+ }
152
+ })();
153
+ }
154
+ vectorSearch(embedding, k) {
155
+ return this.db
156
+ .prepare(`SELECT chunk_id, distance FROM wiki_chunk_vec WHERE embedding MATCH ? AND k = ?`)
157
+ .all(embedding, k);
158
+ }
159
+ getSearchRowsByChunkIds(chunkIds) {
160
+ if (chunkIds.length === 0) {
161
+ return [];
162
+ }
163
+ const placeholders = chunkIds.map(() => "?").join(",");
164
+ return this.db
165
+ .prepare(`SELECT c.chunk_id, c.doc_id, c.chunk_index, c.content,
166
+ d.file_name, d.md_path, d.original_path, d.original_mime_type
167
+ FROM wiki_chunks c
168
+ JOIN wiki_docs d ON d.doc_id = c.doc_id
169
+ WHERE c.chunk_id IN (${placeholders})`)
170
+ .all(...chunkIds);
171
+ }
172
+ }
173
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/core/wiki/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { convertFileToMarkdown } from "./converters.js";
2
+ export type { ConvertedMarkdown, ConvertFileOptions, SupportedWikiMimeType, } from "./converters.js";
3
+ export { Database } from "./database.js";
4
+ export type { Sqlite, WikiChunkRecord, WikiDocRecord, WikiSearchRow, } from "./database.js";
5
+ export { Storage } from "./storage.js";
6
+ export type { WikiAddInput, WikiListResult, WikiSearchMatch, } from "./storage.js";
7
+ export { createWikiTools } from "./tools.js";
@@ -0,0 +1,5 @@
1
+ export { convertFileToMarkdown } from "./converters.js";
2
+ export { Database } from "./database.js";
3
+ export { Storage } from "./storage.js";
4
+ export { createWikiTools } from "./tools.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/wiki/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAMxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAMvC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type ConvertFileOptions } from "./converters.js";
2
+ import { type WikiDocRecord } from "./database.js";
3
+ export type WikiListResult = {
4
+ page: number;
5
+ pageSize: number;
6
+ items: WikiDocRecord[];
7
+ };
8
+ export type WikiSearchMatch = {
9
+ id: string;
10
+ file_name: string;
11
+ md_file_path: string;
12
+ original_file_path: string;
13
+ original_mime_type: string;
14
+ chunk_pos: number;
15
+ content: string;
16
+ distance: number | null;
17
+ score: number | null;
18
+ source: "vec";
19
+ };
20
+ export type WikiAddInput = Omit<ConvertFileOptions, "filePath"> & {
21
+ filePath: string;
22
+ };
23
+ export declare class Storage {
24
+ private readonly root;
25
+ private readonly db;
26
+ private readonly embedder;
27
+ private constructor();
28
+ static create(): Storage;
29
+ warmup(): Promise<void>;
30
+ list(page?: number, pageSize?: number): Promise<WikiListResult>;
31
+ add(input: WikiAddInput): Promise<WikiDocRecord>;
32
+ remove(id: string): Promise<boolean>;
33
+ search(q: string, k?: number): Promise<WikiSearchMatch[]>;
34
+ close(): Promise<void>;
35
+ }
@@ -0,0 +1,196 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { DEFAULT_EMBED_MODEL } from "../config.js";
5
+ import { embed, GgufEmbedder, rerank } from "../inference/index.js";
6
+ import { modelsCachePath, wikiDbPath, wikiPath } from "../utils/paths.js";
7
+ import { convertFileToMarkdown, } from "./converters.js";
8
+ import { Database, } from "./database.js";
9
+ const RAW_DIR = "raw";
10
+ const PAGES_DIR = "pages";
11
+ const MAX_CHUNK_CHARS = 2400;
12
+ const VEC_K_MULTIPLIER = 5;
13
+ function normalizeText(value) {
14
+ return value.replace(/\r\n/g, "\n");
15
+ }
16
+ function fileHash(content) {
17
+ return crypto.createHash("sha256").update(content, "utf8").digest("hex");
18
+ }
19
+ function chunkMarkdown(body) {
20
+ const trimmed = body.trim();
21
+ if (!trimmed) {
22
+ return [""];
23
+ }
24
+ const paragraphs = trimmed
25
+ .split(/\n\n+/)
26
+ .map((p) => p.trim())
27
+ .filter(Boolean);
28
+ const out = [];
29
+ let cur = "";
30
+ for (const p of paragraphs) {
31
+ if (cur.length + p.length + 2 <= MAX_CHUNK_CHARS) {
32
+ cur = cur ? `${cur}\n\n${p}` : p;
33
+ continue;
34
+ }
35
+ if (cur) {
36
+ out.push(cur);
37
+ }
38
+ if (p.length > MAX_CHUNK_CHARS) {
39
+ for (let i = 0; i < p.length; i += MAX_CHUNK_CHARS) {
40
+ out.push(p.slice(i, i + MAX_CHUNK_CHARS));
41
+ }
42
+ cur = "";
43
+ }
44
+ else {
45
+ cur = p;
46
+ }
47
+ }
48
+ if (cur) {
49
+ out.push(cur);
50
+ }
51
+ return out.length > 0 ? out : [""];
52
+ }
53
+ function safeFileStem(inputName) {
54
+ return inputName.replace(/[^\w.-]+/g, "_");
55
+ }
56
+ function buildChunkId(docId, index, hash) {
57
+ return crypto
58
+ .createHash("sha256")
59
+ .update(`${docId}\0${index}\0${hash}`, "utf8")
60
+ .digest("hex");
61
+ }
62
+ function toSearchMatch(row, distance) {
63
+ const dist = typeof distance === "number" && Number.isFinite(distance) ? distance : null;
64
+ return {
65
+ id: row.chunk_id,
66
+ file_name: row.file_name,
67
+ md_file_path: row.md_path,
68
+ original_file_path: row.original_path,
69
+ original_mime_type: row.original_mime_type,
70
+ chunk_pos: row.chunk_index,
71
+ content: row.content,
72
+ distance: dist,
73
+ score: dist == null ? null : Math.max(0, Math.min(1, 1 - dist)),
74
+ source: "vec",
75
+ };
76
+ }
77
+ export class Storage {
78
+ root;
79
+ db;
80
+ embedder;
81
+ constructor(root, db, embedder) {
82
+ this.root = root;
83
+ this.db = db;
84
+ this.embedder = embedder;
85
+ }
86
+ static create() {
87
+ const root = wikiPath();
88
+ const db = new Database(wikiDbPath());
89
+ const embedder = new GgufEmbedder({
90
+ modelUri: DEFAULT_EMBED_MODEL,
91
+ cacheDir: modelsCachePath(),
92
+ });
93
+ return new Storage(root, db, embedder);
94
+ }
95
+ async warmup() {
96
+ await this.embedder.warmup();
97
+ await fs.mkdir(path.join(this.root, RAW_DIR), { recursive: true });
98
+ await fs.mkdir(path.join(this.root, PAGES_DIR), { recursive: true });
99
+ }
100
+ async list(page = 1, pageSize = 20) {
101
+ const p = Number.isFinite(page) && page > 0 ? Math.floor(page) : 1;
102
+ const ps = Number.isFinite(pageSize) && pageSize > 0 ? Math.floor(pageSize) : 20;
103
+ return {
104
+ page: p,
105
+ pageSize: ps,
106
+ items: this.db.listDocs(p, ps),
107
+ };
108
+ }
109
+ async add(input) {
110
+ const converted = await convertFileToMarkdown({
111
+ ...input,
112
+ filePath: input.filePath,
113
+ });
114
+ const now = Date.now();
115
+ const docId = crypto.randomUUID();
116
+ const sourceExt = path.extname(converted.originalPath).toLowerCase();
117
+ const sourceName = safeFileStem(path.basename(converted.originalPath));
118
+ const mdStem = safeFileStem(path.basename(sourceName, sourceExt));
119
+ const rawAbs = path.resolve(this.root, RAW_DIR, `${docId}-${sourceName}`);
120
+ const mdAbs = path.resolve(this.root, PAGES_DIR, `${docId}-${mdStem}.md`);
121
+ await fs.copyFile(converted.originalPath, rawAbs);
122
+ const markdown = normalizeText(converted.markdown);
123
+ await fs.writeFile(mdAbs, markdown, "utf8");
124
+ const hash = fileHash(markdown);
125
+ const existing = this.db.getDocByOriginalPath(rawAbs);
126
+ if (existing) {
127
+ this.db.removeDoc(existing.doc_id);
128
+ }
129
+ const chunks = chunkMarkdown(markdown);
130
+ const embeddings = [];
131
+ const rows = [];
132
+ for (let i = 0; i < chunks.length; i += 1) {
133
+ const text = chunks[i];
134
+ const chunkId = buildChunkId(docId, i, hash);
135
+ const embedding = await this.embedder.embedDocument(text, converted.fileName);
136
+ this.db.prepare(this.embedder.resolvedModelUri, embedding.length);
137
+ embeddings.push(embedding);
138
+ rows.push({ chunk_id: chunkId, chunk_index: i, content: text });
139
+ }
140
+ const doc = {
141
+ doc_id: docId,
142
+ file_name: converted.fileName,
143
+ md_path: mdAbs,
144
+ original_path: rawAbs,
145
+ original_mime_type: converted.mimeType,
146
+ content_hash: hash,
147
+ updated_at_ms: now,
148
+ };
149
+ this.db.addDocAndChunks(doc, rows, embeddings);
150
+ return doc;
151
+ }
152
+ async remove(id) {
153
+ const doc = this.db.getDocById(id);
154
+ if (!doc) {
155
+ return false;
156
+ }
157
+ this.db.removeDoc(id);
158
+ await fs.rm(doc.md_path, { force: true }).catch(() => undefined);
159
+ await fs.rm(doc.original_path, { force: true }).catch(() => undefined);
160
+ return true;
161
+ }
162
+ async search(q, k = 5) {
163
+ const query = q.trim();
164
+ if (!query) {
165
+ return [];
166
+ }
167
+ await this.embedder.warmup();
168
+ const queryEmbedding = Float32Array.from(await embed(this.embedder, query, "query"));
169
+ this.db.prepare(this.embedder.resolvedModelUri, queryEmbedding.length);
170
+ const limit = Number.isFinite(k) && k > 0 ? Math.floor(k) : 5;
171
+ const vecHits = this.db.vectorSearch(queryEmbedding, Math.max(1, limit * VEC_K_MULTIPLIER));
172
+ if (vecHits.length === 0) {
173
+ return [];
174
+ }
175
+ const orderedIds = vecHits.map((h) => h.chunk_id);
176
+ const distanceById = new Map(vecHits.map((h) => [h.chunk_id, h.distance]));
177
+ const rows = this.db.getSearchRowsByChunkIds(orderedIds);
178
+ const rowById = new Map(rows.map((r) => [r.chunk_id, r]));
179
+ const ordered = orderedIds
180
+ .map((id) => {
181
+ const row = rowById.get(id);
182
+ if (!row) {
183
+ return null;
184
+ }
185
+ return toSearchMatch(row, distanceById.get(id));
186
+ })
187
+ .filter((x) => x != null);
188
+ const ranked = rerank(query, ordered);
189
+ return ranked.slice(0, limit);
190
+ }
191
+ async close() {
192
+ await this.embedder.dispose();
193
+ this.db.close();
194
+ }
195
+ }
196
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/core/wiki/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { JSONValue } from "@strands-agents/sdk";
2
+ export declare function createWikiTools(): Promise<import("@strands-agents/sdk").InvokableTool<{
3
+ query: string;
4
+ k?: number | undefined;
5
+ }, JSONValue>[]>;
@@ -0,0 +1,32 @@
1
+ import { tool } from "@strands-agents/sdk";
2
+ import { z } from "zod";
3
+ import { Storage } from "./storage.js";
4
+ const DEFAULT_SEARCH_LIMIT = 5;
5
+ const MAX_SEARCH_LIMIT = 20;
6
+ function toJsonValue(value) {
7
+ return JSON.parse(JSON.stringify(value));
8
+ }
9
+ export async function createWikiTools() {
10
+ const storage = Storage.create();
11
+ await storage.warmup();
12
+ return [
13
+ tool({
14
+ name: "wiki_search",
15
+ description: "Search the available knowledge base when you lack specifics about the user's question. Runs semantic search over indexed material; returns snippets plus paths so you can read_file for full context when needed.",
16
+ inputSchema: z.object({
17
+ query: z.string().min(1),
18
+ k: z.number().int().min(1).max(MAX_SEARCH_LIMIT).optional(),
19
+ }),
20
+ callback: async (input) => {
21
+ const k = input.k ?? DEFAULT_SEARCH_LIMIT;
22
+ const matches = await storage.search(input.query, k);
23
+ return toJsonValue({
24
+ query: input.query,
25
+ count: matches.length,
26
+ matches,
27
+ });
28
+ },
29
+ }),
30
+ ];
31
+ }
32
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/wiki/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAc,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IAEvB,OAAO;QACL,IAAI,CAAC;YACH,IAAI,EAAE,aAAa;YACnB,WAAW,EACT,mNAAmN;YACrN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;aAC5D,CAAC;YACF,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC;gBAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO,WAAW,CAAC;oBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC;KACH,CAAC;AACJ,CAAC"}