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.
- package/CHANGELOG.md +175 -881
- package/README.md +1 -1
- package/hooks/claude-code/prompt-submit.mjs +39 -18
- package/hooks/claude-code/session-start.mjs +10 -3
- package/hooks/claude-code/shared.mjs +39 -2
- package/hooks/claude-code/stop.mjs +33 -6
- package/mcp-server/src/index.ts +9 -1
- package/mcp-server/src/services/neural-interface.ts +42 -14
- package/mcp-server/src/services/profiles.ts +8 -7
- package/mcp-server/src/tools/browser-advanced.ts +12 -10
- package/mcp-server/src/tools/browser-interact.ts +39 -38
- package/mcp-server/src/tools/browser-navigate.ts +12 -4
- package/mcp-server/src/tools/loop.ts +7 -3
- package/mcp-server/src/tools/profile.ts +19 -1
- package/neural-interface/lib/loop-logger.js +103 -0
- package/neural-interface/lib/mcp-installer.js +109 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/package.json +1 -1
- package/neural-interface/public/shared/api.js +66 -17
- package/neural-interface/public/shared/cdx/cdx-icons.js +5 -4
- package/neural-interface/public/shared/cdx/cdx-panel.js +117 -14
- package/neural-interface/public/shared/cdx/cdx-render.js +170 -43
- package/neural-interface/public/shared/cdx/cdx-styles.js +55 -10
- package/neural-interface/public/shared/cdx/cdx-tabs.js +394 -72
- package/neural-interface/public/shared/cli-status.js +157 -0
- package/neural-interface/public/shared/constants.js +3 -2
- package/neural-interface/public/shared/html-shell.js +32 -11
- package/neural-interface/public/shared/ocp/ocp-panel.js +127 -28
- package/neural-interface/public/shared/ocp/ocp-render.js +52 -44
- package/neural-interface/public/shared/ocp/ocp-styles.js +33 -0
- package/neural-interface/public/shared/ocp/ocp-tabs.js +693 -82
- package/neural-interface/public/shared/styles.css +635 -0
- package/neural-interface/public/shared/ui-automation-studio.js +38 -12
- package/neural-interface/public/shared/ui-claude-panel.js +322 -15
- package/neural-interface/public/shared/ui-file-explorer.js +38 -18
- package/neural-interface/public/shared/ui-menubar.js +34 -10
- package/neural-interface/public/shared/ui-navbar.js +8 -6
- package/neural-interface/public/shared/ui-schedules-studio.js +1464 -0
- package/neural-interface/public/shared/ui-settings.js +274 -50
- package/neural-interface/public/shared/ui-sidepanel-layout.js +18 -7
- package/neural-interface/public/shared/ui-sidepanel-tray.js +287 -0
- package/neural-interface/public/shared/ui-sync.js +9 -5
- package/neural-interface/public/shared/ui-terminal.js +76 -27
- package/neural-interface/public/shared/ui-tool-updates.js +49 -15
- package/neural-interface/public/shared/ui-tutorial-steps.js +4 -2
- package/neural-interface/public/shared/ui-tutorial.js +24 -18
- package/neural-interface/public/shared/ui-whiteboard.js +79 -31
- package/neural-interface/public/shared/vterm-buffer.js +9 -8
- package/neural-interface/public/variant/2d/main.js +9 -7
- package/neural-interface/public/variant/3d/main.js +10 -8
- package/neural-interface/server.js +1292 -255
- package/package.json +1 -1
- package/skills/leonardo/SKILL.md +5 -1
- package/skills/leonardo/modules/image-prompter.md +5 -1
- package/skills/leonardo/modules/video-prompter.md +5 -1
- package/skills/synabun/SKILL.md +44 -26
- package/skills/synabun/modules/audit.md +40 -36
- package/skills/synabun/modules/changelog.md +22 -18
- package/skills/synabun/modules/memorize.md +19 -15
- package/skills/synabun/modules/schedule.md +285 -0
- 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.
|
|
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) {
|
|
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
|
-
|
|
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', () =>
|
|
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
|
}
|