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/checkpoint.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { LoopCheckpointSchema } from '@kantban/types';
|
|
2
|
-
export const CHECKPOINT_FIELD = 'loop_checkpoint';
|
|
3
|
-
/** Default stale threshold in minutes. 600 minutes = 10 hours. */
|
|
4
|
-
const DEFAULT_STALE_THRESHOLD_MINUTES = 600;
|
|
5
|
-
export async function writeCheckpoint(deps, ticketId, checkpoint) {
|
|
6
|
-
try {
|
|
7
|
-
await deps.setFieldValue(ticketId, CHECKPOINT_FIELD, checkpoint);
|
|
8
|
-
}
|
|
9
|
-
catch (err) {
|
|
10
|
-
// Fire-and-forget: checkpoint writes must never block the loop
|
|
11
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
12
|
-
console.warn(`[checkpoint] writeCheckpoint failed for ${ticketId}: ${msg}`);
|
|
13
|
-
deps.emitEvent?.('checkpoint_write_failed', `Checkpoint write failed: ${msg}`, ticketId);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export async function readCheckpoint(deps, ticketId, currentColumnId, staleMinutes) {
|
|
17
|
-
try {
|
|
18
|
-
const fields = await deps.getFieldValues(ticketId);
|
|
19
|
-
const entry = fields.find((f) => f.field_name === CHECKPOINT_FIELD);
|
|
20
|
-
if (!entry)
|
|
21
|
-
return null;
|
|
22
|
-
const parsed = LoopCheckpointSchema.safeParse(entry.value);
|
|
23
|
-
if (!parsed.success)
|
|
24
|
-
return null;
|
|
25
|
-
const checkpoint = parsed.data;
|
|
26
|
-
if (checkpoint.column_id !== currentColumnId)
|
|
27
|
-
return null;
|
|
28
|
-
const threshold = Math.max(staleMinutes ?? DEFAULT_STALE_THRESHOLD_MINUTES, 1);
|
|
29
|
-
const updatedAt = new Date(checkpoint.updated_at).getTime();
|
|
30
|
-
const ageMinutes = (Date.now() - updatedAt) / (1000 * 60);
|
|
31
|
-
if (ageMinutes > threshold)
|
|
32
|
-
return null;
|
|
33
|
-
return checkpoint;
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
console.warn(`[checkpoint] readCheckpoint failed for ${ticketId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export async function clearCheckpoint(deps, ticketId) {
|
|
41
|
-
try {
|
|
42
|
-
await deps.setFieldValue(ticketId, CHECKPOINT_FIELD, null);
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
// Fire-and-forget: checkpoint clears must never block the loop
|
|
46
|
-
console.warn(`[checkpoint] clearCheckpoint failed for ${ticketId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/lib/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,gBAAgB,CAAC;AAG3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAClD,kEAAkE;AAClE,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAQ5C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAoB,EACpB,QAAgB,EAChB,UAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,+DAA+D;QAC/D,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,2CAA2C,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,EAAE,CAAC,yBAAyB,EAAE,4BAA4B,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAoB,EACpB,QAAgB,EAChB,eAAuB,EACvB,YAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAE/B,IAAI,UAAU,CAAC,SAAS,KAAK,eAAe;YAAE,OAAO,IAAI,CAAC;QAE1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,+BAA+B,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1D,IAAI,UAAU,GAAG,SAAS;YAAE,OAAO,IAAI,CAAC;QAExC,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,0CAA0C,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAoB,EACpB,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,+DAA+D;QAC/D,OAAO,CAAC,IAAI,CAAC,2CAA2C,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3H,CAAC;AACH,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure firing constraint evaluator for the pipeline orchestrator.
|
|
3
|
-
*
|
|
4
|
-
* Ported from apps/api/src/services/firing-constraints.service.ts with
|
|
5
|
-
* orchestrator-specific enhancements:
|
|
6
|
-
* - `last_fired_at` resolved from in-memory Map (seconds since last fire)
|
|
7
|
-
* - `active_loops` resolved from orchestrator runtime state
|
|
8
|
-
*
|
|
9
|
-
* This module has ZERO side-effects and ZERO external dependencies beyond
|
|
10
|
-
* @kantban/types. All data flows in via the BoardState parameter.
|
|
11
|
-
*/
|
|
12
|
-
import type { FiringConstraint, EvaluateFiringConstraintResult } from '@kantban/types';
|
|
13
|
-
export interface ColumnState {
|
|
14
|
-
id: string;
|
|
15
|
-
name: string;
|
|
16
|
-
position: number;
|
|
17
|
-
column_type: string;
|
|
18
|
-
wip_limit: number | null;
|
|
19
|
-
ticket_count: number;
|
|
20
|
-
}
|
|
21
|
-
export interface BoardState {
|
|
22
|
-
columns: ColumnState[];
|
|
23
|
-
active_loops: Map<string, number>;
|
|
24
|
-
/** Seconds since last fire per column. Missing key = never fired. */
|
|
25
|
-
last_fired_at: Map<string, number>;
|
|
26
|
-
circuit_breaker_count: number;
|
|
27
|
-
backlog_ticket_count: number;
|
|
28
|
-
}
|
|
29
|
-
export interface EvalSummary {
|
|
30
|
-
total: number;
|
|
31
|
-
passed: number;
|
|
32
|
-
failed: number;
|
|
33
|
-
errors: number;
|
|
34
|
-
}
|
|
35
|
-
export interface EvalResult {
|
|
36
|
-
results: EvaluateFiringConstraintResult[];
|
|
37
|
-
summary: EvalSummary;
|
|
38
|
-
}
|
|
39
|
-
export declare function evaluateConstraints(constraints: FiringConstraint[], board: BoardState, columnId: string, now?: Date): EvalResult;
|
|
40
|
-
//# sourceMappingURL=constraint-evaluator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constraint-evaluator.d.ts","sourceRoot":"","sources":["../../src/lib/constraint-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,qEAAqE;IACrE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,8BAA8B,EAAE,CAAC;IAC1C,OAAO,EAAE,WAAW,CAAC;CACtB;AAoED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,IAAI,GACT,UAAU,CA4IZ"}
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure firing constraint evaluator for the pipeline orchestrator.
|
|
3
|
-
*
|
|
4
|
-
* Ported from apps/api/src/services/firing-constraints.service.ts with
|
|
5
|
-
* orchestrator-specific enhancements:
|
|
6
|
-
* - `last_fired_at` resolved from in-memory Map (seconds since last fire)
|
|
7
|
-
* - `active_loops` resolved from orchestrator runtime state
|
|
8
|
-
*
|
|
9
|
-
* This module has ZERO side-effects and ZERO external dependencies beyond
|
|
10
|
-
* @kantban/types. All data flows in via the BoardState parameter.
|
|
11
|
-
*/
|
|
12
|
-
// ── Column Ref Resolution ────────────────────────────────────────────────────
|
|
13
|
-
function resolveColumn(board, columnId, subjectRef) {
|
|
14
|
-
const ref = subjectRef ?? 'self';
|
|
15
|
-
if (ref === 'self' || ref === null) {
|
|
16
|
-
const col = board.columns.find((c) => c.id === columnId) ?? null;
|
|
17
|
-
return { column: col, error: col ? null : `Column ${columnId} not found` };
|
|
18
|
-
}
|
|
19
|
-
if (ref === 'next') {
|
|
20
|
-
const sorted = [...board.columns].sort((a, b) => a.position - b.position);
|
|
21
|
-
const idx = sorted.findIndex((c) => c.id === columnId);
|
|
22
|
-
const next = idx >= 0 && idx < sorted.length - 1 ? sorted[idx + 1] : null;
|
|
23
|
-
return { column: next, error: next ? null : 'No next column exists' };
|
|
24
|
-
}
|
|
25
|
-
if (ref === 'prev') {
|
|
26
|
-
const sorted = [...board.columns].sort((a, b) => a.position - b.position);
|
|
27
|
-
const idx = sorted.findIndex((c) => c.id === columnId);
|
|
28
|
-
const prev = idx > 0 ? sorted[idx - 1] : null;
|
|
29
|
-
return { column: prev, error: prev ? null : 'No prev column exists' };
|
|
30
|
-
}
|
|
31
|
-
// UUID reference
|
|
32
|
-
const col = board.columns.find((c) => c.id === ref) ?? null;
|
|
33
|
-
return { column: col, error: col ? null : `Column ${ref} not found` };
|
|
34
|
-
}
|
|
35
|
-
// ── Operator Evaluation ──────────────────────────────────────────────────────
|
|
36
|
-
function applyOperator(resolved, operator, threshold) {
|
|
37
|
-
// For eq/neq: try numeric comparison when both sides are valid numbers
|
|
38
|
-
// (DB may store numbers as strings e.g. resolved=3 vs threshold="3")
|
|
39
|
-
if (operator === 'eq' || operator === 'neq') {
|
|
40
|
-
const rn = Number(resolved);
|
|
41
|
-
const tn = Number(threshold);
|
|
42
|
-
const bothNumeric = !isNaN(rn) && !isNaN(tn) && resolved !== '' && threshold !== '';
|
|
43
|
-
const equal = bothNumeric ? rn === tn : resolved === threshold;
|
|
44
|
-
return operator === 'eq' ? equal : !equal;
|
|
45
|
-
}
|
|
46
|
-
// For ordering operators, coerce to number
|
|
47
|
-
const r = Number(resolved);
|
|
48
|
-
const t = Number(threshold);
|
|
49
|
-
if (isNaN(r) || isNaN(t))
|
|
50
|
-
return false;
|
|
51
|
-
switch (operator) {
|
|
52
|
-
case 'lt': return r < t;
|
|
53
|
-
case 'lte': return r <= t;
|
|
54
|
-
case 'gt': return r > t;
|
|
55
|
-
case 'gte': return r >= t;
|
|
56
|
-
default: return false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
// ── Pure Evaluation Engine ───────────────────────────────────────────────────
|
|
60
|
-
export function evaluateConstraints(constraints, board, columnId, now) {
|
|
61
|
-
// Filter to enabled column-scope only, sort by position ascending
|
|
62
|
-
const enabled = constraints
|
|
63
|
-
.filter((c) => c.enabled && c.scope === 'column')
|
|
64
|
-
.sort((a, b) => a.position - b.position);
|
|
65
|
-
const results = [];
|
|
66
|
-
const summary = { total: 0, passed: 0, failed: 0, errors: 0 };
|
|
67
|
-
for (const constraint of enabled) {
|
|
68
|
-
summary.total++;
|
|
69
|
-
let resolvedValue = null;
|
|
70
|
-
let resolveError = null;
|
|
71
|
-
const subjectType = constraint.subject_type;
|
|
72
|
-
const subjectRef = constraint.subject_ref;
|
|
73
|
-
switch (subjectType) {
|
|
74
|
-
case 'column.ticket_count': {
|
|
75
|
-
const { column, error } = resolveColumn(board, columnId, subjectRef);
|
|
76
|
-
if (error || !column) {
|
|
77
|
-
resolveError = error ?? 'Column resolution failed';
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
resolvedValue = column.ticket_count;
|
|
81
|
-
}
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
case 'column.active_loops': {
|
|
85
|
-
const { column, error } = resolveColumn(board, columnId, subjectRef);
|
|
86
|
-
if (error || !column) {
|
|
87
|
-
resolveError = error ?? 'Column resolution failed';
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
resolvedValue = board.active_loops.get(column.id) ?? 0;
|
|
91
|
-
}
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
case 'column.wip_remaining': {
|
|
95
|
-
const { column, error } = resolveColumn(board, columnId, subjectRef);
|
|
96
|
-
if (error || !column) {
|
|
97
|
-
resolveError = error ?? 'Column resolution failed';
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
resolvedValue = column.wip_limit === null ? 999999 : column.wip_limit - column.ticket_count;
|
|
101
|
-
}
|
|
102
|
-
break;
|
|
103
|
-
}
|
|
104
|
-
case 'column.last_fired_at': {
|
|
105
|
-
const { column, error } = resolveColumn(board, columnId, subjectRef);
|
|
106
|
-
if (error || !column) {
|
|
107
|
-
resolveError = error ?? 'Column resolution failed';
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
// Seconds since last fire. If never fired, treat as Infinity (999999).
|
|
111
|
-
const secondsSinceLastFire = board.last_fired_at.get(column.id);
|
|
112
|
-
resolvedValue = secondsSinceLastFire ?? 999999;
|
|
113
|
-
}
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
case 'board.total_active_loops': {
|
|
117
|
-
let total = 0;
|
|
118
|
-
for (const v of board.active_loops.values()) {
|
|
119
|
-
total += v;
|
|
120
|
-
}
|
|
121
|
-
resolvedValue = total;
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
case 'board.circuit_breaker_count': {
|
|
125
|
-
resolvedValue = board.circuit_breaker_count;
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
case 'backlog.ticket_count': {
|
|
129
|
-
resolvedValue = board.backlog_ticket_count;
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
case 'ticket.field_value': {
|
|
133
|
-
resolveError = 'ticket.field_value requires ticket context (ticket-scope only)';
|
|
134
|
-
resolvedValue = null;
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
case 'time.hour': {
|
|
138
|
-
const date = now ?? new Date();
|
|
139
|
-
resolvedValue = date.getUTCHours();
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
default: {
|
|
143
|
-
resolveError = `Unknown subject type: ${subjectType}`;
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Fail-closed by default, unless fail_open explicitly set
|
|
148
|
-
if (resolveError !== null) {
|
|
149
|
-
summary.errors++;
|
|
150
|
-
const failOpen = constraint.fail_open === true;
|
|
151
|
-
const passed = failOpen;
|
|
152
|
-
results.push({
|
|
153
|
-
constraint_id: constraint.id,
|
|
154
|
-
name: constraint.name,
|
|
155
|
-
column_id: constraint.column_id,
|
|
156
|
-
passed,
|
|
157
|
-
resolved_value: null,
|
|
158
|
-
threshold: { operator: constraint.operator, value: constraint.value },
|
|
159
|
-
error: failOpen
|
|
160
|
-
? `Unresolvable (fail_open=true): ${resolveError}`
|
|
161
|
-
: `Unresolvable (fail-closed): ${resolveError}`,
|
|
162
|
-
});
|
|
163
|
-
if (passed) {
|
|
164
|
-
summary.passed++;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
summary.failed++;
|
|
168
|
-
}
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
const passed = applyOperator(resolvedValue, constraint.operator, constraint.value);
|
|
172
|
-
results.push({
|
|
173
|
-
constraint_id: constraint.id,
|
|
174
|
-
name: constraint.name,
|
|
175
|
-
column_id: constraint.column_id,
|
|
176
|
-
passed,
|
|
177
|
-
resolved_value: resolvedValue,
|
|
178
|
-
threshold: { operator: constraint.operator, value: constraint.value },
|
|
179
|
-
});
|
|
180
|
-
if (passed) {
|
|
181
|
-
summary.passed++;
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
summary.failed++;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return { results, summary };
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=constraint-evaluator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constraint-evaluator.js","sourceRoot":"","sources":["../../src/lib/constraint-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { BudgetConfig, InvocationType } from '@kantban/types';
|
|
2
|
-
interface InvocationRecord {
|
|
3
|
-
ticketId: string;
|
|
4
|
-
columnId: string;
|
|
5
|
-
model: string;
|
|
6
|
-
tokensIn: number;
|
|
7
|
-
tokensOut: number;
|
|
8
|
-
type: InvocationType;
|
|
9
|
-
}
|
|
10
|
-
interface TicketCost {
|
|
11
|
-
tokens_in: number;
|
|
12
|
-
tokens_out: number;
|
|
13
|
-
iterations: number;
|
|
14
|
-
advisor_calls: number;
|
|
15
|
-
}
|
|
16
|
-
interface ColumnCost {
|
|
17
|
-
tokens_in: number;
|
|
18
|
-
tokens_out: number;
|
|
19
|
-
light_calls: number;
|
|
20
|
-
heavy_calls: number;
|
|
21
|
-
advisor_calls: number;
|
|
22
|
-
}
|
|
23
|
-
export declare class PipelineCostTracker {
|
|
24
|
-
private readonly runId;
|
|
25
|
-
private readonly budget;
|
|
26
|
-
private _totalIn;
|
|
27
|
-
private _totalOut;
|
|
28
|
-
private readonly ticketCosts;
|
|
29
|
-
private readonly columnCosts;
|
|
30
|
-
private readonly modelCosts;
|
|
31
|
-
constructor(runId: string, budget: BudgetConfig | undefined);
|
|
32
|
-
get totalTokensIn(): number;
|
|
33
|
-
get totalTokensOut(): number;
|
|
34
|
-
get maxInputTokens(): number;
|
|
35
|
-
record(inv: InvocationRecord): void;
|
|
36
|
-
getTicketCost(ticketId: string): TicketCost | undefined;
|
|
37
|
-
getColumnCost(columnId: string): ColumnCost | undefined;
|
|
38
|
-
isWarning(): boolean;
|
|
39
|
-
isExhausted(): boolean;
|
|
40
|
-
generateReport(pricing?: Record<string, {
|
|
41
|
-
input_per_mtok: number;
|
|
42
|
-
output_per_mtok: number;
|
|
43
|
-
}>): string;
|
|
44
|
-
}
|
|
45
|
-
export {};
|
|
46
|
-
//# sourceMappingURL=cost-tracker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/lib/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;gBAEpD,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS;IAK3D,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAwCnC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvD,SAAS,IAAI,OAAO;IAOpB,WAAW,IAAI,OAAO;IAQtB,cAAc,CACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,GAC5E,MAAM;CA6CV"}
|
package/dist/lib/cost-tracker.js
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
export class PipelineCostTracker {
|
|
2
|
-
runId;
|
|
3
|
-
budget;
|
|
4
|
-
_totalIn = 0;
|
|
5
|
-
_totalOut = 0;
|
|
6
|
-
ticketCosts = new Map();
|
|
7
|
-
columnCosts = new Map();
|
|
8
|
-
modelCosts = new Map();
|
|
9
|
-
constructor(runId, budget) {
|
|
10
|
-
this.runId = runId;
|
|
11
|
-
this.budget = budget;
|
|
12
|
-
}
|
|
13
|
-
get totalTokensIn() {
|
|
14
|
-
return this._totalIn;
|
|
15
|
-
}
|
|
16
|
-
get totalTokensOut() {
|
|
17
|
-
return this._totalOut;
|
|
18
|
-
}
|
|
19
|
-
get maxInputTokens() {
|
|
20
|
-
return this.budget?.max_input_tokens ?? 5_000_000;
|
|
21
|
-
}
|
|
22
|
-
record(inv) {
|
|
23
|
-
this._totalIn += inv.tokensIn;
|
|
24
|
-
this._totalOut += inv.tokensOut;
|
|
25
|
-
// Per-ticket
|
|
26
|
-
const tc = this.ticketCosts.get(inv.ticketId) ?? {
|
|
27
|
-
tokens_in: 0,
|
|
28
|
-
tokens_out: 0,
|
|
29
|
-
iterations: 0,
|
|
30
|
-
advisor_calls: 0,
|
|
31
|
-
};
|
|
32
|
-
tc.tokens_in += inv.tokensIn;
|
|
33
|
-
tc.tokens_out += inv.tokensOut;
|
|
34
|
-
if (inv.type === 'heavy')
|
|
35
|
-
tc.iterations++;
|
|
36
|
-
if (inv.type === 'advisor')
|
|
37
|
-
tc.advisor_calls++;
|
|
38
|
-
this.ticketCosts.set(inv.ticketId, tc);
|
|
39
|
-
// Per-column
|
|
40
|
-
const cc = this.columnCosts.get(inv.columnId) ?? {
|
|
41
|
-
tokens_in: 0,
|
|
42
|
-
tokens_out: 0,
|
|
43
|
-
light_calls: 0,
|
|
44
|
-
heavy_calls: 0,
|
|
45
|
-
advisor_calls: 0,
|
|
46
|
-
};
|
|
47
|
-
cc.tokens_in += inv.tokensIn;
|
|
48
|
-
cc.tokens_out += inv.tokensOut;
|
|
49
|
-
if (inv.type === 'light')
|
|
50
|
-
cc.light_calls++;
|
|
51
|
-
if (inv.type === 'heavy')
|
|
52
|
-
cc.heavy_calls++;
|
|
53
|
-
if (inv.type === 'advisor' || inv.type === 'stuck_detection')
|
|
54
|
-
cc.advisor_calls++;
|
|
55
|
-
this.columnCosts.set(inv.columnId, cc);
|
|
56
|
-
// Per-model
|
|
57
|
-
const mc = this.modelCosts.get(inv.model) ?? { tokens_in: 0, tokens_out: 0, calls: 0 };
|
|
58
|
-
mc.tokens_in += inv.tokensIn;
|
|
59
|
-
mc.tokens_out += inv.tokensOut;
|
|
60
|
-
mc.calls++;
|
|
61
|
-
this.modelCosts.set(inv.model, mc);
|
|
62
|
-
}
|
|
63
|
-
getTicketCost(ticketId) {
|
|
64
|
-
return this.ticketCosts.get(ticketId);
|
|
65
|
-
}
|
|
66
|
-
getColumnCost(columnId) {
|
|
67
|
-
return this.columnCosts.get(columnId);
|
|
68
|
-
}
|
|
69
|
-
isWarning() {
|
|
70
|
-
if (!this.budget)
|
|
71
|
-
return false;
|
|
72
|
-
const inPct = (this._totalIn / this.budget.max_input_tokens) * 100;
|
|
73
|
-
const outPct = (this._totalOut / this.budget.max_output_tokens) * 100;
|
|
74
|
-
return inPct >= this.budget.warn_pct || outPct >= this.budget.warn_pct;
|
|
75
|
-
}
|
|
76
|
-
isExhausted() {
|
|
77
|
-
if (!this.budget)
|
|
78
|
-
return false;
|
|
79
|
-
return (this._totalIn >= this.budget.max_input_tokens ||
|
|
80
|
-
this._totalOut >= this.budget.max_output_tokens);
|
|
81
|
-
}
|
|
82
|
-
generateReport(pricing) {
|
|
83
|
-
const fmt = (n) => {
|
|
84
|
-
if (n >= 1_000_000)
|
|
85
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
86
|
-
if (n >= 1_000)
|
|
87
|
-
return `${(n / 1_000).toFixed(0)}K`;
|
|
88
|
-
return String(n);
|
|
89
|
-
};
|
|
90
|
-
const lines = [];
|
|
91
|
-
const budgetStr = this.budget
|
|
92
|
-
? ` (of ${fmt(this.budget.max_input_tokens)} / ${fmt(this.budget.max_output_tokens)} budget)`
|
|
93
|
-
: '';
|
|
94
|
-
lines.push(`Tokens: ${fmt(this._totalIn)} in / ${fmt(this._totalOut)} out${budgetStr}`);
|
|
95
|
-
if (this.columnCosts.size > 0) {
|
|
96
|
-
const colParts = Array.from(this.columnCosts.entries()).map(([id, c]) => `${id.slice(0, 8)} ${fmt(c.tokens_in)}/${fmt(c.tokens_out)}`);
|
|
97
|
-
lines.push(` By column: ${colParts.join(', ')}`);
|
|
98
|
-
}
|
|
99
|
-
if (this.modelCosts.size > 0) {
|
|
100
|
-
const modelParts = Array.from(this.modelCosts.entries()).map(([model, c]) => `${model} ${fmt(c.tokens_in)}/${fmt(c.tokens_out)} (${c.calls} calls)`);
|
|
101
|
-
lines.push(` By model: ${modelParts.join(', ')}`);
|
|
102
|
-
}
|
|
103
|
-
// Dollar estimate only if pricing provided
|
|
104
|
-
if (pricing) {
|
|
105
|
-
let totalCost = 0;
|
|
106
|
-
for (const [model, mc] of this.modelCosts) {
|
|
107
|
-
const p = pricing[model];
|
|
108
|
-
if (p) {
|
|
109
|
-
totalCost += (mc.tokens_in / 1_000_000) * p.input_per_mtok;
|
|
110
|
-
totalCost += (mc.tokens_out / 1_000_000) * p.output_per_mtok;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (totalCost > 0) {
|
|
114
|
-
lines.push(` Estimated cost: $${totalCost.toFixed(2)} (user-provided pricing)`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return lines.join('\n');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=cost-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/lib/cost-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/evaluator.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { type Verdict, type GateResult } from '@kantban/types';
|
|
2
|
-
interface EvaluatorPromptInput {
|
|
3
|
-
ticketTitle: string;
|
|
4
|
-
ticketNumber: number;
|
|
5
|
-
columnPrompt: string;
|
|
6
|
-
diff: string;
|
|
7
|
-
gateResults: GateResult[];
|
|
8
|
-
handoff: Record<string, unknown>;
|
|
9
|
-
}
|
|
10
|
-
export declare function composeEvaluatorPrompt(input: EvaluatorPromptInput): string;
|
|
11
|
-
export declare function parseVerdict(raw: string): Verdict & {
|
|
12
|
-
parseFailed?: boolean;
|
|
13
|
-
};
|
|
14
|
-
export type VerdictAction = 'forward' | 'reject' | 'forward_with_signals';
|
|
15
|
-
export declare function resolveVerdictAction(verdict: Verdict): VerdictAction;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/lib/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAc9E,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAwC1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAa7E;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,sBAAsB,CAAC;AAE1E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAQpE"}
|
package/dist/lib/evaluator.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { VerdictSchema } from '@kantban/types';
|
|
2
|
-
import { parseJsonFromLlmOutput } from './parse-utils.js';
|
|
3
|
-
const ADVERSARIAL_PREAMBLE = `You are an ADVERSARIAL REVIEWER. Your job is to find problems, not to approve.
|
|
4
|
-
|
|
5
|
-
Rules:
|
|
6
|
-
1. You MUST return a structured verdict using submit_verdict (see below).
|
|
7
|
-
2. Finding no problems is acceptable but suspicious — look harder before approving.
|
|
8
|
-
3. The agent that did this work will tell you it's great. It's lying. Check everything.
|
|
9
|
-
4. You have full tool access. Use it to probe claims — run tests, read code, check builds.
|
|
10
|
-
5. Gate results show objective pass/fail. Your job is everything gates CAN'T check:
|
|
11
|
-
code quality, architecture fit, edge cases, security, naming, duplication.
|
|
12
|
-
6. Do NOT fix problems. Document them in your verdict. The worker agent will fix them.`;
|
|
13
|
-
export function composeEvaluatorPrompt(input) {
|
|
14
|
-
const parts = [];
|
|
15
|
-
parts.push(ADVERSARIAL_PREAMBLE);
|
|
16
|
-
parts.push(`\n## Ticket: #${input.ticketNumber} "${input.ticketTitle}"`);
|
|
17
|
-
// Column prompt (review instructions)
|
|
18
|
-
parts.push(`\n## Review Instructions\n${input.columnPrompt}`);
|
|
19
|
-
// Handoff data from worker
|
|
20
|
-
if (Object.keys(input.handoff).length > 0) {
|
|
21
|
-
parts.push(`\n## Handoff Data\n${JSON.stringify(input.handoff, null, 2)}`);
|
|
22
|
-
}
|
|
23
|
-
// Gate results from worker column
|
|
24
|
-
if (input.gateResults.length > 0) {
|
|
25
|
-
parts.push(`\n## Worker Gate Results`);
|
|
26
|
-
for (const r of input.gateResults) {
|
|
27
|
-
parts.push(`- ${r.name}: ${r.passed ? 'PASS' : 'FAIL'}${r.required ? ' (required)' : ''}`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
// Diff
|
|
31
|
-
if (input.diff) {
|
|
32
|
-
parts.push(`\n## Code Changes\n\`\`\`diff\n${input.diff}\n\`\`\``);
|
|
33
|
-
}
|
|
34
|
-
parts.push(`\n## Verdict Format
|
|
35
|
-
Call submit_verdict with a JSON object:
|
|
36
|
-
{
|
|
37
|
-
"decision": "approve" | "reject",
|
|
38
|
-
"summary": "one-line summary",
|
|
39
|
-
"findings": [
|
|
40
|
-
{ "severity": "blocker" | "warning" | "nit", "description": "...", "file": "...", "line": N }
|
|
41
|
-
]
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
If you do NOT call submit_verdict, the harness will treat this as a reject.`);
|
|
45
|
-
return parts.join('\n');
|
|
46
|
-
}
|
|
47
|
-
export function parseVerdict(raw) {
|
|
48
|
-
try {
|
|
49
|
-
const parsed = parseJsonFromLlmOutput(raw);
|
|
50
|
-
return VerdictSchema.parse(parsed);
|
|
51
|
-
}
|
|
52
|
-
catch (err) {
|
|
53
|
-
const msg = err instanceof Error ? err.message : 'unknown';
|
|
54
|
-
return {
|
|
55
|
-
decision: 'reject',
|
|
56
|
-
summary: `Evaluator verdict parse error: ${msg.slice(0, 100)}`,
|
|
57
|
-
findings: [{ severity: 'blocker', description: `Verdict parse error — raw output did not contain valid JSON verdict. Error: ${msg.slice(0, 200)}` }],
|
|
58
|
-
parseFailed: true,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
export function resolveVerdictAction(verdict) {
|
|
63
|
-
if (verdict.decision === 'approve')
|
|
64
|
-
return 'forward';
|
|
65
|
-
const hasBlockers = verdict.findings.some((f) => f.severity === 'blocker');
|
|
66
|
-
if (hasBlockers || verdict.findings.length === 0)
|
|
67
|
-
return 'reject';
|
|
68
|
-
// Reject with only warnings/nits → forward with signals
|
|
69
|
-
return 'forward_with_signals';
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=evaluator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/lib/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { PipelineEventLayer, PipelineEventSeverity } from '@kantban/types';
|
|
2
|
-
export declare class PipelineEventEmitter {
|
|
3
|
-
private apiBaseUrl;
|
|
4
|
-
private projectId;
|
|
5
|
-
private apiToken;
|
|
6
|
-
private boardId;
|
|
7
|
-
private runId;
|
|
8
|
-
private buffer;
|
|
9
|
-
private flushTimer;
|
|
10
|
-
private closed;
|
|
11
|
-
private inFlight;
|
|
12
|
-
private static readonly MAX_BUFFER_SIZE;
|
|
13
|
-
constructor(apiBaseUrl: string, projectId: string, apiToken: string, boardId: string, runId: string);
|
|
14
|
-
emit(opts: {
|
|
15
|
-
layer: PipelineEventLayer;
|
|
16
|
-
eventType: string;
|
|
17
|
-
severity: PipelineEventSeverity;
|
|
18
|
-
summary: string;
|
|
19
|
-
detail?: Record<string, unknown> | null;
|
|
20
|
-
ticketId?: string | null;
|
|
21
|
-
columnId?: string | null;
|
|
22
|
-
sessionId?: string | null;
|
|
23
|
-
iteration?: number | null;
|
|
24
|
-
}): void;
|
|
25
|
-
flush(): Promise<void>;
|
|
26
|
-
close(): Promise<void>;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/lib/event-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAYrG,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IAXf,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAGvC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;IAKvB,IAAI,CAAC,IAAI,EAAE;QACT,KAAK,EAAE,kBAAkB,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,qBAAqB,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,GAAG,IAAI;IAwBF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B"}
|