kantban-cli 0.1.8 → 0.1.10
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/chunk-ZCUIGFSP.js +4111 -0
- package/dist/chunk-ZCUIGFSP.js.map +1 -0
- package/dist/context-7YDNTI3P.js +30 -0
- package/dist/context-7YDNTI3P.js.map +1 -0
- package/dist/cron-OKQP6QDF.js +112 -0
- package/dist/cron-OKQP6QDF.js.map +1 -0
- package/dist/index.d.ts +0 -2
- package/dist/index.js +179 -44
- package/dist/index.js.map +1 -1
- package/dist/pipeline-HTGCXNPL.js +4049 -0
- package/dist/pipeline-HTGCXNPL.js.map +1 -0
- package/dist/pipeline-init-IGZZOOLK.js +103 -0
- package/dist/pipeline-init-IGZZOOLK.js.map +1 -0
- package/dist/status-4GFXMVIM.js +128 -0
- package/dist/status-4GFXMVIM.js.map +1 -0
- package/dist/work-2V33NZAT.js +81 -0
- package/dist/work-2V33NZAT.js.map +1 -0
- package/package.json +5 -4
- package/dist/client.d.ts +0 -38
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -163
- package/dist/client.js.map +0 -1
- package/dist/commands/context.d.ts +0 -3
- package/dist/commands/context.d.ts.map +0 -1
- package/dist/commands/context.js +0 -27
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/cron.d.ts +0 -3
- package/dist/commands/cron.d.ts.map +0 -1
- package/dist/commands/cron.js +0 -106
- package/dist/commands/cron.js.map +0 -1
- package/dist/commands/pipeline-init.d.ts +0 -2
- package/dist/commands/pipeline-init.d.ts.map +0 -1
- package/dist/commands/pipeline-init.js +0 -100
- package/dist/commands/pipeline-init.js.map +0 -1
- package/dist/commands/pipeline.d.ts +0 -4
- package/dist/commands/pipeline.d.ts.map +0 -1
- package/dist/commands/pipeline.js +0 -1222
- package/dist/commands/pipeline.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -135
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/work.d.ts +0 -3
- package/dist/commands/work.d.ts.map +0 -1
- package/dist/commands/work.js +0 -76
- package/dist/commands/work.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/advisor.d.ts +0 -108
- package/dist/lib/advisor.d.ts.map +0 -1
- package/dist/lib/advisor.js +0 -139
- package/dist/lib/advisor.js.map +0 -1
- package/dist/lib/checkpoint.d.ts +0 -15
- package/dist/lib/checkpoint.d.ts.map +0 -1
- package/dist/lib/checkpoint.js +0 -49
- package/dist/lib/checkpoint.js.map +0 -1
- package/dist/lib/constraint-evaluator.d.ts +0 -40
- package/dist/lib/constraint-evaluator.d.ts.map +0 -1
- package/dist/lib/constraint-evaluator.js +0 -189
- package/dist/lib/constraint-evaluator.js.map +0 -1
- package/dist/lib/cost-tracker.d.ts +0 -46
- package/dist/lib/cost-tracker.d.ts.map +0 -1
- package/dist/lib/cost-tracker.js +0 -120
- package/dist/lib/cost-tracker.js.map +0 -1
- package/dist/lib/evaluator.d.ts +0 -17
- package/dist/lib/evaluator.d.ts.map +0 -1
- package/dist/lib/evaluator.js +0 -71
- package/dist/lib/evaluator.js.map +0 -1
- package/dist/lib/event-emitter.d.ts +0 -28
- package/dist/lib/event-emitter.d.ts.map +0 -1
- package/dist/lib/event-emitter.js +0 -100
- package/dist/lib/event-emitter.js.map +0 -1
- package/dist/lib/event-queue.d.ts +0 -28
- package/dist/lib/event-queue.d.ts.map +0 -1
- package/dist/lib/event-queue.js +0 -73
- package/dist/lib/event-queue.js.map +0 -1
- package/dist/lib/gate-config.d.ts +0 -7
- package/dist/lib/gate-config.d.ts.map +0 -1
- package/dist/lib/gate-config.js +0 -68
- package/dist/lib/gate-config.js.map +0 -1
- package/dist/lib/gate-proxy-server.d.ts +0 -16
- package/dist/lib/gate-proxy-server.d.ts.map +0 -1
- package/dist/lib/gate-proxy-server.js +0 -385
- package/dist/lib/gate-proxy-server.js.map +0 -1
- package/dist/lib/gate-proxy.d.ts +0 -46
- package/dist/lib/gate-proxy.d.ts.map +0 -1
- package/dist/lib/gate-proxy.js +0 -104
- package/dist/lib/gate-proxy.js.map +0 -1
- package/dist/lib/gate-runner.d.ts +0 -13
- package/dist/lib/gate-runner.d.ts.map +0 -1
- package/dist/lib/gate-runner.js +0 -104
- package/dist/lib/gate-runner.js.map +0 -1
- package/dist/lib/gate-snapshot.d.ts +0 -12
- package/dist/lib/gate-snapshot.d.ts.map +0 -1
- package/dist/lib/gate-snapshot.js +0 -49
- package/dist/lib/gate-snapshot.js.map +0 -1
- package/dist/lib/light-call.d.ts +0 -37
- package/dist/lib/light-call.d.ts.map +0 -1
- package/dist/lib/light-call.js +0 -62
- package/dist/lib/light-call.js.map +0 -1
- package/dist/lib/logger.d.ts +0 -22
- package/dist/lib/logger.d.ts.map +0 -1
- package/dist/lib/logger.js +0 -98
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/mcp-config.d.ts +0 -24
- package/dist/lib/mcp-config.d.ts.map +0 -1
- package/dist/lib/mcp-config.js +0 -115
- package/dist/lib/mcp-config.js.map +0 -1
- package/dist/lib/orchestrator.d.ts +0 -392
- package/dist/lib/orchestrator.d.ts.map +0 -1
- package/dist/lib/orchestrator.js +0 -1636
- package/dist/lib/orchestrator.js.map +0 -1
- package/dist/lib/parse-utils.d.ts +0 -6
- package/dist/lib/parse-utils.d.ts.map +0 -1
- package/dist/lib/parse-utils.js +0 -64
- package/dist/lib/parse-utils.js.map +0 -1
- package/dist/lib/prompt-composer.d.ts +0 -131
- package/dist/lib/prompt-composer.d.ts.map +0 -1
- package/dist/lib/prompt-composer.js +0 -317
- package/dist/lib/prompt-composer.js.map +0 -1
- package/dist/lib/ralph-loop.d.ts +0 -123
- package/dist/lib/ralph-loop.d.ts.map +0 -1
- package/dist/lib/ralph-loop.js +0 -383
- package/dist/lib/ralph-loop.js.map +0 -1
- package/dist/lib/reaper.d.ts +0 -14
- package/dist/lib/reaper.d.ts.map +0 -1
- package/dist/lib/reaper.js +0 -114
- package/dist/lib/reaper.js.map +0 -1
- package/dist/lib/replanner.d.ts +0 -49
- package/dist/lib/replanner.d.ts.map +0 -1
- package/dist/lib/replanner.js +0 -61
- package/dist/lib/replanner.js.map +0 -1
- package/dist/lib/run-memory.d.ts +0 -37
- package/dist/lib/run-memory.d.ts.map +0 -1
- package/dist/lib/run-memory.js +0 -115
- package/dist/lib/run-memory.js.map +0 -1
- package/dist/lib/stream-parser.d.ts +0 -20
- package/dist/lib/stream-parser.d.ts.map +0 -1
- package/dist/lib/stream-parser.js +0 -65
- package/dist/lib/stream-parser.js.map +0 -1
- package/dist/lib/stuck-detector.d.ts +0 -47
- package/dist/lib/stuck-detector.d.ts.map +0 -1
- package/dist/lib/stuck-detector.js +0 -105
- package/dist/lib/stuck-detector.js.map +0 -1
- package/dist/lib/tool-profiles.d.ts +0 -19
- package/dist/lib/tool-profiles.d.ts.map +0 -1
- package/dist/lib/tool-profiles.js +0 -22
- package/dist/lib/tool-profiles.js.map +0 -1
- package/dist/lib/worktree.d.ts +0 -12
- package/dist/lib/worktree.d.ts.map +0 -1
- package/dist/lib/worktree.js +0 -29
- package/dist/lib/worktree.js.map +0 -1
- package/dist/lib/ws-client.d.ts +0 -31
- package/dist/lib/ws-client.d.ts.map +0 -1
- package/dist/lib/ws-client.js +0 -113
- package/dist/lib/ws-client.js.map +0 -1
package/dist/lib/ralph-loop.js
DELETED
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
import { composePrompt } from './prompt-composer.js';
|
|
2
|
-
import { shouldCheckStuckDetection, classifyTrajectory } from './stuck-detector.js';
|
|
3
|
-
const API_TIMEOUT_MS = 30_000; // 30s timeout for API calls (fingerprint, context)
|
|
4
|
-
function withTimeout(promise, ms, label) {
|
|
5
|
-
let timer;
|
|
6
|
-
return Promise.race([
|
|
7
|
-
promise.finally(() => clearTimeout(timer)),
|
|
8
|
-
new Promise((_, reject) => {
|
|
9
|
-
timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
10
|
-
}),
|
|
11
|
-
]);
|
|
12
|
-
}
|
|
13
|
-
export class RalphLoop {
|
|
14
|
-
ticketId;
|
|
15
|
-
columnId;
|
|
16
|
-
config;
|
|
17
|
-
deps;
|
|
18
|
-
stopped = false;
|
|
19
|
-
currentIteration = 0;
|
|
20
|
-
constructor(ticketId, columnId, config, deps) {
|
|
21
|
-
this.ticketId = ticketId;
|
|
22
|
-
this.columnId = columnId;
|
|
23
|
-
this.config = config;
|
|
24
|
-
this.deps = deps;
|
|
25
|
-
}
|
|
26
|
-
stop() {
|
|
27
|
-
this.stopped = true;
|
|
28
|
-
}
|
|
29
|
-
get iteration() {
|
|
30
|
-
return this.currentIteration;
|
|
31
|
-
}
|
|
32
|
-
looksLike404(err) {
|
|
33
|
-
const statusCode = err?.statusCode
|
|
34
|
-
?? err?.status;
|
|
35
|
-
if (statusCode === 404)
|
|
36
|
-
return true;
|
|
37
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
38
|
-
return message.includes('API error 404');
|
|
39
|
-
}
|
|
40
|
-
async run() {
|
|
41
|
-
let gutterCount = this.config.startGutterCount ?? 0;
|
|
42
|
-
let lastFingerprint = this.config.startFingerprint ?? null;
|
|
43
|
-
const log = this.deps.log ?? (() => { });
|
|
44
|
-
const resolvedModel = this.config.model ?? 'default';
|
|
45
|
-
const gateSnapshots = [];
|
|
46
|
-
let cumulativeTokensIn = 0;
|
|
47
|
-
let cumulativeTokensOut = 0;
|
|
48
|
-
let cumulativeToolCalls = 0;
|
|
49
|
-
let cumulativeDurationMs = 0;
|
|
50
|
-
const withCosts = (r) => ({
|
|
51
|
-
...r,
|
|
52
|
-
tokensIn: cumulativeTokensIn,
|
|
53
|
-
tokensOut: cumulativeTokensOut,
|
|
54
|
-
toolCallCount: cumulativeToolCalls,
|
|
55
|
-
durationMs: cumulativeDurationMs,
|
|
56
|
-
});
|
|
57
|
-
let lastOutput = '';
|
|
58
|
-
const startIter = this.config.startIteration ?? 1;
|
|
59
|
-
for (let i = startIter; i <= this.config.maxIterations; i++) {
|
|
60
|
-
if (this.stopped)
|
|
61
|
-
return withCosts({ reason: 'stopped', iterations: i - 1, gutterCount, model: resolvedModel });
|
|
62
|
-
this.currentIteration = i;
|
|
63
|
-
log(`Iteration ${i}/${this.config.maxIterations} starting`);
|
|
64
|
-
// Capture baseline fingerprint on first iteration
|
|
65
|
-
if (!lastFingerprint) {
|
|
66
|
-
try {
|
|
67
|
-
lastFingerprint = await withTimeout(this.deps.fetchFingerprint(this.ticketId), API_TIMEOUT_MS, 'fetchFingerprint (baseline)');
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
-
log(`Baseline fingerprint fetch failed: ${message}`);
|
|
72
|
-
if (this.looksLike404(err)) {
|
|
73
|
-
return withCosts({ reason: 'deleted', iterations: i, gutterCount, model: resolvedModel });
|
|
74
|
-
}
|
|
75
|
-
return withCosts({ reason: 'error', iterations: i, gutterCount, lastError: `Baseline fingerprint failed: ${message}`, model: resolvedModel });
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// Fetch ticket and column context for this iteration
|
|
79
|
-
let ticketCtx;
|
|
80
|
-
let columnCtx;
|
|
81
|
-
try {
|
|
82
|
-
[ticketCtx, columnCtx] = await Promise.all([
|
|
83
|
-
withTimeout(this.deps.fetchTicketContext(this.ticketId), API_TIMEOUT_MS, 'fetchTicketContext'),
|
|
84
|
-
withTimeout(this.deps.fetchColumnContext(this.columnId), API_TIMEOUT_MS, 'fetchColumnContext'),
|
|
85
|
-
]);
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
89
|
-
log(`Context fetch failed: ${message}`);
|
|
90
|
-
if (this.looksLike404(err)) {
|
|
91
|
-
return withCosts({ reason: 'deleted', iterations: i, gutterCount, model: resolvedModel });
|
|
92
|
-
}
|
|
93
|
-
return withCosts({ reason: 'error', iterations: i, gutterCount, lastError: `Context fetch failed: ${message}`, model: resolvedModel });
|
|
94
|
-
}
|
|
95
|
-
// Pre-flight column check — bail if ticket already moved
|
|
96
|
-
if (ticketCtx.ticket.column && ticketCtx.ticket.column.id !== this.columnId) {
|
|
97
|
-
log(`Ticket already in column ${ticketCtx.ticket.column.name}, not ${this.columnId} — exiting as moved`);
|
|
98
|
-
return withCosts({ reason: 'moved', iterations: i - 1, gutterCount, model: resolvedModel });
|
|
99
|
-
}
|
|
100
|
-
// Fetch run memory and lookahead enrichments — non-blocking, failures are silenced
|
|
101
|
-
const runMemoryContent = this.deps.fetchRunMemoryContent
|
|
102
|
-
? await this.deps.fetchRunMemoryContent().catch(() => '')
|
|
103
|
-
: undefined;
|
|
104
|
-
const lookaheadDocument = this.deps.fetchLookaheadDocument
|
|
105
|
-
? await this.deps.fetchLookaheadDocument().catch(() => undefined)
|
|
106
|
-
: undefined;
|
|
107
|
-
// Compose prompt from column context, ticket context, and enrichments
|
|
108
|
-
let prompt;
|
|
109
|
-
try {
|
|
110
|
-
prompt = composePrompt(columnCtx, ticketCtx, {
|
|
111
|
-
iteration: i,
|
|
112
|
-
maxIterations: this.config.maxIterations,
|
|
113
|
-
projectId: this.deps.projectId,
|
|
114
|
-
gutterCount,
|
|
115
|
-
gutterThreshold: this.config.gutterThreshold,
|
|
116
|
-
runMemoryContent: runMemoryContent || undefined,
|
|
117
|
-
lookaheadDocument,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
catch (err) {
|
|
121
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
122
|
-
log(`Prompt composition failed: ${message}`);
|
|
123
|
-
return withCosts({ reason: 'error', iterations: i, gutterCount, lastError: `Prompt composition failed: ${message}`, model: resolvedModel });
|
|
124
|
-
}
|
|
125
|
-
// Invoke Claude with the composed prompt
|
|
126
|
-
if (this.stopped)
|
|
127
|
-
return withCosts({ reason: 'stopped', iterations: i - 1, gutterCount, model: resolvedModel });
|
|
128
|
-
log(`Invoking Claude (model=${this.config.model ?? 'default'})`);
|
|
129
|
-
const iterationRunId = `${this.config.runId ?? this.ticketId}-iter-${String(i)}`;
|
|
130
|
-
const iterationStart = Date.now();
|
|
131
|
-
this.deps.onSessionStart?.({
|
|
132
|
-
runId: iterationRunId,
|
|
133
|
-
model: this.config.model ?? 'default',
|
|
134
|
-
iteration: i,
|
|
135
|
-
});
|
|
136
|
-
const streamContext = { runId: iterationRunId, ticketId: this.ticketId, columnId: this.columnId };
|
|
137
|
-
const { exitCode, output, toolCallCount, tokensIn, tokensOut } = await this.deps.invokeClaudeP(prompt, {
|
|
138
|
-
mcpConfigPath: this.deps.mcpConfigPath,
|
|
139
|
-
model: this.config.model,
|
|
140
|
-
maxBudgetUsd: this.config.maxBudgetUsd,
|
|
141
|
-
worktree: this.config.worktreeName,
|
|
142
|
-
onStreamEvent: (event) => this.deps.onStreamEvent?.(event, streamContext),
|
|
143
|
-
// Tool scoping
|
|
144
|
-
...(this.config.toolRestrictions && {
|
|
145
|
-
tools: this.config.toolRestrictions.tools,
|
|
146
|
-
allowedTools: this.config.toolRestrictions.allowedTools,
|
|
147
|
-
disallowedTools: this.config.toolRestrictions.disallowedTools,
|
|
148
|
-
includeMcpConfig: this.config.toolRestrictions.includeMcpConfig,
|
|
149
|
-
}),
|
|
150
|
-
});
|
|
151
|
-
const iterationDurationMs = Date.now() - iterationStart;
|
|
152
|
-
cumulativeTokensIn += tokensIn;
|
|
153
|
-
cumulativeTokensOut += tokensOut;
|
|
154
|
-
cumulativeToolCalls += toolCallCount;
|
|
155
|
-
cumulativeDurationMs += iterationDurationMs;
|
|
156
|
-
this.deps.onSessionEnd?.({
|
|
157
|
-
runId: iterationRunId,
|
|
158
|
-
exitCode,
|
|
159
|
-
tokensIn,
|
|
160
|
-
tokensOut,
|
|
161
|
-
toolCallCount,
|
|
162
|
-
durationMs: iterationDurationMs,
|
|
163
|
-
});
|
|
164
|
-
if (exitCode !== 0) {
|
|
165
|
-
const snippet = output.slice(-200);
|
|
166
|
-
log(`Claude exited with code ${exitCode}: ${snippet}`);
|
|
167
|
-
return withCosts({ reason: 'error', iterations: i, gutterCount, lastError: `non-zero exit code: ${exitCode}. Last output: ${snippet}`, model: resolvedModel });
|
|
168
|
-
}
|
|
169
|
-
log(`Claude exited successfully`);
|
|
170
|
-
lastOutput = output;
|
|
171
|
-
// Post-iteration fingerprint check — detect if ticket moved out of column
|
|
172
|
-
let afterFp;
|
|
173
|
-
try {
|
|
174
|
-
const retryDelayMs = this.config.postMoveRetryDelayMs ?? 1500;
|
|
175
|
-
afterFp = await withTimeout(this.deps.fetchFingerprint(this.ticketId), API_TIMEOUT_MS, 'fetchFingerprint (post-iteration)');
|
|
176
|
-
if (afterFp.column_id === this.columnId) {
|
|
177
|
-
for (let retry = 0; retry < 2; retry++) {
|
|
178
|
-
await new Promise((r) => setTimeout(r, retryDelayMs));
|
|
179
|
-
if (this.stopped)
|
|
180
|
-
break; // Honor stop during retry delay
|
|
181
|
-
try {
|
|
182
|
-
afterFp = await withTimeout(this.deps.fetchFingerprint(this.ticketId), API_TIMEOUT_MS, 'fetchFingerprint (retry)');
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
log(`Fingerprint retry ${retry + 1} failed: ${err instanceof Error ? err.message : String(err)} — using last good value`);
|
|
186
|
-
break; // retry fingerprint failed — use last good value
|
|
187
|
-
}
|
|
188
|
-
if (afterFp.column_id !== this.columnId)
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch (err) {
|
|
194
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
195
|
-
log(`Post-iteration fingerprint failed: ${message}`);
|
|
196
|
-
if (this.looksLike404(err)) {
|
|
197
|
-
return withCosts({ reason: 'deleted', iterations: i, gutterCount, model: resolvedModel });
|
|
198
|
-
}
|
|
199
|
-
return withCosts({ reason: 'error', iterations: i, gutterCount, lastError: `Post-iteration fingerprint failed: ${message}`, model: resolvedModel });
|
|
200
|
-
}
|
|
201
|
-
// Did ticket move?
|
|
202
|
-
if (afterFp.column_id !== this.columnId) {
|
|
203
|
-
log(`Ticket moved to column ${afterFp.column_id ?? 'null'}`);
|
|
204
|
-
return withCosts({ reason: 'moved', iterations: i, gutterCount, model: resolvedModel, output: lastOutput });
|
|
205
|
-
}
|
|
206
|
-
// Gate-based gutter detection (preferred) or fingerprint fallback
|
|
207
|
-
if (this.config.onPostIterationGates) {
|
|
208
|
-
try {
|
|
209
|
-
const snapshot = await this.config.onPostIterationGates(this.ticketId, i);
|
|
210
|
-
gateSnapshots.push(snapshot);
|
|
211
|
-
// Also check if any field values changed (complementary signal)
|
|
212
|
-
const fieldDelta = lastFingerprint ? afterFp.field_value_count !== lastFingerprint.field_value_count : false;
|
|
213
|
-
switch (snapshot.delta_from_previous) {
|
|
214
|
-
case 'improved':
|
|
215
|
-
if (gutterCount > 0)
|
|
216
|
-
log(`Gate improvement detected — gutter counter reset`);
|
|
217
|
-
gutterCount = 0;
|
|
218
|
-
break;
|
|
219
|
-
case 'same':
|
|
220
|
-
if (!fieldDelta) {
|
|
221
|
-
gutterCount++;
|
|
222
|
-
log(`No gate progress (gutter ${gutterCount}/${this.config.gutterThreshold})`);
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
log(`Gates unchanged but fields changed — not incrementing gutter`);
|
|
226
|
-
}
|
|
227
|
-
break;
|
|
228
|
-
case 'regressed':
|
|
229
|
-
gutterCount += 2;
|
|
230
|
-
log(`Gate regression detected (gutter ${gutterCount}/${this.config.gutterThreshold})`);
|
|
231
|
-
break;
|
|
232
|
-
case 'first_check':
|
|
233
|
-
// First check — no delta info yet, don't adjust gutter
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
catch (err) {
|
|
238
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
239
|
-
log(`Post-iteration gate check failed (non-blocking): ${message}`);
|
|
240
|
-
// Fall back to fingerprint gutter on gate failure
|
|
241
|
-
if (lastFingerprint && fingerprintsMatch(lastFingerprint, afterFp)) {
|
|
242
|
-
gutterCount++;
|
|
243
|
-
log(`No progress detected via fingerprint fallback (gutter ${gutterCount}/${this.config.gutterThreshold})`);
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
if (gutterCount > 0)
|
|
247
|
-
log(`Progress detected — gutter counter reset`);
|
|
248
|
-
gutterCount = 0;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
// Original fingerprint-based gutter detection
|
|
254
|
-
if (lastFingerprint && fingerprintsMatch(lastFingerprint, afterFp)) {
|
|
255
|
-
gutterCount++;
|
|
256
|
-
log(`No progress detected (gutter ${gutterCount}/${this.config.gutterThreshold})`);
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
if (gutterCount > 0)
|
|
260
|
-
log(`Progress detected — gutter counter reset`);
|
|
261
|
-
gutterCount = 0;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
lastFingerprint = afterFp;
|
|
265
|
-
// Pattern-based stuck detection — classifies trajectory as progressing/spinning/blocked
|
|
266
|
-
if (this.config.stuckDetection && shouldCheckStuckDetection(this.config.stuckDetection, i)) {
|
|
267
|
-
try {
|
|
268
|
-
let sdStatus;
|
|
269
|
-
let sdEvidence;
|
|
270
|
-
let sdConfidence;
|
|
271
|
-
if (gateSnapshots.length > 0) {
|
|
272
|
-
// Deterministic classification from gate data
|
|
273
|
-
const trajectory = classifyTrajectory(gateSnapshots);
|
|
274
|
-
sdStatus = trajectory.status === 'regressing' ? 'spinning' : trajectory.status;
|
|
275
|
-
sdEvidence = trajectory.evidence;
|
|
276
|
-
sdConfidence = trajectory.confidence;
|
|
277
|
-
log(`Gate-based stuck detection: ${sdStatus} (confidence=${String(sdConfidence)}) — ${sdEvidence}`);
|
|
278
|
-
}
|
|
279
|
-
else if (this.config.invokeStuckDetection) {
|
|
280
|
-
// Legacy LLM-based classification
|
|
281
|
-
const sdInput = {
|
|
282
|
-
ticketNumber: ticketCtx.ticket.ticket_number,
|
|
283
|
-
ticketTitle: ticketCtx.ticket.title,
|
|
284
|
-
columnName: columnCtx.column.name,
|
|
285
|
-
iteration: i,
|
|
286
|
-
maxIterations: this.config.maxIterations,
|
|
287
|
-
recentComments: ticketCtx.comments.slice(-3).map((c) => ({
|
|
288
|
-
author: c.author,
|
|
289
|
-
body: c.body,
|
|
290
|
-
})),
|
|
291
|
-
};
|
|
292
|
-
const sdResult = await this.config.invokeStuckDetection(sdInput);
|
|
293
|
-
sdStatus = sdResult.status;
|
|
294
|
-
sdEvidence = sdResult.evidence;
|
|
295
|
-
sdConfidence = sdResult.confidence;
|
|
296
|
-
log(`Stuck detection: ${sdStatus} (confidence=${String(sdConfidence)}) — ${sdEvidence}`);
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
// No detection method available — skip
|
|
300
|
-
sdStatus = 'progressing';
|
|
301
|
-
sdEvidence = 'no detection method';
|
|
302
|
-
sdConfidence = 0;
|
|
303
|
-
}
|
|
304
|
-
switch (sdStatus) {
|
|
305
|
-
case 'progressing':
|
|
306
|
-
if (gutterCount > 0) {
|
|
307
|
-
log(`Stuck detection override: resetting gutter counter (was ${String(gutterCount)})`);
|
|
308
|
-
gutterCount = 0;
|
|
309
|
-
}
|
|
310
|
-
break;
|
|
311
|
-
case 'spinning':
|
|
312
|
-
gutterCount += 2;
|
|
313
|
-
log(`Stuck detection: spinning — gutter accelerated to ${String(gutterCount)}/${String(this.config.gutterThreshold)}`);
|
|
314
|
-
break;
|
|
315
|
-
case 'blocked':
|
|
316
|
-
log(`Stuck detection: blocked — exiting immediately`);
|
|
317
|
-
return withCosts({
|
|
318
|
-
reason: 'stalled',
|
|
319
|
-
iterations: i,
|
|
320
|
-
gutterCount: this.config.gutterThreshold,
|
|
321
|
-
model: resolvedModel,
|
|
322
|
-
output: lastOutput,
|
|
323
|
-
...(gateSnapshots.length > 0 && { finalGateSnapshot: gateSnapshots[gateSnapshots.length - 1] }),
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
catch (err) {
|
|
328
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
329
|
-
log(`Stuck detection failed (non-blocking): ${message}`);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
// Gutter threshold exit (after stuck detection may have adjusted gutterCount)
|
|
333
|
-
if (gutterCount >= this.config.gutterThreshold) {
|
|
334
|
-
return withCosts({
|
|
335
|
-
reason: 'stalled',
|
|
336
|
-
iterations: i,
|
|
337
|
-
gutterCount,
|
|
338
|
-
model: resolvedModel,
|
|
339
|
-
output: lastOutput,
|
|
340
|
-
...(gateSnapshots.length > 0 && { finalGateSnapshot: gateSnapshots[gateSnapshots.length - 1] }),
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
// Write checkpoint after iteration to allow resume on restart
|
|
344
|
-
if (this.config.onCheckpoint) {
|
|
345
|
-
try {
|
|
346
|
-
await this.config.onCheckpoint(this.ticketId, {
|
|
347
|
-
run_id: this.config.runId ?? '00000000-0000-0000-0000-000000000000',
|
|
348
|
-
column_id: this.columnId,
|
|
349
|
-
iteration: i,
|
|
350
|
-
gutter_count: gutterCount,
|
|
351
|
-
advisor_invocations: 0, // tracked by orchestrator, not loop
|
|
352
|
-
model_tier: resolvedModel,
|
|
353
|
-
last_fingerprint: afterFp,
|
|
354
|
-
updated_at: new Date().toISOString(),
|
|
355
|
-
worktree_name: this.config.worktreeName,
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
catch (err) {
|
|
359
|
-
// Checkpoint write must never block the loop
|
|
360
|
-
log(`Checkpoint write failed (non-blocking): ${err instanceof Error ? err.message : String(err)}`);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return withCosts({
|
|
365
|
-
reason: 'max_iterations',
|
|
366
|
-
iterations: this.config.maxIterations,
|
|
367
|
-
gutterCount,
|
|
368
|
-
model: resolvedModel,
|
|
369
|
-
output: lastOutput,
|
|
370
|
-
...(gateSnapshots.length > 0 && { finalGateSnapshot: gateSnapshots[gateSnapshots.length - 1] }),
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
function fingerprintsMatch(a, b) {
|
|
375
|
-
// column_id change is detected separately (exits as 'moved').
|
|
376
|
-
// signal_count is excluded because dependency-blocked agents inflate it.
|
|
377
|
-
// comment_count IS included because agents are instructed to create
|
|
378
|
-
// iteration summary comments — genuine new comments indicate progress.
|
|
379
|
-
return a.column_id === b.column_id
|
|
380
|
-
&& a.field_value_count === b.field_value_count
|
|
381
|
-
&& a.comment_count === b.comment_count;
|
|
382
|
-
}
|
|
383
|
-
//# sourceMappingURL=ralph-loop.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ralph-loop.js","sourceRoot":"","sources":["../../src/lib/ralph-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/reaper.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { ChildProcess } from 'node:child_process';
|
|
2
|
-
export declare const REAPER_POLL_MS = 3000;
|
|
3
|
-
export interface ReaperConfig {
|
|
4
|
-
orchestratorPid: number;
|
|
5
|
-
manifestPath: string;
|
|
6
|
-
pidFilePath: string;
|
|
7
|
-
reaperPidPath: string;
|
|
8
|
-
mcpConfigPath: string;
|
|
9
|
-
pipelineDir: string;
|
|
10
|
-
}
|
|
11
|
-
export declare function buildReaperScript(config: ReaperConfig): string;
|
|
12
|
-
export declare function spawnReaper(config: ReaperConfig): ChildProcess;
|
|
13
|
-
export declare function killReaper(reaperPidPath: string): void;
|
|
14
|
-
//# sourceMappingURL=reaper.d.ts.map
|
package/dist/lib/reaper.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reaper.d.ts","sourceRoot":"","sources":["../../src/lib/reaper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgF9D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAe9D;AAED,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAiBtD"}
|
package/dist/lib/reaper.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { writeFileSync, unlinkSync, readFileSync } from 'node:fs';
|
|
3
|
-
export const REAPER_POLL_MS = 3000;
|
|
4
|
-
export function buildReaperScript(config) {
|
|
5
|
-
return `
|
|
6
|
-
const fs = require('fs');
|
|
7
|
-
const path = require('path');
|
|
8
|
-
|
|
9
|
-
const ORCHESTRATOR_PID = ${config.orchestratorPid};
|
|
10
|
-
const MANIFEST_PATH = ${JSON.stringify(config.manifestPath)};
|
|
11
|
-
const PID_FILE_PATH = ${JSON.stringify(config.pidFilePath)};
|
|
12
|
-
const REAPER_PID_PATH = ${JSON.stringify(config.reaperPidPath)};
|
|
13
|
-
const MCP_CONFIG_PATH = ${JSON.stringify(config.mcpConfigPath)};
|
|
14
|
-
const PIPELINE_DIR = ${JSON.stringify(config.pipelineDir)};
|
|
15
|
-
const POLL_MS = ${REAPER_POLL_MS};
|
|
16
|
-
|
|
17
|
-
function isAlive(pid) {
|
|
18
|
-
try { process.kill(pid, 0); return true; } catch { return false; }
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function readManifest() {
|
|
22
|
-
try {
|
|
23
|
-
return fs.readFileSync(MANIFEST_PATH, 'utf-8')
|
|
24
|
-
.split('\\n')
|
|
25
|
-
.map(l => parseInt(l.trim(), 10))
|
|
26
|
-
.filter(p => !isNaN(p) && p > 0);
|
|
27
|
-
} catch { return []; }
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function killPid(pid, signal) {
|
|
31
|
-
try { process.kill(pid, signal); } catch { /* already dead */ }
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function cleanup() {
|
|
35
|
-
const pids = readManifest();
|
|
36
|
-
for (const pid of pids) {
|
|
37
|
-
killPid(pid, 'SIGTERM');
|
|
38
|
-
try { process.kill(-pid, 'SIGTERM'); } catch { /* ignore */ }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
setTimeout(() => {
|
|
42
|
-
for (const pid of pids) {
|
|
43
|
-
if (isAlive(pid)) {
|
|
44
|
-
killPid(pid, 'SIGKILL');
|
|
45
|
-
try { process.kill(-pid, 'SIGKILL'); } catch { /* ignore */ }
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
try { fs.unlinkSync(MANIFEST_PATH); } catch {}
|
|
50
|
-
try { fs.unlinkSync(PID_FILE_PATH); } catch {}
|
|
51
|
-
try { fs.unlinkSync(REAPER_PID_PATH); } catch {}
|
|
52
|
-
try { fs.unlinkSync(MCP_CONFIG_PATH); } catch {}
|
|
53
|
-
|
|
54
|
-
try {
|
|
55
|
-
const files = fs.readdirSync(PIPELINE_DIR);
|
|
56
|
-
for (const f of files) {
|
|
57
|
-
if (f.startsWith('mcp-config-') && f.endsWith('.json')) {
|
|
58
|
-
try { fs.unlinkSync(path.join(PIPELINE_DIR, f)); } catch {}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
} catch {}
|
|
62
|
-
|
|
63
|
-
process.exit(0);
|
|
64
|
-
}, 5000);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function pidFileExists() {
|
|
68
|
-
try { fs.accessSync(PID_FILE_PATH); return true; } catch { return false; }
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const timer = setInterval(() => {
|
|
72
|
-
if (!pidFileExists()) {
|
|
73
|
-
clearInterval(timer);
|
|
74
|
-
process.exit(0);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (!isAlive(ORCHESTRATOR_PID)) {
|
|
79
|
-
clearInterval(timer);
|
|
80
|
-
cleanup();
|
|
81
|
-
}
|
|
82
|
-
}, POLL_MS);
|
|
83
|
-
`;
|
|
84
|
-
}
|
|
85
|
-
export function spawnReaper(config) {
|
|
86
|
-
const script = buildReaperScript(config);
|
|
87
|
-
const child = spawn(process.execPath, ['-e', script], {
|
|
88
|
-
detached: true,
|
|
89
|
-
stdio: 'ignore',
|
|
90
|
-
});
|
|
91
|
-
child.unref();
|
|
92
|
-
if (child.pid) {
|
|
93
|
-
writeFileSync(config.reaperPidPath, String(child.pid), { mode: 0o600 });
|
|
94
|
-
}
|
|
95
|
-
return child;
|
|
96
|
-
}
|
|
97
|
-
export function killReaper(reaperPidPath) {
|
|
98
|
-
try {
|
|
99
|
-
const pid = parseInt(readFileSync(reaperPidPath, 'utf-8').trim(), 10);
|
|
100
|
-
if (pid && !isNaN(pid)) {
|
|
101
|
-
process.kill(pid, 'SIGTERM');
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
/* reaper already dead or PID file gone */
|
|
106
|
-
}
|
|
107
|
-
try {
|
|
108
|
-
unlinkSync(reaperPidPath);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
/* already removed */
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=reaper.js.map
|
package/dist/lib/reaper.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reaper.js","sourceRoot":"","sources":["../../src/lib/reaper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGlE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAWnC,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,OAAO;;;;2BAIkB,MAAM,CAAC,eAAe;wBACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;wBACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;0BAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;0BACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;uBACvC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;kBACvC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoE/B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;QACpD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,aAAa,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,aAAqB;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAC3C,EAAE,CACH,CAAC;QACF,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IACD,IAAI,CAAC;QACH,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;AACH,CAAC"}
|
package/dist/lib/replanner.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export interface ReplannerTriggers {
|
|
3
|
-
escalation_count: number;
|
|
4
|
-
cost_threshold_pct: number;
|
|
5
|
-
repeated_gate_failure_count: number;
|
|
6
|
-
duration_threshold_minutes: number;
|
|
7
|
-
}
|
|
8
|
-
export interface PipelineState {
|
|
9
|
-
escalatedTickets: number;
|
|
10
|
-
totalTokensIn: number;
|
|
11
|
-
maxInputTokens: number;
|
|
12
|
-
repeatedGateFailures: Record<string, number>;
|
|
13
|
-
durationMinutes: number;
|
|
14
|
-
}
|
|
15
|
-
export declare function shouldFireReplanner(triggers: ReplannerTriggers, state: PipelineState): boolean;
|
|
16
|
-
declare const ReplannerResponseSchema: z.ZodObject<{
|
|
17
|
-
action: z.ZodEnum<["CONTINUE", "PAUSE_PIPELINE", "ARCHIVE_TICKETS", "CREATE_SIGNAL", "ADJUST_BUDGET", "ESCALATE_ALL"]>;
|
|
18
|
-
reason: z.ZodString;
|
|
19
|
-
ticket_ids: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
20
|
-
signal_content: z.ZodOptional<z.ZodString>;
|
|
21
|
-
new_max_input_tokens: z.ZodOptional<z.ZodNumber>;
|
|
22
|
-
}, "strip", z.ZodTypeAny, {
|
|
23
|
-
action: "CONTINUE" | "PAUSE_PIPELINE" | "ARCHIVE_TICKETS" | "CREATE_SIGNAL" | "ADJUST_BUDGET" | "ESCALATE_ALL";
|
|
24
|
-
reason: string;
|
|
25
|
-
ticket_ids?: string[] | undefined;
|
|
26
|
-
signal_content?: string | undefined;
|
|
27
|
-
new_max_input_tokens?: number | undefined;
|
|
28
|
-
}, {
|
|
29
|
-
action: "CONTINUE" | "PAUSE_PIPELINE" | "ARCHIVE_TICKETS" | "CREATE_SIGNAL" | "ADJUST_BUDGET" | "ESCALATE_ALL";
|
|
30
|
-
reason: string;
|
|
31
|
-
ticket_ids?: string[] | undefined;
|
|
32
|
-
signal_content?: string | undefined;
|
|
33
|
-
new_max_input_tokens?: number | undefined;
|
|
34
|
-
}>;
|
|
35
|
-
export type ReplannerResponse = z.infer<typeof ReplannerResponseSchema>;
|
|
36
|
-
export declare function composeReplannerPrompt(state: PipelineState & {
|
|
37
|
-
ticketSummaries: Array<{
|
|
38
|
-
id: string;
|
|
39
|
-
title: string;
|
|
40
|
-
column: string;
|
|
41
|
-
status: string;
|
|
42
|
-
iterations: number;
|
|
43
|
-
gatePassRate: number;
|
|
44
|
-
}>;
|
|
45
|
-
triggerReason: string;
|
|
46
|
-
}): string;
|
|
47
|
-
export declare function parseReplannerResponse(raw: string): ReplannerResponse;
|
|
48
|
-
export {};
|
|
49
|
-
//# sourceMappingURL=replanner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replanner.d.ts","sourceRoot":"","sources":["../../src/lib/replanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;IACpC,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAW9F;AAMD,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG;IAC5D,eAAe,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChI,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CA0BT;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAOrE"}
|