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.
Files changed (214) hide show
  1. package/CLAUDE.md +150 -0
  2. package/hooks/claude-code/post-plan.mjs +1 -1
  3. package/hooks/claude-code/session-start.mjs +2 -0
  4. package/mcp-server/dist/config.d.ts +13 -0
  5. package/mcp-server/dist/config.d.ts.map +1 -0
  6. package/mcp-server/dist/config.js +59 -0
  7. package/mcp-server/dist/config.js.map +1 -0
  8. package/mcp-server/dist/http.d.ts +13 -0
  9. package/mcp-server/dist/http.d.ts.map +1 -0
  10. package/mcp-server/dist/http.js +86 -0
  11. package/mcp-server/dist/http.js.map +1 -0
  12. package/mcp-server/dist/index.d.ts +10 -0
  13. package/mcp-server/dist/index.d.ts.map +1 -0
  14. package/mcp-server/dist/index.js +189 -0
  15. package/mcp-server/dist/index.js.map +1 -0
  16. package/mcp-server/dist/preload-http.d.ts +3 -0
  17. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  18. package/mcp-server/dist/preload-http.js +26 -0
  19. package/mcp-server/dist/preload-http.js.map +1 -0
  20. package/mcp-server/dist/preload.d.ts +3 -0
  21. package/mcp-server/dist/preload.d.ts.map +1 -0
  22. package/mcp-server/dist/preload.js +30 -0
  23. package/mcp-server/dist/preload.js.map +1 -0
  24. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  25. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  26. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  27. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  28. package/mcp-server/dist/services/categories.d.ts +61 -0
  29. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  30. package/mcp-server/dist/services/categories.js +356 -0
  31. package/mcp-server/dist/services/categories.js.map +1 -0
  32. package/mcp-server/dist/services/discord.d.ts +112 -0
  33. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  34. package/mcp-server/dist/services/discord.js +477 -0
  35. package/mcp-server/dist/services/discord.js.map +1 -0
  36. package/mcp-server/dist/services/file-checksums.d.ts +14 -0
  37. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  38. package/mcp-server/dist/services/file-checksums.js +34 -0
  39. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  40. package/mcp-server/dist/services/local-embeddings.d.ts +23 -0
  41. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  42. package/mcp-server/dist/services/local-embeddings.js +71 -0
  43. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  44. package/mcp-server/dist/services/neural-interface.d.ts +92 -0
  45. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  46. package/mcp-server/dist/services/neural-interface.js +238 -0
  47. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  48. package/mcp-server/dist/services/sqlite.d.ts +85 -0
  49. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  50. package/mcp-server/dist/services/sqlite.js +660 -0
  51. package/mcp-server/dist/services/sqlite.js.map +1 -0
  52. package/mcp-server/dist/tools/browser-advanced.d.ts +54 -0
  53. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  54. package/mcp-server/dist/tools/browser-advanced.js +97 -0
  55. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  56. package/mcp-server/dist/tools/browser-interact.d.ts +138 -0
  57. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  58. package/mcp-server/dist/tools/browser-interact.js +216 -0
  59. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  60. package/mcp-server/dist/tools/browser-navigate.d.ts +52 -0
  61. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  62. package/mcp-server/dist/tools/browser-navigate.js +61 -0
  63. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  64. package/mcp-server/dist/tools/browser-observe.d.ts +298 -0
  65. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  66. package/mcp-server/dist/tools/browser-observe.js +1154 -0
  67. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  68. package/mcp-server/dist/tools/browser.d.ts +7 -0
  69. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  70. package/mcp-server/dist/tools/browser.js +55 -0
  71. package/mcp-server/dist/tools/browser.js.map +1 -0
  72. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  73. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  74. package/mcp-server/dist/tools/card-tools.js +137 -0
  75. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  76. package/mcp-server/dist/tools/card.d.ts +8 -0
  77. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  78. package/mcp-server/dist/tools/card.js +14 -0
  79. package/mcp-server/dist/tools/card.js.map +1 -0
  80. package/mcp-server/dist/tools/category.d.ts +32 -0
  81. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  82. package/mcp-server/dist/tools/category.js +290 -0
  83. package/mcp-server/dist/tools/category.js.map +1 -0
  84. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  85. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  86. package/mcp-server/dist/tools/discord-channel.js +236 -0
  87. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  88. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  89. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  90. package/mcp-server/dist/tools/discord-guild.js +138 -0
  91. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  92. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  93. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  94. package/mcp-server/dist/tools/discord-member.js +122 -0
  95. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  96. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  97. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  98. package/mcp-server/dist/tools/discord-message.js +184 -0
  99. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  100. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  101. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  102. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  103. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  104. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  105. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  106. package/mcp-server/dist/tools/discord-role.js +178 -0
  107. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  108. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  109. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  110. package/mcp-server/dist/tools/discord-thread.js +88 -0
  111. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  112. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  113. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  114. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  115. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  116. package/mcp-server/dist/tools/discord.d.ts +7 -0
  117. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  118. package/mcp-server/dist/tools/discord.js +31 -0
  119. package/mcp-server/dist/tools/discord.js.map +1 -0
  120. package/mcp-server/dist/tools/forget.d.ts +14 -0
  121. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  122. package/mcp-server/dist/tools/forget.js +26 -0
  123. package/mcp-server/dist/tools/forget.js.map +1 -0
  124. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  125. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  126. package/mcp-server/dist/tools/git-tools.js +107 -0
  127. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  128. package/mcp-server/dist/tools/git.d.ts +7 -0
  129. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  130. package/mcp-server/dist/tools/git.js +9 -0
  131. package/mcp-server/dist/tools/git.js.map +1 -0
  132. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  133. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  134. package/mcp-server/dist/tools/image-tools.js +80 -0
  135. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  136. package/mcp-server/dist/tools/image.d.ts +10 -0
  137. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  138. package/mcp-server/dist/tools/image.js +12 -0
  139. package/mcp-server/dist/tools/image.js.map +1 -0
  140. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +77 -0
  141. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  142. package/mcp-server/dist/tools/leonardo-browser-tools.js +223 -0
  143. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  144. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  145. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  146. package/mcp-server/dist/tools/leonardo.js +19 -0
  147. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  148. package/mcp-server/dist/tools/loop.d.ts +30 -0
  149. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  150. package/mcp-server/dist/tools/loop.js +302 -0
  151. package/mcp-server/dist/tools/loop.js.map +1 -0
  152. package/mcp-server/dist/tools/memories.d.ts +26 -0
  153. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  154. package/mcp-server/dist/tools/memories.js +96 -0
  155. package/mcp-server/dist/tools/memories.js.map +1 -0
  156. package/mcp-server/dist/tools/recall.d.ts +41 -0
  157. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  158. package/mcp-server/dist/tools/recall.js +275 -0
  159. package/mcp-server/dist/tools/recall.js.map +1 -0
  160. package/mcp-server/dist/tools/reflect.d.ts +44 -0
  161. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  162. package/mcp-server/dist/tools/reflect.js +118 -0
  163. package/mcp-server/dist/tools/reflect.js.map +1 -0
  164. package/mcp-server/dist/tools/remember.d.ts +38 -0
  165. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  166. package/mcp-server/dist/tools/remember.js +88 -0
  167. package/mcp-server/dist/tools/remember.js.map +1 -0
  168. package/mcp-server/dist/tools/response.d.ts +23 -0
  169. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  170. package/mcp-server/dist/tools/response.js +24 -0
  171. package/mcp-server/dist/tools/response.js.map +1 -0
  172. package/mcp-server/dist/tools/restore.d.ts +14 -0
  173. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  174. package/mcp-server/dist/tools/restore.js +23 -0
  175. package/mcp-server/dist/tools/restore.js.map +1 -0
  176. package/mcp-server/dist/tools/sync.d.ts +18 -0
  177. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  178. package/mcp-server/dist/tools/sync.js +93 -0
  179. package/mcp-server/dist/tools/sync.js.map +1 -0
  180. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  181. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  182. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  183. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  184. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  185. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  186. package/mcp-server/dist/tools/tictactoe.js +9 -0
  187. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  188. package/mcp-server/dist/tools/utils.d.ts +10 -0
  189. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  190. package/mcp-server/dist/tools/utils.js +30 -0
  191. package/mcp-server/dist/tools/utils.js.map +1 -0
  192. package/mcp-server/dist/tools/whiteboard-tools.d.ts +194 -0
  193. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  194. package/mcp-server/dist/tools/whiteboard-tools.js +198 -0
  195. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  196. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  197. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  198. package/mcp-server/dist/tools/whiteboard.js +14 -0
  199. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  200. package/mcp-server/dist/tui.d.ts +3 -0
  201. package/mcp-server/dist/tui.d.ts.map +1 -0
  202. package/mcp-server/dist/tui.js +807 -0
  203. package/mcp-server/dist/tui.js.map +1 -0
  204. package/mcp-server/dist/types.d.ts +77 -0
  205. package/mcp-server/dist/types.d.ts.map +1 -0
  206. package/mcp-server/dist/types.js +2 -0
  207. package/mcp-server/dist/types.js.map +1 -0
  208. package/neural-interface/public/shared/styles.css +2 -2
  209. package/neural-interface/public/shared/ui-settings.js +2 -2
  210. package/neural-interface/server.js +82 -8
  211. package/neural-interface/templates/CLAUDE-template.md +9 -1
  212. package/package.json +4 -2
  213. package/preuninstall.js +28 -0
  214. package/setup.js +86 -1
