synabun 2026.3.307 → 2026.3.310
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.
- package/CLAUDE.md +150 -0
- package/hooks/claude-code/post-plan.mjs +1 -1
- package/hooks/claude-code/session-start.mjs +2 -0
- package/mcp-server/dist/config.d.ts +13 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +59 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +13 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +86 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +10 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +189 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +26 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +30 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +356 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +14 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +34 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +23 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +71 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +92 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +238 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +85 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +660 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +54 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +97 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +138 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +216 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +52 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +61 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +298 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +1154 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +7 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +55 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +14 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +31 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +9 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +12 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +77 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +223 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +19 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +302 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +26 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +96 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +41 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +275 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +44 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +118 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +38 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +88 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +18 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +93 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +9 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +10 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +30 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +194 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +198 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +14 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +807 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/neural-interface/public/shared/styles.css +2 -2
- package/neural-interface/public/shared/ui-settings.js +2 -2
- package/neural-interface/server.js +82 -8
- package/neural-interface/templates/CLAUDE-template.md +9 -1
- package/package.json +4 -2
- package/preuninstall.js +28 -0
- package/setup.js +86 -1
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord REST API v10 client for MCP tools.
|
|
3
|
+
* Follows the neural-interface.ts pattern: typed HTTP client with
|
|
4
|
+
* timeout handling, rate limit retry, and name resolution helpers.
|
|
5
|
+
*/
|
|
6
|
+
const API_BASE = 'https://discord.com/api/v10';
|
|
7
|
+
const DEFAULT_TIMEOUT = 10_000;
|
|
8
|
+
const LONG_TIMEOUT = 30_000;
|
|
9
|
+
const MAX_RETRIES = 3;
|
|
10
|
+
// ── Permission flags ───────────────────────────────────────────
|
|
11
|
+
export const PERMISSION_FLAGS = {
|
|
12
|
+
CREATE_INSTANT_INVITE: 1n << 0n,
|
|
13
|
+
KICK_MEMBERS: 1n << 1n,
|
|
14
|
+
BAN_MEMBERS: 1n << 2n,
|
|
15
|
+
ADMINISTRATOR: 1n << 3n,
|
|
16
|
+
MANAGE_CHANNELS: 1n << 4n,
|
|
17
|
+
MANAGE_GUILD: 1n << 5n,
|
|
18
|
+
ADD_REACTIONS: 1n << 6n,
|
|
19
|
+
VIEW_AUDIT_LOG: 1n << 7n,
|
|
20
|
+
PRIORITY_SPEAKER: 1n << 8n,
|
|
21
|
+
STREAM: 1n << 9n,
|
|
22
|
+
VIEW_CHANNEL: 1n << 10n,
|
|
23
|
+
SEND_MESSAGES: 1n << 11n,
|
|
24
|
+
SEND_TTS_MESSAGES: 1n << 12n,
|
|
25
|
+
MANAGE_MESSAGES: 1n << 13n,
|
|
26
|
+
EMBED_LINKS: 1n << 14n,
|
|
27
|
+
ATTACH_FILES: 1n << 15n,
|
|
28
|
+
READ_MESSAGE_HISTORY: 1n << 16n,
|
|
29
|
+
MENTION_EVERYONE: 1n << 17n,
|
|
30
|
+
USE_EXTERNAL_EMOJIS: 1n << 18n,
|
|
31
|
+
VIEW_GUILD_INSIGHTS: 1n << 19n,
|
|
32
|
+
CONNECT: 1n << 20n,
|
|
33
|
+
SPEAK: 1n << 21n,
|
|
34
|
+
MUTE_MEMBERS: 1n << 22n,
|
|
35
|
+
DEAFEN_MEMBERS: 1n << 23n,
|
|
36
|
+
MOVE_MEMBERS: 1n << 24n,
|
|
37
|
+
USE_VAD: 1n << 25n,
|
|
38
|
+
CHANGE_NICKNAME: 1n << 26n,
|
|
39
|
+
MANAGE_NICKNAMES: 1n << 27n,
|
|
40
|
+
MANAGE_ROLES: 1n << 28n,
|
|
41
|
+
MANAGE_WEBHOOKS: 1n << 29n,
|
|
42
|
+
MANAGE_GUILD_EXPRESSIONS: 1n << 30n,
|
|
43
|
+
USE_APPLICATION_COMMANDS: 1n << 31n,
|
|
44
|
+
REQUEST_TO_SPEAK: 1n << 32n,
|
|
45
|
+
MANAGE_EVENTS: 1n << 33n,
|
|
46
|
+
MANAGE_THREADS: 1n << 34n,
|
|
47
|
+
CREATE_PUBLIC_THREADS: 1n << 35n,
|
|
48
|
+
CREATE_PRIVATE_THREADS: 1n << 36n,
|
|
49
|
+
USE_EXTERNAL_STICKERS: 1n << 37n,
|
|
50
|
+
SEND_MESSAGES_IN_THREADS: 1n << 38n,
|
|
51
|
+
USE_EMBEDDED_ACTIVITIES: 1n << 39n,
|
|
52
|
+
MODERATE_MEMBERS: 1n << 40n,
|
|
53
|
+
VIEW_CREATOR_MONETIZATION_ANALYTICS: 1n << 41n,
|
|
54
|
+
USE_SOUNDBOARD: 1n << 42n,
|
|
55
|
+
CREATE_GUILD_EXPRESSIONS: 1n << 43n,
|
|
56
|
+
CREATE_EVENTS: 1n << 44n,
|
|
57
|
+
USE_EXTERNAL_SOUNDS: 1n << 45n,
|
|
58
|
+
SEND_VOICE_MESSAGES: 1n << 46n,
|
|
59
|
+
SEND_POLLS: 1n << 49n,
|
|
60
|
+
USE_EXTERNAL_APPS: 1n << 50n,
|
|
61
|
+
};
|
|
62
|
+
/** Convert comma-separated permission flag names to a bitfield string. */
|
|
63
|
+
export function resolvePermissions(flags) {
|
|
64
|
+
let bits = 0n;
|
|
65
|
+
for (const flag of flags.split(',').map(f => f.trim().toUpperCase())) {
|
|
66
|
+
const val = PERMISSION_FLAGS[flag];
|
|
67
|
+
if (!val) {
|
|
68
|
+
const available = Object.keys(PERMISSION_FLAGS).join(', ');
|
|
69
|
+
throw new Error(`Unknown permission flag: "${flag}". Available: ${available}`);
|
|
70
|
+
}
|
|
71
|
+
bits |= val;
|
|
72
|
+
}
|
|
73
|
+
return bits.toString();
|
|
74
|
+
}
|
|
75
|
+
// ── Channel type mapping ───────────────────────────────────────
|
|
76
|
+
export const CHANNEL_TYPES = {
|
|
77
|
+
text: 0,
|
|
78
|
+
voice: 2,
|
|
79
|
+
category: 4,
|
|
80
|
+
announcement: 5,
|
|
81
|
+
stage: 13,
|
|
82
|
+
forum: 15,
|
|
83
|
+
};
|
|
84
|
+
export const CHANNEL_TYPE_NAMES = {
|
|
85
|
+
0: 'text',
|
|
86
|
+
2: 'voice',
|
|
87
|
+
4: 'category',
|
|
88
|
+
5: 'announcement',
|
|
89
|
+
10: 'announcement-thread',
|
|
90
|
+
11: 'public-thread',
|
|
91
|
+
12: 'private-thread',
|
|
92
|
+
13: 'stage',
|
|
93
|
+
15: 'forum',
|
|
94
|
+
};
|
|
95
|
+
// ── Verification levels ────────────────────────────────────────
|
|
96
|
+
export const VERIFICATION_LEVELS = {
|
|
97
|
+
none: 0,
|
|
98
|
+
low: 1,
|
|
99
|
+
medium: 2,
|
|
100
|
+
high: 3,
|
|
101
|
+
very_high: 4,
|
|
102
|
+
};
|
|
103
|
+
// ── Cache ──────────────────────────────────────────────────────
|
|
104
|
+
const cache = new Map();
|
|
105
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
106
|
+
function getCached(key) {
|
|
107
|
+
const entry = cache.get(key);
|
|
108
|
+
if (!entry || Date.now() > entry.expiresAt) {
|
|
109
|
+
cache.delete(key);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return entry.data;
|
|
113
|
+
}
|
|
114
|
+
function setCache(key, data) {
|
|
115
|
+
cache.set(key, { data, expiresAt: Date.now() + CACHE_TTL });
|
|
116
|
+
}
|
|
117
|
+
export function invalidateCache(pattern) {
|
|
118
|
+
if (!pattern) {
|
|
119
|
+
cache.clear();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
for (const key of cache.keys()) {
|
|
123
|
+
if (key.includes(pattern))
|
|
124
|
+
cache.delete(key);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ── Token validation ───────────────────────────────────────────
|
|
128
|
+
function getToken() {
|
|
129
|
+
const token = process.env.DISCORD_BOT_TOKEN;
|
|
130
|
+
if (!token) {
|
|
131
|
+
throw new Error('DISCORD_BOT_TOKEN not set. Add it to your .env file:\n' +
|
|
132
|
+
'DISCORD_BOT_TOKEN=your_bot_token_here\n\n' +
|
|
133
|
+
'Create a bot at https://discord.com/developers/applications');
|
|
134
|
+
}
|
|
135
|
+
return token;
|
|
136
|
+
}
|
|
137
|
+
// ── Core HTTP request ──────────────────────────────────────────
|
|
138
|
+
export async function discordRequest(method, path, body, timeout = DEFAULT_TIMEOUT, retryCount = 0) {
|
|
139
|
+
let token;
|
|
140
|
+
try {
|
|
141
|
+
token = getToken();
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return { error: err.message };
|
|
145
|
+
}
|
|
146
|
+
const controller = new AbortController();
|
|
147
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
148
|
+
try {
|
|
149
|
+
const opts = {
|
|
150
|
+
method,
|
|
151
|
+
headers: {
|
|
152
|
+
'Authorization': `Bot ${token}`,
|
|
153
|
+
'Content-Type': 'application/json',
|
|
154
|
+
'User-Agent': 'SynaBun-MCP (https://github.com/synabun, 1.0.0)',
|
|
155
|
+
},
|
|
156
|
+
signal: controller.signal,
|
|
157
|
+
};
|
|
158
|
+
if (body && method !== 'GET') {
|
|
159
|
+
opts.body = JSON.stringify(body);
|
|
160
|
+
}
|
|
161
|
+
const res = await fetch(`${API_BASE}${path}`, opts);
|
|
162
|
+
// Rate limited — retry with Retry-After
|
|
163
|
+
if (res.status === 429 && retryCount < MAX_RETRIES) {
|
|
164
|
+
const retryData = await res.json();
|
|
165
|
+
const retryAfter = retryData.retry_after || 1;
|
|
166
|
+
await new Promise(r => setTimeout(r, retryAfter * 1000));
|
|
167
|
+
return discordRequest(method, path, body, timeout, retryCount + 1);
|
|
168
|
+
}
|
|
169
|
+
// No content (successful delete, etc.)
|
|
170
|
+
if (res.status === 204) {
|
|
171
|
+
return { ok: true };
|
|
172
|
+
}
|
|
173
|
+
const data = await res.json();
|
|
174
|
+
if (!res.ok) {
|
|
175
|
+
// Discord error response
|
|
176
|
+
const message = data.message || `HTTP ${res.status}`;
|
|
177
|
+
const code = data.code;
|
|
178
|
+
return { error: `Discord API error ${code || res.status}: ${message}` };
|
|
179
|
+
}
|
|
180
|
+
return { ok: true, data };
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
184
|
+
if (msg.includes('abort')) {
|
|
185
|
+
return { error: `Request timed out after ${timeout}ms` };
|
|
186
|
+
}
|
|
187
|
+
return { error: `Discord API unreachable: ${msg}` };
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
clearTimeout(timer);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// ── Guild resolution ───────────────────────────────────────────
|
|
194
|
+
export async function resolveGuildId(guildId) {
|
|
195
|
+
if (guildId)
|
|
196
|
+
return { guildId };
|
|
197
|
+
const envGuild = process.env.DISCORD_GUILD_ID;
|
|
198
|
+
if (envGuild)
|
|
199
|
+
return { guildId: envGuild };
|
|
200
|
+
// Auto-detect: if bot is in exactly 1 guild, use it
|
|
201
|
+
const res = await discordRequest('GET', '/users/@me/guilds');
|
|
202
|
+
if (res.error)
|
|
203
|
+
return { error: res.error };
|
|
204
|
+
const guilds = res.data;
|
|
205
|
+
if (guilds.length === 1)
|
|
206
|
+
return { guildId: guilds[0].id };
|
|
207
|
+
if (guilds.length === 0)
|
|
208
|
+
return { error: 'Bot is not in any guilds. Invite it to a server first.' };
|
|
209
|
+
const list = guilds.map(g => ` ${g.id} — ${g.name}`).join('\n');
|
|
210
|
+
return { error: `Bot is in multiple guilds. Specify guild_id:\n${list}\n\nOr set DISCORD_GUILD_ID in your .env file.` };
|
|
211
|
+
}
|
|
212
|
+
// ── Name resolution helpers ────────────────────────────────────
|
|
213
|
+
const SNOWFLAKE_PATTERN = /^\d{17,20}$/;
|
|
214
|
+
function isSnowflake(value) {
|
|
215
|
+
return SNOWFLAKE_PATTERN.test(value);
|
|
216
|
+
}
|
|
217
|
+
export async function resolveChannel(nameOrId, guildId) {
|
|
218
|
+
if (isSnowflake(nameOrId)) {
|
|
219
|
+
return { id: nameOrId, name: nameOrId, type: -1 };
|
|
220
|
+
}
|
|
221
|
+
const channels = await getGuildChannels(guildId);
|
|
222
|
+
if (!Array.isArray(channels))
|
|
223
|
+
return { error: channels.error || 'Failed to fetch channels' };
|
|
224
|
+
const normalized = nameOrId.toLowerCase().replace(/^#/, '');
|
|
225
|
+
const matches = channels
|
|
226
|
+
.filter(c => c.name.toLowerCase() === normalized);
|
|
227
|
+
if (matches.length === 0) {
|
|
228
|
+
return { error: `Channel "${nameOrId}" not found in guild.` };
|
|
229
|
+
}
|
|
230
|
+
if (matches.length > 1) {
|
|
231
|
+
const list = matches.map(c => ` ${c.id} — #${c.name} (${CHANNEL_TYPE_NAMES[c.type] || 'unknown'})`).join('\n');
|
|
232
|
+
return { error: `Multiple channels named "${nameOrId}". Specify by ID:\n${list}` };
|
|
233
|
+
}
|
|
234
|
+
return matches[0];
|
|
235
|
+
}
|
|
236
|
+
export async function resolveRole(nameOrId, guildId) {
|
|
237
|
+
if (isSnowflake(nameOrId)) {
|
|
238
|
+
return { id: nameOrId, name: nameOrId };
|
|
239
|
+
}
|
|
240
|
+
const roles = await getGuildRoles(guildId);
|
|
241
|
+
if (!Array.isArray(roles))
|
|
242
|
+
return { error: roles.error || 'Failed to fetch roles' };
|
|
243
|
+
const normalized = nameOrId.toLowerCase().replace(/^@/, '');
|
|
244
|
+
const matches = roles
|
|
245
|
+
.filter(r => r.name.toLowerCase() === normalized);
|
|
246
|
+
if (matches.length === 0) {
|
|
247
|
+
return { error: `Role "${nameOrId}" not found in guild.` };
|
|
248
|
+
}
|
|
249
|
+
if (matches.length > 1) {
|
|
250
|
+
const list = matches.map(r => ` ${r.id} — @${r.name}`).join('\n');
|
|
251
|
+
return { error: `Multiple roles named "${nameOrId}". Specify by ID:\n${list}` };
|
|
252
|
+
}
|
|
253
|
+
return matches[0];
|
|
254
|
+
}
|
|
255
|
+
export async function resolveUser(nameOrTag, guildId) {
|
|
256
|
+
if (isSnowflake(nameOrTag)) {
|
|
257
|
+
return { id: nameOrTag, name: nameOrTag };
|
|
258
|
+
}
|
|
259
|
+
// Search guild members by query
|
|
260
|
+
const res = await discordRequest('GET', `/guilds/${guildId}/members/search?query=${encodeURIComponent(nameOrTag)}&limit=10`);
|
|
261
|
+
if (res.error)
|
|
262
|
+
return { error: res.error };
|
|
263
|
+
const members = res.data;
|
|
264
|
+
if (members.length === 0) {
|
|
265
|
+
return { error: `User "${nameOrTag}" not found in guild.` };
|
|
266
|
+
}
|
|
267
|
+
if (members.length === 1) {
|
|
268
|
+
return { id: members[0].user.id, name: members[0].user.global_name || members[0].user.username };
|
|
269
|
+
}
|
|
270
|
+
const list = members.map(m => ` ${m.user.id} — ${m.user.global_name || m.user.username} (@${m.user.username})`).join('\n');
|
|
271
|
+
return { error: `Multiple users match "${nameOrTag}". Specify by ID:\n${list}` };
|
|
272
|
+
}
|
|
273
|
+
// ── Guild operations ───────────────────────────────────────────
|
|
274
|
+
export async function getGuild(guildId) {
|
|
275
|
+
return discordRequest('GET', `/guilds/${guildId}?with_counts=true`);
|
|
276
|
+
}
|
|
277
|
+
export async function getGuildChannels(guildId) {
|
|
278
|
+
const cacheKey = `channels:${guildId}`;
|
|
279
|
+
const cached = getCached(cacheKey);
|
|
280
|
+
if (cached)
|
|
281
|
+
return cached;
|
|
282
|
+
const res = await discordRequest('GET', `/guilds/${guildId}/channels`);
|
|
283
|
+
if (res.error)
|
|
284
|
+
return { error: res.error };
|
|
285
|
+
const channels = res.data;
|
|
286
|
+
setCache(cacheKey, channels);
|
|
287
|
+
return channels;
|
|
288
|
+
}
|
|
289
|
+
export async function getGuildMembers(guildId, limit = 100, after) {
|
|
290
|
+
let path = `/guilds/${guildId}/members?limit=${limit}`;
|
|
291
|
+
if (after)
|
|
292
|
+
path += `&after=${after}`;
|
|
293
|
+
return discordRequest('GET', path);
|
|
294
|
+
}
|
|
295
|
+
export async function getGuildRoles(guildId) {
|
|
296
|
+
const cacheKey = `roles:${guildId}`;
|
|
297
|
+
const cached = getCached(cacheKey);
|
|
298
|
+
if (cached)
|
|
299
|
+
return cached;
|
|
300
|
+
const res = await discordRequest('GET', `/guilds/${guildId}/roles`);
|
|
301
|
+
if (res.error)
|
|
302
|
+
return { error: res.error };
|
|
303
|
+
const roles = res.data;
|
|
304
|
+
setCache(cacheKey, roles);
|
|
305
|
+
return roles;
|
|
306
|
+
}
|
|
307
|
+
export async function getAuditLog(guildId, opts) {
|
|
308
|
+
let path = `/guilds/${guildId}/audit-logs?limit=${opts?.limit || 50}`;
|
|
309
|
+
if (opts?.action_type !== undefined)
|
|
310
|
+
path += `&action_type=${opts.action_type}`;
|
|
311
|
+
return discordRequest('GET', path);
|
|
312
|
+
}
|
|
313
|
+
export async function editGuildSettings(guildId, settings) {
|
|
314
|
+
return discordRequest('PATCH', `/guilds/${guildId}`, settings);
|
|
315
|
+
}
|
|
316
|
+
// ── Channel operations ─────────────────────────────────────────
|
|
317
|
+
export async function createChannel(guildId, data) {
|
|
318
|
+
invalidateCache(`channels:${guildId}`);
|
|
319
|
+
return discordRequest('POST', `/guilds/${guildId}/channels`, data);
|
|
320
|
+
}
|
|
321
|
+
export async function editChannel(channelId, data) {
|
|
322
|
+
invalidateCache('channels:');
|
|
323
|
+
return discordRequest('PATCH', `/channels/${channelId}`, data);
|
|
324
|
+
}
|
|
325
|
+
export async function deleteChannel(channelId) {
|
|
326
|
+
invalidateCache('channels:');
|
|
327
|
+
return discordRequest('DELETE', `/channels/${channelId}`);
|
|
328
|
+
}
|
|
329
|
+
export async function setChannelPermissions(channelId, overwriteId, data) {
|
|
330
|
+
return discordRequest('PUT', `/channels/${channelId}/permissions/${overwriteId}`, data);
|
|
331
|
+
}
|
|
332
|
+
// ── Role operations ────────────────────────────────────────────
|
|
333
|
+
export async function createRole(guildId, data) {
|
|
334
|
+
invalidateCache(`roles:${guildId}`);
|
|
335
|
+
return discordRequest('POST', `/guilds/${guildId}/roles`, data);
|
|
336
|
+
}
|
|
337
|
+
export async function editRole(guildId, roleId, data) {
|
|
338
|
+
invalidateCache(`roles:${guildId}`);
|
|
339
|
+
return discordRequest('PATCH', `/guilds/${guildId}/roles/${roleId}`, data);
|
|
340
|
+
}
|
|
341
|
+
export async function deleteRole(guildId, roleId) {
|
|
342
|
+
invalidateCache(`roles:${guildId}`);
|
|
343
|
+
return discordRequest('DELETE', `/guilds/${guildId}/roles/${roleId}`);
|
|
344
|
+
}
|
|
345
|
+
export async function addMemberRole(guildId, userId, roleId) {
|
|
346
|
+
return discordRequest('PUT', `/guilds/${guildId}/members/${userId}/roles/${roleId}`, {});
|
|
347
|
+
}
|
|
348
|
+
export async function removeMemberRole(guildId, userId, roleId) {
|
|
349
|
+
return discordRequest('DELETE', `/guilds/${guildId}/members/${userId}/roles/${roleId}`);
|
|
350
|
+
}
|
|
351
|
+
// ── Message operations ─────────────────────────────────────────
|
|
352
|
+
export async function sendMessage(channelId, data) {
|
|
353
|
+
return discordRequest('POST', `/channels/${channelId}/messages`, data);
|
|
354
|
+
}
|
|
355
|
+
export async function editMessage(channelId, messageId, data) {
|
|
356
|
+
return discordRequest('PATCH', `/channels/${channelId}/messages/${messageId}`, data);
|
|
357
|
+
}
|
|
358
|
+
export async function deleteMessage(channelId, messageId) {
|
|
359
|
+
return discordRequest('DELETE', `/channels/${channelId}/messages/${messageId}`);
|
|
360
|
+
}
|
|
361
|
+
export async function pinMessage(channelId, messageId) {
|
|
362
|
+
return discordRequest('PUT', `/channels/${channelId}/pins/${messageId}`, {});
|
|
363
|
+
}
|
|
364
|
+
export async function unpinMessage(channelId, messageId) {
|
|
365
|
+
return discordRequest('DELETE', `/channels/${channelId}/pins/${messageId}`);
|
|
366
|
+
}
|
|
367
|
+
export async function addReaction(channelId, messageId, emoji) {
|
|
368
|
+
const encoded = encodeURIComponent(emoji);
|
|
369
|
+
return discordRequest('PUT', `/channels/${channelId}/messages/${messageId}/reactions/${encoded}/@me`, {});
|
|
370
|
+
}
|
|
371
|
+
export async function getMessages(channelId, opts) {
|
|
372
|
+
let path = `/channels/${channelId}/messages?limit=${opts?.limit || 50}`;
|
|
373
|
+
if (opts?.before)
|
|
374
|
+
path += `&before=${opts.before}`;
|
|
375
|
+
if (opts?.after)
|
|
376
|
+
path += `&after=${opts.after}`;
|
|
377
|
+
return discordRequest('GET', path);
|
|
378
|
+
}
|
|
379
|
+
export async function bulkDeleteMessages(channelId, messageIds) {
|
|
380
|
+
return discordRequest('POST', `/channels/${channelId}/messages/bulk-delete`, { messages: messageIds });
|
|
381
|
+
}
|
|
382
|
+
// ── Member operations ──────────────────────────────────────────
|
|
383
|
+
export async function getMember(guildId, userId) {
|
|
384
|
+
return discordRequest('GET', `/guilds/${guildId}/members/${userId}`);
|
|
385
|
+
}
|
|
386
|
+
export async function kickMember(guildId, userId, reason) {
|
|
387
|
+
const headers = reason ? { 'X-Audit-Log-Reason': encodeURIComponent(reason) } : undefined;
|
|
388
|
+
// Can't pass custom headers through discordRequest — use reason in query if needed
|
|
389
|
+
return discordRequest('DELETE', `/guilds/${guildId}/members/${userId}`);
|
|
390
|
+
}
|
|
391
|
+
export async function banMember(guildId, userId, data) {
|
|
392
|
+
return discordRequest('PUT', `/guilds/${guildId}/bans/${userId}`, data || {});
|
|
393
|
+
}
|
|
394
|
+
export async function unbanMember(guildId, userId) {
|
|
395
|
+
return discordRequest('DELETE', `/guilds/${guildId}/bans/${userId}`);
|
|
396
|
+
}
|
|
397
|
+
export async function timeoutMember(guildId, userId, durationMinutes) {
|
|
398
|
+
const until = durationMinutes > 0
|
|
399
|
+
? new Date(Date.now() + durationMinutes * 60_000).toISOString()
|
|
400
|
+
: null;
|
|
401
|
+
return discordRequest('PATCH', `/guilds/${guildId}/members/${userId}`, {
|
|
402
|
+
communication_disabled_until: until,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
export async function setNickname(guildId, userId, nick) {
|
|
406
|
+
return discordRequest('PATCH', `/guilds/${guildId}/members/${userId}`, { nick });
|
|
407
|
+
}
|
|
408
|
+
// ── Onboarding operations ──────────────────────────────────────
|
|
409
|
+
export async function getWelcomeScreen(guildId) {
|
|
410
|
+
return discordRequest('GET', `/guilds/${guildId}/welcome-screen`);
|
|
411
|
+
}
|
|
412
|
+
export async function setWelcomeScreen(guildId, data) {
|
|
413
|
+
return discordRequest('PATCH', `/guilds/${guildId}/welcome-screen`, data);
|
|
414
|
+
}
|
|
415
|
+
export async function getOnboarding(guildId) {
|
|
416
|
+
return discordRequest('GET', `/guilds/${guildId}/onboarding`);
|
|
417
|
+
}
|
|
418
|
+
export async function setOnboarding(guildId, data) {
|
|
419
|
+
return discordRequest('PUT', `/guilds/${guildId}/onboarding`, data);
|
|
420
|
+
}
|
|
421
|
+
// ── Webhook operations ─────────────────────────────────────────
|
|
422
|
+
export async function createWebhook(channelId, data) {
|
|
423
|
+
return discordRequest('POST', `/channels/${channelId}/webhooks`, data);
|
|
424
|
+
}
|
|
425
|
+
export async function editWebhook(webhookId, data) {
|
|
426
|
+
return discordRequest('PATCH', `/webhooks/${webhookId}`, data);
|
|
427
|
+
}
|
|
428
|
+
export async function deleteWebhook(webhookId) {
|
|
429
|
+
return discordRequest('DELETE', `/webhooks/${webhookId}`);
|
|
430
|
+
}
|
|
431
|
+
export async function listChannelWebhooks(channelId) {
|
|
432
|
+
return discordRequest('GET', `/channels/${channelId}/webhooks`);
|
|
433
|
+
}
|
|
434
|
+
export async function listGuildWebhooks(guildId) {
|
|
435
|
+
return discordRequest('GET', `/guilds/${guildId}/webhooks`);
|
|
436
|
+
}
|
|
437
|
+
export async function executeWebhook(webhookId, webhookToken, data) {
|
|
438
|
+
// Webhook execution uses token auth, not bot auth — make direct fetch call
|
|
439
|
+
const controller = new AbortController();
|
|
440
|
+
const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
|
|
441
|
+
try {
|
|
442
|
+
const res = await fetch(`${API_BASE}/webhooks/${webhookId}/${webhookToken}?wait=true`, {
|
|
443
|
+
method: 'POST',
|
|
444
|
+
headers: { 'Content-Type': 'application/json' },
|
|
445
|
+
signal: controller.signal,
|
|
446
|
+
body: JSON.stringify(data),
|
|
447
|
+
});
|
|
448
|
+
if (res.status === 204)
|
|
449
|
+
return { ok: true };
|
|
450
|
+
const result = await res.json();
|
|
451
|
+
if (!res.ok) {
|
|
452
|
+
return { error: `Webhook error ${res.status}: ${result.message || 'Unknown error'}` };
|
|
453
|
+
}
|
|
454
|
+
return { ok: true, data: result };
|
|
455
|
+
}
|
|
456
|
+
catch (err) {
|
|
457
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
458
|
+
return { error: `Webhook execution failed: ${msg}` };
|
|
459
|
+
}
|
|
460
|
+
finally {
|
|
461
|
+
clearTimeout(timer);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
// ── Thread operations ──────────────────────────────────────────
|
|
465
|
+
export async function createThread(channelId, data) {
|
|
466
|
+
return discordRequest('POST', `/channels/${channelId}/threads`, data);
|
|
467
|
+
}
|
|
468
|
+
export async function createThreadFromMessage(channelId, messageId, data) {
|
|
469
|
+
return discordRequest('POST', `/channels/${channelId}/messages/${messageId}/threads`, data);
|
|
470
|
+
}
|
|
471
|
+
export async function modifyThread(threadId, data) {
|
|
472
|
+
return discordRequest('PATCH', `/channels/${threadId}`, data);
|
|
473
|
+
}
|
|
474
|
+
export async function deleteThread(threadId) {
|
|
475
|
+
return discordRequest('DELETE', `/channels/${threadId}`);
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=discord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord.js","sourceRoot":"","sources":["../../src/services/discord.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute SHA-256 hash of a file's content.
|
|
3
|
+
* Absolute paths are used as-is. Relative paths resolve from process.cwd()
|
|
4
|
+
* (which is the project root when invoked by Claude Code).
|
|
5
|
+
* Returns null if the file doesn't exist or can't be read.
|
|
6
|
+
*/
|
|
7
|
+
export declare function hashFile(filePath: string): string | null;
|
|
8
|
+
/**
|
|
9
|
+
* Compute checksums for an array of related file paths.
|
|
10
|
+
* Returns a Record mapping each file path to its SHA-256 hash.
|
|
11
|
+
* Files that can't be read are omitted from the result.
|
|
12
|
+
*/
|
|
13
|
+
export declare function computeChecksums(filePaths: string[]): Record<string, string>;
|
|
14
|
+
//# sourceMappingURL=file-checksums.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-checksums.d.ts","sourceRoot":"","sources":["../../src/services/file-checksums.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO5E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Compute SHA-256 hash of a file's content.
|
|
6
|
+
* Absolute paths are used as-is. Relative paths resolve from process.cwd()
|
|
7
|
+
* (which is the project root when invoked by Claude Code).
|
|
8
|
+
* Returns null if the file doesn't exist or can't be read.
|
|
9
|
+
*/
|
|
10
|
+
export function hashFile(filePath) {
|
|
11
|
+
try {
|
|
12
|
+
const absPath = resolve(filePath);
|
|
13
|
+
const content = readFileSync(absPath);
|
|
14
|
+
return createHash('sha256').update(content).digest('hex');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Compute checksums for an array of related file paths.
|
|
22
|
+
* Returns a Record mapping each file path to its SHA-256 hash.
|
|
23
|
+
* Files that can't be read are omitted from the result.
|
|
24
|
+
*/
|
|
25
|
+
export function computeChecksums(filePaths) {
|
|
26
|
+
const checksums = {};
|
|
27
|
+
for (const fp of filePaths) {
|
|
28
|
+
const hash = hashFile(fp);
|
|
29
|
+
if (hash)
|
|
30
|
+
checksums[fp] = hash;
|
|
31
|
+
}
|
|
32
|
+
return checksums;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=file-checksums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-checksums.js","sourceRoot":"","sources":["../../src/services/file-checksums.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAmB;IAClD,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local embedding generation using Transformers.js (ONNX runtime).
|
|
3
|
+
* Drop-in replacement for embeddings.ts — same exported function signatures.
|
|
4
|
+
* Uses all-MiniLM-L6-v2 (384 dimensions, ~23MB quantized model).
|
|
5
|
+
* No API key, no internet required after first model download.
|
|
6
|
+
*/
|
|
7
|
+
export declare const EMBEDDING_DIMENSIONS = 384;
|
|
8
|
+
/**
|
|
9
|
+
* Generate a single embedding vector for the given text.
|
|
10
|
+
* Returns a 384-dimensional normalized vector (unit length).
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateEmbedding(text: string): Promise<number[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Generate embeddings for multiple texts.
|
|
15
|
+
* Processes sequentially to avoid memory spikes on large batches.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateEmbeddingBatch(texts: string[]): Promise<number[][]>;
|
|
18
|
+
/**
|
|
19
|
+
* Trigger model download/warmup without generating an actual embedding.
|
|
20
|
+
* Call this at server startup for faster first-use latency.
|
|
21
|
+
*/
|
|
22
|
+
export declare function warmupEmbeddings(): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=local-embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-embeddings.d.ts","sourceRoot":"","sources":["../../src/services/local-embeddings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAiCxC;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIvE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAWjF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD"}
|