@dsh-plugin/dsh-synapse 0.0.0-stage → 0.1.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 (149) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE.md +18 -0
  3. package/README.md +122 -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/model-smoke.mjs +25 -0
  59. package/src/agent.ts +203 -0
  60. package/src/bot.ts +173 -0
  61. package/src/client.ts +20 -0
  62. package/src/config.ts +217 -0
  63. package/src/files.ts +206 -0
  64. package/src/gateway.ts +276 -0
  65. package/src/github.ts +263 -0
  66. package/src/http.ts +41 -0
  67. package/src/index.ts +227 -0
  68. package/src/inference-worker.ts +89 -0
  69. package/src/mcp.ts +112 -0
  70. package/src/memory.ts +178 -0
  71. package/src/panel.html +174 -0
  72. package/src/panel.ts +440 -0
  73. package/src/runtime.ts +164 -0
  74. package/src/types.ts +106 -0
  75. package/test/core.test.mjs +279 -0
  76. package/test/fixtures/mcp-server.mjs +14 -0
  77. package/test/integration.test.mjs +253 -0
  78. package/test/panel.test.mjs +73 -0
  79. package/tsconfig.json +18 -0
  80. package/vendor/gugle-chat-bot/LICENSE +661 -0
  81. package/vendor/gugle-chat-bot/package.json +57 -0
  82. package/vendor/gugle-chat-bot/src/allow-rule.yml +9345 -0
  83. package/vendor/gugle-chat-bot/src/api.json +4285 -0
  84. package/vendor/gugle-chat-bot/src/command/index.ts +141 -0
  85. package/vendor/gugle-chat-bot/src/config/features.ts +548 -0
  86. package/vendor/gugle-chat-bot/src/config/index.ts +184 -0
  87. package/vendor/gugle-chat-bot/src/config/manager.ts +357 -0
  88. package/vendor/gugle-chat-bot/src/constants/index.ts +13 -0
  89. package/vendor/gugle-chat-bot/src/custom.ts +548 -0
  90. package/vendor/gugle-chat-bot/src/event/index.ts +118 -0
  91. package/vendor/gugle-chat-bot/src/features/admin/index.ts +414 -0
  92. package/vendor/gugle-chat-bot/src/features/bili/image/impl/video.ts +39 -0
  93. package/vendor/gugle-chat-bot/src/features/bili/image/index.ts +37 -0
  94. package/vendor/gugle-chat-bot/src/features/bili/index.ts +65 -0
  95. package/vendor/gugle-chat-bot/src/features/bili/template/style/video.css +97 -0
  96. package/vendor/gugle-chat-bot/src/features/bili/template/video.html +57 -0
  97. package/vendor/gugle-chat-bot/src/features/discord-bridge/index.ts +1128 -0
  98. package/vendor/gugle-chat-bot/src/features/discord-bridge/markdown.ts +105 -0
  99. package/vendor/gugle-chat-bot/src/features/discord-bridge/slash.ts +355 -0
  100. package/vendor/gugle-chat-bot/src/features/discord-bridge/source.ts +96 -0
  101. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/message.html +14 -0
  102. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/style/message.css +144 -0
  103. package/vendor/gugle-chat-bot/src/features/github/api.ts +93 -0
  104. package/vendor/gugle-chat-bot/src/features/github/binding.ts +161 -0
  105. package/vendor/gugle-chat-bot/src/features/github/image/impl/issue.ts +132 -0
  106. package/vendor/gugle-chat-bot/src/features/github/image/impl/pr.ts +144 -0
  107. package/vendor/gugle-chat-bot/src/features/github/image/impl/release.ts +160 -0
  108. package/vendor/gugle-chat-bot/src/features/github/image/index.ts +310 -0
  109. package/vendor/gugle-chat-bot/src/features/github/index.ts +302 -0
  110. package/vendor/gugle-chat-bot/src/features/github/template/issue.html +118 -0
  111. package/vendor/gugle-chat-bot/src/features/github/template/pull_request.html +125 -0
  112. package/vendor/gugle-chat-bot/src/features/github/template/release.html +53 -0
  113. package/vendor/gugle-chat-bot/src/features/github/template/style/issue.css +468 -0
  114. package/vendor/gugle-chat-bot/src/features/github/template/style/pull_request.css +469 -0
  115. package/vendor/gugle-chat-bot/src/features/github/template/style/release.css +412 -0
  116. package/vendor/gugle-chat-bot/src/features/hermes/client.ts +184 -0
  117. package/vendor/gugle-chat-bot/src/features/hermes/config.ts +210 -0
  118. package/vendor/gugle-chat-bot/src/features/hermes/context.ts +67 -0
  119. package/vendor/gugle-chat-bot/src/features/hermes/history.ts +86 -0
  120. package/vendor/gugle-chat-bot/src/features/hermes/index.ts +1533 -0
  121. package/vendor/gugle-chat-bot/src/features/hermes/message.ts +319 -0
  122. package/vendor/gugle-chat-bot/src/features/hermes/reaction.ts +181 -0
  123. package/vendor/gugle-chat-bot/src/features/hermes/render.ts +118 -0
  124. package/vendor/gugle-chat-bot/src/features/hermes/reply-units.ts +331 -0
  125. package/vendor/gugle-chat-bot/src/features/hermes/skills.ts +406 -0
  126. package/vendor/gugle-chat-bot/src/features/hermes/template/approval.html +30 -0
  127. package/vendor/gugle-chat-bot/src/features/hermes/template/progress.html +21 -0
  128. package/vendor/gugle-chat-bot/src/features/hermes/template/style/approval.css +81 -0
  129. package/vendor/gugle-chat-bot/src/features/hermes/template/style/progress.css +120 -0
  130. package/vendor/gugle-chat-bot/src/features/hermes/trigger.ts +86 -0
  131. package/vendor/gugle-chat-bot/src/features/hermes/types.ts +327 -0
  132. package/vendor/gugle-chat-bot/src/features/management/index.ts +156 -0
  133. package/vendor/gugle-chat-bot/src/features/minecraft/index.ts +127 -0
  134. package/vendor/gugle-chat-bot/src/features/modrinth/index.ts +71 -0
  135. package/vendor/gugle-chat-bot/src/features/parentheses/index.ts +117 -0
  136. package/vendor/gugle-chat-bot/src/features/peak-valley-timer/index.ts +452 -0
  137. package/vendor/gugle-chat-bot/src/features/poke/index.ts +24 -0
  138. package/vendor/gugle-chat-bot/src/features/version-tracker/index.ts +78 -0
  139. package/vendor/gugle-chat-bot/src/features/welcome/index.ts +58 -0
  140. package/vendor/gugle-chat-bot/src/github-ip.json +5814 -0
  141. package/vendor/gugle-chat-bot/src/image/index.ts +278 -0
  142. package/vendor/gugle-chat-bot/src/index.ts +695 -0
  143. package/vendor/gugle-chat-bot/src/logger/index.ts +54 -0
  144. package/vendor/gugle-chat-bot/src/result.json +359 -0
  145. package/vendor/gugle-chat-bot/src/type/bili.d.ts +825 -0
  146. package/vendor/gugle-chat-bot/src/type/event.d.ts +146 -0
  147. package/vendor/gugle-chat-bot/src/type/github.d.ts +446 -0
  148. package/vendor/gugle-chat-bot/src/type/index.d.ts +254 -0
  149. package/vendor/gugle-chat-bot/tsconfig.json +46 -0
