@promptwheel/core 0.6.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/dist/codebase-index/index.d.ts +23 -0
- package/dist/codebase-index/index.d.ts.map +1 -0
- package/dist/codebase-index/index.js +361 -0
- package/dist/codebase-index/index.js.map +1 -0
- package/dist/codebase-index/shared.d.ts +95 -0
- package/dist/codebase-index/shared.d.ts.map +1 -0
- package/dist/codebase-index/shared.js +319 -0
- package/dist/codebase-index/shared.js.map +1 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +79 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/critic/shared.d.ts +49 -0
- package/dist/critic/shared.d.ts.map +1 -0
- package/dist/critic/shared.js +204 -0
- package/dist/critic/shared.js.map +1 -0
- package/dist/db/adapter.d.ts +191 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +40 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/contract.d.ts +47 -0
- package/dist/db/contract.d.ts.map +1 -0
- package/dist/db/contract.js +258 -0
- package/dist/db/contract.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/dedup/shared.d.ts +82 -0
- package/dist/dedup/shared.d.ts.map +1 -0
- package/dist/dedup/shared.js +215 -0
- package/dist/dedup/shared.js.map +1 -0
- package/dist/exec/index.d.ts +5 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/exec/types.d.ts +64 -0
- package/dist/exec/types.d.ts.map +1 -0
- package/dist/exec/types.js +8 -0
- package/dist/exec/types.js.map +1 -0
- package/dist/formulas/shared.d.ts +42 -0
- package/dist/formulas/shared.d.ts.map +1 -0
- package/dist/formulas/shared.js +204 -0
- package/dist/formulas/shared.js.map +1 -0
- package/dist/guidelines/shared.d.ts +46 -0
- package/dist/guidelines/shared.d.ts.map +1 -0
- package/dist/guidelines/shared.js +128 -0
- package/dist/guidelines/shared.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/learnings/shared.d.ts +112 -0
- package/dist/learnings/shared.d.ts.map +1 -0
- package/dist/learnings/shared.js +402 -0
- package/dist/learnings/shared.js.map +1 -0
- package/dist/proposals/shared.d.ts +137 -0
- package/dist/proposals/shared.d.ts.map +1 -0
- package/dist/proposals/shared.js +254 -0
- package/dist/proposals/shared.js.map +1 -0
- package/dist/repos/index.d.ts +15 -0
- package/dist/repos/index.d.ts.map +1 -0
- package/dist/repos/index.js +11 -0
- package/dist/repos/index.js.map +1 -0
- package/dist/repos/projects.d.ts +41 -0
- package/dist/repos/projects.d.ts.map +1 -0
- package/dist/repos/projects.js +75 -0
- package/dist/repos/projects.js.map +1 -0
- package/dist/repos/run_steps.d.ts +152 -0
- package/dist/repos/run_steps.d.ts.map +1 -0
- package/dist/repos/run_steps.js +328 -0
- package/dist/repos/run_steps.js.map +1 -0
- package/dist/repos/runs.d.ts +92 -0
- package/dist/repos/runs.d.ts.map +1 -0
- package/dist/repos/runs.js +185 -0
- package/dist/repos/runs.js.map +1 -0
- package/dist/repos/tickets.d.ts +71 -0
- package/dist/repos/tickets.d.ts.map +1 -0
- package/dist/repos/tickets.js +158 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scope/shared.d.ts +67 -0
- package/dist/scope/shared.d.ts.map +1 -0
- package/dist/scope/shared.js +355 -0
- package/dist/scope/shared.js.map +1 -0
- package/dist/scout/index.d.ts +18 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +445 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/kimi-runner.d.ts +21 -0
- package/dist/scout/kimi-runner.d.ts.map +1 -0
- package/dist/scout/kimi-runner.js +76 -0
- package/dist/scout/kimi-runner.js.map +1 -0
- package/dist/scout/mcp-batch-server.d.ts +37 -0
- package/dist/scout/mcp-batch-server.d.ts.map +1 -0
- package/dist/scout/mcp-batch-server.js +144 -0
- package/dist/scout/mcp-batch-server.js.map +1 -0
- package/dist/scout/openai-local-runner.d.ts +20 -0
- package/dist/scout/openai-local-runner.d.ts.map +1 -0
- package/dist/scout/openai-local-runner.js +82 -0
- package/dist/scout/openai-local-runner.js.map +1 -0
- package/dist/scout/prompt.d.ts +49 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +153 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +101 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +521 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +61 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +315 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +221 -0
- package/dist/scout/types.d.ts.map +1 -0
- package/dist/scout/types.js +44 -0
- package/dist/scout/types.js.map +1 -0
- package/dist/sectors/shared.d.ts +146 -0
- package/dist/sectors/shared.d.ts.map +1 -0
- package/dist/sectors/shared.js +408 -0
- package/dist/sectors/shared.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/qa.d.ts +76 -0
- package/dist/services/qa.d.ts.map +1 -0
- package/dist/services/qa.js +228 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +164 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +215 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/spindle/shared.d.ts +14 -0
- package/dist/spindle/shared.d.ts.map +1 -0
- package/dist/spindle/shared.js +65 -0
- package/dist/spindle/shared.js.map +1 -0
- package/dist/tools/shared.d.ts +35 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +247 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/trace/shared.d.ts +147 -0
- package/dist/trace/shared.d.ts.map +1 -0
- package/dist/trace/shared.js +414 -0
- package/dist/trace/shared.js.map +1 -0
- package/dist/trajectory/shared.d.ts +69 -0
- package/dist/trajectory/shared.d.ts.map +1 -0
- package/dist/trajectory/shared.js +336 -0
- package/dist/trajectory/shared.js.map +1 -0
- package/dist/utils/id.d.ts +12 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.test.d.ts +5 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +173 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +9 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +19 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/waves/shared.d.ts +106 -0
- package/dist/waves/shared.d.ts.map +1 -0
- package/dist/waves/shared.js +356 -0
- package/dist/waves/shared.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Trace Analysis — pure functions, no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Parses Claude Code `--output-format stream-json` JSONL output and extracts:
|
|
5
|
+
* 1. Compaction events (context limit hits)
|
|
6
|
+
* 2. Per-tool-call token profiles
|
|
7
|
+
* 3. Liveness / stall detection
|
|
8
|
+
* 4. Semantic step decomposition
|
|
9
|
+
* 5. Configurable trigger/alert evaluation
|
|
10
|
+
*
|
|
11
|
+
* Shared by @promptwheel/cli and @promptwheel/mcp.
|
|
12
|
+
*/
|
|
13
|
+
export interface StreamJsonEvent {
|
|
14
|
+
type: 'assistant' | 'system' | 'result';
|
|
15
|
+
subtype?: string;
|
|
16
|
+
message?: {
|
|
17
|
+
role: string;
|
|
18
|
+
content: ContentBlock[];
|
|
19
|
+
usage?: {
|
|
20
|
+
input_tokens: number;
|
|
21
|
+
output_tokens: number;
|
|
22
|
+
};
|
|
23
|
+
model?: string;
|
|
24
|
+
};
|
|
25
|
+
result?: {
|
|
26
|
+
cost_usd?: number;
|
|
27
|
+
duration_ms?: number;
|
|
28
|
+
is_error?: boolean;
|
|
29
|
+
num_turns?: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export type ContentBlock = {
|
|
33
|
+
type: 'thinking';
|
|
34
|
+
thinking: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'tool_use';
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
input: Record<string, unknown>;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'tool_result';
|
|
42
|
+
tool_use_id: string;
|
|
43
|
+
content: string;
|
|
44
|
+
is_error?: boolean;
|
|
45
|
+
} | {
|
|
46
|
+
type: 'text';
|
|
47
|
+
text: string;
|
|
48
|
+
};
|
|
49
|
+
export interface CompactionEvent {
|
|
50
|
+
timestamp_ms: number;
|
|
51
|
+
event_index: number;
|
|
52
|
+
tokens_before?: number;
|
|
53
|
+
tokens_after?: number;
|
|
54
|
+
}
|
|
55
|
+
export interface ToolTokenProfile {
|
|
56
|
+
tool_name: string;
|
|
57
|
+
call_count: number;
|
|
58
|
+
total_input_tokens: number;
|
|
59
|
+
total_output_tokens: number;
|
|
60
|
+
avg_input_tokens: number;
|
|
61
|
+
avg_output_tokens: number;
|
|
62
|
+
error_count: number;
|
|
63
|
+
}
|
|
64
|
+
export interface LivenessSnapshot {
|
|
65
|
+
total_duration_ms: number;
|
|
66
|
+
event_count: number;
|
|
67
|
+
avg_gap_ms: number;
|
|
68
|
+
max_gap_ms: number;
|
|
69
|
+
stall_periods: {
|
|
70
|
+
start_ms: number;
|
|
71
|
+
end_ms: number;
|
|
72
|
+
duration_ms: number;
|
|
73
|
+
}[];
|
|
74
|
+
/** Fraction of total time with gaps > 10s (0-1) */
|
|
75
|
+
idle_ratio: number;
|
|
76
|
+
}
|
|
77
|
+
export interface SemanticStep {
|
|
78
|
+
label: string;
|
|
79
|
+
tool_calls: string[];
|
|
80
|
+
start_index: number;
|
|
81
|
+
end_index: number;
|
|
82
|
+
duration_ms?: number;
|
|
83
|
+
}
|
|
84
|
+
export interface TriggerRule {
|
|
85
|
+
id: string;
|
|
86
|
+
name: string;
|
|
87
|
+
condition: TriggerCondition;
|
|
88
|
+
action: 'warn' | 'abort' | 'log';
|
|
89
|
+
message?: string;
|
|
90
|
+
}
|
|
91
|
+
export type TriggerCondition = {
|
|
92
|
+
type: 'token_threshold';
|
|
93
|
+
threshold: number;
|
|
94
|
+
} | {
|
|
95
|
+
type: 'compaction_count';
|
|
96
|
+
threshold: number;
|
|
97
|
+
} | {
|
|
98
|
+
type: 'error_pattern';
|
|
99
|
+
pattern: string;
|
|
100
|
+
} | {
|
|
101
|
+
type: 'stall_duration_ms';
|
|
102
|
+
threshold: number;
|
|
103
|
+
} | {
|
|
104
|
+
type: 'tool_error_rate';
|
|
105
|
+
tool: string;
|
|
106
|
+
threshold: number;
|
|
107
|
+
};
|
|
108
|
+
export interface TriggerAlert {
|
|
109
|
+
rule_id: string;
|
|
110
|
+
rule_name: string;
|
|
111
|
+
action: 'warn' | 'abort' | 'log';
|
|
112
|
+
message: string;
|
|
113
|
+
timestamp_ms: number;
|
|
114
|
+
}
|
|
115
|
+
export interface TraceAnalysis {
|
|
116
|
+
compactions: CompactionEvent[];
|
|
117
|
+
tool_profiles: ToolTokenProfile[];
|
|
118
|
+
liveness: LivenessSnapshot;
|
|
119
|
+
steps: SemanticStep[];
|
|
120
|
+
alerts: TriggerAlert[];
|
|
121
|
+
total_input_tokens: number;
|
|
122
|
+
total_output_tokens: number;
|
|
123
|
+
total_cost_usd?: number;
|
|
124
|
+
model?: string;
|
|
125
|
+
is_stream_json: boolean;
|
|
126
|
+
}
|
|
127
|
+
/** Parse a single JSONL line into a StreamJsonEvent, or null if invalid. */
|
|
128
|
+
export declare function parseStreamJsonLine(line: string): StreamJsonEvent | null;
|
|
129
|
+
/** Parse raw multi-line output into an array of StreamJsonEvents. */
|
|
130
|
+
export declare function parseStreamJson(rawOutput: string): StreamJsonEvent[];
|
|
131
|
+
/** Check if the first line of output looks like stream-json. */
|
|
132
|
+
export declare function isStreamJsonOutput(firstLine: string): boolean;
|
|
133
|
+
/** Reconstruct plain text from JSONL events for backward compat with spindle/detectPhase. */
|
|
134
|
+
export declare function reconstructText(events: StreamJsonEvent[]): string;
|
|
135
|
+
/** Extract compaction events from stream-json output. */
|
|
136
|
+
export declare function detectCompactions(events: StreamJsonEvent[]): CompactionEvent[];
|
|
137
|
+
/** Build per-tool token usage profiles from stream-json events. */
|
|
138
|
+
export declare function buildToolProfiles(events: StreamJsonEvent[]): ToolTokenProfile[];
|
|
139
|
+
/** Compute liveness metrics from event timestamps. */
|
|
140
|
+
export declare function computeLiveness(events: StreamJsonEvent[], timestamps: number[]): LivenessSnapshot;
|
|
141
|
+
/** Group raw tool calls into semantic steps. */
|
|
142
|
+
export declare function decomposeSteps(events: StreamJsonEvent[]): SemanticStep[];
|
|
143
|
+
/** Evaluate trigger rules against a trace analysis. */
|
|
144
|
+
export declare function evaluateTriggers(analysis: Omit<TraceAnalysis, 'alerts'>, rules: TriggerRule[]): TriggerAlert[];
|
|
145
|
+
/** Run full trace analysis on raw output. Falls back gracefully for plain text. */
|
|
146
|
+
export declare function analyzeTrace(rawOutput: string, triggerRules?: TriggerRule[]): TraceAnalysis;
|
|
147
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/trace/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Trace Analysis — pure functions, no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Parses Claude Code `--output-format stream-json` JSONL output and extracts:
|
|
5
|
+
* 1. Compaction events (context limit hits)
|
|
6
|
+
* 2. Per-tool-call token profiles
|
|
7
|
+
* 3. Liveness / stall detection
|
|
8
|
+
* 4. Semantic step decomposition
|
|
9
|
+
* 5. Configurable trigger/alert evaluation
|
|
10
|
+
*
|
|
11
|
+
* Shared by @promptwheel/cli and @promptwheel/mcp.
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Parsing
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Parse a single JSONL line into a StreamJsonEvent, or null if invalid. */
|
|
17
|
+
export function parseStreamJsonLine(line) {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (!trimmed || trimmed[0] !== '{')
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
const obj = JSON.parse(trimmed);
|
|
23
|
+
if (typeof obj.type === 'string' && (obj.type === 'assistant' || obj.type === 'system' || obj.type === 'result')) {
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Parse raw multi-line output into an array of StreamJsonEvents. */
|
|
33
|
+
export function parseStreamJson(rawOutput) {
|
|
34
|
+
if (!rawOutput)
|
|
35
|
+
return [];
|
|
36
|
+
const lines = rawOutput.split('\n');
|
|
37
|
+
const events = [];
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
const evt = parseStreamJsonLine(line);
|
|
40
|
+
if (evt)
|
|
41
|
+
events.push(evt);
|
|
42
|
+
}
|
|
43
|
+
return events;
|
|
44
|
+
}
|
|
45
|
+
/** Check if the first line of output looks like stream-json. */
|
|
46
|
+
export function isStreamJsonOutput(firstLine) {
|
|
47
|
+
const trimmed = firstLine.trim();
|
|
48
|
+
if (!trimmed || trimmed[0] !== '{')
|
|
49
|
+
return false;
|
|
50
|
+
try {
|
|
51
|
+
const obj = JSON.parse(trimmed);
|
|
52
|
+
return typeof obj.type === 'string' && (obj.type === 'assistant' || obj.type === 'system' || obj.type === 'result');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Reconstruct plain text from JSONL events for backward compat with spindle/detectPhase. */
|
|
59
|
+
export function reconstructText(events) {
|
|
60
|
+
const parts = [];
|
|
61
|
+
for (const evt of events) {
|
|
62
|
+
if (evt.message?.content) {
|
|
63
|
+
for (const block of evt.message.content) {
|
|
64
|
+
if (block.type === 'text') {
|
|
65
|
+
parts.push(block.text);
|
|
66
|
+
}
|
|
67
|
+
else if (block.type === 'tool_result') {
|
|
68
|
+
parts.push(block.content);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return parts.join('\n');
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Feature 1: Compaction Detection
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
/** Extract compaction events from stream-json output. */
|
|
79
|
+
export function detectCompactions(events) {
|
|
80
|
+
const compactions = [];
|
|
81
|
+
for (let i = 0; i < events.length; i++) {
|
|
82
|
+
const evt = events[i];
|
|
83
|
+
if (evt.type === 'system' && evt.subtype === 'compaction') {
|
|
84
|
+
const ce = {
|
|
85
|
+
timestamp_ms: Date.now(),
|
|
86
|
+
event_index: i,
|
|
87
|
+
};
|
|
88
|
+
// Extract token counts from the message if available
|
|
89
|
+
if (evt.message?.usage) {
|
|
90
|
+
ce.tokens_after = evt.message.usage.input_tokens;
|
|
91
|
+
}
|
|
92
|
+
// Look at previous assistant message for tokens_before
|
|
93
|
+
if (i > 0 && events[i - 1].message?.usage) {
|
|
94
|
+
ce.tokens_before = events[i - 1].message.usage.input_tokens + events[i - 1].message.usage.output_tokens;
|
|
95
|
+
}
|
|
96
|
+
compactions.push(ce);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return compactions;
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Feature 2: Per-Tool-Call Token Profiles
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/** Build per-tool token usage profiles from stream-json events. */
|
|
105
|
+
export function buildToolProfiles(events) {
|
|
106
|
+
const profileMap = new Map();
|
|
107
|
+
// Track tool_use IDs to their tool names for matching with tool_results
|
|
108
|
+
const toolUseMap = new Map();
|
|
109
|
+
// Track cumulative token usage so we can compute deltas
|
|
110
|
+
let prevCumulativeInput = 0;
|
|
111
|
+
let prevCumulativeOutput = 0;
|
|
112
|
+
for (const evt of events) {
|
|
113
|
+
if (!evt.message?.content)
|
|
114
|
+
continue;
|
|
115
|
+
// Update cumulative tokens from this message's usage
|
|
116
|
+
const msgInputTokens = evt.message.usage?.input_tokens ?? 0;
|
|
117
|
+
const msgOutputTokens = evt.message.usage?.output_tokens ?? 0;
|
|
118
|
+
// Compute delta for this message
|
|
119
|
+
const inputDelta = msgInputTokens > prevCumulativeInput
|
|
120
|
+
? msgInputTokens - prevCumulativeInput : 0;
|
|
121
|
+
const outputDelta = msgOutputTokens > prevCumulativeOutput
|
|
122
|
+
? msgOutputTokens - prevCumulativeOutput : 0;
|
|
123
|
+
if (msgInputTokens > 0)
|
|
124
|
+
prevCumulativeInput = msgInputTokens;
|
|
125
|
+
if (msgOutputTokens > 0)
|
|
126
|
+
prevCumulativeOutput = msgOutputTokens;
|
|
127
|
+
// Count tool_use blocks and map their IDs
|
|
128
|
+
const toolUseBlocks = [];
|
|
129
|
+
for (const block of evt.message.content) {
|
|
130
|
+
if (block.type === 'tool_use') {
|
|
131
|
+
toolUseMap.set(block.id, block.name);
|
|
132
|
+
toolUseBlocks.push(block.name);
|
|
133
|
+
const p = profileMap.get(block.name) ?? { call_count: 0, total_input: 0, total_output: 0, error_count: 0 };
|
|
134
|
+
p.call_count++;
|
|
135
|
+
profileMap.set(block.name, p);
|
|
136
|
+
}
|
|
137
|
+
else if (block.type === 'tool_result') {
|
|
138
|
+
const toolName = toolUseMap.get(block.tool_use_id);
|
|
139
|
+
if (toolName && block.is_error) {
|
|
140
|
+
const p = profileMap.get(toolName);
|
|
141
|
+
if (p)
|
|
142
|
+
p.error_count++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Distribute token delta across tool_use blocks in this message
|
|
147
|
+
if (toolUseBlocks.length > 0 && (inputDelta > 0 || outputDelta > 0)) {
|
|
148
|
+
const perToolInput = Math.floor(inputDelta / toolUseBlocks.length);
|
|
149
|
+
const perToolOutput = Math.floor(outputDelta / toolUseBlocks.length);
|
|
150
|
+
for (const name of toolUseBlocks) {
|
|
151
|
+
const p = profileMap.get(name);
|
|
152
|
+
p.total_input += perToolInput;
|
|
153
|
+
p.total_output += perToolOutput;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Build sorted result
|
|
158
|
+
const profiles = [];
|
|
159
|
+
for (const [name, p] of profileMap) {
|
|
160
|
+
profiles.push({
|
|
161
|
+
tool_name: name,
|
|
162
|
+
call_count: p.call_count,
|
|
163
|
+
total_input_tokens: p.total_input,
|
|
164
|
+
total_output_tokens: p.total_output,
|
|
165
|
+
avg_input_tokens: p.call_count > 0 ? Math.round(p.total_input / p.call_count) : 0,
|
|
166
|
+
avg_output_tokens: p.call_count > 0 ? Math.round(p.total_output / p.call_count) : 0,
|
|
167
|
+
error_count: p.error_count,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Sort by total tokens descending
|
|
171
|
+
profiles.sort((a, b) => (b.total_input_tokens + b.total_output_tokens) - (a.total_input_tokens + a.total_output_tokens));
|
|
172
|
+
return profiles;
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// Feature 3: Liveness Detection
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
const STALL_THRESHOLD_MS = 30_000;
|
|
178
|
+
const IDLE_THRESHOLD_MS = 10_000;
|
|
179
|
+
/** Compute liveness metrics from event timestamps. */
|
|
180
|
+
export function computeLiveness(events, timestamps) {
|
|
181
|
+
if (timestamps.length <= 1) {
|
|
182
|
+
return {
|
|
183
|
+
total_duration_ms: 0,
|
|
184
|
+
event_count: timestamps.length,
|
|
185
|
+
avg_gap_ms: 0,
|
|
186
|
+
max_gap_ms: 0,
|
|
187
|
+
stall_periods: [],
|
|
188
|
+
idle_ratio: 0,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const totalDuration = timestamps[timestamps.length - 1] - timestamps[0];
|
|
192
|
+
const gaps = [];
|
|
193
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
194
|
+
gaps.push(timestamps[i] - timestamps[i - 1]);
|
|
195
|
+
}
|
|
196
|
+
const maxGap = Math.max(...gaps);
|
|
197
|
+
const avgGap = gaps.reduce((sum, g) => sum + g, 0) / gaps.length;
|
|
198
|
+
const stallPeriods = [];
|
|
199
|
+
let idleTime = 0;
|
|
200
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
201
|
+
const gap = timestamps[i] - timestamps[i - 1];
|
|
202
|
+
if (gap >= STALL_THRESHOLD_MS) {
|
|
203
|
+
stallPeriods.push({
|
|
204
|
+
start_ms: timestamps[i - 1],
|
|
205
|
+
end_ms: timestamps[i],
|
|
206
|
+
duration_ms: gap,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (gap >= IDLE_THRESHOLD_MS) {
|
|
210
|
+
idleTime += gap;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
total_duration_ms: totalDuration,
|
|
215
|
+
event_count: timestamps.length,
|
|
216
|
+
avg_gap_ms: Math.round(avgGap),
|
|
217
|
+
max_gap_ms: maxGap,
|
|
218
|
+
stall_periods: stallPeriods,
|
|
219
|
+
idle_ratio: totalDuration > 0 ? Math.min(1, idleTime / totalDuration) : 0,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function classifyBlock(block) {
|
|
223
|
+
if (block.type === 'thinking')
|
|
224
|
+
return 'Planning';
|
|
225
|
+
if (block.type === 'text')
|
|
226
|
+
return 'Responding';
|
|
227
|
+
if (block.type === 'tool_use') {
|
|
228
|
+
const name = block.name;
|
|
229
|
+
if (name === 'Read' || name === 'Glob' || name === 'Grep')
|
|
230
|
+
return 'Reading files';
|
|
231
|
+
if (name === 'Edit' || name === 'Write' || name === 'NotebookEdit')
|
|
232
|
+
return 'Editing code';
|
|
233
|
+
if (name === 'Bash') {
|
|
234
|
+
const cmd = typeof block.input?.command === 'string' ? block.input.command : '';
|
|
235
|
+
const lower = cmd.toLowerCase();
|
|
236
|
+
if (lower.includes('test') || lower.includes('vitest') || lower.includes('jest') || lower.includes('pytest'))
|
|
237
|
+
return 'Running tests';
|
|
238
|
+
if (lower.includes('git '))
|
|
239
|
+
return 'Git operations';
|
|
240
|
+
return 'Running command';
|
|
241
|
+
}
|
|
242
|
+
if (name === 'WebSearch' || name === 'WebFetch')
|
|
243
|
+
return 'Searching';
|
|
244
|
+
return 'Running command';
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
/** Group raw tool calls into semantic steps. */
|
|
249
|
+
export function decomposeSteps(events) {
|
|
250
|
+
const steps = [];
|
|
251
|
+
let currentCategory = null;
|
|
252
|
+
let currentTools = [];
|
|
253
|
+
let startIndex = 0;
|
|
254
|
+
for (let i = 0; i < events.length; i++) {
|
|
255
|
+
const evt = events[i];
|
|
256
|
+
if (!evt.message?.content)
|
|
257
|
+
continue;
|
|
258
|
+
for (const block of evt.message.content) {
|
|
259
|
+
const cat = classifyBlock(block);
|
|
260
|
+
if (!cat)
|
|
261
|
+
continue;
|
|
262
|
+
if (cat !== currentCategory) {
|
|
263
|
+
// Close previous step
|
|
264
|
+
if (currentCategory !== null) {
|
|
265
|
+
steps.push({
|
|
266
|
+
label: currentCategory,
|
|
267
|
+
tool_calls: currentTools,
|
|
268
|
+
start_index: startIndex,
|
|
269
|
+
end_index: i,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
currentCategory = cat;
|
|
273
|
+
currentTools = [];
|
|
274
|
+
startIndex = i;
|
|
275
|
+
}
|
|
276
|
+
if (block.type === 'tool_use') {
|
|
277
|
+
currentTools.push(block.name);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Close final step
|
|
282
|
+
if (currentCategory !== null) {
|
|
283
|
+
steps.push({
|
|
284
|
+
label: currentCategory,
|
|
285
|
+
tool_calls: currentTools,
|
|
286
|
+
start_index: startIndex,
|
|
287
|
+
end_index: events.length - 1,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
return steps;
|
|
291
|
+
}
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
// Feature 5: Trigger Evaluation
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
295
|
+
/** Evaluate trigger rules against a trace analysis. */
|
|
296
|
+
export function evaluateTriggers(analysis, rules) {
|
|
297
|
+
const alerts = [];
|
|
298
|
+
const now = Date.now();
|
|
299
|
+
for (const rule of rules) {
|
|
300
|
+
let fired = false;
|
|
301
|
+
const cond = rule.condition;
|
|
302
|
+
switch (cond.type) {
|
|
303
|
+
case 'token_threshold':
|
|
304
|
+
fired = (analysis.total_input_tokens + analysis.total_output_tokens) > cond.threshold;
|
|
305
|
+
break;
|
|
306
|
+
case 'compaction_count':
|
|
307
|
+
fired = analysis.compactions.length >= cond.threshold;
|
|
308
|
+
break;
|
|
309
|
+
case 'error_pattern': {
|
|
310
|
+
const re = new RegExp(cond.pattern);
|
|
311
|
+
// Match pattern against tool names that have errors
|
|
312
|
+
for (const p of analysis.tool_profiles) {
|
|
313
|
+
if (p.error_count > 0 && re.test(p.tool_name)) {
|
|
314
|
+
fired = true;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
case 'stall_duration_ms':
|
|
321
|
+
fired = analysis.liveness.max_gap_ms > cond.threshold;
|
|
322
|
+
break;
|
|
323
|
+
case 'tool_error_rate': {
|
|
324
|
+
const profile = analysis.tool_profiles.find(p => p.tool_name === cond.tool);
|
|
325
|
+
if (profile && profile.call_count > 0) {
|
|
326
|
+
fired = (profile.error_count / profile.call_count) > cond.threshold;
|
|
327
|
+
}
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (fired) {
|
|
332
|
+
alerts.push({
|
|
333
|
+
rule_id: rule.id,
|
|
334
|
+
rule_name: rule.name,
|
|
335
|
+
action: rule.action,
|
|
336
|
+
message: rule.message ?? `Trigger ${rule.name} fired`,
|
|
337
|
+
timestamp_ms: now,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return alerts;
|
|
342
|
+
}
|
|
343
|
+
// ---------------------------------------------------------------------------
|
|
344
|
+
// Combined Analysis Pipeline
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
/** Run full trace analysis on raw output. Falls back gracefully for plain text. */
|
|
347
|
+
export function analyzeTrace(rawOutput, triggerRules) {
|
|
348
|
+
const firstLine = rawOutput.split('\n')[0] ?? '';
|
|
349
|
+
const isJson = isStreamJsonOutput(firstLine);
|
|
350
|
+
if (!isJson) {
|
|
351
|
+
// Fallback: no structured data available
|
|
352
|
+
return {
|
|
353
|
+
compactions: [],
|
|
354
|
+
tool_profiles: [],
|
|
355
|
+
liveness: {
|
|
356
|
+
total_duration_ms: 0,
|
|
357
|
+
event_count: 0,
|
|
358
|
+
avg_gap_ms: 0,
|
|
359
|
+
max_gap_ms: 0,
|
|
360
|
+
stall_periods: [],
|
|
361
|
+
idle_ratio: 0,
|
|
362
|
+
},
|
|
363
|
+
steps: [],
|
|
364
|
+
alerts: [],
|
|
365
|
+
total_input_tokens: 0,
|
|
366
|
+
total_output_tokens: 0,
|
|
367
|
+
is_stream_json: false,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
const events = parseStreamJson(rawOutput);
|
|
371
|
+
// Collect totals from result event or last assistant message
|
|
372
|
+
let totalInput = 0;
|
|
373
|
+
let totalOutput = 0;
|
|
374
|
+
let totalCost;
|
|
375
|
+
let model;
|
|
376
|
+
for (const evt of events) {
|
|
377
|
+
if (evt.message?.usage) {
|
|
378
|
+
// Usage fields are cumulative in stream-json — take the max
|
|
379
|
+
if (evt.message.usage.input_tokens > totalInput) {
|
|
380
|
+
totalInput = evt.message.usage.input_tokens;
|
|
381
|
+
}
|
|
382
|
+
if (evt.message.usage.output_tokens > totalOutput) {
|
|
383
|
+
totalOutput = evt.message.usage.output_tokens;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (evt.message?.model) {
|
|
387
|
+
model = evt.message.model;
|
|
388
|
+
}
|
|
389
|
+
if (evt.result?.cost_usd !== undefined) {
|
|
390
|
+
totalCost = evt.result.cost_usd;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const compactions = detectCompactions(events);
|
|
394
|
+
const toolProfiles = buildToolProfiles(events);
|
|
395
|
+
// Generate synthetic timestamps for liveness (equally spaced as fallback)
|
|
396
|
+
const now = Date.now();
|
|
397
|
+
const timestamps = events.map((_, i) => now + i * 1000);
|
|
398
|
+
const liveness = computeLiveness(events, timestamps);
|
|
399
|
+
const steps = decomposeSteps(events);
|
|
400
|
+
const partial = {
|
|
401
|
+
compactions,
|
|
402
|
+
tool_profiles: toolProfiles,
|
|
403
|
+
liveness,
|
|
404
|
+
steps,
|
|
405
|
+
total_input_tokens: totalInput,
|
|
406
|
+
total_output_tokens: totalOutput,
|
|
407
|
+
total_cost_usd: totalCost,
|
|
408
|
+
model,
|
|
409
|
+
is_stream_json: true,
|
|
410
|
+
};
|
|
411
|
+
const alerts = evaluateTriggers(partial, triggerRules ?? []);
|
|
412
|
+
return { ...partial, alerts };
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/trace/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4HH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACjH,OAAO,GAAsB,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACtH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,MAAyB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACzB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,EAAE,GAAoB;gBAC1B,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,CAAC;aACf,CAAC;YACF,qDAAqD;YACrD,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACvB,EAAE,CAAC,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YACnD,CAAC;YACD,uDAAuD;YACvD,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC1C,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAQ,CAAC,KAAM,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAQ,CAAC,KAAM,CAAC,aAAa,CAAC;YAC9G,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,8EAA8E;AAC9E,0CAA0C;AAC1C,8EAA8E;AAE9E,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAKtB,CAAC;IAEL,wEAAwE;IACxE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,wDAAwD;IACxD,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE,SAAS;QAEpC,qDAAqD;QACrD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;QAE9D,iCAAiC;QACjC,MAAM,UAAU,GAAG,cAAc,GAAG,mBAAmB;YACrD,CAAC,CAAC,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,eAAe,GAAG,oBAAoB;YACxD,CAAC,CAAC,eAAe,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,IAAI,cAAc,GAAG,CAAC;YAAE,mBAAmB,GAAG,cAAc,CAAC;QAC7D,IAAI,eAAe,GAAG,CAAC;YAAE,oBAAoB,GAAG,eAAe,CAAC;QAEhE,0CAA0C;QAC1C,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE/B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC3G,CAAC,CAAC,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnD,IAAI,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACnC,IAAI,CAAC;wBAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;YACpE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACrE,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;gBAChC,CAAC,CAAC,WAAW,IAAI,YAAY,CAAC;gBAC9B,CAAC,CAAC,YAAY,IAAI,aAAa,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,kBAAkB,EAAE,CAAC,CAAC,WAAW;YACjC,mBAAmB,EAAE,CAAC,CAAC,YAAY;YACnC,gBAAgB,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,iBAAiB,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAChG,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,sDAAsD;AACtD,MAAM,UAAU,eAAe,CAAC,MAAyB,EAAE,UAAoB;IAC7E,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,iBAAiB,EAAE,CAAC;YACpB,WAAW,EAAE,UAAU,CAAC,MAAM;YAC9B,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,EAAE;YACjB,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAEjE,MAAM,YAAY,GAAgE,EAAE,CAAC;IACrF,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;gBACrB,WAAW,EAAE,GAAG;aACjB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC7B,QAAQ,IAAI,GAAG,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,aAAa;QAChC,WAAW,EAAE,UAAU,CAAC,MAAM;QAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B,UAAU,EAAE,MAAM;QAClB,aAAa,EAAE,YAAY;QAC3B,UAAU,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,CAAC;AACJ,CAAC;AAQD,SAAS,aAAa,CAAC,KAAmB;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,eAAe,CAAC;QAClF,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,cAAc;YAAE,OAAO,cAAc,CAAC;QAC1F,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,eAAe,CAAC;YACrI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,gBAAgB,CAAC;YACpD,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,WAAW,CAAC;QACpE,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,eAAe,GAAwB,IAAI,CAAC;IAChD,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE,SAAS;QAEpC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG;gBAAE,SAAS;YAEnB,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;gBAC5B,sBAAsB;gBACtB,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC;wBACT,KAAK,EAAE,eAAe;wBACtB,UAAU,EAAE,YAAY;wBACxB,WAAW,EAAE,UAAU;wBACvB,SAAS,EAAE,CAAC;qBACb,CAAC,CAAC;gBACL,CAAC;gBACD,eAAe,GAAG,GAAG,CAAC;gBACtB,YAAY,GAAG,EAAE,CAAC;gBAClB,UAAU,GAAG,CAAC,CAAC;YACjB,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,eAAe;YACtB,UAAU,EAAE,YAAY;YACxB,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAC9B,QAAuC,EACvC,KAAoB;IAEpB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAE5B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,iBAAiB;gBACpB,KAAK,GAAG,CAAC,QAAQ,CAAC,kBAAkB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;gBACtF,MAAM;YACR,KAAK,kBAAkB;gBACrB,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC;gBACtD,MAAM;YACR,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpC,oDAAoD;gBACpD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;oBACvC,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC9C,KAAK,GAAG,IAAI,CAAC;wBACb,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB;gBACtB,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;gBACtD,MAAM;YACR,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5E,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;oBACtC,KAAK,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;gBACtE,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW,IAAI,CAAC,IAAI,QAAQ;gBACrD,YAAY,EAAE,GAAG;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,YAA4B;IAC1E,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,yCAAyC;QACzC,OAAO;YACL,WAAW,EAAE,EAAE;YACf,aAAa,EAAE,EAAE;YACjB,QAAQ,EAAE;gBACR,iBAAiB,EAAE,CAAC;gBACpB,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,EAAE;gBACjB,UAAU,EAAE,CAAC;aACd;YACD,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,kBAAkB,EAAE,CAAC;YACrB,mBAAmB,EAAE,CAAC;YACtB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE1C,6DAA6D;IAC7D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAA6B,CAAC;IAClC,IAAI,KAAyB,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACvB,4DAA4D;YAC5D,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,UAAU,EAAE,CAAC;gBAChD,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YAC9C,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,WAAW,EAAE,CAAC;gBAClD,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACvB,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAErC,MAAM,OAAO,GAAkC;QAC7C,WAAW;QACX,aAAa,EAAE,YAAY;QAC3B,QAAQ;QACR,KAAK;QACL,kBAAkB,EAAE,UAAU;QAC9B,mBAAmB,EAAE,WAAW;QAChC,cAAc,EAAE,SAAS;QACzB,KAAK;QACL,cAAc,EAAE,IAAI;KACrB,CAAC;IAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;IAE7D,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure trajectory algorithms — no filesystem.
|
|
3
|
+
*
|
|
4
|
+
* Shared by both @promptwheel/cli and @promptwheel/mcp.
|
|
5
|
+
* Callers handle file I/O (reading YAML files from .promptwheel/trajectories/).
|
|
6
|
+
*
|
|
7
|
+
* A trajectory is a DAG of ordered steps that the wheel follows across cycles.
|
|
8
|
+
* Each step constrains the scout's scope, categories, and acceptance criteria.
|
|
9
|
+
*/
|
|
10
|
+
export interface TrajectoryStep {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
scope?: string;
|
|
15
|
+
categories?: string[];
|
|
16
|
+
acceptance_criteria: string[];
|
|
17
|
+
verification_commands: string[];
|
|
18
|
+
depends_on: string[];
|
|
19
|
+
measure?: {
|
|
20
|
+
cmd: string;
|
|
21
|
+
target: number;
|
|
22
|
+
direction: 'up' | 'down';
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface Trajectory {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
steps: TrajectoryStep[];
|
|
29
|
+
}
|
|
30
|
+
export type StepStatus = 'pending' | 'active' | 'completed' | 'failed' | 'skipped';
|
|
31
|
+
export interface StepState {
|
|
32
|
+
stepId: string;
|
|
33
|
+
status: StepStatus;
|
|
34
|
+
cyclesAttempted: number;
|
|
35
|
+
lastAttemptedCycle: number;
|
|
36
|
+
completedAt?: number;
|
|
37
|
+
failureReason?: string;
|
|
38
|
+
measurement?: {
|
|
39
|
+
value: number | null;
|
|
40
|
+
timestamp: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface TrajectoryState {
|
|
44
|
+
trajectoryName: string;
|
|
45
|
+
startedAt: number;
|
|
46
|
+
stepStates: Record<string, StepState>;
|
|
47
|
+
currentStepId: string | null;
|
|
48
|
+
paused: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** Can this step start? All dependencies must be completed. */
|
|
51
|
+
export declare function stepReady(step: TrajectoryStep, states: Record<string, StepState>): boolean;
|
|
52
|
+
/** Pick next step: first ready step in declaration order that is pending or active. */
|
|
53
|
+
export declare function getNextStep(trajectory: Trajectory, states: Record<string, StepState>): TrajectoryStep | null;
|
|
54
|
+
/** All steps completed or skipped? */
|
|
55
|
+
export declare function trajectoryComplete(trajectory: Trajectory, states: Record<string, StepState>): boolean;
|
|
56
|
+
/** Stuck: current step has failed 3+ cycles with no progress. Returns stuck step ID or null. */
|
|
57
|
+
export declare function trajectoryStuck(states: Record<string, StepState>, maxRetries?: number): string | null;
|
|
58
|
+
/** Format trajectory context for scout prompt injection. */
|
|
59
|
+
export declare function formatTrajectoryForPrompt(trajectory: Trajectory, states: Record<string, StepState>, currentStep: TrajectoryStep): string;
|
|
60
|
+
/**
|
|
61
|
+
* Parse a trajectory YAML document into a Trajectory object.
|
|
62
|
+
* Handles the nested steps array with all fields.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseTrajectoryYaml(content: string): Trajectory;
|
|
65
|
+
/** Create initial step states for a trajectory. */
|
|
66
|
+
export declare function createInitialStepStates(trajectory: Trajectory): Record<string, StepState>;
|
|
67
|
+
/** Serialize a Trajectory to YAML that parseTrajectoryYaml can round-trip. */
|
|
68
|
+
export declare function serializeTrajectoryToYaml(trajectory: Trajectory): string;
|
|
69
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/trajectory/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnF,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;CACjB;AAQD,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO,CAM1F;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,cAAc,GAAG,IAAI,CAQ5G;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO,CAOrG;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,GAAE,MAA4B,GAAG,MAAM,GAAG,IAAI,CAO1H;AAED,4DAA4D;AAC5D,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACjC,WAAW,EAAE,cAAc,GAC1B,MAAM,CAkER;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA8J/D;AAYD,mDAAmD;AACnD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAWzF;AAMD,8EAA8E;AAC9E,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAmCxE"}
|