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

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 +30 -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,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>