@cleocode/cleo-os 2026.4.18 → 2026.4.20

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.
@@ -0,0 +1,423 @@
1
+ /**
2
+ * CleoOS agent monitor — agent activity TUI + Circle of Ten status.
3
+ *
4
+ * CANONICAL LOCATION: `packages/cleo-os/extensions/cleo-agent-monitor.ts`
5
+ *
6
+ * Installed to: $XDG_DATA_HOME/cleo/extensions/cleo-agent-monitor.js
7
+ * Loaded by: Pi via `--extension <path>` injected by CleoOS cli.ts
8
+ *
9
+ * T442 deliverables:
10
+ * - `/cleo:agents` command: shows current agent activity in a TUI panel
11
+ * - `before_agent_start` hook: tracks agent spawns with tier-aware prefixes
12
+ * - `/cleo:circle` command: renders Circle of Ten status from CLEO CLI data
13
+ *
14
+ * Requirements:
15
+ * - Pi coding agent runtime (`@mariozechner/pi-coding-agent`)
16
+ * - Optional: `cleo` CLI on PATH for `/cleo:circle` data
17
+ *
18
+ * Guardrails:
19
+ * - Best-effort: if `cleo` CLI is not available, `/cleo:circle` shows
20
+ * static fallback data. NEVER crash Pi.
21
+ * - NO top-level await; all work happens inside event handlers.
22
+ *
23
+ * @packageDocumentation
24
+ */
25
+ import { execFile } from "node:child_process";
26
+ import { promisify } from "node:util";
27
+ import { accentPrimary, accentSuccess, accentWarning, accentError, textSecondary, textTertiary, tierWorker, bold, DOT_FILLED, DOT_HOLLOW, ICON_FORGE, LINE_HORIZONTAL, } from "./tui-theme.js";
28
+ const execFileAsync = promisify(execFile);
29
+ /** Maximum number of agent activities to keep in the ring buffer. */
30
+ const MAX_ACTIVITIES = 5;
31
+ /** In-memory ring buffer of recent agent activities. */
32
+ const activities = [];
33
+ /** Widget key for the agent monitor panel. */
34
+ const WIDGET_KEY = "cleo-agent-monitor";
35
+ /**
36
+ * Cached CANT tool count from the bridge extension's status bar.
37
+ * Updated when agent spawns are tracked (best-effort cross-extension state).
38
+ */
39
+ let cachedCantTools = 0;
40
+ /**
41
+ * Cached CANT agent count from agent spawn tracking.
42
+ * Incremented as agents are seen in the current session.
43
+ */
44
+ let cachedCantAgents = 0;
45
+ /**
46
+ * Return the tier prefix for an agent role.
47
+ *
48
+ * Uses design system colors:
49
+ * - `[O]` orchestrator — accent-success (#22c55e)
50
+ * - `[L]` lead — accent-warning (#f59e0b)
51
+ * - `[W]` worker — tier-worker blue (#5fafff)
52
+ *
53
+ * @param role - The agent's tier role.
54
+ * @returns The styled tier prefix string.
55
+ */
56
+ export function tierPrefix(role) {
57
+ switch (role) {
58
+ case "orchestrator":
59
+ return accentSuccess("[O]");
60
+ case "lead":
61
+ return accentWarning("[L]");
62
+ default:
63
+ return tierWorker("[W]");
64
+ }
65
+ }
66
+ /**
67
+ * Format a single agent activity for TUI display.
68
+ *
69
+ * @param activity - The activity to format.
70
+ * @returns A formatted single-line string with ANSI styling.
71
+ */
72
+ export function formatActivity(activity) {
73
+ const time = activity.timestamp.slice(11, 19);
74
+ const prefix = tierPrefix(activity.role);
75
+ return `${prefix} ${textSecondary(`[${time}]`)} ${bold(activity.name)} ${textSecondary(activity.action)}`;
76
+ }
77
+ /**
78
+ * Record an agent activity and trim the buffer to MAX_ACTIVITIES.
79
+ *
80
+ * @param activity - The activity to record.
81
+ */
82
+ function recordActivity(activity) {
83
+ activities.push(activity);
84
+ while (activities.length > MAX_ACTIVITIES) {
85
+ activities.shift();
86
+ }
87
+ }
88
+ /**
89
+ * Render the agent activity widget.
90
+ *
91
+ * @param ctx - The Pi extension context.
92
+ */
93
+ function renderAgentWidget(ctx) {
94
+ if (!ctx.hasUI)
95
+ return;
96
+ if (activities.length === 0) {
97
+ ctx.ui.setWidget(WIDGET_KEY, [textSecondary(" No agent activity yet")], {
98
+ placement: "belowEditor",
99
+ });
100
+ return;
101
+ }
102
+ const header = accentPrimary(` ${ICON_FORGE} Agent Activity`);
103
+ const separator = textSecondary(" " + LINE_HORIZONTAL.repeat(30));
104
+ const lines = [header, separator, ...activities.map(formatActivity)];
105
+ ctx.ui.setWidget(WIDGET_KEY, lines, { placement: "belowEditor" });
106
+ }
107
+ /**
108
+ * Parse `cleo dash --json` output for Circle of Ten status data.
109
+ *
110
+ * Extracts task summary counts, blocked/high-priority stats, and top labels.
111
+ * Best-effort: returns empty object on any parse failure.
112
+ *
113
+ * @param output - Raw stdout from `cleo dash --json`.
114
+ * @returns Parsed dashboard data.
115
+ */
116
+ function parseDashOutput(output) {
117
+ try {
118
+ const parsed = JSON.parse(output);
119
+ const data = (parsed["data"] ?? parsed);
120
+ // Extract summary counts
121
+ const summary = data["summary"];
122
+ const activeTasks = typeof summary?.["active"] === "number" ? summary["active"] : undefined;
123
+ const pendingTasks = typeof summary?.["pending"] === "number" ? summary["pending"] : undefined;
124
+ const doneTasks = typeof summary?.["done"] === "number" ? summary["done"] : undefined;
125
+ const totalTasks = typeof summary?.["total"] === "number" ? summary["total"] : undefined;
126
+ // Extract blocked tasks count
127
+ const blocked = data["blockedTasks"];
128
+ const blockedCount = typeof blocked?.["count"] === "number" ? blocked["count"] : undefined;
129
+ // Extract high-priority count
130
+ const highPri = data["highPriority"];
131
+ const highPriCount = typeof highPri?.["count"] === "number" ? highPri["count"] : undefined;
132
+ // Extract top labels
133
+ const rawLabels = data["topLabels"];
134
+ let topLabels;
135
+ if (Array.isArray(rawLabels)) {
136
+ topLabels = rawLabels
137
+ .slice(0, 5)
138
+ .map((l) => {
139
+ const label = l["label"];
140
+ return typeof label === "string" ? label : "";
141
+ })
142
+ .filter((l) => l.length > 0);
143
+ }
144
+ return {
145
+ activeTasks,
146
+ pendingTasks,
147
+ doneTasks,
148
+ totalTasks,
149
+ blockedTasks: blockedCount,
150
+ highPriorityTasks: highPriCount,
151
+ topLabels,
152
+ };
153
+ }
154
+ catch {
155
+ return {};
156
+ }
157
+ }
158
+ /**
159
+ * Parse `cleo session status --json` output for session data.
160
+ *
161
+ * Extracts active session state, ID, name, and completion stats.
162
+ * Best-effort: returns empty object on any parse failure.
163
+ *
164
+ * @param output - Raw stdout from `cleo session status --json`.
165
+ * @returns Parsed session data.
166
+ */
167
+ function parseSessionOutput(output) {
168
+ try {
169
+ const parsed = JSON.parse(output);
170
+ const data = (parsed["data"] ?? parsed);
171
+ const sessionWrapper = data["session"];
172
+ if (!sessionWrapper)
173
+ return {};
174
+ const hasActive = sessionWrapper["hasActiveSession"] === true;
175
+ const session = sessionWrapper["session"];
176
+ if (!hasActive || !session) {
177
+ return { hasActiveSession: false };
178
+ }
179
+ const stats = session["stats"];
180
+ return {
181
+ hasActiveSession: true,
182
+ sessionId: typeof session["id"] === "string" ? session["id"] : undefined,
183
+ sessionName: typeof session["name"] === "string" ? session["name"] : undefined,
184
+ tasksCompleted: typeof stats?.["tasksCompleted"] === "number" ? stats["tasksCompleted"] : undefined,
185
+ focusChanges: typeof stats?.["focusChanges"] === "number" ? stats["focusChanges"] : undefined,
186
+ };
187
+ }
188
+ catch {
189
+ return {};
190
+ }
191
+ }
192
+ /**
193
+ * Build the Circle of Ten status display lines.
194
+ *
195
+ * Each Circle aspect is shown with a filled (active) or hollow (inactive)
196
+ * dot and a brief status summary. Data is wired from live CLI sources
197
+ * where available, with explicit "not wired" labels where the data
198
+ * source does not yet exist.
199
+ *
200
+ * Design system colors:
201
+ * - Filled dot: accent-success (#22c55e) for active zones
202
+ * - Warning dot: accent-warning (#f59e0b) for zones with alerts
203
+ * - Error dot: accent-error (#ef4444) for blocked/failed zones
204
+ * - Hollow dot: text-secondary (#94a3b8) for inactive/offline zones
205
+ *
206
+ * @param data - Combined Circle data from CLI sources and extension state.
207
+ * @returns Array of ANSI-styled lines for TUI display.
208
+ */
209
+ export function buildCircleOfTenStatus(data) {
210
+ const dot = accentSuccess(DOT_FILLED);
211
+ const warnDot = accentWarning(DOT_FILLED);
212
+ const errDot = accentError(DOT_FILLED);
213
+ const hollow = textSecondary(DOT_HOLLOW);
214
+ const { dash, session } = data;
215
+ // ── Smiths (tasks) — wired to cleo dash summary ──
216
+ const activeCount = dash.activeTasks ?? 0;
217
+ const pendingCount = dash.pendingTasks ?? 0;
218
+ const doneCount = dash.doneTasks ?? 0;
219
+ const smithsDot = activeCount > 0 ? dot : (pendingCount > 0 ? warnDot : hollow);
220
+ const smithsDetail = `${activeCount} active, ${pendingCount} pending, ${doneCount} done`;
221
+ // ── Weavers (pipeline) — not wired (no pipeline CLI endpoint) ──
222
+ const weaversDot = hollow;
223
+ const weaversDetail = textTertiary("not wired");
224
+ // ── Conductors (orchestrate) — wired to cleo session status ──
225
+ const hasSession = session.hasActiveSession === true;
226
+ const conductorsDot = hasSession ? dot : hollow;
227
+ const conductorsDetail = hasSession
228
+ ? `active: ${session.sessionName ?? session.sessionId ?? "unnamed"}`
229
+ : "no session";
230
+ // ── Artificers (tools) — wired to CANT bundle counts ──
231
+ const toolCount = data.cantTools ?? 0;
232
+ const agentCount = data.cantAgents ?? 0;
233
+ const artificersDot = toolCount > 0 || agentCount > 0 ? dot : hollow;
234
+ const artificersDetail = `${toolCount} tools, ${agentCount} agents`;
235
+ // ── Archivists (memory) — wired to cleo dash (done count as proxy) ──
236
+ // The dash endpoint does not directly expose observation counts,
237
+ // but done tasks indicate archived work history.
238
+ const archivistsDot = doneCount > 0 ? dot : hollow;
239
+ const archivistsDetail = `${doneCount} archived tasks`;
240
+ // ── Scribes (session) — wired to session stats ──
241
+ const scribesCompleted = session.tasksCompleted ?? 0;
242
+ const scribesDot = hasSession ? dot : hollow;
243
+ const scribesDetail = hasSession
244
+ ? `${scribesCompleted} completed this session`
245
+ : "no session";
246
+ // ── Wardens (check) — wired to blocked + high-priority counts ──
247
+ const blockedCount = dash.blockedTasks ?? 0;
248
+ const highPriCount = dash.highPriorityTasks ?? 0;
249
+ const wardensDot = blockedCount > 0 ? errDot : (highPriCount > 0 ? warnDot : dot);
250
+ const wardensDetail = `${blockedCount} blocked, ${highPriCount} high-pri`;
251
+ // ── Wayfinders (nexus) — not wired (Nexus deferred to Phase 3) ──
252
+ const wayfindersDot = hollow;
253
+ const wayfindersDetail = textTertiary("not wired");
254
+ // ── Catchers (sticky) — not wired (no sticky notes API) ──
255
+ const catchersDot = hollow;
256
+ const catchersDetail = textTertiary("not wired");
257
+ // ── Keepers (admin) — wired to overall health from dash totals ──
258
+ const totalCount = dash.totalTasks ?? 0;
259
+ const keepersDot = totalCount > 0 ? dot : hollow;
260
+ const keepersDetail = `${totalCount} total tasks tracked`;
261
+ // ── Labels line (bonus data from dash) ──
262
+ const labelsLine = dash.topLabels && dash.topLabels.length > 0
263
+ ? ` ${textSecondary("Labels:")} ${textTertiary(dash.topLabels.join(", "))}`
264
+ : null;
265
+ const lines = [
266
+ "",
267
+ bold(accentPrimary(" The Circle of Ten")),
268
+ textSecondary(" " + LINE_HORIZONTAL.repeat(36)),
269
+ ` ${bold("Smiths")} ${textSecondary("(tasks)")} ${smithsDot} ${smithsDetail}`,
270
+ ` ${bold("Weavers")} ${textSecondary("(pipeline)")} ${weaversDot} ${weaversDetail}`,
271
+ ` ${bold("Conductors")} ${textSecondary("(orch)")} ${conductorsDot} ${conductorsDetail}`,
272
+ ` ${bold("Artificers")} ${textSecondary("(tools)")} ${artificersDot} ${artificersDetail}`,
273
+ ` ${bold("Archivists")} ${textSecondary("(memory)")} ${archivistsDot} ${archivistsDetail}`,
274
+ ` ${bold("Scribes")} ${textSecondary("(session)")} ${scribesDot} ${scribesDetail}`,
275
+ ` ${bold("Wardens")} ${textSecondary("(check)")} ${wardensDot} ${wardensDetail}`,
276
+ ` ${bold("Wayfinders")} ${textSecondary("(nexus)")} ${wayfindersDot} ${wayfindersDetail}`,
277
+ ` ${bold("Catchers")} ${textSecondary("(sticky)")} ${catchersDot} ${catchersDetail}`,
278
+ ` ${bold("Keepers")} ${textSecondary("(admin)")} ${keepersDot} ${keepersDetail}`,
279
+ ];
280
+ if (labelsLine) {
281
+ lines.push(textSecondary(" " + LINE_HORIZONTAL.repeat(36)));
282
+ lines.push(labelsLine);
283
+ }
284
+ lines.push("");
285
+ return lines;
286
+ }
287
+ // ============================================================================
288
+ // Pi extension factory
289
+ // ============================================================================
290
+ /**
291
+ * Pi extension factory for the CleoOS agent monitor.
292
+ *
293
+ * Registers agent activity tracking, the `/cleo:agents` command, and the
294
+ * `/cleo:circle` Circle of Ten status command.
295
+ *
296
+ * @param pi - The Pi extension API instance.
297
+ */
298
+ export default function (pi) {
299
+ // -------------------------------------------------------------------------
300
+ // session_start: initialize widget
301
+ // -------------------------------------------------------------------------
302
+ pi.on("session_start", async (_event, ctx) => {
303
+ activities.length = 0;
304
+ cachedCantTools = 0;
305
+ cachedCantAgents = 0;
306
+ renderAgentWidget(ctx);
307
+ });
308
+ // -------------------------------------------------------------------------
309
+ // before_agent_start: track agent spawn
310
+ // -------------------------------------------------------------------------
311
+ pi.on("before_agent_start", async (event, ctx) => {
312
+ const agentName = event.agentName ?? event.agentDef?.name ?? "unknown";
313
+ const roleStr = event.agentDef?.role ?? "worker";
314
+ // Normalise the role to a valid AgentTierRole
315
+ let role;
316
+ switch (roleStr) {
317
+ case "orchestrator":
318
+ role = "orchestrator";
319
+ break;
320
+ case "lead":
321
+ role = "lead";
322
+ break;
323
+ default:
324
+ role = "worker";
325
+ break;
326
+ }
327
+ recordActivity({
328
+ timestamp: new Date().toISOString(),
329
+ name: agentName,
330
+ role,
331
+ action: "spawned",
332
+ });
333
+ // Track unique agents seen for Circle of Ten Artificers zone
334
+ cachedCantAgents = activities.length;
335
+ renderAgentWidget(ctx);
336
+ // Return empty object (do not modify system prompt)
337
+ return {};
338
+ });
339
+ // -------------------------------------------------------------------------
340
+ // Command: /cleo:agents — show agent activity
341
+ // -------------------------------------------------------------------------
342
+ pi.registerCommand("cleo:agents", {
343
+ description: "Show current agent activity and recent spawn history",
344
+ handler: async (_args, ctx) => {
345
+ const lines = [
346
+ bold(accentPrimary(`${ICON_FORGE} CleoOS Agent Monitor`)),
347
+ textSecondary(" " + LINE_HORIZONTAL.repeat(28)),
348
+ "",
349
+ ` Total tracked activities: ${activities.length}`,
350
+ "",
351
+ ];
352
+ if (activities.length === 0) {
353
+ lines.push(textSecondary(" No agent activity recorded this session."));
354
+ }
355
+ else {
356
+ lines.push(bold(" Recent Agent Activity:"));
357
+ for (const activity of activities) {
358
+ lines.push(" " + formatActivity(activity));
359
+ }
360
+ }
361
+ lines.push("");
362
+ lines.push(textSecondary(` Legend: ${accentSuccess("[O]")} orchestrator ${accentWarning("[L]")} lead ${tierWorker("[W]")} worker`));
363
+ pi.sendMessage({
364
+ customType: "cleo-agent-monitor",
365
+ content: lines.join("\n"),
366
+ display: true,
367
+ }, { triggerTurn: false });
368
+ if (ctx.hasUI) {
369
+ ctx.ui.notify(`Agent monitor: ${activities.length} activities`, "info");
370
+ }
371
+ },
372
+ });
373
+ // -------------------------------------------------------------------------
374
+ // Command: /cleo:circle — Circle of Ten status
375
+ // -------------------------------------------------------------------------
376
+ pi.registerCommand("cleo:circle", {
377
+ description: "Show Circle of Ten operational status from CLEO CLI",
378
+ handler: async (_args, ctx) => {
379
+ let dashData = {};
380
+ let sessionData = {};
381
+ // Best-effort: fetch data from both `cleo dash` and `cleo session status`
382
+ // in parallel. Either or both may fail if the CLI is not available.
383
+ const [dashResult, sessionResult] = await Promise.allSettled([
384
+ execFileAsync("cleo", ["dash", "--json"], { timeout: 5000, cwd: ctx.cwd }),
385
+ execFileAsync("cleo", ["session", "status", "--json"], { timeout: 5000, cwd: ctx.cwd }),
386
+ ]);
387
+ if (dashResult.status === "fulfilled") {
388
+ dashData = parseDashOutput(dashResult.value.stdout);
389
+ }
390
+ if (sessionResult.status === "fulfilled") {
391
+ sessionData = parseSessionOutput(sessionResult.value.stdout);
392
+ }
393
+ // Build combined Circle data, including CANT bundle state if available.
394
+ // The CANT bridge stores counts in its own module scope — we read them
395
+ // from the status bar entries as a cross-extension communication channel.
396
+ // For now, we pass defaults and let the bridge contribute via status bar.
397
+ const circleData = {
398
+ dash: dashData,
399
+ session: sessionData,
400
+ cantTools: cachedCantTools,
401
+ cantAgents: cachedCantAgents,
402
+ };
403
+ const lines = buildCircleOfTenStatus(circleData);
404
+ pi.sendMessage({
405
+ customType: "cleo-circle-of-ten",
406
+ content: lines.join("\n"),
407
+ display: true,
408
+ }, { triggerTurn: false });
409
+ if (ctx.hasUI) {
410
+ ctx.ui.notify("Circle of Ten status", "info");
411
+ }
412
+ },
413
+ });
414
+ // -------------------------------------------------------------------------
415
+ // session_shutdown: clear state
416
+ // -------------------------------------------------------------------------
417
+ pi.on("session_shutdown", async () => {
418
+ activities.length = 0;
419
+ cachedCantTools = 0;
420
+ cachedCantAgents = 0;
421
+ });
422
+ }
423
+ //# sourceMappingURL=cleo-agent-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleo-agent-monitor.js","sourceRoot":"","sources":["cleo-agent-monitor.ts"],"names":[],"mappings":"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"}