synabun 2026.4.21 → 2026.4.25-beta.2

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 (61) hide show
  1. package/CHANGELOG.md +175 -881
  2. package/README.md +1 -1
  3. package/hooks/claude-code/prompt-submit.mjs +39 -18
  4. package/hooks/claude-code/session-start.mjs +10 -3
  5. package/hooks/claude-code/shared.mjs +39 -2
  6. package/hooks/claude-code/stop.mjs +33 -6
  7. package/mcp-server/src/index.ts +9 -1
  8. package/mcp-server/src/services/neural-interface.ts +42 -14
  9. package/mcp-server/src/services/profiles.ts +8 -7
  10. package/mcp-server/src/tools/browser-advanced.ts +12 -10
  11. package/mcp-server/src/tools/browser-interact.ts +39 -38
  12. package/mcp-server/src/tools/browser-navigate.ts +12 -4
  13. package/mcp-server/src/tools/loop.ts +7 -3
  14. package/mcp-server/src/tools/profile.ts +19 -1
  15. package/neural-interface/lib/loop-logger.js +103 -0
  16. package/neural-interface/lib/mcp-installer.js +109 -0
  17. package/neural-interface/lib/plugin-installer.js +264 -0
  18. package/neural-interface/package.json +1 -1
  19. package/neural-interface/public/shared/api.js +66 -17
  20. package/neural-interface/public/shared/cdx/cdx-icons.js +5 -4
  21. package/neural-interface/public/shared/cdx/cdx-panel.js +117 -14
  22. package/neural-interface/public/shared/cdx/cdx-render.js +170 -43
  23. package/neural-interface/public/shared/cdx/cdx-styles.js +55 -10
  24. package/neural-interface/public/shared/cdx/cdx-tabs.js +394 -72
  25. package/neural-interface/public/shared/cli-status.js +157 -0
  26. package/neural-interface/public/shared/constants.js +3 -2
  27. package/neural-interface/public/shared/html-shell.js +32 -11
  28. package/neural-interface/public/shared/ocp/ocp-panel.js +127 -28
  29. package/neural-interface/public/shared/ocp/ocp-render.js +52 -44
  30. package/neural-interface/public/shared/ocp/ocp-styles.js +33 -0
  31. package/neural-interface/public/shared/ocp/ocp-tabs.js +693 -82
  32. package/neural-interface/public/shared/styles.css +635 -0
  33. package/neural-interface/public/shared/ui-automation-studio.js +38 -12
  34. package/neural-interface/public/shared/ui-claude-panel.js +322 -15
  35. package/neural-interface/public/shared/ui-file-explorer.js +38 -18
  36. package/neural-interface/public/shared/ui-menubar.js +34 -10
  37. package/neural-interface/public/shared/ui-navbar.js +8 -6
  38. package/neural-interface/public/shared/ui-schedules-studio.js +1464 -0
  39. package/neural-interface/public/shared/ui-settings.js +274 -50
  40. package/neural-interface/public/shared/ui-sidepanel-layout.js +18 -7
  41. package/neural-interface/public/shared/ui-sidepanel-tray.js +287 -0
  42. package/neural-interface/public/shared/ui-sync.js +9 -5
  43. package/neural-interface/public/shared/ui-terminal.js +76 -27
  44. package/neural-interface/public/shared/ui-tool-updates.js +49 -15
  45. package/neural-interface/public/shared/ui-tutorial-steps.js +4 -2
  46. package/neural-interface/public/shared/ui-tutorial.js +24 -18
  47. package/neural-interface/public/shared/ui-whiteboard.js +79 -31
  48. package/neural-interface/public/shared/vterm-buffer.js +9 -8
  49. package/neural-interface/public/variant/2d/main.js +9 -7
  50. package/neural-interface/public/variant/3d/main.js +10 -8
  51. package/neural-interface/server.js +1292 -255
  52. package/package.json +1 -1
  53. package/skills/leonardo/SKILL.md +5 -1
  54. package/skills/leonardo/modules/image-prompter.md +5 -1
  55. package/skills/leonardo/modules/video-prompter.md +5 -1
  56. package/skills/synabun/SKILL.md +44 -26
  57. package/skills/synabun/modules/audit.md +40 -36
  58. package/skills/synabun/modules/changelog.md +22 -18
  59. package/skills/synabun/modules/memorize.md +19 -15
  60. package/skills/synabun/modules/schedule.md +285 -0
  61. package/CLAUDE.md +0 -217
