codedash-app 3.2.0 → 3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codedash-app",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "description": "Termius-style browser dashboard for Claude Code sessions. View, search, resume, and delete sessions with a dark-themed UI.",
5
5
  "bin": {
6
6
  "codedash": "./bin/cli.js"
@@ -1744,6 +1744,59 @@ function focusSession(sessionId) {
1744
1744
  });
1745
1745
  }
1746
1746
 
1747
+ // ── Install agents ────────────────────────────────────────────
1748
+
1749
+ var AGENT_INSTALL = {
1750
+ claude: {
1751
+ name: 'Claude Code',
1752
+ cmd: 'curl -fsSL https://claude.ai/install.sh | bash',
1753
+ alt: 'npm i -g @anthropic-ai/claude-code',
1754
+ url: 'https://code.claude.com',
1755
+ },
1756
+ codex: {
1757
+ name: 'Codex CLI',
1758
+ cmd: 'npm i -g @openai/codex',
1759
+ alt: 'brew install --cask codex',
1760
+ url: 'https://github.com/openai/codex',
1761
+ },
1762
+ kiro: {
1763
+ name: 'Kiro CLI',
1764
+ cmd: 'curl -fsSL https://kiro.dev/install.sh | bash',
1765
+ alt: null,
1766
+ url: 'https://kiro.dev/cli/',
1767
+ },
1768
+ opencode: {
1769
+ name: 'OpenCode',
1770
+ cmd: 'curl -fsSL https://opencode.ai/install | bash',
1771
+ alt: 'npm i -g opencode-ai@latest',
1772
+ url: 'https://opencode.ai',
1773
+ },
1774
+ };
1775
+
1776
+ function installAgent(agent) {
1777
+ var info = AGENT_INSTALL[agent];
1778
+ if (!info) return;
1779
+
1780
+ var overlay = document.getElementById('confirmOverlay');
1781
+ document.getElementById('confirmTitle').textContent = 'Install ' + info.name;
1782
+ var html = '<code style="display:block;margin:8px 0;padding:10px;background:var(--bg-card);border-radius:6px;font-size:13px;cursor:pointer" onclick="navigator.clipboard.writeText(\'' + info.cmd.replace(/'/g, "\\'") + '\');document.querySelector(\'#toast\').textContent=\'Copied!\';document.querySelector(\'#toast\').classList.add(\'show\');setTimeout(function(){document.querySelector(\'#toast\').classList.remove(\'show\')},1500)">' + escHtml(info.cmd) + '</code>';
1783
+ if (info.alt) {
1784
+ html += '<span style="font-size:11px;color:var(--text-muted)">or: <code>' + escHtml(info.alt) + '</code></span><br>';
1785
+ }
1786
+ html += '<br><a href="' + info.url + '" target="_blank" style="color:var(--accent-blue);font-size:12px">' + info.url + '</a>';
1787
+ document.getElementById('confirmText').innerHTML = html;
1788
+ document.getElementById('confirmId').textContent = '';
1789
+ document.getElementById('confirmAction').textContent = 'Copy Install Command';
1790
+ document.getElementById('confirmAction').className = 'launch-btn btn-primary';
1791
+ document.getElementById('confirmAction').onclick = function() {
1792
+ navigator.clipboard.writeText(info.cmd).then(function() {
1793
+ showToast('Copied: ' + info.cmd);
1794
+ });
1795
+ closeConfirm();
1796
+ };
1797
+ if (overlay) overlay.style.display = 'flex';
1798
+ }
1799
+
1747
1800
  // ── Export/Import dialog ──────────────────────────────────────
1748
1801
 
1749
1802
  function showExportDialog() {
@@ -53,10 +53,31 @@
53
53
  Codex
54
54
  </div>
55
55
  <div class="sidebar-divider"></div>
56
+ <div class="sidebar-section">Install Agents</div>
57
+ <div class="sidebar-item small" onclick="installAgent('claude')">
58
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
59
+ Claude Code
60
+ </div>
61
+ <div class="sidebar-item small" onclick="installAgent('codex')">
62
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
63
+ Codex CLI
64
+ </div>
65
+ <div class="sidebar-item small" onclick="installAgent('kiro')">
66
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
67
+ Kiro CLI
68
+ </div>
69
+ <div class="sidebar-item small" onclick="installAgent('opencode')">
70
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
71
+ OpenCode
72
+ </div>
73
+ <div class="sidebar-divider"></div>
56
74
  <div class="sidebar-item" onclick="showExportDialog()">
57
75
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
58
76
  Export / Import
59
77
  </div>
78
+ <div class="sidebar-author">
79
+ <a href="https://t.me/neuraldeep" target="_blank">Valerii Kovalskii</a>
80
+ </div>
60
81
  <div class="sidebar-settings">
61
82
  <label>Terminal</label>
62
83
  <select id="terminalSelect" onchange="saveTerminalPref(this.value)">
@@ -135,6 +135,8 @@ body {
135
135
  }
136
136
  .sidebar-item:hover { background: rgba(255,255,255,0.05); color: var(--text-primary); }
137
137
  .sidebar-item.active { color: var(--text-primary); background: rgba(255,255,255,0.08); }
138
+ .sidebar-item.small { padding: 6px 20px; font-size: 12px; }
139
+ .sidebar-item.small svg { width: 14px; height: 14px; }
138
140
  .sidebar-item svg { width: 18px; height: 18px; opacity: 0.7; }
139
141
 
140
142
  .sidebar-divider { height: 1px; background: var(--border); margin: 12px 20px; }
@@ -147,8 +149,20 @@ body {
147
149
  color: var(--text-muted);
148
150
  }
149
151
 
150
- .sidebar-settings {
152
+ .sidebar-author {
151
153
  margin-top: auto;
154
+ padding: 8px 20px 0;
155
+ font-size: 11px;
156
+ text-align: center;
157
+ }
158
+ .sidebar-author a {
159
+ color: var(--text-muted);
160
+ text-decoration: none;
161
+ transition: color 0.15s;
162
+ }
163
+ .sidebar-author a:hover { color: var(--accent-blue); }
164
+
165
+ .sidebar-settings {
152
166
  padding: 12px 16px;
153
167
  border-top: 1px solid var(--border);
154
168
  }