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,153 @@
1
+ // ═══════════════════════════════════════════
2
+ // COLORS — shared color utility functions
3
+ // ═══════════════════════════════════════════
4
+ //
5
+ // Pure utility functions for color resolution, alpha blending,
6
+ // importance-to-radius mapping, and the custom <select> upgrade.
7
+ // No variant-specific dependencies.
8
+
9
+ import { COLOR_PALETTE, KEYS } from './constants.js';
10
+ import { storage } from './storage.js';
11
+ import { state } from './state.js';
12
+
13
+ /**
14
+ * Resolve the display color for a category.
15
+ * Priority: storage override > backend metadata color > palette index > hash fallback.
16
+ * @param {string} category Category name
17
+ * @returns {string} Hex color string
18
+ */
19
+ export function catColor(category) {
20
+ // 1. User override from storage (highest priority)
21
+ try {
22
+ const overrides = JSON.parse(storage.getItem(KEYS.CATEGORY_COLORS) || '{}');
23
+ if (overrides[category]) return overrides[category];
24
+ } catch {}
25
+ // 2. Backend color from category metadata
26
+ if (state.categoryMetadata[category]?.color) {
27
+ return state.categoryMetadata[category].color;
28
+ }
29
+ // 3. Index-based from palette (deterministic -- same position = same color)
30
+ const idx = state.allCategoryNames.indexOf(category);
31
+ if (idx >= 0) return COLOR_PALETTE[idx % COLOR_PALETTE.length];
32
+ // 4. Hash-based fallback for unknown categories
33
+ let hash = 0;
34
+ for (let i = 0; i < category.length; i++) hash = ((hash << 5) - hash + category.charCodeAt(i)) | 0;
35
+ return COLOR_PALETTE[Math.abs(hash) % COLOR_PALETTE.length];
36
+ }
37
+
38
+ /**
39
+ * Convert a hex color + alpha (0-1) to an rgba() string.
40
+ * @param {string} hex Hex color (e.g. '#C47A8E')
41
+ * @param {number} alpha Alpha value 0-1
42
+ * @returns {string} rgba() CSS string
43
+ */
44
+ export function hexAlpha(hex, alpha) {
45
+ const c = parseInt(hex.replace('#', ''), 16);
46
+ return `rgba(${(c >> 16) & 255},${(c >> 8) & 255},${c & 255},${alpha})`;
47
+ }
48
+
49
+ /**
50
+ * Map an importance score (1-10) to a node radius.
51
+ * @param {number} importance 1-10
52
+ * @returns {number} Radius (2 to 6.5)
53
+ */
54
+ export function importanceToRadius(importance) {
55
+ return 2 + (importance - 1) * 0.5; // 2 to 6.5
56
+ }
57
+
58
+ /**
59
+ * Replace a native <select> with a styled custom dropdown.
60
+ * Keeps the hidden <select> synced so .value still works.
61
+ * Adds category color dots via catColor() when values match categories.
62
+ *
63
+ * If the select was already upgraded, refreshes the existing wrapper
64
+ * (useful after options change dynamically).
65
+ *
66
+ * @param {HTMLSelectElement} selectEl The native <select> to upgrade
67
+ * @returns {HTMLDivElement|null} The .styled-select wrapper, or null if selectEl is falsy
68
+ */
69
+ export function upgradeSelect(selectEl) {
70
+ if (!selectEl) return null;
71
+
72
+ // If already upgraded, refresh the existing wrapper
73
+ if (selectEl.dataset.upgraded) {
74
+ const existing = selectEl.closest('.styled-select');
75
+ if (existing && existing._refresh) { existing._refresh(); return existing; }
76
+ }
77
+
78
+ selectEl.dataset.upgraded = '1';
79
+ selectEl.style.display = 'none';
80
+
81
+ const wrapper = document.createElement('div');
82
+ wrapper.className = 'styled-select';
83
+
84
+ const trigger = document.createElement('button');
85
+ trigger.type = 'button';
86
+ trigger.className = 'styled-select-trigger';
87
+
88
+ const menu = document.createElement('div');
89
+ menu.className = 'styled-select-menu';
90
+
91
+ function updateTrigger() {
92
+ trigger.innerHTML = '';
93
+ const sel = selectEl.options[selectEl.selectedIndex];
94
+ if (sel && sel.value) {
95
+ const dot = document.createElement('span');
96
+ dot.className = 'styled-select-dot';
97
+ dot.style.background = catColor(sel.value);
98
+ trigger.appendChild(dot);
99
+ }
100
+ const lbl = document.createElement('span');
101
+ lbl.className = 'styled-select-label';
102
+ lbl.textContent = sel ? sel.textContent : '';
103
+ trigger.appendChild(lbl);
104
+ }
105
+
106
+ function buildOptions() {
107
+ menu.innerHTML = '';
108
+ Array.from(selectEl.options).forEach(opt => {
109
+ const row = document.createElement('div');
110
+ row.className = 'styled-select-option' + (opt.value === selectEl.value ? ' active' : '');
111
+ if (opt.value) {
112
+ const dot = document.createElement('span');
113
+ dot.className = 'styled-select-dot';
114
+ dot.style.background = catColor(opt.value);
115
+ row.appendChild(dot);
116
+ }
117
+ const lbl = document.createElement('span');
118
+ lbl.textContent = opt.textContent;
119
+ row.appendChild(lbl);
120
+ row.addEventListener('click', () => {
121
+ selectEl.value = opt.value;
122
+ selectEl.dispatchEvent(new Event('change', { bubbles: true }));
123
+ updateTrigger();
124
+ buildOptions();
125
+ wrapper.classList.remove('open');
126
+ });
127
+ menu.appendChild(row);
128
+ });
129
+ }
130
+
131
+ trigger.addEventListener('click', (e) => {
132
+ e.stopPropagation();
133
+ // Close any other open styled selects first
134
+ document.querySelectorAll('.styled-select.open').forEach(s => {
135
+ if (s !== wrapper) s.classList.remove('open');
136
+ });
137
+ const opening = wrapper.classList.toggle('open');
138
+ if (opening) buildOptions();
139
+ });
140
+
141
+ document.addEventListener('click', (e) => {
142
+ if (!wrapper.contains(e.target)) wrapper.classList.remove('open');
143
+ });
144
+
145
+ selectEl.parentNode.insertBefore(wrapper, selectEl);
146
+ wrapper.appendChild(trigger);
147
+ wrapper.appendChild(menu);
148
+ wrapper.appendChild(selectEl);
149
+
150
+ wrapper._refresh = () => { updateTrigger(); buildOptions(); };
151
+ updateTrigger();
152
+ return wrapper;
153
+ }
@@ -0,0 +1,141 @@
1
+ // ═══════════════════════════════════════════
2
+ // CONSTANTS — shared between 3D and 2D variants
3
+ // ═══════════════════════════════════════════
4
+
5
+ export const DEFAULT_COLOR = '#888888';
6
+
7
+ export const COLOR_PALETTE = [
8
+ '#4FC3F7', '#66BB6A', '#FFC107', '#FF7043', '#29B6F6',
9
+ '#BDBDBD', '#42A5F5', '#EF5350', '#FFCA28', '#AB47BC',
10
+ '#26A69A', '#FF8A65', '#7E57C2', '#26C6DA', '#D4E157',
11
+ '#FF7043', '#26A69A', '#CE93D8', '#FFB300', '#00ACC1',
12
+ '#9CCC65', '#00BCD4', '#7986CB', '#EF5350', '#E53935',
13
+ '#00BFA5', '#5C6BC0', '#EC407A',
14
+ ];
15
+
16
+ /** All storage key names used across both variants.
17
+ * Most keys are persisted to data/ui-state.json via shared/storage.js.
18
+ * Keys marked "sessionStorage" remain browser-only (ephemeral). */
19
+ export const KEYS = {
20
+ BOOKMARKS: 'neural-bookmarks',
21
+ CATEGORY_COLORS: 'neural-category-colors',
22
+ CATEGORY_ORDER: 'neural-category-order',
23
+ SELECTED_NODE: 'neural-selected-node',
24
+ SELECTED_SWITCH: 'neural-selected-node-switch', // sessionStorage — preserve selection across variant switch
25
+ UI_SCALE: 'neural-ui-scale',
26
+ GFX_CONFIG_3D: 'neural-gfx-config',
27
+ GFX_CONFIG_2D: 'neural-gfx-config-2d',
28
+ GFX_PRESET: 'neural-gfx-preset',
29
+ LAYOUT_PRESETS_3D: 'neural-layout-presets',
30
+ LAYOUT_PRESETS_2D: 'neural-user-presets-2d',
31
+ PANEL_PREFIX: 'neural-panel-',
32
+ NODE_POS_3D: 'synabun-node-positions',
33
+ NODE_POS_2D: 'synabun-node-positions-2d',
34
+ CAM_HUD_PINNED: 'neural-cam-hud-pinned',
35
+ CAM_HUD_POS: 'neural-cam-hud-pos',
36
+ LAYOUT_VERSION: 'synabun-layout-version',
37
+ INTERFACE_CONFIG: 'neural-interface-config',
38
+ EXPLORER_CAT_ORDER: 'neural-explorer-cat-order',
39
+ EXPLORER_COLLAPSED: 'neural-explorer-collapsed',
40
+ EXPLORER_SORT: 'neural-explorer-sort',
41
+ EXPLORER_VISIBLE: 'neural-explorer-visible',
42
+ EXPLORER_WIDTH: 'neural-explorer-width',
43
+ TERMINAL_HEIGHT: 'neural-terminal-height',
44
+ TERMINAL_OPEN: 'neural-terminal-open',
45
+ TERMINAL_DETACHED: 'neural-terminal-detached',
46
+ TERMINAL_FLOAT_POS: 'neural-terminal-float-pos',
47
+ TERMINAL_SESSIONS: 'neural-terminal-active-sessions',
48
+ TERMINAL_SPLIT_RATIO: 'neural-terminal-split-ratio',
49
+ TERMINAL_NOTIFICATIONS: 'neural-terminal-notifications',
50
+ NOTIF_SOUND: 'neural-notif-sound',
51
+ NOTIF_SOUND_VOLUME: 'neural-notif-sound-volume',
52
+ NOTIF_SOUND_TYPE: 'neural-notif-sound-type',
53
+ NOTIF_BANNER: 'neural-notif-banner',
54
+ NOTIF_BANNER_FOCUSED: 'neural-notif-banner-focused',
55
+ NOTIF_ACTION_ONLY: 'neural-notif-action-only',
56
+ NOTIF_SOURCE_CLI: 'neural-notif-source-cli',
57
+ NOTIF_SOURCE_PANEL: 'neural-notif-source-panel',
58
+ NOTIF_TRIGGER_DONE: 'neural-notif-trigger-done',
59
+ NOTIF_TRIGGER_ACTION: 'neural-notif-trigger-action',
60
+ NOTIF_TRIGGER_ASK: 'neural-notif-trigger-ask',
61
+ NOTIF_TRIGGER_ERROR: 'neural-notif-trigger-error',
62
+ NOTIF_TOAST: 'neural-notif-toast',
63
+ NOTIF_TOAST_DURATION: 'neural-notif-toast-duration',
64
+ NOTIF_TOAST_POSITION: 'neural-notif-toast-position',
65
+ OPEN_CARDS: 'neural-open-cards',
66
+ WORKSPACES: 'neural-workspaces',
67
+ ACTIVE_WORKSPACE: 'neural-active-workspace', // sessionStorage
68
+ GRID_SNAP: 'neural-grid-snap',
69
+ CATEGORIES_VISIBLE: 'neural-categories-visible',
70
+ WHITEBOARD: 'neural-whiteboard',
71
+ TUTORIAL_COMPLETED: 'neural-tutorial-completed',
72
+ TUTORIAL_SKIPPED: 'neural-tutorial-skipped',
73
+ TUTORIAL_STEP: 'neural-tutorial-step',
74
+ TUTORIAL_STARTED: 'neural-tutorial-started',
75
+ ONBOARDING_EXPLORE: 'neural-onboarding-explore',
76
+ ONBOARDING_CLI: 'neural-onboarding-cli',
77
+ ONBOARDING_MODEL: 'neural-onboarding-model',
78
+ ONBOARDING_PROJECT: 'neural-onboarding-project',
79
+ LINK_PANEL_POS: 'neural-link-panel-pos',
80
+ LINK_PANEL_SIZE: 'neural-link-panel-size',
81
+ ACTIVE_LINKS: 'neural-active-links',
82
+ COMMAND_RUNNER: 'neural-command-runner',
83
+ FILE_EXPLORER_VISIBLE: 'neural-file-explorer-visible',
84
+ FILE_EXPLORER_WIDTH: 'neural-file-explorer-width',
85
+ FILE_EXPLORER_COLLAPSED:'neural-file-explorer-collapsed',
86
+ FILE_EXPLORER_SORT: 'neural-file-explorer-sort',
87
+ FILE_EXPLORER_PROJECT: 'neural-file-explorer-project',
88
+ FILE_EXPLORER_FOLDER_COLORS: 'neural-file-explorer-folder-colors',
89
+ ACTIVE_SKIN: 'neural-active-skin',
90
+ COST_WIDGET_POS: 'neural-cost-widget-pos',
91
+ COST_WIDGET_COLLAPSED: 'neural-cost-widget-collapsed',
92
+ COST_WIDGET_DOCKED: 'neural-cost-widget-docked',
93
+ NODE_LIMIT: 'neural-node-limit',
94
+ MINIMAP_POS: 'synabun-2d-minimap-pos',
95
+ };
96
+
97
+ /** Default keybind mappings — action ID → combo string.
98
+ * Combo format: {Ctrl+}{Alt+}{Shift+}{Meta+}{key}
99
+ * key is KeyboardEvent.key (lowercase for printable chars). */
100
+ export const DEFAULT_KEYBINDS = {
101
+ 'toggle-categories': 'c',
102
+ 'open-skills': 'k',
103
+ 'open-automations': 'z',
104
+ 'toggle-terminal': 't',
105
+ 'toggle-terminal-alt': 'Ctrl+`',
106
+ 'focus-search': '/',
107
+ 'toggle-help': '?',
108
+ 'toggle-explorer': 'f',
109
+ 'toggle-focus-mode': 'v',
110
+ 'toggle-minimap': 'm',
111
+ 'open-keybinds': 'n',
112
+ 'launch-claude': '1',
113
+ 'launch-codex': '2',
114
+ 'launch-gemini': '3',
115
+ 'launch-browser': 'b',
116
+ 'launch-youtube': 'y',
117
+ 'toggle-file-explorer': 'e',
118
+ 'open-settings': 's',
119
+ };
120
+
121
+ /** Display metadata for each rebindable action. */
122
+ export const KEYBIND_META = {
123
+ 'toggle-categories': { label: 'Toggle Categories', group: 'Navigation' },
124
+ 'open-skills': { label: 'Open Skills Studio', group: 'Navigation' },
125
+ 'open-automations': { label: 'Open Automation Studio', group: 'Navigation' },
126
+ 'toggle-terminal': { label: 'Toggle Terminal', group: 'Navigation' },
127
+ 'toggle-terminal-alt': { label: 'Toggle Terminal (alt)', group: 'Navigation' },
128
+ 'focus-search': { label: 'Focus Search', group: 'Navigation' },
129
+ 'toggle-help': { label: 'Toggle Help', group: 'Navigation' },
130
+ 'toggle-explorer': { label: 'Toggle Explorer', group: 'Navigation' },
131
+ 'toggle-focus-mode': { label: 'Toggle Focus Mode', group: 'Navigation' },
132
+ 'toggle-minimap': { label: 'Toggle Minimap', group: 'View' },
133
+ 'open-settings': { label: 'Open Settings', group: 'Settings' },
134
+ 'open-keybinds': { label: 'Open Keybinds', group: 'Settings' },
135
+ 'launch-claude': { label: 'Claude Code', group: 'Launch App', icon: 'claude' },
136
+ 'launch-codex': { label: 'Codex CLI', group: 'Launch App', icon: 'codex' },
137
+ 'launch-gemini': { label: 'Gemini CLI', group: 'Launch App', icon: 'gemini' },
138
+ 'launch-browser': { label: 'Browser', group: 'Launch App', icon: 'browser' },
139
+ 'launch-youtube': { label: 'YouTube', group: 'Launch App', icon: 'youtube' },
140
+ 'toggle-file-explorer': { label: 'Toggle File Explorer', group: 'Navigation' },
141
+ };