@tachu/extensions 1.0.0-alpha.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.
Files changed (210) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/LICENSE +201 -0
  3. package/README.md +1104 -0
  4. package/README_ZH.md +1082 -0
  5. package/dist/backends/file.d.ts +18 -0
  6. package/dist/backends/file.d.ts.map +1 -0
  7. package/dist/backends/file.js +85 -0
  8. package/dist/backends/file.js.map +1 -0
  9. package/dist/backends/index.d.ts +4 -0
  10. package/dist/backends/index.d.ts.map +1 -0
  11. package/dist/backends/index.js +4 -0
  12. package/dist/backends/index.js.map +1 -0
  13. package/dist/backends/terminal.d.ts +18 -0
  14. package/dist/backends/terminal.d.ts.map +1 -0
  15. package/dist/backends/terminal.js +81 -0
  16. package/dist/backends/terminal.js.map +1 -0
  17. package/dist/backends/web.d.ts +18 -0
  18. package/dist/backends/web.d.ts.map +1 -0
  19. package/dist/backends/web.js +55 -0
  20. package/dist/backends/web.js.map +1 -0
  21. package/dist/common/net.d.ts +39 -0
  22. package/dist/common/net.d.ts.map +1 -0
  23. package/dist/common/net.js +177 -0
  24. package/dist/common/net.js.map +1 -0
  25. package/dist/common/path.d.ts +51 -0
  26. package/dist/common/path.d.ts.map +1 -0
  27. package/dist/common/path.js +76 -0
  28. package/dist/common/path.js.map +1 -0
  29. package/dist/common/process.d.ts +19 -0
  30. package/dist/common/process.d.ts.map +1 -0
  31. package/dist/common/process.js +67 -0
  32. package/dist/common/process.js.map +1 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +13 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/mcp/index.d.ts +3 -0
  38. package/dist/mcp/index.d.ts.map +1 -0
  39. package/dist/mcp/index.js +3 -0
  40. package/dist/mcp/index.js.map +1 -0
  41. package/dist/mcp/sse-adapter.d.ts +82 -0
  42. package/dist/mcp/sse-adapter.d.ts.map +1 -0
  43. package/dist/mcp/sse-adapter.js +201 -0
  44. package/dist/mcp/sse-adapter.js.map +1 -0
  45. package/dist/mcp/stdio-adapter.d.ts +85 -0
  46. package/dist/mcp/stdio-adapter.d.ts.map +1 -0
  47. package/dist/mcp/stdio-adapter.js +203 -0
  48. package/dist/mcp/stdio-adapter.js.map +1 -0
  49. package/dist/memory/fs-memory-system.d.ts +147 -0
  50. package/dist/memory/fs-memory-system.d.ts.map +1 -0
  51. package/dist/memory/fs-memory-system.js +266 -0
  52. package/dist/memory/fs-memory-system.js.map +1 -0
  53. package/dist/memory/index.d.ts +2 -0
  54. package/dist/memory/index.d.ts.map +1 -0
  55. package/dist/memory/index.js +2 -0
  56. package/dist/memory/index.js.map +1 -0
  57. package/dist/observability/index.d.ts +3 -0
  58. package/dist/observability/index.d.ts.map +1 -0
  59. package/dist/observability/index.js +3 -0
  60. package/dist/observability/index.js.map +1 -0
  61. package/dist/observability/jsonl-emitter.d.ts +58 -0
  62. package/dist/observability/jsonl-emitter.d.ts.map +1 -0
  63. package/dist/observability/jsonl-emitter.js +96 -0
  64. package/dist/observability/jsonl-emitter.js.map +1 -0
  65. package/dist/observability/otel-emitter.d.ts +52 -0
  66. package/dist/observability/otel-emitter.d.ts.map +1 -0
  67. package/dist/observability/otel-emitter.js +143 -0
  68. package/dist/observability/otel-emitter.js.map +1 -0
  69. package/dist/providers/anthropic.d.ts +73 -0
  70. package/dist/providers/anthropic.d.ts.map +1 -0
  71. package/dist/providers/anthropic.js +521 -0
  72. package/dist/providers/anthropic.js.map +1 -0
  73. package/dist/providers/index.d.ts +5 -0
  74. package/dist/providers/index.d.ts.map +1 -0
  75. package/dist/providers/index.js +5 -0
  76. package/dist/providers/index.js.map +1 -0
  77. package/dist/providers/mock.d.ts +81 -0
  78. package/dist/providers/mock.d.ts.map +1 -0
  79. package/dist/providers/mock.js +160 -0
  80. package/dist/providers/mock.js.map +1 -0
  81. package/dist/providers/openai.d.ts +95 -0
  82. package/dist/providers/openai.d.ts.map +1 -0
  83. package/dist/providers/openai.js +529 -0
  84. package/dist/providers/openai.js.map +1 -0
  85. package/dist/providers/qwen.d.ts +145 -0
  86. package/dist/providers/qwen.d.ts.map +1 -0
  87. package/dist/providers/qwen.js +669 -0
  88. package/dist/providers/qwen.js.map +1 -0
  89. package/dist/rules/index.d.ts +9 -0
  90. package/dist/rules/index.d.ts.map +1 -0
  91. package/dist/rules/index.js +15 -0
  92. package/dist/rules/index.js.map +1 -0
  93. package/dist/rules/no-hallucination.md +11 -0
  94. package/dist/rules/no-sensitive-output.md +11 -0
  95. package/dist/rules/prefer-concise-response.md +11 -0
  96. package/dist/rules/require-tool-verification.md +11 -0
  97. package/dist/safety/default-gate.d.ts +112 -0
  98. package/dist/safety/default-gate.d.ts.map +1 -0
  99. package/dist/safety/default-gate.js +188 -0
  100. package/dist/safety/default-gate.js.map +1 -0
  101. package/dist/safety/index.d.ts +2 -0
  102. package/dist/safety/index.d.ts.map +1 -0
  103. package/dist/safety/index.js +2 -0
  104. package/dist/safety/index.js.map +1 -0
  105. package/dist/tools/_shared/web-client.d.ts +18 -0
  106. package/dist/tools/_shared/web-client.d.ts.map +1 -0
  107. package/dist/tools/_shared/web-client.js +46 -0
  108. package/dist/tools/_shared/web-client.js.map +1 -0
  109. package/dist/tools/apply-patch/descriptor.md +27 -0
  110. package/dist/tools/apply-patch/executor.d.ts +19 -0
  111. package/dist/tools/apply-patch/executor.d.ts.map +1 -0
  112. package/dist/tools/apply-patch/executor.js +193 -0
  113. package/dist/tools/apply-patch/executor.js.map +1 -0
  114. package/dist/tools/fetch-url/descriptor.md +44 -0
  115. package/dist/tools/fetch-url/executor.d.ts +28 -0
  116. package/dist/tools/fetch-url/executor.d.ts.map +1 -0
  117. package/dist/tools/fetch-url/executor.js +115 -0
  118. package/dist/tools/fetch-url/executor.js.map +1 -0
  119. package/dist/tools/index.d.ts +12 -0
  120. package/dist/tools/index.d.ts.map +1 -0
  121. package/dist/tools/index.js +286 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/list-dir/descriptor.md +29 -0
  124. package/dist/tools/list-dir/executor.d.ts +22 -0
  125. package/dist/tools/list-dir/executor.d.ts.map +1 -0
  126. package/dist/tools/list-dir/executor.js +48 -0
  127. package/dist/tools/list-dir/executor.js.map +1 -0
  128. package/dist/tools/read-file/descriptor.md +28 -0
  129. package/dist/tools/read-file/executor.d.ts +15 -0
  130. package/dist/tools/read-file/executor.d.ts.map +1 -0
  131. package/dist/tools/read-file/executor.js +22 -0
  132. package/dist/tools/read-file/executor.js.map +1 -0
  133. package/dist/tools/run-shell/descriptor.md +39 -0
  134. package/dist/tools/run-shell/executor.d.ts +20 -0
  135. package/dist/tools/run-shell/executor.d.ts.map +1 -0
  136. package/dist/tools/run-shell/executor.js +76 -0
  137. package/dist/tools/run-shell/executor.js.map +1 -0
  138. package/dist/tools/search-code/descriptor.md +31 -0
  139. package/dist/tools/search-code/executor.d.ts +23 -0
  140. package/dist/tools/search-code/executor.d.ts.map +1 -0
  141. package/dist/tools/search-code/executor.js +122 -0
  142. package/dist/tools/search-code/executor.js.map +1 -0
  143. package/dist/tools/shared.d.ts +47 -0
  144. package/dist/tools/shared.d.ts.map +1 -0
  145. package/dist/tools/shared.js +27 -0
  146. package/dist/tools/shared.js.map +1 -0
  147. package/dist/tools/web-fetch/descriptor.md +198 -0
  148. package/dist/tools/web-fetch/errors.d.ts +32 -0
  149. package/dist/tools/web-fetch/errors.d.ts.map +1 -0
  150. package/dist/tools/web-fetch/errors.js +91 -0
  151. package/dist/tools/web-fetch/errors.js.map +1 -0
  152. package/dist/tools/web-fetch/executor.d.ts +10 -0
  153. package/dist/tools/web-fetch/executor.d.ts.map +1 -0
  154. package/dist/tools/web-fetch/executor.js +191 -0
  155. package/dist/tools/web-fetch/executor.js.map +1 -0
  156. package/dist/tools/web-fetch/index.d.ts +4 -0
  157. package/dist/tools/web-fetch/index.d.ts.map +1 -0
  158. package/dist/tools/web-fetch/index.js +3 -0
  159. package/dist/tools/web-fetch/index.js.map +1 -0
  160. package/dist/tools/web-fetch/types.d.ts +157 -0
  161. package/dist/tools/web-fetch/types.d.ts.map +1 -0
  162. package/dist/tools/web-fetch/types.js +7 -0
  163. package/dist/tools/web-fetch/types.js.map +1 -0
  164. package/dist/tools/web-search/descriptor.md +89 -0
  165. package/dist/tools/web-search/errors.d.ts +33 -0
  166. package/dist/tools/web-search/errors.d.ts.map +1 -0
  167. package/dist/tools/web-search/errors.js +45 -0
  168. package/dist/tools/web-search/errors.js.map +1 -0
  169. package/dist/tools/web-search/executor.d.ts +10 -0
  170. package/dist/tools/web-search/executor.d.ts.map +1 -0
  171. package/dist/tools/web-search/executor.js +185 -0
  172. package/dist/tools/web-search/executor.js.map +1 -0
  173. package/dist/tools/web-search/index.d.ts +4 -0
  174. package/dist/tools/web-search/index.d.ts.map +1 -0
  175. package/dist/tools/web-search/index.js +3 -0
  176. package/dist/tools/web-search/index.js.map +1 -0
  177. package/dist/tools/web-search/types.d.ts +86 -0
  178. package/dist/tools/web-search/types.d.ts.map +1 -0
  179. package/dist/tools/web-search/types.js +7 -0
  180. package/dist/tools/web-search/types.js.map +1 -0
  181. package/dist/tools/write-file/descriptor.md +30 -0
  182. package/dist/tools/write-file/executor.d.ts +16 -0
  183. package/dist/tools/write-file/executor.d.ts.map +1 -0
  184. package/dist/tools/write-file/executor.js +18 -0
  185. package/dist/tools/write-file/executor.js.map +1 -0
  186. package/dist/transformers/document-to-text.d.ts +23 -0
  187. package/dist/transformers/document-to-text.d.ts.map +1 -0
  188. package/dist/transformers/document-to-text.js +69 -0
  189. package/dist/transformers/document-to-text.js.map +1 -0
  190. package/dist/transformers/image-to-text.d.ts +38 -0
  191. package/dist/transformers/image-to-text.d.ts.map +1 -0
  192. package/dist/transformers/image-to-text.js +82 -0
  193. package/dist/transformers/image-to-text.js.map +1 -0
  194. package/dist/transformers/index.d.ts +3 -0
  195. package/dist/transformers/index.d.ts.map +1 -0
  196. package/dist/transformers/index.js +3 -0
  197. package/dist/transformers/index.js.map +1 -0
  198. package/dist/vector/index.d.ts +3 -0
  199. package/dist/vector/index.d.ts.map +1 -0
  200. package/dist/vector/index.js +3 -0
  201. package/dist/vector/index.js.map +1 -0
  202. package/dist/vector/local-fs.d.ts +76 -0
  203. package/dist/vector/local-fs.d.ts.map +1 -0
  204. package/dist/vector/local-fs.js +153 -0
  205. package/dist/vector/local-fs.js.map +1 -0
  206. package/dist/vector/qdrant.d.ts +85 -0
  207. package/dist/vector/qdrant.d.ts.map +1 -0
  208. package/dist/vector/qdrant.js +208 -0
  209. package/dist/vector/qdrant.js.map +1 -0
  210. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { LocalFsVectorStore } from "./local-fs";
