@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.
Files changed (169) hide show
  1. package/dist/codebase-index/index.d.ts +23 -0
  2. package/dist/codebase-index/index.d.ts.map +1 -0
  3. package/dist/codebase-index/index.js +361 -0
  4. package/dist/codebase-index/index.js.map +1 -0
  5. package/dist/codebase-index/shared.d.ts +95 -0
  6. package/dist/codebase-index/shared.d.ts.map +1 -0
  7. package/dist/codebase-index/shared.js +319 -0
  8. package/dist/codebase-index/shared.js.map +1 -0
  9. package/dist/config/defaults.d.ts +45 -0
  10. package/dist/config/defaults.d.ts.map +1 -0
  11. package/dist/config/defaults.js +79 -0
  12. package/dist/config/defaults.js.map +1 -0
  13. package/dist/critic/shared.d.ts +49 -0
  14. package/dist/critic/shared.d.ts.map +1 -0
  15. package/dist/critic/shared.js +204 -0
  16. package/dist/critic/shared.js.map +1 -0
  17. package/dist/db/adapter.d.ts +191 -0
  18. package/dist/db/adapter.d.ts.map +1 -0
  19. package/dist/db/adapter.js +40 -0
  20. package/dist/db/adapter.js.map +1 -0
  21. package/dist/db/contract.d.ts +47 -0
  22. package/dist/db/contract.d.ts.map +1 -0
  23. package/dist/db/contract.js +258 -0
  24. package/dist/db/contract.js.map +1 -0
  25. package/dist/db/index.d.ts +6 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +7 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/dedup/shared.d.ts +82 -0
  30. package/dist/dedup/shared.d.ts.map +1 -0
  31. package/dist/dedup/shared.js +215 -0
  32. package/dist/dedup/shared.js.map +1 -0
  33. package/dist/exec/index.d.ts +5 -0
  34. package/dist/exec/index.d.ts.map +1 -0
  35. package/dist/exec/index.js +5 -0
  36. package/dist/exec/index.js.map +1 -0
  37. package/dist/exec/types.d.ts +64 -0
  38. package/dist/exec/types.d.ts.map +1 -0
  39. package/dist/exec/types.js +8 -0
  40. package/dist/exec/types.js.map +1 -0
  41. package/dist/formulas/shared.d.ts +42 -0
  42. package/dist/formulas/shared.d.ts.map +1 -0
  43. package/dist/formulas/shared.js +204 -0
  44. package/dist/formulas/shared.js.map +1 -0
  45. package/dist/guidelines/shared.d.ts +46 -0
  46. package/dist/guidelines/shared.d.ts.map +1 -0
  47. package/dist/guidelines/shared.js +128 -0
  48. package/dist/guidelines/shared.js.map +1 -0
  49. package/dist/index.d.ts +35 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +51 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/learnings/shared.d.ts +112 -0
  54. package/dist/learnings/shared.d.ts.map +1 -0
  55. package/dist/learnings/shared.js +402 -0
  56. package/dist/learnings/shared.js.map +1 -0
  57. package/dist/proposals/shared.d.ts +137 -0
  58. package/dist/proposals/shared.d.ts.map +1 -0
  59. package/dist/proposals/shared.js +254 -0
  60. package/dist/proposals/shared.js.map +1 -0
  61. package/dist/repos/index.d.ts +15 -0
  62. package/dist/repos/index.d.ts.map +1 -0
  63. package/dist/repos/index.js +11 -0
  64. package/dist/repos/index.js.map +1 -0
  65. package/dist/repos/projects.d.ts +41 -0
  66. package/dist/repos/projects.d.ts.map +1 -0
  67. package/dist/repos/projects.js +75 -0
  68. package/dist/repos/projects.js.map +1 -0
  69. package/dist/repos/run_steps.d.ts +152 -0
  70. package/dist/repos/run_steps.d.ts.map +1 -0
  71. package/dist/repos/run_steps.js +328 -0
  72. package/dist/repos/run_steps.js.map +1 -0
  73. package/dist/repos/runs.d.ts +92 -0
  74. package/dist/repos/runs.d.ts.map +1 -0
  75. package/dist/repos/runs.js +185 -0
  76. package/dist/repos/runs.js.map +1 -0
  77. package/dist/repos/tickets.d.ts +71 -0
  78. package/dist/repos/tickets.d.ts.map +1 -0
  79. package/dist/repos/tickets.js +158 -0
  80. package/dist/repos/tickets.js.map +1 -0
  81. package/dist/scope/shared.d.ts +67 -0
  82. package/dist/scope/shared.d.ts.map +1 -0
  83. package/dist/scope/shared.js +355 -0
  84. package/dist/scope/shared.js.map +1 -0
  85. package/dist/scout/index.d.ts +18 -0
  86. package/dist/scout/index.d.ts.map +1 -0
  87. package/dist/scout/index.js +445 -0
  88. package/dist/scout/index.js.map +1 -0
  89. package/dist/scout/kimi-runner.d.ts +21 -0
  90. package/dist/scout/kimi-runner.d.ts.map +1 -0
  91. package/dist/scout/kimi-runner.js +76 -0
  92. package/dist/scout/kimi-runner.js.map +1 -0
  93. package/dist/scout/mcp-batch-server.d.ts +37 -0
  94. package/dist/scout/mcp-batch-server.d.ts.map +1 -0
  95. package/dist/scout/mcp-batch-server.js +144 -0
  96. package/dist/scout/mcp-batch-server.js.map +1 -0
  97. package/dist/scout/openai-local-runner.d.ts +20 -0
  98. package/dist/scout/openai-local-runner.d.ts.map +1 -0
  99. package/dist/scout/openai-local-runner.js +82 -0
  100. package/dist/scout/openai-local-runner.js.map +1 -0
  101. package/dist/scout/prompt.d.ts +49 -0
  102. package/dist/scout/prompt.d.ts.map +1 -0
  103. package/dist/scout/prompt.js +153 -0
  104. package/dist/scout/prompt.js.map +1 -0
  105. package/dist/scout/runner.d.ts +101 -0
  106. package/dist/scout/runner.d.ts.map +1 -0
  107. package/dist/scout/runner.js +521 -0
  108. package/dist/scout/runner.js.map +1 -0
  109. package/dist/scout/scanner.d.ts +61 -0
  110. package/dist/scout/scanner.d.ts.map +1 -0
  111. package/dist/scout/scanner.js +315 -0
  112. package/dist/scout/scanner.js.map +1 -0
  113. package/dist/scout/types.d.ts +221 -0
  114. package/dist/scout/types.d.ts.map +1 -0
  115. package/dist/scout/types.js +44 -0
  116. package/dist/scout/types.js.map +1 -0
  117. package/dist/sectors/shared.d.ts +146 -0
  118. package/dist/sectors/shared.d.ts.map +1 -0
  119. package/dist/sectors/shared.js +408 -0
  120. package/dist/sectors/shared.js.map +1 -0
  121. package/dist/services/index.d.ts +10 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +9 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/qa.d.ts +76 -0
  126. package/dist/services/qa.d.ts.map +1 -0
  127. package/dist/services/qa.js +228 -0
  128. package/dist/services/qa.js.map +1 -0
  129. package/dist/services/scout.d.ts +164 -0
  130. package/dist/services/scout.d.ts.map +1 -0
  131. package/dist/services/scout.js +215 -0
  132. package/dist/services/scout.js.map +1 -0
  133. package/dist/spindle/shared.d.ts +14 -0
  134. package/dist/spindle/shared.d.ts.map +1 -0
  135. package/dist/spindle/shared.js +65 -0
  136. package/dist/spindle/shared.js.map +1 -0
  137. package/dist/tools/shared.d.ts +35 -0
  138. package/dist/tools/shared.d.ts.map +1 -0
  139. package/dist/tools/shared.js +247 -0
  140. package/dist/tools/shared.js.map +1 -0
  141. package/dist/trace/shared.d.ts +147 -0
  142. package/dist/trace/shared.d.ts.map +1 -0
  143. package/dist/trace/shared.js +414 -0
  144. package/dist/trace/shared.js.map +1 -0
  145. package/dist/trajectory/shared.d.ts +69 -0
  146. package/dist/trajectory/shared.d.ts.map +1 -0
  147. package/dist/trajectory/shared.js +336 -0
  148. package/dist/trajectory/shared.js.map +1 -0
  149. package/dist/utils/id.d.ts +12 -0
  150. package/dist/utils/id.d.ts.map +1 -0
  151. package/dist/utils/id.js +24 -0
  152. package/dist/utils/id.js.map +1 -0
  153. package/dist/utils/id.test.d.ts +5 -0
  154. package/dist/utils/id.test.d.ts.map +1 -0
  155. package/dist/utils/id.test.js +173 -0
  156. package/dist/utils/id.test.js.map +1 -0
  157. package/dist/utils/index.d.ts +6 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +6 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/dist/utils/json.d.ts +9 -0
  162. package/dist/utils/json.d.ts.map +1 -0
  163. package/dist/utils/json.js +19 -0
  164. package/dist/utils/json.js.map +1 -0
  165. package/dist/waves/shared.d.ts +106 -0
  166. package/dist/waves/shared.d.ts.map +1 -0
  167. package/dist/waves/shared.js +356 -0
  168. package/dist/waves/shared.js.map +1 -0
  169. 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":"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"}
@@ -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"}