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,356 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { config } from '../config.js';
4
+ import { getCategories as getCategoriesFromDb, saveCategories as saveCategoriesToDb } from './sqlite.js';
5
+ const NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
6
+ const MIN_LENGTH = 2;
7
+ const MAX_LENGTH = 30;
8
+ // Callback to notify when categories change externally
9
+ let onExternalChangeCallback = null;
10
+ // Rich color palette for category visualization (36 distinct colors)
11
+ const COLOR_PALETTE = [
12
+ // Blues & Cyans
13
+ '#3b82f6', // Blue
14
+ '#0ea5e9', // Sky
15
+ '#06b6d4', // Cyan
16
+ '#0891b2', // Dark Cyan
17
+ '#1e40af', // Deep Blue
18
+ '#38bdf8', // Light Sky
19
+ // Purples & Violets
20
+ '#8b5cf6', // Purple
21
+ '#a855f7', // Violet
22
+ '#6366f1', // Indigo
23
+ '#c084fc', // Light Purple
24
+ '#7c3aed', // Deep Violet
25
+ '#d946ef', // Fuchsia
26
+ // Pinks & Roses
27
+ '#ec4899', // Pink
28
+ '#f43f5e', // Rose
29
+ '#db2777', // Deep Pink
30
+ '#f472b6', // Light Pink
31
+ '#be185d', // Dark Rose
32
+ '#fb7185', // Coral Pink
33
+ // Reds & Oranges
34
+ '#ef4444', // Red
35
+ '#f97316', // Orange
36
+ '#dc2626', // Dark Red
37
+ '#fb923c', // Light Orange
38
+ '#b91c1c', // Crimson
39
+ '#fdba74', // Peach
40
+ // Yellows & Ambers
41
+ '#eab308', // Yellow
42
+ '#f59e0b', // Amber
43
+ '#fbbf24', // Gold
44
+ '#fcd34d', // Light Yellow
45
+ '#d97706', // Dark Amber
46
+ '#fde047', // Bright Yellow
47
+ // Greens
48
+ '#22c55e', // Green
49
+ '#10b981', // Emerald
50
+ '#84cc16', // Lime
51
+ '#4ade80', // Light Green
52
+ '#059669', // Dark Emerald
53
+ '#14b8a6', // Teal
54
+ ];
55
+ let cachedCategories = null;
56
+ let fileWatcher = null;
57
+ let watchedFilePath = null;
58
+ export function invalidateCategoryCache() {
59
+ cachedCategories = null;
60
+ }
61
+ export function setOnExternalChange(callback) {
62
+ onExternalChangeCallback = callback;
63
+ }
64
+ /**
65
+ * Start watching the per-connection categories cache file.
66
+ * Re-entrant: if the active connection changed, stops the old watcher and starts a new one.
67
+ */
68
+ export function startWatchingCategories() {
69
+ const filePath = getCategoriesPath();
70
+ // If already watching the correct file, do nothing
71
+ if (fileWatcher && watchedFilePath === filePath)
72
+ return;
73
+ // Stop old watcher if switching files
74
+ stopWatchingCategories();
75
+ // Ensure the cache file exists — start empty (SQLite is source of truth)
76
+ if (!fs.existsSync(filePath)) {
77
+ const dir = path.dirname(filePath);
78
+ if (!fs.existsSync(dir)) {
79
+ fs.mkdirSync(dir, { recursive: true });
80
+ }
81
+ saveCategoriesToDisk([]);
82
+ }
83
+ fileWatcher = fs.watch(filePath, (eventType) => {
84
+ if (eventType === 'change') {
85
+ // Invalidate cache and notify
86
+ invalidateCategoryCache();
87
+ if (onExternalChangeCallback) {
88
+ onExternalChangeCallback();
89
+ }
90
+ }
91
+ });
92
+ watchedFilePath = filePath;
93
+ }
94
+ export function stopWatchingCategories() {
95
+ if (fileWatcher) {
96
+ fileWatcher.close();
97
+ fileWatcher = null;
98
+ }
99
+ watchedFilePath = null;
100
+ }
101
+ /**
102
+ * Returns the categories cache file path.
103
+ * Single file since we use one SQLite database (no multi-connection concept).
104
+ */
105
+ function getCategoriesPath() {
106
+ return path.join(config.dataDir, 'custom-categories.json');
107
+ }
108
+ function loadCategoriesFromDisk() {
109
+ const filePath = getCategoriesPath();
110
+ try {
111
+ const raw = fs.readFileSync(filePath, 'utf-8');
112
+ const data = JSON.parse(raw);
113
+ if (data.version === 1 && Array.isArray(data.categories)) {
114
+ return data.categories;
115
+ }
116
+ return [];
117
+ }
118
+ catch {
119
+ return [];
120
+ }
121
+ }
122
+ function saveCategoriesToDisk(categories) {
123
+ const filePath = getCategoriesPath();
124
+ const dir = path.dirname(filePath);
125
+ if (!fs.existsSync(dir)) {
126
+ fs.mkdirSync(dir, { recursive: true });
127
+ }
128
+ const data = { version: 1, categories };
129
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
130
+ // Fire-and-forget write-through to SQLite (source of truth)
131
+ saveCategoriesToDb(categories).catch((err) => {
132
+ console.error('Failed to sync categories to SQLite:', err instanceof Error ? err.message : err);
133
+ });
134
+ }
135
+ /**
136
+ * Initialize the local category cache for the active connection.
137
+ * If the per-connection cache file doesn't exist, tries to load from database first,
138
+ * then falls back to the old global file, then starts empty.
139
+ */
140
+ export async function initCategoryCache() {
141
+ const filePath = getCategoriesPath();
142
+ if (fs.existsSync(filePath)) {
143
+ // Cache file exists, just load it
144
+ invalidateCategoryCache();
145
+ return;
146
+ }
147
+ const dir = path.dirname(filePath);
148
+ if (!fs.existsSync(dir)) {
149
+ fs.mkdirSync(dir, { recursive: true });
150
+ }
151
+ // Try loading from SQLite (source of truth)
152
+ const dbCategories = await getCategoriesFromDb();
153
+ if (dbCategories) {
154
+ const data = { version: 1, categories: dbCategories };
155
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
156
+ invalidateCategoryCache();
157
+ return;
158
+ }
159
+ // Database empty — start with empty categories
160
+ const data = { version: 1, categories: [] };
161
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
162
+ invalidateCategoryCache();
163
+ }
164
+ /**
165
+ * Call after a connection switch to re-point the file watcher
166
+ * at the new connection's category file and sync from database if needed.
167
+ */
168
+ export async function switchCategoryConnection() {
169
+ invalidateCategoryCache();
170
+ await initCategoryCache();
171
+ startWatchingCategories(); // Will detect different path and re-watch
172
+ }
173
+ export function getCategories() {
174
+ if (cachedCategories === null) {
175
+ cachedCategories = loadCategoriesFromDisk();
176
+ }
177
+ return cachedCategories;
178
+ }
179
+ /** @deprecated Use getCategories() instead. Kept for backward compatibility. */
180
+ export function getCustomCategories() {
181
+ return getCategories();
182
+ }
183
+ export function getAllCategories() {
184
+ return getCategories().map((c) => c.name);
185
+ }
186
+ export function getCategoryDescription(name) {
187
+ const cat = getCategories().find((c) => c.name === name);
188
+ return cat?.description || '';
189
+ }
190
+ export function categoryExists(name) {
191
+ return getAllCategories().includes(name);
192
+ }
193
+ export function validateCategoryName(name) {
194
+ if (name.length < MIN_LENGTH || name.length > MAX_LENGTH) {
195
+ return { valid: false, error: `Category name must be ${MIN_LENGTH}-${MAX_LENGTH} characters. Got ${name.length}.` };
196
+ }
197
+ if (!NAME_PATTERN.test(name)) {
198
+ return { valid: false, error: `Category name must match /^[a-z][a-z0-9-]*$/ (lowercase, starts with letter, only letters/digits/hyphens).` };
199
+ }
200
+ if (categoryExists(name)) {
201
+ return { valid: false, error: `Category "${name}" already exists.` };
202
+ }
203
+ return { valid: true };
204
+ }
205
+ export function validateCategory(name) {
206
+ if (categoryExists(name)) {
207
+ return { valid: true };
208
+ }
209
+ const all = getAllCategories();
210
+ return {
211
+ valid: false,
212
+ error: `Unknown category "${name}". Valid categories: ${all.join(', ')}`,
213
+ };
214
+ }
215
+ export function addCategory(name, description, parent, color, is_parent) {
216
+ const cats = getCategories();
217
+ const newCat = {
218
+ name,
219
+ description,
220
+ created_at: new Date().toISOString(),
221
+ };
222
+ if (parent)
223
+ newCat.parent = parent;
224
+ if (color)
225
+ newCat.color = color;
226
+ if (is_parent && !parent)
227
+ newCat.is_parent = true;
228
+ cats.push(newCat);
229
+ cachedCategories = cats;
230
+ saveCategoriesToDisk(cats);
231
+ }
232
+ export function removeCategory(name) {
233
+ const cats = getCategories().filter((c) => c.name !== name);
234
+ cachedCategories = cats;
235
+ saveCategoriesToDisk(cats);
236
+ }
237
+ export function updateCategory(name, updates) {
238
+ const cats = getCategories();
239
+ const catIndex = cats.findIndex((c) => c.name === name);
240
+ if (catIndex === -1) {
241
+ throw new Error(`Category "${name}" not found`);
242
+ }
243
+ const cat = cats[catIndex];
244
+ // If renaming, update all children that reference this category as parent
245
+ if (updates.new_name && updates.new_name !== name) {
246
+ cats.forEach((c) => {
247
+ if (c.parent === name) {
248
+ c.parent = updates.new_name;
249
+ }
250
+ });
251
+ cat.name = updates.new_name;
252
+ }
253
+ // Update other fields
254
+ if (updates.description !== undefined) {
255
+ cat.description = updates.description;
256
+ }
257
+ if (updates.parent !== undefined) {
258
+ if (updates.parent === null) {
259
+ delete cat.parent;
260
+ }
261
+ else {
262
+ cat.parent = updates.parent;
263
+ }
264
+ }
265
+ if (updates.color !== undefined) {
266
+ if (updates.color === null) {
267
+ delete cat.color;
268
+ }
269
+ else {
270
+ cat.color = updates.color;
271
+ }
272
+ }
273
+ if (updates.is_parent !== undefined) {
274
+ if (updates.is_parent && !cat.parent) {
275
+ cat.is_parent = true;
276
+ }
277
+ else {
278
+ delete cat.is_parent;
279
+ }
280
+ }
281
+ cachedCategories = cats;
282
+ saveCategoriesToDisk(cats);
283
+ }
284
+ export function buildCategoryDescription() {
285
+ const cats = getCategories();
286
+ const parentCats = cats.filter((c) => c.is_parent);
287
+ const childCats = cats.filter((c) => c.parent);
288
+ const standaloneCats = cats.filter((c) => !c.is_parent && !c.parent);
289
+ const lines = [];
290
+ // Parent categories with their children
291
+ for (const parent of parentCats) {
292
+ const children = childCats.filter((c) => c.parent === parent.name);
293
+ lines.push(`[${parent.name}] (parent) — ${parent.description}`);
294
+ if (children.length > 0) {
295
+ for (const child of children) {
296
+ lines.push(` ${child.name}=${child.description}`);
297
+ }
298
+ }
299
+ }
300
+ // Standalone categories (no parent, not a parent)
301
+ if (standaloneCats.length > 0) {
302
+ for (const cat of standaloneCats) {
303
+ lines.push(`${cat.name}=${cat.description}`);
304
+ }
305
+ }
306
+ return 'Read each category description as a guideline for what belongs there. Match your memory to the most specific category. Parent categories group related children.\n' + lines.join(', ');
307
+ }
308
+ // Parent/child category helpers
309
+ export function getParentCategories() {
310
+ return getCategories().filter((c) => !c.parent);
311
+ }
312
+ export function getChildCategories(parentName) {
313
+ return getCategories().filter((c) => c.parent === parentName);
314
+ }
315
+ export function getCategoryTree() {
316
+ const parents = getParentCategories();
317
+ const tree = {};
318
+ // Add parent categories
319
+ parents.forEach((parent) => {
320
+ tree[parent.name] = getChildCategories(parent.name);
321
+ });
322
+ // Add standalone categories (no parent)
323
+ const orphans = getCategories().filter((c) => !c.parent && !tree[c.name]);
324
+ if (orphans.length > 0) {
325
+ tree['_uncategorized'] = orphans;
326
+ }
327
+ return tree;
328
+ }
329
+ export function assignColor(categoryName) {
330
+ const cats = getCategories();
331
+ const cat = cats.find((c) => c.name === categoryName);
332
+ if (cat?.color)
333
+ return cat.color;
334
+ // Auto-assign from palette based on hash
335
+ const hash = categoryName.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
336
+ return COLOR_PALETTE[hash % COLOR_PALETTE.length];
337
+ }
338
+ export function updateCategoryColor(name, color) {
339
+ const cats = getCategories();
340
+ const cat = cats.find((c) => c.name === name);
341
+ if (cat) {
342
+ cat.color = color;
343
+ cachedCategories = cats;
344
+ saveCategoriesToDisk(cats);
345
+ }
346
+ }
347
+ export function getCategoryWithMeta(name) {
348
+ const cat = getCategories().find((c) => c.name === name);
349
+ if (!cat)
350
+ return null;
351
+ return {
352
+ ...cat,
353
+ color: cat.color || assignColor(name),
354
+ };
355
+ }
356
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/services/categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAgBzG,MAAM,YAAY,GAAG,mBAAmB,CAAC;AACzC,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,uDAAuD;AACvD,IAAI,wBAAwB,GAAwB,IAAI,CAAC;AAEzD,qEAAqE;AACrE,MAAM,aAAa,GAAG;IACpB,gBAAgB;IAChB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IAEvB,oBAAoB;IACpB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,UAAU;IAErB,gBAAgB;IAChB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,aAAa;IAExB,iBAAiB;IACjB,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,UAAU;IACrB,SAAS,EAAE,QAAQ;IAEnB,mBAAmB;IACnB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,gBAAgB;IAE3B,SAAS;IACT,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,UAAU;IACrB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF,IAAI,gBAAgB,GAA4B,IAAI,CAAC;AACrD,IAAI,WAAW,GAAwB,IAAI,CAAC;AAC5C,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,MAAM,UAAU,uBAAuB;IACrC,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAoB;IACtD,wBAAwB,GAAG,QAAQ,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IAErC,mDAAmD;IACnD,IAAI,WAAW,IAAI,eAAe,KAAK,QAAQ;QAAE,OAAO;IAExD,sCAAsC;IACtC,sBAAsB,EAAE,CAAC;IAEzB,yEAAyE;IACzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;QAC7C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,8BAA8B;YAC9B,uBAAuB,EAAE,CAAC;YAC1B,IAAI,wBAAwB,EAAE,CAAC;gBAC7B,wBAAwB,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,eAAe,GAAG,QAAQ,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAyB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,UAA4B;IACxD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,IAAI,GAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IAC9D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEnE,4DAA4D;IAC5D,kBAAkB,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IAErC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,kCAAkC;QAClC,uBAAuB,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,4CAA4C;IAC5C,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACjD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,IAAI,GAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;QAC5E,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnE,uBAAuB,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,IAAI,GAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAClE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEnE,uBAAuB,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,uBAAuB,EAAE,CAAC;IAC1B,MAAM,iBAAiB,EAAE,CAAC;IAC1B,uBAAuB,EAAE,CAAC,CAAC,0CAA0C;AACvE,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,mBAAmB;IACjC,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,OAAO,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,UAAU,IAAI,UAAU,oBAAoB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACtH,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,4GAA4G,EAAE,CAAC;IAC/I,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,IAAI,mBAAmB,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,qBAAqB,IAAI,wBAAwB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,WAAmB,EAAE,MAAe,EAAE,KAAc,EAAE,SAAmB;IACjH,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAmB;QAC7B,IAAI;QACJ,WAAW;QACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;IAEF,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,IAAI,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,IAAI,SAAS,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;IAElD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,gBAAgB,GAAG,IAAI,CAAC;IACxB,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,gBAAgB,GAAG,IAAI,CAAC;IACxB,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAMC;IAED,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAExD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE3B,0EAA0E;IAC1E,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACtB,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC,MAAM,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC,KAAK,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACrC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,SAAS,CAAC;QACvB,CAAC;IACH,CAAC;IAED,gBAAgB,GAAG,IAAI,CAAC;IACxB,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAErE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,wCAAwC;IACxC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,oKAAoK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjM,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,mBAAmB;IACjC,OAAO,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAqC,EAAE,CAAC;IAElD,wBAAwB;IACxB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAAoB;IAC9C,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACtD,IAAI,GAAG,EAAE,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAEjC,yCAAyC;IACzC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,OAAO,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa;IAC7D,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QAClB,gBAAgB,GAAG,IAAI,CAAC;QACxB,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,OAAO;QACL,GAAG,GAAG;QACN,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,112 @@
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
+ export interface DiscordResponse {
7
+ ok?: boolean;
8
+ error?: string;
9
+ data?: unknown;
10
+ [key: string]: unknown;
11
+ }
12
+ export declare const PERMISSION_FLAGS: Record<string, bigint>;
13
+ /** Convert comma-separated permission flag names to a bitfield string. */
14
+ export declare function resolvePermissions(flags: string): string;
15
+ export declare const CHANNEL_TYPES: Record<string, number>;
16
+ export declare const CHANNEL_TYPE_NAMES: Record<number, string>;
17
+ export declare const VERIFICATION_LEVELS: Record<string, number>;
18
+ export declare function invalidateCache(pattern?: string): void;
19
+ export declare function discordRequest(method: string, path: string, body?: Record<string, unknown>, timeout?: number, retryCount?: number): Promise<DiscordResponse>;
20
+ export declare function resolveGuildId(guildId?: string): Promise<{
21
+ guildId: string;
22
+ } | {
23
+ error: string;
24
+ }>;
25
+ export declare function resolveChannel(nameOrId: string, guildId: string): Promise<{
26
+ id: string;
27
+ name: string;
28
+ type: number;
29
+ } | {
30
+ error: string;
31
+ }>;
32
+ export declare function resolveRole(nameOrId: string, guildId: string): Promise<{
33
+ id: string;
34
+ name: string;
35
+ } | {
36
+ error: string;
37
+ }>;
38
+ export declare function resolveUser(nameOrTag: string, guildId: string): Promise<{
39
+ id: string;
40
+ name: string;
41
+ } | {
42
+ error: string;
43
+ }>;
44
+ export declare function getGuild(guildId: string): Promise<DiscordResponse>;
45
+ export declare function getGuildChannels(guildId: string): Promise<DiscordResponse | {
46
+ id: string;
47
+ name: string;
48
+ type: number;
49
+ }[]>;
50
+ export declare function getGuildMembers(guildId: string, limit?: number, after?: string): Promise<DiscordResponse>;
51
+ export declare function getGuildRoles(guildId: string): Promise<DiscordResponse | {
52
+ id: string;
53
+ name: string;
54
+ color: number;
55
+ position: number;
56
+ }[]>;
57
+ export declare function getAuditLog(guildId: string, opts?: {
58
+ action_type?: number;
59
+ limit?: number;
60
+ }): Promise<DiscordResponse>;
61
+ export declare function editGuildSettings(guildId: string, settings: Record<string, unknown>): Promise<DiscordResponse>;
62
+ export declare function createChannel(guildId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
63
+ export declare function editChannel(channelId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
64
+ export declare function deleteChannel(channelId: string): Promise<DiscordResponse>;
65
+ export declare function setChannelPermissions(channelId: string, overwriteId: string, data: {
66
+ type: number;
67
+ allow: string;
68
+ deny: string;
69
+ }): Promise<DiscordResponse>;
70
+ export declare function createRole(guildId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
71
+ export declare function editRole(guildId: string, roleId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
72
+ export declare function deleteRole(guildId: string, roleId: string): Promise<DiscordResponse>;
73
+ export declare function addMemberRole(guildId: string, userId: string, roleId: string): Promise<DiscordResponse>;
74
+ export declare function removeMemberRole(guildId: string, userId: string, roleId: string): Promise<DiscordResponse>;
75
+ export declare function sendMessage(channelId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
76
+ export declare function editMessage(channelId: string, messageId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
77
+ export declare function deleteMessage(channelId: string, messageId: string): Promise<DiscordResponse>;
78
+ export declare function pinMessage(channelId: string, messageId: string): Promise<DiscordResponse>;
79
+ export declare function unpinMessage(channelId: string, messageId: string): Promise<DiscordResponse>;
80
+ export declare function addReaction(channelId: string, messageId: string, emoji: string): Promise<DiscordResponse>;
81
+ export declare function getMessages(channelId: string, opts?: {
82
+ limit?: number;
83
+ before?: string;
84
+ after?: string;
85
+ }): Promise<DiscordResponse>;
86
+ export declare function bulkDeleteMessages(channelId: string, messageIds: string[]): Promise<DiscordResponse>;
87
+ export declare function getMember(guildId: string, userId: string): Promise<DiscordResponse>;
88
+ export declare function kickMember(guildId: string, userId: string, reason?: string): Promise<DiscordResponse>;
89
+ export declare function banMember(guildId: string, userId: string, data?: {
90
+ delete_message_seconds?: number;
91
+ }): Promise<DiscordResponse>;
92
+ export declare function unbanMember(guildId: string, userId: string): Promise<DiscordResponse>;
93
+ export declare function timeoutMember(guildId: string, userId: string, durationMinutes: number): Promise<DiscordResponse>;
94
+ export declare function setNickname(guildId: string, userId: string, nick: string | null): Promise<DiscordResponse>;
95
+ export declare function getWelcomeScreen(guildId: string): Promise<DiscordResponse>;
96
+ export declare function setWelcomeScreen(guildId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
97
+ export declare function getOnboarding(guildId: string): Promise<DiscordResponse>;
98
+ export declare function setOnboarding(guildId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
99
+ export declare function createWebhook(channelId: string, data: {
100
+ name: string;
101
+ avatar?: string;
102
+ }): Promise<DiscordResponse>;
103
+ export declare function editWebhook(webhookId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
104
+ export declare function deleteWebhook(webhookId: string): Promise<DiscordResponse>;
105
+ export declare function listChannelWebhooks(channelId: string): Promise<DiscordResponse>;
106
+ export declare function listGuildWebhooks(guildId: string): Promise<DiscordResponse>;
107
+ export declare function executeWebhook(webhookId: string, webhookToken: string, data: Record<string, unknown>): Promise<DiscordResponse>;
108
+ export declare function createThread(channelId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
109
+ export declare function createThreadFromMessage(channelId: string, messageId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
110
+ export declare function modifyThread(threadId: string, data: Record<string, unknown>): Promise<DiscordResponse>;
111
+ export declare function deleteThread(threadId: string): Promise<DiscordResponse>;
112
+ //# sourceMappingURL=discord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../src/services/discord.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkDnD,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWxD;AAID,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOhD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUrD,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMtD,CAAC;AAoBF,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAQtD;AAkBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,SAAkB,EACzB,UAAU,SAAI,GACb,OAAO,CAAC,eAAe,CAAC,CA2D1B;AAID,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBvG;AAUD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBzE;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB3D;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB3D;AAID,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAExE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAW/H;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,SAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAW/I;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC,CAE1B;AAID,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAG/E;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,eAAe,CAAC,CAE1B;AAID,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAE1B;AAID,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,eAAe,CAAC,CAK1B;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAID,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAO1B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAID,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEhF;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE7E;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAID,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/E;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAErF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEjF;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAID,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE7E"}