@action-llama/action-llama 0.17.0 → 0.17.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/dist/agents/container-runner.d.ts.map +1 -1
- package/dist/agents/container-runner.js +42 -49
- package/dist/agents/container-runner.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/cli/commands/status.js +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cloud/vps/nginx.d.ts +4 -1
- package/dist/cloud/vps/nginx.d.ts.map +1 -1
- package/dist/cloud/vps/nginx.js +48 -12
- package/dist/cloud/vps/nginx.js.map +1 -1
- package/dist/control/index.d.ts +1 -1
- package/dist/control/index.d.ts.map +1 -1
- package/dist/control/index.js +1 -1
- package/dist/control/index.js.map +1 -1
- package/dist/control/routes/dashboard-api.d.ts +20 -0
- package/dist/control/routes/dashboard-api.d.ts.map +1 -0
- package/dist/control/routes/dashboard-api.js +168 -0
- package/dist/control/routes/dashboard-api.js.map +1 -0
- package/dist/control/routes/dashboard.d.ts +3 -11
- package/dist/control/routes/dashboard.d.ts.map +1 -1
- package/dist/control/routes/dashboard.js +3 -218
- package/dist/control/routes/dashboard.js.map +1 -1
- package/dist/execution/routes/locks.d.ts.map +1 -1
- package/dist/execution/routes/locks.js +1 -0
- package/dist/execution/routes/locks.js.map +1 -1
- package/dist/extensions/loader.d.ts +1 -1
- package/dist/extensions/loader.d.ts.map +1 -1
- package/dist/extensions/loader.js +17 -13
- package/dist/extensions/loader.js.map +1 -1
- package/dist/frontend/assets/index-heXAA4Ev.js +13 -0
- package/dist/frontend/assets/index-tjVM5-7N.css +2 -0
- package/dist/frontend/index.html +13 -0
- package/dist/gateway/index.d.ts +7 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +84 -7
- package/dist/gateway/index.js.map +1 -1
- package/dist/models/providers/anthropic.d.ts.map +1 -1
- package/dist/models/providers/anthropic.js +2 -3
- package/dist/models/providers/anthropic.js.map +1 -1
- package/dist/models/providers/openai.d.ts.map +1 -1
- package/dist/models/providers/openai.js +2 -8
- package/dist/models/providers/openai.js.map +1 -1
- package/dist/remote/push.d.ts.map +1 -1
- package/dist/remote/push.js +43 -6
- package/dist/remote/push.js.map +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +6 -3
- package/dist/scheduler/index.js.map +1 -1
- package/dist/shared/usage.d.ts.map +1 -1
- package/dist/shared/usage.js +14 -9
- package/dist/shared/usage.js.map +1 -1
- package/dist/tui/App.js +3 -3
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/status-tracker.d.ts.map +1 -1
- package/dist/tui/status-tracker.js +6 -21
- package/dist/tui/status-tracker.js.map +1 -1
- package/package.json +5 -3
- package/dist/control/views/agent-detail-page.d.ts +0 -14
- package/dist/control/views/agent-detail-page.d.ts.map +0 -1
- package/dist/control/views/agent-detail-page.js +0 -501
- package/dist/control/views/agent-detail-page.js.map +0 -1
- package/dist/control/views/agent-skill-page.d.ts +0 -2
- package/dist/control/views/agent-skill-page.d.ts.map +0 -1
- package/dist/control/views/agent-skill-page.js +0 -32
- package/dist/control/views/agent-skill-page.js.map +0 -1
- package/dist/control/views/dashboard-page.d.ts +0 -4
- package/dist/control/views/dashboard-page.d.ts.map +0 -1
- package/dist/control/views/dashboard-page.js +0 -364
- package/dist/control/views/dashboard-page.js.map +0 -1
- package/dist/control/views/instance-detail-page.d.ts +0 -39
- package/dist/control/views/instance-detail-page.d.ts.map +0 -1
- package/dist/control/views/instance-detail-page.js +0 -387
- package/dist/control/views/instance-detail-page.js.map +0 -1
- package/dist/control/views/layout.d.ts +0 -17
- package/dist/control/views/layout.d.ts.map +0 -1
- package/dist/control/views/layout.js +0 -153
- package/dist/control/views/layout.js.map +0 -1
- package/dist/control/views/login-page.d.ts +0 -2
- package/dist/control/views/login-page.d.ts.map +0 -1
- package/dist/control/views/login-page.js +0 -41
- package/dist/control/views/login-page.js.map +0 -1
- package/dist/control/views/markdown.d.ts +0 -6
- package/dist/control/views/markdown.d.ts.map +0 -1
- package/dist/control/views/markdown.js +0 -119
- package/dist/control/views/markdown.js.map +0 -1
- package/dist/control/views/project-config-page.d.ts +0 -8
- package/dist/control/views/project-config-page.d.ts.map +0 -1
- package/dist/control/views/project-config-page.js +0 -117
- package/dist/control/views/project-config-page.js.map +0 -1
- package/dist/control/views/trigger-history-page.d.ts +0 -10
- package/dist/control/views/trigger-history-page.d.ts.map +0 -1
- package/dist/control/views/trigger-history-page.js +0 -89
- package/dist/control/views/trigger-history-page.js.map +0 -1
|
@@ -1,501 +0,0 @@
|
|
|
1
|
-
import { escapeHtml, formatDuration, formatCost, formatTokens, renderLayout } from "./layout.js";
|
|
2
|
-
function stateColor(state) {
|
|
3
|
-
switch (state) {
|
|
4
|
-
case "running": return { dot: "bg-green-500", text: "text-green-600 dark:text-green-400" };
|
|
5
|
-
case "building": return { dot: "bg-yellow-500", text: "text-yellow-600 dark:text-yellow-400" };
|
|
6
|
-
case "error": return { dot: "bg-red-500", text: "text-red-600 dark:text-red-400" };
|
|
7
|
-
case "idle": return { dot: "bg-slate-400", text: "text-slate-500 dark:text-slate-400" };
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
function instanceStatusColor(status) {
|
|
11
|
-
switch (status) {
|
|
12
|
-
case "running": return "text-green-600 dark:text-green-400";
|
|
13
|
-
case "completed": return "text-slate-600 dark:text-slate-300";
|
|
14
|
-
case "error": return "text-red-600 dark:text-red-400";
|
|
15
|
-
case "killed": return "text-yellow-600 dark:text-yellow-400";
|
|
16
|
-
default: return "text-slate-500";
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
function instanceCardStyle(status) {
|
|
20
|
-
switch (status) {
|
|
21
|
-
case "running": return { bg: "bg-green-50 dark:bg-green-950/30", border: "border-green-200 dark:border-green-900", dot: "bg-green-500", pulse: "animate-pulse" };
|
|
22
|
-
case "completed": return { bg: "bg-slate-50 dark:bg-slate-900", border: "border-slate-200 dark:border-slate-800", dot: "bg-slate-400", pulse: "" };
|
|
23
|
-
case "error": return { bg: "bg-red-50 dark:bg-red-950/30", border: "border-red-200 dark:border-red-900", dot: "bg-red-500", pulse: "" };
|
|
24
|
-
case "killed": return { bg: "bg-yellow-50 dark:bg-yellow-950/30", border: "border-yellow-200 dark:border-yellow-900", dot: "bg-yellow-500", pulse: "" };
|
|
25
|
-
default: return { bg: "bg-slate-50 dark:bg-slate-900", border: "border-slate-200 dark:border-slate-800", dot: "bg-slate-400", pulse: "" };
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function renderInstanceCard(inst, agentName) {
|
|
29
|
-
const s = instanceCardStyle(inst.status);
|
|
30
|
-
const killBtn = inst.status === "running"
|
|
31
|
-
? `<button class="px-2 py-1 text-xs rounded font-bold bg-red-600 hover:bg-red-700 text-white transition-colors" onclick="killInstance('${escapeHtml(inst.id)}')">Kill</button>`
|
|
32
|
-
: "";
|
|
33
|
-
return `<div class="${s.bg} border ${s.border} rounded-lg p-3 flex items-center justify-between" data-instance="${escapeHtml(inst.id)}">
|
|
34
|
-
<div>
|
|
35
|
-
<a href="/dashboard/agents/${escapeHtml(agentName)}/instances/${escapeHtml(inst.id)}" class="text-blue-600 dark:text-blue-400 hover:underline font-mono text-sm">${escapeHtml(inst.id)}</a>
|
|
36
|
-
<span class="ml-2 text-xs text-slate-500">${escapeHtml(inst.trigger)}</span>
|
|
37
|
-
<span class="ml-2 text-xs text-slate-400">started ${escapeHtml(inst.startedAt.toLocaleTimeString())}</span>
|
|
38
|
-
<span class="ml-2 text-xs ${instanceStatusColor(inst.status)}">${escapeHtml(inst.status)}</span>
|
|
39
|
-
</div>
|
|
40
|
-
<div class="flex items-center gap-2">
|
|
41
|
-
${killBtn}
|
|
42
|
-
<span class="state-dot ${s.dot} inline-block ${s.pulse}"></span>
|
|
43
|
-
</div>
|
|
44
|
-
</div>`;
|
|
45
|
-
}
|
|
46
|
-
function renderStatCard(label, value) {
|
|
47
|
-
return `<div class="bg-slate-50 dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-3">
|
|
48
|
-
<div class="text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wide mb-1">${escapeHtml(label)}</div>
|
|
49
|
-
<div class="text-lg font-semibold text-slate-900 dark:text-white">${value}</div>
|
|
50
|
-
</div>`;
|
|
51
|
-
}
|
|
52
|
-
export function renderAgentDetailPage(data) {
|
|
53
|
-
const { agentName, agent, agentConfig, summary, runningInstances, totalHistorical } = data;
|
|
54
|
-
const colors = agent ? stateColor(agent.state) : { dot: "bg-slate-400", text: "text-slate-400" };
|
|
55
|
-
const stateHtml = agent
|
|
56
|
-
? `<span class="state-dot ${colors.dot} inline-block mr-1.5"></span><span class="${colors.text}">${escapeHtml(agent.state)}</span>`
|
|
57
|
-
: '<span class="text-slate-400">unknown</span>';
|
|
58
|
-
const content = `
|
|
59
|
-
<div class="flex flex-wrap items-center justify-between gap-3 mb-6">
|
|
60
|
-
<div class="flex items-center gap-3">
|
|
61
|
-
<h1 class="text-xl sm:text-2xl font-bold text-slate-900 dark:text-white">${escapeHtml(agentName)}</h1>
|
|
62
|
-
<span id="agent-state" class="text-sm">${stateHtml}</span>
|
|
63
|
-
</div>
|
|
64
|
-
<div class="flex items-center gap-2">
|
|
65
|
-
<button class="px-3 py-1.5 text-sm rounded-md font-bold bg-green-600 hover:bg-green-700 text-white transition-colors" onclick="triggerAgent('${escapeHtml(agentName)}')">Run</button>
|
|
66
|
-
<button id="toggle-btn" class="px-3 py-1.5 text-sm rounded-md font-bold border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors" onclick="toggleEnabled()">${agent?.enabled !== false ? "Disable" : "Enable"}</button>
|
|
67
|
-
<a href="/dashboard/agents/${escapeHtml(agentName)}/skill" class="px-3 py-1.5 text-sm rounded-md font-bold border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors">View Skill</a>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
|
|
71
|
-
<div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3 mb-6">
|
|
72
|
-
${renderStatCard("Total Runs", `${summary?.totalRuns ?? 0}`)}
|
|
73
|
-
${renderStatCard("Success", `${summary?.okRuns ?? 0}`)}
|
|
74
|
-
${renderStatCard("Errors", `${summary?.errorRuns ?? 0}`)}
|
|
75
|
-
${renderStatCard("Avg Duration", summary?.avgDurationMs ? formatDuration(summary.avgDurationMs) : "\u2014")}
|
|
76
|
-
${renderStatCard("Total Tokens", formatTokens(summary?.totalTokens ?? 0))}
|
|
77
|
-
${renderStatCard("Total Cost", formatCost(summary?.totalCost ?? 0))}
|
|
78
|
-
</div>
|
|
79
|
-
|
|
80
|
-
<!-- Agent Configuration -->
|
|
81
|
-
<div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-4 mb-6">
|
|
82
|
-
<h2 class="text-lg font-semibold text-slate-900 dark:text-white mb-4">Configuration</h2>
|
|
83
|
-
|
|
84
|
-
${agentConfig?.description ? `
|
|
85
|
-
<!-- Description -->
|
|
86
|
-
<div class="mb-6">
|
|
87
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Description</h3>
|
|
88
|
-
<p class="text-sm text-slate-600 dark:text-slate-400">${escapeHtml(agentConfig.description)}</p>
|
|
89
|
-
</div>
|
|
90
|
-
` : ''}
|
|
91
|
-
|
|
92
|
-
<!-- Runtime Settings -->
|
|
93
|
-
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6 mb-6">
|
|
94
|
-
<div>
|
|
95
|
-
<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">Agent Scale (concurrent runners)</label>
|
|
96
|
-
<div class="flex items-center gap-2">
|
|
97
|
-
<input id="agent-scale-input" type="number" min="1" max="20" value="${agent?.scale ?? 1}" class="px-3 py-1.5 text-sm border border-slate-300 dark:border-slate-600 rounded-md bg-white dark:bg-slate-800 text-slate-900 dark:text-white w-20">
|
|
98
|
-
<button id="update-agent-scale-btn" class="px-3 py-1.5 text-sm rounded-md font-bold bg-blue-600 hover:bg-blue-700 text-white transition-colors" onclick="updateAgentScale()">Update</button>
|
|
99
|
-
</div>
|
|
100
|
-
<p class="text-xs text-slate-500 dark:text-slate-400 mt-1">Number of concurrent instances this agent can run</p>
|
|
101
|
-
</div>
|
|
102
|
-
|
|
103
|
-
</div>
|
|
104
|
-
|
|
105
|
-
${agentConfig ? `
|
|
106
|
-
<!-- Models -->
|
|
107
|
-
<div class="mb-6">
|
|
108
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Models</h3>
|
|
109
|
-
<div class="space-y-2">
|
|
110
|
-
${agentConfig.models?.map(model => `
|
|
111
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-3 text-sm">
|
|
112
|
-
<div class="font-medium text-slate-900 dark:text-white">${escapeHtml(model.model)}</div>
|
|
113
|
-
<div class="text-slate-600 dark:text-slate-400 text-xs">
|
|
114
|
-
Provider: ${escapeHtml(model.provider)} • Auth: ${escapeHtml(model.authType)}
|
|
115
|
-
${model.thinkingLevel ? ` • Thinking: ${escapeHtml(model.thinkingLevel)}` : ''}
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
`).join('') || '<p class="text-slate-500 dark:text-slate-400 italic text-sm">No models configured</p>'}
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
<!-- Credentials -->
|
|
123
|
-
<div class="mb-6">
|
|
124
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Credentials</h3>
|
|
125
|
-
<div class="space-y-1">
|
|
126
|
-
${agentConfig.credentials?.map(cred => `
|
|
127
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-2 text-sm">
|
|
128
|
-
<span class="text-slate-900 dark:text-white font-mono">${escapeHtml(cred)}</span>
|
|
129
|
-
</div>
|
|
130
|
-
`).join('') || '<p class="text-slate-500 dark:text-slate-400 italic text-sm">No credentials required</p>'}
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
|
|
134
|
-
${agentConfig.schedule ? `
|
|
135
|
-
<!-- Schedule -->
|
|
136
|
-
<div class="mb-6">
|
|
137
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Schedule</h3>
|
|
138
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-3">
|
|
139
|
-
<code class="text-sm font-mono text-slate-900 dark:text-white">${escapeHtml(agentConfig.schedule)}</code>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
` : ''}
|
|
143
|
-
|
|
144
|
-
${agentConfig.webhooks && agentConfig.webhooks.length > 0 ? `
|
|
145
|
-
<!-- Webhooks -->
|
|
146
|
-
<div class="mb-6">
|
|
147
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Webhook Triggers</h3>
|
|
148
|
-
<div class="space-y-2">
|
|
149
|
-
${agentConfig.webhooks.map(webhook => {
|
|
150
|
-
const filters = [];
|
|
151
|
-
if (webhook.events?.length)
|
|
152
|
-
filters.push(`events: [${webhook.events.join(', ')}]`);
|
|
153
|
-
if (webhook.actions?.length)
|
|
154
|
-
filters.push(`actions: [${webhook.actions.join(', ')}]`);
|
|
155
|
-
if (webhook.repos?.length)
|
|
156
|
-
filters.push(`repos: [${webhook.repos.join(', ')}]`);
|
|
157
|
-
if (webhook.org)
|
|
158
|
-
filters.push(`org: ${webhook.org}`);
|
|
159
|
-
if (webhook.orgs?.length)
|
|
160
|
-
filters.push(`orgs: [${webhook.orgs.join(', ')}]`);
|
|
161
|
-
if (webhook.labels?.length)
|
|
162
|
-
filters.push(`labels: [${webhook.labels.join(', ')}]`);
|
|
163
|
-
if (webhook.assignee)
|
|
164
|
-
filters.push(`assignee: ${webhook.assignee}`);
|
|
165
|
-
if (webhook.author)
|
|
166
|
-
filters.push(`author: ${webhook.author}`);
|
|
167
|
-
if (webhook.branches?.length)
|
|
168
|
-
filters.push(`branches: [${webhook.branches.join(', ')}]`);
|
|
169
|
-
return `
|
|
170
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-3 text-sm">
|
|
171
|
-
<div class="font-medium text-slate-900 dark:text-white">${escapeHtml(webhook.source || 'unknown')}</div>
|
|
172
|
-
${filters.length > 0 ? `<div class="text-slate-600 dark:text-slate-400 text-xs mt-1">${escapeHtml(filters.join(', '))}</div>` : ''}
|
|
173
|
-
</div>`;
|
|
174
|
-
}).join('')}
|
|
175
|
-
</div>
|
|
176
|
-
</div>
|
|
177
|
-
` : ''}
|
|
178
|
-
|
|
179
|
-
${agentConfig.hooks && (agentConfig.hooks.pre?.length || agentConfig.hooks.post?.length) ? `
|
|
180
|
-
<!-- Hooks -->
|
|
181
|
-
<div class="mb-6">
|
|
182
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Hooks</h3>
|
|
183
|
-
<div class="space-y-3">
|
|
184
|
-
${agentConfig.hooks.pre?.length ? `
|
|
185
|
-
<div>
|
|
186
|
-
<div class="text-xs font-medium text-slate-600 dark:text-slate-400 mb-1">Pre-execution hooks:</div>
|
|
187
|
-
${agentConfig.hooks.pre.map(cmd => `
|
|
188
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-2">
|
|
189
|
-
<code class="text-xs font-mono text-slate-900 dark:text-white">${escapeHtml(cmd)}</code>
|
|
190
|
-
</div>
|
|
191
|
-
`).join('')}
|
|
192
|
-
</div>
|
|
193
|
-
` : ''}
|
|
194
|
-
${agentConfig.hooks.post?.length ? `
|
|
195
|
-
<div>
|
|
196
|
-
<div class="text-xs font-medium text-slate-600 dark:text-slate-400 mb-1">Post-execution hooks:</div>
|
|
197
|
-
${agentConfig.hooks.post.map(cmd => `
|
|
198
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-2">
|
|
199
|
-
<code class="text-xs font-mono text-slate-900 dark:text-white">${escapeHtml(cmd)}</code>
|
|
200
|
-
</div>
|
|
201
|
-
`).join('')}
|
|
202
|
-
</div>
|
|
203
|
-
` : ''}
|
|
204
|
-
</div>
|
|
205
|
-
</div>
|
|
206
|
-
` : ''}
|
|
207
|
-
|
|
208
|
-
${agentConfig.params && Object.keys(agentConfig.params).length > 0 ? `
|
|
209
|
-
<!-- Custom Parameters -->
|
|
210
|
-
<div class="mb-6">
|
|
211
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Custom Parameters</h3>
|
|
212
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-3">
|
|
213
|
-
<pre class="text-xs font-mono text-slate-900 dark:text-white overflow-x-auto">${escapeHtml(JSON.stringify(agentConfig.params, null, 2))}</pre>
|
|
214
|
-
</div>
|
|
215
|
-
</div>
|
|
216
|
-
` : ''}
|
|
217
|
-
|
|
218
|
-
${agentConfig.timeout ? `
|
|
219
|
-
<!-- Timeout -->
|
|
220
|
-
<div class="mb-6">
|
|
221
|
-
<h3 class="text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">Timeout</h3>
|
|
222
|
-
<div class="bg-slate-50 dark:bg-slate-800 rounded-lg p-3">
|
|
223
|
-
<span class="text-sm text-slate-900 dark:text-white">${escapeHtml(agentConfig.timeout.toString())} seconds</span>
|
|
224
|
-
</div>
|
|
225
|
-
</div>
|
|
226
|
-
` : ''}
|
|
227
|
-
` : '<p class="text-slate-500 dark:text-slate-400 italic">Agent configuration could not be loaded.</p>'}
|
|
228
|
-
</div>
|
|
229
|
-
|
|
230
|
-
<!-- Session instances -->
|
|
231
|
-
<div id="running-section" class="${runningInstances.length > 0 ? "" : "hidden"} mb-6">
|
|
232
|
-
<div class="flex items-center justify-between mb-3">
|
|
233
|
-
<h2 class="text-base font-semibold text-slate-900 dark:text-white">Running Instances</h2>
|
|
234
|
-
<button id="agent-kill-btn" class="px-3 py-1.5 text-sm rounded-md font-bold bg-red-600 hover:bg-red-700 text-white transition-colors ${runningInstances.length > 0 ? "" : "opacity-50 cursor-not-allowed"}" onclick="killAgent()" ${runningInstances.length > 0 ? "" : "disabled"}>Kill all</button>
|
|
235
|
-
</div>
|
|
236
|
-
<div id="running-instances" class="space-y-2">
|
|
237
|
-
${runningInstances.map((inst) => renderInstanceCard(inst, agentName)).join("\n")}
|
|
238
|
-
</div>
|
|
239
|
-
</div>
|
|
240
|
-
|
|
241
|
-
<!-- Instance history -->
|
|
242
|
-
<h2 class="text-base font-semibold text-slate-900 dark:text-white mb-3">Instance History <span id="total-count" class="text-sm font-normal text-slate-400">(${totalHistorical} total)</span></h2>
|
|
243
|
-
<div class="overflow-x-auto mb-4">
|
|
244
|
-
<table class="w-full">
|
|
245
|
-
<thead>
|
|
246
|
-
<tr class="border-b-2 border-slate-200 dark:border-slate-700">
|
|
247
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Instance</th>
|
|
248
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Trigger</th>
|
|
249
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Status</th>
|
|
250
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Started</th>
|
|
251
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Duration</th>
|
|
252
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Tokens</th>
|
|
253
|
-
<th class="text-left px-3 py-2 text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider font-medium">Cost</th>
|
|
254
|
-
</tr>
|
|
255
|
-
</thead>
|
|
256
|
-
<tbody id="history-body" class="divide-y divide-slate-100 dark:divide-slate-800">
|
|
257
|
-
<tr><td colspan="7" class="px-3 py-6 text-center text-slate-400 italic">Loading...</td></tr>
|
|
258
|
-
</tbody>
|
|
259
|
-
</table>
|
|
260
|
-
</div>
|
|
261
|
-
<div class="flex justify-between items-center mb-8" id="pagination">
|
|
262
|
-
<button id="prev-btn" class="px-3 py-1.5 text-sm rounded-md border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed" onclick="prevPage()" disabled>Previous</button>
|
|
263
|
-
<span id="page-info" class="text-sm text-slate-400"></span>
|
|
264
|
-
<button id="next-btn" class="px-3 py-1.5 text-sm rounded-md border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed" onclick="nextPage()" disabled>Next</button>
|
|
265
|
-
</div>
|
|
266
|
-
|
|
267
|
-
<!-- Aggregate logs -->
|
|
268
|
-
<h2 class="text-base font-semibold text-slate-900 dark:text-white mb-3">Recent Logs</h2>
|
|
269
|
-
<div id="agent-log-container" class="bg-slate-50 dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-3 sm:p-4 font-mono text-xs sm:text-sm leading-relaxed overflow-y-auto scrollbar-thin" style="height: 300px;">
|
|
270
|
-
<div id="agent-log-empty" class="text-slate-400 italic">Loading logs...</div>
|
|
271
|
-
</div>`;
|
|
272
|
-
const scripts = `<script>
|
|
273
|
-
var agentName = ${JSON.stringify(agentName)};
|
|
274
|
-
var currentPage = 1;
|
|
275
|
-
var pageSize = 10;
|
|
276
|
-
var totalItems = ${totalHistorical};
|
|
277
|
-
var agentEnabled = ${agent?.enabled !== false ? "true" : "false"};
|
|
278
|
-
|
|
279
|
-
var stateColors = { running: "bg-green-500", building: "bg-yellow-500", error: "bg-red-500", idle: "bg-slate-400" };
|
|
280
|
-
var stateTextColors = { running: "text-green-600 dark:text-green-400", building: "text-yellow-600 dark:text-yellow-400", error: "text-red-600 dark:text-red-400", idle: "text-slate-500 dark:text-slate-400" };
|
|
281
|
-
|
|
282
|
-
function updateKillButtonState(instances) {
|
|
283
|
-
var hasRunning = instances.some(function(i) { return i.status === "running"; });
|
|
284
|
-
var btn = document.getElementById("agent-kill-btn");
|
|
285
|
-
if (btn) {
|
|
286
|
-
btn.disabled = !hasRunning;
|
|
287
|
-
if (hasRunning) {
|
|
288
|
-
btn.classList.remove("opacity-50", "cursor-not-allowed");
|
|
289
|
-
} else {
|
|
290
|
-
btn.classList.add("opacity-50", "cursor-not-allowed");
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
function resultColor(result) {
|
|
296
|
-
if (result === "completed" || result === "rerun") return "text-green-600 dark:text-green-400";
|
|
297
|
-
if (result === "error") return "text-red-600 dark:text-red-400";
|
|
298
|
-
return "text-slate-500 dark:text-slate-400";
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
function instStyle(status) {
|
|
302
|
-
if (status === "running") return { bg: "bg-green-50 dark:bg-green-950/30", border: "border-green-200 dark:border-green-900", dot: "bg-green-500", pulse: "animate-pulse" };
|
|
303
|
-
if (status === "error") return { bg: "bg-red-50 dark:bg-red-950/30", border: "border-red-200 dark:border-red-900", dot: "bg-red-500", pulse: "" };
|
|
304
|
-
if (status === "killed") return { bg: "bg-yellow-50 dark:bg-yellow-950/30", border: "border-yellow-200 dark:border-yellow-900", dot: "bg-yellow-500", pulse: "" };
|
|
305
|
-
return { bg: "bg-slate-50 dark:bg-slate-900", border: "border-slate-200 dark:border-slate-800", dot: "bg-slate-400", pulse: "" };
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function instStatusColor(status) {
|
|
309
|
-
if (status === "running") return "text-green-600 dark:text-green-400";
|
|
310
|
-
if (status === "error") return "text-red-600 dark:text-red-400";
|
|
311
|
-
if (status === "killed") return "text-yellow-600 dark:text-yellow-400";
|
|
312
|
-
return "text-slate-600 dark:text-slate-300";
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
function renderHistoryRow(r) {
|
|
316
|
-
var started = new Date(r.started_at).toLocaleString();
|
|
317
|
-
var rc = resultColor(r.result);
|
|
318
|
-
return '<tr class="hover:bg-slate-50 dark:hover:bg-slate-900/50 transition-colors">' +
|
|
319
|
-
'<td class="px-3 py-2.5"><a href="/dashboard/agents/' + esc(agentName) + '/instances/' + esc(r.instance_id) + '" class="text-blue-600 dark:text-blue-400 hover:underline font-mono text-xs">' + esc(r.instance_id) + '</a></td>' +
|
|
320
|
-
'<td class="px-3 py-2.5 text-sm text-slate-600 dark:text-slate-300">' + esc(r.trigger_type) + '</td>' +
|
|
321
|
-
'<td class="px-3 py-2.5 text-sm ' + rc + '">' + esc(r.result) + '</td>' +
|
|
322
|
-
'<td class="px-3 py-2.5 text-sm text-slate-600 dark:text-slate-300">' + esc(started) + '</td>' +
|
|
323
|
-
'<td class="px-3 py-2.5 text-sm text-slate-600 dark:text-slate-300">' + fmtDur(r.duration_ms) + '</td>' +
|
|
324
|
-
'<td class="px-3 py-2.5 text-sm text-slate-600 dark:text-slate-300">' + fmtTokens(r.total_tokens || 0) + '</td>' +
|
|
325
|
-
'<td class="px-3 py-2.5 text-sm text-slate-600 dark:text-slate-300">' + fmtCost(r.cost_usd || 0) + '</td></tr>';
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
function loadPage(page) {
|
|
329
|
-
currentPage = page;
|
|
330
|
-
fetch("/api/stats/agents/" + encodeURIComponent(agentName) + "/runs?page=" + page + "&limit=" + pageSize, { credentials: "same-origin" })
|
|
331
|
-
.then(function(r) { return r.json(); })
|
|
332
|
-
.then(function(data) {
|
|
333
|
-
totalItems = data.total;
|
|
334
|
-
var tbody = document.getElementById("history-body");
|
|
335
|
-
if (data.runs.length > 0) {
|
|
336
|
-
tbody.innerHTML = data.runs.map(renderHistoryRow).join("");
|
|
337
|
-
} else {
|
|
338
|
-
tbody.innerHTML = '<tr><td colspan="7" class="px-3 py-6 text-center text-slate-400 italic">No run history</td></tr>';
|
|
339
|
-
}
|
|
340
|
-
document.getElementById("total-count").textContent = "(" + totalItems + " total)";
|
|
341
|
-
var totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
|
|
342
|
-
document.getElementById("page-info").textContent = "Page " + currentPage + " of " + totalPages;
|
|
343
|
-
document.getElementById("prev-btn").disabled = currentPage <= 1;
|
|
344
|
-
document.getElementById("next-btn").disabled = currentPage >= totalPages;
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
function prevPage() { if (currentPage > 1) loadPage(currentPage - 1); }
|
|
349
|
-
function nextPage() { loadPage(currentPage + 1); }
|
|
350
|
-
|
|
351
|
-
loadPage(1);
|
|
352
|
-
|
|
353
|
-
// SSE for live updates
|
|
354
|
-
var es = new EventSource("/dashboard/api/status-stream");
|
|
355
|
-
es.onmessage = function(e) {
|
|
356
|
-
var data = JSON.parse(e.data);
|
|
357
|
-
if (data.agents) {
|
|
358
|
-
var agent = data.agents.find(function(a) { return a.name === agentName; });
|
|
359
|
-
if (agent) {
|
|
360
|
-
var dotClass = stateColors[agent.state] || "bg-slate-400";
|
|
361
|
-
var textClass = stateTextColors[agent.state] || "text-slate-400";
|
|
362
|
-
document.getElementById("agent-state").innerHTML = '<span class="state-dot ' + dotClass + ' inline-block mr-1.5"></span><span class="' + textClass + '">' + esc(agent.state) + '</span>';
|
|
363
|
-
agentEnabled = agent.enabled;
|
|
364
|
-
document.getElementById("toggle-btn").textContent = agentEnabled ? "Disable" : "Enable";
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
if (data.instances) {
|
|
368
|
-
var mine = data.instances.filter(function(i) { return i.agentName === agentName; });
|
|
369
|
-
var section = document.getElementById("running-section");
|
|
370
|
-
var container = document.getElementById("running-instances");
|
|
371
|
-
if (mine.length > 0) {
|
|
372
|
-
section.classList.remove("hidden");
|
|
373
|
-
container.innerHTML = mine.map(function(inst) {
|
|
374
|
-
var st = instStyle(inst.status);
|
|
375
|
-
var killBtn = inst.status === "running"
|
|
376
|
-
? '<button class="px-2 py-1 text-xs rounded font-bold bg-red-600 hover:bg-red-700 text-white transition-colors" onclick="killInstance(\\\'' + esc(inst.id) + '\\\')">Kill</button>'
|
|
377
|
-
: "";
|
|
378
|
-
var statusColor = instStatusColor(inst.status);
|
|
379
|
-
return '<div class="' + st.bg + ' border ' + st.border + ' rounded-lg p-3 flex items-center justify-between" data-instance="' + esc(inst.id) + '">' +
|
|
380
|
-
'<div><a href="/dashboard/agents/' + esc(agentName) + '/instances/' + esc(inst.id) + '" class="text-blue-600 dark:text-blue-400 hover:underline font-mono text-sm">' + esc(inst.id) + '</a>' +
|
|
381
|
-
'<span class="ml-2 text-xs text-slate-500">' + esc(inst.trigger) + '</span>' +
|
|
382
|
-
'<span class="ml-2 text-xs text-slate-400">started ' + fmtTime(inst.startedAt) + '</span>' +
|
|
383
|
-
'<span class="ml-2 text-xs ' + statusColor + '">' + esc(inst.status) + '</span></div>' +
|
|
384
|
-
'<div class="flex items-center gap-2">' + killBtn +
|
|
385
|
-
'<span class="state-dot ' + st.dot + ' inline-block ' + st.pulse + '"></span></div></div>';
|
|
386
|
-
}).join("");
|
|
387
|
-
} else {
|
|
388
|
-
section.classList.add("hidden");
|
|
389
|
-
container.innerHTML = "";
|
|
390
|
-
}
|
|
391
|
-
// Update kill button state after updating instances
|
|
392
|
-
updateKillButtonState(mine);
|
|
393
|
-
}
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
function triggerAgent(name) {
|
|
397
|
-
ctrlPost("/control/trigger/" + encodeURIComponent(name));
|
|
398
|
-
}
|
|
399
|
-
function toggleEnabled() {
|
|
400
|
-
var action = agentEnabled ? "disable" : "enable";
|
|
401
|
-
ctrlPost("/control/agents/" + encodeURIComponent(agentName) + "/" + action);
|
|
402
|
-
}
|
|
403
|
-
function killAgent() {
|
|
404
|
-
var btn = document.getElementById("agent-kill-btn");
|
|
405
|
-
if (!btn || btn.disabled) return;
|
|
406
|
-
if (!confirm("Kill all instances of agent '" + agentName + "'?")) return;
|
|
407
|
-
ctrlPost("/control/agents/" + encodeURIComponent(agentName) + "/kill");
|
|
408
|
-
}
|
|
409
|
-
function killInstance(id) {
|
|
410
|
-
if (!confirm("Kill instance " + id + "?")) return;
|
|
411
|
-
ctrlPost("/control/kill/" + encodeURIComponent(id));
|
|
412
|
-
}
|
|
413
|
-
function updateAgentScale() {
|
|
414
|
-
var input = document.getElementById("agent-scale-input");
|
|
415
|
-
var btn = document.getElementById("update-agent-scale-btn");
|
|
416
|
-
var scale = parseInt(input.value);
|
|
417
|
-
if (!scale || scale < 1 || scale > 20) {
|
|
418
|
-
alert("Scale must be between 1 and 20");
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
btn.disabled = true;
|
|
422
|
-
btn.textContent = "Updating...";
|
|
423
|
-
fetch("/control/agents/" + encodeURIComponent(agentName) + "/scale", {
|
|
424
|
-
method: "POST",
|
|
425
|
-
credentials: "same-origin",
|
|
426
|
-
headers: { "Content-Type": "application/json" },
|
|
427
|
-
body: JSON.stringify({ scale: scale })
|
|
428
|
-
}).then(function(r) {
|
|
429
|
-
if (r.ok) {
|
|
430
|
-
alert("Agent scale updated to " + scale);
|
|
431
|
-
} else {
|
|
432
|
-
r.text().then(function(text) { alert("Error: " + text); });
|
|
433
|
-
}
|
|
434
|
-
}).catch(function(err) {
|
|
435
|
-
alert("Error: " + err);
|
|
436
|
-
}).finally(function() {
|
|
437
|
-
btn.disabled = false;
|
|
438
|
-
btn.textContent = "Update";
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// Aggregate log viewer
|
|
443
|
-
var SKIP_LOG_MSGS = { "event": 1, "tool done": 1 };
|
|
444
|
-
function formatAgentLogEntry(p) {
|
|
445
|
-
var time = '<span class="text-slate-400">' + esc(new Date(p.time).toLocaleTimeString("en-US", { hour12: false })) + '</span> ';
|
|
446
|
-
var msg = p.msg || "";
|
|
447
|
-
var lvl = p.level || 30;
|
|
448
|
-
var inst = p.instance ? '<span class="text-purple-400">[' + esc(p.instance.slice(0, 8)) + ']</span> ' : "";
|
|
449
|
-
if (SKIP_LOG_MSGS[msg]) return null;
|
|
450
|
-
if (lvl <= 20 && msg !== "tool start") return null;
|
|
451
|
-
if (msg === "assistant") {
|
|
452
|
-
var text = p.text || "";
|
|
453
|
-
if (!text) return null;
|
|
454
|
-
return time + inst + '<span class="text-slate-900 dark:text-white font-medium">' + esc(text.split("\\n")[0]) + '</span>';
|
|
455
|
-
}
|
|
456
|
-
if (msg === "bash") return time + inst + '<span class="text-cyan-500">$ ' + esc(p.cmd || "") + '</span>';
|
|
457
|
-
if (msg === "tool start") return time + inst + '<span class="text-blue-500">\\u25b8 ' + esc(p.tool || "unknown") + '</span>';
|
|
458
|
-
if (msg === "run completed" || msg === "run completed, rerun requested") return time + inst + '<span class="text-green-500 font-semibold">Run completed</span>';
|
|
459
|
-
if (lvl >= 50) return time + inst + '<span class="text-red-500 font-semibold">ERROR: ' + esc(msg) + '</span>';
|
|
460
|
-
if (lvl >= 40) return time + inst + '<span class="text-yellow-500">WARN: ' + esc(msg) + '</span>';
|
|
461
|
-
return time + inst + '<span class="text-slate-400">' + esc(msg) + '</span>';
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
var agentLogContainer = document.getElementById("agent-log-container");
|
|
465
|
-
var agentLogEmpty = document.getElementById("agent-log-empty");
|
|
466
|
-
var agentLogCursor = null;
|
|
467
|
-
async function fetchAgentLogs(initial) {
|
|
468
|
-
try {
|
|
469
|
-
var params = new URLSearchParams();
|
|
470
|
-
if (initial) params.set("lines", "200");
|
|
471
|
-
if (agentLogCursor) params.set("cursor", agentLogCursor);
|
|
472
|
-
var res = await fetch("/api/logs/agents/" + encodeURIComponent(agentName) + "?" + params, { credentials: "same-origin" });
|
|
473
|
-
if (!res.ok) return;
|
|
474
|
-
var data = await res.json();
|
|
475
|
-
if (data.entries.length > 0 && agentLogEmpty && agentLogEmpty.parentNode) agentLogEmpty.remove();
|
|
476
|
-
for (var i = 0; i < data.entries.length; i++) {
|
|
477
|
-
var html = formatAgentLogEntry(data.entries[i]);
|
|
478
|
-
if (!html) continue;
|
|
479
|
-
var div = document.createElement("div");
|
|
480
|
-
div.className = "whitespace-pre-wrap break-all py-px";
|
|
481
|
-
div.innerHTML = html;
|
|
482
|
-
agentLogContainer.appendChild(div);
|
|
483
|
-
}
|
|
484
|
-
if (data.cursor) agentLogCursor = data.cursor;
|
|
485
|
-
agentLogContainer.scrollTop = agentLogContainer.scrollHeight;
|
|
486
|
-
} catch(e) {}
|
|
487
|
-
}
|
|
488
|
-
fetchAgentLogs(true);
|
|
489
|
-
setInterval(function() { fetchAgentLogs(false); }, 2000);
|
|
490
|
-
</script>`;
|
|
491
|
-
return renderLayout({
|
|
492
|
-
title: agentName,
|
|
493
|
-
breadcrumbs: [
|
|
494
|
-
{ label: "Dashboard", href: "/dashboard" },
|
|
495
|
-
{ label: agentName },
|
|
496
|
-
],
|
|
497
|
-
content,
|
|
498
|
-
scripts,
|
|
499
|
-
});
|
|
500
|
-
}
|
|
501
|
-
//# sourceMappingURL=agent-detail-page.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-detail-page.js","sourceRoot":"","sources":["../../../src/control/views/agent-detail-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-skill-page.d.ts","sourceRoot":"","sources":["../../../src/control/views/agent-skill-page.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA6BjF"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { escapeHtml, renderLayout } from "./layout.js";
|
|
2
|
-
import { renderMarkdown } from "./markdown.js";
|
|
3
|
-
export function renderAgentSkillPage(agentName, skillBody) {
|
|
4
|
-
const content = `
|
|
5
|
-
<div class="flex items-center justify-between mb-6">
|
|
6
|
-
<div class="flex items-center gap-3">
|
|
7
|
-
<h1 class="text-xl sm:text-2xl font-bold text-slate-900 dark:text-white">${escapeHtml(agentName)} Skill</h1>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="flex items-center gap-2">
|
|
10
|
-
<a href="/dashboard/agents/${escapeHtml(agentName)}" class="px-3 py-1.5 text-sm rounded-md font-bold border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 hover:bg-slate-50 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 transition-colors">
|
|
11
|
-
Back to Agent
|
|
12
|
-
</a>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<div class="bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 p-6">
|
|
17
|
-
<div class="prose prose-slate dark:prose-invert max-w-none">
|
|
18
|
-
${skillBody ? renderMarkdown(skillBody) : '<p class="text-slate-500 dark:text-slate-400 italic">No skill content available.</p>'}
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
`;
|
|
22
|
-
return renderLayout({
|
|
23
|
-
title: `${agentName} Skill`,
|
|
24
|
-
breadcrumbs: [
|
|
25
|
-
{ label: "Dashboard", href: "/dashboard" },
|
|
26
|
-
{ label: agentName, href: `/dashboard/agents/${encodeURIComponent(agentName)}` },
|
|
27
|
-
{ label: "Skill" },
|
|
28
|
-
],
|
|
29
|
-
content,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=agent-skill-page.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-skill-page.js","sourceRoot":"","sources":["../../../src/control/views/agent-skill-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,SAAiB;IACvE,MAAM,OAAO,GAAG;;;mFAGiE,UAAU,CAAC,SAAS,CAAC;;;qCAGnE,UAAU,CAAC,SAAS,CAAC;;;;;;;;UAQhD,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,sFAAsF;;;GAGrI,CAAC;IAEF,OAAO,YAAY,CAAC;QAClB,KAAK,EAAE,GAAG,SAAS,QAAQ;QAC3B,WAAW,EAAE;YACX,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAAE;YAChF,EAAE,KAAK,EAAE,OAAO,EAAE;SACnB;QACD,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { AgentStatus, SchedulerInfo, LogLine } from "../../tui/status-tracker.js";
|
|
2
|
-
import type { TriggerHistoryRow } from "../../stats/store.js";
|
|
3
|
-
export declare function renderDashboardPage(agents: AgentStatus[], schedulerInfo: SchedulerInfo | null, recentLogs: LogLine[], triggerHistory?: TriggerHistoryRow[]): string;
|
|
4
|
-
//# sourceMappingURL=dashboard-page.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-page.d.ts","sourceRoot":"","sources":["../../../src/control/views/dashboard-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA8I9D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,cAAc,CAAC,EAAE,iBAAiB,EAAE,GAAG,MAAM,CA8OnK"}
|