synabun 1.3.0

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 (187) hide show
  1. package/CHANGELOG.md +665 -0
  2. package/LICENSE +191 -0
  3. package/README.md +853 -0
  4. package/hooks/claude-code/post-plan.mjs +391 -0
  5. package/hooks/claude-code/post-remember.mjs +239 -0
  6. package/hooks/claude-code/pre-compact.mjs +241 -0
  7. package/hooks/claude-code/pre-websearch.mjs +90 -0
  8. package/hooks/claude-code/prompt-submit.mjs +861 -0
  9. package/hooks/claude-code/session-start.mjs +494 -0
  10. package/hooks/claude-code/shared.mjs +368 -0
  11. package/hooks/claude-code/stop.mjs +646 -0
  12. package/hooks/claude-code/test-user-learning.mjs +531 -0
  13. package/mcp-server/package.json +38 -0
  14. package/mcp-server/run.mjs +10 -0
  15. package/mcp-server/src/config.ts +70 -0
  16. package/mcp-server/src/http.ts +93 -0
  17. package/mcp-server/src/index.ts +203 -0
  18. package/mcp-server/src/preload-http.ts +25 -0
  19. package/mcp-server/src/preload.ts +29 -0
  20. package/mcp-server/src/scripts/migrate-qdrant-to-sqlite.ts +506 -0
  21. package/mcp-server/src/services/categories.ts +429 -0
  22. package/mcp-server/src/services/discord.ts +702 -0
  23. package/mcp-server/src/services/file-checksums.ts +33 -0
  24. package/mcp-server/src/services/local-embeddings.ts +77 -0
  25. package/mcp-server/src/services/neural-interface.ts +344 -0
  26. package/mcp-server/src/services/sqlite.ts +823 -0
  27. package/mcp-server/src/tools/browser-advanced.ts +123 -0
  28. package/mcp-server/src/tools/browser-interact.ts +255 -0
  29. package/mcp-server/src/tools/browser-navigate.ts +77 -0
  30. package/mcp-server/src/tools/browser-observe.ts +1330 -0
  31. package/mcp-server/src/tools/browser.ts +107 -0
  32. package/mcp-server/src/tools/card-tools.ts +193 -0
  33. package/mcp-server/src/tools/card.ts +22 -0
  34. package/mcp-server/src/tools/category.ts +379 -0
  35. package/mcp-server/src/tools/discord-channel.ts +274 -0
  36. package/mcp-server/src/tools/discord-guild.ts +188 -0
  37. package/mcp-server/src/tools/discord-member.ts +158 -0
  38. package/mcp-server/src/tools/discord-message.ts +231 -0
  39. package/mcp-server/src/tools/discord-onboarding.ts +228 -0
  40. package/mcp-server/src/tools/discord-role.ts +209 -0
  41. package/mcp-server/src/tools/discord-thread.ts +110 -0
  42. package/mcp-server/src/tools/discord-webhook.ts +176 -0
  43. package/mcp-server/src/tools/discord.ts +40 -0
  44. package/mcp-server/src/tools/forget.ts +38 -0
  45. package/mcp-server/src/tools/git-tools.ts +141 -0
  46. package/mcp-server/src/tools/git.ts +13 -0
  47. package/mcp-server/src/tools/image-tools.ts +98 -0
  48. package/mcp-server/src/tools/image.ts +17 -0
  49. package/mcp-server/src/tools/leonardo-browser-tools.ts +281 -0
  50. package/mcp-server/src/tools/leonardo.ts +28 -0
  51. package/mcp-server/src/tools/loop.ts +348 -0
  52. package/mcp-server/src/tools/memories.ts +118 -0
  53. package/mcp-server/src/tools/recall.ts +323 -0
  54. package/mcp-server/src/tools/reflect.ts +145 -0
  55. package/mcp-server/src/tools/remember.ts +115 -0
  56. package/mcp-server/src/tools/response.ts +26 -0
  57. package/mcp-server/src/tools/restore.ts +34 -0
  58. package/mcp-server/src/tools/sync.ts +114 -0
  59. package/mcp-server/src/tools/tictactoe-tools.ts +98 -0
  60. package/mcp-server/src/tools/tictactoe.ts +13 -0
  61. package/mcp-server/src/tools/utils.ts +25 -0
  62. package/mcp-server/src/tools/whiteboard-tools.ts +260 -0
  63. package/mcp-server/src/tools/whiteboard.ts +22 -0
  64. package/mcp-server/src/tui.ts +940 -0
  65. package/mcp-server/src/types.ts +85 -0
  66. package/mcp-server/tsconfig.json +19 -0
  67. package/neural-interface/package.json +27 -0
  68. package/neural-interface/public/apple-touch-icon.png +0 -0
  69. package/neural-interface/public/category-logos/claude.svg +1 -0
  70. package/neural-interface/public/category-logos/gemini-color.svg +1 -0
  71. package/neural-interface/public/category-logos/openai.svg +1 -0
  72. package/neural-interface/public/category-logos/synabun.png +0 -0
  73. package/neural-interface/public/claude-chat.css +878 -0
  74. package/neural-interface/public/claude-chat.html +92 -0
  75. package/neural-interface/public/claude-chat.js +1168 -0
  76. package/neural-interface/public/favicon-16x16.png +0 -0
  77. package/neural-interface/public/favicon-32x32.png +0 -0
  78. package/neural-interface/public/gallery.svg +6 -0
  79. package/neural-interface/public/icon-192.png +0 -0
  80. package/neural-interface/public/icon-512.png +0 -0
  81. package/neural-interface/public/index-legacy.html +14677 -0
  82. package/neural-interface/public/index.html +212 -0
  83. package/neural-interface/public/index2d-legacy.html +8193 -0
  84. package/neural-interface/public/index2d.html +127 -0
  85. package/neural-interface/public/invite.html +351 -0
  86. package/neural-interface/public/leonardoai.svg +1 -0
  87. package/neural-interface/public/logo-synabun.png +0 -0
  88. package/neural-interface/public/logoHD.png +0 -0
  89. package/neural-interface/public/manifest.json +14 -0
  90. package/neural-interface/public/offline.html +299 -0
  91. package/neural-interface/public/onboarding.html +2335 -0
  92. package/neural-interface/public/openclaw-logo-text.png +0 -0
  93. package/neural-interface/public/pin-svgrepo-com.svg +25 -0
  94. package/neural-interface/public/sessionicon.svg +8 -0
  95. package/neural-interface/public/shared/ansi-parser.js +305 -0
  96. package/neural-interface/public/shared/api.js +1043 -0
  97. package/neural-interface/public/shared/colors.js +153 -0
  98. package/neural-interface/public/shared/constants.js +141 -0
  99. package/neural-interface/public/shared/html-shell.js +777 -0
  100. package/neural-interface/public/shared/html-term-renderer.js +1022 -0
  101. package/neural-interface/public/shared/i18n.js +147 -0
  102. package/neural-interface/public/shared/registry.js +82 -0
  103. package/neural-interface/public/shared/state.js +86 -0
  104. package/neural-interface/public/shared/storage.js +150 -0
  105. package/neural-interface/public/shared/styles.css +21212 -0
  106. package/neural-interface/public/shared/ui-automation-studio.js +3573 -0
  107. package/neural-interface/public/shared/ui-bookmarks.js +231 -0
  108. package/neural-interface/public/shared/ui-claude-panel.js +6333 -0
  109. package/neural-interface/public/shared/ui-command-runner.js +534 -0
  110. package/neural-interface/public/shared/ui-cost-widget.js +602 -0
  111. package/neural-interface/public/shared/ui-detail.js +1454 -0
  112. package/neural-interface/public/shared/ui-explorer.js +1356 -0
  113. package/neural-interface/public/shared/ui-file-explorer.js +2750 -0
  114. package/neural-interface/public/shared/ui-games.js +411 -0
  115. package/neural-interface/public/shared/ui-help.js +107 -0
  116. package/neural-interface/public/shared/ui-image-gallery.js +461 -0
  117. package/neural-interface/public/shared/ui-invite.js +519 -0
  118. package/neural-interface/public/shared/ui-keybinds.js +452 -0
  119. package/neural-interface/public/shared/ui-layouts.js +297 -0
  120. package/neural-interface/public/shared/ui-link.js +731 -0
  121. package/neural-interface/public/shared/ui-loading.js +255 -0
  122. package/neural-interface/public/shared/ui-menubar.js +499 -0
  123. package/neural-interface/public/shared/ui-multiselect.js +93 -0
  124. package/neural-interface/public/shared/ui-navbar.js +222 -0
  125. package/neural-interface/public/shared/ui-notifications.js +287 -0
  126. package/neural-interface/public/shared/ui-panels.js +309 -0
  127. package/neural-interface/public/shared/ui-resume.js +653 -0
  128. package/neural-interface/public/shared/ui-search.js +145 -0
  129. package/neural-interface/public/shared/ui-sessions.js +531 -0
  130. package/neural-interface/public/shared/ui-settings.js +5987 -0
  131. package/neural-interface/public/shared/ui-sidebar.js +1905 -0
  132. package/neural-interface/public/shared/ui-skills.js +2805 -0
  133. package/neural-interface/public/shared/ui-stats.js +38 -0
  134. package/neural-interface/public/shared/ui-sync.js +201 -0
  135. package/neural-interface/public/shared/ui-terminal.js +6385 -0
  136. package/neural-interface/public/shared/ui-tooltip.js +123 -0
  137. package/neural-interface/public/shared/ui-trash.js +439 -0
  138. package/neural-interface/public/shared/ui-tutorial-draw.js +875 -0
  139. package/neural-interface/public/shared/ui-tutorial-steps.js +2276 -0
  140. package/neural-interface/public/shared/ui-tutorial.js +1117 -0
  141. package/neural-interface/public/shared/ui-update.js +244 -0
  142. package/neural-interface/public/shared/ui-whiteboard.js +3262 -0
  143. package/neural-interface/public/shared/ui-workspaces.js +722 -0
  144. package/neural-interface/public/shared/utils.js +360 -0
  145. package/neural-interface/public/shared/vterm-buffer.js +1102 -0
  146. package/neural-interface/public/sw.js +52 -0
  147. package/neural-interface/public/synabun.png +0 -0
  148. package/neural-interface/public/toolbar-album.svg +8 -0
  149. package/neural-interface/public/toolbar-question.svg +6 -0
  150. package/neural-interface/public/toolbar-sessions.svg +6 -0
  151. package/neural-interface/public/variant/2d/background.js +113 -0
  152. package/neural-interface/public/variant/2d/context-menu.js +133 -0
  153. package/neural-interface/public/variant/2d/gfx.js +45 -0
  154. package/neural-interface/public/variant/2d/graph.js +1635 -0
  155. package/neural-interface/public/variant/2d/hulls.js +207 -0
  156. package/neural-interface/public/variant/2d/lasso.js +135 -0
  157. package/neural-interface/public/variant/2d/layout.js +594 -0
  158. package/neural-interface/public/variant/2d/main.js +521 -0
  159. package/neural-interface/public/variant/2d/minimap.js +312 -0
  160. package/neural-interface/public/variant/2d/settings-gfx.js +98 -0
  161. package/neural-interface/public/variant/3d/background.js +884 -0
  162. package/neural-interface/public/variant/3d/camera.js +661 -0
  163. package/neural-interface/public/variant/3d/gfx.js +116 -0
  164. package/neural-interface/public/variant/3d/graph.js +2399 -0
  165. package/neural-interface/public/variant/3d/main.js +500 -0
  166. package/neural-interface/public/variant/3d/settings-gfx.js +228 -0
  167. package/neural-interface/scripts/rebuild-pty.js +100 -0
  168. package/neural-interface/server.js +15000 -0
  169. package/neural-interface/templates/CLAUDE-template.md +211 -0
  170. package/package.json +53 -0
  171. package/postinstall.js +135 -0
  172. package/setup.js +260 -0
  173. package/skills/leonardo/SKILL.md +159 -0
  174. package/skills/leonardo/icon.svg +1 -0
  175. package/skills/leonardo/modules/browser-guide.md +378 -0
  176. package/skills/leonardo/modules/image-prompter.md +277 -0
  177. package/skills/leonardo/modules/model-advisor.md +100 -0
  178. package/skills/leonardo/modules/prompt-library.md +110 -0
  179. package/skills/leonardo/modules/style-guide.md +186 -0
  180. package/skills/leonardo/modules/video-prompter.md +311 -0
  181. package/skills/synabun/SKILL.md +185 -0
  182. package/skills/synabun/icon.png +0 -0
  183. package/skills/synabun/modules/audit.md +374 -0
  184. package/skills/synabun/modules/changelog.md +194 -0
  185. package/skills/synabun/modules/idea.md +144 -0
  186. package/skills/synabun/modules/memorize.md +188 -0
  187. package/skills/synabun/synabunicon.png +0 -0
