@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.
Files changed (127) hide show
  1. package/.claude/skills/cccp-pipeline/SKILL.md +562 -0
  2. package/.claude/skills/cccp-run/SKILL.md +111 -0
  3. package/README.md +280 -0
  4. package/dist/activity-bus.d.ts +9 -0
  5. package/dist/activity-bus.js +10 -0
  6. package/dist/activity-bus.js.map +1 -0
  7. package/dist/agent-resolver.d.ts +29 -0
  8. package/dist/agent-resolver.js +122 -0
  9. package/dist/agent-resolver.js.map +1 -0
  10. package/dist/agent.d.ts +39 -0
  11. package/dist/agent.js +117 -0
  12. package/dist/agent.js.map +1 -0
  13. package/dist/autoresearch.d.ts +11 -0
  14. package/dist/autoresearch.js +295 -0
  15. package/dist/autoresearch.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +157 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +126 -0
  20. package/dist/config.js +76 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/context.d.ts +24 -0
  23. package/dist/context.js +82 -0
  24. package/dist/context.js.map +1 -0
  25. package/dist/contract.d.ts +26 -0
  26. package/dist/contract.js +65 -0
  27. package/dist/contract.js.map +1 -0
  28. package/dist/db.d.ts +70 -0
  29. package/dist/db.js +358 -0
  30. package/dist/db.js.map +1 -0
  31. package/dist/dispatcher.d.ts +9 -0
  32. package/dist/dispatcher.js +7 -0
  33. package/dist/dispatcher.js.map +1 -0
  34. package/dist/errors.d.ts +16 -0
  35. package/dist/errors.js +30 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/evaluator.d.ts +23 -0
  38. package/dist/evaluator.js +49 -0
  39. package/dist/evaluator.js.map +1 -0
  40. package/dist/gate/auto-approve.d.ts +9 -0
  41. package/dist/gate/auto-approve.js +11 -0
  42. package/dist/gate/auto-approve.js.map +1 -0
  43. package/dist/gate/gate-strategy.d.ts +22 -0
  44. package/dist/gate/gate-strategy.js +2 -0
  45. package/dist/gate/gate-strategy.js.map +1 -0
  46. package/dist/gate/gate-watcher.d.ts +15 -0
  47. package/dist/gate/gate-watcher.js +64 -0
  48. package/dist/gate/gate-watcher.js.map +1 -0
  49. package/dist/logger.d.ts +24 -0
  50. package/dist/logger.js +22 -0
  51. package/dist/logger.js.map +1 -0
  52. package/dist/mcp/gate-notifier.d.ts +26 -0
  53. package/dist/mcp/gate-notifier.js +161 -0
  54. package/dist/mcp/gate-notifier.js.map +1 -0
  55. package/dist/mcp/mcp-config.d.ts +25 -0
  56. package/dist/mcp/mcp-config.js +80 -0
  57. package/dist/mcp/mcp-config.js.map +1 -0
  58. package/dist/mcp/mcp-server.d.ts +1 -0
  59. package/dist/mcp/mcp-server.js +262 -0
  60. package/dist/mcp/mcp-server.js.map +1 -0
  61. package/dist/pge.d.ts +12 -0
  62. package/dist/pge.js +361 -0
  63. package/dist/pge.js.map +1 -0
  64. package/dist/pipeline.d.ts +6 -0
  65. package/dist/pipeline.js +120 -0
  66. package/dist/pipeline.js.map +1 -0
  67. package/dist/prompt.d.ts +67 -0
  68. package/dist/prompt.js +121 -0
  69. package/dist/prompt.js.map +1 -0
  70. package/dist/runner.d.ts +11 -0
  71. package/dist/runner.js +494 -0
  72. package/dist/runner.js.map +1 -0
  73. package/dist/scaffold/index.d.ts +14 -0
  74. package/dist/scaffold/index.js +260 -0
  75. package/dist/scaffold/index.js.map +1 -0
  76. package/dist/scaffold/templates.d.ts +47 -0
  77. package/dist/scaffold/templates.js +2177 -0
  78. package/dist/scaffold/templates.js.map +1 -0
  79. package/dist/stage-helpers.d.ts +7 -0
  80. package/dist/stage-helpers.js +27 -0
  81. package/dist/stage-helpers.js.map +1 -0
  82. package/dist/state.d.ts +43 -0
  83. package/dist/state.js +177 -0
  84. package/dist/state.js.map +1 -0
  85. package/dist/stream/stream-tail.d.ts +17 -0
  86. package/dist/stream/stream-tail.js +95 -0
  87. package/dist/stream/stream-tail.js.map +1 -0
  88. package/dist/stream/stream.d.ts +142 -0
  89. package/dist/stream/stream.js +251 -0
  90. package/dist/stream/stream.js.map +1 -0
  91. package/dist/temp-tracker.d.ts +6 -0
  92. package/dist/temp-tracker.js +24 -0
  93. package/dist/temp-tracker.js.map +1 -0
  94. package/dist/tui/cmux.d.ts +22 -0
  95. package/dist/tui/cmux.js +82 -0
  96. package/dist/tui/cmux.js.map +1 -0
  97. package/dist/tui/components.d.ts +21 -0
  98. package/dist/tui/components.js +108 -0
  99. package/dist/tui/components.js.map +1 -0
  100. package/dist/tui/dashboard.d.ts +6 -0
  101. package/dist/tui/dashboard.js +125 -0
  102. package/dist/tui/dashboard.js.map +1 -0
  103. package/dist/tui/detail-log.d.ts +10 -0
  104. package/dist/tui/detail-log.js +171 -0
  105. package/dist/tui/detail-log.js.map +1 -0
  106. package/dist/types.d.ts +273 -0
  107. package/dist/types.js +2 -0
  108. package/dist/types.js.map +1 -0
  109. package/examples/agents/diff-evaluator.md +57 -0
  110. package/examples/agents/prompt-tuner.md +30 -0
  111. package/examples/agents/summarizer.md +14 -0
  112. package/examples/autoresearch-artifacts/expected-output.md +17 -0
  113. package/examples/autoresearch-artifacts/prompt.md +35 -0
  114. package/examples/autoresearch-artifacts/source-material.md +28 -0
  115. package/examples/business-case.yaml +41 -0
  116. package/examples/cccp.yaml +48 -0
  117. package/examples/content-calendar.yaml +59 -0
  118. package/examples/customer-feedback-loop.yaml +44 -0
  119. package/examples/design-sprint.yaml +54 -0
  120. package/examples/feature-development.yaml +96 -0
  121. package/examples/growth-experiment.yaml +49 -0
  122. package/examples/incident-runbook.yaml +43 -0
  123. package/examples/product-launch.yaml +85 -0
  124. package/examples/prompt-tuning.yaml +25 -0
  125. package/examples/quarterly-planning.yaml +51 -0
  126. package/examples/sprint-cycle.yaml +67 -0
  127. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PgeAgentConfig, RunContext } from "./types.js";
