@alevental/cccp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/cccp-pipeline/SKILL.md +562 -0
- package/.claude/skills/cccp-run/SKILL.md +111 -0
- package/README.md +280 -0
- package/dist/activity-bus.d.ts +9 -0
- package/dist/activity-bus.js +10 -0
- package/dist/activity-bus.js.map +1 -0
- package/dist/agent-resolver.d.ts +29 -0
- package/dist/agent-resolver.js +122 -0
- package/dist/agent-resolver.js.map +1 -0
- package/dist/agent.d.ts +39 -0
- package/dist/agent.js +117 -0
- package/dist/agent.js.map +1 -0
- package/dist/autoresearch.d.ts +11 -0
- package/dist/autoresearch.js +295 -0
- package/dist/autoresearch.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +157 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +126 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +24 -0
- package/dist/context.js +82 -0
- package/dist/context.js.map +1 -0
- package/dist/contract.d.ts +26 -0
- package/dist/contract.js +65 -0
- package/dist/contract.js.map +1 -0
- package/dist/db.d.ts +70 -0
- package/dist/db.js +358 -0
- package/dist/db.js.map +1 -0
- package/dist/dispatcher.d.ts +9 -0
- package/dist/dispatcher.js +7 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator.d.ts +23 -0
- package/dist/evaluator.js +49 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/gate/auto-approve.d.ts +9 -0
- package/dist/gate/auto-approve.js +11 -0
- package/dist/gate/auto-approve.js.map +1 -0
- package/dist/gate/gate-strategy.d.ts +22 -0
- package/dist/gate/gate-strategy.js +2 -0
- package/dist/gate/gate-strategy.js.map +1 -0
- package/dist/gate/gate-watcher.d.ts +15 -0
- package/dist/gate/gate-watcher.js +64 -0
- package/dist/gate/gate-watcher.js.map +1 -0
- package/dist/logger.d.ts +24 -0
- package/dist/logger.js +22 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/gate-notifier.d.ts +26 -0
- package/dist/mcp/gate-notifier.js +161 -0
- package/dist/mcp/gate-notifier.js.map +1 -0
- package/dist/mcp/mcp-config.d.ts +25 -0
- package/dist/mcp/mcp-config.js +80 -0
- package/dist/mcp/mcp-config.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +1 -0
- package/dist/mcp/mcp-server.js +262 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/pge.d.ts +12 -0
- package/dist/pge.js +361 -0
- package/dist/pge.js.map +1 -0
- package/dist/pipeline.d.ts +6 -0
- package/dist/pipeline.js +120 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/prompt.d.ts +67 -0
- package/dist/prompt.js +121 -0
- package/dist/prompt.js.map +1 -0
- package/dist/runner.d.ts +11 -0
- package/dist/runner.js +494 -0
- package/dist/runner.js.map +1 -0
- package/dist/scaffold/index.d.ts +14 -0
- package/dist/scaffold/index.js +260 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates.d.ts +47 -0
- package/dist/scaffold/templates.js +2177 -0
- package/dist/scaffold/templates.js.map +1 -0
- package/dist/stage-helpers.d.ts +7 -0
- package/dist/stage-helpers.js +27 -0
- package/dist/stage-helpers.js.map +1 -0
- package/dist/state.d.ts +43 -0
- package/dist/state.js +177 -0
- package/dist/state.js.map +1 -0
- package/dist/stream/stream-tail.d.ts +17 -0
- package/dist/stream/stream-tail.js +95 -0
- package/dist/stream/stream-tail.js.map +1 -0
- package/dist/stream/stream.d.ts +142 -0
- package/dist/stream/stream.js +251 -0
- package/dist/stream/stream.js.map +1 -0
- package/dist/temp-tracker.d.ts +6 -0
- package/dist/temp-tracker.js +24 -0
- package/dist/temp-tracker.js.map +1 -0
- package/dist/tui/cmux.d.ts +22 -0
- package/dist/tui/cmux.js +82 -0
- package/dist/tui/cmux.js.map +1 -0
- package/dist/tui/components.d.ts +21 -0
- package/dist/tui/components.js +108 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/dashboard.d.ts +6 -0
- package/dist/tui/dashboard.js +125 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/detail-log.d.ts +10 -0
- package/dist/tui/detail-log.js +171 -0
- package/dist/tui/detail-log.js.map +1 -0
- package/dist/types.d.ts +273 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/examples/agents/diff-evaluator.md +57 -0
- package/examples/agents/prompt-tuner.md +30 -0
- package/examples/agents/summarizer.md +14 -0
- package/examples/autoresearch-artifacts/expected-output.md +17 -0
- package/examples/autoresearch-artifacts/prompt.md +35 -0
- package/examples/autoresearch-artifacts/source-material.md +28 -0
- package/examples/business-case.yaml +41 -0
- package/examples/cccp.yaml +48 -0
- package/examples/content-calendar.yaml +59 -0
- package/examples/customer-feedback-loop.yaml +44 -0
- package/examples/design-sprint.yaml +54 -0
- package/examples/feature-development.yaml +96 -0
- package/examples/growth-experiment.yaml +49 -0
- package/examples/incident-runbook.yaml +43 -0
- package/examples/product-launch.yaml +85 -0
- package/examples/prompt-tuning.yaml +25 -0
- package/examples/quarterly-planning.yaml +51 -0
- package/examples/sprint-cycle.yaml +67 -0
- package/package.json +47 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { createWriteStream } from "node:fs";
|
|
2
|
+
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { EventEmitter } from "node:events";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Stream event emitter
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const MAX_TOOL_HISTORY = 10;
|
|
9
|
+
export class StreamParser extends EventEmitter {
|
|
10
|
+
logStream = null;
|
|
11
|
+
activity;
|
|
12
|
+
buffer = "";
|
|
13
|
+
/** Maps tool_use IDs to tool names (for matching tool_result events). */
|
|
14
|
+
toolIdToName = new Map();
|
|
15
|
+
/** Tracks seen tool_use IDs to avoid double-counting from streaming. */
|
|
16
|
+
seenToolIds = new Set();
|
|
17
|
+
constructor(agentName) {
|
|
18
|
+
super();
|
|
19
|
+
this.activity = {
|
|
20
|
+
agent: agentName,
|
|
21
|
+
model: "",
|
|
22
|
+
lastText: "",
|
|
23
|
+
lastThinking: "",
|
|
24
|
+
activeTools: [],
|
|
25
|
+
toolHistory: [],
|
|
26
|
+
inputTokens: 0,
|
|
27
|
+
outputTokens: 0,
|
|
28
|
+
toolCallCount: 0,
|
|
29
|
+
totalCostUsd: 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Start logging raw events to a JSONL file.
|
|
34
|
+
*/
|
|
35
|
+
async startLog(logPath) {
|
|
36
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
37
|
+
this.logStream = createWriteStream(logPath, { flags: "a" });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Feed a chunk of stdout data. Handles line buffering.
|
|
41
|
+
*/
|
|
42
|
+
feed(chunk) {
|
|
43
|
+
this.buffer += chunk;
|
|
44
|
+
const lines = this.buffer.split("\n");
|
|
45
|
+
// Keep the last incomplete line in the buffer.
|
|
46
|
+
this.buffer = lines.pop() ?? "";
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
const trimmed = line.trim();
|
|
49
|
+
if (!trimmed)
|
|
50
|
+
continue;
|
|
51
|
+
this.parseLine(trimmed);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Flush any remaining buffer content.
|
|
56
|
+
*/
|
|
57
|
+
flush() {
|
|
58
|
+
if (this.buffer.trim()) {
|
|
59
|
+
this.parseLine(this.buffer.trim());
|
|
60
|
+
this.buffer = "";
|
|
61
|
+
}
|
|
62
|
+
this.logStream?.end();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get current activity snapshot.
|
|
66
|
+
*/
|
|
67
|
+
getActivity() {
|
|
68
|
+
return {
|
|
69
|
+
...this.activity,
|
|
70
|
+
activeTools: [...this.activity.activeTools],
|
|
71
|
+
toolHistory: [...this.activity.toolHistory],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
parseLine(line) {
|
|
75
|
+
let event;
|
|
76
|
+
try {
|
|
77
|
+
const raw = JSON.parse(line);
|
|
78
|
+
if (typeof raw !== "object" || raw === null || typeof raw.type !== "string") {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
event = raw;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Log raw event.
|
|
87
|
+
this.logStream?.write(line + "\n");
|
|
88
|
+
this.processEvent(event);
|
|
89
|
+
this.emit("event", event);
|
|
90
|
+
this.emit("activity", this.getActivity());
|
|
91
|
+
}
|
|
92
|
+
processEvent(event) {
|
|
93
|
+
const type = event.type;
|
|
94
|
+
// --- system events ---
|
|
95
|
+
if (type === "system") {
|
|
96
|
+
const sysEvent = event;
|
|
97
|
+
if (sysEvent.subtype === "init") {
|
|
98
|
+
const initEvent = sysEvent;
|
|
99
|
+
this.activity.model = initEvent.model ?? "";
|
|
100
|
+
}
|
|
101
|
+
else if (sysEvent.subtype === "task_progress") {
|
|
102
|
+
// Sub-agent activity
|
|
103
|
+
const progressEvent = sysEvent;
|
|
104
|
+
const toolName = progressEvent.last_tool_name;
|
|
105
|
+
const desc = progressEvent.description;
|
|
106
|
+
if (toolName) {
|
|
107
|
+
this.activity.lastText = `[sub-agent] ${toolName}: ${desc ?? ""}`.slice(-200);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// --- assistant events (nested message.content[] format) ---
|
|
113
|
+
if (type === "assistant") {
|
|
114
|
+
const assistantEvent = event;
|
|
115
|
+
const message = assistantEvent.message;
|
|
116
|
+
if (message?.content && Array.isArray(message.content)) {
|
|
117
|
+
this.processContentBlocks(message.content);
|
|
118
|
+
// Per-message usage (partial, during streaming)
|
|
119
|
+
if (message.usage) {
|
|
120
|
+
this.activity.inputTokens = message.usage.input_tokens ?? this.activity.inputTokens;
|
|
121
|
+
this.activity.outputTokens = message.usage.output_tokens ?? this.activity.outputTokens;
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Legacy flat format (for backward compat with tests)
|
|
126
|
+
if (assistantEvent.subtype === "text" && typeof assistantEvent.text === "string") {
|
|
127
|
+
this.activity.lastText = assistantEvent.text.slice(-200);
|
|
128
|
+
}
|
|
129
|
+
else if (assistantEvent.subtype === "tool_use" && assistantEvent.name) {
|
|
130
|
+
const name = assistantEvent.name;
|
|
131
|
+
const id = assistantEvent.id;
|
|
132
|
+
if (id && !this.seenToolIds.has(id)) {
|
|
133
|
+
this.seenToolIds.add(id);
|
|
134
|
+
this.toolIdToName.set(id, name);
|
|
135
|
+
this.activity.activeTools.push(name);
|
|
136
|
+
this.activity.toolCallCount++;
|
|
137
|
+
this.addToolHistory(name, id, summarizeToolInput(assistantEvent.input));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// --- user events (tool_result in message.content[]) ---
|
|
143
|
+
if (type === "user") {
|
|
144
|
+
const userEvent = event;
|
|
145
|
+
const message = userEvent.message;
|
|
146
|
+
if (message?.content && Array.isArray(message.content)) {
|
|
147
|
+
for (const block of message.content) {
|
|
148
|
+
if (block.type === "tool_result" && block.tool_use_id) {
|
|
149
|
+
const name = this.toolIdToName.get(block.tool_use_id);
|
|
150
|
+
if (name) {
|
|
151
|
+
this.activity.activeTools = this.activity.activeTools.filter((t) => t !== name);
|
|
152
|
+
this.markToolDone(block.tool_use_id);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Legacy flat format
|
|
158
|
+
if (userEvent.subtype === "tool_result") {
|
|
159
|
+
const name = userEvent.name;
|
|
160
|
+
if (name) {
|
|
161
|
+
this.activity.activeTools = this.activity.activeTools.filter((t) => t !== name);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// --- Legacy flat tool_result (backward compat) ---
|
|
167
|
+
if (type === "tool_result") {
|
|
168
|
+
const toolResultEvent = event;
|
|
169
|
+
const name = toolResultEvent.name;
|
|
170
|
+
if (name) {
|
|
171
|
+
this.activity.activeTools = this.activity.activeTools.filter((t) => t !== name);
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// --- result event (final stats) ---
|
|
176
|
+
if (type === "result") {
|
|
177
|
+
const resultEvent = event;
|
|
178
|
+
const usage = resultEvent.usage;
|
|
179
|
+
if (usage) {
|
|
180
|
+
if (usage.input_tokens != null)
|
|
181
|
+
this.activity.inputTokens = usage.input_tokens;
|
|
182
|
+
if (usage.output_tokens != null)
|
|
183
|
+
this.activity.outputTokens = usage.output_tokens;
|
|
184
|
+
}
|
|
185
|
+
if (resultEvent.total_cost_usd != null) {
|
|
186
|
+
this.activity.totalCostUsd = resultEvent.total_cost_usd;
|
|
187
|
+
}
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
processContentBlocks(blocks) {
|
|
192
|
+
for (const block of blocks) {
|
|
193
|
+
if (block.type === "text") {
|
|
194
|
+
this.activity.lastText = block.text.slice(-200);
|
|
195
|
+
}
|
|
196
|
+
else if (block.type === "thinking") {
|
|
197
|
+
this.activity.lastThinking = block.thinking.slice(-200);
|
|
198
|
+
}
|
|
199
|
+
else if (block.type === "tool_use") {
|
|
200
|
+
if (!this.seenToolIds.has(block.id)) {
|
|
201
|
+
this.seenToolIds.add(block.id);
|
|
202
|
+
this.toolIdToName.set(block.id, block.name);
|
|
203
|
+
this.activity.activeTools.push(block.name);
|
|
204
|
+
this.activity.toolCallCount++;
|
|
205
|
+
this.addToolHistory(block.name, block.id, summarizeToolInput(block.input));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
addToolHistory(name, id, summary) {
|
|
211
|
+
this.activity.toolHistory.push({ name, id, status: "active", summary });
|
|
212
|
+
if (this.activity.toolHistory.length > MAX_TOOL_HISTORY) {
|
|
213
|
+
this.activity.toolHistory.shift();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
markToolDone(id) {
|
|
217
|
+
const entry = this.activity.toolHistory.find((t) => t.id === id);
|
|
218
|
+
if (entry)
|
|
219
|
+
entry.status = "done";
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
// Helpers
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
/** Extract a short summary from tool input (file path, pattern, etc.). */
|
|
226
|
+
function summarizeToolInput(input) {
|
|
227
|
+
if (!input || typeof input !== "object")
|
|
228
|
+
return undefined;
|
|
229
|
+
const obj = input;
|
|
230
|
+
// Common patterns: file_path, path, pattern, command, query
|
|
231
|
+
if (typeof obj.file_path === "string")
|
|
232
|
+
return obj.file_path;
|
|
233
|
+
if (typeof obj.path === "string")
|
|
234
|
+
return obj.path;
|
|
235
|
+
if (typeof obj.pattern === "string")
|
|
236
|
+
return obj.pattern;
|
|
237
|
+
if (typeof obj.command === "string") {
|
|
238
|
+
const cmd = obj.command;
|
|
239
|
+
return cmd.length > 60 ? cmd.slice(0, 57) + "..." : cmd;
|
|
240
|
+
}
|
|
241
|
+
if (typeof obj.query === "string") {
|
|
242
|
+
const q = obj.query;
|
|
243
|
+
return q.length > 60 ? q.slice(0, 57) + "..." : q;
|
|
244
|
+
}
|
|
245
|
+
if (typeof obj.prompt === "string") {
|
|
246
|
+
const p = obj.prompt;
|
|
247
|
+
return p.length > 60 ? p.slice(0, 57) + "..." : p;
|
|
248
|
+
}
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { unlink, unlinkSync } from "node:fs";
|
|
2
|
+
export class TempFileTracker {
|
|
3
|
+
paths = [];
|
|
4
|
+
track(path) {
|
|
5
|
+
this.paths.push(path);
|
|
6
|
+
return path;
|
|
7
|
+
}
|
|
8
|
+
async cleanup() {
|
|
9
|
+
await Promise.all(this.paths.map((p) => new Promise((resolve) => {
|
|
10
|
+
unlink(p, () => resolve()); // ignore errors
|
|
11
|
+
})));
|
|
12
|
+
this.paths = [];
|
|
13
|
+
}
|
|
14
|
+
cleanupSync() {
|
|
15
|
+
for (const p of this.paths) {
|
|
16
|
+
try {
|
|
17
|
+
unlinkSync(p);
|
|
18
|
+
}
|
|
19
|
+
catch { /* ignore */ }
|
|
20
|
+
}
|
|
21
|
+
this.paths = [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=temp-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-tracker.js","sourceRoot":"","sources":["../src/temp-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,OAAO,eAAe;IAClB,KAAK,GAAa,EAAE,CAAC;IAE7B,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB;QAC9C,CAAC,CAAC,CACH,CACF,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,WAAW;QACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC;gBAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Returns true if running inside a cmux workspace. */
|
|
2
|
+
export declare function isCmuxAvailable(): boolean;
|
|
3
|
+
/** Set the sidebar status pill. */
|
|
4
|
+
export declare function setStatus(label: string): Promise<void>;
|
|
5
|
+
/** Set the progress bar (0.0–1.0). */
|
|
6
|
+
export declare function setProgress(fraction: number): Promise<void>;
|
|
7
|
+
/** Write a structured log entry. */
|
|
8
|
+
export declare function log(message: string, level?: "info" | "success" | "warning" | "error"): Promise<void>;
|
|
9
|
+
/** Send a desktop notification. */
|
|
10
|
+
export declare function notify(title: string, body?: string): Promise<void>;
|
|
11
|
+
/** Open a new split pane and return the surface ref (e.g., "surface:10"). */
|
|
12
|
+
export declare function newSplit(direction?: "right" | "below"): Promise<string>;
|
|
13
|
+
/** Send text to a surface (does NOT press Enter). */
|
|
14
|
+
export declare function sendText(surfaceRef: string, text: string): Promise<void>;
|
|
15
|
+
/** Send a key press to a surface (e.g., "Enter", "Tab"). */
|
|
16
|
+
export declare function sendKey(surfaceRef: string, key: string): Promise<void>;
|
|
17
|
+
/** Update cmux with current pipeline stage progress. */
|
|
18
|
+
export declare function updatePipelineStatus(stageName: string, stageIndex: number, totalStages: number): Promise<void>;
|
|
19
|
+
/** Notify that a human gate requires attention. */
|
|
20
|
+
export declare function notifyGateRequired(stageName: string): Promise<void>;
|
|
21
|
+
/** Notify that the pipeline has completed. */
|
|
22
|
+
export declare function notifyPipelineComplete(pipelineName: string, status: string): Promise<void>;
|
package/dist/tui/cmux.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const exec = promisify(execFile);
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// cmux detection
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/** Returns true if running inside a cmux workspace. */
|
|
8
|
+
export function isCmuxAvailable() {
|
|
9
|
+
return !!process.env.CMUX_WORKSPACE_ID;
|
|
10
|
+
}
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// cmux commands
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
async function cmux(...args) {
|
|
15
|
+
if (!isCmuxAvailable())
|
|
16
|
+
return "";
|
|
17
|
+
try {
|
|
18
|
+
const { stdout } = await exec("cmux", args);
|
|
19
|
+
return stdout.trim();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// cmux command failed — not critical, just skip.
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Set the sidebar status pill. */
|
|
27
|
+
export async function setStatus(label) {
|
|
28
|
+
await cmux("set-status", "cccp", label);
|
|
29
|
+
}
|
|
30
|
+
/** Set the progress bar (0.0–1.0). */
|
|
31
|
+
export async function setProgress(fraction) {
|
|
32
|
+
await cmux("set-progress", String(Math.max(0, Math.min(1, fraction))));
|
|
33
|
+
}
|
|
34
|
+
/** Write a structured log entry. */
|
|
35
|
+
export async function log(message, level = "info") {
|
|
36
|
+
await cmux("log", "--level", level, message);
|
|
37
|
+
}
|
|
38
|
+
/** Send a desktop notification. */
|
|
39
|
+
export async function notify(title, body) {
|
|
40
|
+
const args = ["notify", "--title", title];
|
|
41
|
+
if (body)
|
|
42
|
+
args.push("--body", body);
|
|
43
|
+
await cmux(...args);
|
|
44
|
+
}
|
|
45
|
+
/** Open a new split pane and return the surface ref (e.g., "surface:10"). */
|
|
46
|
+
export async function newSplit(direction = "right") {
|
|
47
|
+
const output = await cmux("new-split", direction);
|
|
48
|
+
// Parse "OK surface:N workspace:M" → "surface:N"
|
|
49
|
+
const match = output.match(/surface:\d+/);
|
|
50
|
+
return match?.[0] ?? "";
|
|
51
|
+
}
|
|
52
|
+
/** Send text to a surface (does NOT press Enter). */
|
|
53
|
+
export async function sendText(surfaceRef, text) {
|
|
54
|
+
await cmux("send", "--surface", surfaceRef, text);
|
|
55
|
+
}
|
|
56
|
+
/** Send a key press to a surface (e.g., "Enter", "Tab"). */
|
|
57
|
+
export async function sendKey(surfaceRef, key) {
|
|
58
|
+
await cmux("send-key", "--surface", surfaceRef, key);
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// High-level helpers for pipeline events
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/** Update cmux with current pipeline stage progress. */
|
|
64
|
+
export async function updatePipelineStatus(stageName, stageIndex, totalStages) {
|
|
65
|
+
if (!isCmuxAvailable())
|
|
66
|
+
return;
|
|
67
|
+
await setStatus(`${stageName} (${stageIndex + 1}/${totalStages})`);
|
|
68
|
+
await setProgress((stageIndex + 1) / totalStages);
|
|
69
|
+
}
|
|
70
|
+
/** Notify that a human gate requires attention. */
|
|
71
|
+
export async function notifyGateRequired(stageName) {
|
|
72
|
+
if (!isCmuxAvailable())
|
|
73
|
+
return;
|
|
74
|
+
await notify("Gate Required", `Pipeline waiting for approval: ${stageName}`);
|
|
75
|
+
}
|
|
76
|
+
/** Notify that the pipeline has completed. */
|
|
77
|
+
export async function notifyPipelineComplete(pipelineName, status) {
|
|
78
|
+
if (!isCmuxAvailable())
|
|
79
|
+
return;
|
|
80
|
+
await notify("Pipeline Complete", `${pipelineName}: ${status}`);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=cmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmux.js","sourceRoot":"","sources":["../../src/tui/cmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PipelineState, StateEvent } from "../types.js";
|
|
2
|
+
import type { AgentActivity } from "../stream/stream.js";
|
|
3
|
+
interface StageListProps {
|
|
4
|
+
state: PipelineState;
|
|
5
|
+
}
|
|
6
|
+
export declare function StageList({ state }: StageListProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
interface AgentActivityPanelProps {
|
|
8
|
+
activity: AgentActivity | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function AgentActivityPanel({ activity }: AgentActivityPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
interface EventLogProps {
|
|
12
|
+
events: StateEvent[];
|
|
13
|
+
}
|
|
14
|
+
export declare function EventLog({ events }: EventLogProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
interface HeaderProps {
|
|
16
|
+
pipelineName: string;
|
|
17
|
+
project: string;
|
|
18
|
+
elapsed: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function Header({ pipelineName, project, elapsed }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import Spinner from "ink-spinner";
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Stage list (left pane)
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
function stageIcon(status) {
|
|
8
|
+
switch (status) {
|
|
9
|
+
case "passed":
|
|
10
|
+
return "\u2713";
|
|
11
|
+
case "failed":
|
|
12
|
+
case "error":
|
|
13
|
+
return "\u2717";
|
|
14
|
+
case "skipped":
|
|
15
|
+
return "\u23ED";
|
|
16
|
+
case "in_progress":
|
|
17
|
+
return "\u25B6";
|
|
18
|
+
case "pending":
|
|
19
|
+
default:
|
|
20
|
+
return "\u25CB";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function stageColor(status) {
|
|
24
|
+
switch (status) {
|
|
25
|
+
case "passed":
|
|
26
|
+
return "green";
|
|
27
|
+
case "failed":
|
|
28
|
+
case "error":
|
|
29
|
+
return "red";
|
|
30
|
+
case "skipped":
|
|
31
|
+
return "gray";
|
|
32
|
+
case "in_progress":
|
|
33
|
+
return "yellow";
|
|
34
|
+
default:
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function StageList({ state }) {
|
|
39
|
+
return (_jsxs(Box, { flexDirection: "column", minWidth: 24, children: [_jsx(Text, { bold: true, underline: true, children: "Stages" }), state.stageOrder.map((name) => {
|
|
40
|
+
const stage = state.stages[name];
|
|
41
|
+
const icon = stageIcon(stage.status);
|
|
42
|
+
const color = stageColor(stage.status);
|
|
43
|
+
const iterInfo = stage.type === "pge" && stage.iteration
|
|
44
|
+
? ` (${stage.iteration})`
|
|
45
|
+
: "";
|
|
46
|
+
const duration = stage.durationMs != null
|
|
47
|
+
? ` ${(stage.durationMs / 1000).toFixed(1)}s`
|
|
48
|
+
: "";
|
|
49
|
+
const gateTag = stage.type === "human_gate" ? " \u2691" : "";
|
|
50
|
+
return (_jsx(Box, { children: stage.status === "in_progress" ? (_jsxs(Text, { color: "yellow", children: [" ", _jsx(Spinner, { type: "dots" }), " ", name, iterInfo, gateTag] })) : (_jsxs(Text, { color: color, children: [" ", icon, " ", name, iterInfo, duration, gateTag] })) }, name));
|
|
51
|
+
}), state.gate?.status === "pending" && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "blue", bold: true, children: [" ", "\\u23F8 Gate: ", state.gate.stageName] }) }))] }));
|
|
52
|
+
}
|
|
53
|
+
export function AgentActivityPanel({ activity }) {
|
|
54
|
+
if (!activity) {
|
|
55
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, marginLeft: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Agent Activity" }), _jsx(Text, { dimColor: true, children: "Waiting for agent activity..." })] }));
|
|
56
|
+
}
|
|
57
|
+
const recentTools = activity.toolHistory?.slice(-8) ?? [];
|
|
58
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, marginLeft: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Agent Activity" }), _jsxs(Box, { children: [_jsxs(Text, { bold: true, children: ["[", activity.agent, "]"] }), activity.model && (_jsxs(Text, { dimColor: true, children: [" ", activity.model] }))] }), recentTools.length > 0 && (_jsx(Box, { flexDirection: "column", children: recentTools.map((t, i) => (_jsx(Box, { children: _jsxs(Text, { color: t.status === "active" ? "cyan" : "gray", children: [" ", t.status === "active" ? "\u25B6" : "\u2713", " ", t.name, t.summary ? (_jsxs(Text, { dimColor: true, children: [" ", t.summary.length > 50 ? t.summary.slice(0, 47) + "..." : t.summary] })) : null] }) }, `${t.id}-${i}`))) })), activity.lastThinking && (_jsxs(Text, { dimColor: true, italic: true, children: [" \u{1F4AD} ", activity.lastThinking.slice(0, 80), activity.lastThinking.length > 80 ? "..." : ""] })), activity.lastText && activity.lastText.startsWith("[sub-agent]") && (_jsxs(Text, { color: "magenta", children: [" ", activity.lastText] })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: [" ", "Tokens: ", activity.inputTokens.toLocaleString(), " in /", " ", activity.outputTokens.toLocaleString(), " out", " | ", "Tools: ", activity.toolCallCount, activity.totalCostUsd > 0 && ` | $${activity.totalCostUsd.toFixed(4)}`] }) })] }));
|
|
59
|
+
}
|
|
60
|
+
export function EventLog({ events }) {
|
|
61
|
+
const recent = events.slice(-8);
|
|
62
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Event Log" }), recent.length === 0 && (_jsx(Text, { dimColor: true, children: " No events yet." })), recent.map((e) => {
|
|
63
|
+
const time = e.timestamp.slice(11, 19); // HH:MM:SS
|
|
64
|
+
const stage = e.stageName ? ` ${e.stageName}` : "";
|
|
65
|
+
const detail = e.data ? ` ${formatEventData(e.data)}` : "";
|
|
66
|
+
return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: time }), _jsxs(Text, { color: eventColor(e.eventType), children: [" ", formatEventType(e.eventType), stage, detail] })] }, e.id));
|
|
67
|
+
})] }));
|
|
68
|
+
}
|
|
69
|
+
function formatEventType(type) {
|
|
70
|
+
switch (type) {
|
|
71
|
+
case "stage_start": return "\u25B6 Started";
|
|
72
|
+
case "stage_complete": return "\u2713 Completed";
|
|
73
|
+
case "pge_progress": return "\u21BB PGE";
|
|
74
|
+
case "gate_pending": return "\u23F8 Gate pending";
|
|
75
|
+
case "gate_responded": return "\u2713 Gate responded";
|
|
76
|
+
case "pipeline_complete": return "\u2714 Pipeline done";
|
|
77
|
+
default: return type;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function eventColor(type) {
|
|
81
|
+
switch (type) {
|
|
82
|
+
case "stage_start": return "yellow";
|
|
83
|
+
case "stage_complete": return "green";
|
|
84
|
+
case "gate_pending": return "blue";
|
|
85
|
+
case "gate_responded": return "green";
|
|
86
|
+
case "pipeline_complete": return "green";
|
|
87
|
+
default: return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function formatEventData(data) {
|
|
91
|
+
if (!data || typeof data !== "object")
|
|
92
|
+
return "";
|
|
93
|
+
const obj = data;
|
|
94
|
+
if (obj.status)
|
|
95
|
+
return `(${obj.status})`;
|
|
96
|
+
if (obj.step)
|
|
97
|
+
return `(${obj.step})`;
|
|
98
|
+
if (obj.iteration)
|
|
99
|
+
return `(iter ${obj.iteration})`;
|
|
100
|
+
return "";
|
|
101
|
+
}
|
|
102
|
+
export function Header({ pipelineName, project, elapsed }) {
|
|
103
|
+
const mins = Math.floor(elapsed / 60000);
|
|
104
|
+
const secs = Math.floor((elapsed % 60000) / 1000);
|
|
105
|
+
const timeStr = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
|
|
106
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { bold: true, children: ["CCCP: ", pipelineName, " (", project, ")"] }), _jsxs(Text, { dimColor: true, children: [" ", "Elapsed: ", timeStr] })] }));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/tui/components.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PipelineState } from "../types.js";
|
|
2
|
+
export declare function launchDashboard(runId: string, projectDir: string, initialState: PipelineState): Promise<void>;
|
|
3
|
+
export interface InlineDashboardHandle {
|
|
4
|
+
unmount: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function startDashboard(runId: string, projectDir: string, initialState: PipelineState): InlineDashboardHandle;
|