2
+ export { QdrantVectorStore } from "./qdrant";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { type VectorSearchResult, type VectorStore } from "@tachu/core";
2
+ interface LocalFsVectorStoreOptions {
3
+ filePath?: string;
4
+ persistDebounceMs?: number;
5
+ indexLimit?: number;
6
+ }
7
+ /**
8
+ * 本地文件持久化 VectorStore(基于 InMemoryVectorStore)。
9
+ */
10
+ export declare class LocalFsVectorStore implements VectorStore {
11
+ private readonly filePath;
12
+ private readonly lockPath;
13
+ private readonly persistDebounceMs;
14
+ private readonly store;
15
+ private readonly entries;
16
+ private readonly initPromise;
17
+ private persistTimer;
18
+ private persisting;
19
+ /**
20
+ * 创建本地向量存储。
21
+ *
22
+ * @param options 配置项
23
+ */
24
+ constructor(options?: LocalFsVectorStoreOptions);
25
+ /**
26
+ * 文本向量化。
27
+ *
28
+ * @param texts 文本列表
29
+ * @returns 向量列表
30
+ */
31
+ embed(texts: string[]): Promise<number[][]>;
32
+ /**
33
+ * 写入或更新向量条目。
34
+ *
35
+ * @param id 条目 ID
36
+ * @param vectorOrText 向量或文本
37
+ * @param metadata 元数据
38
+ */
39
+ upsert(id: string, vectorOrText: number[] | string, metadata: Record<string, unknown>): Promise<void>;
40
+ /**
41
+ * 相似度检索。
42
+ *
43
+ * @param query 查询向量或文本
44
+ * @param topK 返回数量
45
+ * @returns 检索结果
46
+ */
47
+ search(query: number[] | string, topK: number): Promise<VectorSearchResult[]>;
48
+ /**
49
+ * 删除条目。
50
+ *
51
+ * @param id 条目 ID
52
+ */
53
+ delete(id: string): Promise<void>;
54
+ /**
55
+ * 清空向量库。
56
+ */
57
+ clear(): Promise<void>;
58
+ /**
59
+ * 返回当前条目数。
60
+ *
61
+ * @returns 条目数量
62
+ */
63
+ size(): number;
64
+ /**
65
+ * 手动导出快照文件。
66
+ *
67
+ * @param path 快照路径
68
+ */
69
+ snapshot(path: string): Promise<void>;
70
+ private schedulePersist;
71
+ private loadFromDisk;
72
+ private acquireLock;
73
+ private persistToDisk;
74
+ }
75
+ export {};
76
+ //# sourceMappingURL=local-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-fs.d.ts","sourceRoot":"","sources":["../../src/vector/local-fs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7F,UAAU,yBAAyB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAYD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,UAAU,CAAqB;IAEvC;;;;OAIG;gBACS,OAAO,GAAE,yBAA8B;IAUnD;;;;;OAKG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAKjD;;;;;;OAMG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKnF;;;;OAIG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;;;OAIG;IACH,IAAI,IAAI,MAAM;IAId;;;;OAIG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,OAAO,CAAC,eAAe;YAST,YAAY;YAYZ,WAAW;YAgBX,aAAa;CAY5B"}
@@ -0,0 +1,153 @@
1
+ import { mkdir, open, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { InMemoryVectorStore } from "@tachu/core";
4
+ /**
5
+ * 本地文件持久化 VectorStore(基于 InMemoryVectorStore)。
6
+ */
7
+ export class LocalFsVectorStore {
8
+ filePath;
9
+ lockPath;
10
+ persistDebounceMs;
11
+ store;
12
+ entries = new Map();
13
+ initPromise;
14
+ persistTimer;
15
+ persisting = Promise.resolve();
16
+ /**
17
+ * 创建本地向量存储。
18
+ *
19
+ * @param options 配置项
20
+ */
21
+ constructor(options = {}) {
22
+ this.filePath = options.filePath ?? ".tachu/vectors.json";
23
+ this.lockPath = `${this.filePath}.lock`;
24
+ this.persistDebounceMs = options.persistDebounceMs ?? 500;
25
+ this.store = new InMemoryVectorStore({
26
+ ...(options.indexLimit !== undefined ? { indexLimit: options.indexLimit } : {}),
27
+ });
28
+ this.initPromise = this.loadFromDisk();
29
+ }
30
+ /**
31
+ * 文本向量化。
32
+ *
33
+ * @param texts 文本列表
34
+ * @returns 向量列表
35
+ */
36
+ async embed(texts) {
37
+ await this.initPromise;
38
+ return this.store.embed(texts);
39
+ }
40
+ /**
41
+ * 写入或更新向量条目。
42
+ *
43
+ * @param id 条目 ID
44
+ * @param vectorOrText 向量或文本
45
+ * @param metadata 元数据
46
+ */
47
+ async upsert(id, vectorOrText, metadata) {
48
+ await this.initPromise;
49
+ const vector = typeof vectorOrText === "string" ? (await this.store.embed([vectorOrText]))[0] ?? [] : vectorOrText;
50
+ await this.store.upsert(id, vector, metadata);
51
+ this.entries.set(id, { id, vector, metadata });
52
+ this.schedulePersist();
53
+ }
54
+ /**
55
+ * 相似度检索。
56
+ *
57
+ * @param query 查询向量或文本
58
+ * @param topK 返回数量
59
+ * @returns 检索结果
60
+ */
61
+ async search(query, topK) {
62
+ await this.initPromise;
63
+ return this.store.search(query, topK);
64
+ }
65
+ /**
66
+ * 删除条目。
67
+ *
68
+ * @param id 条目 ID
69
+ */
70
+ async delete(id) {
71
+ await this.initPromise;
72
+ await this.store.delete(id);
73
+ this.entries.delete(id);
74
+ this.schedulePersist();
75
+ }
76
+ /**
77
+ * 清空向量库。
78
+ */
79
+ async clear() {
80
+ await this.initPromise;
81
+ await this.store.clear();
82
+ this.entries.clear();
83
+ this.schedulePersist();
84
+ }
85
+ /**
86
+ * 返回当前条目数。
87
+ *
88
+ * @returns 条目数量
89
+ */
90
+ size() {
91
+ return this.entries.size;
92
+ }
93
+ /**
94
+ * 手动导出快照文件。
95
+ *
96
+ * @param path 快照路径
97
+ */
98
+ async snapshot(path) {
99
+ await this.initPromise;
100
+ const payload = { entries: [...this.entries.values()] };
101
+ await mkdir(dirname(path), { recursive: true });
102
+ await writeFile(path, JSON.stringify(payload, null, 2), "utf8");
103
+ }
104
+ schedulePersist() {
105
+ if (this.persistTimer) {
106
+ clearTimeout(this.persistTimer);
107
+ }
108
+ this.persistTimer = setTimeout(() => {
109
+ this.persisting = this.persisting.then(() => this.persistToDisk());
110
+ }, this.persistDebounceMs);
111
+ }
112
+ async loadFromDisk() {
113
+ const raw = await readFile(this.filePath, "utf8").catch(() => "");
114
+ if (!raw) {
115
+ return;
116
+ }
117
+ const payload = JSON.parse(raw);
118
+ for (const entry of payload.entries ?? []) {
119
+ await this.store.upsert(entry.id, entry.vector, entry.metadata);
120
+ this.entries.set(entry.id, entry);
121
+ }
122
+ }
123
+ async acquireLock() {
124
+ for (let attempt = 0; attempt < 30; attempt += 1) {
125
+ try {
126
+ await mkdir(dirname(this.lockPath), { recursive: true });
127
+ const handle = await open(this.lockPath, "wx");
128
+ return async () => {
129
+ await handle.close().catch(() => undefined);
130
+ await rm(this.lockPath, { force: true }).catch(() => undefined);
131
+ };
132
+ }
133
+ catch {
134
+ await new Promise((resolve) => setTimeout(resolve, 50 * (attempt + 1)));
135
+ }
136
+ }
137
+ throw new Error(`无法获取文件锁: ${this.lockPath}`);
138
+ }
139
+ async persistToDisk() {
140
+ const release = await this.acquireLock();
141
+ try {
142
+ await mkdir(dirname(this.filePath), { recursive: true });
143
+ const tempPath = `${this.filePath}.tmp`;
144
+ const payload = { entries: [...this.entries.values()] };
145
+ await writeFile(tempPath, JSON.stringify(payload), "utf8");
146
+ await rename(tempPath, this.filePath);
147
+ }
148
+ finally {
149
+ await release();
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=local-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-fs.js","sourceRoot":"","sources":["../../src/vector/local-fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { type VectorSearchResult, type VectorStore } from "@tachu/core";
2
+ interface QdrantVectorStoreOptions {
3
+ url: string;
4
+ apiKey?: string;
5
+ collectionName: string;
6
+ vectorSize?: number;
7
+ }
8
+ /**
9
+ * Qdrant 远程向量存储适配器。
10
+ */
11
+ export declare class QdrantVectorStore implements VectorStore {
12
+ private readonly client;
13
+ private readonly collectionName;
14
+ private readonly vectorSize;
15
+ private ensured;
16
+ private entryCount;
17
+ /**
18
+ * 创建 Qdrant 向量存储。
19
+ *
20
+ * @param options Qdrant 连接配置
21
+ */
22
+ constructor(options: QdrantVectorStoreOptions);
23
+ /**
24
+ * 文本向量化(**开发/占位实现**,基于哈希词袋)。
25
+ *
26
+ * ⚠️ **生产部署请务必注入真实 embedder**:
27
+ *
28
+ * - 本方法采用简易哈希词袋(Hashing Trick)把文本投影到 `vectorSize` 维空间,
29
+ * 仅用于早期集成与开发环境跑通流程,**无法**刻画词序、语义相似度、跨语言对齐;
30
+ * - 在真实的召回与排序场景(跨 session 记忆、多文档检索、向量知识库)下会产生
31
+ * 大量误召和漏召。
32
+ *
33
+ * **推荐做法**(v1.0 起):
34
+ *
35
+ * 1. 由 Provider 层(OpenAI `text-embedding-3-*` / Anthropic 尚未官方支持,可
36
+ * 桥接第三方)生成向量;
37
+ * 2. 宿主侧在 `MemorySystem` 调用前统一用真实 embedder 计算向量,再调
38
+ * `upsert(id, vector, metadata)` 这条显式向量分支;
39
+ * 3. 或者继承 `QdrantVectorStore` 并覆盖 `embed`,直接接入业务自选 embedding 服务。
40
+ *
41
+ * 参见 `D1-LOW-06`:该占位实现的 QPS 基准与精度限制已记录在 benchmarks 目录。
42
+ *
43
+ * @param texts 文本数组
44
+ * @returns 向量数组(单位向量,维度为 `vectorSize`)
45
+ */
46
+ embed(texts: string[]): Promise<number[][]>;
47
+ /**
48
+ * 写入或更新向量。
49
+ *
50
+ * @param id 条目 ID
51
+ * @param vectorOrText 向量或文本
52
+ * @param metadata 元数据
53
+ */
54
+ upsert(id: string, vectorOrText: number[] | string, metadata: Record<string, unknown>): Promise<void>;
55
+ /**
56
+ * 相似度搜索。
57
+ *
58
+ * @param query 查询向量或文本
59
+ * @param topK 结果数量
60
+ * @returns 搜索结果
61
+ */
62
+ search(query: number[] | string, topK: number): Promise<VectorSearchResult[]>;
63
+ /**
64
+ * 删除条目。
65
+ *
66
+ * @param id 条目 ID
67
+ */
68
+ delete(id: string): Promise<void>;
69
+ /**
70
+ * 清空集合。
71
+ */
72
+ clear(): Promise<void>;
73
+ /**
74
+ * 返回集合内条目数量。
75
+ *
76
+ * 远程实现对 `client.count(...)` 发起一次真值查询(`exact: true`),避免本地缓存
77
+ * 漂移导致读到旧值(D1-LOW-07)。collection 不存在等异常会被包装成 `ProviderError`。
78
+ *
79
+ * @returns 条目数(远程真值)
80
+ */
81
+ size(): Promise<number>;
82
+ private ensureCollection;
83
+ }
84
+ export {};
85
+ //# sourceMappingURL=qdrant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/vector/qdrant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAGvF,UAAU,wBAAwB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgCD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAK;IAEvB;;;;OAIG;gBACS,OAAO,EAAE,wBAAwB;IAS7C;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAIjD;;;;;;OAMG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAkBhB;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAsBnF;;;;OAIG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;;;;;;OAOG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;YAgBf,gBAAgB;CAe/B"}
@@ -0,0 +1,208 @@
1
+ import { ProviderError } from "@tachu/core";
2
+ import { QdrantClient } from "@qdrant/js-client-rest";
3
+ const DEFAULT_VECTOR_SIZE = 256;
4
+ const hashToken = (token, size) => {
5
+ let hash = 0;
6
+ for (let index = 0; index < token.length; index += 1) {
7
+ hash = (hash * 31 + token.charCodeAt(index)) >>> 0;
8
+ }
9
+ return hash % size;
10
+ };
11
+ const embedText = (text, size) => {
12
+ const vector = new Array(size).fill(0);
13
+ const tokens = text
14
+ .toLowerCase()
15
+ .split(/[^a-z0-9\u4e00-\u9fa5]+/u)
16
+ .filter((token) => token.length > 0);
17
+ if (tokens.length === 0) {
18
+ return vector;
19
+ }
20
+ for (const token of tokens) {
21
+ const idx = hashToken(token, size);
22
+ vector[idx] += 1;
23
+ }
24
+ const norm = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0));
25
+ if (norm === 0) {
26
+ return vector;
27
+ }
28
+ return vector.map((value) => value / norm);
29
+ };
30
+ /**
31
+ * Qdrant 远程向量存储适配器。
32
+ */
33
+ export class QdrantVectorStore {
34
+ client;
35
+ collectionName;
36
+ vectorSize;
37
+ ensured = false;
38
+ entryCount = 0;
39
+ /**
40
+ * 创建 Qdrant 向量存储。
41
+ *
42
+ * @param options Qdrant 连接配置
43
+ */
44
+ constructor(options) {
45
+ this.client = new QdrantClient({
46
+ url: options.url,
47
+ ...(options.apiKey ? { apiKey: options.apiKey } : {}),
48
+ });
49
+ this.collectionName = options.collectionName;
50
+ this.vectorSize = options.vectorSize ?? DEFAULT_VECTOR_SIZE;
51
+ }
52
+ /**
53
+ * 文本向量化(**开发/占位实现**,基于哈希词袋)。
54
+ *
55
+ * ⚠️ **生产部署请务必注入真实 embedder**:
56
+ *
57
+ * - 本方法采用简易哈希词袋(Hashing Trick)把文本投影到 `vectorSize` 维空间,
58
+ * 仅用于早期集成与开发环境跑通流程,**无法**刻画词序、语义相似度、跨语言对齐;
59
+ * - 在真实的召回与排序场景(跨 session 记忆、多文档检索、向量知识库)下会产生
60
+ * 大量误召和漏召。
61
+ *
62
+ * **推荐做法**(v1.0 起):
63
+ *
64
+ * 1. 由 Provider 层(OpenAI `text-embedding-3-*` / Anthropic 尚未官方支持,可
65
+ * 桥接第三方)生成向量;
66
+ * 2. 宿主侧在 `MemorySystem` 调用前统一用真实 embedder 计算向量,再调
67
+ * `upsert(id, vector, metadata)` 这条显式向量分支;
68
+ * 3. 或者继承 `QdrantVectorStore` 并覆盖 `embed`,直接接入业务自选 embedding 服务。
69
+ *
70
+ * 参见 `D1-LOW-06`:该占位实现的 QPS 基准与精度限制已记录在 benchmarks 目录。
71
+ *
72
+ * @param texts 文本数组
73
+ * @returns 向量数组(单位向量,维度为 `vectorSize`)
74
+ */
75
+ async embed(texts) {
76
+ return texts.map((text) => embedText(text, this.vectorSize));
77
+ }
78
+ /**
79
+ * 写入或更新向量。
80
+ *
81
+ * @param id 条目 ID
82
+ * @param vectorOrText 向量或文本
83
+ * @param metadata 元数据
84
+ */
85
+ async upsert(id, vectorOrText, metadata) {
86
+ try {
87
+ await this.ensureCollection();
88
+ const vector = typeof vectorOrText === "string" ? embedText(vectorOrText, this.vectorSize) : vectorOrText;
89
+ await this.client.upsert(this.collectionName, {
90
+ wait: true,
91
+ points: [{ id, vector, payload: metadata }],
92
+ });
93
+ this.entryCount += 1;
94
+ }
95
+ catch (error) {
96
+ throw new ProviderError("PROVIDER_UPSTREAM_ERROR", "Qdrant upsert 失败", {
97
+ cause: error,
98
+ retryable: true,
99
+ });
100
+ }
101
+ }
102
+ /**
103
+ * 相似度搜索。
104
+ *
105
+ * @param query 查询向量或文本
106
+ * @param topK 结果数量
107
+ * @returns 搜索结果
108
+ */
109
+ async search(query, topK) {
110
+ try {
111
+ await this.ensureCollection();
112
+ const vector = typeof query === "string" ? embedText(query, this.vectorSize) : query;
113
+ const result = await this.client.search(this.collectionName, {
114
+ vector,
115
+ limit: topK,
116
+ with_payload: true,
117
+ });
118
+ return result.map((item) => ({
119
+ id: String(item.id),
120
+ score: item.score,
121
+ metadata: (item.payload ?? {}),
122
+ }));
123
+ }
124
+ catch (error) {
125
+ throw new ProviderError("PROVIDER_UPSTREAM_ERROR", "Qdrant search 失败", {
126
+ cause: error,
127
+ retryable: true,
128
+ });
129
+ }
130
+ }
131
+ /**
132
+ * 删除条目。
133
+ *
134
+ * @param id 条目 ID
135
+ */
136
+ async delete(id) {
137
+ try {
138
+ await this.ensureCollection();
139
+ await this.client.delete(this.collectionName, { wait: true, points: [id] });
140
+ this.entryCount = Math.max(0, this.entryCount - 1);
141
+ }
142
+ catch (error) {
143
+ throw new ProviderError("PROVIDER_UPSTREAM_ERROR", "Qdrant delete 失败", {
144
+ cause: error,
145
+ retryable: true,
146
+ });
147
+ }
148
+ }
149
+ /**
150
+ * 清空集合。
151
+ */
152
+ async clear() {
153
+ try {
154
+ const exists = await this.client.collectionExists(this.collectionName);
155
+ if (exists.exists) {
156
+ await this.client.deleteCollection(this.collectionName);
157
+ }
158
+ this.ensured = false;
159
+ this.entryCount = 0;
160
+ await this.ensureCollection();
161
+ }
162
+ catch (error) {
163
+ throw new ProviderError("PROVIDER_UPSTREAM_ERROR", "Qdrant clear 失败", {
164
+ cause: error,
165
+ retryable: true,
166
+ });
167
+ }
168
+ }
169
+ /**
170
+ * 返回集合内条目数量。
171
+ *
172
+ * 远程实现对 `client.count(...)` 发起一次真值查询(`exact: true`),避免本地缓存
173
+ * 漂移导致读到旧值(D1-LOW-07)。collection 不存在等异常会被包装成 `ProviderError`。
174
+ *
175
+ * @returns 条目数(远程真值)
176
+ */
177
+ async size() {
178
+ try {
179
+ await this.ensureCollection();
180
+ const response = await this.client.count(this.collectionName, { exact: true });
181
+ const remoteCount = typeof response?.count === "number" ? response.count : this.entryCount;
182
+ this.entryCount = remoteCount;
183
+ return remoteCount;
184
+ }
185
+ catch (error) {
186
+ throw new ProviderError("PROVIDER_UPSTREAM_ERROR", "Qdrant count 失败", {
187
+ cause: error,
188
+ retryable: true,
189
+ });
190
+ }
191
+ }
192
+ async ensureCollection() {
193
+ if (this.ensured) {
194
+ return;
195
+ }
196
+ const exists = await this.client.collectionExists(this.collectionName);
197
+ if (!exists.exists) {
198
+ await this.client.createCollection(this.collectionName, {
199
+ vectors: {
200
+ size: this.vectorSize,
201
+ distance: "Cosine",
202
+ },
203
+ });
204
+ }
205
+ this.ensured = true;
206
+ }
207
+ }
208
+ //# sourceMappingURL=qdrant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant.js","sourceRoot":"","sources":["../../src/vector/qdrant.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@tachu/extensions",
3
+ "version": "1.0.0-alpha.1",
4
+ "description": "Tachu extensions (alpha) — OpenAI/Anthropic/Mock providers, 7 built-in tools, execution backends, MCP adapters (stdio+SSE), vector stores (local/Qdrant), observability emitters, input transformers and common rules.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "README_ZH.md",
19
+ "CHANGELOG.md",
20
+ "LICENSE"
21
+ ],
22
+ "keywords": [
23
+ "tachu",
24
+ "agent",
25
+ "llm",
26
+ "openai",
27
+ "anthropic",
28
+ "mcp",
29
+ "qdrant",
30
+ "opentelemetry",
31
+ "vector-store",
32
+ "provider",
33
+ "tools",
34
+ "bun",
35
+ "typescript"
36
+ ],
37
+ "author": "Tachu Contributors",
38
+ "license": "Apache-2.0",
39
+ "homepage": "https://github.com/dangaogit/tachu#readme",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/dangaogit/tachu.git",
43
+ "directory": "packages/extensions"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/dangaogit/tachu/issues"
47
+ },
48
+ "engines": {
49
+ "bun": ">=1.3.12"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "registry": "https://registry.npmjs.org/"
54
+ },
55
+ "dependencies": {
56
+ "@anthropic-ai/sdk": "^0.90.0",
57
+ "@modelcontextprotocol/sdk": "^1.29.0",
58
+ "@opentelemetry/api": "^1.9.1",
59
+ "@opentelemetry/sdk-trace-base": "^2.7.0",
60
+ "@opentelemetry/sdk-trace-node": "^2.7.0",
61
+ "@qdrant/js-client-rest": "^1.17.0",
62
+ "@tachu/core": "1.0.0-alpha.1",
63
+ "mammoth": "^1.12.0",
64
+ "openai": "^6.34.0",
65
+ "pdf-parse": "^2.4.5"
66
+ },
67
+ "scripts": {
68
+ "build": "bun run clean && bunx tsc -p tsconfig.build.json && bun ../../scripts/copy-md-assets.ts",
69
+ "typecheck": "tsc --noEmit",
70
+ "clean": "rm -rf dist",
71
+ "test": "bun test",
72
+ "test:coverage": "bun test --coverage"
73
+ }
74
+ }