@tachu/extensions 1.0.0-beta.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 (152) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +201 -0
  3. package/README.md +825 -0
  4. package/README_ZH.md +815 -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 +69 -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 +57 -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 +53 -0
  20. package/dist/backends/web.js.map +1 -0
  21. package/dist/common/net.d.ts +31 -0
  22. package/dist/common/net.d.ts.map +1 -0
  23. package/dist/common/net.js +162 -0
  24. package/dist/common/net.js.map +1 -0
  25. package/dist/common/path.d.ts +18 -0
  26. package/dist/common/path.d.ts.map +1 -0
  27. package/dist/common/path.js +34 -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 +9 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +9 -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 +70 -0
  42. package/dist/mcp/sse-adapter.d.ts.map +1 -0
  43. package/dist/mcp/sse-adapter.js +176 -0
  44. package/dist/mcp/sse-adapter.js.map +1 -0
  45. package/dist/mcp/stdio-adapter.d.ts +73 -0
  46. package/dist/mcp/stdio-adapter.d.ts.map +1 -0
  47. package/dist/mcp/stdio-adapter.js +178 -0
  48. package/dist/mcp/stdio-adapter.js.map +1 -0
  49. package/dist/observability/index.d.ts +3 -0
  50. package/dist/observability/index.d.ts.map +1 -0
  51. package/dist/observability/index.js +3 -0
  52. package/dist/observability/index.js.map +1 -0
  53. package/dist/observability/jsonl-emitter.d.ts +58 -0
  54. package/dist/observability/jsonl-emitter.d.ts.map +1 -0
  55. package/dist/observability/jsonl-emitter.js +96 -0
  56. package/dist/observability/jsonl-emitter.js.map +1 -0
  57. package/dist/observability/otel-emitter.d.ts +52 -0
  58. package/dist/observability/otel-emitter.d.ts.map +1 -0
  59. package/dist/observability/otel-emitter.js +143 -0
  60. package/dist/observability/otel-emitter.js.map +1 -0
  61. package/dist/providers/anthropic.d.ts +54 -0
  62. package/dist/providers/anthropic.d.ts.map +1 -0
  63. package/dist/providers/anthropic.js +298 -0
  64. package/dist/providers/anthropic.js.map +1 -0
  65. package/dist/providers/index.d.ts +4 -0
  66. package/dist/providers/index.d.ts.map +1 -0
  67. package/dist/providers/index.js +4 -0
  68. package/dist/providers/index.js.map +1 -0
  69. package/dist/providers/mock.d.ts +38 -0
  70. package/dist/providers/mock.d.ts.map +1 -0
  71. package/dist/providers/mock.js +79 -0
  72. package/dist/providers/mock.js.map +1 -0
  73. package/dist/providers/openai.d.ts +61 -0
  74. package/dist/providers/openai.d.ts.map +1 -0
  75. package/dist/providers/openai.js +299 -0
  76. package/dist/providers/openai.js.map +1 -0
  77. package/dist/rules/index.d.ts +9 -0
  78. package/dist/rules/index.d.ts.map +1 -0
  79. package/dist/rules/index.js +15 -0
  80. package/dist/rules/index.js.map +1 -0
  81. package/dist/rules/no-hallucination.md +11 -0
  82. package/dist/rules/no-sensitive-output.md +11 -0
  83. package/dist/rules/prefer-concise-response.md +11 -0
  84. package/dist/rules/require-tool-verification.md +11 -0
  85. package/dist/tools/apply-patch/descriptor.md +27 -0
  86. package/dist/tools/apply-patch/executor.d.ts +19 -0
  87. package/dist/tools/apply-patch/executor.d.ts.map +1 -0
  88. package/dist/tools/apply-patch/executor.js +190 -0
  89. package/dist/tools/apply-patch/executor.js.map +1 -0
  90. package/dist/tools/fetch-url/descriptor.md +38 -0
  91. package/dist/tools/fetch-url/executor.d.ts +20 -0
  92. package/dist/tools/fetch-url/executor.d.ts.map +1 -0
  93. package/dist/tools/fetch-url/executor.js +34 -0
  94. package/dist/tools/fetch-url/executor.js.map +1 -0
  95. package/dist/tools/index.d.ts +12 -0
  96. package/dist/tools/index.d.ts.map +1 -0
  97. package/dist/tools/index.js +191 -0
  98. package/dist/tools/index.js.map +1 -0
  99. package/dist/tools/list-dir/descriptor.md +29 -0
  100. package/dist/tools/list-dir/executor.d.ts +22 -0
  101. package/dist/tools/list-dir/executor.d.ts.map +1 -0
  102. package/dist/tools/list-dir/executor.js +46 -0
  103. package/dist/tools/list-dir/executor.js.map +1 -0
  104. package/dist/tools/read-file/descriptor.md +28 -0
  105. package/dist/tools/read-file/executor.d.ts +15 -0
  106. package/dist/tools/read-file/executor.d.ts.map +1 -0
  107. package/dist/tools/read-file/executor.js +22 -0
  108. package/dist/tools/read-file/executor.js.map +1 -0
  109. package/dist/tools/run-shell/descriptor.md +39 -0
  110. package/dist/tools/run-shell/executor.d.ts +20 -0
  111. package/dist/tools/run-shell/executor.d.ts.map +1 -0
  112. package/dist/tools/run-shell/executor.js +76 -0
  113. package/dist/tools/run-shell/executor.js.map +1 -0
  114. package/dist/tools/search-code/descriptor.md +31 -0
  115. package/dist/tools/search-code/executor.d.ts +23 -0
  116. package/dist/tools/search-code/executor.d.ts.map +1 -0
  117. package/dist/tools/search-code/executor.js +113 -0
  118. package/dist/tools/search-code/executor.js.map +1 -0
  119. package/dist/tools/shared.d.ts +21 -0
  120. package/dist/tools/shared.d.ts.map +1 -0
  121. package/dist/tools/shared.js +12 -0
  122. package/dist/tools/shared.js.map +1 -0
  123. package/dist/tools/write-file/descriptor.md +30 -0
  124. package/dist/tools/write-file/executor.d.ts +16 -0
  125. package/dist/tools/write-file/executor.d.ts.map +1 -0
  126. package/dist/tools/write-file/executor.js +18 -0
  127. package/dist/tools/write-file/executor.js.map +1 -0
  128. package/dist/transformers/document-to-text.d.ts +23 -0
  129. package/dist/transformers/document-to-text.d.ts.map +1 -0
  130. package/dist/transformers/document-to-text.js +69 -0
  131. package/dist/transformers/document-to-text.js.map +1 -0
  132. package/dist/transformers/image-to-text.d.ts +38 -0
  133. package/dist/transformers/image-to-text.d.ts.map +1 -0
  134. package/dist/transformers/image-to-text.js +81 -0
  135. package/dist/transformers/image-to-text.js.map +1 -0
  136. package/dist/transformers/index.d.ts +3 -0
  137. package/dist/transformers/index.d.ts.map +1 -0
  138. package/dist/transformers/index.js +3 -0
  139. package/dist/transformers/index.js.map +1 -0
  140. package/dist/vector/index.d.ts +3 -0
  141. package/dist/vector/index.d.ts.map +1 -0
  142. package/dist/vector/index.js +3 -0
  143. package/dist/vector/index.js.map +1 -0
  144. package/dist/vector/local-fs.d.ts +76 -0
  145. package/dist/vector/local-fs.d.ts.map +1 -0
  146. package/dist/vector/local-fs.js +153 -0
  147. package/dist/vector/local-fs.js.map +1 -0
  148. package/dist/vector/qdrant.d.ts +65 -0
  149. package/dist/vector/qdrant.d.ts.map +1 -0
  150. package/dist/vector/qdrant.js +176 -0
  151. package/dist/vector/qdrant.js.map +1 -0
  152. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/common/process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,MAAqD,EACrD,QAAgB,EAC+B,EAAE;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC9B,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YACrC,KAAK,IAAI,IAAI,CAAC;YACd,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAW,EAAE,OAAO,GAAG,IAAI,EAAiB,EAAE;IACnF,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ;IACV,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { OpenAIProviderAdapter, AnthropicProviderAdapter, MockProviderAdapter, } from "./providers";
