monomind 1.16.11 → 1.17.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 (63) hide show
  1. package/.claude/agents/github/code-review-swarm.md +19 -19
  2. package/.claude/agents/github/github-modes.md +4 -4
  3. package/.claude/agents/github/multi-repo-swarm.md +24 -24
  4. package/.claude/agents/github/project-board-sync.md +28 -28
  5. package/.claude/agents/github/swarm-issue.md +26 -26
  6. package/.claude/agents/github/swarm-pr.md +18 -18
  7. package/.claude/agents/github/workflow-automation.md +27 -27
  8. package/.claude/agents/reengineer-squad/git-manager.md +2 -2
  9. package/.claude/commands/mastermind/master.md +9 -3
  10. package/.claude/commands/mastermind/references/antigravity-tools.md +60 -0
  11. package/.claude/commands/mastermind/references/claude-code-tools.md +50 -0
  12. package/.claude/commands/mastermind/references/codex-tools.md +64 -0
  13. package/.claude/commands/mastermind/references/copilot-tools.md +49 -0
  14. package/.claude/commands/mastermind/references/gemini-tools.md +63 -0
  15. package/.claude/commands/mastermind/references/pi-tools.md +28 -0
  16. package/.claude/helpers/mastermind-activate.cjs +53 -0
  17. package/.claude/settings.json +4 -0
  18. package/.claude/skills/mastermind/runorg.md +14 -0
  19. package/.claude/skills/mastermind/techport.md +5 -5
  20. package/README.md +1 -1
  21. package/package.json +6 -5
  22. package/packages/@monomind/cli/.claude/agents/github/code-review-swarm.md +19 -19
  23. package/packages/@monomind/cli/.claude/agents/github/github-modes.md +4 -4
  24. package/packages/@monomind/cli/.claude/agents/github/multi-repo-swarm.md +24 -24
  25. package/packages/@monomind/cli/.claude/agents/github/project-board-sync.md +28 -28
  26. package/packages/@monomind/cli/.claude/agents/github/swarm-issue.md +26 -26
  27. package/packages/@monomind/cli/.claude/agents/github/swarm-pr.md +18 -18
  28. package/packages/@monomind/cli/.claude/agents/github/workflow-automation.md +27 -27
  29. package/packages/@monomind/cli/.claude/agents/reengineer-squad/git-manager.md +2 -2
  30. package/packages/@monomind/cli/.claude/commands/mastermind/master.md +9 -3
  31. package/packages/@monomind/cli/.claude/commands/mastermind/references/antigravity-tools.md +60 -0
  32. package/packages/@monomind/cli/.claude/commands/mastermind/references/claude-code-tools.md +50 -0
  33. package/packages/@monomind/cli/.claude/commands/mastermind/references/codex-tools.md +64 -0
  34. package/packages/@monomind/cli/.claude/commands/mastermind/references/copilot-tools.md +49 -0
  35. package/packages/@monomind/cli/.claude/commands/mastermind/references/gemini-tools.md +63 -0
  36. package/packages/@monomind/cli/.claude/commands/mastermind/references/pi-tools.md +28 -0
  37. package/packages/@monomind/cli/.claude/helpers/mastermind-activate.cjs +53 -0
  38. package/packages/@monomind/cli/.claude/skills/mastermind/runorg.md +14 -0
  39. package/packages/@monomind/cli/.claude/skills/mastermind/techport.md +5 -5
  40. package/packages/@monomind/cli/README.md +1 -1
  41. package/packages/@monomind/cli/dist/src/browser/dashboard/ui.html +125 -37
  42. package/packages/@monomind/cli/dist/src/commands/index.js +0 -2
  43. package/packages/@monomind/cli/dist/src/init/executor.js +0 -24
  44. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +0 -45
  45. package/packages/@monomind/cli/dist/src/init/types.d.ts +0 -2
  46. package/packages/@monomind/cli/dist/src/init/types.js +0 -2
  47. package/packages/@monomind/cli/dist/src/ui/dashboard.html +82 -75
  48. package/packages/@monomind/cli/dist/src/ui/server.mjs +41 -4
  49. package/packages/@monomind/cli/package.json +2 -2
  50. package/packages/@monomind/guidance/README.md +0 -1
  51. package/packages/@monomind/guidance/package.json +2 -14
  52. package/scripts/verify-appliance.sh +16 -20
  53. package/.claude-plugin/README.md +0 -704
  54. package/.claude-plugin/docs/INSTALLATION.md +0 -258
  55. package/.claude-plugin/docs/PLUGIN_SUMMARY.md +0 -358
  56. package/.claude-plugin/docs/QUICKSTART.md +0 -357
  57. package/.claude-plugin/docs/STRUCTURE.md +0 -122
  58. package/.claude-plugin/hooks/hooks.json +0 -74
  59. package/.claude-plugin/marketplace.json +0 -98
  60. package/.claude-plugin/plugin.json +0 -70
  61. package/.claude-plugin/scripts/install.sh +0 -234
  62. package/.claude-plugin/scripts/uninstall.sh +0 -36
  63. package/.claude-plugin/scripts/verify.sh +0 -102
