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,297 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — Layout Presets
3
+ // Toolbar dropdown for saving / loading / applying node layout presets.
4
+ // Supports both built-in generative layouts (registered by each variant)
5
+ // and user-saved presets stored via server-backed storage.
6
+ // ═══════════════════════════════════════════
7
+
8
+ import { state, emit, on } from './state.js';
9
+ import { KEYS } from './constants.js';
10
+ import { storage } from './storage.js';
11
+ import { getVariant } from './registry.js';
12
+
13
+ const $ = (id) => document.getElementById(id);
14
+
15
+ // ── Module state ──
16
+ let activePresetId = null;
17
+
18
+ // Built-in presets are registered by the variant at boot time
19
+ // Each entry: { id, name, desc, generate: () => positions|null }
20
+ // For 3D: generate() returns { [nodeId]: {x,y,z} }
21
+ // For 2D: apply() is called directly (since 2D presets operate on the graph)
22
+ let _builtinPresets = [];
23
+
24
+ // ── Storage key selection ──
25
+
26
+ function storageKey() {
27
+ return getVariant() === '2d' ? KEYS.LAYOUT_PRESETS_2D : KEYS.LAYOUT_PRESETS_3D;
28
+ }
29
+
30
+ // ── localStorage helpers ──
31
+
32
+ /**
33
+ * Read user-saved layout presets from localStorage.
34
+ * For 3D: returns Array<{id, name, created, positions, camera}>
35
+ * For 2D: returns Object<name, {[nodeId]: {x,y}}> (legacy format)
36
+ * @returns {Array|Object}
37
+ */
38
+ function getUserPresets() {
39
+ try {
40
+ return JSON.parse(storage.getItem(storageKey()) || (getVariant() === '2d' ? '{}' : '[]'));
41
+ } catch {
42
+ return getVariant() === '2d' ? {} : [];
43
+ }
44
+ }
45
+
46
+ function saveUserPresets(data) {
47
+ storage.setItem(storageKey(), JSON.stringify(data));
48
+ }
49
+
50
+ // ── Built-in preset registration ──
51
+
52
+ /**
53
+ * Register built-in layout presets for the current variant.
54
+ * Called by the variant boot code before initLayouts().
55
+ *
56
+ * 3D presets: { id, name, desc, generate: () => ({[nodeId]: {x,y,z}}|null) }
57
+ * 2D presets: { id, name, desc, apply: () => void }
58
+ *
59
+ * @param {Array} presets
60
+ */
61
+ export function registerBuiltinPresets(presets) {
62
+ _builtinPresets = presets;
63
+ }
64
+
65
+ // ── Public API ──
66
+
67
+ /**
68
+ * Save the current node positions as a named layout preset.
69
+ * Emits 'layouts:get-positions' which the variant must handle
70
+ * and respond to by calling the provided callback.
71
+ * @param {string} name Human-readable preset name
72
+ */
73
+ export function saveLayout(name) {
74
+ if (!name || !name.trim()) return;
75
+
76
+ emit('layouts:save-request', {
77
+ name: name.trim(),
78
+ callback: (result) => {
79
+ if (!result) return;
80
+
81
+ const { positions, pinnedCount, camera } = result;
82
+
83
+ if (pinnedCount === 0) {
84
+ const warning = $('preset-warning');
85
+ if (warning) {
86
+ warning.classList.add('visible');
87
+ setTimeout(() => warning.classList.remove('visible'), 2500);
88
+ }
89
+ return;
90
+ }
91
+
92
+ if (getVariant() === '2d') {
93
+ // 2D stores as { name: { [nodeId]: {x,y} } }
94
+ const userPresets = getUserPresets();
95
+ userPresets[name.trim()] = positions;
96
+ saveUserPresets(userPresets);
97
+ } else {
98
+ // 3D stores as array of preset objects
99
+ const preset = {
100
+ id: String(Date.now()),
101
+ name: name.trim(),
102
+ created: new Date().toISOString(),
103
+ positions,
104
+ camera: camera || null,
105
+ };
106
+ const presets = getUserPresets();
107
+ presets.unshift(preset);
108
+ saveUserPresets(presets);
109
+ activePresetId = preset.id;
110
+ }
111
+
112
+ const nameInput = $('preset-name-input');
113
+ if (nameInput) nameInput.value = '';
114
+ const warning = $('preset-warning');
115
+ if (warning) warning.classList.remove('visible');
116
+ renderLayouts();
117
+ }
118
+ });
119
+ }
120
+
121
+ /**
122
+ * Load a saved layout preset and apply it to the graph.
123
+ * @param {Object} preset The preset object (3D) or { name, positions } (2D)
124
+ */
125
+ export function loadLayout(preset) {
126
+ emit('layouts:apply', preset);
127
+ if (preset.id) activePresetId = preset.id;
128
+ renderLayouts();
129
+ }
130
+
131
+ /**
132
+ * Delete a user-saved layout preset.
133
+ * @param {string} idOrName Preset ID (3D) or name (2D)
134
+ */
135
+ export function deleteLayout(idOrName) {
136
+ if (getVariant() === '2d') {
137
+ const userPresets = getUserPresets();
138
+ delete userPresets[idOrName];
139
+ saveUserPresets(userPresets);
140
+ } else {
141
+ const presets = getUserPresets().filter(p => p.id !== idOrName);
142
+ saveUserPresets(presets);
143
+ if (activePresetId === idOrName) activePresetId = null;
144
+ }
145
+ renderLayouts();
146
+ }
147
+
148
+ // ── Dropdown rendering ──
149
+
150
+ /**
151
+ * Render the list of built-in and user presets inside the dropdown panel.
152
+ */
153
+ export function renderLayouts() {
154
+ const listEl = $('preset-list');
155
+ if (!listEl) return;
156
+ listEl.innerHTML = '';
157
+
158
+ const variant = getVariant() || '3d';
159
+
160
+ // ── Built-in presets first ──
161
+ _builtinPresets.forEach(bp => {
162
+ const row = document.createElement('div');
163
+ row.className = 'preset-row builtin' + (bp.id === activePresetId ? ' active' : '');
164
+ row.innerHTML = `
165
+ <span class="preset-name">${bp.name}</span>
166
+ <span class="preset-badge">auto</span>
167
+ `;
168
+ if (bp.desc) row.title = bp.desc;
169
+ row.addEventListener('click', () => {
170
+ // Built-in presets are applied by the variant via event
171
+ emit('layouts:apply-builtin', bp);
172
+ activePresetId = bp.id;
173
+ renderLayouts();
174
+ });
175
+ listEl.appendChild(row);
176
+ });
177
+
178
+ // ── User presets ──
179
+ if (variant === '2d') {
180
+ renderUserPresets2D(listEl);
181
+ } else {
182
+ renderUserPresets3D(listEl);
183
+ }
184
+ }
185
+
186
+ function renderUserPresets3D(listEl) {
187
+ const presets = getUserPresets();
188
+
189
+ // Divider if user presets exist
190
+ if (presets.length > 0) {
191
+ const div = document.createElement('div');
192
+ div.className = 'preset-divider';
193
+ listEl.appendChild(div);
194
+ }
195
+
196
+ presets.forEach(preset => {
197
+ const nodeCount = Object.keys(preset.positions).length;
198
+ const date = new Date(preset.created);
199
+ const dateStr = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
200
+
201
+ const row = document.createElement('div');
202
+ row.className = 'preset-row' + (preset.id === activePresetId ? ' active' : '');
203
+
204
+ row.innerHTML = `
205
+ <span class="preset-name">${preset.name}</span>
206
+ <span class="preset-badge">${nodeCount}</span>
207
+ <span class="preset-date">${dateStr}</span>
208
+ <button class="preset-delete" data-tooltip="Delete">&times;</button>
209
+ `;
210
+
211
+ row.addEventListener('click', (e) => {
212
+ if (e.target.classList.contains('preset-delete')) return;
213
+ loadLayout(preset);
214
+ });
215
+
216
+ row.querySelector('.preset-delete').addEventListener('click', (e) => {
217
+ e.stopPropagation();
218
+ deleteLayout(preset.id);
219
+ });
220
+
221
+ listEl.appendChild(row);
222
+ });
223
+
224
+ if (presets.length === 0 && _builtinPresets.length === 0) {
225
+ listEl.innerHTML = '<div class="preset-empty">No saved layouts</div>';
226
+ }
227
+ }
228
+
229
+ function renderUserPresets2D(listEl) {
230
+ const userPresets = getUserPresets(); // Object<name, positions>
231
+ const names = Object.keys(userPresets);
232
+
233
+ if (names.length > 0 && _builtinPresets.length > 0) {
234
+ const div = document.createElement('div');
235
+ div.className = 'preset-divider';
236
+ listEl.appendChild(div);
237
+ }
238
+
239
+ names.forEach(name => {
240
+ const data = userPresets[name];
241
+ const row = document.createElement('div');
242
+ row.className = 'preset-row';
243
+ row.innerHTML = `
244
+ <span class="preset-name">${name}</span>
245
+ <button class="preset-delete" data-tooltip="Delete">&times;</button>
246
+ `;
247
+ row.addEventListener('click', (e) => {
248
+ if (e.target.closest('.preset-delete')) {
249
+ deleteLayout(name);
250
+ return;
251
+ }
252
+ // Apply user preset positions via event
253
+ emit('layouts:apply', { name, positions: data });
254
+ emit('panel:close-all-dropdowns');
255
+ });
256
+ listEl.appendChild(row);
257
+ });
258
+
259
+ if (names.length === 0 && _builtinPresets.length === 0) {
260
+ listEl.innerHTML = '<div class="preset-empty">No saved layouts</div>';
261
+ }
262
+ }
263
+
264
+ // ── Initialization ──
265
+
266
+ /**
267
+ * Wire up all layout-preset-related event listeners.
268
+ * Call once after the DOM is ready and after registerBuiltinPresets().
269
+ * Open/close is handled by the menubar (ui-menubar.js).
270
+ */
271
+ export function initLayouts() {
272
+ const presetNameInput = $('preset-name-input');
273
+ const presetSaveBtn = $('preset-save-btn');
274
+
275
+ // Menubar triggers rendering when Layouts menu opens
276
+ on('layouts:render', renderLayouts);
277
+
278
+ // Save on Enter key in the name input
279
+ if (presetNameInput) {
280
+ presetNameInput.addEventListener('keydown', (e) => {
281
+ if (e.key === 'Enter') {
282
+ e.preventDefault();
283
+ const name = presetNameInput.value.trim();
284
+ if (name) saveLayout(name);
285
+ }
286
+ });
287
+ }
288
+
289
+ // Save button click
290
+ if (presetSaveBtn) {
291
+ presetSaveBtn.addEventListener('click', () => {
292
+ const nameInput = $('preset-name-input');
293
+ const name = nameInput ? nameInput.value.trim() : '';
294
+ if (name) saveLayout(name);
295
+ });
296
+ }
297
+ }