@@ -21,6 +21,7 @@ import {
21
21
  reorderLoopFolders,
22
22
  fetchActiveLoop,
23
23
  launchLoop,
24
+ sendClientLoopLog,
24
25
  stopLoop,
25
26
  launchAgent,
26
27
  fetchAgents,
@@ -181,7 +182,8 @@ const CLI_MODELS = {
181
182
  { id: 'claude-haiku-4-5', label: 'Haiku 4.5', desc: 'Fastest' },
182
183
  ],
183
184
  'codex': [
184
- { id: 'gpt-5.4', label: 'GPT-5.4', desc: 'Most capable', tier: 'top' },
185
+ { id: 'gpt-5.5', label: 'GPT-5.5', desc: 'Most capable', tier: 'top' },
186
+ { id: 'gpt-5.4', label: 'GPT-5.4', desc: 'Strong general' },
185
187
  { id: 'gpt-5.4-mini', label: 'GPT-5.4 Mini', desc: 'Fast & cheap', tier: 'default' },
186
188
  { id: 'gpt-5.3-codex', label: 'GPT-5.3 Codex', desc: 'Codex-tuned' },
187
189
  ],
@@ -1469,15 +1471,30 @@ async function confirmLaunch() {
1469
1471
  // Launch as floating terminal + floating browser
1470
1472
  showToast('Launching loop...');
1471
1473
  emit('terminal:expect-managed');
1474
+ sendClientLoopLog(null, 'launch:client', 'confirmLaunch about to POST /api/loop/launch', {
1475
+ profile: params.profile,
1476
+ usesBrowser: !!params.usesBrowser,
1477
+ iterations: params.iterations,
1478
+ maxMinutes: params.maxMinutes,
1479
+ taskLen: (params.task || '').length,
1480
+ cwd: params.cwd || null,
1481
+ browserSessionId: params.browserSessionId || null,
1482
+ });
1472
1483
  console.log('[AS] confirmLaunch: calling launchLoop, profile =', params.profile, ', usesBrowser =', params.usesBrowser);
1473
1484
  const result = await launchLoop(params);
1474
1485
  console.log('[AS] confirmLaunch: launchLoop result =', JSON.stringify(result));
1486
+ sendClientLoopLog(result?.terminalSessionId || null, 'launch:client', 'launchLoop response received', { result });
1475
1487
  if (!result?.ok) {
1476
1488
  emit('terminal:attach-floating', {});
1477
1489
  showToast(result?.error || 'Failed to launch loop');
1478
1490
  return;
1479
1491
  }
1480
1492
  console.log('[AS] confirmLaunch: emitting terminal:attach-floating, terminalSessionId =', result.terminalSessionId);
1493
+ sendClientLoopLog(result.terminalSessionId, 'launch:client', 'emit terminal:attach-floating', {
1494
+ terminalSessionId: result.terminalSessionId,
1495
+ profile: params.profile || 'claude-code',
1496
+ initialMessage: '[SynaBun Loop] Begin task.',
1497
+ });
1481
1498
  emit('terminal:attach-floating', {
1482
1499
  terminalSessionId: result.terminalSessionId,
1483
1500
  profile: params.profile || 'claude-code',
@@ -1491,7 +1508,9 @@ async function confirmLaunch() {
1491
1508
  // Clear the managed-terminal flag since we won't emit terminal:attach-floating
1492
1509
  emit('terminal:attach-floating', {});
1493
1510
  console.error('[AS] confirmLaunch: caught error:', err);
1511
+ sendClientLoopLog(null, 'launch:client', 'confirmLaunch caught error', { err: err?.message || String(err) });
1494
1512
  showToast('Launch failed: ' + (err.message || 'unknown error'));
1513
+ try { alert(`[SynaBun] Loop launch failed: ${err?.message || err || 'unknown error'}\n\nOpen DevTools Console for stack trace.`); } catch {}
1495
1514
  }
1496
1515
  }
1497
1516
 
@@ -1541,20 +1560,25 @@ function buildTemplateCommand(template) {
1541
1560
  // ═══════════════════════════════════════════
1542
1561
 
1543
1562
  export function initAutomationStudio() {
1544
- on('automations:open', () => openPanel());
1563
+ on('automations:open', (opts) => openPanel(opts || {}));
1545
1564
  on('automations:open-wizard', () => { openPanel(); });
1546
- on('automations:open-schedules', () => { openPanel().then(() => { _view = 'schedules'; _selected = null; loadScheduleData().then(() => renderView()); }); });
1547
1565
  on('automations:import', () => { openPanel().then(() => triggerImport()); });
1548
1566
  setupAgentWebSocket();
1549
- setupScheduleWebSocket();
1550
1567
  }
1551
1568
 
1552
- async function openPanel() {
1569
+ async function openPanel(opts = {}) {
1553
1570
  if (isGuest() && !hasPermission('automations')) {
1554
1571
  showGuestToast('Automation Studio is disabled by the host');
1555
1572
  return;
1556
1573
  }
1557
- if (_panel) { _panel.focus(); return; }
1574
+ if (_panel) {
1575
+ if (opts.templateId) {
1576
+ const tpl = _templates.find(t => t.id === opts.templateId);
1577
+ if (tpl) switchToDetail(tpl);
1578
+ }
1579
+ _panel.focus();
1580
+ return;
1581
+ }
1558
1582
 
1559
1583
  // Backdrop
1560
1584
  _backdrop = document.createElement('div');
@@ -1574,7 +1598,12 @@ async function openPanel() {
1574
1598
 
1575
1599
  wirePanel();
1576
1600
  await loadData();
1577
- renderView();
1601
+ if (opts.templateId) {
1602
+ const tpl = _templates.find(t => t.id === opts.templateId);
1603
+ if (tpl) switchToDetail(tpl); else renderView();
1604
+ } else {
1605
+ renderView();
1606
+ }
1578
1607
  requestAnimationFrame(() => { _backdrop.classList.add('open'); _panel.classList.add('open'); });
1579
1608
  startPolling();
1580
1609
  }
@@ -1659,7 +1688,7 @@ function wirePanel() {
1659
1688
  $('as-close')?.addEventListener('click', closePanel);
1660
1689
  $('as-new-btn')?.addEventListener('click', () => { _view = 'picker'; _selected = null; renderView(); });
1661
1690
  $('as-new-folder-btn')?.addEventListener('click', (e) => openFolderPopover(e.currentTarget, null));
1662
- $('as-schedules-btn')?.addEventListener('click', () => { _view = 'schedules'; _selected = null; loadScheduleData().then(() => renderView()); });
1691
+ $('as-schedules-btn')?.addEventListener('click', () => emit('automations:open-schedules'));
1663
1692
  $('as-import-btn')?.addEventListener('click', () => triggerImport());
1664
1693
 
1665
1694
  $('as-sidebar-toggle')?.addEventListener('click', () => {
@@ -1721,8 +1750,6 @@ function wirePanel() {
1721
1750
  const onEsc = (e) => {
1722
1751
  if (e.key === 'Escape' && _panel) {
1723
1752
  if (_view === 'launch') { closeLaunchInline(); return; }
1724
- if (_view === 'schedule-editor') { _view = 'schedules'; _editingSchedule = null; renderView(); return; }
1725
- if (_view === 'schedules') { _view = 'welcome'; renderView(); return; }
1726
1753
  if (_view === 'wizard') { _view = _selected ? 'detail' : 'welcome'; renderView(); return; }
1727
1754
  if (_view === 'detail' || _view === 'running' || _view === 'picker') {
1728
1755
  if (_detailDirty && !confirm('Discard unsaved changes?')) return;
@@ -2233,8 +2260,6 @@ function renderView() {
2233
2260
  case 'detail': renderDetailMain(); break;
2234
2261
  case 'wizard': renderWizardMain(); break;
2235
2262
  case 'running': renderRunningMain(); break;
2236
- case 'schedules': renderSchedulesMain(); break;
2237
- case 'schedule-editor': renderScheduleEditorMain(); break;
2238
2263
  case 'launch': break; // launch panel is rendered by showLaunchInline
2239
2264
  }
2240
2265
  }
@@ -3413,6 +3438,7 @@ function renderRunningMain() {
3413
3438
  </div>
3414
3439
  <div class="as-running-controls">
3415
3440
  <button class="as-btn-stop" data-action="force-stop" data-id="${loop.terminalSessionId || ''}">Stop</button>
3441
+ ${loop.terminalSessionId ? `<a class="as-btn-stop" style="margin-left:8px;text-decoration:none;display:inline-flex;align-items:center;" href="/api/loop/log/${encodeURIComponent(loop.terminalSessionId)}" target="_blank" rel="noopener">View Loop Log</a>` : ''}
3416
3442
  </div>
3417
3443
  </div>`;
3418
3444
  }