2
+ export { toolDescriptors, toolExecutors, type ToolExecutor } from "./tools";
3
+ export { TerminalBackend, FileBackend, WebBackend } from "./backends";
4
+ export { LocalFsVectorStore, QdrantVectorStore } from "./vector";
5
+ export { ImageToTextTransformer, DocumentToTextTransformer } from "./transformers";
6
+ export { McpStdioAdapter, McpSseAdapter } from "./mcp";
7
+ export { OtelEmitter, JsonlEmitter } from "./observability";
8
+ export { BUILTIN_RULE_DESCRIPTOR_PATHS } from "./rules";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { OpenAIProviderAdapter, AnthropicProviderAdapter, MockProviderAdapter, } from "./providers";
2
+ export { toolDescriptors, toolExecutors } from "./tools";
3
+ export { TerminalBackend, FileBackend, WebBackend } from "./backends";
4
+ export { LocalFsVectorStore, QdrantVectorStore } from "./vector";
5
+ export { ImageToTextTransformer, DocumentToTextTransformer } from "./transformers";
6
+ export { McpStdioAdapter, McpSseAdapter } from "./mcp";
7
+ export { OtelEmitter, JsonlEmitter } from "./observability";
8
+ export { BUILTIN_RULE_DESCRIPTOR_PATHS } from "./rules";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAqB,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { McpStdioAdapter } from "./stdio-adapter";
2
+ export { McpSseAdapter } from "./sse-adapter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { McpStdioAdapter } from "./stdio-adapter";
2
+ export { McpSseAdapter } from "./sse-adapter";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { McpToolAdapter, ToolDescriptor } from "@tachu/core";
2
+ interface McpSseAdapterOptions {
3
+ url: string;
4
+ headers?: Record<string, string>;
5
+ serverId?: string;
6
+ }
7
+ /**
8
+ * MCP SSE 传输适配器。
9
+ */
10
+ export declare class McpSseAdapter implements McpToolAdapter {
11
+ readonly transport: "sse";
12
+ private readonly options;
13
+ private readonly maxReconnectAttempts;
14
+ private client;
15
+ private transportImpl;
16
+ private reconnecting;
17
+ private closedManually;
18
+ private serverUri;
19
+ private readonly pendingRequests;
20
+ /**
21
+ * 创建 SSE MCP 适配器。
22
+ *
23
+ * @param options 连接配置
24
+ */
25
+ constructor(options: McpSseAdapterOptions);
26
+ /**
27
+ * 建立 SSE MCP 连接。
28
+ *
29
+ * @param serverUri 服务端地址(可覆盖构造参数)
30
+ */
31
+ connect(serverUri: string): Promise<void>;
32
+ /**
33
+ * 断开连接。
34
+ */
35
+ disconnect(): Promise<void>;
36
+ /**
37
+ * 列出远端工具并转换为 ToolDescriptor。
38
+ *
39
+ * @returns 工具描述符列表
40
+ */
41
+ listTools(): Promise<ToolDescriptor[]>;
42
+ /**
43
+ * 调用远端工具(core 协议方法)。
44
+ *
45
+ * @param name 工具名
46
+ * @param input 入参
47
+ * @returns 工具执行结果
48
+ */
49
+ executeTool(name: string, input: unknown): Promise<unknown>;
50
+ /**
51
+ * 调用远端工具(支持 AbortSignal)。
52
+ *
53
+ * @param name 工具名
54
+ * @param input 入参
55
+ * @param signal 取消信号
56
+ * @param requestId 请求 ID(可选;用于后续 cancel 显式取消)
57
+ * @returns 执行结果
58
+ */
59
+ callTool(name: string, input: unknown, signal?: AbortSignal, requestId?: string): Promise<unknown>;
60
+ /**
61
+ * 取消请求(由调用方通过 signal 传播)。
62
+ *
63
+ * @param _requestId 请求 ID
64
+ */
65
+ cancel(requestId: string): Promise<void>;
66
+ private connectInternal;
67
+ private reconnectWithBackoff;
68
+ }
69
+ export {};
70
+ //# sourceMappingURL=sse-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-adapter.d.ts","sourceRoot":"","sources":["../../src/mcp/sse-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,UAAU,oBAAoB;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,QAAQ,CAAC,SAAS,EAAG,KAAK,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAEtE;;;;OAIG;gBACS,OAAO,EAAE,oBAAoB;IAIzC;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAuB5C;;;;;;OAMG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE;;;;;;;;OAQG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAkCnB;;;;OAIG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQhC,eAAe;YAoBf,oBAAoB;CAoBnC"}
@@ -0,0 +1,176 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
3
+ const createRequestId = () => `mcp-sse-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
4
+ /**
5
+ * MCP SSE 传输适配器。
6
+ */
7
+ export class McpSseAdapter {
8
+ transport = "sse";
9
+ options;
10
+ maxReconnectAttempts = 3;
11
+ client = null;
12
+ transportImpl = null;
13
+ reconnecting = false;
14
+ closedManually = false;
15
+ serverUri = "";
16
+ pendingRequests = new Map();
17
+ /**
18
+ * 创建 SSE MCP 适配器。
19
+ *
20
+ * @param options 连接配置
21
+ */
22
+ constructor(options) {
23
+ this.options = options;
24
+ }
25
+ /**
26
+ * 建立 SSE MCP 连接。
27
+ *
28
+ * @param serverUri 服务端地址(可覆盖构造参数)
29
+ */
30
+ async connect(serverUri) {
31
+ this.serverUri = serverUri || this.options.url;
32
+ this.closedManually = false;
33
+ await this.connectInternal();
34
+ }
35
+ /**
36
+ * 断开连接。
37
+ */
38
+ async disconnect() {
39
+ this.closedManually = true;
40
+ for (const controller of this.pendingRequests.values()) {
41
+ controller.abort(new Error("MCP sse adapter disconnected"));
42
+ }
43
+ this.pendingRequests.clear();
44
+ await this.transportImpl?.close().catch(() => undefined);
45
+ this.transportImpl = null;
46
+ this.client = null;
47
+ }
48
+ /**
49
+ * 列出远端工具并转换为 ToolDescriptor。
50
+ *
51
+ * @returns 工具描述符列表
52
+ */
53
+ async listTools() {
54
+ if (!this.client) {
55
+ throw new Error("MCP sse adapter not connected");
56
+ }
57
+ const response = await this.client.listTools();
58
+ return response.tools.map((tool) => ({
59
+ kind: "tool",
60
+ name: tool.name,
61
+ description: tool.description ?? `mcp tool: ${tool.name}`,
62
+ sideEffect: tool.annotations?.readOnlyHint
63
+ ? "readonly"
64
+ : tool.annotations?.destructiveHint
65
+ ? "irreversible"
66
+ : "write",
67
+ idempotent: tool.annotations?.idempotentHint ?? false,
68
+ requiresApproval: tool.annotations?.destructiveHint ?? false,
69
+ timeout: 30_000,
70
+ inputSchema: tool.inputSchema,
71
+ outputSchema: tool.outputSchema,
72
+ execute: `mcp:${this.options.serverId ?? "sse"}:${tool.name}`,
73
+ }));
74
+ }
75
+ /**
76
+ * 调用远端工具(core 协议方法)。
77
+ *
78
+ * @param name 工具名
79
+ * @param input 入参
80
+ * @returns 工具执行结果
81
+ */
82
+ async executeTool(name, input) {
83
+ return this.callTool(name, input);
84
+ }
85
+ /**
86
+ * 调用远端工具(支持 AbortSignal)。
87
+ *
88
+ * @param name 工具名
89
+ * @param input 入参
90
+ * @param signal 取消信号
91
+ * @param requestId 请求 ID(可选;用于后续 cancel 显式取消)
92
+ * @returns 执行结果
93
+ */
94
+ async callTool(name, input, signal, requestId) {
95
+ if (!this.client) {
96
+ throw new Error("MCP sse adapter not connected");
97
+ }
98
+ const mappedRequestId = requestId?.trim() ? requestId : createRequestId();
99
+ if (this.pendingRequests.has(mappedRequestId)) {
100
+ throw new Error(`MCP sse request already in progress: ${mappedRequestId}`);
101
+ }
102
+ const controller = new AbortController();
103
+ const onAbort = () => {
104
+ controller.abort(signal?.reason ?? new Error(`MCP sse request aborted: ${mappedRequestId}`));
105
+ };
106
+ if (signal?.aborted) {
107
+ onAbort();
108
+ }
109
+ else {
110
+ signal?.addEventListener("abort", onAbort, { once: true });
111
+ }
112
+ this.pendingRequests.set(mappedRequestId, controller);
113
+ try {
114
+ const result = await this.client.callTool({ name, arguments: (input ?? {}) }, undefined, { signal: controller.signal });
115
+ return result;
116
+ }
117
+ finally {
118
+ signal?.removeEventListener("abort", onAbort);
119
+ this.pendingRequests.delete(mappedRequestId);
120
+ }
121
+ }
122
+ /**
123
+ * 取消请求(由调用方通过 signal 传播)。
124
+ *
125
+ * @param _requestId 请求 ID
126
+ */
127
+ async cancel(requestId) {
128
+ const controller = this.pendingRequests.get(requestId);
129
+ if (!controller) {
130
+ return;
131
+ }
132
+ controller.abort(new Error(`MCP sse request cancelled: ${requestId}`));
133
+ }
134
+ async connectInternal() {
135
+ const target = this.serverUri || this.options.url;
136
+ this.client = new Client({ name: "tachu-mcp-sse", version: "1.0.0" });
137
+ this.transportImpl = new SSEClientTransport(new URL(target), {
138
+ ...(this.options.headers
139
+ ? {
140
+ requestInit: {
141
+ headers: this.options.headers,
142
+ },
143
+ }
144
+ : {}),
145
+ });
146
+ this.transportImpl.onclose = () => {
147
+ if (!this.closedManually) {
148
+ void this.reconnectWithBackoff();
149
+ }
150
+ };
151
+ await this.client.connect(this.transportImpl);
152
+ }
153
+ async reconnectWithBackoff() {
154
+ if (this.reconnecting || this.closedManually) {
155
+ return;
156
+ }
157
+ this.reconnecting = true;
158
+ try {
159
+ for (let attempt = 0; attempt < this.maxReconnectAttempts; attempt += 1) {
160
+ const delay = 200 * 2 ** attempt;
161
+ await new Promise((resolve) => setTimeout(resolve, delay));
162
+ try {
163
+ await this.connectInternal();
164
+ return;
165
+ }
166
+ catch {
167
+ // retry
168
+ }
169
+ }
170
+ }
171
+ finally {
172
+ this.reconnecting = false;
173
+ }
174
+ }
175
+ }
176
+ //# sourceMappingURL=sse-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-adapter.js","sourceRoot":"","sources":["../../src/mcp/sse-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { McpToolAdapter, ToolDescriptor } from "@tachu/core";
2
+ interface McpStdioAdapterOptions {
3
+ command: string;
4
+ args?: string[];
5
+ env?: Record<string, string>;
6
+ cwd?: string;
7
+ serverId?: string;
8
+ }
9
+ /**
10
+ * MCP stdio 传输适配器。
11
+ */
12
+ export declare class McpStdioAdapter implements McpToolAdapter {
13
+ readonly transport: "stdio";
14
+ private readonly options;
15
+ private readonly maxReconnectAttempts;
16
+ private client;
17
+ private transportImpl;
18
+ private reconnecting;
19
+ private closedManually;
20
+ private connected;
21
+ private serverUri;
22
+ private readonly pendingRequests;
23
+ /**
24
+ * 创建 stdio MCP 适配器。
25
+ *
26
+ * @param options stdio 启动参数
27
+ */
28
+ constructor(options: McpStdioAdapterOptions);
29
+ /**
30
+ * 建立 MCP 连接。
31
+ *
32
+ * @param serverUri 服务端 URI(可留空)
33
+ */
34
+ connect(serverUri: string): Promise<void>;
35
+ /**
36
+ * 断开连接。
37
+ */
38
+ disconnect(): Promise<void>;
39
+ /**
40
+ * 列出远端工具并映射为引擎 ToolDescriptor。
41
+ *
42
+ * @returns 工具描述符数组
43
+ */
44
+ listTools(): Promise<ToolDescriptor[]>;
45
+ /**
46
+ * 调用远端工具(core 协议方法)。
47
+ *
48
+ * @param name 工具名
49
+ * @param input 入参
50
+ * @returns 工具执行结果
51
+ */
52
+ executeTool(name: string, input: unknown): Promise<unknown>;
53
+ /**
54
+ * 调用远端工具(支持 AbortSignal)。
55
+ *
56
+ * @param name 工具名
57
+ * @param input 入参
58
+ * @param signal 取消信号
59
+ * @param requestId 请求 ID(可选;用于后续 cancel 显式取消)
60
+ * @returns 工具执行结果
61
+ */
62
+ callTool(name: string, input: unknown, signal?: AbortSignal, requestId?: string): Promise<unknown>;
63
+ /**
64
+ * 按 requestId 取消请求(通过信号机制由调用方透传)。
65
+ *
66
+ * @param _requestId 请求 ID
67
+ */
68
+ cancel(requestId: string): Promise<void>;
69
+ private connectInternal;
70
+ private reconnectWithBackoff;
71
+ }
72
+ export {};
73
+ //# sourceMappingURL=stdio-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-adapter.d.ts","sourceRoot":"","sources":["../../src/mcp/stdio-adapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,UAAU,sBAAsB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;GAEG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAEtE;;;;OAIG;gBACS,OAAO,EAAE,sBAAsB;IAI3C;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAuB5C;;;;;;OAMG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE;;;;;;;;OAQG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAkCnB;;;;OAIG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQhC,eAAe;YAqBf,oBAAoB;CAoBnC"}
@@ -0,0 +1,178 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport, } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ const createRequestId = () => `mcp-stdio-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
4
+ /**
5
+ * MCP stdio 传输适配器。
6
+ */
7
+ export class McpStdioAdapter {
8
+ transport = "stdio";
9
+ options;
10
+ maxReconnectAttempts = 3;
11
+ client = null;
12
+ transportImpl = null;
13
+ reconnecting = false;
14
+ closedManually = false;
15
+ connected = false;
16
+ serverUri = "";
17
+ pendingRequests = new Map();
18
+ /**
19
+ * 创建 stdio MCP 适配器。
20
+ *
21
+ * @param options stdio 启动参数
22
+ */
23
+ constructor(options) {
24
+ this.options = options;
25
+ }
26
+ /**
27
+ * 建立 MCP 连接。
28
+ *
29
+ * @param serverUri 服务端 URI(可留空)
30
+ */
31
+ async connect(serverUri) {
32
+ this.serverUri = serverUri;
33
+ this.closedManually = false;
34
+ await this.connectInternal();
35
+ }
36
+ /**
37
+ * 断开连接。
38
+ */
39
+ async disconnect() {
40
+ this.closedManually = true;
41
+ this.connected = false;
42
+ for (const controller of this.pendingRequests.values()) {
43
+ controller.abort(new Error("MCP stdio adapter disconnected"));
44
+ }
45
+ this.pendingRequests.clear();
46
+ await this.transportImpl?.close().catch(() => undefined);
47
+ this.transportImpl = null;
48
+ this.client = null;
49
+ }
50
+ /**
51
+ * 列出远端工具并映射为引擎 ToolDescriptor。
52
+ *
53
+ * @returns 工具描述符数组
54
+ */
55
+ async listTools() {
56
+ if (!this.client) {
57
+ throw new Error("MCP stdio adapter not connected");
58
+ }
59
+ const response = await this.client.listTools();
60
+ return response.tools.map((tool) => ({
61
+ kind: "tool",
62
+ name: tool.name,
63
+ description: tool.description ?? `mcp tool: ${tool.name}`,
64
+ sideEffect: tool.annotations?.readOnlyHint
65
+ ? "readonly"
66
+ : tool.annotations?.destructiveHint
67
+ ? "irreversible"
68
+ : "write",
69
+ idempotent: tool.annotations?.idempotentHint ?? false,
70
+ requiresApproval: tool.annotations?.destructiveHint ?? false,
71
+ timeout: 30_000,
72
+ inputSchema: tool.inputSchema,
73
+ outputSchema: tool.outputSchema,
74
+ execute: `mcp:${this.options.serverId ?? "stdio"}:${tool.name}`,
75
+ }));
76
+ }
77
+ /**
78
+ * 调用远端工具(core 协议方法)。
79
+ *
80
+ * @param name 工具名
81
+ * @param input 入参
82
+ * @returns 工具执行结果
83
+ */
84
+ async executeTool(name, input) {
85
+ return this.callTool(name, input);
86
+ }
87
+ /**
88
+ * 调用远端工具(支持 AbortSignal)。
89
+ *
90
+ * @param name 工具名
91
+ * @param input 入参
92
+ * @param signal 取消信号
93
+ * @param requestId 请求 ID(可选;用于后续 cancel 显式取消)
94
+ * @returns 工具执行结果
95
+ */
96
+ async callTool(name, input, signal, requestId) {
97
+ if (!this.client) {
98
+ throw new Error("MCP stdio adapter not connected");
99
+ }
100
+ const mappedRequestId = requestId?.trim() ? requestId : createRequestId();
101
+ if (this.pendingRequests.has(mappedRequestId)) {
102
+ throw new Error(`MCP stdio request already in progress: ${mappedRequestId}`);
103
+ }
104
+ const controller = new AbortController();
105
+ const onAbort = () => {
106
+ controller.abort(signal?.reason ?? new Error(`MCP stdio request aborted: ${mappedRequestId}`));
107
+ };
108
+ if (signal?.aborted) {
109
+ onAbort();
110
+ }
111
+ else {
112
+ signal?.addEventListener("abort", onAbort, { once: true });
113
+ }
114
+ this.pendingRequests.set(mappedRequestId, controller);
115
+ try {
116
+ const result = await this.client.callTool({ name, arguments: (input ?? {}) }, undefined, { signal: controller.signal });
117
+ return result;
118
+ }
119
+ finally {
120
+ signal?.removeEventListener("abort", onAbort);
121
+ this.pendingRequests.delete(mappedRequestId);
122
+ }
123
+ }
124
+ /**
125
+ * 按 requestId 取消请求(通过信号机制由调用方透传)。
126
+ *
127
+ * @param _requestId 请求 ID
128
+ */
129
+ async cancel(requestId) {
130
+ const controller = this.pendingRequests.get(requestId);
131
+ if (!controller) {
132
+ return;
133
+ }
134
+ controller.abort(new Error(`MCP stdio request cancelled: ${requestId}`));
135
+ }
136
+ async connectInternal() {
137
+ const serverParams = {
138
+ command: this.options.command,
139
+ ...(this.options.args ? { args: this.options.args } : {}),
140
+ ...(this.options.env ? { env: this.options.env } : {}),
141
+ ...(this.options.cwd ? { cwd: this.options.cwd } : {}),
142
+ stderr: "pipe",
143
+ };
144
+ this.client = new Client({ name: "tachu-mcp-stdio", version: "1.0.0" });
145
+ this.transportImpl = new StdioClientTransport(serverParams);
146
+ this.transportImpl.onclose = () => {
147
+ this.connected = false;
148
+ if (!this.closedManually) {
149
+ void this.reconnectWithBackoff();
150
+ }
151
+ };
152
+ await this.client.connect(this.transportImpl);
153
+ this.connected = true;
154
+ }
155
+ async reconnectWithBackoff() {
156
+ if (this.reconnecting || this.closedManually) {
157
+ return;
158
+ }
159
+ this.reconnecting = true;
160
+ try {
161
+ for (let attempt = 0; attempt < this.maxReconnectAttempts; attempt += 1) {
162
+ const delay = 200 * 2 ** attempt;
163
+ await new Promise((resolve) => setTimeout(resolve, delay));
164
+ try {
165
+ await this.connectInternal();
166
+ return;
167
+ }
168
+ catch {
169
+ // retry
170
+ }
171
+ }
172
+ }
173
+ finally {
174
+ this.reconnecting = false;
175
+ }
176
+ }
177
+ }
178
+ //# sourceMappingURL=stdio-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-adapter.js","sourceRoot":"","sources":["../../src/mcp/stdio-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { OtelEmitter } from "./otel-emitter";
2
+ export { JsonlEmitter } from "./jsonl-emitter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { OtelEmitter } from "./otel-emitter";
2
+ export { JsonlEmitter } from "./jsonl-emitter";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { EngineEvent, ObservabilityEmitter } from "@tachu/core";
2
+ type EventHandler = (event: EngineEvent) => void;
3
+ interface JsonlEmitterOptions {
4
+ filePath: string;
5
+ rotateSize?: number;
6
+ }
7
+ /**
8
+ * JSON Lines 文件事件发射器。
9
+ */
10
+ export declare class JsonlEmitter implements ObservabilityEmitter {
11
+ private readonly handlers;
12
+ private readonly filePath;
13
+ private readonly rotateSize;
14
+ private masker;
15
+ private writeQueue;
16
+ /**
17
+ * 创建 JSONL 发射器。
18
+ *
19
+ * @param options 文件配置
20
+ */
21
+ constructor(options: JsonlEmitterOptions);
22
+ /**
23
+ * 订阅事件。
24
+ *
25
+ * @param type 事件类型
26
+ * @param handler 处理器
27
+ * @returns 取消订阅函数
28
+ */
29
+ on(type: EngineEvent["type"] | "*", handler: EventHandler): () => void;
30
+ /**
31
+ * 取消订阅。
32
+ *
33
+ * @param type 事件类型
34
+ * @param handler 处理器
35
+ */
36
+ off(type: EngineEvent["type"] | "*", handler: EventHandler): void;
37
+ /**
38
+ * 发射并持久化事件。
39
+ *
40
+ * @param event 引擎事件
41
+ */
42
+ emit(event: EngineEvent): void;
43
+ /**
44
+ * 设置脱敏函数。
45
+ *
46
+ * @param masker 脱敏函数
47
+ */
48
+ setMasker(masker: (payload: unknown) => unknown): void;
49
+ /**
50
+ * 等待队列写入完成。
51
+ */
52
+ dispose(): Promise<void>;
53
+ private emitToSubscribers;
54
+ private append;
55
+ private rotateIfNeeded;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=jsonl-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-emitter.d.ts","sourceRoot":"","sources":["../../src/observability/jsonl-emitter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAErE,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAEjD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IACpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,UAAU,CAAqB;IAEvC;;;;OAIG;gBACS,OAAO,EAAE,mBAAmB;IAKxC;;;;;;OAMG;IACH,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAOtE;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAQjE;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAS9B;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,IAAI;IAItD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,iBAAiB;YASX,MAAM;YAMN,cAAc;CAQ7B"}