@@ -420,9 +420,8 @@ body { background: #0b0b14; color: #ccc; font-family: system-ui,-apple-system,sa
420
420
  <!-- ── top bar ─────────────────────────────────────── -->
421
421
  <div id="topbar">
422
422
  <span class="logo">monomind <span>dashboard</span></span>
423
- <span class="pill pill-run" id="p-run">● 0</span>
424
- <span class="pill pill-done" id="p-done">✓ 0</span>
425
- <span class="pill pill-fail" id="p-fail">✗ 0</span>
423
+ <span class="pill pill-run" id="p-workflows" title="Total workflows">⚡ workflows</span>
424
+ <span class="pill pill-done" id="p-actions" title="Total actions">✓ actions</span>
426
425
  <span id="conn">
427
426
  <span id="conn-dot"></span>
428
427
  <span id="conn-label">connecting…</span>
@@ -435,12 +434,9 @@ body { background: #0b0b14; color: #ccc; font-family: system-ui,-apple-system,sa
435
434
  <!-- sidebar -->
436
435
  <nav id="sidebar">
437
436
  <div class="nav-section-label">Project</div>
438
- <div class="nav-item active" data-panel="playbooks">
439
- <span class="nav-icon">⚡</span> Runs
440
- <span class="nav-badge" id="nb-run">0</span>
441
- </div>
442
- <div class="nav-item" data-panel="builder">
443
- <span class="nav-icon">🔧</span> Builder
437
+ <div class="nav-item active" data-panel="monoagent">
438
+ <span class="nav-icon">🤖</span> MonoAgent
439
+ <span class="nav-badge green" id="nb-ma">0</span>
444
440
  </div>
445
441
 
446
442
  <div class="nav-section-label" style="margin-top:8px">System</div>
@@ -458,21 +454,38 @@ body { background: #0b0b14; color: #ccc; font-family: system-ui,-apple-system,sa
458
454
  <!-- main -->
459
455
  <div id="main">
460
456
 
461
- <!-- Playbook Runs panel -->
462
- <div class="panel active" id="pb-panel">
457
+ <!-- MonoAgent panel -->
458
+ <div class="panel active" id="monoagent-panel">
463
459
  <div class="panel-header">
464
- <span class="panel-title">Playbook Runs</span>
465
- <span class="panel-subtitle" id="pb-subtitle">0 runs</span>
460
+ <span class="panel-title">MonoAgent Workflows</span>
461
+ <span class="panel-subtitle" id="ma-subtitle">loading…</span>
462
+ <button onclick="loadMonoagentData()" style="margin-left:auto;background:#1a1a2e;border:1px solid #2a2a4a;color:#a78bfa;padding:3px 10px;border-radius:6px;cursor:pointer;font-size:11px">↻ Refresh</button>
466
463
  </div>
467
- <div id="pb-cards" style="overflow-y:auto;flex:1;padding:12px;display:grid;gap:10px;align-content:start"></div>
468
- <div class="empty" id="pb-empty">
469
- <span class="empty-icon">⚡</span>
470
- <span class="empty-title">No playbook runs yet</span>
471
- <span class="empty-sub">Use the Builder tab to create and run playbooks,<br>or run via CLI: <code style="color:#7c3aed">npx monomind browse playbook run &lt;name&gt;</code></span>
464
+ <div style="flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:16px">
465
+ <!-- Workflow list -->
466
+ <div>
467
+ <div style="font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:#3a3a5a;margin-bottom:8px">Workflows</div>
468
+ <div id="ma-workflows" style="display:grid;gap:8px;align-content:start"></div>
469
+ <div class="empty" id="ma-wf-empty" style="display:none">
470
+ <span class="empty-icon">🤖</span>
471
+ <span class="empty-title">No workflows found</span>
472
+ <span class="empty-sub">Create one with: <code style="color:#7c3aed">monoagent workflow create</code></span>
473
+ </div>
474
+ </div>
475
+ <!-- Action run history -->
476
+ <div>
477
+ <div style="font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:#3a3a5a;margin-bottom:8px">Action History</div>
478
+ <div id="ma-history" style="display:grid;gap:6px;align-content:start"></div>
479
+ <div class="empty" id="ma-hist-empty" style="display:none">
480
+ <span class="empty-icon">📋</span>
481
+ <span class="empty-title">No action history</span>
482
+ <span class="empty-sub">Run an action with: <code style="color:#7c3aed">monoagent run &lt;ACTION_ID&gt;</code></span>
483
+ </div>
484
+ </div>
472
485
  </div>
473
486
  </div>
474
487
 
475
- <!-- Builder panel -->
488
+ <!-- Builder panel (kept for internal use, hidden from nav) -->
476
489
  <div class="panel" id="builder-panel">
477
490
  <!-- Toolbar -->
478
491
  <div id="builder-toolbar">
@@ -573,12 +586,11 @@ function navigateToPanel(target) {
573
586
  var navItem = document.querySelector('[data-panel="' + target + '"]');
574
587
  if (navItem) navItem.classList.add('active');
575
588
  document.querySelectorAll('.panel').forEach(function(p) { p.classList.remove('active'); });
576
- var panelId = target === 'playbooks' ? 'pb-panel'
577
- : target === 'builder' ? 'builder-panel'
578
- : target + '-panel';
589
+ var panelId = target + '-panel';
579
590
  var panel = document.getElementById(panelId);
580
591
  if (panel) panel.classList.add('active');
581
592
  if (target === 'builder') renderEdges();
593
+ if (target === 'monoagent') loadMonoagentData();
582
594
  location.hash = target;
583
595
  }
584
596
 
@@ -592,7 +604,7 @@ document.querySelectorAll('.nav-item').forEach(function(item) {
592
604
  // Hash-based routing on load
593
605
  (function() {
594
606
  var hash = location.hash.replace('#', '');
595
- var validPanels = ['playbooks', 'builder', 'agents', 'memory', 'sessions'];
607
+ var validPanels = ['monoagent', 'agents', 'memory', 'sessions'];
596
608
  if (hash && validPanels.indexOf(hash) !== -1) {
597
609
  // defer until after renderEdges is defined
598
610
  window.addEventListener('load', function() { navigateToPanel(hash); });
@@ -613,20 +625,7 @@ function esc(s) {
613
625
  }
614
626
 
615
627
  function updateHeader() {
616
- var running = 0, done = 0, fail = 0;
617
- for (var id in runs) {
618
- var s = runs[id].status;
619
- if (s === 'running') running++;
620
- else if (s === 'completed') done++;
621
- else if (s === 'failed') fail++;
622
- }
623
- document.getElementById('p-run').textContent = '● ' + running;
624
- document.getElementById('p-done').textContent = '✓ ' + done;
625
- document.getElementById('p-fail').textContent = '✗ ' + fail;
626
- document.getElementById('nb-run').textContent = String(running || Object.keys(runs).length);
627
- document.getElementById('nb-run').className = 'nav-badge' + (running ? '' : ' green');
628
- var total = Object.keys(runs).length;
629
- document.getElementById('pb-subtitle').textContent = total + (total === 1 ? ' run' : ' runs');
628
+ // no-op: topbar pills are updated by loadMonoagentData
630
629
  }
631
630
 
632
631
  function progressPct(r) {
@@ -648,6 +647,7 @@ function elapsed(r) {
648
647
  function renderCards() {
649
648
  var cards = document.getElementById('pb-cards');
650
649
  var empty = document.getElementById('pb-empty');
650
+ if (!cards) return; // panel removed from DOM
651
651
  var sorted = Object.values(runs).sort(function(a, b) { return b.startedAt - a.startedAt; });
652
652
  if (!sorted.length) { cards.innerHTML = ''; empty.style.display = 'flex'; return; }
653
653
  empty.style.display = 'none';
@@ -1737,6 +1737,94 @@ function handleEvent(evt) {
1737
1737
  renderCards();
1738
1738
  }
1739
1739
 
1740
+ // ═══════════════════════════════════════════════════════════════════
1741
+ // MONOAGENT DATA
1742
+ // ═══════════════════════════════════════════════════════════════════
1743
+ var MA_STATE_COLORS = { COMPLETED: '#22c55e', FAILED: '#ef4444', PENDING: '#f59e0b', RUNNING: '#a78bfa' };
1744
+
1745
+ function maStateLabel(state) {
1746
+ var s = (state || '').toUpperCase();
1747
+ return { color: MA_STATE_COLORS[s] || '#555', text: s || 'UNKNOWN' };
1748
+ }
1749
+
1750
+ function renderWorkflows(workflows) {
1751
+ var el = document.getElementById('ma-workflows');
1752
+ var empty = document.getElementById('ma-wf-empty');
1753
+ if (!workflows || !workflows.length) {
1754
+ el.innerHTML = '';
1755
+ empty.style.display = 'flex';
1756
+ return;
1757
+ }
1758
+ empty.style.display = 'none';
1759
+ el.innerHTML = workflows.map(function(wf) {
1760
+ var active = wf.is_active;
1761
+ var updated = wf.updated_at && wf.updated_at !== '0001-01-01T00:00:00Z'
1762
+ ? new Date(wf.updated_at).toLocaleDateString()
1763
+ : '—';
1764
+ return '<div style="background:#0f0f1e;border:1px solid #1a1a2e;border-radius:8px;padding:10px 14px;display:flex;align-items:center;gap:10px">' +
1765
+ '<span style="font-size:16px">' + (active ? '▶' : '⏸') + '</span>' +
1766
+ '<div style="flex:1;min-width:0">' +
1767
+ '<div style="font-weight:600;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">' + esc(wf.name || wf.id) + '</div>' +
1768
+ '<div style="font-size:10px;color:#3a3a5a;margin-top:2px">' + esc(wf.id) + ' · v' + (wf.version || 1) + ' · updated ' + esc(updated) + '</div>' +
1769
+ (wf.description ? '<div style="font-size:10px;color:#555;margin-top:2px">' + esc(wf.description) + '</div>' : '') +
1770
+ '</div>' +
1771
+ '<span style="font-size:10px;padding:2px 7px;border-radius:10px;border:1px solid;' +
1772
+ (active ? 'background:#22c55e15;border-color:#22c55e44;color:#22c55e' : 'background:#33333315;border-color:#33333344;color:#555') + '">' +
1773
+ (active ? 'active' : 'inactive') +
1774
+ '</span>' +
1775
+ '</div>';
1776
+ }).join('');
1777
+ document.getElementById('nb-ma').textContent = String(workflows.length);
1778
+ }
1779
+
1780
+ function renderHistory(actions) {
1781
+ var el = document.getElementById('ma-history');
1782
+ var empty = document.getElementById('ma-hist-empty');
1783
+ if (!actions || !actions.length) {
1784
+ el.innerHTML = '';
1785
+ empty.style.display = 'flex';
1786
+ return;
1787
+ }
1788
+ empty.style.display = 'none';
1789
+ el.innerHTML = actions.map(function(a) {
1790
+ var sl = maStateLabel(a.state);
1791
+ var dt = a.created_at
1792
+ ? new Date(typeof a.created_at === 'number' ? a.created_at * 1000 : a.created_at).toLocaleString()
1793
+ : '—';
1794
+ return '<div style="background:#0f0f1e;border:1px solid #1a1a2e;border-radius:6px;padding:8px 12px;display:flex;align-items:center;gap:10px">' +
1795
+ '<div style="flex:1;min-width:0">' +
1796
+ '<div style="font-weight:600;font-size:11px">' + esc(a.type || '(unnamed)') + '</div>' +
1797
+ '<div style="font-size:10px;color:#3a3a5a;margin-top:2px">' +
1798
+ esc(a.id.slice(0, 8)) + '… · ' + esc(a.platform || '') + ' · ' + esc(dt) +
1799
+ '</div>' +
1800
+ '</div>' +
1801
+ '<span style="font-size:10px;font-weight:600;color:' + sl.color + '">' + sl.text + '</span>' +
1802
+ '</div>';
1803
+ }).join('');
1804
+ }
1805
+
1806
+ function loadMonoagentData() {
1807
+ document.getElementById('ma-subtitle').textContent = 'loading…';
1808
+ fetch('/monoagent/data')
1809
+ .then(function(r) { return r.json(); })
1810
+ .then(function(d) {
1811
+ renderWorkflows(d.workflows || []);
1812
+ renderHistory(d.actions || []);
1813
+ var wc = (d.workflows || []).length;
1814
+ var ac = (d.actions || []).length;
1815
+ document.getElementById('ma-subtitle').textContent = wc + ' workflow' + (wc !== 1 ? 's' : '') + ' · ' + ac + ' action' + (ac !== 1 ? 's' : '');
1816
+ document.getElementById('p-workflows').textContent = '⚡ ' + wc;
1817
+ document.getElementById('p-actions').textContent = '✓ ' + ac;
1818
+ })
1819
+ .catch(function(e) {
1820
+ document.getElementById('ma-subtitle').textContent = 'error loading data';
1821
+ console.error('monoagent data fetch failed', e);
1822
+ });
1823
+ }
1824
+
1825
+ // Load monoagent data on startup (it's the default panel)
1826
+ loadMonoagentData();
1827
+
1740
1828
  // ═══════════════════════════════════════════════════════════════════
1741
1829
  // CONNECTION
1742
1830
  // ═══════════════════════════════════════════════════════════════════
@@ -51,8 +51,6 @@ const commandLoaders = {
51
51
  issues: () => import('./issues.js'),
52
52
  // Auto-update System (ADR-025)
53
53
  update: () => import('./update.js'),
54
- // Local ↔ global skill sync
55
- sync: () => import('./sync.js'),
56
54
  // MonoVector PostgreSQL Bridge
57
55
  monovector: () => import('./monovector/index.js'),
58
56
  // Benchmark Suite (Pre-training, Neural, Memory)
@@ -1479,30 +1479,6 @@ mcp:
1479
1479
  `;
1480
1480
  atomicWriteFile(configPath, config);
1481
1481
  result.created.files.push('.monomind/config.yaml');
1482
- // Stamp the CLI version that initialized this project — used by `monomind sync check`
1483
- // to detect when the global install has been upgraded but local skills/config have not.
1484
- const versionPath = path.join(targetDir, '.monomind', 'version');
1485
- try {
1486
- const pkgCandidates = [
1487
- path.join(__dirname, '..', '..', 'package.json'), // src/init/ in dev
1488
- path.join(__dirname, '..', '..', '..', 'package.json'), // dist/src/init/ in prod
1489
- ];
1490
- let cliVersion = null;
1491
- for (const p of pkgCandidates) {
1492
- if (fs.existsSync(p)) {
1493
- const pkg = JSON.parse(fs.readFileSync(p, 'utf-8'));
1494
- if (typeof pkg.version === 'string' && pkg.version) {
1495
- cliVersion = pkg.version;
1496
- break;
1497
- }
1498
- }
1499
- }
1500
- if (cliVersion) {
1501
- atomicWriteFile(versionPath, cliVersion);
1502
- result.created.files.push('.monomind/version');
1503
- }
1504
- }
1505
- catch { /* non-fatal — sync check will degrade gracefully */ }
1506
1482
  // Write .monomind/.gitignore — commit config/knowledge/metrics, exclude sensitive data
1507
1483
  const gitignorePath = path.join(targetDir, '.monomind', '.gitignore');
1508
1484
  const gitignore = `# Monomind — exclude files that may contain secrets or sensitive prompt data
@@ -1062,40 +1062,6 @@ function generateStatusline() {
1062
1062
  return parts.join(\` \${DIV} \`);
1063
1063
  }
1064
1064
 
1065
- // ── Sync / update status ────────────────────────────────────────
1066
- // Returns {local, global} if local .monomind/version differs from the running CLI,
1067
- // or null when in sync or no version file exists.
1068
- function getSyncStatus() {
1069
- try {
1070
- const vf = path.join(CWD, '.monomind', 'version');
1071
- if (!fs.existsSync(vf)) return null;
1072
- const local = fs.readFileSync(vf, 'utf-8').trim();
1073
- const global = getVersion().replace(/^v/, '');
1074
- if (!local || !global || local === global) return null;
1075
- return { local, global };
1076
- } catch { return null; }
1077
- }
1078
-
1079
- // Returns the latest available version string if the cache shows a newer release,
1080
- // null otherwise. Reads from the rate-limiter cache — no network call.
1081
- function getUpdateStatus() {
1082
- try {
1083
- const stateFile = path.join(os.homedir(), '.monomind', 'update-state.json');
1084
- if (!fs.existsSync(stateFile)) return null;
1085
- const stat = safeStat(stateFile);
1086
- if (!stat || stat.size > 1024 * 1024) return null;
1087
- const state = JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
1088
- const pkgVersions = (state && typeof state.packageVersions === 'object') ? state.packageVersions : {};
1089
- const latest = pkgVersions['monomind'] || pkgVersions['@monoes/monomindcli'];
1090
- const current = getVersion().replace(/^v/, '');
1091
- if (!latest || !current) return null;
1092
- const [lMaj, lMin, lPat] = latest.split('.').map(Number);
1093
- const [cMaj, cMin, cPat] = current.split('.').map(Number);
1094
- const isNewer = lMaj > cMaj || (lMaj === cMaj && lMin > cMin) || (lMaj === cMaj && lMin === cMin && lPat > cPat);
1095
- return isNewer ? latest : null;
1096
- } catch { return null; }
1097
- }
1098
-
1099
1065
  // ── Multi-line dashboard (full mode) ─────────────────────────────
1100
1066
  function generateDashboard() {
1101
1067
  const git = getGitInfo();
@@ -1213,17 +1179,6 @@ function generateDashboard() {
1213
1179
 
1214
1180
  lines.push(\`\${x.teal}🧠 CONTEXT\${x.reset} \${graphStr}\${hilStr}\`);
1215
1181
 
1216
- // ── Row 3: Sync / update warnings (only when action needed) ──
1217
- const sync = getSyncStatus();
1218
- const upd = getUpdateStatus();
1219
- if (sync || upd) {
1220
- const parts = [];
1221
- if (sync) parts.push(\`\${x.coral}⚠ sync: local v\${sync.local} → global v\${sync.global} (monomind sync run)\${x.reset}\`);
1222
- if (upd) parts.push(\`\${x.gold}↑ v\${upd} available (npm i -g monomind)\${x.reset}\`);
1223
- lines.push(SEP);
1224
- lines.push(parts.join(\` \${DIV} \`));
1225
- }
1226
-
1227
1182
  return lines.join('\\n');
1228
1183
  }
1229
1184
 
@@ -176,8 +176,6 @@ export interface StatuslineConfig {
176
176
  export interface MCPConfig {
177
177
  /** Include monomind MCP server */
178
178
  monomind: boolean;
179
- /** Include ruv-swarm MCP server */
180
- ruvSwarm: boolean;
181
179
  /** Include monograph knowledge graph MCP server */
182
180
  graphify: boolean;
183
181
  /** Auto-start MCP server */
@@ -112,7 +112,6 @@ export const DEFAULT_INIT_OPTIONS = {
112
112
  },
113
113
  mcp: {
114
114
  monomind: true,
115
- ruvSwarm: false,
116
115
  graphify: false,
117
116
  autoStart: false,
118
117
  port: 3000,
@@ -236,7 +235,6 @@ export const FULL_INIT_OPTIONS = {
236
235
  },
237
236
  mcp: {
238
237
  monomind: true,
239
- ruvSwarm: true,
240
238
  graphify: false,
241
239
  autoStart: false,
242
240
  port: 3000,
@@ -1574,14 +1574,14 @@ select.pb-cfg-inp { padding: 4px 7px; cursor: pointer; }
1574
1574
  <div class="nav-item" data-view="monograph">
1575
1575
  <span class="ico">⬡</span><span class="lbl">Monograph</span>
1576
1576
  </div>
1577
- <div class="nav-item" data-view="playbooks">
1578
- <span class="ico">⚡</span><span class="lbl">Playbooks</span>
1579
- <span class="bdg" id="bdg-playbooks">—</span>
1580
- </div>
1581
1577
  </div>
1582
1578
  </div>
1583
1579
  <div class="nav-no-proj" id="nav-no-proj-hint">Select a project above</div>
1584
1580
  <div class="nav-sect" style="margin-top:auto;padding-top:8px;">
1581
+ <div class="nav-item" data-view="monoagent">
1582
+ <span class="ico">🤖</span><span class="lbl">MonoAgent</span>
1583
+ <span class="bdg" id="bdg-monoagent">—</span>
1584
+ </div>
1585
1585
  <div class="nav-item" data-view="global">
1586
1586
  <span class="ico">⊕</span><span class="lbl">Global Feed</span>
1587
1587
  </div>
@@ -2250,79 +2250,26 @@ select.pb-cfg-inp { padding: 4px 7px; cursor: pointer; }
2250
2250
  </div>
2251
2251
  </div>
2252
2252
 
2253
- <!-- PLAYBOOKS -->
2254
- <div class="view" id="view-playbooks">
2253
+ <!-- MONOAGENT -->
2254
+ <div class="view" id="view-monoagent">
2255
2255
  <div class="vscroll">
2256
- <div class="pg-title">Playbooks</div>
2257
- <div class="pg-sub">Browser automation connected systems &amp; run history</div>
2258
- <!-- Tab bar -->
2256
+ <div class="pg-title">MonoAgent</div>
2257
+ <div class="pg-sub">Social media automation workflows &amp; run history</div>
2259
2258
  <div class="mg-tab-bar" style="margin-top:14px">
2260
- <button class="odt-btn active" data-wftab="systems" onclick="wfSwitchTab('systems')">Systems</button>
2261
- <button class="odt-btn" data-wftab="library" onclick="wfSwitchTab('library')">Library</button>
2262
- <button class="odt-btn" data-wftab="builder" onclick="wfSwitchTab('builder')">Builder</button>
2263
- <button class="odt-btn" data-wftab="runs" onclick="wfSwitchTab('runs')">Runs</button>
2259
+ <button class="odt-btn active" data-matab="workflows" onclick="maSwitchTab('workflows')">Workflows</button>
2260
+ <button class="odt-btn" data-matab="history" onclick="maSwitchTab('history')">Action History</button>
2264
2261
  </div>
2265
-
2266
- <!-- TAB: SYSTEMS -->
2267
- <div class="wf-pane active" id="wf-tab-systems">
2262
+ <div class="wf-pane active" id="ma-tab-workflows">
2268
2263
  <div style="display:flex;align-items:center;gap:8px;margin-bottom:16px;margin-top:4px">
2269
- <button class="btn" onclick="loadPlatformSessions()">↺ Refresh</button>
2264
+ <button class="btn" onclick="loadMonoagentData()">↺ Refresh</button>
2270
2265
  </div>
2271
- <div id="wf-systems-grid"></div>
2266
+ <div id="ma-workflows-list"><div class="loading-txt">Loading…</div></div>
2272
2267
  </div>
2273
-
2274
- <!-- TAB: LIBRARY -->
2275
- <div class="wf-pane" id="wf-tab-library">
2268
+ <div class="wf-pane" id="ma-tab-history">
2276
2269
  <div style="display:flex;align-items:center;gap:8px;margin-bottom:16px;margin-top:4px">
2277
- <button class="btn" onclick="loadWorkflowDefs()">↺ Refresh</button>
2278
- <span style="font-size:11px;color:var(--text-lo)">Saved in .monomind/playbooks/</span>
2279
- </div>
2280
- <div id="wf-defs-list"><div class="loading-txt">Loading…</div></div>
2281
- </div>
2282
-
2283
- <!-- TAB: RUNS -->
2284
- <div class="wf-pane" id="wf-tab-runs">
2285
- <div style="display:flex;gap:8px;margin-bottom:16px;margin-top:4px;align-items:center">
2286
- <button class="btn" onclick="loadWorkflowRuns()">↺ Refresh</button>
2287
- <select id="wf-status-filter" onchange="renderWorkflowRuns()" style="background:var(--surface);color:var(--text-hi);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-size:12px">
2288
- <option value="">All statuses</option>
2289
- <option value="running">Running</option>
2290
- <option value="completed">Completed</option>
2291
- <option value="failed">Failed</option>
2292
- <option value="stopped">Stopped</option>
2293
- </select>
2294
- <span id="wf-count" style="color:var(--text-lo);font-size:12px"></span>
2295
- </div>
2296
- <div id="wf-runs-list"><div class="loading-txt">Loading…</div></div>
2297
- </div>
2298
-
2299
- <!-- TAB: BUILDER -->
2300
- <div id="wf-tab-builder">
2301
- <div id="pb-toolbar">
2302
- <button class="btn" onclick="pbNew()" title="New playbook">+ New</button>
2303
- <input id="pb-name-input" type="text" placeholder="Playbook name…" oninput="pbState.playbook.name=this.value">
2304
- <button class="btn" onclick="pbLoad()" title="Load a playbook from Library">⬆ Load</button>
2305
- <button class="btn" onclick="pbSave()" title="Save to .monomind/playbooks/">💾 Save</button>
2306
- <button class="btn" onclick="pbRun()" title="Run via monobrowse dashboard" style="color:var(--accent);border-color:var(--accent)">▶ Run</button>
2307
- <button class="btn" onclick="pbImportJSON()" title="Import from JSON">⬇ Import</button>
2308
- <button class="btn" onclick="pbExportJSON()" title="Export to JSON">⬆ Export</button>
2309
- <span id="pb-run-status"></span>
2310
- </div>
2311
- <div id="pb-editor">
2312
- <div id="pb-palette">
2313
- <!-- populated by pbRenderPalette() -->
2314
- </div>
2315
- <div id="pb-canvas-wrap">
2316
- <div id="pb-canvas">
2317
- <svg id="pb-svg" width="100%" height="100%"><defs><marker id="pb-arrow" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><polygon points="0 0,8 3,0 6" fill="var(--text-xs)"/></marker></defs></svg>
2318
- <div id="pb-empty"><div style="font-size:32px">⚡</div><div>Drag a node from the left panel onto the canvas</div><div style="font-size:11px">or click a node type to add it</div></div>
2319
- </div>
2320
- </div>
2321
- <div id="pb-config">
2322
- <div id="pb-config-title">Select a node</div>
2323
- <div id="pb-config-body"></div>
2324
- </div>
2270
+ <button class="btn" onclick="loadMonoagentData()">↺ Refresh</button>
2325
2271
  </div>
2272
+ <div id="ma-history-list"><div class="loading-txt">Loading…</div></div>
2326
2273
  </div>
2327
2274
  </div>
2328
2275
  </div>
@@ -2518,7 +2465,7 @@ function switchView(v, { updateHash = true } = {}) {
2518
2465
  el.classList.toggle('active', el.dataset.view === v));
2519
2466
  document.querySelectorAll('.view').forEach(el =>
2520
2467
  el.classList.toggle('active', el.id === 'view-' + v));
2521
- const titles = { now:'Now', projects:'Projects', sessions:'Sessions', loops:'Loops', tokens:'Tokens', memory:'Memory', orgs:'Orgs', monograph:'Monograph', playbooks:'Playbooks', global:'Global Feed', 'global-loops':'Global Loops', 'global-tokens':'Global Tokens', chat:'Global Agent Chat' };
2468
+ const titles = { now:'Now', projects:'Projects', sessions:'Sessions', loops:'Loops', tokens:'Tokens', memory:'Memory', orgs:'Orgs', monograph:'Monograph', monoagent:'MonoAgent', global:'Global Feed', 'global-loops':'Global Loops', 'global-tokens':'Global Tokens', chat:'Global Agent Chat' };
2522
2469
  document.getElementById('view-title').textContent = titles[v] || v;
2523
2470
  const PROJECT = DIR ? shortPath(DIR) : 'monomind';
2524
2471
  const VIEW_LABELS = { now: 'Now', sessions: 'Sessions', projects: 'Projects', loops: 'Loops', tokens: 'Tokens', memory: 'Memory', orgs: 'Orgs', monograph: 'Monograph', global: 'Global Feed', 'global-loops': 'Global Loops', 'global-tokens': 'Global Tokens' };
@@ -2581,7 +2528,7 @@ function renderView(v) {
2581
2528
  if (v === 'memory') renderMemory();
2582
2529
  if (v === 'orgs') renderOrgs();
2583
2530
  if (v === 'monograph') loadMonograph();
2584
- if (v === 'playbooks') { loadPlatformSessions(); loadWorkflowDefs(); loadWorkflowRuns(); }
2531
+ if (v === 'monoagent') { loadMonoagentData(); }
2585
2532
  if (v === 'global') renderGlobalFeed();
2586
2533
  if (v === 'global-loops') renderGlobalLoops();
2587
2534
  if (v === 'global-tokens') renderGlobalTokens();
@@ -10877,16 +10824,17 @@ async function maDisconnect(pid, connId, type) {
10877
10824
 
10878
10825
  let _wfRuns = [];
10879
10826
  async function loadWorkflowRuns() {
10880
- document.getElementById('wf-runs-list').innerHTML = '<div class="loading-txt">Loading…</div>';
10827
+ const runsListEl = document.getElementById('wf-runs-list');
10828
+ if (!runsListEl) return;
10829
+ runsListEl.innerHTML = '<div class="loading-txt">Loading…</div>';
10881
10830
  try {
10882
10831
  const runs = await apiFetch('/api/workflow-runs');
10883
10832
  _wfRuns = Array.isArray(runs) ? runs : [];
10884
10833
  } catch (e) {
10885
10834
  _wfRuns = [];
10886
10835
  }
10887
- const bdg = document.getElementById('bdg-playbooks');
10888
- if (bdg) bdg.textContent = _wfRuns.length || '';
10889
- document.getElementById('wf-count').textContent = _wfRuns.length + ' run' + (_wfRuns.length !== 1 ? 's' : '');
10836
+ const wfCount = document.getElementById('wf-count');
10837
+ if (wfCount) wfCount.textContent = _wfRuns.length + ' run' + (_wfRuns.length !== 1 ? 's' : '');
10890
10838
  renderWorkflowRuns();
10891
10839
  }
10892
10840
 
@@ -14017,6 +13965,65 @@ async function mmRenderGraph(body) {
14017
13965
  `;
14018
13966
  } catch (e) { body.innerHTML = '<div class="empty">Failed: ' + esc(e.message) + '</div>'; }
14019
13967
  }
13968
+
13969
+ /* ═══════════════════════════════════════════════════════════════
13970
+ MONOAGENT TAB
13971
+ ═══════════════════════════════════════════════════════════════ */
13972
+ const MA_STATE_COLOR = { completed:'#22c55e', failed:'#ef4444', running:'#3b82f6', pending:'#a3a3a3' };
13973
+ let _maWorkflows = [], _maActions = [];
13974
+
13975
+ function maSwitchTab(tab) {
13976
+ document.querySelectorAll('[data-matab]').forEach(b => b.classList.toggle('active', b.dataset.matab === tab));
13977
+ document.querySelectorAll('#view-monoagent .wf-pane').forEach(p => p.classList.toggle('active', p.id === 'ma-tab-' + tab));
13978
+ }
13979
+
13980
+ async function loadMonoagentData() {
13981
+ document.getElementById('ma-workflows-list').innerHTML = '<div class="loading-txt">Loading…</div>';
13982
+ document.getElementById('ma-history-list').innerHTML = '<div class="loading-txt">Loading…</div>';
13983
+ try {
13984
+ const data = await apiFetch('/api/monoagent/data');
13985
+ _maWorkflows = Array.isArray(data.workflows) ? data.workflows : [];
13986
+ _maActions = Array.isArray(data.actions) ? data.actions : [];
13987
+ } catch (e) {
13988
+ _maWorkflows = []; _maActions = [];
13989
+ }
13990
+ const bdg = document.getElementById('bdg-monoagent');
13991
+ if (bdg) bdg.textContent = _maWorkflows.length || '—';
13992
+ renderMonoagentWorkflows();
13993
+ renderMonoagentHistory();
13994
+ }
13995
+
13996
+ function renderMonoagentWorkflows() {
13997
+ const el = document.getElementById('ma-workflows-list');
13998
+ if (!el) return;
13999
+ if (!_maWorkflows.length) { el.innerHTML = '<div class="empty">No monoagent workflows found. Create one with: <code>monoagent workflow create</code></div>'; return; }
14000
+ el.innerHTML = _maWorkflows.map(w => `<div class="m-card" style="margin-bottom:10px;padding:12px 14px">
14001
+ <div style="display:flex;justify-content:space-between;align-items:center">
14002
+ <span style="font-weight:600;color:var(--text-hi);font-family:var(--mono);font-size:13px">${esc(w.name||w.id||'—')}</span>
14003
+ <span style="font-size:11px;color:var(--text-lo)">${esc(w.id||'')}</span>
14004
+ </div>
14005
+ ${w.description ? `<div style="font-size:12px;color:var(--text-lo);margin-top:4px">${esc(w.description)}</div>` : ''}
14006
+ <div style="font-size:11px;color:var(--text-xs);margin-top:6px">${(w.nodes||[]).length} nodes · trigger: ${esc(w.trigger||'manual')}</div>
14007
+ </div>`).join('');
14008
+ }
14009
+
14010
+ function renderMonoagentHistory() {
14011
+ const el = document.getElementById('ma-history-list');
14012
+ if (!el) return;
14013
+ if (!_maActions.length) { el.innerHTML = '<div class="empty">No action history yet.</div>'; return; }
14014
+ el.innerHTML = _maActions.map(a => {
14015
+ const color = MA_STATE_COLOR[a.status] || MA_STATE_COLOR.pending;
14016
+ const ts = a.createdAt ? new Date(a.createdAt).toLocaleString() : '—';
14017
+ return `<div class="m-card" style="margin-bottom:8px;padding:10px 14px;display:flex;justify-content:space-between;align-items:center">
14018
+ <div>
14019
+ <span style="font-weight:600;color:var(--text-hi);font-size:12px;font-family:var(--mono)">${esc(a.type||a.action||'—')}</span>
14020
+ <span style="font-size:11px;color:var(--text-lo);margin-left:8px">${esc(a.platform||'')}</span>
14021
+ <div style="font-size:11px;color:var(--text-xs);margin-top:2px">${ts}</div>
14022
+ </div>
14023
+ <span style="font-size:11px;font-weight:600;color:${color}">${esc(a.status||'—')}</span>
14024
+ </div>`;
14025
+ }).join('');
14026
+ }
14020
14027
  </script>
14021
14028
  </body>
14022
14029
  </html>