archbyte 0.6.1 → 0.7.1
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 +68 -62
- package/dist/agents/index.js +2 -0
- package/dist/agents/observability/adapters/archbyte.d.ts +3 -0
- package/dist/agents/observability/adapters/archbyte.js +104 -0
- package/dist/agents/observability/adapters/claude-transcripts.d.ts +31 -0
- package/dist/agents/observability/adapters/claude-transcripts.js +692 -0
- package/dist/agents/observability/reader.d.ts +7 -0
- package/dist/agents/observability/reader.js +86 -0
- package/dist/agents/observability/types.d.ts +125 -0
- package/dist/agents/observability/types.js +3 -0
- package/dist/agents/observability/writer.d.ts +9 -0
- package/dist/agents/observability/writer.js +100 -0
- package/dist/agents/pipeline/index.d.ts +1 -1
- package/dist/agents/pipeline/index.js +85 -3
- package/dist/agents/pipeline/types.d.ts +2 -0
- package/dist/agents/prompt-data.js +9 -0
- package/dist/cli/analyze.js +81 -1
- package/dist/cli/config.js +21 -1
- package/dist/server/src/index.js +301 -13
- package/package.json +1 -1
- package/ui/dist/assets/index-ClEznf0G.js +85 -0
- package/ui/dist/assets/{index-BQouokNH.css → index-FuWCQecR.css} +1 -1
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-CWGPRsWP.js +0 -72
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Session Reader — reads session data from .archbyte/sessions/
|
|
2
|
+
import { readFile, readdir } from "fs/promises";
|
|
3
|
+
import { existsSync, readFileSync } from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
function sessionsDir(projectRoot) {
|
|
6
|
+
return path.join(projectRoot, ".archbyte", "sessions");
|
|
7
|
+
}
|
|
8
|
+
/** Load session index — reads index.json, or scans session dirs if missing */
|
|
9
|
+
export async function loadSessionIndex(projectRoot) {
|
|
10
|
+
const dir = sessionsDir(projectRoot);
|
|
11
|
+
const indexPath = path.join(dir, "index.json");
|
|
12
|
+
// Try cached index first
|
|
13
|
+
if (existsSync(indexPath)) {
|
|
14
|
+
try {
|
|
15
|
+
const raw = readFileSync(indexPath, "utf-8");
|
|
16
|
+
return JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Corrupted — rebuild
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Scan session directories
|
|
23
|
+
return rebuildIndex(projectRoot);
|
|
24
|
+
}
|
|
25
|
+
/** Rebuild index by scanning all session dirs */
|
|
26
|
+
async function rebuildIndex(projectRoot) {
|
|
27
|
+
const dir = sessionsDir(projectRoot);
|
|
28
|
+
if (!existsSync(dir))
|
|
29
|
+
return { sessions: [] };
|
|
30
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
31
|
+
const sessions = [];
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
if (!entry.isDirectory())
|
|
34
|
+
continue;
|
|
35
|
+
const sessionPath = path.join(dir, entry.name, "session.json");
|
|
36
|
+
if (!existsSync(sessionPath))
|
|
37
|
+
continue;
|
|
38
|
+
try {
|
|
39
|
+
const raw = await readFile(sessionPath, "utf-8");
|
|
40
|
+
const session = JSON.parse(raw);
|
|
41
|
+
sessions.push({
|
|
42
|
+
sessionId: session.sessionId,
|
|
43
|
+
startedAt: session.startedAt,
|
|
44
|
+
completedAt: session.completedAt,
|
|
45
|
+
status: session.status,
|
|
46
|
+
runCount: session.summary.totalRuns,
|
|
47
|
+
phases: session.summary.phases,
|
|
48
|
+
source: session.source,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Skip corrupted session files
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Sort newest first
|
|
56
|
+
sessions.sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime());
|
|
57
|
+
return { sessions };
|
|
58
|
+
}
|
|
59
|
+
/** Load a full session by ID */
|
|
60
|
+
export async function loadSession(projectRoot, sessionId) {
|
|
61
|
+
const sessionPath = path.join(sessionsDir(projectRoot), sessionId, "session.json");
|
|
62
|
+
if (!existsSync(sessionPath))
|
|
63
|
+
return null;
|
|
64
|
+
try {
|
|
65
|
+
const raw = await readFile(sessionPath, "utf-8");
|
|
66
|
+
return JSON.parse(raw);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Read recent activity log entries (newest first) */
|
|
73
|
+
export async function loadRecentActivity(projectRoot, limit = 50) {
|
|
74
|
+
const logPath = path.join(sessionsDir(projectRoot), "activity.log");
|
|
75
|
+
if (!existsSync(logPath))
|
|
76
|
+
return [];
|
|
77
|
+
try {
|
|
78
|
+
const raw = await readFile(logPath, "utf-8");
|
|
79
|
+
const lines = raw.trim().split("\n").filter(Boolean);
|
|
80
|
+
// Return newest first, limited
|
|
81
|
+
return lines.slice(-limit).reverse();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export interface TranscriptEvent {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
type: 'user' | 'assistant' | 'thinking' | 'tool_use' | 'tool_result' | 'system';
|
|
4
|
+
agentId?: string;
|
|
5
|
+
agentSlug?: string;
|
|
6
|
+
text?: string;
|
|
7
|
+
toolName?: string;
|
|
8
|
+
toolUseId?: string;
|
|
9
|
+
toolInput?: string;
|
|
10
|
+
toolResult?: string;
|
|
11
|
+
toolSuccess?: boolean;
|
|
12
|
+
model?: string;
|
|
13
|
+
usage?: {
|
|
14
|
+
inputTokens: number;
|
|
15
|
+
outputTokens: number;
|
|
16
|
+
cacheReadTokens: number;
|
|
17
|
+
cacheCreationTokens: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface CloudStats {
|
|
21
|
+
totalInputTokens: number;
|
|
22
|
+
totalOutputTokens: number;
|
|
23
|
+
totalCacheReadTokens: number;
|
|
24
|
+
totalCacheCreationTokens: number;
|
|
25
|
+
estimatedCost: {
|
|
26
|
+
input: number;
|
|
27
|
+
output: number;
|
|
28
|
+
cacheRead: number;
|
|
29
|
+
cacheCreation: number;
|
|
30
|
+
total: number;
|
|
31
|
+
};
|
|
32
|
+
models: string[];
|
|
33
|
+
apiCalls: number;
|
|
34
|
+
}
|
|
35
|
+
export interface PayloadFile {
|
|
36
|
+
path: string;
|
|
37
|
+
timestamp: string;
|
|
38
|
+
agentId?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface AgentRun {
|
|
41
|
+
runId: string;
|
|
42
|
+
sessionId: string;
|
|
43
|
+
phase: string;
|
|
44
|
+
passId: string;
|
|
45
|
+
agent: string;
|
|
46
|
+
model: string;
|
|
47
|
+
iteration: number;
|
|
48
|
+
startedAt: string;
|
|
49
|
+
completedAt?: string;
|
|
50
|
+
elapsedSeconds?: number;
|
|
51
|
+
status: "running" | "success" | "error" | "skipped";
|
|
52
|
+
error?: string;
|
|
53
|
+
tokens?: {
|
|
54
|
+
input: number;
|
|
55
|
+
output: number;
|
|
56
|
+
};
|
|
57
|
+
cost?: {
|
|
58
|
+
input: number;
|
|
59
|
+
output: number;
|
|
60
|
+
total: number;
|
|
61
|
+
};
|
|
62
|
+
toolCalls?: Array<{
|
|
63
|
+
name: string;
|
|
64
|
+
durationMs: number;
|
|
65
|
+
success: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
artifacts?: {
|
|
68
|
+
prompt?: string;
|
|
69
|
+
output?: string;
|
|
70
|
+
error?: string;
|
|
71
|
+
};
|
|
72
|
+
agentType?: string;
|
|
73
|
+
transcript?: TranscriptEvent[];
|
|
74
|
+
}
|
|
75
|
+
export interface AgentSession {
|
|
76
|
+
sessionId: string;
|
|
77
|
+
projectName?: string;
|
|
78
|
+
startedAt: string;
|
|
79
|
+
completedAt?: string;
|
|
80
|
+
status: "running" | "success" | "error" | "partial";
|
|
81
|
+
source: string;
|
|
82
|
+
projectMeta?: {
|
|
83
|
+
topic?: string;
|
|
84
|
+
mode?: string;
|
|
85
|
+
model?: string;
|
|
86
|
+
style?: string;
|
|
87
|
+
};
|
|
88
|
+
summary: {
|
|
89
|
+
totalRuns: number;
|
|
90
|
+
successfulRuns: number;
|
|
91
|
+
failedRuns: number;
|
|
92
|
+
skippedRuns: number;
|
|
93
|
+
totalElapsedSeconds: number;
|
|
94
|
+
totalTokens: {
|
|
95
|
+
input: number;
|
|
96
|
+
output: number;
|
|
97
|
+
};
|
|
98
|
+
phases: string[];
|
|
99
|
+
models: string[];
|
|
100
|
+
};
|
|
101
|
+
runs: AgentRun[];
|
|
102
|
+
transcript?: TranscriptEvent[];
|
|
103
|
+
cloudStats?: CloudStats;
|
|
104
|
+
payload?: PayloadFile[];
|
|
105
|
+
}
|
|
106
|
+
export interface SessionIndex {
|
|
107
|
+
sessions: Array<{
|
|
108
|
+
sessionId: string;
|
|
109
|
+
startedAt: string;
|
|
110
|
+
completedAt?: string;
|
|
111
|
+
status: AgentSession["status"];
|
|
112
|
+
runCount: number;
|
|
113
|
+
phases: string[];
|
|
114
|
+
source: string;
|
|
115
|
+
category?: string;
|
|
116
|
+
label?: string;
|
|
117
|
+
touchedDirs?: string[];
|
|
118
|
+
eventCount?: number;
|
|
119
|
+
dirMetrics?: Record<string, {
|
|
120
|
+
reads: number;
|
|
121
|
+
writes: number;
|
|
122
|
+
}>;
|
|
123
|
+
estimatedCost?: number;
|
|
124
|
+
}>;
|
|
125
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentRun, AgentSession } from "./types.js";
|
|
2
|
+
export declare function createSession(projectRoot: string, sessionId: string, opts?: {
|
|
3
|
+
projectName?: string;
|
|
4
|
+
source?: string;
|
|
5
|
+
}): Promise<AgentSession>;
|
|
6
|
+
export declare function writeRun(projectRoot: string, sessionId: string, run: AgentRun): Promise<void>;
|
|
7
|
+
export declare function completeSession(projectRoot: string, sessionId: string, runs: AgentRun[]): Promise<void>;
|
|
8
|
+
export declare function updateSessionIndex(projectRoot: string): Promise<void>;
|
|
9
|
+
export declare function appendActivityLog(projectRoot: string, entry: Record<string, unknown>): Promise<void>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Session Writer — writes session data to .archbyte/sessions/
|
|
2
|
+
import { mkdir, writeFile, appendFile } from "fs/promises";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { loadSessionIndex } from "./reader.js";
|
|
5
|
+
function sessionsDir(projectRoot) {
|
|
6
|
+
return path.join(projectRoot, ".archbyte", "sessions");
|
|
7
|
+
}
|
|
8
|
+
export async function createSession(projectRoot, sessionId, opts) {
|
|
9
|
+
const dir = path.join(sessionsDir(projectRoot), sessionId);
|
|
10
|
+
await mkdir(path.join(dir, "runs"), { recursive: true });
|
|
11
|
+
const session = {
|
|
12
|
+
sessionId,
|
|
13
|
+
projectName: opts?.projectName,
|
|
14
|
+
startedAt: new Date().toISOString(),
|
|
15
|
+
status: "running",
|
|
16
|
+
source: opts?.source ?? "archbyte",
|
|
17
|
+
summary: {
|
|
18
|
+
totalRuns: 0,
|
|
19
|
+
successfulRuns: 0,
|
|
20
|
+
failedRuns: 0,
|
|
21
|
+
skippedRuns: 0,
|
|
22
|
+
totalElapsedSeconds: 0,
|
|
23
|
+
totalTokens: { input: 0, output: 0 },
|
|
24
|
+
phases: [],
|
|
25
|
+
models: [],
|
|
26
|
+
},
|
|
27
|
+
runs: [],
|
|
28
|
+
};
|
|
29
|
+
await writeFile(path.join(dir, "session.json"), JSON.stringify(session, null, 2), "utf-8");
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
export async function writeRun(projectRoot, sessionId, run) {
|
|
33
|
+
const runDir = path.join(sessionsDir(projectRoot), sessionId, "runs", run.runId);
|
|
34
|
+
await mkdir(runDir, { recursive: true });
|
|
35
|
+
await writeFile(path.join(runDir, "meta.json"), JSON.stringify(run, null, 2), "utf-8");
|
|
36
|
+
// Write optional artifacts
|
|
37
|
+
if (run.artifacts?.prompt) {
|
|
38
|
+
await writeFile(path.join(runDir, "prompt.md"), run.artifacts.prompt, "utf-8");
|
|
39
|
+
}
|
|
40
|
+
if (run.artifacts?.output) {
|
|
41
|
+
await writeFile(path.join(runDir, "output.md"), run.artifacts.output, "utf-8");
|
|
42
|
+
}
|
|
43
|
+
if (run.artifacts?.error) {
|
|
44
|
+
await writeFile(path.join(runDir, "error.txt"), run.artifacts.error, "utf-8");
|
|
45
|
+
}
|
|
46
|
+
// Append to activity log
|
|
47
|
+
await appendActivityLog(projectRoot, {
|
|
48
|
+
type: "run",
|
|
49
|
+
sessionId,
|
|
50
|
+
runId: run.runId,
|
|
51
|
+
agent: run.agent,
|
|
52
|
+
status: run.status,
|
|
53
|
+
timestamp: run.completedAt ?? run.startedAt,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export async function completeSession(projectRoot, sessionId, runs) {
|
|
57
|
+
const dir = path.join(sessionsDir(projectRoot), sessionId);
|
|
58
|
+
const successfulRuns = runs.filter((r) => r.status === "success").length;
|
|
59
|
+
const failedRuns = runs.filter((r) => r.status === "error").length;
|
|
60
|
+
const skippedRuns = runs.filter((r) => r.status === "skipped").length;
|
|
61
|
+
const totalElapsed = runs.reduce((s, r) => s + (r.elapsedSeconds ?? 0), 0);
|
|
62
|
+
const totalTokensIn = runs.reduce((s, r) => s + (r.tokens?.input ?? 0), 0);
|
|
63
|
+
const totalTokensOut = runs.reduce((s, r) => s + (r.tokens?.output ?? 0), 0);
|
|
64
|
+
const phases = [...new Set(runs.map((r) => r.phase))];
|
|
65
|
+
const models = [...new Set(runs.map((r) => r.model))];
|
|
66
|
+
const hasErrors = failedRuns > 0;
|
|
67
|
+
const allFailed = failedRuns === runs.length;
|
|
68
|
+
const session = {
|
|
69
|
+
sessionId,
|
|
70
|
+
startedAt: runs[0]?.startedAt ?? new Date().toISOString(),
|
|
71
|
+
completedAt: new Date().toISOString(),
|
|
72
|
+
status: allFailed ? "error" : hasErrors ? "partial" : "success",
|
|
73
|
+
source: "archbyte",
|
|
74
|
+
summary: {
|
|
75
|
+
totalRuns: runs.length,
|
|
76
|
+
successfulRuns,
|
|
77
|
+
failedRuns,
|
|
78
|
+
skippedRuns,
|
|
79
|
+
totalElapsedSeconds: totalElapsed,
|
|
80
|
+
totalTokens: { input: totalTokensIn, output: totalTokensOut },
|
|
81
|
+
phases,
|
|
82
|
+
models,
|
|
83
|
+
},
|
|
84
|
+
runs,
|
|
85
|
+
};
|
|
86
|
+
await writeFile(path.join(dir, "session.json"), JSON.stringify(session, null, 2), "utf-8");
|
|
87
|
+
// Rebuild index
|
|
88
|
+
await updateSessionIndex(projectRoot);
|
|
89
|
+
}
|
|
90
|
+
export async function updateSessionIndex(projectRoot) {
|
|
91
|
+
const index = await loadSessionIndex(projectRoot);
|
|
92
|
+
await mkdir(sessionsDir(projectRoot), { recursive: true });
|
|
93
|
+
await writeFile(path.join(sessionsDir(projectRoot), "index.json"), JSON.stringify(index, null, 2), "utf-8");
|
|
94
|
+
}
|
|
95
|
+
export async function appendActivityLog(projectRoot, entry) {
|
|
96
|
+
const logPath = path.join(sessionsDir(projectRoot), "activity.log");
|
|
97
|
+
await mkdir(sessionsDir(projectRoot), { recursive: true });
|
|
98
|
+
const line = JSON.stringify({ ...entry, _ts: new Date().toISOString() }) + "\n";
|
|
99
|
+
await appendFile(logPath, line, "utf-8");
|
|
100
|
+
}
|
|
@@ -6,7 +6,7 @@ import type { IncrementalContext } from "./types.js";
|
|
|
6
6
|
* Run the multi-agent pipeline: 3 parallel fast agents → 2 sequential agents.
|
|
7
7
|
* Each agent gets a single chat() call with pre-collected static context.
|
|
8
8
|
*/
|
|
9
|
-
export declare function runPipeline(ctx: StaticContext, provider: LLMProvider, config: ArchByteConfig, onProgress?: (msg: string) => void, incrementalContext?: IncrementalContext, onDebug?: (agentId: string, model: string, system: string, user: string) => void): Promise<StaticAnalysisResult & {
|
|
9
|
+
export declare function runPipeline(ctx: StaticContext, provider: LLMProvider, config: ArchByteConfig, onProgress?: (msg: string) => void, incrementalContext?: IncrementalContext, onDebug?: (agentId: string, model: string, system: string, user: string) => void, projectRoot?: string): Promise<StaticAnalysisResult & {
|
|
10
10
|
tokenUsage?: {
|
|
11
11
|
input: number;
|
|
12
12
|
output: number;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Pipeline — Orchestrator
|
|
2
2
|
// Runs static context collection → parallel LLM agents → sequential LLM agents
|
|
3
|
+
import { writeFile, mkdir } from "fs/promises";
|
|
4
|
+
import path from "path";
|
|
3
5
|
import { resolveModel } from "../runtime/types.js";
|
|
4
6
|
import { validateAnalysis } from "../static/validator.js";
|
|
5
7
|
import { componentIdentifier } from "./agents/component-identifier.js";
|
|
@@ -92,14 +94,40 @@ function getFallbackData(agentId, inc) {
|
|
|
92
94
|
* Run the multi-agent pipeline: 3 parallel fast agents → 2 sequential agents.
|
|
93
95
|
* Each agent gets a single chat() call with pre-collected static context.
|
|
94
96
|
*/
|
|
95
|
-
export async function runPipeline(ctx, provider, config, onProgress, incrementalContext, onDebug) {
|
|
97
|
+
export async function runPipeline(ctx, provider, config, onProgress, incrementalContext, onDebug, projectRoot) {
|
|
96
98
|
const agentResults = {};
|
|
97
99
|
const agentMeta = [];
|
|
98
100
|
const skippedAgents = [];
|
|
101
|
+
const sessionId = `archbyte-${Date.now()}`;
|
|
102
|
+
const sessionRuns = [];
|
|
99
103
|
// Pass incremental context to agents via priorResults
|
|
100
104
|
if (incrementalContext) {
|
|
101
105
|
agentResults["__incremental__"] = incrementalContext;
|
|
102
106
|
}
|
|
107
|
+
// Helper: record an agent run for session observability
|
|
108
|
+
function recordRun(agent, result, status, error) {
|
|
109
|
+
const model = resolveModel(config.provider, agent.modelTier, config.modelOverrides, config.model);
|
|
110
|
+
const run = {
|
|
111
|
+
runId: `${agent.id}-${Date.now()}`,
|
|
112
|
+
sessionId,
|
|
113
|
+
phase: agent.id === "connection-mapper" || agent.id === "validator" ? "sequential" : "parallel",
|
|
114
|
+
passId: agent.id,
|
|
115
|
+
agent: agent.name,
|
|
116
|
+
model,
|
|
117
|
+
iteration: 1,
|
|
118
|
+
startedAt: result ? new Date(Date.now() - result.duration).toISOString() : new Date().toISOString(),
|
|
119
|
+
completedAt: new Date().toISOString(),
|
|
120
|
+
elapsedSeconds: result ? result.duration / 1000 : 0,
|
|
121
|
+
status,
|
|
122
|
+
error,
|
|
123
|
+
tokens: result?.tokenUsage ? { input: result.tokenUsage.input, output: result.tokenUsage.output } : undefined,
|
|
124
|
+
artifacts: result?.prompt || result?.rawOutput ? {
|
|
125
|
+
...(result.prompt ? { prompt: result.prompt } : {}),
|
|
126
|
+
...(result.rawOutput ? { output: result.rawOutput } : {}),
|
|
127
|
+
} : undefined,
|
|
128
|
+
};
|
|
129
|
+
sessionRuns.push(run);
|
|
130
|
+
}
|
|
103
131
|
// === Phase 1: Parallel agents ===
|
|
104
132
|
onProgress?.(`Phase 1: Running ${PARALLEL_AGENTS.length} agents in parallel...`);
|
|
105
133
|
// Pass agentResults to parallel agents too (contains __incremental__ if set)
|
|
@@ -123,17 +151,21 @@ export async function runPipeline(ctx, provider, config, onProgress, incremental
|
|
|
123
151
|
let authFailed = false;
|
|
124
152
|
for (let i = 0; i < parallelTasks.length; i++) {
|
|
125
153
|
const { agent, skipReason } = parallelTasks[i];
|
|
126
|
-
if (skipReason)
|
|
127
|
-
|
|
154
|
+
if (skipReason) {
|
|
155
|
+
recordRun(agent, null, "skipped");
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
128
158
|
const result = parallelResults[i];
|
|
129
159
|
if (result.status === "fulfilled" && result.value) {
|
|
130
160
|
agentResults[agent.id] = result.value.data;
|
|
131
161
|
agentMeta.push(result.value);
|
|
132
162
|
onProgress?.(` ${agent.name}: done (${(result.value.duration / 1000).toFixed(1)}s)`);
|
|
163
|
+
recordRun(agent, result.value, "success");
|
|
133
164
|
}
|
|
134
165
|
else {
|
|
135
166
|
const reason = result.status === "rejected" ? result.reason : "null response";
|
|
136
167
|
onProgress?.(` ${agent.name}: failed (${reason})`);
|
|
168
|
+
recordRun(agent, null, "error", String(reason));
|
|
137
169
|
if (result.status === "rejected" && isAuthError(result.reason)) {
|
|
138
170
|
authFailed = true;
|
|
139
171
|
}
|
|
@@ -153,6 +185,7 @@ export async function runPipeline(ctx, provider, config, onProgress, incremental
|
|
|
153
185
|
onProgress?.(` ${agent.name}: skipped (${skipReason})`);
|
|
154
186
|
const fallback = getFallbackData(agent.id, incrementalContext);
|
|
155
187
|
agentResults[agent.id] = fallback;
|
|
188
|
+
recordRun(agent, null, "skipped");
|
|
156
189
|
continue;
|
|
157
190
|
}
|
|
158
191
|
try {
|
|
@@ -161,13 +194,16 @@ export async function runPipeline(ctx, provider, config, onProgress, incremental
|
|
|
161
194
|
agentResults[agent.id] = result.data;
|
|
162
195
|
agentMeta.push(result);
|
|
163
196
|
onProgress?.(` ${agent.name}: done (${(result.duration / 1000).toFixed(1)}s)`);
|
|
197
|
+
recordRun(agent, result, "success");
|
|
164
198
|
}
|
|
165
199
|
else {
|
|
166
200
|
onProgress?.(` ${agent.name}: returned null`);
|
|
201
|
+
recordRun(agent, null, "error", "returned null");
|
|
167
202
|
}
|
|
168
203
|
}
|
|
169
204
|
catch (err) {
|
|
170
205
|
onProgress?.(` ${agent.name}: failed (${err instanceof Error ? err.message : String(err)})`);
|
|
206
|
+
recordRun(agent, null, "error", err instanceof Error ? err.message : String(err));
|
|
171
207
|
if (isAuthError(err)) {
|
|
172
208
|
throw new Error(`API key authentication failed. Check your API key with: archbyte config set api-key <your-key>\n` +
|
|
173
209
|
` Current provider: ${config.provider}. Get a valid key from your provider's dashboard.`);
|
|
@@ -204,6 +240,50 @@ export async function runPipeline(ctx, provider, config, onProgress, incremental
|
|
|
204
240
|
console.error();
|
|
205
241
|
onProgress?.(`Token usage: ${totalInput} in / ${totalOutput} out${skippedAgents.length > 0 ? ` (${skippedAgents.length} skipped)` : ""}`);
|
|
206
242
|
}
|
|
243
|
+
// === Write runs to .archbyte/runs/ (best-effort, fire-and-forget) ===
|
|
244
|
+
if (projectRoot) {
|
|
245
|
+
const sessionStartedAt = sessionRuns.length > 0
|
|
246
|
+
? sessionRuns.reduce((earliest, r) => r.startedAt < earliest ? r.startedAt : earliest, sessionRuns[0].startedAt)
|
|
247
|
+
: new Date().toISOString();
|
|
248
|
+
const sessionCompletedAt = new Date().toISOString();
|
|
249
|
+
const writeRuns = async () => {
|
|
250
|
+
const runsDir = path.join(projectRoot, ".archbyte", "runs");
|
|
251
|
+
for (const run of sessionRuns) {
|
|
252
|
+
const agentDir = path.join(runsDir, run.passId);
|
|
253
|
+
await mkdir(agentDir, { recursive: true });
|
|
254
|
+
// meta.json — AgentRun fields minus artifacts
|
|
255
|
+
const { artifacts, ...meta } = run;
|
|
256
|
+
await writeFile(path.join(agentDir, "meta.json"), JSON.stringify(meta, null, 2));
|
|
257
|
+
// prompt.md and output.md from artifacts
|
|
258
|
+
if (artifacts?.prompt) {
|
|
259
|
+
await writeFile(path.join(agentDir, "prompt.md"), artifacts.prompt);
|
|
260
|
+
}
|
|
261
|
+
if (artifacts?.output) {
|
|
262
|
+
await writeFile(path.join(agentDir, "output.md"), artifacts.output);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// session.json — lightweight summary
|
|
266
|
+
const successCount = sessionRuns.filter(r => r.status === "success").length;
|
|
267
|
+
const failedCount = sessionRuns.filter(r => r.status === "error").length;
|
|
268
|
+
const session = {
|
|
269
|
+
sessionId,
|
|
270
|
+
startedAt: sessionStartedAt,
|
|
271
|
+
completedAt: sessionCompletedAt,
|
|
272
|
+
status: failedCount > 0 ? "partial" : "success",
|
|
273
|
+
source: "archbyte",
|
|
274
|
+
mode: "pipeline",
|
|
275
|
+
totalRuns: sessionRuns.length,
|
|
276
|
+
successfulRuns: successCount,
|
|
277
|
+
failedRuns: failedCount,
|
|
278
|
+
totalTokens: { input: totalInput, output: totalOutput },
|
|
279
|
+
totalElapsedSeconds: sessionRuns.reduce((s, r) => s + (r.elapsedSeconds ?? 0), 0),
|
|
280
|
+
};
|
|
281
|
+
await writeFile(path.join(projectRoot, ".archbyte", "session.json"), JSON.stringify(session, null, 2));
|
|
282
|
+
};
|
|
283
|
+
writeRuns().catch((err) => {
|
|
284
|
+
console.error("[pipeline] Failed to write runs:", err);
|
|
285
|
+
});
|
|
286
|
+
}
|
|
207
287
|
return { ...merged, tokenUsage: { input: totalInput, output: totalOutput }, skippedAgents: skippedAgents.length > 0 ? skippedAgents : undefined };
|
|
208
288
|
}
|
|
209
289
|
// Agents that produce large structured output (lists of components/connections) need more tokens
|
|
@@ -248,5 +328,7 @@ async function runAgent(agent, ctx, provider, config, priorResults, onProgress,
|
|
|
248
328
|
data,
|
|
249
329
|
duration: Date.now() - start,
|
|
250
330
|
tokenUsage: { input: response.usage.inputTokens, output: response.usage.outputTokens },
|
|
331
|
+
prompt: system + "\n\n---\n\n" + user,
|
|
332
|
+
rawOutput: text,
|
|
251
333
|
};
|
|
252
334
|
}
|
|
@@ -6,3 +6,12 @@ registerPrompt("pipeline/connection-mapper", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMx
|
|
|
6
6
|
registerPrompt("pipeline/flow-detector", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMREyQcFystFxoAIgYKBywKXk97UiYeJxcASCUACh4nF1QGLh8OHSwQFwQ1GwwGYgkVETUXEQYxWVwIJAEQCSUcVBQ0FxYNMVVUFTQQTBs3G1hFNhcBAC0WHxZtUgYeJxcARSQfChw2HAYWaFxpSGJZMgozUgYJIRFORTpSEx0gFR0WKRcRRGIKAQcyEREBIBwGSWERCwksFxEJbVIXDSERGgotHQQRYgR+RWFSTkgyDBYJKAELDTBWBxAjAQAaKxsRF3tSAAcvCRsLJBwXSAs9B0VpGQYKIxtZBiABBkgxFQECMltpSGJZWUUiGgIGLBwYX2EXFQ0sDVsRLgIKC20IAQA0F0MGIxQRb2FSQ0ViDREGKRwMBC0eDV9hBgsNYgoEACIbBQEhWQAAIhoNBy4WExxhBxANJllcAG8VTURiWxETJBwXRScUHRE1FxFKbllWEiQQCwctElZMS3hRRmJTXgQxGzEHNw0RFmtYWUgDKT1FMx0WHCcKWwAvFhMHKxcAFmEWBhwnGgAAJVIFGi0UVAYuFgZIMhgAESQADRtsc1RFYTQMGmIcFQYpSEMTYgkVESleQwUnDRwKJV5DACMXEAkkACUBLhxUGEt4IDoLLT0mAD5ZSA0XGBxhAAYYLQsARSQEBgY2WRcKLxwGCzYQGwsyUgIGJlkGCjQGBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUxAAweKx0RAWERDAwnWQcELAIPDTFVVBY1ExcBIVkHBiAcDQ0wWQYAMgcPHDFVVAozUicHIRIRF2EBBho0EBcAMlxDISRZAA0kUhAcIw0dBmEBAAksFxEXYQECETFZVisuUgYeJxcASCUACh4nF1QVIAYXDTAXB0UlFxcNIQ0RAWNeQxonDQEXL1IGBTINDUUkBAYGNjobCy8XABwrFhoWb1InB2I3OzFhGw0eJxcARTETFxwnCxoWYQYLCTZZFRckUg0HNlkREygWBgYhHBBFKBxDHCocVAwvAhYcbHN+NyQBEwcsHVQSKAYLSA03ODxhE0MiETY6RS4QCQ0hDU5vOnhDSGAcAgAvBiAHLBcRBjUbDAYxW05FGlxNRh9VfkVhUAIYKysbEDUXEEp4WS9Lb1w+Yj9zfiwnUg0HYgkVETUXEQYxWRIKNBwHRGILERE0AA1IJxQEEThSAhowGA0Wbw==");
|
|
7
7
|
registerPrompt("pipeline/service-describer", "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");
|
|
8
8
|
registerPrompt("pipeline/validator", "GB0WSCMLEUUgUhAHJA0DBDMXQwkwGhwMNRcAHDcLEUUzFxUBJw4RF29SNQkuEBAENRdDHCocVAQvEw8RMRAHRTMXEB0uDQdFIBwHSDEMEwIkARdIIRYGFyQRFwEtFwdLS3ggACcaH0UnHRFSSEhaRWtYNBotFxNFIh0OGC0XEQs1UhcRMhwHT2tIQw1sHlpJYRNDOicYFxFhExMYYg0NFSQWQwkxWVYWJAAVASEcVkUyGgwdLh1UByRSQQ4wFhoRJBwHSkhLWkVrWDQNIxJUASQBABorCQAMLhwQQmhDVCYuHxMHLBwaETJSFAE2EVQALAIXEWIWBkU0HAAEJxgGRSUXEAswEAQRKB0NG2Kb9PFhAhEHNBAQAGEQBhw2HAZFLhwGG0hKWkVrWDENJgwaASAcF0ghFhoLJBEXAS0XB09rSEMsNwkYDCITFw1iFgZFNBwNDSEcBxYgABpIIRYaCyQRFwEtFwdFNRoCHGIKHAo0HgdIIBxUFyQfDB4nHX5Rb1JJQhULGwsmUgAHLBcRBjUbDAZiDQ0VJAFJQnhZEUsmXE9IIxdUDCwCDBo2WRcKLxwGCzYQGwthBgsJNlkHDS4HDwxiGxFFYxoXHDJbfm8CICo8Czo1KWExLCYRLSYkCDw3O3hzWUUYHRZILxgNRQ48LzFiCxEDJAAGBiEcVAYuHxMHLBwaEWE7JxtiDRwENVICBDAcFQE4UgYQKwoARSgcQxwqHFQGLh8TBywcGhEyUg8BMQ1UBCMdFQ1sc1lFBR1DJg0tVAwvBAYGNlkaADZSAAcvCRsLJBwXG25ZEAQ1EwEJMRwHSWEdEUgnAQAAMxwCBGIKERc3GwANMVd+SGE2DEgMNiBFIBYHSCEWGgskERcBLRcHRTUdQwstFAQKLxcNHDFZAA0gBkMMLRdTEWEXGwExDVQML1IXACdZGAwyBk1ib1k7Cy0LQwkmHVQGLhwNDSENHQovAUMRLQxUBDMXQwArHhwJOFIABywfHQEkHBdIIxsbEDVSAQkxHBBFLhxDHCocVAYuHxMHLBwaEWECAhwqClhFNRcAACwWGAomGwYbblkVCyVSBhArCgAMLxVDCy0XGgAiBgoHLApab2xSMxonHxEXYQAGBS0PHQsmUgEJJlkXCi8cBgs2EBsLMlIMHicLVAQlFgoGJVkHFSQRFgQjDR0TJFIMBicKWm9sUioOYg0cAGETDQkuAAcMMlIPBy0SB0UzFwIbLRcVBy0XT0gwHAAQMxxDDS8JABxhEQwaMBwXESgdDRtsWTgAMgFDATFZGQozF01iSCsRFjEdDQxiDh0RKVIsJg4gVARhODAnDFkbBysXABx4cw9vYVJBCy0UBAovFw0cFgAEAAIdERonGgAMLhwQSnhZD0VjEQwFMhYaAC8GTgEmW05FYxEMGjAcFxFsBhoYJ1tUGG14Q0hgGhsIMR0NDSwNMAAyEREBMg0dCi8BQVJiAlRHIh0OGC0XEQs1XwoMYENURyMXFxwnC1QBJAEAGisJAAwuHEFIP1V+RWFQAgwmHBAmLhwNDSENHQovAUFSYiIPRWMUEQcvW05FYxsHSm5ZVhEuUFlIYBAQR21SQRw7CRFHHF5pSGJbFwovFAoMJxcXAGNIQ1hsQUFJS1JDSisKBxAkAUFSYiJWASQBABorCQAMLhxDByRZFQs4UhENLxgdCygcBEgrCgcQJAFBNUgEfm8UAQZIJxQEEThSDAooHBcRMl0CGjAYDRZhGwVILBZUBi4AEQ0hDR0KLwFDBiccEAAlXEM8KhxUBi4cBQEmHBoGJFIQCy0LEUVpQk5Za1kGACceBgs2ClQcLgcRSC0PERcgHg9IIRYaAygWBgYhHFQML1IXACdZFQsgHhobKwpUFDQTDwE2AFo=");
|
|
9
|
+
// Premium agent prompts
|
|
10
|
+
registerPrompt("premium/security-auditor", "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");
|
|
11
|
+
registerPrompt("premium/compliance-checker", "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");
|
|
12
|
+
registerPrompt("premium/performance-analyzer", "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");
|
|
13
|
+
registerPrompt("premium/dependency-risk-scorer", "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");
|
|
14
|
+
registerPrompt("premium/migration-planner", "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");
|
|
15
|
+
registerPrompt("premium/api-contract-verifier", "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");
|
|
16
|
+
registerPrompt("premium/infra-agent-auditor", "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");
|
|
17
|
+
registerPrompt("premium/drift-detector", "GB0WSCMLEUUgUgcaKx8ARSUXFw0hDRsXYRMEDSwNVAMuAEMpMBocJzgGBkRiEBAALwYKDjsQGgJhExELKhAAACIGFhojFVQBMxsFHGIbERE2FwYGYh0bBjQfBgY2HBBFKBwXDSwNVAQvFkMJIQ0BBC1SCgUyFREIJBwXCTYQGwtveGkxLQwGRTUTEANiEAdFNR1DDCcNEQY1UgIaIREdESQRFx0wGBhFJQAKDjZDfm9wXENCaD0bBjQfBgY2GAAMLhxDHjFZPQgxHgYFJxcABDUbDAZoU05FAh0OGCMLEUU2GgIcYh0bBjQfBgY2GAAMLhxDGyMAB0U1GgZIIwsXDSgGBgs2DAYAYQELBzcVEEUjF0NAEDw1IQw3T0gDKzctCCYmKxYsJiBvHwdEYh0RFigVDUgmFhcWbVIiLBAKXUU2GxcAYg4cBDVSFwAnWRcKJRdDCSENAQQtHhpIKxQECSQfBgY2ClpFDR0MA2IfGxd7eENIYlRUIS4RFgUnFwAAJVIABy8JGwskHBcbYg0cBDVSDQdiFRsLJhcRSCcBHRY1eENIYlRULCwCDw0vHBoRJBZDCy0UBAovFw0cMVkaCjVSDg0sDR0KLxcHSCsXVAEuERBiYllUSGE2BhshCx0HJBZDASwNERcgERcBLRcHRTUaAhxiHR0DJxcRSCQLGwhhEwAcNxgYRSIdBw1iCRURKQFpSGJZWUUOBxcMIw0RAWEGBgsqFxsJLhUaSDAcEgAzFw0LJwpUDC9SBwchCn5vc1xDQmg6GwsnGwQdMBgADC4cQx4xWSYAIB4KHDtTXl9hMQwFMhgGAGERDAYkEBMQMxMXAS0XVAMoHgYbYlEwCiIZBhpiOhsIMR0QDW5ZP10yUg4JLBASADIGEERiOj1KAjZDCy0XEgwmAU9IIwsXDSMLFw1sABUILVtDHysNHEUgERcdIxVUFTMdCQ0hDVQWNQAWCzYMBgBvUiAAJxofRScdEVJIWVRFbFIwDTAPHQYkAUMMJx8dCyQWQwEsWTAKIhkGGmI6GwgxHRANYhsBEWEfChsxEBoCYRQRBy9ZFwolFwEJMRx+RWFSTkgHFwIMMx0NBScXAEU3ExEBIxsYADJSEQ0kHAYALxEGDGIbARFhHAYeJwtUASQUCgYnHX5FYVJOSAAMHQklUhcJMB4RETJSFwAjDVQXJBQGGicXFwBhHAwGbxwMDDIGBgY2WQQENRoQYmJZVEhhMSpHAT1UFSgCBgQrFxEWYQYGGzYQGgJhHwwMNxURFmEGCwk2WRwENxdDCiccGkUzFw4HNBwQb0tBTUhoUz0LNRcNDCcdVCcuBw0MIwsdADJSFRtiOBcRNBMPSAYcBAAvFgYGIRARFmtYWUgBEREGKlIKDmIYBgYpGxcNIQ0BFyAeQwotDBoBIAAKDTFZFRckUgENKxcTRTMXEBgnGgAAJUhpSGJZWUUNExoNMFkCDC4eAhwrFhoWYVoGRiVXWEUUO0MMKwsRBjUeGkgrFAQKMwYKBiVZEAQ1EwEJMRxUCC4WFgQnCl1vYVJDRWI6HRciBw8JMFkQADEXDQwnFxcMJAFDCicNAwAkHEMFLR0BCSQBaUhiWVlFAgAMGzFUGQolBw8NYhAZFS4AFxtiDRwENVIVAS0VFREkUgoGNhwaASQWQwExFhgENRsMBkhZVEVsUjAAIwsRAWEBFwk2HFQKM1IEBC0bFQlhAQoGJRURES4cEEggCxEEKhsND2IcGgYgAhAdLhgADC4caWJ2V1RPazYGCSZZNwolF0NOYiwaEDIXB0gHAQQKMwYQQmhDVCwlFw0cKx8NRSIdBw1iDRwENVICGDIcFRcyUhcHYhsRRTQcFhsnHU5vYVJDRWI8DBUuABcNJlkSEC8RFwEtFwdKIh4CGzEcB0UvFxUNMFkdCDEdERwnHVQALQEGHyocBgBLUkNIb1kmCjQGBkgqGBoBLRcRG2IfGxdhFgYYMBwXBDUXB0gnFxAVLhsNHDFzVEVhX0MuJxgAEDMXQw4uGBMWYRQMGmIaGwgxHgYcJx1UCjNSAgojFxAKLxcHSCQcFRE0AAYbSFlURWxSNycGNlsjCCouLWIaGwgsFw0cMVkdCyUbAAk2EBoCYQcNDisXHRYpFwdINRYGDkt4MQ0xCRsLJVIUATYRVARhODAnDFkbBysXABx4cw9vYVJBDDAQEhEyUFlIGXNURWFSGGJiWVRFYVJBGycPERcoBhpKeFlWDSgVCxQvHBAMNB8fBC0OVklLUkNIYllURyITFw0lFgYcY0hDSiYWF0goHxMEJxQRCzUTFwEtFwgGLhwFASVUBgAgHgocOwUWCjQcBwkwAFkTKB0PCTYQGws9FgYJJlQXCiUXQURIWVRFYVJDSjYQAAkkUFlIYCocCjMGQxwrDRgAY15pSGJZVEVhUAcNMRoGDDEGCgcsW05FYzYGHCMQGAAlUgcNMRoGDDEGCgcsWRsDYQYLDWIdBgwnBkFESFlURWFSQ0onAQQAIgYGDGBDVEcWGgIcYg4VFmEWDAs3FBELNRcHRysXAAAvFgYMYFV+RWFSQ0hiWxUGNQcCBGBDVEcWGgIcYg4VFmEUDB0sHVZJS1JDSGJZVEcnGw8NMVtORRpQAg4kHBcRJBZDDisVERZjL2lIYllUGEtSQzVuc1RFYxAMHSwdFRc4JAoHLhgADC4cEEp4WS9vYVJDSDlzVEVhUkNIYB8GCixQWUhgChsQMxEGSC8WEBAtF0wEIwARF2NeaUhiWVRFYVAXB2BDVEc1ExEPJw1UCC4WFgQnVhgEOBcRSm5zVEVhUkNIYB8dCSRQWUhgHx0JJFIUATYRVBMoHQ8JNhAbC2NeaUhiWVRFYVAKBTIWBhERExcAYENURzUaBkgyCxsHLRcOCTYQF0UoHxMHMA1Wb2FSQ0g/c1RFHF5pSGJbHAAgHhcAERobFyRQWUhyV0RIcFxTREhZVEcyBw4FIwsNR3tSQSc0HAYELR5DDDAQEhFhExAbJwoHCCQcF0pIBH4=");
|