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,244 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — Update Alert
3
+ // Checks for npm updates on page load, shows toolbar badge,
4
+ // and provides a 3-step modal wizard with blocking backup gate.
5
+ // ═══════════════════════════════════════════
6
+
7
+ const $ = (id) => document.getElementById(id);
8
+
9
+ let _versionData = null;
10
+
11
+ export async function initUpdate() {
12
+ try {
13
+ const res = await fetch('/api/system/version');
14
+ if (!res.ok) return;
15
+ _versionData = await res.json();
16
+
17
+ if (!_versionData.updateAvailable) return;
18
+
19
+ const btn = $('topright-update-btn');
20
+ if (!btn) return;
21
+
22
+ btn.style.display = '';
23
+ const badge = $('update-badge');
24
+ if (badge) badge.textContent = '!';
25
+
26
+ btn.addEventListener('click', (e) => {
27
+ e.stopPropagation();
28
+ openUpdateModal();
29
+ });
30
+ } catch { /* silent — no update UI if check fails */ }
31
+ }
32
+
33
+ // ── Modal Wizard ──
34
+
35
+ function openUpdateModal() {
36
+ if (!_versionData) return;
37
+
38
+ let step = 1;
39
+ let backupDone = false;
40
+
41
+ const overlay = document.createElement('div');
42
+ overlay.className = 'tag-delete-overlay';
43
+ overlay.style.zIndex = '300100';
44
+
45
+ function render() {
46
+ overlay.innerHTML = `
47
+ <div class="tag-delete-modal update-modal" style="max-width:460px;text-align:left">
48
+ ${renderStepDots(step)}
49
+ ${step === 1 ? renderStep1() : step === 2 ? renderStep2() : renderStep3()}
50
+ </div>`;
51
+ document.body.appendChild(overlay);
52
+ bindEvents();
53
+ }
54
+
55
+ function renderStepDots(current) {
56
+ return `<div class="update-steps">
57
+ ${[1, 2, 3].map(i => `<span class="update-step-dot${i === current ? ' active' : i < current ? ' done' : ''}"></span>`).join('')}
58
+ </div>`;
59
+ }
60
+
61
+ function renderStep1() {
62
+ return `
63
+ <h3 class="update-modal-title">Update Available</h3>
64
+ <div class="update-version-diff">
65
+ <span class="update-ver update-ver--old">v${esc(_versionData.current)}</span>
66
+ <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>
67
+ <span class="update-ver update-ver--new">v${esc(_versionData.latest)}</span>
68
+ </div>
69
+ <p style="font-size:12px;color:var(--t-muted);margin:12px 0 18px">
70
+ A new version of SynaBun is available on npm.
71
+ </p>
72
+ <div class="tag-delete-modal-actions">
73
+ <button class="action-btn action-btn--ghost" id="update-cancel">Cancel</button>
74
+ <button class="action-btn action-btn--primary" id="update-next">Next</button>
75
+ </div>`;
76
+ }
77
+
78
+ function renderStep2() {
79
+ return `
80
+ <h3 class="update-modal-title">Back Up Your Data</h3>
81
+ <p style="font-size:12px;color:var(--t-muted);margin:4px 0 14px">
82
+ Before updating, create a full system backup to protect your memories, settings, and configurations.
83
+ </p>
84
+ <button class="action-btn update-backup-btn" id="update-backup-download" style="width:100%;margin-bottom:10px">
85
+ <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-2px;margin-right:6px"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
86
+ Download Full Backup
87
+ </button>
88
+ <div class="update-backup-status" id="update-backup-status" style="display:none">
89
+ <span class="update-backup-icon" id="update-backup-icon"></span>
90
+ <span id="update-backup-text"></span>
91
+ </div>
92
+ <label class="update-skip-label" style="margin:8px 0 16px">
93
+ <input type="checkbox" id="update-skip-backup" ${backupDone ? 'checked' : ''}>
94
+ <span>I already have a backup</span>
95
+ </label>
96
+ <div class="tag-delete-modal-actions">
97
+ <button class="action-btn action-btn--ghost" id="update-back">Back</button>
98
+ <button class="action-btn action-btn--primary" id="update-next" ${backupDone ? '' : 'disabled'}>Next</button>
99
+ </div>`;
100
+ }
101
+
102
+ function renderStep3() {
103
+ return `
104
+ <h3 class="update-modal-title">Run the Update</h3>
105
+ <p style="font-size:12px;color:var(--t-muted);margin:4px 0 12px">
106
+ Run this command in your terminal to update SynaBun:
107
+ </p>
108
+ <div class="update-code-block">
109
+ <code>npm install -g synabun@latest</code>
110
+ <button class="update-copy-btn" data-copy="npm install -g synabun@latest" title="Copy">
111
+ <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
112
+ </button>
113
+ </div>
114
+ <p style="font-size:12px;color:var(--t-muted);margin:12px 0 8px">
115
+ Then restart the Neural Interface:
116
+ </p>
117
+ <div class="update-code-block">
118
+ <code>node neural-interface/server.js</code>
119
+ <button class="update-copy-btn" data-copy="node neural-interface/server.js" title="Copy">
120
+ <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
121
+ </button>
122
+ </div>
123
+ <div class="tag-delete-modal-actions" style="margin-top:18px">
124
+ <button class="action-btn action-btn--ghost" id="update-back">Back</button>
125
+ <button class="action-btn action-btn--primary" id="update-done">Done</button>
126
+ </div>`;
127
+ }
128
+
129
+ function bindEvents() {
130
+ // Close on overlay click
131
+ overlay.addEventListener('click', (e) => {
132
+ if (e.target === overlay) close();
133
+ });
134
+
135
+ // Cancel / Done
136
+ overlay.querySelector('#update-cancel')?.addEventListener('click', close);
137
+ overlay.querySelector('#update-done')?.addEventListener('click', close);
138
+
139
+ // Next
140
+ overlay.querySelector('#update-next')?.addEventListener('click', () => {
141
+ step++;
142
+ render();
143
+ });
144
+
145
+ // Back
146
+ overlay.querySelector('#update-back')?.addEventListener('click', () => {
147
+ step--;
148
+ render();
149
+ });
150
+
151
+ // Copy buttons
152
+ overlay.querySelectorAll('.update-copy-btn').forEach(btn => {
153
+ btn.addEventListener('click', () => {
154
+ const text = btn.dataset.copy;
155
+ navigator.clipboard.writeText(text).then(() => {
156
+ btn.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="#34c759" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>';
157
+ setTimeout(() => {
158
+ btn.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>';
159
+ }, 1500);
160
+ });
161
+ });
162
+ });
163
+
164
+ // Backup download
165
+ overlay.querySelector('#update-backup-download')?.addEventListener('click', handleBackupDownload);
166
+
167
+ // Skip checkbox
168
+ const skipCb = overlay.querySelector('#update-skip-backup');
169
+ if (skipCb) {
170
+ skipCb.addEventListener('change', () => {
171
+ backupDone = skipCb.checked;
172
+ const nextBtn = overlay.querySelector('#update-next');
173
+ if (nextBtn) nextBtn.disabled = !backupDone;
174
+ });
175
+ }
176
+ }
177
+
178
+ async function handleBackupDownload() {
179
+ const btn = overlay.querySelector('#update-backup-download');
180
+ const status = overlay.querySelector('#update-backup-status');
181
+ const icon = overlay.querySelector('#update-backup-icon');
182
+ const text = overlay.querySelector('#update-backup-text');
183
+ if (!btn) return;
184
+
185
+ btn.disabled = true;
186
+ const origHTML = btn.innerHTML;
187
+ btn.innerHTML = '<span class="update-spinner"></span> Creating backup...';
188
+ status.style.display = 'flex';
189
+ icon.className = 'update-backup-icon spin';
190
+ icon.textContent = '⟳';
191
+ text.textContent = 'Collecting files and database...';
192
+
193
+ try {
194
+ const res = await fetch('/api/system/backup');
195
+ if (!res.ok) {
196
+ let errMsg = 'Backup failed';
197
+ try { const body = await res.json(); errMsg = body.error || errMsg; } catch {}
198
+ throw new Error(errMsg);
199
+ }
200
+ const blob = await res.blob();
201
+ const disposition = res.headers.get('content-disposition') || '';
202
+ const match = disposition.match(/filename="?([^"]+)"?/);
203
+ const filename = match ? match[1] : 'synabun-backup.zip';
204
+
205
+ const url = URL.createObjectURL(blob);
206
+ const a = document.createElement('a');
207
+ a.href = url; a.download = filename;
208
+ document.body.appendChild(a); a.click(); a.remove();
209
+ URL.revokeObjectURL(url);
210
+
211
+ icon.className = 'update-backup-icon';
212
+ icon.textContent = '✓';
213
+ icon.style.color = '#34c759';
214
+ text.textContent = `${filename} (${(blob.size / 1024 / 1024).toFixed(1)} MB)`;
215
+
216
+ backupDone = true;
217
+ const nextBtn = overlay.querySelector('#update-next');
218
+ if (nextBtn) nextBtn.disabled = false;
219
+ const skipCb = overlay.querySelector('#update-skip-backup');
220
+ if (skipCb) skipCb.checked = true;
221
+ } catch (err) {
222
+ icon.className = 'update-backup-icon';
223
+ icon.textContent = '✗';
224
+ icon.style.color = 'var(--accent-red)';
225
+ text.textContent = 'Backup failed: ' + err.message;
226
+ } finally {
227
+ btn.disabled = false;
228
+ btn.innerHTML = origHTML;
229
+ }
230
+ }
231
+
232
+ function close() {
233
+ overlay.classList.add('closing');
234
+ setTimeout(() => overlay.remove(), 150);
235
+ }
236
+
237
+ render();
238
+ }
239
+
240
+ function esc(str) {
241
+ const d = document.createElement('div');
242
+ d.textContent = str || '';
243
+ return d.innerHTML;
244
+ }