Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
255 changes: 248 additions & 7 deletions src/data.js

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion src/frontend/analytics.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ async function renderAnalytics(container) {
coverageparts.push(byAgent['opencode'].estimated
? '<span class="coverage-est">OpenCode ~est.</span>'
: '<span class="coverage-ok">OpenCode \u2713</span>');
if (byAgent['droid'] && byAgent['droid'].sessions > 0)
coverageparts.push(byAgent['droid'].estimated
? '<span class="coverage-est">Factory Droid ~est.</span>'
: '<span class="coverage-ok">Factory Droid \u2713</span>');
['cursor', 'kiro'].forEach(function(a) {
if (noCost[a] > 0)
coverageparts.push('<span class="coverage-none">' + a + ' \u2717 (no token data)</span>');
Expand Down Expand Up @@ -222,7 +226,7 @@ async function renderAnalytics(container) {
agentEntries.forEach(function(entry) {
var name = entry[0]; var info = entry[1];
var pct = maxAgentCost > 0 ? (info.cost / maxAgentCost * 100) : 0;
var label = { 'claude': 'Claude Code', 'claude-ext': 'Claude Ext', 'codex': 'Codex', 'opencode': 'OpenCode', 'cursor': 'Cursor', 'kiro': 'Kiro', 'kilo': 'Kilo CLI' }[name] || name;
var label = { 'claude': 'Claude Code', 'claude-ext': 'Claude Ext', 'codex': 'Codex', 'opencode': 'OpenCode', 'cursor': 'Cursor', 'kiro': 'Kiro', 'kilo': 'Kilo CLI', 'droid': 'Factory Droid' }[name] || name;
var estMark = info.estimated ? ' <span style="font-size:10px;opacity:0.6">~est.</span>' : '';
html += '<div class="hbar-row">';
html += '<span class="hbar-name">' + label + estMark + '</span>';
Expand Down
6 changes: 6 additions & 0 deletions src/frontend/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -1792,6 +1792,12 @@ var AGENT_INSTALL = {
alt: null,
url: 'https://kilo.ai',
},
droid: {
name: 'Factory Droid',
cmd: 'curl -fsSL https://app.factory.ai/cli | sh',
alt: 'npm i -g droid',
url: 'https://factory.ai',
},
};

function installAgent(agent) {
Expand Down
3 changes: 3 additions & 0 deletions src/frontend/calendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ function setView(view) {
} else if (view === 'kilo-only') {
toolFilter = toolFilter === 'kilo' ? null : 'kilo';
currentView = 'sessions';
} else if (view === 'droid-only') {
toolFilter = toolFilter === 'droid' ? null : 'droid';
currentView = 'sessions';
} else {
toolFilter = null;
currentView = view;
Expand Down
4 changes: 3 additions & 1 deletion src/frontend/detail.js
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,9 @@ function launchSession(sessionId, tool, project, flags) {
function copyResume(sessionId, tool) {
var s = allSessions.find(function(x) { return x.id === sessionId; });
var cmd;
if (tool === 'codex') {
if (tool === 'droid') {
cmd = 'droid --resume ' + sessionId;
} else if (tool === 'codex') {
cmd = 'codex resume ' + sessionId;
} else if (tool === 'kilo') {
cmd = 'kilo resume ' + sessionId;
Expand Down
2 changes: 1 addition & 1 deletion src/frontend/heatmap.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ function renderHeatmap(container) {
// Per-tool breakdown
var toolTotals = {};
allSessions.forEach(function(s) { if (s.date >= yearStart) { toolTotals[s.tool] = (toolTotals[s.tool] || 0) + 1; } });
var toolColors = { claude: '#60a5fa', codex: '#22d3ee', opencode: '#c084fc', kiro: '#fb923c', kilo: '#34d399' };
var toolColors = { claude: '#60a5fa', codex: '#22d3ee', opencode: '#c084fc', kiro: '#fb923c', kilo: '#34d399', droid: '#4ade80' };
html += '<div class="gh-tools">';
Object.keys(toolTotals).sort(function(a,b) { return toolTotals[b] - toolTotals[a]; }).forEach(function(tool) {
var pct = (toolTotals[tool] / Math.max(totalThisYear, 1) * 100).toFixed(0);
Expand Down
8 changes: 8 additions & 0 deletions src/frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@
</svg>
Kilo
</div>
<div class="sidebar-item" data-view="droid-only">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="5" y="11" width="14" height="10" rx="2"/><circle cx="12" cy="7" r="4"/><path d="M9 15h.01"/><path d="M15 15h.01"/><path d="M10 18h4"/></svg>
Droid
</div>
<div class="sidebar-divider"></div>
<div class="sidebar-section">Install Agents</div>
<div class="sidebar-item" onclick="installAgent('claude')">
Expand All @@ -102,6 +106,10 @@
<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>
Kilo CLI
</div>
<div class="sidebar-item" onclick="installAgent('droid')">
<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>
Factory Droid
</div>
<div class="sidebar-divider"></div>
<div class="sidebar-item" onclick="showExportDialog()">
<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>
Expand Down
6 changes: 6 additions & 0 deletions src/frontend/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ body {
.tool-chip:hover { color: var(--text-primary); }
.tool-chip.active-claude { background: rgba(96, 165, 250, 0.2); border-color: var(--accent-blue); color: var(--accent-blue); }
.tool-chip.active-codex { background: rgba(34, 211, 238, 0.2); border-color: var(--accent-cyan); color: var(--accent-cyan); }
.tool-chip.active-droid { background: rgba(74, 222, 128, 0.2); border-color: var(--accent-green); color: var(--accent-green); }

.stats { color: var(--text-muted); font-size: 13px; white-space: nowrap; }

Expand Down Expand Up @@ -1206,6 +1207,11 @@ body {
color: #34d399;
}

.tool-droid {
background: rgba(74, 222, 128, 0.15);
color: var(--accent-green);
}

/* ── MCP / Skill badges ──────────────────────────────────────── */

.badge-mcp {
Expand Down
4 changes: 3 additions & 1 deletion src/terminals.js
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,9 @@ function openInTerminal(sessionId, tool, flags, projectDir, terminalId) {
const skipPerms = flags.includes('skip-permissions');
let cmd;

if (tool === 'codex') {
if (tool === 'droid') {
cmd = `droid --resume ${sessionId}`;
} else if (tool === 'codex') {
cmd = `codex resume ${sessionId}`;
} else if (tool === 'kilo') {
cmd = `kilo resume ${sessionId}`;
Expand Down