@@ -0,0 +1,154 @@
1
+ import { z } from 'zod';
2
+ import * as discord from '../services/discord.js';
3
+ import { text } from './response.js';
4
+ export const discordWebhookSchema = {
5
+ action: z.enum(['create', 'edit', 'delete', 'list', 'execute'])
6
+ .describe('Action: create, edit, delete, list, execute.'),
7
+ guild_id: z.string().optional()
8
+ .describe('Guild ID for channel name resolution. Defaults to DISCORD_GUILD_ID env var.'),
9
+ channel: z.string().optional()
10
+ .describe('Channel name or ID (required for create/list).'),
11
+ webhook_id: z.string().optional()
12
+ .describe('Webhook ID (required for edit/delete/execute).'),
13
+ webhook_token: z.string().optional()
14
+ .describe('Webhook token (required for execute).'),
15
+ name: z.string().optional()
16
+ .describe('Webhook name (create required, edit optional).'),
17
+ avatar_url: z.string().optional()
18
+ .describe('Avatar URL (create/edit).'),
19
+ content: z.string().optional()
20
+ .describe('Message content (execute).'),
21
+ username: z.string().optional()
22
+ .describe('Override display name (execute).'),
23
+ embeds: z.array(z.record(z.unknown())).optional()
24
+ .describe('Embeds array (execute). Each: {title?, description?, color?, fields?: [{name, value}]}.'),
25
+ };
26
+ export const discordWebhookDescription = 'Discord webhook management. Actions: create, edit, delete, list, execute (send message as webhook).';
27
+ // ── Create ─────────────────────────────────────────────────────
28
+ async function handleCreate(args) {
29
+ if (!args.channel)
30
+ return text('channel is required for create action.');
31
+ if (!args.name)
32
+ return text('name is required for create action.');
33
+ let channelId = args.channel;
34
+ if (!/^\d{17,20}$/.test(channelId)) {
35
+ const resolved = await discord.resolveGuildId(args.guild_id);
36
+ if ('error' in resolved)
37
+ return text(resolved.error);
38
+ const ch = await discord.resolveChannel(args.channel, resolved.guildId);
39
+ if ('error' in ch)
40
+ return text(ch.error);
41
+ channelId = ch.id;
42
+ }
43
+ const data = { name: args.name };
44
+ // Note: avatar in create expects base64 data URI, not URL. avatar_url is for execute override.
45
+ const res = await discord.createWebhook(channelId, data);
46
+ if (res.error)
47
+ return text(res.error);
48
+ const wh = res.data;
49
+ return text(`Created webhook "${wh.name}" (${wh.id}) in <#${wh.channel_id}>.\nToken: ${wh.token}\nURL: https://discord.com/api/webhooks/${wh.id}/${wh.token}`);
50
+ }
51
+ // ── Edit ───────────────────────────────────────────────────────
52
+ async function handleEdit(args) {
53
+ if (!args.webhook_id)
54
+ return text('webhook_id is required for edit action.');
55
+ const data = {};
56
+ if (args.name)
57
+ data.name = args.name;
58
+ if (args.channel) {
59
+ let channelId = args.channel;
60
+ if (!/^\d{17,20}$/.test(channelId)) {
61
+ const resolved = await discord.resolveGuildId(args.guild_id);
62
+ if ('error' in resolved)
63
+ return text(resolved.error);
64
+ const ch = await discord.resolveChannel(args.channel, resolved.guildId);
65
+ if ('error' in ch)
66
+ return text(ch.error);
67
+ channelId = ch.id;
68
+ }
69
+ data.channel_id = channelId;
70
+ }
71
+ const res = await discord.editWebhook(args.webhook_id, data);
72
+ if (res.error)
73
+ return text(res.error);
74
+ return text(`Updated webhook ${args.webhook_id}.`);
75
+ }
76
+ // ── Delete ─────────────────────────────────────────────────────
77
+ async function handleDelete(args) {
78
+ if (!args.webhook_id)
79
+ return text('webhook_id is required for delete action.');
80
+ const res = await discord.deleteWebhook(args.webhook_id);
81
+ if (res.error)
82
+ return text(res.error);
83
+ return text(`Deleted webhook ${args.webhook_id}.`);
84
+ }
85
+ // ── List ───────────────────────────────────────────────────────
86
+ async function handleList(args) {
87
+ let res;
88
+ if (args.channel) {
89
+ let channelId = args.channel;
90
+ if (!/^\d{17,20}$/.test(channelId)) {
91
+ const resolved = await discord.resolveGuildId(args.guild_id);
92
+ if ('error' in resolved)
93
+ return text(resolved.error);
94
+ const ch = await discord.resolveChannel(args.channel, resolved.guildId);
95
+ if ('error' in ch)
96
+ return text(ch.error);
97
+ channelId = ch.id;
98
+ }
99
+ res = await discord.listChannelWebhooks(channelId);
100
+ }
101
+ else {
102
+ const resolved = await discord.resolveGuildId(args.guild_id);
103
+ if ('error' in resolved)
104
+ return text(resolved.error);
105
+ res = await discord.listGuildWebhooks(resolved.guildId);
106
+ }
107
+ if (res.error)
108
+ return text(res.error);
109
+ const webhooks = res.data;
110
+ if (!webhooks || webhooks.length === 0) {
111
+ return text('No webhooks found.');
112
+ }
113
+ const typeNames = { 1: 'Incoming', 2: 'Channel Follower', 3: 'Application' };
114
+ const lines = webhooks.map(wh => {
115
+ const type = typeNames[wh.type] || 'Unknown';
116
+ return ` ${wh.name} (${wh.id}, ${type}) in <#${wh.channel_id}>${wh.token ? `\n URL: https://discord.com/api/webhooks/${wh.id}/${wh.token}` : ''}`;
117
+ });
118
+ return text(`Webhooks (${webhooks.length}):\n${lines.join('\n')}`);
119
+ }
120
+ // ── Execute ────────────────────────────────────────────────────
121
+ async function handleExecute(args) {
122
+ if (!args.webhook_id)
123
+ return text('webhook_id is required for execute action.');
124
+ if (!args.webhook_token)
125
+ return text('webhook_token is required for execute action.');
126
+ if (!args.content && !args.embeds)
127
+ return text('content or embeds is required for execute action.');
128
+ const data = {};
129
+ if (args.content)
130
+ data.content = args.content;
131
+ if (args.username)
132
+ data.username = args.username;
133
+ if (args.avatar_url)
134
+ data.avatar_url = args.avatar_url;
135
+ if (args.embeds)
136
+ data.embeds = args.embeds;
137
+ const res = await discord.executeWebhook(args.webhook_id, args.webhook_token, data);
138
+ if (res.error)
139
+ return text(res.error);
140
+ return text(`Webhook message sent.`);
141
+ }
142
+ // ── Main dispatcher ────────────────────────────────────────────
143
+ export async function handleDiscordWebhook(args) {
144
+ switch (args.action) {
145
+ case 'create': return handleCreate(args);
146
+ case 'edit': return handleEdit(args);
147
+ case 'delete': return handleDelete(args);
148
+ case 'list': return handleList(args);
149
+ case 'execute': return handleExecute(args);
150
+ default:
151
+ return text(`Unknown action "${args.action}". Use: create, edit, delete, list, execute.`);
152
+ }
153
+ }
154
+ //# sourceMappingURL=discord-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-webhook.js","sourceRoot":"","sources":["../../src/tools/discord-webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Register all 8 Discord MCP tools on the given server instance.
4
+ * Discord tools are static (no dynamic schema refresh needed).
5
+ */
6
+ export declare function registerDiscordTools(server: McpServer): void;
7
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../src/tools/discord.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAwBrD"}
@@ -0,0 +1,31 @@
1
+ import { discordGuildSchema, discordGuildDescription, handleDiscordGuild } from './discord-guild.js';
2
+ import { discordChannelSchema, discordChannelDescription, handleDiscordChannel } from './discord-channel.js';
3
+ import { discordRoleSchema, discordRoleDescription, handleDiscordRole } from './discord-role.js';
4
+ import { discordMessageSchema, discordMessageDescription, handleDiscordMessage } from './discord-message.js';
5
+ import { discordMemberSchema, discordMemberDescription, handleDiscordMember } from './discord-member.js';
6
+ import { discordOnboardingSchema, discordOnboardingDescription, handleDiscordOnboarding } from './discord-onboarding.js';
7
+ import { discordWebhookSchema, discordWebhookDescription, handleDiscordWebhook } from './discord-webhook.js';
8
+ import { discordThreadSchema, discordThreadDescription, handleDiscordThread } from './discord-thread.js';
9
+ /**
10
+ * Register all 8 Discord MCP tools on the given server instance.
11
+ * Discord tools are static (no dynamic schema refresh needed).
12
+ */
13
+ export function registerDiscordTools(server) {
14
+ // Server overview
15
+ server.tool('discord_guild', discordGuildDescription, discordGuildSchema, handleDiscordGuild);
16
+ // Channel management (text, voice, categories, forums, stages)
17
+ server.tool('discord_channel', discordChannelDescription, discordChannelSchema, handleDiscordChannel);
18
+ // Role management + assignment
19
+ server.tool('discord_role', discordRoleDescription, discordRoleSchema, handleDiscordRole);
20
+ // Message operations
21
+ server.tool('discord_message', discordMessageDescription, discordMessageSchema, handleDiscordMessage);
22
+ // Member moderation
23
+ server.tool('discord_member', discordMemberDescription, discordMemberSchema, handleDiscordMember);
24
+ // Server onboarding & setup
25
+ server.tool('discord_onboarding', discordOnboardingDescription, discordOnboardingSchema, handleDiscordOnboarding);
26
+ // Webhook management
27
+ server.tool('discord_webhook', discordWebhookDescription, discordWebhookSchema, handleDiscordWebhook);
28
+ // Thread management
29
+ server.tool('discord_thread', discordThreadDescription, discordThreadSchema, handleDiscordThread);
30
+ }
31
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../src/tools/discord.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACzH,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEzG;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,kBAAkB;IAClB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAE9F,+DAA+D;IAC/D,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IAEtG,+BAA+B;IAC/B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAE1F,qBAAqB;IACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IAEtG,oBAAoB;IACpB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAElG,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;IAElH,qBAAqB;IACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IAEtG,oBAAoB;IACpB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AACpG,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const forgetSchema: {
3
+ memory_id: z.ZodString;
4
+ };
5
+ export declare const forgetDescription = "Move a specific memory to trash by ID. The memory can be restored from the Neural Interface trash panel or via the restore tool. Use this to clean up outdated, incorrect, or superseded information.";
6
+ export declare function handleForget(args: {
7
+ memory_id: string;
8
+ }): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ //# sourceMappingURL=forget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/tools/forget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,YAAY;;CAMxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,0MAC2K,CAAC;AAE1M,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE;;;;;GAoB7D"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { softDeleteMemory, getMemory } from '../services/sqlite.js';
3
+ import { invalidateCache } from '../services/neural-interface.js';
4
+ import { text } from './response.js';
5
+ export const forgetSchema = {
6
+ memory_id: z
7
+ .string()
8
+ .describe('The memory ID to move to trash. Use the full UUID from recall results.'),
9
+ };
10
+ export const forgetDescription = 'Move a specific memory to trash by ID. The memory can be restored from the Neural Interface trash panel or via the restore tool. Use this to clean up outdated, incorrect, or superseded information.';
11
+ export async function handleForget(args) {
12
+ const memoryId = args.memory_id;
13
+ const existing = await getMemory(memoryId);
14
+ if (!existing) {
15
+ return text(`Memory "${memoryId}" not found. Use recall to search for the memory first.`);
16
+ }
17
+ const payload = existing.payload;
18
+ if (payload.trashed_at) {
19
+ return text(`Memory [${memoryId.slice(0, 8)}] is already in trash (trashed ${payload.trashed_at}).`);
20
+ }
21
+ await softDeleteMemory(memoryId);
22
+ // Invalidate Neural Interface link cache (fire-and-forget)
23
+ invalidateCache('forget');
24
+ return text(`Moved to trash [${memoryId.slice(0, 8)}]: "${(payload.content ?? '(empty)').slice(0, 80)}..." — can be restored from the Neural Interface trash panel or via the restore tool.`);
25
+ }
26
+ //# sourceMappingURL=forget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/tools/forget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,CACP,wEAAwE,CACzE;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,uMAAuM,CAAC;AAE1M,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA2B;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;IAEhC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,WAAW,QAAQ,yDAAyD,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAmC,CAAC;IAE7D,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,WAAW,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,kCAAkC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEjC,2DAA2D;IAC3D,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE1B,OAAO,IAAI,CAAC,mBAAmB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,uFAAuF,CAAC,CAAC;AAChM,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ export declare const gitSchema: {
3
+ action: z.ZodEnum<["status", "diff", "commit", "log", "branches"]>;
4
+ path: z.ZodString;
5
+ message: z.ZodOptional<z.ZodString>;
6
+ files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
7
+ max_lines: z.ZodOptional<z.ZodNumber>;
8
+ count: z.ZodOptional<z.ZodNumber>;
9
+ };
10
+ export declare const gitDescription = "Git repository operations. Actions: \"status\" shows branch and changed files, \"diff\" returns raw diff content for analysis, \"commit\" stages and commits with a message, \"log\" shows recent commit history, \"branches\" lists all branches. Use \"diff\" to analyze changes before generating commit messages.";
11
+ export declare function handleGit(args: {
12
+ action: string;
13
+ path: string;
14
+ message?: string;
15
+ files?: string[];
16
+ max_lines?: number;
17
+ count?: number;
18
+ }): Promise<{
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ }>;
24
+ //# sourceMappingURL=git-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-tools.d.ts","sourceRoot":"","sources":["../../src/tools/git-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,SAAS;;;;;;;CAmBrB,CAAC;AAEF,eAAO,MAAM,cAAc,0TACkR,CAAC;AAE9S,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;GAcA"}
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import * as ni from '../services/neural-interface.js';
3
+ import { text } from './response.js';
4
+ // ═══════════════════════════════════════════
5
+ // git — Git operations MCP tool
6
+ // ═══════════════════════════════════════════
7
+ export const gitSchema = {
8
+ action: z.enum(['status', 'diff', 'commit', 'log', 'branches']).describe('Git action. "status" = branch + changes list. "diff" = raw diff content for analysis. "commit" = stage and commit. "log" = recent commit history. "branches" = list all branches.'),
9
+ path: z.string().describe('Absolute path to the git repository working directory.'),
10
+ message: z.string().optional().describe('Commit message (required for "commit" action).'),
11
+ files: z.array(z.string()).optional().describe('Specific files to stage for "commit". If omitted, stages all changes (git add -A).'),
12
+ max_lines: z.number().optional().describe('Max lines of diff output (default 500). Only used for "diff" action.'),
13
+ count: z.number().optional().describe('Number of commits to return (default 10). Only used for "log" action.'),
14
+ };
15
+ export const gitDescription = 'Git repository operations. Actions: "status" shows branch and changed files, "diff" returns raw diff content for analysis, "commit" stages and commits with a message, "log" shows recent commit history, "branches" lists all branches. Use "diff" to analyze changes before generating commit messages.';
16
+ export async function handleGit(args) {
17
+ if (!args.path) {
18
+ return text('path is required');
19
+ }
20
+ switch (args.action) {
21
+ case 'status': return handleStatus(args.path);
22
+ case 'diff': return handleDiff(args.path, args.max_lines);
23
+ case 'commit': return handleCommit(args.path, args.message, args.files);
24
+ case 'log': return handleLog(args.path, args.count);
25
+ case 'branches': return handleBranches(args.path);
26
+ default:
27
+ return text(`Unknown action: ${args.action}`);
28
+ }
29
+ }
30
+ async function handleStatus(path) {
31
+ const result = await ni.gitStatus(path);
32
+ if (result.error) {
33
+ return text(`Git status failed: ${result.error}`);
34
+ }
35
+ if (!result.isGit) {
36
+ return text(`Not a git repository: ${path}`);
37
+ }
38
+ const changes = (result.changes || []);
39
+ const grouped = {};
40
+ for (const c of changes) {
41
+ const key = c.status + (c.staged ? ' (staged)' : '');
42
+ if (!grouped[key])
43
+ grouped[key] = [];
44
+ grouped[key].push(c.path);
45
+ }
46
+ let msg = `Branch: ${result.branch}\nChanges: ${changes.length} file${changes.length !== 1 ? 's' : ''}\n`;
47
+ for (const [status, files] of Object.entries(grouped)) {
48
+ msg += `\n${status}:\n${files.map(f => ' ' + f).join('\n')}\n`;
49
+ }
50
+ if (changes.length === 0)
51
+ msg += '\nWorking tree clean.';
52
+ return text(msg.trim());
53
+ }
54
+ async function handleDiff(path, maxLines) {
55
+ const result = await ni.gitDiff(path, maxLines);
56
+ if (result.error) {
57
+ return text(`Git diff failed: ${result.error}`);
58
+ }
59
+ const parts = [`Branch: ${result.branch}`];
60
+ const diff = result.diff;
61
+ const stagedDiff = result.stagedDiff;
62
+ const untrackedFiles = (result.untrackedFiles || []);
63
+ if (diff)
64
+ parts.push('\n--- Unstaged changes ---\n' + diff);
65
+ if (stagedDiff)
66
+ parts.push('\n--- Staged changes ---\n' + stagedDiff);
67
+ if (untrackedFiles.length > 0)
68
+ parts.push('\n--- Untracked files ---\n' + untrackedFiles.join('\n'));
69
+ if (!diff && !stagedDiff && untrackedFiles.length === 0)
70
+ parts.push('\nNo changes.');
71
+ if (result.truncated)
72
+ parts.push('\n(output truncated)');
73
+ return text(parts.join('\n'));
74
+ }
75
+ async function handleCommit(path, message, files) {
76
+ if (!message) {
77
+ return text('message is required for commit action');
78
+ }
79
+ const result = await ni.gitCommit(path, message, files);
80
+ if (result.error) {
81
+ return text(`Commit failed: ${result.error}`);
82
+ }
83
+ return text(`Committed: ${message}\n\n${result.output || ''}`.trim());
84
+ }
85
+ async function handleLog(path, count) {
86
+ const result = await ni.gitLog(path, count);
87
+ if (result.error) {
88
+ return text(`Git log failed: ${result.error}`);
89
+ }
90
+ const commits = (result.commits || []);
91
+ if (commits.length === 0) {
92
+ return text('No commits found.');
93
+ }
94
+ const msg = commits.map(c => `${c.hash} ${c.message}`).join('\n');
95
+ return text(`Recent commits:\n\n${msg}`);
96
+ }
97
+ async function handleBranches(path) {
98
+ const result = await ni.gitBranches(path);
99
+ if (result.error) {
100
+ return text(`Failed to list branches: ${result.error}`);
101
+ }
102
+ const branches = (result.branches || []);
103
+ const current = result.current || '';
104
+ const msg = branches.map(b => (b === current ? `* ${b}` : ` ${b}`)).join('\n');
105
+ return text(`Branches:\n\n${msg}`);
106
+ }
107
+ //# sourceMappingURL=git-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-tools.js","sourceRoot":"","sources":["../../src/tools/git-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Register the Git MCP tool on the given server instance.
4
+ * Single tool with action-based dispatch: status, diff, commit, log, branches.
5
+ */
6
+ export declare function registerGitTools(server: McpServer): void;
7
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAEjD"}
@@ -0,0 +1,9 @@
1
+ import { gitSchema, gitDescription, handleGit, } from './git-tools.js';
2
+ /**
3
+ * Register the Git MCP tool on the given server instance.
4
+ * Single tool with action-based dispatch: status, diff, commit, log, branches.
5
+ */
6
+ export function registerGitTools(server) {
7
+ server.tool('git', gitDescription, gitSchema, handleGit);
8
+ }
9
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EAAE,cAAc,EAAE,SAAS,GACrC,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * General-purpose image staging MCP tools.
3
+ * Browse, list, and manage images in SynaBun's data/images/ directory.
4
+ * Images arrive via paste in the Neural Interface chat area.
5
+ * Any skill or tool can use staged images (Leonardo references, social posts, etc.).
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const imageStagedSchema: {
9
+ action: z.ZodEnum<["list", "clear", "remove"]>;
10
+ filename: z.ZodOptional<z.ZodString>;
11
+ type: z.ZodOptional<z.ZodEnum<["all", "attachment", "screenshot", "whiteboard", "paste"]>>;
12
+ };
13
+ export declare const imageStagedDescription: string;
14
+ export declare function handleImageStaged(args: {
15
+ action: string;
16
+ filename?: string;
17
+ type?: string;
18
+ }): Promise<{
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ }>;
24
+ //# sourceMappingURL=image-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-tools.d.ts","sourceRoot":"","sources":["../../src/tools/image-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,iBAAiB;;;;CAQ7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAGiF,CAAC;AAErH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GA2DjG"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * General-purpose image staging MCP tools.
3
+ * Browse, list, and manage images in SynaBun's data/images/ directory.
4
+ * Images arrive via paste in the Neural Interface chat area.
5
+ * Any skill or tool can use staged images (Leonardo references, social posts, etc.).
6
+ */
7
+ import { z } from 'zod';
8
+ import * as ni from '../services/neural-interface.js';
9
+ import { text } from './response.js';
10
+ // ═══════════════════════════════════════════
11
+ // image_staged — list, clear, remove staged images
12
+ // ═══════════════════════════════════════════
13
+ export const imageStagedSchema = {
14
+ action: z.enum(['list', 'clear', 'remove']).describe('Action: "list" = show all images with paths. "clear" = delete all attachment images. "remove" = delete a specific image.'),
15
+ filename: z.string().optional().describe('Filename to remove (for "remove" action).'),
16
+ type: z.enum(['all', 'attachment', 'screenshot', 'whiteboard', 'paste']).optional().describe('Filter by image type. Default: "all". "attachment" = images pasted in chat.'),
17
+ };
18
+ export const imageStagedDescription = 'List, clear, or remove images from SynaBun\'s image store (data/images/). Images arrive when users paste them in the Neural Interface chat. ' +
19
+ 'Use "list" to see available images with their full absolute paths — these paths can be passed to browser_upload, Read, or any tool that accepts file paths. ' +
20
+ 'Use "clear" to delete all attachment-type images (auto-clear after use). Use "remove" to delete a specific file.';
21
+ export async function handleImageStaged(args) {
22
+ const { action, filename, type } = args;
23
+ if (action === 'list') {
24
+ const result = await ni.listImages();
25
+ if (result.error)
26
+ return text(`Failed to list images: ${result.error}`);
27
+ const images = (result.images || []);
28
+ if (images.length === 0)
29
+ return text('No images in store.');
30
+ // Filter by type if requested
31
+ const filter = type || 'all';
32
+ const filtered = filter === 'all' ? images : images.filter(i => i.type === filter);
33
+ if (filtered.length === 0)
34
+ return text(`No images of type "${filter}" found.`);
35
+ const lines = filtered.map((img, i) => {
36
+ const sizeKb = Math.round(img.size / 1024);
37
+ const age = _relativeAge(img.modifiedAt);
38
+ const path = img.path || img.filename;
39
+ return `${i + 1}. [${img.type}] ${img.filename} (${sizeKb}KB, ${age})\n Path: ${path}`;
40
+ });
41
+ return text(`Images: ${filtered.length}${filter !== 'all' ? ` (${filter})` : ''}\n\n${lines.join('\n\n')}`);
42
+ }
43
+ if (action === 'remove') {
44
+ if (!filename)
45
+ return text('Filename required for "remove" action.');
46
+ const result = await ni.deleteImage(filename);
47
+ if (result.error)
48
+ return text(`Failed to remove: ${result.error}`);
49
+ return text(`Removed: ${filename}`);
50
+ }
51
+ if (action === 'clear') {
52
+ // List all attachment images, then delete each
53
+ const result = await ni.listImages();
54
+ if (result.error)
55
+ return text(`Failed to list images: ${result.error}`);
56
+ const images = (result.images || []);
57
+ const attachments = images.filter(i => i.type === 'attachment');
58
+ if (attachments.length === 0)
59
+ return text('No attachment images to clear.');
60
+ let removed = 0;
61
+ for (const img of attachments) {
62
+ const r = await ni.deleteImage(img.filename);
63
+ if (!r.error)
64
+ removed++;
65
+ }
66
+ return text(`Cleared ${removed}/${attachments.length} attachment image(s).`);
67
+ }
68
+ return text(`Unknown action: ${action}`);
69
+ }
70
+ function _relativeAge(ts) {
71
+ const diff = Date.now() - ts;
72
+ if (diff < 60000)
73
+ return 'just now';
74
+ if (diff < 3600000)
75
+ return `${Math.floor(diff / 60000)}m ago`;
76
+ if (diff < 86400000)
77
+ return `${Math.floor(diff / 3600000)}h ago`;
78
+ return `${Math.floor(diff / 86400000)}d ago`;
79
+ }
80
+ //# sourceMappingURL=image-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-tools.js","sourceRoot":"","sources":["../../src/tools/image-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Image MCP tool registration barrel.
3
+ * General-purpose image staging — list, clear, and manage images in data/images/.
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ /**
7
+ * Register all image MCP tools on the given server instance.
8
+ */
9
+ export declare function registerImageTools(server: McpServer): void;
10
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/tools/image.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAEnD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Image MCP tool registration barrel.
3
+ * General-purpose image staging — list, clear, and manage images in data/images/.
4
+ */
5
+ import { imageStagedSchema, imageStagedDescription, handleImageStaged, } from './image-tools.js';
6
+ /**
7
+ * Register all image MCP tools on the given server instance.
8
+ */
9
+ export function registerImageTools(server) {
10
+ server.tool('image_staged', imageStagedDescription, imageStagedSchema, handleImageStaged);
11
+ }
12
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/tools/image.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,iBAAiB,EAAE,sBAAsB,EAAE,iBAAiB,GAC7D,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AAC5F,CAAC"}