@dsh-plugin/dsh-synapse 0.0.0-stage → 0.1.0-dev.41044818627

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 (150) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE.md +18 -0
  3. package/README.md +136 -2
  4. package/cordis.patch.yml +3 -0
  5. package/lib/bot.cjs +8314 -0
  6. package/lib/bot.cjs.map +7 -0
  7. package/lib/build.json +1 -0
  8. package/lib/client.js +46 -0
  9. package/lib/host/agent.d.ts +21 -0
  10. package/lib/host/agent.js +151 -0
  11. package/lib/host/agent.js.map +1 -0
  12. package/lib/host/bot.d.ts +17 -0
  13. package/lib/host/bot.js +158 -0
  14. package/lib/host/bot.js.map +1 -0
  15. package/lib/host/client.d.ts +2 -0
  16. package/lib/host/client.js +19 -0
  17. package/lib/host/client.js.map +1 -0
  18. package/lib/host/config.d.ts +24 -0
  19. package/lib/host/config.js +192 -0
  20. package/lib/host/config.js.map +1 -0
  21. package/lib/host/files.d.ts +29 -0
  22. package/lib/host/files.js +188 -0
  23. package/lib/host/files.js.map +1 -0
  24. package/lib/host/gateway.d.ts +33 -0
  25. package/lib/host/gateway.js +237 -0
  26. package/lib/host/gateway.js.map +1 -0
  27. package/lib/host/github.d.ts +47 -0
  28. package/lib/host/github.js +219 -0
  29. package/lib/host/github.js.map +1 -0
  30. package/lib/host/http.d.ts +4 -0
  31. package/lib/host/http.js +41 -0
  32. package/lib/host/http.js.map +1 -0
  33. package/lib/host/index.d.ts +32 -0
  34. package/lib/host/index.js +192 -0
  35. package/lib/host/index.js.map +1 -0
  36. package/lib/host/inference-worker.d.ts +1 -0
  37. package/lib/host/inference-worker.js +72 -0
  38. package/lib/host/inference-worker.js.map +1 -0
  39. package/lib/host/mcp.d.ts +138 -0
  40. package/lib/host/mcp.js +104 -0
  41. package/lib/host/mcp.js.map +1 -0
  42. package/lib/host/memory.d.ts +26 -0
  43. package/lib/host/memory.js +155 -0
  44. package/lib/host/memory.js.map +1 -0
  45. package/lib/host/panel.d.ts +1 -0
  46. package/lib/host/panel.html +174 -0
  47. package/lib/host/panel.js +388 -0
  48. package/lib/host/panel.js.map +1 -0
  49. package/lib/host/runtime.d.ts +21 -0
  50. package/lib/host/runtime.js +145 -0
  51. package/lib/host/runtime.js.map +1 -0
  52. package/lib/host/types.d.ts +112 -0
  53. package/lib/host/types.js +2 -0
  54. package/lib/host/types.js.map +1 -0
  55. package/package.json +94 -4
  56. package/scripts/build.mjs +90 -0
  57. package/scripts/check.mjs +13 -0
  58. package/scripts/dump-npm-latest.mjs +49 -0
  59. package/scripts/model-smoke.mjs +25 -0
  60. package/src/agent.ts +203 -0
  61. package/src/bot.ts +173 -0
  62. package/src/client.ts +20 -0
  63. package/src/config.ts +217 -0
  64. package/src/files.ts +206 -0
  65. package/src/gateway.ts +276 -0
  66. package/src/github.ts +263 -0
  67. package/src/http.ts +41 -0
  68. package/src/index.ts +227 -0
  69. package/src/inference-worker.ts +89 -0
  70. package/src/mcp.ts +112 -0
  71. package/src/memory.ts +178 -0
  72. package/src/panel.html +174 -0
  73. package/src/panel.ts +440 -0
  74. package/src/runtime.ts +164 -0
  75. package/src/types.ts +106 -0
  76. package/test/core.test.mjs +279 -0
  77. package/test/fixtures/mcp-server.mjs +14 -0
  78. package/test/integration.test.mjs +253 -0
  79. package/test/panel.test.mjs +73 -0
  80. package/tsconfig.json +18 -0
  81. package/vendor/gugle-chat-bot/LICENSE +661 -0
  82. package/vendor/gugle-chat-bot/package.json +57 -0
  83. package/vendor/gugle-chat-bot/src/allow-rule.yml +9345 -0
  84. package/vendor/gugle-chat-bot/src/api.json +4285 -0
  85. package/vendor/gugle-chat-bot/src/command/index.ts +141 -0
  86. package/vendor/gugle-chat-bot/src/config/features.ts +548 -0
  87. package/vendor/gugle-chat-bot/src/config/index.ts +184 -0
  88. package/vendor/gugle-chat-bot/src/config/manager.ts +357 -0
  89. package/vendor/gugle-chat-bot/src/constants/index.ts +13 -0
  90. package/vendor/gugle-chat-bot/src/custom.ts +548 -0
  91. package/vendor/gugle-chat-bot/src/event/index.ts +118 -0
  92. package/vendor/gugle-chat-bot/src/features/admin/index.ts +414 -0
  93. package/vendor/gugle-chat-bot/src/features/bili/image/impl/video.ts +39 -0
  94. package/vendor/gugle-chat-bot/src/features/bili/image/index.ts +37 -0
  95. package/vendor/gugle-chat-bot/src/features/bili/index.ts +65 -0
  96. package/vendor/gugle-chat-bot/src/features/bili/template/style/video.css +97 -0
  97. package/vendor/gugle-chat-bot/src/features/bili/template/video.html +57 -0
  98. package/vendor/gugle-chat-bot/src/features/discord-bridge/index.ts +1128 -0
  99. package/vendor/gugle-chat-bot/src/features/discord-bridge/markdown.ts +105 -0
  100. package/vendor/gugle-chat-bot/src/features/discord-bridge/slash.ts +355 -0
  101. package/vendor/gugle-chat-bot/src/features/discord-bridge/source.ts +96 -0
  102. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/message.html +14 -0
  103. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/style/message.css +144 -0
  104. package/vendor/gugle-chat-bot/src/features/github/api.ts +93 -0
  105. package/vendor/gugle-chat-bot/src/features/github/binding.ts +161 -0
  106. package/vendor/gugle-chat-bot/src/features/github/image/impl/issue.ts +132 -0
  107. package/vendor/gugle-chat-bot/src/features/github/image/impl/pr.ts +144 -0
  108. package/vendor/gugle-chat-bot/src/features/github/image/impl/release.ts +160 -0
  109. package/vendor/gugle-chat-bot/src/features/github/image/index.ts +310 -0
  110. package/vendor/gugle-chat-bot/src/features/github/index.ts +302 -0
  111. package/vendor/gugle-chat-bot/src/features/github/template/issue.html +118 -0
  112. package/vendor/gugle-chat-bot/src/features/github/template/pull_request.html +125 -0
  113. package/vendor/gugle-chat-bot/src/features/github/template/release.html +53 -0
  114. package/vendor/gugle-chat-bot/src/features/github/template/style/issue.css +468 -0
  115. package/vendor/gugle-chat-bot/src/features/github/template/style/pull_request.css +469 -0
  116. package/vendor/gugle-chat-bot/src/features/github/template/style/release.css +412 -0
  117. package/vendor/gugle-chat-bot/src/features/hermes/client.ts +184 -0
  118. package/vendor/gugle-chat-bot/src/features/hermes/config.ts +210 -0
  119. package/vendor/gugle-chat-bot/src/features/hermes/context.ts +67 -0
  120. package/vendor/gugle-chat-bot/src/features/hermes/history.ts +86 -0
  121. package/vendor/gugle-chat-bot/src/features/hermes/index.ts +1533 -0
  122. package/vendor/gugle-chat-bot/src/features/hermes/message.ts +319 -0
  123. package/vendor/gugle-chat-bot/src/features/hermes/reaction.ts +181 -0
  124. package/vendor/gugle-chat-bot/src/features/hermes/render.ts +118 -0
  125. package/vendor/gugle-chat-bot/src/features/hermes/reply-units.ts +331 -0
  126. package/vendor/gugle-chat-bot/src/features/hermes/skills.ts +406 -0
  127. package/vendor/gugle-chat-bot/src/features/hermes/template/approval.html +30 -0
  128. package/vendor/gugle-chat-bot/src/features/hermes/template/progress.html +21 -0
  129. package/vendor/gugle-chat-bot/src/features/hermes/template/style/approval.css +81 -0
  130. package/vendor/gugle-chat-bot/src/features/hermes/template/style/progress.css +120 -0
  131. package/vendor/gugle-chat-bot/src/features/hermes/trigger.ts +86 -0
  132. package/vendor/gugle-chat-bot/src/features/hermes/types.ts +327 -0
  133. package/vendor/gugle-chat-bot/src/features/management/index.ts +156 -0
  134. package/vendor/gugle-chat-bot/src/features/minecraft/index.ts +127 -0
  135. package/vendor/gugle-chat-bot/src/features/modrinth/index.ts +71 -0
  136. package/vendor/gugle-chat-bot/src/features/parentheses/index.ts +117 -0
  137. package/vendor/gugle-chat-bot/src/features/peak-valley-timer/index.ts +452 -0
  138. package/vendor/gugle-chat-bot/src/features/poke/index.ts +24 -0
  139. package/vendor/gugle-chat-bot/src/features/version-tracker/index.ts +78 -0
  140. package/vendor/gugle-chat-bot/src/features/welcome/index.ts +58 -0
  141. package/vendor/gugle-chat-bot/src/github-ip.json +5814 -0
  142. package/vendor/gugle-chat-bot/src/image/index.ts +278 -0
  143. package/vendor/gugle-chat-bot/src/index.ts +695 -0
  144. package/vendor/gugle-chat-bot/src/logger/index.ts +54 -0
  145. package/vendor/gugle-chat-bot/src/result.json +359 -0
  146. package/vendor/gugle-chat-bot/src/type/bili.d.ts +825 -0
  147. package/vendor/gugle-chat-bot/src/type/event.d.ts +146 -0
  148. package/vendor/gugle-chat-bot/src/type/github.d.ts +446 -0
  149. package/vendor/gugle-chat-bot/src/type/index.d.ts +254 -0
  150. package/vendor/gugle-chat-bot/tsconfig.json +46 -0