@@ -0,0 +1,155 @@
1
+ import Database from "better-sqlite3";
2
+ import * as vec from "sqlite-vec";
3
+ import { createHash } from "node:crypto";
4
+ const channelCheck = (c) => {
5
+ if (!["chat", "review"].includes(c))
6
+ throw new Error("记忆分类无效");
7
+ return c;
8
+ };
9
+ // Whitespace-separated Han characters let unicode61 index Chinese without an external tokenizer.
10
+ export const tokenize = (text) => (text.toLowerCase().match(/[\p{Script=Han}]|[\p{L}\p{N}_]+/gu) || []).join(" ");
11
+ export function parseHermes(markdown, channel = "chat") {
12
+ channelCheck(channel);
13
+ if (typeof markdown !== "string" || markdown.length > 2000000)
14
+ throw new Error("记忆文档无效或超过 2 MB");
15
+ const chunks = [];
16
+ let heading = "Hermes memory", lines = [];
17
+ const flush = () => {
18
+ const content = lines.join("\n").trim();
19
+ if (content)
20
+ for (let i = 0; i < content.length; i += 1200)
21
+ chunks.push({
22
+ channel,
23
+ source: "hermes",
24
+ text: `${heading}\n${content.slice(i, i + 1200)}`,
25
+ });
26
+ lines = [];
27
+ };
28
+ const clean = markdown.replace(/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/, "");
29
+ let fenced = false;
30
+ for (const line of clean.split(/\r?\n/)) {
31
+ if (/^\s*(```|~~~)/.test(line))
32
+ fenced = !fenced;
33
+ const match = !fenced && line.match(/^#{1,6}\s+(.+)/);
34
+ if (match) {
35
+ flush();
36
+ heading = match[1];
37
+ }
38
+ else
39
+ lines.push(line);
40
+ }
41
+ flush();
42
+ return chunks;
43
+ }
44
+ export class Memory {
45
+ inference;
46
+ config;
47
+ db;
48
+ constructor(file, inference, config) {
49
+ this.inference = inference;
50
+ this.config = config;
51
+ this.db = new Database(file);
52
+ this.db.pragma("journal_mode = WAL");
53
+ this.db.pragma("busy_timeout = 5000");
54
+ vec.load(this.db);
55
+ this.db
56
+ .exec(`CREATE TABLE IF NOT EXISTS memories(id INTEGER PRIMARY KEY, channel TEXT NOT NULL, source TEXT NOT NULL, text TEXT NOT NULL, hash TEXT NOT NULL UNIQUE, created TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP);
57
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(tokens);
58
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_vec USING vec0(id INTEGER PRIMARY KEY, embedding float[512], channel TEXT partition key);
59
+ CREATE TABLE IF NOT EXISTS deliveries(id TEXT PRIMARY KEY, event TEXT NOT NULL, payload TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'pending', attempts INTEGER NOT NULL DEFAULT 0, error TEXT, result TEXT, updated TEXT DEFAULT CURRENT_TIMESTAMP);`);
60
+ }
61
+ async addMany(items) {
62
+ const ready = [];
63
+ for (const item of items) {
64
+ channelCheck(item.channel);
65
+ if (!item.text?.trim())
66
+ continue;
67
+ const hash = createHash("sha256")
68
+ .update(item.channel + "\0" + item.text)
69
+ .digest("hex");
70
+ if (this.db.prepare("SELECT 1 FROM memories WHERE hash=?").get(hash))
71
+ continue;
72
+ const embedding = await this.inference.embed(item.text);
73
+ if (embedding.length !== 512 ||
74
+ embedding.some((n) => !Number.isFinite(n)))
75
+ throw new Error("嵌入维度或数值无效");
76
+ ready.push({ ...item, hash, embedding: Float32Array.from(embedding) });
77
+ }
78
+ return this.db.transaction(() => {
79
+ let count = 0;
80
+ for (const item of ready) {
81
+ const result = this.db
82
+ .prepare("INSERT OR IGNORE INTO memories(channel,source,text,hash) VALUES(?,?,?,?)")
83
+ .run(item.channel, item.source, item.text, item.hash);
84
+ if (!result.changes)
85
+ continue;
86
+ const id = BigInt(result.lastInsertRowid);
87
+ this.db
88
+ .prepare("INSERT INTO memory_fts(rowid,tokens) VALUES(?,?)")
89
+ .run(id, tokenize(item.text));
90
+ this.db
91
+ .prepare("INSERT INTO memory_vec(id,embedding,channel) VALUES(?,?,?)")
92
+ .run(id, item.embedding, item.channel);
93
+ count++;
94
+ }
95
+ const old = this.db
96
+ .prepare("SELECT id FROM memories ORDER BY id DESC LIMIT -1 OFFSET ?")
97
+ .all(this.config().maxMemories);
98
+ for (const { id } of old)
99
+ this.remove(id);
100
+ return { inserted: count, duplicates: items.length - count };
101
+ })();
102
+ }
103
+ remove(id) {
104
+ this.db.prepare("DELETE FROM memory_vec WHERE id=?").run(BigInt(id));
105
+ this.db.prepare("DELETE FROM memory_fts WHERE rowid=?").run(id);
106
+ this.db.prepare("DELETE FROM memories WHERE id=?").run(id);
107
+ }
108
+ async search(query, channel) {
109
+ channelCheck(channel);
110
+ const c = this.config();
111
+ if (!c.ragEnabled)
112
+ return [];
113
+ const embedding = Float32Array.from(await this.inference.embed(query, true));
114
+ const vectors = this.db
115
+ .prepare("SELECT id,distance FROM memory_vec WHERE embedding MATCH ? AND k=? AND channel=? ORDER BY distance")
116
+ .all(embedding, c.recallK, channel);
117
+ const terms = [
118
+ ...new Set(tokenize(query).split(" ").filter(Boolean)),
119
+ ].slice(0, 64);
120
+ const lexical = terms.length
121
+ ? this.db
122
+ .prepare("SELECT f.rowid AS id FROM memory_fts f JOIN memories m ON m.id=f.rowid WHERE memory_fts MATCH ? AND m.channel=? ORDER BY rank LIMIT ?")
123
+ .all(terms.map((t) => '"' + t.replaceAll('"', '""') + '"').join(" OR "), channel, c.recallK)
124
+ : [];
125
+ const scores = new Map();
126
+ for (const rows of [vectors, lexical])
127
+ rows.forEach(({ id }, i) => scores.set(id, (scores.get(id) || 0) + 1 / (60 + i + 1)));
128
+ let results = [...scores]
129
+ .sort((a, b) => b[1] - a[1])
130
+ .slice(0, c.recallK)
131
+ .map(([id, score]) => ({
132
+ ...this.db
133
+ .prepare("SELECT * FROM memories WHERE id=?")
134
+ .get(id),
135
+ score,
136
+ }));
137
+ if (c.reranker && results.length) {
138
+ const ranks = await this.inference.rerank(query, results.map((x) => x.text));
139
+ results = results
140
+ .map((x, i) => ({ ...x, score: ranks[i] }))
141
+ .sort((a, b) => b.score - a.score);
142
+ }
143
+ return results.slice(0, c.memoryK);
144
+ }
145
+ list(channel, limit = 100) {
146
+ channelCheck(channel);
147
+ return this.db
148
+ .prepare("SELECT * FROM memories WHERE channel=? ORDER BY id DESC LIMIT ?")
149
+ .all(channel, limit);
150
+ }
151
+ close() {
152
+ this.db.close();
153
+ }
154
+ }
155
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,174 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <meta charset="utf-8" /><meta
4
+ name="viewport"
5
+ content="width=device-width,initial-scale=1"
6
+ /><title>Synapse · 通道与记忆</title>
7
+ <style>
8
+ :root {
9
+ color-scheme: light dark;
10
+ font-family: system-ui, sans-serif;
11
+ background: Canvas;
12
+ color: CanvasText;
13
+ }
14
+ * {
15
+ box-sizing: border-box;
16
+ }
17
+ body {
18
+ margin: 0;
19
+ }
20
+ main {
21
+ max-width: 1100px;
22
+ margin: auto;
23
+ padding: 32px 24px;
24
+ }
25
+ header {
26
+ display: flex;
27
+ justify-content: space-between;
28
+ align-items: center;
29
+ gap: 20px;
30
+ }
31
+ h1 {
32
+ margin: 0;
33
+ font-size: 32px;
34
+ }
35
+ header p {
36
+ opacity: 0.65;
37
+ }
38
+ nav {
39
+ display: flex;
40
+ gap: 8px;
41
+ flex-wrap: wrap;
42
+ border-bottom: 1px solid #8885;
43
+ padding: 20px 0;
44
+ }
45
+ button,
46
+ input,
47
+ textarea,
48
+ select {
49
+ font: inherit;
50
+ color: inherit;
51
+ background: transparent;
52
+ border: 1px solid #8887;
53
+ border-radius: 7px;
54
+ padding: 9px;
55
+ }
56
+ button {
57
+ cursor: pointer;
58
+ }
59
+ button:hover,
60
+ button[aria-selected="true"] {
61
+ background: #34877825;
62
+ border-color: #348778;
63
+ }
64
+ button:disabled {
65
+ opacity: 0.5;
66
+ cursor: wait;
67
+ }
68
+ textarea {
69
+ width: 100%;
70
+ min-height: 180px;
71
+ resize: vertical;
72
+ font:
73
+ 14px/1.6 ui-monospace,
74
+ monospace;
75
+ }
76
+ input:not([type="checkbox"]),
77
+ select {
78
+ width: 100%;
79
+ }
80
+ label {
81
+ display: block;
82
+ margin: 12px 0 5px;
83
+ }
84
+ fieldset {
85
+ border: 1px solid #8885;
86
+ border-radius: 10px;
87
+ padding: 18px;
88
+ margin: 18px 0;
89
+ min-width: 0;
90
+ }
91
+ legend {
92
+ padding: 0 8px;
93
+ font-weight: 600;
94
+ }
95
+ section {
96
+ padding: 18px 0;
97
+ }
98
+ pre {
99
+ white-space: pre-wrap;
100
+ overflow-wrap: anywhere;
101
+ max-height: 500px;
102
+ overflow: auto;
103
+ padding: 16px;
104
+ border: 1px solid #8885;
105
+ border-radius: 8px;
106
+ }
107
+ article {
108
+ border-bottom: 1px solid #8885;
109
+ padding: 12px 0;
110
+ }
111
+ .actions {
112
+ display: flex;
113
+ gap: 8px;
114
+ flex-wrap: wrap;
115
+ margin: 12px 0;
116
+ }
117
+ .muted {
118
+ font-size: 13px;
119
+ opacity: 0.7;
120
+ }
121
+ #notice {
122
+ min-height: 24px;
123
+ padding: 12px 0;
124
+ }
125
+ #notice.error {
126
+ color: #d85050;
127
+ }
128
+ .two {
129
+ display: grid;
130
+ grid-template-columns: 1fr 2fr;
131
+ gap: 24px;
132
+ }
133
+ .row {
134
+ padding: 12px;
135
+ border-left: 2px solid #348778;
136
+ margin: 10px 0;
137
+ }
138
+ details {
139
+ padding: 8px 0;
140
+ }
141
+ summary {
142
+ cursor: pointer;
143
+ }
144
+ @media (max-width: 650px) {
145
+ main {
146
+ padding: 20px 12px;
147
+ }
148
+ .two {
149
+ grid-template-columns: 1fr;
150
+ }
151
+ header {
152
+ display: block;
153
+ }
154
+ }
155
+ </style>
156
+ <main>
157
+ <header>
158
+ <div>
159
+ <h1>Synapse</h1>
160
+ <p>QQ · Discord · GitHub,共享知识,各司其职。</p>
161
+ </div>
162
+ <span id="status">正在连接 DSH…</span>
163
+ </header>
164
+ <nav aria-label="管理模块" id="tabs"></nav>
165
+ <div id="notice" role="status" aria-live="polite"></div>
166
+ <div id="content"></div>
167
+ <footer class="muted">
168
+ 配置保存在当前 DSH
169
+ profile。模型首次使用时下载;聊天与审查记忆分开检索。<br />AGPL-3.0 ·
170
+ <a href="https://github.com/dsh-plugins/dsh-synapse">获取完整源码</a>
171
+ </footer>
172
+ </main>
173
+ <script type="module" src="/synapse-panel.js"></script>
174
+ </html>