2
+ export declare function mergeInputs(stageInputs: string[] | undefined, agentInputs: string[] | undefined, vars: Record<string, string>, extra?: string[]): string[];
3
+ export declare function resolveAndLoad(config: PgeAgentConfig, ctx: RunContext, stageMcpProfile: string | undefined): Promise<{
4
+ resolved: import("./agent-resolver.js").ResolvedAgent;
5
+ markdown: string;
6
+ mcpFile: string | undefined;
7
+ }>;
@@ -0,0 +1,27 @@
1
+ import { resolveAgent } from "./agent-resolver.js";
2
+ import { loadAgentMarkdown, interpolate } from "./prompt.js";
3
+ import { writeMcpConfigFile } from "./mcp/mcp-config.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Input merging — stage-level + agent-level inputs, interpolated
6
+ // ---------------------------------------------------------------------------
7
+ export function mergeInputs(stageInputs, agentInputs, vars, extra) {
8
+ const all = [
9
+ ...(stageInputs ?? []),
10
+ ...(agentInputs ?? []),
11
+ ...(extra ?? []),
12
+ ];
13
+ return all.map((i) => interpolate(i, vars));
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Agent resolution helper
17
+ // ---------------------------------------------------------------------------
18
+ export async function resolveAndLoad(config, ctx, stageMcpProfile) {
19
+ const resolved = await resolveAgent(config.agent, ctx.agentSearchPaths, config.operation, ctx.projectDir);
20
+ const markdown = await loadAgentMarkdown(resolved.agentPath, resolved.operationPath);
21
+ const mcpProfile = config.mcp_profile ?? stageMcpProfile;
22
+ const mcpFile = ctx.projectConfig
23
+ ? await writeMcpConfigFile(mcpProfile, ctx.projectConfig, ctx.tempTracker)
24
+ : undefined;
25
+ return { resolved, markdown, mcpFile };
26
+ }
27
+ //# sourceMappingURL=stage-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-helpers.js","sourceRoot":"","sources":["../src/stage-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,MAAM,UAAU,WAAW,CACzB,WAAiC,EACjC,WAAiC,EACjC,IAA4B,EAC5B,KAAgB;IAEhB,MAAM,GAAG,GAAG;QACV,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KACjB,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAsB,EACtB,GAAe,EACf,eAAmC;IAEnC,MAAM,QAAQ,GAAG,MAAM,YAAY,CACjC,MAAM,CAAC,KAAK,EACZ,GAAG,CAAC,gBAAgB,EACpB,MAAM,CAAC,SAAS,EAChB,GAAG,CAAC,UAAU,CACf,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,aAAa,CACvB,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,eAAe,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa;QAC/B,CAAC,CAAC,MAAM,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC;QAC1E,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type RunFilter } from "./db.js";
2
+ import type { PipelineState, StageState, StageStatus, PgeStep, AutoresearchStep, ResumePoint, DiscoveredRun } from "./types.js";
3
+ export type { PipelineState, StageState, StageStatus, PgeStep, GateInfo, ResumePoint, DiscoveredRun, } from "./types.js";
4
+ export declare function stateDir(artifactDir: string): string;
5
+ export declare function statePath(artifactDir: string): string;
6
+ /**
7
+ * Create a fresh pipeline state for a new run.
8
+ */
9
+ export declare function createState(pipeline: string, project: string, pipelineFile: string, stages: Array<{
10
+ name: string;
11
+ type: string;
12
+ }>, artifactDir: string, projectDir?: string): PipelineState;
13
+ /**
14
+ * Load pipeline state by run ID. Queries the SQLite database.
15
+ * When `reloadFromDisk` is true, re-reads the DB file first — needed when
16
+ * another process (e.g., MCP server) may have written to it.
17
+ */
18
+ export declare function loadState(runId: string, projectDir?: string, reloadFromDisk?: boolean): Promise<PipelineState | null>;
19
+ /**
20
+ * Save pipeline state to the SQLite database and flush to disk.
21
+ * The artifact directory is extracted from `state.artifactDir`.
22
+ */
23
+ export declare function saveState(state: PipelineState): Promise<void>;
24
+ /**
25
+ * Save state and record an event in the audit log.
26
+ * The artifact directory is extracted from `state.artifactDir`.
27
+ */
28
+ export declare function saveStateWithEvent(state: PipelineState, eventType: string, stageName?: string, eventData?: unknown): Promise<void>;
29
+ export declare function updateStageStatus(state: PipelineState, stageName: string, status: StageStatus, extra?: Partial<StageState>): void;
30
+ export declare function updatePgeProgress(state: PipelineState, stageName: string, iteration: number, step: PgeStep | AutoresearchStep): void;
31
+ export declare function setStageArtifact(state: PipelineState, stageName: string, key: string, path: string): void;
32
+ export declare function finishPipeline(state: PipelineState, status: "passed" | "failed" | "error"): void;
33
+ /**
34
+ * Determine where to resume a pipeline from its saved state.
35
+ * Returns null if the pipeline is already complete or has no resumable point.
36
+ */
37
+ export declare function findResumePoint(state: PipelineState): ResumePoint | null;
38
+ /**
39
+ * Discover pipeline runs from the SQLite database.
40
+ * Optionally filter by project, pipeline, status, or artifact directory.
41
+ * Returns matching runs sorted running-first, then by start time descending.
42
+ */
43
+ export declare function discoverRuns(projectDir: string, filter?: RunFilter): Promise<DiscoveredRun[]>;
package/dist/state.js ADDED
@@ -0,0 +1,177 @@
1
+ import { resolve } from "node:path";
2
+ import { randomUUID } from "node:crypto";
3
+ import { openDatabase } from "./db.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Legacy state file path (kept for .stream.jsonl and artifact directory)
6
+ // ---------------------------------------------------------------------------
7
+ export function stateDir(artifactDir) {
8
+ return resolve(artifactDir, ".cccp");
9
+ }
10
+ export function statePath(artifactDir) {
11
+ return resolve(stateDir(artifactDir), "state.json");
12
+ }
13
+ // ---------------------------------------------------------------------------
14
+ // Database resolution
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Resolve the project directory for database access.
18
+ * Priority: state.projectDir > derive from pipelineFile > cwd
19
+ */
20
+ function resolveProjectDir(state) {
21
+ if (state?.projectDir)
22
+ return state.projectDir;
23
+ // Fall back to cwd (the MCP server and CLI always run from project root)
24
+ return process.cwd();
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Create / Load / Save
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Create a fresh pipeline state for a new run.
31
+ */
32
+ export function createState(pipeline, project, pipelineFile, stages, artifactDir, projectDir) {
33
+ const stageMap = {};
34
+ const order = [];
35
+ for (const s of stages) {
36
+ stageMap[s.name] = {
37
+ name: s.name,
38
+ type: s.type,
39
+ status: "pending",
40
+ };
41
+ order.push(s.name);
42
+ }
43
+ return {
44
+ runId: randomUUID(),
45
+ pipeline,
46
+ project,
47
+ pipelineFile,
48
+ startedAt: new Date().toISOString(),
49
+ status: "running",
50
+ stages: stageMap,
51
+ stageOrder: order,
52
+ artifactDir,
53
+ projectDir,
54
+ };
55
+ }
56
+ /**
57
+ * Load pipeline state by run ID. Queries the SQLite database.
58
+ * When `reloadFromDisk` is true, re-reads the DB file first — needed when
59
+ * another process (e.g., MCP server) may have written to it.
60
+ */
61
+ export async function loadState(runId, projectDir, reloadFromDisk) {
62
+ try {
63
+ const dir = projectDir ?? resolveProjectDir();
64
+ const db = await openDatabase(dir);
65
+ if (reloadFromDisk)
66
+ db.reload();
67
+ return db.getRun(runId);
68
+ }
69
+ catch (err) {
70
+ // Log database errors but don't crash — callers handle null gracefully.
71
+ if (err instanceof Error) {
72
+ console.error(`[cccp] loadState error: ${err.message}`);
73
+ }
74
+ return null;
75
+ }
76
+ }
77
+ /**
78
+ * Save pipeline state to the SQLite database and flush to disk.
79
+ * The artifact directory is extracted from `state.artifactDir`.
80
+ */
81
+ export async function saveState(state) {
82
+ const dir = resolveProjectDir(state);
83
+ const db = await openDatabase(dir);
84
+ db.upsertRun(state, state.artifactDir);
85
+ db.flush();
86
+ }
87
+ /**
88
+ * Save state and record an event in the audit log.
89
+ * The artifact directory is extracted from `state.artifactDir`.
90
+ */
91
+ export async function saveStateWithEvent(state, eventType, stageName, eventData) {
92
+ const dir = resolveProjectDir(state);
93
+ const db = await openDatabase(dir);
94
+ db.upsertRun(state, state.artifactDir);
95
+ db.appendEvent(state.runId, eventType, stageName, eventData);
96
+ db.flush();
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // State update helpers (in-memory mutations — caller must saveState after)
100
+ // ---------------------------------------------------------------------------
101
+ export function updateStageStatus(state, stageName, status, extra) {
102
+ const stage = state.stages[stageName];
103
+ if (!stage)
104
+ return;
105
+ stage.status = status;
106
+ if (extra)
107
+ Object.assign(stage, extra);
108
+ }
109
+ export function updatePgeProgress(state, stageName, iteration, step) {
110
+ const stage = state.stages[stageName];
111
+ if (!stage)
112
+ return;
113
+ stage.iteration = iteration;
114
+ stage.pgeStep = step;
115
+ }
116
+ export function setStageArtifact(state, stageName, key, path) {
117
+ const stage = state.stages[stageName];
118
+ if (!stage)
119
+ return;
120
+ if (!stage.artifacts)
121
+ stage.artifacts = {};
122
+ stage.artifacts[key] = path;
123
+ }
124
+ export function finishPipeline(state, status) {
125
+ state.status = status;
126
+ state.completedAt = new Date().toISOString();
127
+ }
128
+ // ---------------------------------------------------------------------------
129
+ // Resume logic
130
+ // ---------------------------------------------------------------------------
131
+ /**
132
+ * Determine where to resume a pipeline from its saved state.
133
+ * Returns null if the pipeline is already complete or has no resumable point.
134
+ */
135
+ export function findResumePoint(state) {
136
+ if (state.status === "passed")
137
+ return null;
138
+ for (let i = 0; i < state.stageOrder.length; i++) {
139
+ const name = state.stageOrder[i];
140
+ const stage = state.stages[name];
141
+ if (stage.status === "passed" || stage.status === "skipped") {
142
+ continue;
143
+ }
144
+ const point = {
145
+ stageIndex: i,
146
+ stageName: name,
147
+ };
148
+ if ((stage.type === "pge" || stage.type === "autoresearch") && stage.status === "in_progress") {
149
+ point.resumeIteration = stage.iteration ?? 1;
150
+ point.resumeStep = stage.pgeStep;
151
+ }
152
+ return point;
153
+ }
154
+ return null;
155
+ }
156
+ // ---------------------------------------------------------------------------
157
+ // Run discovery — queries SQLite database
158
+ // ---------------------------------------------------------------------------
159
+ /**
160
+ * Discover pipeline runs from the SQLite database.
161
+ * Optionally filter by project, pipeline, status, or artifact directory.
162
+ * Returns matching runs sorted running-first, then by start time descending.
163
+ */
164
+ export async function discoverRuns(projectDir, filter) {
165
+ try {
166
+ const db = await openDatabase(projectDir);
167
+ return db.findRuns(filter);
168
+ }
169
+ catch (err) {
170
+ // Log database errors but don't crash — callers handle empty list gracefully.
171
+ if (err instanceof Error) {
172
+ console.error(`[cccp] discoverRuns error: ${err.message}`);
173
+ }
174
+ return [];
175
+ }
176
+ }
177
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { EventEmitter } from "node:events";
2
+ /**
3
+ * Tails `.stream.jsonl` files in a `.cccp/` directory and emits
4
+ * `"activity"` events as new lines are written. Used by the standalone
5
+ * `cccp dashboard` command where the runner is in a separate process.
6
+ */
7
+ export declare class StreamTailer extends EventEmitter {
8
+ private cccpDir;
9
+ private parsers;
10
+ private dirWatcher;
11
+ private pollInterval;
12
+ constructor(cccpDir: string);
13
+ start(): Promise<void>;
14
+ stop(): void;
15
+ private scanFiles;
16
+ private tailFile;
17
+ }
@@ -0,0 +1,95 @@
1
+ import { watch } from "node:fs";
2
+ import { readdir, open } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { EventEmitter } from "node:events";
5
+ import { StreamParser } from "./stream.js";
6
+ /**
7
+ * Tails `.stream.jsonl` files in a `.cccp/` directory and emits
8
+ * `"activity"` events as new lines are written. Used by the standalone
9
+ * `cccp dashboard` command where the runner is in a separate process.
10
+ */
11
+ export class StreamTailer extends EventEmitter {
12
+ cccpDir;
13
+ parsers = new Map();
14
+ dirWatcher = null;
15
+ pollInterval = null;
16
+ constructor(cccpDir) {
17
+ super();
18
+ this.cccpDir = cccpDir;
19
+ }
20
+ async start() {
21
+ // Initial scan for existing files.
22
+ await this.scanFiles();
23
+ // Watch for new/changed files.
24
+ try {
25
+ this.dirWatcher = watch(this.cccpDir, async (eventType, filename) => {
26
+ if (filename?.endsWith(".stream.jsonl")) {
27
+ await this.tailFile(filename);
28
+ }
29
+ });
30
+ }
31
+ catch {
32
+ // Directory may not exist yet — fall back to polling.
33
+ }
34
+ // Poll every 500ms as a fallback (fs.watch can miss events).
35
+ this.pollInterval = setInterval(() => this.scanFiles().catch(() => { }), 500);
36
+ }
37
+ stop() {
38
+ this.dirWatcher?.close();
39
+ this.dirWatcher = null;
40
+ if (this.pollInterval) {
41
+ clearInterval(this.pollInterval);
42
+ this.pollInterval = null;
43
+ }
44
+ for (const { parser } of this.parsers.values()) {
45
+ parser.flush();
46
+ }
47
+ }
48
+ async scanFiles() {
49
+ let files;
50
+ try {
51
+ files = await readdir(this.cccpDir);
52
+ }
53
+ catch {
54
+ return;
55
+ }
56
+ for (const file of files) {
57
+ if (file.endsWith(".stream.jsonl")) {
58
+ await this.tailFile(file);
59
+ }
60
+ }
61
+ }
62
+ async tailFile(filename) {
63
+ const filePath = resolve(this.cccpDir, filename);
64
+ const agentName = filename.replace(/\.stream\.jsonl$/, "");
65
+ if (!this.parsers.has(filename)) {
66
+ const parser = new StreamParser(agentName);
67
+ parser.on("activity", (a) => {
68
+ this.emit("activity", a);
69
+ });
70
+ this.parsers.set(filename, { parser, offset: 0 });
71
+ }
72
+ const entry = this.parsers.get(filename);
73
+ try {
74
+ const fh = await open(filePath, "r");
75
+ try {
76
+ const stat = await fh.stat();
77
+ if (stat.size <= entry.offset)
78
+ return;
79
+ const buf = Buffer.alloc(stat.size - entry.offset);
80
+ const { bytesRead } = await fh.read(buf, 0, buf.length, entry.offset);
81
+ entry.offset += bytesRead;
82
+ if (bytesRead > 0) {
83
+ entry.parser.feed(buf.toString("utf-8", 0, bytesRead));
84
+ }
85
+ }
86
+ finally {
87
+ await fh.close();
88
+ }
89
+ }
90
+ catch {
91
+ // File may be mid-write or deleted — ignore.
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=stream-tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-tail.js","sourceRoot":"","sources":["../../src/stream/stream-tail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { EventEmitter } from "node:events";
2
+ export interface TextBlock {
3
+ type: "text";
4
+ text: string;
5
+ }
6
+ export interface ThinkingBlock {
7
+ type: "thinking";
8
+ thinking: string;
9
+ }
10
+ export interface ToolUseBlock {
11
+ type: "tool_use";
12
+ name: string;
13
+ id: string;
14
+ input?: Record<string, unknown>;
15
+ }
16
+ export interface ToolResultBlock {
17
+ type: "tool_result";
18
+ tool_use_id: string;
19
+ content?: unknown;
20
+ }
21
+ export type ContentBlock = TextBlock | ThinkingBlock | ToolUseBlock | ToolResultBlock;
22
+ export interface StreamMessage {
23
+ id?: string;
24
+ content?: ContentBlock[];
25
+ usage?: {
26
+ input_tokens?: number;
27
+ output_tokens?: number;
28
+ };
29
+ }
30
+ export interface SystemInitEvent {
31
+ type: "system";
32
+ subtype: "init";
33
+ model?: string;
34
+ tools?: string[];
35
+ }
36
+ export interface SystemTaskProgressEvent {
37
+ type: "system";
38
+ subtype: "task_progress";
39
+ last_tool_name?: string;
40
+ description?: string;
41
+ }
42
+ export interface SystemOtherEvent {
43
+ type: "system";
44
+ subtype?: string;
45
+ }
46
+ export interface AssistantEvent {
47
+ type: "assistant";
48
+ subtype?: string;
49
+ message?: StreamMessage;
50
+ text?: string;
51
+ name?: string;
52
+ id?: string;
53
+ input?: Record<string, unknown>;
54
+ }
55
+ export interface UserEvent {
56
+ type: "user";
57
+ subtype?: string;
58
+ message?: StreamMessage;
59
+ name?: string;
60
+ }
61
+ export interface ToolResultEvent {
62
+ type: "tool_result";
63
+ name?: string;
64
+ id?: string;
65
+ }
66
+ export interface ResultEvent {
67
+ type: "result";
68
+ subtype?: string;
69
+ usage?: {
70
+ input_tokens?: number;
71
+ output_tokens?: number;
72
+ };
73
+ total_cost_usd?: number;
74
+ exit_code?: number;
75
+ }
76
+ export interface UnknownEvent {
77
+ type: string;
78
+ [key: string]: unknown;
79
+ }
80
+ export type StreamEvent = SystemInitEvent | SystemTaskProgressEvent | SystemOtherEvent | AssistantEvent | UserEvent | ToolResultEvent | ResultEvent | UnknownEvent;
81
+ /** @deprecated Use `StreamEvent` instead. */
82
+ export type StreamEventBase = StreamEvent;
83
+ export interface ToolHistoryEntry {
84
+ name: string;
85
+ id: string;
86
+ status: "active" | "done";
87
+ /** Short summary of input (e.g., file path for Read). */
88
+ summary?: string;
89
+ }
90
+ export interface AgentActivity {
91
+ /** Agent name / stage name. */
92
+ agent: string;
93
+ /** Model name (from system/init event). */
94
+ model: string;
95
+ /** Latest text snippet (last ~200 chars). */
96
+ lastText: string;
97
+ /** Latest thinking snippet (last ~200 chars). */
98
+ lastThinking: string;
99
+ /** Tools currently being used. */
100
+ activeTools: string[];
101
+ /** Recent tool call history (last 10). */
102
+ toolHistory: ToolHistoryEntry[];
103
+ /** Cumulative input tokens. */
104
+ inputTokens: number;
105
+ /** Cumulative output tokens. */
106
+ outputTokens: number;
107
+ /** Number of tool calls made. */
108
+ toolCallCount: number;
109
+ /** Cumulative cost in USD. */
110
+ totalCostUsd: number;
111
+ }
112
+ export declare class StreamParser extends EventEmitter {
113
+ private logStream;
114
+ private activity;
115
+ private buffer;
116
+ /** Maps tool_use IDs to tool names (for matching tool_result events). */
117
+ private toolIdToName;
118
+ /** Tracks seen tool_use IDs to avoid double-counting from streaming. */
119
+ private seenToolIds;
120
+ constructor(agentName: string);
121
+ /**
122
+ * Start logging raw events to a JSONL file.
123
+ */
124
+ startLog(logPath: string): Promise<void>;
125
+ /**
126
+ * Feed a chunk of stdout data. Handles line buffering.
127
+ */
128
+ feed(chunk: string): void;
129
+ /**
130
+ * Flush any remaining buffer content.
131
+ */
132
+ flush(): void;
133
+ /**
134
+ * Get current activity snapshot.
135
+ */
136
+ getActivity(): AgentActivity;
137
+ private parseLine;
138
+ private processEvent;
139
+ private processContentBlocks;
140
+ private addToolHistory;
141
+ private markToolDone;
142
+ }