@@ -0,0 +1,192 @@
1
+ import { mkdir, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { template, validateConfig } from "./config.js";
4
+ import { pathsFor, SkillStore, safePath } from "./files.js";
5
+ import { Inference } from "./runtime.js";
6
+ import { Memory, parseHermes } from "./memory.js";
7
+ import { McpManager } from "./mcp.js";
8
+ import { Agent } from "./agent.js";
9
+ import { Gateway } from "./gateway.js";
10
+ import { Bot } from "./bot.js";
11
+ import { Reviews } from "./github.js";
12
+ import { json, body, browserAuthorized } from "./http.js";
13
+ export const name = "@dsh-plugin/dsh-synapse";
14
+ export const inject = ["dshLoader"];
15
+ export { template };
16
+ export async function createService(ctx, c, onError) {
17
+ validateConfig(c);
18
+ const paths = pathsFor(ctx, c);
19
+ await safePath(paths.profile, "data", "dsh-synapse");
20
+ await mkdir(paths.data, { recursive: true });
21
+ const config = () => c, inference = new Inference(paths.data), skills = new SkillStore(paths);
22
+ const memory = new Memory(path.join(paths.data, "memory.sqlite"), inference, config), mcp = new McpManager(config);
23
+ const agent = new Agent({ config, paths, memory, skills, mcp, onError }), gateway = new Gateway(agent, config, onError);
24
+ const bot = new Bot(paths, config, gateway, onError), reviews = new Reviews(memory.db, agent, config, bot, onError);
25
+ const close = async () => {
26
+ await Promise.allSettled([
27
+ reviews.close(),
28
+ bot.stop(),
29
+ gateway.close(),
30
+ mcp.close(),
31
+ inference.close(),
32
+ ]);
33
+ memory.close();
34
+ };
35
+ try {
36
+ await gateway.start();
37
+ await bot.start();
38
+ void reviews.drain();
39
+ if (c.enabled && c.ragEnabled)
40
+ void inference.embed("初始化记忆模型").catch(onError);
41
+ }
42
+ catch (e) {
43
+ await close();
44
+ throw e;
45
+ }
46
+ return {
47
+ paths,
48
+ config,
49
+ inference,
50
+ skills,
51
+ memory,
52
+ mcp,
53
+ agent,
54
+ gateway,
55
+ bot,
56
+ reviews,
57
+ close,
58
+ };
59
+ }
60
+ export async function apply(ctx) {
61
+ const handle = await ctx.dshLoader.config.register(ctx, template);
62
+ let service, disposed = false, lastError = "", queue = Promise.resolve();
63
+ const onError = (e) => {
64
+ lastError = e.message;
65
+ ctx.logger?.warn?.(`[synapse] ${e.message}`);
66
+ };
67
+ const enqueue = (fn) => {
68
+ const result = queue.then(fn);
69
+ queue = result.catch(onError);
70
+ return result;
71
+ };
72
+ const reconfigure = (value) => enqueue(async () => {
73
+ if (disposed)
74
+ return;
75
+ validateConfig(value);
76
+ pathsFor(ctx, value);
77
+ if (service) {
78
+ const old = service;
79
+ service = null;
80
+ await old.close();
81
+ }
82
+ service = await createService(ctx, value, onError);
83
+ lastError = "";
84
+ });
85
+ const off = handle.watch(({ value }) => void reconfigure(value).catch(() => { }));
86
+ const manage = async (req, res) => {
87
+ try {
88
+ if (!browserAuthorized(ctx, req, res))
89
+ return;
90
+ const url = new URL(req.url, "http://localhost");
91
+ const action = url.pathname.slice("/api/dsh-synapse/".length);
92
+ if (action === "status")
93
+ return json(res, {
94
+ running: Boolean(service),
95
+ bot: service?.bot.state || "stopped",
96
+ lastError,
97
+ });
98
+ if (!service)
99
+ return json(res, { error: lastError || "服务尚未就绪" }, 503);
100
+ // Serialize management with configuration changes; no writes into a closing DB.
101
+ await enqueue(async () => {
102
+ if (!service)
103
+ throw new Error("服务正在重载");
104
+ if (req.method === "GET" && action === "skills")
105
+ return json(res, await service.skills.list());
106
+ if (req.method === "GET" && action === "reviews")
107
+ return json(res, service.reviews.list());
108
+ if (req.method === "GET" && action === "memory")
109
+ return json(res, service.memory.list(url.searchParams.get("channel") || "chat"));
110
+ if (req.method === "GET" && action === "features") {
111
+ const live = await service.bot.liveFeatures();
112
+ return json(res, service.config().features.map((f) => ({
113
+ id: f.id,
114
+ value: {
115
+ ...JSON.parse(f.json),
116
+ ...(live.find((x) => x.id === f.id)?.value || {}),
117
+ },
118
+ })));
119
+ }
120
+ if (req.method === "POST") {
121
+ const data = JSON.parse((await body(req)).toString() || "{}");
122
+ if (action === "skills/save")
123
+ return json(res, await service.skills.save(data.name, data.content, data.revision));
124
+ if (action === "skills/delete") {
125
+ await service.skills.remove(data.name, data.revision);
126
+ return json(res, { ok: true });
127
+ }
128
+ if (action === "mcp/tools")
129
+ return json(res, await service.mcp.list(data.name));
130
+ if (action === "memory/import") {
131
+ if (!service.config().ragEnabled)
132
+ throw new Error("请先启用 RAG");
133
+ const items = parseHermes(data.markdown, data.channel);
134
+ return json(res, data.preview ? { items } : await service.memory.addMany(items));
135
+ }
136
+ if (action === "memory/search")
137
+ return json(res, await service.memory.search(String(data.query), data.channel));
138
+ if (action === "reviews/retry") {
139
+ service.reviews.retry(data.id);
140
+ return json(res, { ok: true });
141
+ }
142
+ }
143
+ json(res, { error: "Not found" }, 404);
144
+ });
145
+ }
146
+ catch (e) {
147
+ if (!res.headersSent)
148
+ json(res, { error: e.message }, e.status || 400);
149
+ }
150
+ };
151
+ const routes = [];
152
+ ctx.effect(() => () => {
153
+ disposed = true;
154
+ off();
155
+ for (const release of routes)
156
+ release();
157
+ void enqueue(async () => {
158
+ await service?.close();
159
+ service = null;
160
+ });
161
+ });
162
+ routes.push(ctx.dshLoader.web.register("/api/dsh-synapse/", manage));
163
+ routes.push(ctx.dshLoader.web.post("/hooks/dsh-synapse/github", (req, res) => {
164
+ void enqueue(async () => {
165
+ if (!service)
166
+ return json(res, { error: "服务尚未就绪" }, 503);
167
+ await service.reviews.webhook(req, res);
168
+ }).catch((e) => {
169
+ if (!res.headersSent)
170
+ json(res, { error: e.message }, e.status || 400);
171
+ });
172
+ }));
173
+ // A same-origin standalone panel is also available for older DSH clients.
174
+ routes.push(ctx.dshLoader.web.get("/synapse", async (req, res) => {
175
+ if (!browserAuthorized(ctx, req, res))
176
+ return;
177
+ const html = await readFile(new URL("./panel.html", import.meta.url), "utf8");
178
+ res.writeHead(200, {
179
+ "Content-Type": "text/html; charset=utf-8",
180
+ "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'",
181
+ });
182
+ res.end(html);
183
+ }));
184
+ routes.push(ctx.dshLoader.web.get("/synapse-panel.js", async (req, res) => {
185
+ if (!browserAuthorized(ctx, req, res))
186
+ return;
187
+ res.writeHead(200, { "Content-Type": "text/javascript; charset=utf-8" });
188
+ res.end(await readFile(new URL("./panel.js", import.meta.url), "utf8"));
189
+ }));
190
+ await reconfigure(handle.get().value).catch(() => { });
191
+ }
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,72 @@
1
+ import { parentPort, workerData } from "node:worker_threads";
2
+ import { createRequire } from "node:module";
3
+ import { pathToFileURL } from "node:url";
4
+ const require = createRequire(workerData.manifest);
5
+ const runtime = await import(pathToFileURL(require.resolve("@huggingface/transformers")).href);
6
+ const { pipeline, env, AutoTokenizer, AutoModelForSequenceClassification } = runtime.default ?? runtime;
7
+ env.cacheDir = workerData.cache;
8
+ env.allowLocalModels = false;
9
+ let embedder, tokenizer, ranker;
10
+ async function load(factory) {
11
+ try {
12
+ env.remoteHost = "https://huggingface.co/";
13
+ return await factory();
14
+ }
15
+ catch (direct) {
16
+ env.remoteHost = "https://hf-mirror.com/";
17
+ try {
18
+ return await factory();
19
+ }
20
+ catch (mirror) {
21
+ throw new Error(`模型直连和镜像均失败:${direct.message}; ${mirror.message}`);
22
+ }
23
+ }
24
+ }
25
+ let queue = Promise.resolve();
26
+ parentPort.on("message", (message) => {
27
+ queue = queue
28
+ .then(async () => {
29
+ const { id, method, args } = message;
30
+ try {
31
+ let value;
32
+ if (method === "embed") {
33
+ embedder ??= await load(() => pipeline("feature-extraction", "Xenova/bge-small-zh-v1.5", {
34
+ dtype: "q8",
35
+ device: "cpu",
36
+ }));
37
+ const output = await embedder((args.query ? "为这个句子生成表示以用于检索相关文章:" : "") +
38
+ args.text, {
39
+ pooling: "cls",
40
+ normalize: true,
41
+ truncation: true,
42
+ max_length: 512,
43
+ });
44
+ value = Array.from(output.data);
45
+ }
46
+ else if (method === "rerank") {
47
+ tokenizer ??= await load(() => AutoTokenizer.from_pretrained("Xenova/bge-reranker-base"));
48
+ ranker ??= await load(() => AutoModelForSequenceClassification.from_pretrained("Xenova/bge-reranker-base", { dtype: "q8", device: "cpu" }));
49
+ value = [];
50
+ for (let i = 0; i < args.documents.length; i += 4) {
51
+ const docs = args.documents.slice(i, i + 4);
52
+ const inputs = tokenizer(docs.map(() => args.query), {
53
+ text_pair: docs,
54
+ padding: true,
55
+ truncation: true,
56
+ max_length: 512,
57
+ });
58
+ const { logits } = await ranker(inputs);
59
+ value.push(...Array.from(logits.data).map((n) => 1 / (1 + Math.exp(-n))));
60
+ }
61
+ }
62
+ else
63
+ throw new Error("未知推理方法");
64
+ parentPort.postMessage({ id, value });
65
+ }
66
+ catch (e) {
67
+ parentPort.postMessage({ id, error: e.message });
68
+ }
69
+ })
70
+ .catch((e) => parentPort.postMessage({ id: message.id, error: e.message }));
71
+ });
72
+ //# sourceMappingURL=inference-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference-worker.js","sourceRoot":"","sources":["../../src/inference-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import type { ConfigSource, AvailableTool } from "./types.js";
2
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
3
+ export declare class McpManager {
4
+ config: ConfigSource;
5
+ connections: Map<string, Promise<Client>>;
6
+ closed: boolean;
7
+ constructor(config: ConfigSource);
8
+ connect(name: any): Promise<Client<{
9
+ method: string;
10
+ params?: {
11
+ [x: string]: unknown;
12
+ _meta?: {
13
+ [x: string]: unknown;
14
+ progressToken?: string | number;
15
+ "io.modelcontextprotocol/related-task"?: {
16
+ taskId: string;
17
+ };
18
+ };
19
+ };
20
+ }, {
21
+ method: string;
22
+ params?: {
23
+ [x: string]: unknown;
24
+ _meta?: {
25
+ [x: string]: unknown;
26
+ progressToken?: string | number;
27
+ "io.modelcontextprotocol/related-task"?: {
28
+ taskId: string;
29
+ };
30
+ };
31
+ };
32
+ }, {
33
+ [x: string]: unknown;
34
+ _meta?: {
35
+ [x: string]: unknown;
36
+ progressToken?: string | number;
37
+ "io.modelcontextprotocol/related-task"?: {
38
+ taskId: string;
39
+ };
40
+ };
41
+ }>>;
42
+ list(name: any): Promise<any[]>;
43
+ available(): Promise<AvailableTool[]>;
44
+ call(tool: any, args: any): Promise<{
45
+ [x: string]: unknown;
46
+ content: ({
47
+ type: "text";
48
+ text: string;
49
+ annotations?: {
50
+ audience?: ("user" | "assistant")[] | undefined;
51
+ priority?: number | undefined;
52
+ lastModified?: string | undefined;
53
+ } | undefined;
54
+ _meta?: Record<string, unknown> | undefined;
55
+ } | {
56
+ type: "image";
57
+ data: string;
58
+ mimeType: string;
59
+ annotations?: {
60
+ audience?: ("user" | "assistant")[] | undefined;
61
+ priority?: number | undefined;
62
+ lastModified?: string | undefined;
63
+ } | undefined;
64
+ _meta?: Record<string, unknown> | undefined;
65
+ } | {
66
+ type: "audio";
67
+ data: string;
68
+ mimeType: string;
69
+ annotations?: {
70
+ audience?: ("user" | "assistant")[] | undefined;
71
+ priority?: number | undefined;
72
+ lastModified?: string | undefined;
73
+ } | undefined;
74
+ _meta?: Record<string, unknown> | undefined;
75
+ } | {
76
+ type: "resource";
77
+ resource: {
78
+ uri: string;
79
+ text: string;
80
+ mimeType?: string | undefined;
81
+ _meta?: Record<string, unknown> | undefined;
82
+ } | {
83
+ uri: string;
84
+ blob: string;
85
+ mimeType?: string | undefined;
86
+ _meta?: Record<string, unknown> | undefined;
87
+ };
88
+ annotations?: {
89
+ audience?: ("user" | "assistant")[] | undefined;
90
+ priority?: number | undefined;
91
+ lastModified?: string | undefined;
92
+ } | undefined;
93
+ _meta?: Record<string, unknown> | undefined;
94
+ } | {
95
+ uri: string;
96
+ name: string;
97
+ type: "resource_link";
98
+ description?: string | undefined;
99
+ mimeType?: string | undefined;
100
+ size?: number | undefined;
101
+ annotations?: {
102
+ audience?: ("user" | "assistant")[] | undefined;
103
+ priority?: number | undefined;
104
+ lastModified?: string | undefined;
105
+ } | undefined;
106
+ _meta?: {
107
+ [x: string]: unknown;
108
+ } | undefined;
109
+ icons?: {
110
+ src: string;
111
+ mimeType?: string | undefined;
112
+ sizes?: string[] | undefined;
113
+ theme?: "light" | "dark" | undefined;
114
+ }[] | undefined;
115
+ title?: string | undefined;
116
+ })[];
117
+ _meta?: {
118
+ [x: string]: unknown;
119
+ progressToken?: string | number | undefined;
120
+ "io.modelcontextprotocol/related-task"?: {
121
+ taskId: string;
122
+ } | undefined;
123
+ } | undefined;
124
+ structuredContent?: Record<string, unknown> | undefined;
125
+ isError?: boolean | undefined;
126
+ } | {
127
+ [x: string]: unknown;
128
+ toolResult: unknown;
129
+ _meta?: {
130
+ [x: string]: unknown;
131
+ progressToken?: string | number | undefined;
132
+ "io.modelcontextprotocol/related-task"?: {
133
+ taskId: string;
134
+ } | undefined;
135
+ } | undefined;
136
+ }>;
137
+ close(): Promise<void>;
138
+ }
@@ -0,0 +1,104 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
4
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
5
+ export class McpManager {
6
+ config;
7
+ connections;
8
+ closed;
9
+ constructor(config) {
10
+ this.config = config;
11
+ this.connections = new Map();
12
+ this.closed = false;
13
+ }
14
+ async connect(name) {
15
+ if (this.closed)
16
+ throw new Error("MCP 已关闭");
17
+ const spec = this.config().mcp.find((x) => x.name === name && x.enabled);
18
+ if (!spec)
19
+ throw new Error("MCP 服务未启用");
20
+ if (!this.connections.has(name))
21
+ this.connections.set(name, (async () => {
22
+ const client = new Client({ name: "dsh-synapse", version: "0.1.0" });
23
+ const transport = spec.transport === "stdio"
24
+ ? new StdioClientTransport({
25
+ command: spec.command,
26
+ args: JSON.parse(spec.argsJson),
27
+ env: {
28
+ PATH: process.env.PATH ?? "",
29
+ ...(process.env.SystemRoot
30
+ ? { SystemRoot: process.env.SystemRoot }
31
+ : {}),
32
+ ...JSON.parse(spec.envJson),
33
+ },
34
+ stderr: "ignore",
35
+ })
36
+ : spec.transport === "sse"
37
+ ? new SSEClientTransport(new URL(spec.url), {
38
+ requestInit: { headers: JSON.parse(spec.headersJson) },
39
+ })
40
+ : new StreamableHTTPClientTransport(new URL(spec.url), {
41
+ requestInit: { headers: JSON.parse(spec.headersJson) },
42
+ });
43
+ try {
44
+ await client.connect(transport, { timeout: 15000 });
45
+ if (this.closed) {
46
+ await client.close();
47
+ throw new Error("MCP 已关闭");
48
+ }
49
+ return client;
50
+ }
51
+ catch (e) {
52
+ await transport.close().catch(() => { });
53
+ this.connections.delete(name);
54
+ throw e;
55
+ }
56
+ })());
57
+ return this.connections.get(name);
58
+ }
59
+ async list(name) {
60
+ const c = await this.connect(name);
61
+ let cursor;
62
+ const tools = [];
63
+ do {
64
+ const result = await c.listTools(cursor ? { cursor } : undefined, {
65
+ timeout: 15000,
66
+ });
67
+ tools.push(...result.tools);
68
+ cursor = result.nextCursor;
69
+ if (tools.length > 2000)
70
+ throw new Error("MCP 工具数量超限");
71
+ } while (cursor);
72
+ return tools;
73
+ }
74
+ async available() {
75
+ const result = [];
76
+ for (const spec of this.config().mcp.filter((s) => s.enabled)) {
77
+ const allowed = new Set(spec.allowedTools.split(/\s+/).filter(Boolean));
78
+ if (!allowed.size)
79
+ continue;
80
+ for (const tool of await this.list(spec.name))
81
+ if (allowed.has(tool.name))
82
+ result.push({
83
+ server: spec.name,
84
+ rawName: tool.name,
85
+ name: `mcp_${result.length}`,
86
+ description: `${spec.name}/${tool.name}: ${tool.description || ""}`,
87
+ parameters: tool.inputSchema,
88
+ });
89
+ }
90
+ return result;
91
+ }
92
+ async call(tool, args) {
93
+ const spec = this.config().mcp.find((s) => s.name === tool.server && s.enabled);
94
+ if (!spec?.allowedTools.split(/\s+/).includes(tool.rawName))
95
+ throw new Error("工具不在允许列表");
96
+ return (await this.connect(tool.server)).callTool({ name: tool.rawName, arguments: args }, undefined, { timeout: 60000 });
97
+ }
98
+ async close() {
99
+ this.closed = true;
100
+ await Promise.allSettled([...this.connections.values()].map(async (p) => (await p).close()));
101
+ this.connections.clear();
102
+ }
103
+ }
104
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ConfigSource, Embeddings, MemoryItem } from "./types.js";
2
+ import Database from "better-sqlite3";
3
+ export declare const tokenize: (text: string) => string;
4
+ export declare function parseHermes(markdown: any, channel?: string): any[];
5
+ export declare class Memory {
6
+ inference: Embeddings;
7
+ config: ConfigSource;
8
+ db: Database.Database;
9
+ constructor(file: string, inference: Embeddings, config: ConfigSource);
10
+ addMany(items: MemoryItem[]): Promise<{
11
+ inserted: number;
12
+ duplicates: number;
13
+ }>;
14
+ remove(id: any): void;
15
+ search(query: any, channel: any): Promise<{
16
+ score: any;
17
+ id: number;
18
+ hash: string;
19
+ created: string;
20
+ channel: import("./types.js").Channel;
21
+ source: string;
22
+ text: string;
23
+ }[]>;
24
+ list(channel: any, limit?: number): unknown[];
25
+ close(): void;
26
+ }