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,24 @@
1
+ /**
2
+ * MCP response helpers — eliminates verbose response object boilerplate.
3
+ * Inspired by FastMCP's approach of letting tools return simple values.
4
+ *
5
+ * Before: return { content: [{ type: 'text' as const, text: msg }] };
6
+ * After: return text(msg);
7
+ */
8
+ /**
9
+ * Strip unpaired Unicode surrogates (U+D800–U+DFFF) that produce
10
+ * invalid JSON ("no low surrogate in string" API errors).
11
+ * Common in browser-extracted content from Facebook, WhatsApp, etc.
12
+ */
13
+ function sanitizeSurrogates(s) {
14
+ return s.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, '\uFFFD');
15
+ }
16
+ /** Wrap a string in the MCP text response format. */
17
+ export function text(msg) {
18
+ return { content: [{ type: 'text', text: sanitizeSurrogates(msg) }] };
19
+ }
20
+ /** Wrap base64 image data in the MCP image response format. */
21
+ export function image(data, mimeType) {
22
+ return { content: [{ type: 'image', data, mimeType }] };
23
+ }
24
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/tools/response.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,yEAAyE,EAAE,QAAQ,CAAC,CAAC;AACxG,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,QAAgB;IAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const restoreSchema: {
3
+ memory_id: z.ZodString;
4
+ };
5
+ export declare const restoreDescription = "Restore a trashed memory by ID. Use this to undo a forget operation.";
6
+ export declare function handleRestore(args: {
7
+ memory_id: string;
8
+ }): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/tools/restore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,aAAa;;CAMzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,yEACyC,CAAC;AAEzE,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE;;;;;GAiB9D"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ import { restoreMemory, getMemory } from '../services/sqlite.js';
3
+ import { text } from './response.js';
4
+ export const restoreSchema = {
5
+ memory_id: z
6
+ .string()
7
+ .describe('The memory ID to restore from trash. Use the full UUID.'),
8
+ };
9
+ export const restoreDescription = 'Restore a trashed memory by ID. Use this to undo a forget operation.';
10
+ export async function handleRestore(args) {
11
+ const memoryId = args.memory_id;
12
+ const existing = await getMemory(memoryId);
13
+ if (!existing) {
14
+ return text(`Memory "${memoryId}" not found.`);
15
+ }
16
+ const payload = existing.payload;
17
+ if (!payload.trashed_at) {
18
+ return text(`Memory [${memoryId.slice(0, 8)}] is not in trash.`);
19
+ }
20
+ await restoreMemory(memoryId);
21
+ return text(`Restored [${memoryId.slice(0, 8)}]: "${payload.content.slice(0, 80)}..."`);
22
+ }
23
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/tools/restore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,CACP,yDAAyD,CAC1D;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAC7B,sEAAsE,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAA2B;IAC7D,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,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAmC,CAAC;IAE7D,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,WAAW,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE9B,OAAO,IAAI,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const syncSchema: {
3
+ project: z.ZodOptional<z.ZodString>;
4
+ categories: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
5
+ limit: z.ZodOptional<z.ZodNumber>;
6
+ };
7
+ export declare const syncDescription = "Check for stale memories whose related files have changed. Compares stored file checksums against current hashes. Returns compact output (ID + changed files only, no content). IMPORTANT: Always pass \"categories\" to scope the scan \u2014 calling without categories scans ALL memories and may produce output too large to return inline. For large memory sets, call iteratively per category rather than globally. Default limit is 50; increase only when using a narrow category filter.";
8
+ export declare function handleSync(args: {
9
+ project?: string;
10
+ categories?: string[];
11
+ limit?: number;
12
+ }): Promise<{
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ }>;
18
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,UAAU;;;;CActB,CAAC;AAEF,eAAO,MAAM,eAAe,ueACmc,CAAC;AAEhe,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAuFjG"}
@@ -0,0 +1,93 @@
1
+ import { z } from 'zod';
2
+ import { scrollMemories } from '../services/sqlite.js';
3
+ import { hashFile } from '../services/file-checksums.js';
4
+ import { coerceStringArray } from './utils.js';
5
+ import { text } from './response.js';
6
+ export const syncSchema = {
7
+ project: z
8
+ .string()
9
+ .optional()
10
+ .describe('Optional: only check memories for this project.'),
11
+ categories: coerceStringArray()
12
+ .optional()
13
+ .describe('Optional: filter results to memories in these categories only.'),
14
+ limit: z
15
+ .coerce.number()
16
+ .min(1)
17
+ .max(1000)
18
+ .optional()
19
+ .describe('Max stale memories to return (default 50). Keep low to avoid output overflow.'),
20
+ };
21
+ export const syncDescription = 'Check for stale memories whose related files have changed. Compares stored file checksums against current hashes. Returns compact output (ID + changed files only, no content). IMPORTANT: Always pass "categories" to scope the scan — calling without categories scans ALL memories and may produce output too large to return inline. For large memory sets, call iteratively per category rather than globally. Default limit is 50; increase only when using a narrow category filter.';
22
+ export async function handleSync(args) {
23
+ // Scroll all memories (paginated)
24
+ const allPoints = [];
25
+ let offset;
26
+ do {
27
+ const filter = args.project
28
+ ? { must: [{ key: 'project', match: { value: args.project } }] }
29
+ : undefined;
30
+ const result = await scrollMemories(filter, 100, offset);
31
+ for (const p of result.points) {
32
+ if (p.payload)
33
+ allPoints.push({ id: p.id, payload: p.payload });
34
+ }
35
+ offset = result.next_page_offset ?? undefined;
36
+ } while (offset);
37
+ // Only evaluate memories with stored file_checksums — we need a baseline to compare against.
38
+ // Memories with related_files but no checksums are legacy; we can't determine staleness without a baseline.
39
+ const withChecksums = allPoints.filter(p => {
40
+ const payload = p.payload;
41
+ return payload.file_checksums && Object.keys(payload.file_checksums).length > 0;
42
+ });
43
+ const stale = [];
44
+ for (const point of withChecksums) {
45
+ const payload = point.payload;
46
+ const storedChecksums = payload.file_checksums;
47
+ const staleFiles = [];
48
+ for (const filePath of Object.keys(storedChecksums)) {
49
+ const currentHash = hashFile(filePath);
50
+ if (!currentHash)
51
+ continue; // File not found — can't compare, skip
52
+ const storedHash = storedChecksums[filePath];
53
+ if (currentHash !== storedHash) {
54
+ staleFiles.push(filePath);
55
+ }
56
+ }
57
+ if (staleFiles.length > 0) {
58
+ stale.push({
59
+ id: point.id,
60
+ category: payload.category,
61
+ importance: payload.importance,
62
+ stale_files: staleFiles,
63
+ });
64
+ }
65
+ }
66
+ // Apply category filter if provided
67
+ const filtered = args.categories && args.categories.length > 0
68
+ ? stale.filter(m => args.categories.includes(m.category))
69
+ : stale;
70
+ if (filtered.length === 0) {
71
+ const scopeMsg = args.categories ? ` in categories [${args.categories.join(', ')}]` : '';
72
+ return text(`All clear — checked ${withChecksums.length} memories with stored checksums${scopeMsg}, none are stale.`);
73
+ }
74
+ // Sort by importance descending
75
+ filtered.sort((a, b) => b.importance - a.importance);
76
+ // Apply limit
77
+ const maxResults = args.limit ?? 50;
78
+ const limited = filtered.slice(0, maxResults);
79
+ const truncated = filtered.length > maxResults;
80
+ // Compact output — IDs and changed files only, no full content
81
+ const scopeMsg = args.categories ? ` in [${args.categories.join(', ')}]` : '';
82
+ let msg = `Found ${filtered.length} stale memories${scopeMsg} (out of ${withChecksums.length} with checksums)`;
83
+ if (truncated)
84
+ msg += ` — showing first ${maxResults}`;
85
+ msg += `:\n\n`;
86
+ for (const mem of limited) {
87
+ msg += `${mem.id} | ${mem.category} | imp:${mem.importance}\n`;
88
+ msg += ` Changed: ${mem.stale_files.join(', ')}\n`;
89
+ }
90
+ msg += `\nTo get full content: use recall with the memory ID, or memories with action "by-category".`;
91
+ return text(msg);
92
+ }
93
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const tictactoeSchema: {
3
+ action: z.ZodEnum<["start", "move", "state", "end"]>;
4
+ cell: z.ZodOptional<z.ZodNumber>;
5
+ piece: z.ZodOptional<z.ZodEnum<["X", "O"]>>;
6
+ };
7
+ export declare const tictactoeDescription = "Play Tic Tac Toe on the whiteboard. Actions: \"start\" sets up the board (piece defaults to X), \"move\" places the current turn's piece in cell 1-9, \"state\" shows the current board, \"end\" closes the game. The board renders visually on the whiteboard. X always goes first. Returns ASCII board + game status after each action.";
8
+ export declare function handleTictactoe(args: {
9
+ action: string;
10
+ cell?: number;
11
+ piece?: string;
12
+ }): Promise<{
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ }>;
18
+ //# sourceMappingURL=tictactoe-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tictactoe-tools.d.ts","sourceRoot":"","sources":["../../src/tools/tictactoe-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,eAAe;;;;CAU3B,CAAC;AAEF,eAAO,MAAM,oBAAoB,8UACqS,CAAC;AAEvU,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAa5F"}
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ import * as ni from '../services/neural-interface.js';
3
+ import { text } from './response.js';
4
+ // ═══════════════════════════════════════════
5
+ // tictactoe — Dedicated TicTacToe MCP tool
6
+ // ═══════════════════════════════════════════
7
+ export const tictactoeSchema = {
8
+ action: z.enum(['start', 'move', 'state', 'end']).describe('Game action. "start" = set up board (optional piece: X or O). "move" = place piece (requires cell 1-9). "state" = get current board. "end" = tear down game.'),
9
+ cell: z.number().min(1).max(9).optional().describe('Cell number 1-9 (required for "move" action). Layout:\n 1 | 2 | 3\n ---------\n 4 | 5 | 6\n ---------\n 7 | 8 | 9'),
10
+ piece: z.enum(['X', 'O']).optional().describe('Which piece you play as (for "start" action). Default: X. X always goes first.'),
11
+ };
12
+ export const tictactoeDescription = 'Play Tic Tac Toe on the whiteboard. Actions: "start" sets up the board (piece defaults to X), "move" places the current turn\'s piece in cell 1-9, "state" shows the current board, "end" closes the game. The board renders visually on the whiteboard. X always goes first. Returns ASCII board + game status after each action.';
13
+ export async function handleTictactoe(args) {
14
+ switch (args.action) {
15
+ case 'start':
16
+ return handleStart(args.piece);
17
+ case 'move':
18
+ return handleMove(args.cell);
19
+ case 'state':
20
+ return handleState();
21
+ case 'end':
22
+ return handleEnd();
23
+ default:
24
+ return text(`Unknown action: ${args.action}`);
25
+ }
26
+ }
27
+ async function handleStart(piece) {
28
+ const result = await ni.tictactoeStart(piece);
29
+ if (result.error) {
30
+ return text(`Failed to start game: ${result.error}`);
31
+ }
32
+ const msg = `Game started! You are ${result.piece}.\n\n${result.ascii}\n\nTurn: ${result.turn} | Status: ${result.status}`;
33
+ return text(msg);
34
+ }
35
+ async function handleMove(cell) {
36
+ if (cell === undefined) {
37
+ return text('cell is required for move action (1-9)');
38
+ }
39
+ const result = await ni.tictactoeMove(cell);
40
+ if (result.error) {
41
+ return text(`Move failed: ${result.error}`);
42
+ }
43
+ let statusLine = `Turn: ${result.turn} | Status: ${result.status}`;
44
+ if (result.winner) {
45
+ statusLine = `Status: ${result.winner} wins!`;
46
+ }
47
+ else if (result.status === 'draw') {
48
+ statusLine = 'Status: draw';
49
+ }
50
+ const msg = `${result.ascii}\n\n${statusLine}`;
51
+ return text(msg);
52
+ }
53
+ async function handleState() {
54
+ const result = await ni.tictactoeState();
55
+ if (result.error) {
56
+ return text(`Failed to get state: ${result.error}`);
57
+ }
58
+ if (!result.active) {
59
+ return text('No active TicTacToe game. Use action "start" to begin.');
60
+ }
61
+ let statusLine = `Turn: ${result.turn} | Status: ${result.status} | You are: ${result.piece}`;
62
+ if (result.winner) {
63
+ statusLine = `Status: ${result.winner} wins! | You were: ${result.piece}`;
64
+ }
65
+ else if (result.status === 'draw') {
66
+ statusLine = `Status: draw | You were: ${result.piece}`;
67
+ }
68
+ const msg = `${result.ascii}\n\n${statusLine}`;
69
+ return text(msg);
70
+ }
71
+ async function handleEnd() {
72
+ const result = await ni.tictactoeEnd();
73
+ if (result.error) {
74
+ return text(`Failed to end game: ${result.error}`);
75
+ }
76
+ return text('Game ended. Board cleared.');
77
+ }
78
+ //# sourceMappingURL=tictactoe-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tictactoe-tools.js","sourceRoot":"","sources":["../../src/tools/tictactoe-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 TicTacToe MCP tool on the given server instance.
4
+ * Single tool with action-based dispatch: start, move, state, end.
5
+ */
6
+ export declare function registerTicTacToeTools(server: McpServer): void;
7
+ //# sourceMappingURL=tictactoe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tictactoe.d.ts","sourceRoot":"","sources":["../../src/tools/tictactoe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAEvD"}
@@ -0,0 +1,9 @@
1
+ import { tictactoeSchema, tictactoeDescription, handleTictactoe, } from './tictactoe-tools.js';
2
+ /**
3
+ * Register the TicTacToe MCP tool on the given server instance.
4
+ * Single tool with action-based dispatch: start, move, state, end.
5
+ */
6
+ export function registerTicTacToeTools(server) {
7
+ server.tool('tictactoe', tictactoeDescription, tictactoeSchema, handleTictactoe);
8
+ }
9
+ //# sourceMappingURL=tictactoe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tictactoe.js","sourceRoot":"","sources":["../../src/tools/tictactoe.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EAAE,oBAAoB,EAAE,eAAe,GACvD,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Zod schema that accepts an array of strings OR a string representation of one.
4
+ *
5
+ * Claude Code's MCP client sometimes serializes array arguments as strings
6
+ * (e.g. `"[\"a\",\"b\"]"` or `"a, b"`) instead of real JSON arrays.
7
+ * This preprocessor coerces both forms into a proper string array.
8
+ */
9
+ export declare function coerceStringArray(): z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AACH,wBAAgB,iBAAiB,qEAehC"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Zod schema that accepts an array of strings OR a string representation of one.
4
+ *
5
+ * Claude Code's MCP client sometimes serializes array arguments as strings
6
+ * (e.g. `"[\"a\",\"b\"]"` or `"a, b"`) instead of real JSON arrays.
7
+ * This preprocessor coerces both forms into a proper string array.
8
+ */
9
+ export function coerceStringArray() {
10
+ return z.preprocess((val) => {
11
+ if (Array.isArray(val))
12
+ return val;
13
+ if (typeof val === 'string') {
14
+ const trimmed = val.trim();
15
+ if (!trimmed)
16
+ return [];
17
+ // Try JSON array first: ["a", "b"]
18
+ if (trimmed.startsWith('[')) {
19
+ try {
20
+ return JSON.parse(trimmed);
21
+ }
22
+ catch { /* fall through */ }
23
+ }
24
+ // Comma-separated fallback: "a, b, c"
25
+ return trimmed.split(',').map(s => s.trim()).filter(Boolean);
26
+ }
27
+ return val;
28
+ }, z.array(z.string()));
29
+ }
30
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACnC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YACxB,mCAAmC;YACnC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAClE,CAAC;YACD,sCAAsC;YACtC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,194 @@
1
+ import { z } from 'zod';
2
+ export declare const whiteboardReadSchema: {};
3
+ export declare const whiteboardReadDescription = "Read the current whiteboard state. Returns element descriptions with IDs, positions, and properties, plus the usable viewport dimensions (width x height in pixels, excluding navbar and terminal). ALWAYS call this before placing elements \u2014 the viewport tells you the exact canvas boundaries. All elements must fit within these dimensions.";
4
+ export declare function handleWhiteboardRead(): Promise<{
5
+ content: {
6
+ type: "text";
7
+ text: string;
8
+ }[];
9
+ }>;
10
+ export declare const whiteboardAddSchema: {
11
+ coordMode: z.ZodOptional<z.ZodEnum<["px", "pct"]>>;
12
+ layout: z.ZodOptional<z.ZodEnum<["row", "column", "grid", "center"]>>;
13
+ elements: z.ZodArray<z.ZodObject<{
14
+ type: z.ZodEnum<["text", "list", "shape", "arrow", "pen", "image", "section"]>;
15
+ x: z.ZodOptional<z.ZodNumber>;
16
+ y: z.ZodOptional<z.ZodNumber>;
17
+ width: z.ZodOptional<z.ZodNumber>;
18
+ height: z.ZodOptional<z.ZodNumber>;
19
+ content: z.ZodOptional<z.ZodString>;
20
+ items: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
21
+ ordered: z.ZodOptional<z.ZodBoolean>;
22
+ fontSize: z.ZodOptional<z.ZodNumber>;
23
+ color: z.ZodOptional<z.ZodString>;
24
+ bold: z.ZodOptional<z.ZodBoolean>;
25
+ italic: z.ZodOptional<z.ZodBoolean>;
26
+ shape: z.ZodOptional<z.ZodEnum<["rect", "pill", "circle", "drawn-circle"]>>;
27
+ points: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodNumber, "many">, "many">>;
28
+ startAnchor: z.ZodOptional<z.ZodString>;
29
+ endAnchor: z.ZodOptional<z.ZodString>;
30
+ strokeWidth: z.ZodOptional<z.ZodNumber>;
31
+ rotation: z.ZodOptional<z.ZodNumber>;
32
+ url: z.ZodOptional<z.ZodString>;
33
+ sectionType: z.ZodOptional<z.ZodEnum<["navbar", "hero", "sidebar", "content", "footer", "card", "form", "image-placeholder", "button", "text-block", "grid", "modal"]>>;
34
+ label: z.ZodOptional<z.ZodString>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ type: "text" | "image" | "list" | "shape" | "arrow" | "pen" | "section";
37
+ bold?: boolean | undefined;
38
+ color?: string | undefined;
39
+ content?: string | undefined;
40
+ url?: string | undefined;
41
+ y?: number | undefined;
42
+ italic?: boolean | undefined;
43
+ shape?: "rect" | "pill" | "circle" | "drawn-circle" | undefined;
44
+ x?: number | undefined;
45
+ width?: number | undefined;
46
+ height?: number | undefined;
47
+ items?: string[] | undefined;
48
+ ordered?: boolean | undefined;
49
+ fontSize?: number | undefined;
50
+ points?: number[][] | undefined;
51
+ startAnchor?: string | undefined;
52
+ endAnchor?: string | undefined;
53
+ strokeWidth?: number | undefined;
54
+ rotation?: number | undefined;
55
+ sectionType?: "content" | "grid" | "navbar" | "hero" | "sidebar" | "footer" | "card" | "form" | "image-placeholder" | "button" | "text-block" | "modal" | undefined;
56
+ label?: string | undefined;
57
+ }, {
58
+ type: "text" | "image" | "list" | "shape" | "arrow" | "pen" | "section";
59
+ bold?: boolean | undefined;
60
+ color?: string | undefined;
61
+ content?: string | undefined;
62
+ url?: string | undefined;
63
+ y?: number | undefined;
64
+ italic?: boolean | undefined;
65
+ shape?: "rect" | "pill" | "circle" | "drawn-circle" | undefined;
66
+ x?: number | undefined;
67
+ width?: number | undefined;
68
+ height?: number | undefined;
69
+ items?: string[] | undefined;
70
+ ordered?: boolean | undefined;
71
+ fontSize?: number | undefined;
72
+ points?: number[][] | undefined;
73
+ startAnchor?: string | undefined;
74
+ endAnchor?: string | undefined;
75
+ strokeWidth?: number | undefined;
76
+ rotation?: number | undefined;
77
+ sectionType?: "content" | "grid" | "navbar" | "hero" | "sidebar" | "footer" | "card" | "form" | "image-placeholder" | "button" | "text-block" | "modal" | undefined;
78
+ label?: string | undefined;
79
+ }>, "many">;
80
+ };
81
+ export declare const whiteboardAddDescription = "Add elements to the whiteboard. ALWAYS call whiteboard_read first to get the usable viewport size.\n\n\u26A0\uFE0F LAYOUT RULES (MANDATORY):\n1. COMPACT DESIGN \u2014 Do NOT fill the entire viewport. Use ~70-80% of viewport width, centered horizontally. This creates a clean, contained wireframe.\n2. VERTICAL FIT \u2014 ALL elements MUST fit within the viewport height. Scale section heights proportionally if the total exceeds the available space. Leave ~20px padding from top and bottom edges.\n3. NO OVERFLOW \u2014 No element should extend beyond viewport edges. The viewport already excludes the navbar, toolbar, and terminal. Coordinates are auto-offset to the usable area.\n4. PROPORTIONAL SCALING \u2014 Section default sizes are for manual use. When building full-page wireframes via MCP, calculate heights as fractions of viewport height (e.g. navbar=6%, hero=30%, content=40%, footer=10%).\n\nCoordinate modes (coordMode): \"px\" (default) = absolute pixels. \"pct\" = percentage of usable viewport (0-100), e.g. x:10 y:5 = near top-left of usable area. Coordinates are automatically offset past the navbar and toolbar.\n\nAuto-layout (layout): overrides individual x/y. \"row\" = horizontal row centered vertically. \"column\" = vertical stack centered horizontally. \"grid\" = auto-grid (2-4 columns based on count). \"center\" = stacked in center. Layouts auto-fit within viewport.\n\nSupports: text (\\n for line breaks), list (items array), shape (rect/pill/circle/drawn-circle), arrow (points + optional anchoring), pen, image (server URL), section (wireframe blocks). Returns assigned IDs. Good defaults: text fontSize 22, list fontSize 18, shapes 160x100.\n\nWireframe sections (type \"section\"): Semantic website layout blocks. Set sectionType (navbar/hero/sidebar/content/footer/card/form/image-placeholder/button/text-block/grid/modal) and optional label. When using \"pct\" coordMode, set widths as % of viewport (e.g. 70 for 70%) and heights as % too. Center horizontally with x: 15 for a 70%-width element.";
82
+ export declare function handleWhiteboardAdd(args: {
83
+ elements: Record<string, unknown>[];
84
+ coordMode?: string;
85
+ layout?: string;
86
+ }): Promise<{
87
+ content: {
88
+ type: "text";
89
+ text: string;
90
+ }[];
91
+ }>;
92
+ export declare const whiteboardUpdateSchema: {
93
+ coordMode: z.ZodOptional<z.ZodEnum<["px", "pct"]>>;
94
+ id: z.ZodString;
95
+ updates: z.ZodObject<{
96
+ x: z.ZodOptional<z.ZodNumber>;
97
+ y: z.ZodOptional<z.ZodNumber>;
98
+ width: z.ZodOptional<z.ZodNumber>;
99
+ height: z.ZodOptional<z.ZodNumber>;
100
+ content: z.ZodOptional<z.ZodString>;
101
+ items: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
102
+ ordered: z.ZodOptional<z.ZodBoolean>;
103
+ fontSize: z.ZodOptional<z.ZodNumber>;
104
+ color: z.ZodOptional<z.ZodString>;
105
+ bold: z.ZodOptional<z.ZodBoolean>;
106
+ italic: z.ZodOptional<z.ZodBoolean>;
107
+ shape: z.ZodOptional<z.ZodEnum<["rect", "pill", "circle", "drawn-circle"]>>;
108
+ points: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodNumber, "many">, "many">>;
109
+ startAnchor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
110
+ endAnchor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
111
+ rotation: z.ZodOptional<z.ZodNumber>;
112
+ strokeWidth: z.ZodOptional<z.ZodNumber>;
113
+ sectionType: z.ZodOptional<z.ZodEnum<["navbar", "hero", "sidebar", "content", "footer", "card", "form", "image-placeholder", "button", "text-block", "grid", "modal"]>>;
114
+ label: z.ZodOptional<z.ZodString>;
115
+ }, "strip", z.ZodTypeAny, {
116
+ bold?: boolean | undefined;
117
+ color?: string | undefined;
118
+ content?: string | undefined;
119
+ y?: number | undefined;
120
+ italic?: boolean | undefined;
121
+ shape?: "rect" | "pill" | "circle" | "drawn-circle" | undefined;
122
+ x?: number | undefined;
123
+ width?: number | undefined;
124
+ height?: number | undefined;
125
+ items?: string[] | undefined;
126
+ ordered?: boolean | undefined;
127
+ fontSize?: number | undefined;
128
+ points?: number[][] | undefined;
129
+ startAnchor?: string | null | undefined;
130
+ endAnchor?: string | null | undefined;
131
+ strokeWidth?: number | undefined;
132
+ rotation?: number | undefined;
133
+ sectionType?: "content" | "grid" | "navbar" | "hero" | "sidebar" | "footer" | "card" | "form" | "image-placeholder" | "button" | "text-block" | "modal" | undefined;
134
+ label?: string | undefined;
135
+ }, {
136
+ bold?: boolean | undefined;
137
+ color?: string | undefined;
138
+ content?: string | undefined;
139
+ y?: number | undefined;
140
+ italic?: boolean | undefined;
141
+ shape?: "rect" | "pill" | "circle" | "drawn-circle" | undefined;
142
+ x?: number | undefined;
143
+ width?: number | undefined;
144
+ height?: number | undefined;
145
+ items?: string[] | undefined;
146
+ ordered?: boolean | undefined;
147
+ fontSize?: number | undefined;
148
+ points?: number[][] | undefined;
149
+ startAnchor?: string | null | undefined;
150
+ endAnchor?: string | null | undefined;
151
+ strokeWidth?: number | undefined;
152
+ rotation?: number | undefined;
153
+ sectionType?: "content" | "grid" | "navbar" | "hero" | "sidebar" | "footer" | "card" | "form" | "image-placeholder" | "button" | "text-block" | "modal" | undefined;
154
+ label?: string | undefined;
155
+ }>;
156
+ };
157
+ export declare const whiteboardUpdateDescription = "Update properties of an existing whiteboard element. Use whiteboard_read first to get element IDs. Only the specified fields are changed; others remain untouched. Set coordMode to \"pct\" to use percentage-based positioning. Changes appear in real-time.";
158
+ export declare function handleWhiteboardUpdate(args: {
159
+ id: string;
160
+ updates: Record<string, unknown>;
161
+ coordMode?: string;
162
+ }): Promise<{
163
+ content: {
164
+ type: "text";
165
+ text: string;
166
+ }[];
167
+ }>;
168
+ export declare const whiteboardRemoveSchema: {
169
+ id: z.ZodOptional<z.ZodString>;
170
+ };
171
+ export declare const whiteboardRemoveDescription = "Remove a specific element from the whiteboard by ID, or clear the entire whiteboard if no ID is provided. Use whiteboard_read first to see element IDs. Arrows anchored to a removed element will be detached.";
172
+ export declare function handleWhiteboardRemove(args: {
173
+ id?: string;
174
+ }): Promise<{
175
+ content: {
176
+ type: "text";
177
+ text: string;
178
+ }[];
179
+ }>;
180
+ export declare const whiteboardScreenshotSchema: {};
181
+ export declare const whiteboardScreenshotDescription = "Take a visual screenshot of the whiteboard. Returns a JPEG image showing all current elements. Requires the Neural Interface to be open in a browser with Focus mode active. After receiving the screenshot, spawn a Haiku Task agent to interpret the visual contents if needed.";
182
+ export declare function handleWhiteboardScreenshot(): Promise<{
183
+ content: {
184
+ type: "text";
185
+ text: string;
186
+ }[];
187
+ } | {
188
+ content: {
189
+ type: "image";
190
+ data: string;
191
+ mimeType: string;
192
+ }[];
193
+ }>;
194
+ //# sourceMappingURL=whiteboard-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whiteboard-tools.d.ts","sourceRoot":"","sources":["../../src/tools/whiteboard-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,oBAAoB,IAAK,CAAC;AAEvC,eAAO,MAAM,yBAAyB,2VAC+S,CAAC;AA+EtV,wBAAsB,oBAAoB;;;;;GA6BzC;AAOD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,s/DACk6D,CAAC;AAEx8D,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAS3H;AAOD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwBlC,CAAC;AAEF,eAAO,MAAM,2BAA2B,kQACuN,CAAC;AAEhQ,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAQtH;AAOD,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,eAAO,MAAM,2BAA2B,mNAC0K,CAAC;AAEnN,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAgBjE;AAOD,eAAO,MAAM,0BAA0B,IAAK,CAAC;AAE7C,eAAO,MAAM,+BAA+B,sRACyO,CAAC;AAEtR,wBAAsB,0BAA0B;;;;;;;;;;;GAO/C"}