@@ -0,0 +1,231 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — Bookmarks
3
+ // Toolbar dropdown for bookmarking and quick-navigating to memories.
4
+ // Works identically in both 3D and 2D variants.
5
+ // ═══════════════════════════════════════════
6
+
7
+ import { state, emit, on } from './state.js';
8
+ import { KEYS } from './constants.js';
9
+ import { storage } from './storage.js';
10
+ import { catColor } from './colors.js';
11
+
12
+ const $ = (id) => document.getElementById(id);
13
+
14
+ // ── localStorage helpers ──
15
+
16
+ /**
17
+ * Read the bookmarks array from localStorage.
18
+ * @returns {Array<{id:string, title:string, category:string, added:number}>}
19
+ */
20
+ export function loadBookmarks() {
21
+ try {
22
+ return JSON.parse(storage.getItem(KEYS.BOOKMARKS) || '[]');
23
+ } catch {
24
+ return [];
25
+ }
26
+ }
27
+
28
+ function saveBookmarks(arr) {
29
+ storage.setItem(KEYS.BOOKMARKS, JSON.stringify(arr));
30
+ updateBookmarkCount();
31
+ }
32
+
33
+ // ── Public API ──
34
+
35
+ /**
36
+ * Check whether a node is bookmarked.
37
+ * @param {string} nodeId
38
+ * @returns {boolean}
39
+ */
40
+ export function isBookmarked(nodeId) {
41
+ return loadBookmarks().some(b => b.id === nodeId);
42
+ }
43
+
44
+ /**
45
+ * Toggle bookmark state for a node.
46
+ * If already bookmarked, removes it; otherwise adds it.
47
+ * @param {string} nodeId The node ID to toggle
48
+ * @returns {boolean} Whether the node is bookmarked after toggling
49
+ */
50
+ export function toggleBookmark(nodeId) {
51
+ const node = state.allNodes.find(n => n.id === nodeId);
52
+ if (!node) return false;
53
+
54
+ const bookmarks = loadBookmarks();
55
+ const idx = bookmarks.findIndex(b => b.id === node.id);
56
+
57
+ if (idx !== -1) {
58
+ bookmarks.splice(idx, 1);
59
+ } else {
60
+ const p = node.payload || {};
61
+ const preview = (p.content || '').replace(/\n/g, ' ').slice(0, 80);
62
+ bookmarks.unshift({
63
+ id: node.id,
64
+ title: preview || node.id,
65
+ category: p.category || 'uncategorized',
66
+ added: Date.now(),
67
+ });
68
+ }
69
+
70
+ saveBookmarks(bookmarks);
71
+ updateDetailBookmarkBtn(node.id);
72
+ return isBookmarked(node.id);
73
+ }
74
+
75
+ // ── Count badge ──
76
+
77
+ function updateBookmarkCount() {
78
+ const badge = $('bookmark-count');
79
+ if (!badge) return;
80
+ const count = loadBookmarks().length;
81
+ badge.textContent = count > 0 ? count : '';
82
+ }
83
+
84
+ // ── Detail-panel bookmark button ──
85
+
86
+ function updateDetailBookmarkBtn(nodeId) {
87
+ const btn = $('detail-bookmark-btn');
88
+ if (!btn) return;
89
+ const svg = btn.querySelector('svg');
90
+ if (isBookmarked(nodeId)) {
91
+ btn.classList.add('active');
92
+ if (svg) svg.classList.add('filled');
93
+ } else {
94
+ btn.classList.remove('active');
95
+ if (svg) svg.classList.remove('filled');
96
+ }
97
+ }
98
+
99
+ // ── Dropdown rendering ──
100
+
101
+ /**
102
+ * Render the bookmark list inside the dropdown panel.
103
+ */
104
+ export function renderBookmarks() {
105
+ const listEl = $('bookmarks-list');
106
+ if (!listEl) return;
107
+
108
+ const bookmarks = loadBookmarks();
109
+ listEl.innerHTML = '';
110
+
111
+ if (bookmarks.length === 0) {
112
+ listEl.innerHTML = '<div class="dropdown-empty">No bookmarks yet.<br>Click the bookmark icon on any memory to save it here.</div>';
113
+ return;
114
+ }
115
+
116
+ bookmarks.forEach(b => {
117
+ const item = document.createElement('div');
118
+ item.className = 'dropdown-item';
119
+ const color = catColor(b.category);
120
+ item.innerHTML = `
121
+ <div class="dropdown-item-dot" style="background:${color}"></div>
122
+ <div class="dropdown-item-text">
123
+ <div class="dropdown-item-title">${b.title}</div>
124
+ <div class="dropdown-item-sub">${b.category}</div>
125
+ </div>
126
+ <button class="icon-btn icon-btn--danger" style="width:22px;height:22px;font-size:13px;border:none" data-tooltip="Remove">&times;</button>
127
+ `;
128
+
129
+ // Click item -> navigate to node
130
+ const navToBookmark = () => {
131
+ const node = state.allNodes.find(n => n.id === b.id);
132
+ if (node) {
133
+ emit('panel:close-all-dropdowns');
134
+ emit('graph:navigate', { node, zoom: 'gentle' });
135
+ }
136
+ };
137
+ item.querySelector('.dropdown-item-text').addEventListener('click', navToBookmark);
138
+ item.querySelector('.dropdown-item-dot').addEventListener('click', navToBookmark);
139
+
140
+ // Remove button
141
+ item.querySelector('.icon-btn').addEventListener('click', (e) => {
142
+ e.stopPropagation();
143
+ const bks = loadBookmarks().filter(x => x.id !== b.id);
144
+ saveBookmarks(bks);
145
+ renderBookmarks();
146
+ if (state.selectedNodeId === b.id) updateDetailBookmarkBtn(b.id);
147
+ });
148
+
149
+ listEl.appendChild(item);
150
+ });
151
+ }
152
+
153
+ // ── Dropdown toggle (topright overlay) ──
154
+
155
+ let _bookmarksOpen = false;
156
+
157
+ function openBookmarksDropdown() {
158
+ const dd = $('bookmarks-dropdown');
159
+ if (!dd) return;
160
+ emit('panel:close-all-dropdowns');
161
+ dd.style.display = '';
162
+ _bookmarksOpen = true;
163
+ renderBookmarks();
164
+ const btn = $('topright-bookmarks-btn');
165
+ if (btn) btn.classList.add('active');
166
+ }
167
+
168
+ function closeBookmarksDropdown() {
169
+ const dd = $('bookmarks-dropdown');
170
+ if (!dd) return;
171
+ dd.style.display = 'none';
172
+ _bookmarksOpen = false;
173
+ const btn = $('topright-bookmarks-btn');
174
+ if (btn) btn.classList.remove('active');
175
+ }
176
+
177
+ function toggleBookmarksDropdown() {
178
+ if (_bookmarksOpen) closeBookmarksDropdown();
179
+ else openBookmarksDropdown();
180
+ }
181
+
182
+ // ── Initialization ──
183
+
184
+ /**
185
+ * Wire up all bookmark-related event listeners.
186
+ * Call once after the DOM is ready.
187
+ */
188
+ export function initBookmarks() {
189
+ const detailBookmarkBtn = $('detail-bookmark-btn');
190
+
191
+ // Topright bookmarks button toggle
192
+ const toprightBtn = $('topright-bookmarks-btn');
193
+ if (toprightBtn) {
194
+ toprightBtn.addEventListener('click', (e) => {
195
+ e.stopPropagation();
196
+ toggleBookmarksDropdown();
197
+ });
198
+ }
199
+
200
+ // Close on outside click
201
+ document.addEventListener('click', (e) => {
202
+ if (_bookmarksOpen && !e.target.closest('#bookmarks-overlay')) {
203
+ closeBookmarksDropdown();
204
+ }
205
+ });
206
+
207
+ // Close when other dropdowns request exclusivity
208
+ on('panel:close-all-dropdowns', () => closeBookmarksDropdown());
209
+ on('panel:close-all-dropdowns-except', (name) => {
210
+ if (name !== 'bookmarks') closeBookmarksDropdown();
211
+ });
212
+
213
+ // Legacy event still supported
214
+ on('bookmarks:render', renderBookmarks);
215
+
216
+ // Detail panel bookmark toggle
217
+ if (detailBookmarkBtn) {
218
+ detailBookmarkBtn.addEventListener('click', () => {
219
+ if (!state.selectedNodeId) return;
220
+ toggleBookmark(state.selectedNodeId);
221
+ });
222
+ }
223
+
224
+ // When selection changes, update the detail bookmark button
225
+ on('selection-changed', (nodeId) => {
226
+ if (nodeId) updateDetailBookmarkBtn(nodeId);
227
+ });
228
+
229
+ // Initialize count badge on load
230
+ updateBookmarkCount();
231
+ }