opencode-agora 0.4.2 → 0.4.3
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/README.md +42 -2
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +14 -0
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/commands/browse.d.ts.map +1 -1
- package/dist/cli/commands/browse.js +1 -5
- package/dist/cli/commands/browse.js.map +1 -1
- package/dist/cli/commands/capabilities.d.ts +3 -0
- package/dist/cli/commands/capabilities.d.ts.map +1 -0
- package/dist/cli/commands/capabilities.js +146 -0
- package/dist/cli/commands/capabilities.js.map +1 -0
- package/dist/cli/commands/community.d.ts.map +1 -1
- package/dist/cli/commands/community.js.map +1 -1
- package/dist/cli/commands/curate.d.ts +9 -0
- package/dist/cli/commands/curate.d.ts.map +1 -0
- package/dist/cli/commands/curate.js +62 -0
- package/dist/cli/commands/curate.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +77 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +5 -3
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/freeze.d.ts +3 -0
- package/dist/cli/commands/freeze.d.ts.map +1 -0
- package/dist/cli/commands/freeze.js +62 -0
- package/dist/cli/commands/freeze.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +5 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/installed.d.ts +3 -0
- package/dist/cli/commands/installed.d.ts.map +1 -0
- package/dist/cli/commands/installed.js +82 -0
- package/dist/cli/commands/installed.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -1
- package/dist/cli/commands/marketplace.js.map +1 -1
- package/dist/cli/commands/notify.d.ts.map +1 -1
- package/dist/cli/commands/notify.js.map +1 -1
- package/dist/cli/commands/operations.d.ts.map +1 -1
- package/dist/cli/commands/operations.js +64 -1
- package/dist/cli/commands/operations.js.map +1 -1
- package/dist/cli/commands/ping.js +2 -1
- package/dist/cli/commands/ping.js.map +1 -1
- package/dist/cli/commands/scan.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +172 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/today.d.ts.map +1 -1
- package/dist/cli/commands/today.js +11 -3
- package/dist/cli/commands/today.js.map +1 -1
- package/dist/cli/commands/try.d.ts +3 -0
- package/dist/cli/commands/try.d.ts.map +1 -0
- package/dist/cli/commands/try.js +157 -0
- package/dist/cli/commands/try.js.map +1 -0
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/commands/welcome.d.ts.map +1 -1
- package/dist/cli/commands/welcome.js +6 -27
- package/dist/cli/commands/welcome.js.map +1 -1
- package/dist/cli/commands-meta.d.ts +1 -1
- package/dist/cli/commands-meta.d.ts.map +1 -1
- package/dist/cli/commands-meta.js +222 -21
- package/dist/cli/commands-meta.js.map +1 -1
- package/dist/cli/completions-gen.d.ts.map +1 -1
- package/dist/cli/completions-gen.js +130 -52
- package/dist/cli/completions-gen.js.map +1 -1
- package/dist/cli/flags.d.ts.map +1 -1
- package/dist/cli/flags.js +7 -0
- package/dist/cli/flags.js.map +1 -1
- package/dist/cli/format.js +1 -1
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/helpers.d.ts.map +1 -1
- package/dist/cli/helpers.js.map +1 -1
- package/dist/cli/mcp-server.d.ts +5 -0
- package/dist/cli/mcp-server.d.ts.map +1 -1
- package/dist/cli/mcp-server.js +222 -0
- package/dist/cli/mcp-server.js.map +1 -1
- package/dist/cli/pages/community.d.ts.map +1 -1
- package/dist/cli/pages/community.js +4 -7
- package/dist/cli/pages/community.js.map +1 -1
- package/dist/cli/pages/home.d.ts.map +1 -1
- package/dist/cli/pages/home.js +22 -8
- package/dist/cli/pages/home.js.map +1 -1
- package/dist/cli/pages/marketplace.d.ts.map +1 -1
- package/dist/cli/pages/marketplace.js +12 -9
- package/dist/cli/pages/marketplace.js.map +1 -1
- package/dist/cli/pages/news.d.ts.map +1 -1
- package/dist/cli/pages/news.js.map +1 -1
- package/dist/cli/pages/stack.d.ts +3 -0
- package/dist/cli/pages/stack.d.ts.map +1 -0
- package/dist/cli/pages/stack.js +373 -0
- package/dist/cli/pages/stack.js.map +1 -0
- package/dist/cli/pages/types.d.ts +1 -1
- package/dist/cli/pages/types.d.ts.map +1 -1
- package/dist/cli/shell.d.ts +1 -1
- package/dist/cli/shell.d.ts.map +1 -1
- package/dist/cli/shell.js +52 -2
- package/dist/cli/shell.js.map +1 -1
- package/dist/cli/tui.d.ts.map +1 -1
- package/dist/cli/tui.js +14 -4
- package/dist/cli/tui.js.map +1 -1
- package/dist/community/client.d.ts.map +1 -1
- package/dist/community/client.js +3 -1
- package/dist/community/client.js.map +1 -1
- package/dist/curator/index.d.ts +95 -0
- package/dist/curator/index.d.ts.map +1 -0
- package/dist/curator/index.js +446 -0
- package/dist/curator/index.js.map +1 -0
- package/dist/hubs/enrichment.d.ts.map +1 -1
- package/dist/hubs/enrichment.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/marketplace.d.ts +2 -1
- package/dist/marketplace.d.ts.map +1 -1
- package/dist/marketplace.js +86 -17
- package/dist/marketplace.js.map +1 -1
- package/dist/outdated.d.ts.map +1 -1
- package/dist/outdated.js +25 -4
- package/dist/outdated.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +83 -15
- package/dist/scan.js.map +1 -1
- package/dist/search/catalog-index.d.ts +107 -0
- package/dist/search/catalog-index.d.ts.map +1 -0
- package/dist/search/catalog-index.js +276 -0
- package/dist/search/catalog-index.js.map +1 -0
- package/dist/stack/adapters/claude-code.d.ts +3 -0
- package/dist/stack/adapters/claude-code.d.ts.map +1 -0
- package/dist/stack/adapters/claude-code.js +282 -0
- package/dist/stack/adapters/claude-code.js.map +1 -0
- package/dist/stack/adapters/cursor.d.ts +3 -0
- package/dist/stack/adapters/cursor.d.ts.map +1 -0
- package/dist/stack/adapters/cursor.js +232 -0
- package/dist/stack/adapters/cursor.js.map +1 -0
- package/dist/stack/adapters/opencode.d.ts +3 -0
- package/dist/stack/adapters/opencode.d.ts.map +1 -0
- package/dist/stack/adapters/opencode.js +177 -0
- package/dist/stack/adapters/opencode.js.map +1 -0
- package/dist/stack/adapters/windsurf.d.ts +3 -0
- package/dist/stack/adapters/windsurf.d.ts.map +1 -0
- package/dist/stack/adapters/windsurf.js +218 -0
- package/dist/stack/adapters/windsurf.js.map +1 -0
- package/dist/stack/capability-cache.d.ts +19 -0
- package/dist/stack/capability-cache.d.ts.map +1 -0
- package/dist/stack/capability-cache.js +41 -0
- package/dist/stack/capability-cache.js.map +1 -0
- package/dist/stack/doctor.d.ts +30 -0
- package/dist/stack/doctor.d.ts.map +1 -0
- package/dist/stack/doctor.js +227 -0
- package/dist/stack/doctor.js.map +1 -0
- package/dist/stack/manifest.d.ts +40 -0
- package/dist/stack/manifest.d.ts.map +1 -0
- package/dist/stack/manifest.js +342 -0
- package/dist/stack/manifest.js.map +1 -0
- package/dist/stack/mcp-probe.d.ts +23 -0
- package/dist/stack/mcp-probe.d.ts.map +1 -0
- package/dist/stack/mcp-probe.js +230 -0
- package/dist/stack/mcp-probe.js.map +1 -0
- package/dist/stack/path-resolve.d.ts +7 -0
- package/dist/stack/path-resolve.d.ts.map +1 -0
- package/dist/stack/path-resolve.js +37 -0
- package/dist/stack/path-resolve.js.map +1 -0
- package/dist/stack/registry.d.ts +11 -0
- package/dist/stack/registry.d.ts.map +1 -0
- package/dist/stack/registry.js +42 -0
- package/dist/stack/registry.js.map +1 -0
- package/dist/stack/sync.d.ts +20 -0
- package/dist/stack/sync.d.ts.map +1 -0
- package/dist/stack/sync.js +226 -0
- package/dist/stack/sync.js.map +1 -0
- package/dist/stack/types.d.ts +53 -0
- package/dist/stack/types.d.ts.map +1 -0
- package/dist/stack/types.js +2 -0
- package/dist/stack/types.js.map +1 -0
- package/dist/transcript.d.ts +14 -0
- package/dist/transcript.d.ts.map +1 -1
- package/dist/transcript.js +98 -1
- package/dist/transcript.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { vlen, rail, noRail, sep, frame, padRight, truncate } from './helpers.js';
|
|
2
|
+
import { readAllServers, groupServersByName, detectTools } from '../../stack/registry.js';
|
|
3
|
+
import { checkStack } from '../../stack/doctor.js';
|
|
4
|
+
import { readCapabilityCache } from '../../stack/capability-cache.js';
|
|
5
|
+
import { detectAgoraDataDir } from '../../state.js';
|
|
6
|
+
const state = {
|
|
7
|
+
servers: [],
|
|
8
|
+
health: null,
|
|
9
|
+
caps: new Map(),
|
|
10
|
+
selected: 0,
|
|
11
|
+
mode: 'list',
|
|
12
|
+
probing: false,
|
|
13
|
+
loaded: false,
|
|
14
|
+
error: undefined
|
|
15
|
+
};
|
|
16
|
+
function buildStackEnv(ctx) {
|
|
17
|
+
return {
|
|
18
|
+
cwd: ctx.io.cwd,
|
|
19
|
+
home: ctx.io.env?.HOME,
|
|
20
|
+
env: ctx.io.env
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function getDataDir(ctx) {
|
|
24
|
+
return detectAgoraDataDir({ env: ctx.io.env });
|
|
25
|
+
}
|
|
26
|
+
async function loadStack(ctx) {
|
|
27
|
+
state.error = undefined;
|
|
28
|
+
try {
|
|
29
|
+
const env = buildStackEnv(ctx);
|
|
30
|
+
const allServers = readAllServers(env);
|
|
31
|
+
const grouped = groupServersByName(allServers);
|
|
32
|
+
const entries = [];
|
|
33
|
+
for (const [name, instances] of grouped) {
|
|
34
|
+
entries.push({ name, instances });
|
|
35
|
+
}
|
|
36
|
+
state.servers = entries;
|
|
37
|
+
// Static checks only — no probe on mount
|
|
38
|
+
const health = await checkStack(allServers, { ...env, probe: false });
|
|
39
|
+
state.health = health;
|
|
40
|
+
// Load capability cache
|
|
41
|
+
const dataDir = getDataDir(ctx);
|
|
42
|
+
const capList = readCapabilityCache(dataDir);
|
|
43
|
+
const capsMap = new Map();
|
|
44
|
+
for (const cap of capList) {
|
|
45
|
+
capsMap.set(cap.name, cap);
|
|
46
|
+
}
|
|
47
|
+
state.caps = capsMap;
|
|
48
|
+
state.loaded = true;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
state.error = err instanceof Error ? err.message : String(err);
|
|
52
|
+
state.loaded = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function healthGlyph(status, style) {
|
|
56
|
+
if (status === 'ok')
|
|
57
|
+
return style.accent('✓');
|
|
58
|
+
if (status === 'warn')
|
|
59
|
+
return style.orange('⚠');
|
|
60
|
+
return style.bold('✗');
|
|
61
|
+
}
|
|
62
|
+
function checkGlyph(ok, level, style) {
|
|
63
|
+
if (ok)
|
|
64
|
+
return style.accent('✓');
|
|
65
|
+
if (level === 'warn')
|
|
66
|
+
return style.orange('⚠');
|
|
67
|
+
return style.bold('✗');
|
|
68
|
+
}
|
|
69
|
+
export const stackPage = {
|
|
70
|
+
id: 'stack',
|
|
71
|
+
title: 'STACK',
|
|
72
|
+
navLabel: 'Stack',
|
|
73
|
+
navIcon: 'X',
|
|
74
|
+
hotkeys: [
|
|
75
|
+
{ key: 'j/k', label: 'nav' },
|
|
76
|
+
{ key: 'Enter', label: 'details' },
|
|
77
|
+
{ key: 'p', label: 'probe' },
|
|
78
|
+
{ key: 'r', label: 'refresh' },
|
|
79
|
+
{ key: 'Esc', label: 'back' }
|
|
80
|
+
],
|
|
81
|
+
async mount(ctx) {
|
|
82
|
+
state.mode = 'list';
|
|
83
|
+
state.selected = 0;
|
|
84
|
+
state.loaded = false;
|
|
85
|
+
await loadStack(ctx);
|
|
86
|
+
},
|
|
87
|
+
render(ctx) {
|
|
88
|
+
const { style, width, height } = ctx;
|
|
89
|
+
const lines = [];
|
|
90
|
+
// ── Header ────────────────────────────────────────────────────────────────
|
|
91
|
+
const totalServers = state.servers.length;
|
|
92
|
+
const totalTools = state.servers.reduce((n, e) => n + e.instances.length, 0);
|
|
93
|
+
const summary = totalServers === 0
|
|
94
|
+
? style.dim('no servers configured')
|
|
95
|
+
: style.dim(totalServers +
|
|
96
|
+
(totalServers === 1 ? ' server' : ' servers') +
|
|
97
|
+
' · ' +
|
|
98
|
+
totalTools +
|
|
99
|
+
(totalTools === 1 ? ' instance' : ' instances'));
|
|
100
|
+
const health = state.health;
|
|
101
|
+
const healthSummary = health
|
|
102
|
+
? ' ' +
|
|
103
|
+
style.accent('ok: ' + health.summary.ok) +
|
|
104
|
+
style.dim(' · ') +
|
|
105
|
+
style.orange('warn: ' + health.summary.warn) +
|
|
106
|
+
style.dim(' · ') +
|
|
107
|
+
style.dim('error: ' + health.summary.error)
|
|
108
|
+
: '';
|
|
109
|
+
lines.push(' ' + style.bold(style.accent('STACK')) + ' ' + summary + healthSummary);
|
|
110
|
+
lines.push(' ' + sep('', width - 2, style));
|
|
111
|
+
// ── Error state ────────────────────────────────────────────────────────────
|
|
112
|
+
if (state.error) {
|
|
113
|
+
lines.push('');
|
|
114
|
+
lines.push(' ' + style.bold('Error loading stack:'));
|
|
115
|
+
lines.push(' ' + style.dim(state.error));
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push(' ' + style.accent('r') + style.dim(' refresh'));
|
|
118
|
+
return frame(lines, width, height);
|
|
119
|
+
}
|
|
120
|
+
// ── Loading ────────────────────────────────────────────────────────────────
|
|
121
|
+
if (!state.loaded) {
|
|
122
|
+
lines.push('');
|
|
123
|
+
lines.push(' ' + style.dim('Loading…'));
|
|
124
|
+
return frame(lines, width, height);
|
|
125
|
+
}
|
|
126
|
+
// ── Empty state ────────────────────────────────────────────────────────────
|
|
127
|
+
if (state.servers.length === 0) {
|
|
128
|
+
lines.push('');
|
|
129
|
+
const toolResults = detectTools(buildStackEnv(ctx));
|
|
130
|
+
const detected = toolResults.filter((t) => t.present).map((t) => t.adapter.displayName);
|
|
131
|
+
if (detected.length > 0) {
|
|
132
|
+
lines.push(' ' + style.dim('Detected tools: ') + detected.join(', '));
|
|
133
|
+
lines.push('');
|
|
134
|
+
}
|
|
135
|
+
lines.push(' ' + style.dim('No MCP servers configured.'));
|
|
136
|
+
lines.push(' ' +
|
|
137
|
+
style.dim('Run ') +
|
|
138
|
+
style.accent('agora install <name>') +
|
|
139
|
+
style.dim(' to add a server, or ') +
|
|
140
|
+
style.accent('agora search') +
|
|
141
|
+
style.dim(' to browse.'));
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push(' ' +
|
|
144
|
+
style.dim('Tools appear here after they are probed with ') +
|
|
145
|
+
style.accent('p') +
|
|
146
|
+
style.dim('.'));
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push(' ' + style.accent('r') + style.dim(' refresh'));
|
|
149
|
+
return frame(lines, width, height);
|
|
150
|
+
}
|
|
151
|
+
// ── Detail mode ───────────────────────────────────────────────────────────
|
|
152
|
+
if (state.mode === 'detail') {
|
|
153
|
+
const entry = state.servers[state.selected];
|
|
154
|
+
if (!entry)
|
|
155
|
+
return frame(lines, width, height);
|
|
156
|
+
const serverHealth = health?.servers.find((h) => h.name === entry.name);
|
|
157
|
+
const glyph = serverHealth ? healthGlyph(serverHealth.status, style) : style.dim('?');
|
|
158
|
+
const detail = [];
|
|
159
|
+
detail.push(' ' + glyph + ' ' + style.bold(style.accent(entry.name)));
|
|
160
|
+
detail.push(' ' + sep('', width - 2, style));
|
|
161
|
+
detail.push('');
|
|
162
|
+
// Instances
|
|
163
|
+
detail.push(' ' + style.dim('Instances'));
|
|
164
|
+
for (const inst of entry.instances) {
|
|
165
|
+
const transport = inst.transport === 'local' ? style.dim('local') : style.dim('remote');
|
|
166
|
+
const scope = style.dim('[' + inst.scope + ']');
|
|
167
|
+
const cmd = inst.transport === 'local' ? (inst.command ?? []).join(' ') : (inst.url ?? '');
|
|
168
|
+
const enabledNote = inst.enabled === false ? ' ' + style.orange('disabled') : '';
|
|
169
|
+
detail.push(' ' + style.bold(inst.tool) + ' ' + scope + ' ' + transport + enabledNote);
|
|
170
|
+
if (cmd) {
|
|
171
|
+
detail.push(' ' + style.dim(truncate(cmd, width - 6)));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
detail.push('');
|
|
175
|
+
// Health checks
|
|
176
|
+
if (serverHealth && serverHealth.checks.length > 0) {
|
|
177
|
+
detail.push(' ' + sep('Health checks', width - 2, style));
|
|
178
|
+
for (const check of serverHealth.checks) {
|
|
179
|
+
const g = checkGlyph(check.ok, check.level, style);
|
|
180
|
+
const name = padRight(check.name, 28);
|
|
181
|
+
const detail2 = check.detail ? style.dim(check.detail) : '';
|
|
182
|
+
detail.push(' ' + g + ' ' + name + detail2);
|
|
183
|
+
}
|
|
184
|
+
detail.push('');
|
|
185
|
+
}
|
|
186
|
+
else if (serverHealth && serverHealth.checks.length === 0) {
|
|
187
|
+
detail.push(' ' + style.dim('No issues detected.'));
|
|
188
|
+
detail.push('');
|
|
189
|
+
}
|
|
190
|
+
// Cached capabilities
|
|
191
|
+
const caps = state.caps.get(entry.name);
|
|
192
|
+
detail.push(' ' + sep('Tools', width - 2, style));
|
|
193
|
+
if (state.probing) {
|
|
194
|
+
detail.push(' ' + style.dim('Probing…'));
|
|
195
|
+
}
|
|
196
|
+
else if (caps && caps.tools.length > 0) {
|
|
197
|
+
for (const tool of caps.tools) {
|
|
198
|
+
const desc = tool.description ? style.dim(' — ' + tool.description) : '';
|
|
199
|
+
detail.push(' ' + style.bold(tool.name) + desc);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
detail.push(' ' +
|
|
204
|
+
style.dim('(probe to discover tools — press ') +
|
|
205
|
+
style.accent('p') +
|
|
206
|
+
style.dim(')'));
|
|
207
|
+
}
|
|
208
|
+
detail.push('');
|
|
209
|
+
// Footer
|
|
210
|
+
const footer = [
|
|
211
|
+
' ' + sep('', width - 2, style),
|
|
212
|
+
' ' + style.accent('p') + style.dim(' probe ') + style.accent('Esc') + style.dim(' back')
|
|
213
|
+
];
|
|
214
|
+
const padCount = Math.max(0, height - lines.length - detail.length - footer.length);
|
|
215
|
+
lines.push(...detail);
|
|
216
|
+
for (let i = 0; i < padCount; i++)
|
|
217
|
+
lines.push('');
|
|
218
|
+
lines.push(...footer);
|
|
219
|
+
return frame(lines, width, height);
|
|
220
|
+
}
|
|
221
|
+
// ── List mode ─────────────────────────────────────────────────────────────
|
|
222
|
+
state.selected = Math.min(state.selected, Math.max(0, state.servers.length - 1));
|
|
223
|
+
const limit = Math.max(0, height - lines.length - 1);
|
|
224
|
+
const start = Math.max(0, Math.min(state.selected - Math.floor(limit / 2), state.servers.length - limit));
|
|
225
|
+
for (let i = 0; i < limit && start + i < state.servers.length; i++) {
|
|
226
|
+
const entry = state.servers[start + i];
|
|
227
|
+
if (!entry)
|
|
228
|
+
continue;
|
|
229
|
+
const selected = start + i === state.selected;
|
|
230
|
+
const lead = selected ? rail(style) : noRail();
|
|
231
|
+
const serverHealth = health?.servers.find((h) => h.name === entry.name);
|
|
232
|
+
const glyph = serverHealth ? healthGlyph(serverHealth.status, style) : style.dim('·');
|
|
233
|
+
// Tools this server is configured in
|
|
234
|
+
const toolList = [...new Set(entry.instances.map((inst) => inst.tool + ':' + inst.scope))];
|
|
235
|
+
const toolStr = toolList.join(' ');
|
|
236
|
+
// Cached tool count
|
|
237
|
+
const caps = state.caps.get(entry.name);
|
|
238
|
+
const toolCount = caps && caps.tools.length > 0 ? style.dim(' · ' + caps.tools.length + ' tools') : '';
|
|
239
|
+
// Transport type
|
|
240
|
+
const transports = [...new Set(entry.instances.map((inst) => inst.transport))].join('/');
|
|
241
|
+
const probingNote = state.probing && selected ? ' ' + style.dim('probing…') : '';
|
|
242
|
+
const nameCell = selected ? style.bold(entry.name) : entry.name;
|
|
243
|
+
const left = ' ' + lead + glyph + ' ' + nameCell + probingNote;
|
|
244
|
+
const right = style.dim(transports) + toolCount;
|
|
245
|
+
const room = width - vlen(left) - vlen(right) - 3;
|
|
246
|
+
const mid = room > 2 ? ' ' + style.dim(truncate(toolStr, Math.max(0, room - 2))) : '';
|
|
247
|
+
const gap = ' '.repeat(Math.max(1, room - vlen(mid) - 1));
|
|
248
|
+
lines.push(left + mid + gap + right);
|
|
249
|
+
}
|
|
250
|
+
lines.push(' ' +
|
|
251
|
+
(state.servers.length > limit
|
|
252
|
+
? style.dim('servers ' +
|
|
253
|
+
(start + 1) +
|
|
254
|
+
'–' +
|
|
255
|
+
Math.min(start + limit, state.servers.length) +
|
|
256
|
+
' of ' +
|
|
257
|
+
state.servers.length)
|
|
258
|
+
: style.dim(state.servers.length + (state.servers.length === 1 ? ' server' : ' servers'))));
|
|
259
|
+
return frame(lines, width, height);
|
|
260
|
+
},
|
|
261
|
+
async handleKey(event, ctx) {
|
|
262
|
+
if (state.mode === 'detail') {
|
|
263
|
+
switch (event.key) {
|
|
264
|
+
case 'esc':
|
|
265
|
+
state.mode = 'list';
|
|
266
|
+
ctx.repaint();
|
|
267
|
+
return { kind: 'none' };
|
|
268
|
+
case 'p': {
|
|
269
|
+
const entry = state.servers[state.selected];
|
|
270
|
+
if (!entry)
|
|
271
|
+
return { kind: 'none' };
|
|
272
|
+
// Only probe if there's a local instance
|
|
273
|
+
const hasLocal = entry.instances.some((inst) => inst.transport === 'local');
|
|
274
|
+
if (!hasLocal) {
|
|
275
|
+
return { kind: 'status', message: 'No local instances to probe for ' + entry.name };
|
|
276
|
+
}
|
|
277
|
+
state.probing = true;
|
|
278
|
+
ctx.repaint();
|
|
279
|
+
try {
|
|
280
|
+
const env = buildStackEnv(ctx);
|
|
281
|
+
const dataDir = getDataDir(ctx);
|
|
282
|
+
await checkStack(entry.instances, { ...env, probe: true, dataDir });
|
|
283
|
+
// Refresh this server's health in our overall health
|
|
284
|
+
const refreshedHealth = await checkStack(state.servers.flatMap((e) => e.instances), { ...env, probe: false });
|
|
285
|
+
state.health = refreshedHealth;
|
|
286
|
+
// Reload caps
|
|
287
|
+
const capList = readCapabilityCache(dataDir);
|
|
288
|
+
for (const cap of capList) {
|
|
289
|
+
state.caps.set(cap.name, cap);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
state.probing = false;
|
|
294
|
+
ctx.repaint();
|
|
295
|
+
return {
|
|
296
|
+
kind: 'status',
|
|
297
|
+
message: 'Probe failed: ' + (err instanceof Error ? err.message : String(err)),
|
|
298
|
+
tone: 'error'
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
state.probing = false;
|
|
302
|
+
ctx.repaint();
|
|
303
|
+
return { kind: 'status', message: 'Probed ' + state.servers[state.selected]?.name };
|
|
304
|
+
}
|
|
305
|
+
default:
|
|
306
|
+
return { kind: 'none' };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// list mode
|
|
310
|
+
switch (event.key) {
|
|
311
|
+
case 'j':
|
|
312
|
+
case 'down':
|
|
313
|
+
state.selected = Math.min(state.servers.length - 1, state.selected + 1);
|
|
314
|
+
ctx.repaint();
|
|
315
|
+
return { kind: 'none' };
|
|
316
|
+
case 'k':
|
|
317
|
+
case 'up':
|
|
318
|
+
state.selected = Math.max(0, state.selected - 1);
|
|
319
|
+
ctx.repaint();
|
|
320
|
+
return { kind: 'none' };
|
|
321
|
+
case 'enter':
|
|
322
|
+
if (state.servers.length > 0) {
|
|
323
|
+
state.mode = 'detail';
|
|
324
|
+
ctx.repaint();
|
|
325
|
+
}
|
|
326
|
+
return { kind: 'none' };
|
|
327
|
+
case 'esc':
|
|
328
|
+
return { kind: 'none' };
|
|
329
|
+
case 'r':
|
|
330
|
+
state.loaded = false;
|
|
331
|
+
ctx.repaint();
|
|
332
|
+
loadStack(ctx).then(() => ctx.repaint());
|
|
333
|
+
return { kind: 'none' };
|
|
334
|
+
case 'p': {
|
|
335
|
+
const entry = state.servers[state.selected];
|
|
336
|
+
if (!entry)
|
|
337
|
+
return { kind: 'none' };
|
|
338
|
+
const hasLocal = entry.instances.some((inst) => inst.transport === 'local');
|
|
339
|
+
if (!hasLocal) {
|
|
340
|
+
return { kind: 'status', message: 'No local instances to probe for ' + entry.name };
|
|
341
|
+
}
|
|
342
|
+
state.probing = true;
|
|
343
|
+
ctx.repaint();
|
|
344
|
+
try {
|
|
345
|
+
const env = buildStackEnv(ctx);
|
|
346
|
+
const dataDir = getDataDir(ctx);
|
|
347
|
+
await checkStack(entry.instances, { ...env, probe: true, dataDir });
|
|
348
|
+
const refreshedHealth = await checkStack(state.servers.flatMap((e) => e.instances), { ...env, probe: false });
|
|
349
|
+
state.health = refreshedHealth;
|
|
350
|
+
const capList = readCapabilityCache(dataDir);
|
|
351
|
+
for (const cap of capList) {
|
|
352
|
+
state.caps.set(cap.name, cap);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
state.probing = false;
|
|
357
|
+
ctx.repaint();
|
|
358
|
+
return {
|
|
359
|
+
kind: 'status',
|
|
360
|
+
message: 'Probe failed: ' + (err instanceof Error ? err.message : String(err)),
|
|
361
|
+
tone: 'error'
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
state.probing = false;
|
|
365
|
+
ctx.repaint();
|
|
366
|
+
return { kind: 'status', message: 'Probed ' + (state.servers[state.selected]?.name ?? '') };
|
|
367
|
+
}
|
|
368
|
+
default:
|
|
369
|
+
return { kind: 'none' };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../src/cli/pages/stack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Styler } from '../../ui.js';
|
|
2
2
|
import type { CliIo } from '../flags.js';
|
|
3
|
-
export type PageId = 'home' | 'marketplace' | 'community' | 'news' | 'settings';
|
|
3
|
+
export type PageId = 'home' | 'marketplace' | 'stack' | 'community' | 'news' | 'settings';
|
|
4
4
|
export interface KeyEvent {
|
|
5
5
|
raw: string;
|
|
6
6
|
key: 'up' | 'down' | 'left' | 'right' | 'enter' | 'esc' | 'tab' | 'backspace' | 'space' | 'pageup' | 'pagedown' | 'home' | 'end' | string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/pages/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/pages/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1F,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EACC,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,KAAK,GACL,KAAK,GACL,WAAW,GACX,OAAO,GACP,QAAQ,GACR,UAAU,GACV,MAAM,GACN,KAAK,GACL,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE1E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChF"}
|
package/dist/cli/shell.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type Dispatch = {
|
|
|
5
5
|
kind: 'noop';
|
|
6
6
|
} | {
|
|
7
7
|
kind: 'meta';
|
|
8
|
-
sub: 'help' | 'quit' | 'exit' | 'clear' | 'transcript' | 'menu' | 'terminal' | 'verbose' | 'quiet' | 'medium' | 'last' | 'again' | 'dry-run' | 'env' | 'jobs' | 'fg' | 'bg' | 'abc';
|
|
8
|
+
sub: 'help' | 'quit' | 'exit' | 'clear' | 'transcript' | 'menu' | 'terminal' | 'verbose' | 'quiet' | 'medium' | 'last' | 'again' | 'dry-run' | 'env' | 'jobs' | 'fg' | 'bg' | 'abc' | 'sessions' | 'recall';
|
|
9
9
|
args?: string;
|
|
10
10
|
} | {
|
|
11
11
|
kind: 'tui';
|
package/dist/cli/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/cli/shell.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/cli/shell.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAWxC,OAAO,EAAiD,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAatF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnF,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EACC,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,YAAY,GACZ,MAAM,GACN,UAAU,GACV,SAAS,GACT,OAAO,GACP,QAAQ,GACR,MAAM,GACN,OAAO,GACP,SAAS,GACT,KAAK,GACL,MAAM,GACN,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,UAAU,GACV,QAAQ,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAoFlC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA0BvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,QAAQ,CA8E7F;AA0JD,wBAAsB,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAu0BxE"}
|
package/dist/cli/shell.js
CHANGED
|
@@ -8,7 +8,7 @@ import { runTui } from './tui.js';
|
|
|
8
8
|
import { AGORA_VERSION } from './app.js';
|
|
9
9
|
import { FREE_MODELS } from './commands/chat.js';
|
|
10
10
|
import { detectAgoraDataDir, loadAgoraState, resolveSavedItems } from '../state.js';
|
|
11
|
-
import { appendTranscript, loadSessionMeta, readTranscript, recentBashContext, writeSessionMeta } from '../transcript.js';
|
|
11
|
+
import { appendTranscript, listSessions, loadSessionMeta, readTranscript, recentBashContext, searchTranscripts, writeSessionMeta } from '../transcript.js';
|
|
12
12
|
import { gradientText, renderBanner, supportsTrueColor } from '../ui.js';
|
|
13
13
|
import { createChatRenderer } from './chat-renderer.js';
|
|
14
14
|
import { readLine } from './prompter.js';
|
|
@@ -144,6 +144,10 @@ export function classifyInput(line, isExecutable) {
|
|
|
144
144
|
return { kind: 'meta', sub: 'last' };
|
|
145
145
|
if (trimmed === '/again')
|
|
146
146
|
return { kind: 'meta', sub: 'again' };
|
|
147
|
+
if (trimmed === '/sessions')
|
|
148
|
+
return { kind: 'meta', sub: 'sessions' };
|
|
149
|
+
if (trimmed === '/recall' || trimmed.startsWith('/recall '))
|
|
150
|
+
return { kind: 'meta', sub: 'recall', args: trimmed.slice(8).trim() };
|
|
147
151
|
if (trimmed === '/jobs')
|
|
148
152
|
return { kind: 'meta', sub: 'jobs' };
|
|
149
153
|
if (trimmed === '/fg' || trimmed.startsWith('/fg '))
|
|
@@ -169,7 +173,10 @@ export function classifyInput(line, isExecutable) {
|
|
|
169
173
|
const letterDisp = LETTER_SHORTCUTS[trimmed];
|
|
170
174
|
if (letterDisp) {
|
|
171
175
|
if (letterDisp.kind === 'meta') {
|
|
172
|
-
return {
|
|
176
|
+
return {
|
|
177
|
+
kind: 'meta',
|
|
178
|
+
sub: letterDisp.sub
|
|
179
|
+
};
|
|
173
180
|
}
|
|
174
181
|
if (letterDisp.kind === 'tui') {
|
|
175
182
|
return { kind: 'tui', page: letterDisp.page };
|
|
@@ -429,6 +436,8 @@ export async function runShell(io, style) {
|
|
|
429
436
|
'/jobs',
|
|
430
437
|
'/fg',
|
|
431
438
|
'/bg',
|
|
439
|
+
'/sessions',
|
|
440
|
+
'/recall',
|
|
432
441
|
...agoraSlashCommands
|
|
433
442
|
];
|
|
434
443
|
// Deduplicate: /news, /home etc may appear in both lists
|
|
@@ -688,6 +697,45 @@ export async function runShell(io, style) {
|
|
|
688
697
|
}
|
|
689
698
|
continue;
|
|
690
699
|
}
|
|
700
|
+
if (dispatch.sub === 'sessions') {
|
|
701
|
+
const sessions = listSessions(dataDir);
|
|
702
|
+
if (sessions.length === 0) {
|
|
703
|
+
process.stdout.write(style.dim('No sessions recorded yet.') + '\n');
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
process.stdout.write(style.accent('Recent sessions') + '\n');
|
|
707
|
+
for (const s of sessions) {
|
|
708
|
+
const activity = s.lastActivity.slice(0, 19);
|
|
709
|
+
const turns = s.turnCount + (s.turnCount === 1 ? ' turn' : ' turns');
|
|
710
|
+
process.stdout.write(' ' +
|
|
711
|
+
style.dim(activity) +
|
|
712
|
+
' ' +
|
|
713
|
+
style.accent(shortCwd(s.cwd)) +
|
|
714
|
+
' ' +
|
|
715
|
+
style.dim(turns) +
|
|
716
|
+
'\n');
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
continue;
|
|
720
|
+
}
|
|
721
|
+
if (dispatch.sub === 'recall') {
|
|
722
|
+
const query = dispatch.args ?? '';
|
|
723
|
+
if (!query) {
|
|
724
|
+
process.stdout.write(style.dim('Usage: /recall <query>') + '\n');
|
|
725
|
+
continue;
|
|
726
|
+
}
|
|
727
|
+
const matches = searchTranscripts(dataDir, query);
|
|
728
|
+
if (matches.length === 0) {
|
|
729
|
+
process.stdout.write(style.dim('no matches') + '\n');
|
|
730
|
+
}
|
|
731
|
+
else {
|
|
732
|
+
for (const m of matches) {
|
|
733
|
+
process.stdout.write(style.dim(shortCwd(m.cwd) + ' ' + m.timestamp.slice(0, 19)) + '\n');
|
|
734
|
+
process.stdout.write(' ' + m.snippet + '\n');
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
691
739
|
if (dispatch.sub === 'bg') {
|
|
692
740
|
if (jobs.size === 0) {
|
|
693
741
|
process.stdout.write(style.dim('No background jobs. Append & to run a command in the background.') + '\n');
|
|
@@ -1099,6 +1147,8 @@ function printHelp(style) {
|
|
|
1099
1147
|
' /jobs list background jobs',
|
|
1100
1148
|
' /fg [N] bring job N (or last) to foreground',
|
|
1101
1149
|
' /bg [N] resume job N (or last) in background',
|
|
1150
|
+
' /sessions list all recorded shell sessions (cwd, turns, last activity)',
|
|
1151
|
+
' /recall <q> search across all session transcripts for <q>',
|
|
1102
1152
|
'',
|
|
1103
1153
|
style.dim('Verbosity:'),
|
|
1104
1154
|
' /verbose /medium /quiet',
|