kantban-cli 0.1.7 → 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.
Files changed (75) hide show
  1. package/dist/chunk-ZCUIGFSP.js +4111 -0
  2. package/dist/chunk-ZCUIGFSP.js.map +1 -0
  3. package/dist/context-7YDNTI3P.js +30 -0
  4. package/dist/context-7YDNTI3P.js.map +1 -0
  5. package/dist/cron-OKQP6QDF.js +112 -0
  6. package/dist/cron-OKQP6QDF.js.map +1 -0
  7. package/dist/index.d.ts +0 -2
  8. package/dist/index.js +179 -44
  9. package/dist/index.js.map +1 -1
  10. package/dist/pipeline-HTGCXNPL.js +4049 -0
  11. package/dist/pipeline-HTGCXNPL.js.map +1 -0
  12. package/dist/pipeline-init-IGZZOOLK.js +103 -0
  13. package/dist/pipeline-init-IGZZOOLK.js.map +1 -0
  14. package/dist/status-4GFXMVIM.js +128 -0
  15. package/dist/status-4GFXMVIM.js.map +1 -0
  16. package/dist/work-2V33NZAT.js +81 -0
  17. package/dist/work-2V33NZAT.js.map +1 -0
  18. package/package.json +7 -4
  19. package/dist/client.d.ts +0 -35
  20. package/dist/client.d.ts.map +0 -1
  21. package/dist/client.js +0 -109
  22. package/dist/client.js.map +0 -1
  23. package/dist/commands/context.d.ts +0 -3
  24. package/dist/commands/context.d.ts.map +0 -1
  25. package/dist/commands/context.js +0 -27
  26. package/dist/commands/context.js.map +0 -1
  27. package/dist/commands/cron.d.ts +0 -3
  28. package/dist/commands/cron.d.ts.map +0 -1
  29. package/dist/commands/cron.js +0 -106
  30. package/dist/commands/cron.js.map +0 -1
  31. package/dist/commands/pipeline.d.ts +0 -4
  32. package/dist/commands/pipeline.d.ts.map +0 -1
  33. package/dist/commands/pipeline.js +0 -645
  34. package/dist/commands/pipeline.js.map +0 -1
  35. package/dist/commands/status.d.ts +0 -3
  36. package/dist/commands/status.d.ts.map +0 -1
  37. package/dist/commands/status.js +0 -135
  38. package/dist/commands/status.js.map +0 -1
  39. package/dist/commands/work.d.ts +0 -3
  40. package/dist/commands/work.d.ts.map +0 -1
  41. package/dist/commands/work.js +0 -76
  42. package/dist/commands/work.js.map +0 -1
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/lib/constraint-evaluator.d.ts +0 -40
  45. package/dist/lib/constraint-evaluator.d.ts.map +0 -1
  46. package/dist/lib/constraint-evaluator.js +0 -180
  47. package/dist/lib/constraint-evaluator.js.map +0 -1
  48. package/dist/lib/event-queue.d.ts +0 -28
  49. package/dist/lib/event-queue.d.ts.map +0 -1
  50. package/dist/lib/event-queue.js +0 -73
  51. package/dist/lib/event-queue.js.map +0 -1
  52. package/dist/lib/logger.d.ts +0 -20
  53. package/dist/lib/logger.d.ts.map +0 -1
  54. package/dist/lib/logger.js +0 -52
  55. package/dist/lib/logger.js.map +0 -1
  56. package/dist/lib/mcp-config.d.ts +0 -9
  57. package/dist/lib/mcp-config.d.ts.map +0 -1
  58. package/dist/lib/mcp-config.js +0 -51
  59. package/dist/lib/mcp-config.js.map +0 -1
  60. package/dist/lib/orchestrator.d.ts +0 -238
  61. package/dist/lib/orchestrator.d.ts.map +0 -1
  62. package/dist/lib/orchestrator.js +0 -616
  63. package/dist/lib/orchestrator.js.map +0 -1
  64. package/dist/lib/prompt-composer.d.ts +0 -102
  65. package/dist/lib/prompt-composer.d.ts.map +0 -1
  66. package/dist/lib/prompt-composer.js +0 -182
  67. package/dist/lib/prompt-composer.js.map +0 -1
  68. package/dist/lib/ralph-loop.d.ts +0 -49
  69. package/dist/lib/ralph-loop.d.ts.map +0 -1
  70. package/dist/lib/ralph-loop.js +0 -174
  71. package/dist/lib/ralph-loop.js.map +0 -1
  72. package/dist/lib/ws-client.d.ts +0 -31
  73. package/dist/lib/ws-client.d.ts.map +0 -1
  74. package/dist/lib/ws-client.js +0 -110
  75. package/dist/lib/ws-client.js.map +0 -1
@@ -1,73 +0,0 @@
1
- function isDestructive(type) {
2
- return type === 'ticket:archived' || type === 'ticket:deleted';
3
- }
4
- export class EventQueue {
5
- queue = new Map(); // keyed by ticketId for coalescing
6
- handler;
7
- onError;
8
- timer = null;
9
- drainRateMs;
10
- running = false;
11
- draining = false;
12
- constructor(handler, options = {}) {
13
- this.handler = handler;
14
- this.drainRateMs = options.drainRateMs ?? 100;
15
- this.onError = options.onError ?? ((event, error) => console.error('EventQueue handler error for event', event, error));
16
- }
17
- start() {
18
- this.running = true;
19
- this.timer = setInterval(() => void this.drain(), this.drainRateMs);
20
- }
21
- stop() {
22
- this.running = false;
23
- if (this.timer) {
24
- clearInterval(this.timer);
25
- this.timer = null;
26
- }
27
- this.queue.clear();
28
- }
29
- push(event) {
30
- if (!this.running)
31
- return;
32
- // Coalesce move/create events (latest wins), but never overwrite
33
- // destructive events (archived/deleted) with non-destructive ones.
34
- const existing = this.queue.get(event.ticketId);
35
- if (existing && isDestructive(existing.type) && !isDestructive(event.type)) {
36
- return; // don't overwrite a deletion with a move
37
- }
38
- this.queue.set(event.ticketId, event);
39
- }
40
- pushPriority(event) {
41
- if (!this.running)
42
- return;
43
- // Priority events bypass the queue — execute immediately
44
- // Also remove from queue to prevent double-processing
45
- this.queue.delete(event.ticketId);
46
- const result = this.handler(event);
47
- if (result instanceof Promise) {
48
- result.catch((error) => this.onError(event, error));
49
- }
50
- }
51
- async drain() {
52
- if (this.draining)
53
- return;
54
- if (this.queue.size === 0)
55
- return;
56
- this.draining = true;
57
- try {
58
- // Take the first event (FIFO from Map insertion order)
59
- const [ticketId, event] = this.queue.entries().next().value;
60
- this.queue.delete(ticketId);
61
- try {
62
- await this.handler(event);
63
- }
64
- catch (error) {
65
- this.onError(event, error);
66
- }
67
- }
68
- finally {
69
- this.draining = false;
70
- }
71
- }
72
- }
73
- //# sourceMappingURL=event-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/lib/event-queue.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- export interface IterationLogData {
2
- promptSize: number;
3
- exitCode: number;
4
- duration: number;
5
- tokenUsage?: {
6
- input: number;
7
- output: number;
8
- cost?: number;
9
- };
10
- outcome: string;
11
- }
12
- export declare class PipelineLogger {
13
- private boardDir;
14
- constructor(baseDir: string, boardId: string);
15
- orchestrator(message: string): void;
16
- iteration(ticketNumber: string, iterationNum: number, data: IterationLogData): void;
17
- formatConsole(ticketNumber: string, columnName: string, iteration: number, status: string): string;
18
- pruneOldLogs(retentionDays: number): void;
19
- }
20
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK5C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnC,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAanF,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAOlG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;CAgB1C"}
@@ -1,52 +0,0 @@
1
- import { mkdirSync, writeFileSync, appendFileSync, readdirSync, rmSync, statSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- export class PipelineLogger {
4
- boardDir;
5
- constructor(baseDir, boardId) {
6
- this.boardDir = join(baseDir, boardId);
7
- mkdirSync(this.boardDir, { recursive: true });
8
- }
9
- orchestrator(message) {
10
- const logPath = join(this.boardDir, 'orchestrator.log');
11
- const entry = `[${new Date().toISOString()}] ${message}\n`;
12
- appendFileSync(logPath, entry);
13
- }
14
- iteration(ticketNumber, iterationNum, data) {
15
- const ticketDir = join(this.boardDir, ticketNumber);
16
- mkdirSync(ticketDir, { recursive: true });
17
- const padded = String(iterationNum).padStart(3, '0');
18
- const logPath = join(ticketDir, `iteration-${padded}.log`);
19
- const entry = {
20
- timestamp: new Date().toISOString(),
21
- iteration: iterationNum,
22
- ...data,
23
- };
24
- writeFileSync(logPath, JSON.stringify(entry, null, 2));
25
- }
26
- formatConsole(ticketNumber, columnName, iteration, status) {
27
- const time = new Date().toLocaleTimeString('en-US', { hour12: false });
28
- const ticket = ticketNumber.padEnd(10);
29
- const col = columnName.padEnd(12);
30
- return `[${time}] ${ticket} ${col} iter:${iteration} ${status}`;
31
- }
32
- pruneOldLogs(retentionDays) {
33
- const cutoff = Date.now() - (retentionDays * 24 * 60 * 60 * 1000);
34
- try {
35
- const entries = readdirSync(this.boardDir, { withFileTypes: true });
36
- for (const entry of entries) {
37
- if (!entry.isDirectory() || entry.name === '.')
38
- continue;
39
- const dirPath = join(this.boardDir, entry.name);
40
- try {
41
- const stat = statSync(dirPath);
42
- if (stat.mtimeMs < cutoff) {
43
- rmSync(dirPath, { recursive: true, force: true });
44
- }
45
- }
46
- catch { /* skip if stat fails */ }
47
- }
48
- }
49
- catch { /* skip if dir doesn't exist */ }
50
- }
51
- }
52
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,OAAO,cAAc;IACjB,QAAQ,CAAS;IAEzB,YAAY,OAAe,EAAE,OAAe;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,YAAY,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC;QAC3D,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,YAAoB,EAAE,YAAoB,EAAE,IAAsB;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACpD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,MAAM,MAAM,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,YAAY;YACvB,GAAG,IAAI;SACR,CAAC;QACF,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,aAAa,CAAC,YAAoB,EAAE,UAAkB,EAAE,SAAiB,EAAE,MAAc;QACvF,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,IAAI,IAAI,KAAK,MAAM,IAAI,GAAG,SAAS,SAAS,KAAK,MAAM,EAAE,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,aAAqB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG;oBAAE,SAAS;gBACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC/B,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;wBAC1B,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;IAC7C,CAAC;CACF"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Generate (or overwrite) a stable MCP config file for the given board.
3
- * Uses a deterministic path (~/.kantban/pipelines/<boardId>/mcp-config.json)
4
- * so that child claude -p processes can always find it, even if the
5
- * orchestrator restarts between iterations.
6
- */
7
- export declare function generateMcpConfig(apiUrl: string, apiToken: string, boardId: string): string;
8
- export declare function cleanupMcpConfig(filePath: string): void;
9
- //# sourceMappingURL=mcp-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-config.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmC3F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIvD"}
@@ -1,51 +0,0 @@
1
- import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { homedir } from 'node:os';
5
- const __filename = fileURLToPath(import.meta.url);
6
- const __dirname = dirname(__filename);
7
- /**
8
- * Generate (or overwrite) a stable MCP config file for the given board.
9
- * Uses a deterministic path (~/.kantban/pipelines/<boardId>/mcp-config.json)
10
- * so that child claude -p processes can always find it, even if the
11
- * orchestrator restarts between iterations.
12
- */
13
- export function generateMcpConfig(apiUrl, apiToken, boardId) {
14
- // Use local MCP server if running from the monorepo (dev mode),
15
- // otherwise fall back to the published npm package.
16
- const localMcpPath = join(__dirname, '..', '..', '..', 'mcp', 'dist', 'index.js');
17
- const useLocal = existsSync(localMcpPath);
18
- const kantbanServer = useLocal
19
- ? {
20
- command: 'node',
21
- args: [localMcpPath],
22
- env: {
23
- KANTBAN_API_TOKEN: apiToken,
24
- KANTBAN_API_URL: apiUrl,
25
- },
26
- }
27
- : {
28
- command: 'npx',
29
- args: ['-y', 'kantban-mcp@latest'],
30
- env: {
31
- KANTBAN_API_TOKEN: apiToken,
32
- KANTBAN_API_URL: apiUrl,
33
- },
34
- };
35
- const config = {
36
- mcpServers: {
37
- kantban: kantbanServer,
38
- },
39
- };
40
- const dir = join(homedir(), '.kantban', 'pipelines', boardId);
41
- mkdirSync(dir, { recursive: true });
42
- const filePath = join(dir, 'mcp-config.json');
43
- writeFileSync(filePath, JSON.stringify(config, null, 2));
44
- return filePath;
45
- }
46
- export function cleanupMcpConfig(filePath) {
47
- // Intentionally a no-op now — the stable config file is reusable across
48
- // pipeline runs and cheap to keep around. It contains no secrets beyond
49
- // the API token which is already in the user's env.
50
- }
51
- //# sourceMappingURL=mcp-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/lib/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAe;IACjF,gEAAgE;IAChE,oDAAoD;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAE1C,MAAM,aAAa,GAAG,QAAQ;QAC5B,CAAC,CAAC;YACE,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,YAAY,CAAC;YACpB,GAAG,EAAE;gBACH,iBAAiB,EAAE,QAAQ;gBAC3B,eAAe,EAAE,MAAM;aACxB;SACF;QACH,CAAC,CAAC;YACE,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC;YAClC,GAAG,EAAE;gBACH,iBAAiB,EAAE,QAAQ;gBAC3B,eAAe,EAAE,MAAM;aACxB;SACF,CAAC;IAEN,MAAM,MAAM,GAAG;QACb,UAAU,EAAE;YACV,OAAO,EAAE,aAAa;SACvB;KACF,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC9C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,wEAAwE;IACxE,yEAAyE;IACzE,oDAAoD;AACtD,CAAC"}
@@ -1,238 +0,0 @@
1
- import type { LoopConfig, LoopResult } from './ralph-loop.js';
2
- import type { PipelineEvent } from './event-queue.js';
3
- /**
4
- * Shape of a board-scope column as returned by fetchBoardScope.
5
- */
6
- interface BoardColumn {
7
- id: string;
8
- name: string;
9
- type: string;
10
- position: number;
11
- wip_limit: number | null;
12
- goal: string;
13
- ticket_count: number;
14
- has_prompt: boolean;
15
- }
16
- /**
17
- * Shape of the board-scope response.
18
- */
19
- interface BoardScope {
20
- scope: string;
21
- board: {
22
- id: string;
23
- name: string;
24
- };
25
- columns: BoardColumn[];
26
- circuit_breaker: {
27
- threshold: number;
28
- target_column_id: string | null;
29
- };
30
- backlog_ticket_count: number;
31
- tool_prefix: string;
32
- }
33
- /**
34
- * Firing constraint shape as returned by column scope (camelCase from API).
35
- */
36
- interface FiringConstraintLite {
37
- id: string;
38
- name: string;
39
- enabled: boolean;
40
- subjectType: string;
41
- subjectRef: string | null;
42
- operator: string;
43
- value: number | string | boolean;
44
- scope: string;
45
- notify: boolean;
46
- columnId: string | null;
47
- }
48
- /**
49
- * Shape of a ticket summary in column scope.
50
- */
51
- interface ColumnTicket {
52
- id: string;
53
- ticket_number: number;
54
- title: string;
55
- }
56
- /**
57
- * Agent config from column scope.
58
- */
59
- interface ColumnAgentConfig {
60
- execution_mode?: string | undefined;
61
- model_preference?: string | undefined;
62
- max_iterations?: number | undefined;
63
- max_budget_usd?: number | null | undefined;
64
- concurrency?: number | undefined;
65
- gutter_threshold?: number | undefined;
66
- poll_interval_seconds?: number | undefined;
67
- worktree?: {
68
- enabled: boolean;
69
- path_pattern?: string | undefined;
70
- } | undefined;
71
- }
72
- /**
73
- * Shape of the column-scope response.
74
- */
75
- interface ColumnScope {
76
- scope: string;
77
- column: {
78
- id: string;
79
- name: string;
80
- goal: string;
81
- };
82
- prompt_document: {
83
- id: string;
84
- title: string;
85
- content: string;
86
- } | null;
87
- agent_config: ColumnAgentConfig | null;
88
- tickets: ColumnTicket[];
89
- transition_rules: string;
90
- signals: unknown[];
91
- field_definitions: unknown[];
92
- firing_constraints?: FiringConstraintLite[];
93
- tool_prefix: string;
94
- }
95
- /**
96
- * Injectable dependencies for the PipelineOrchestrator.
97
- * Allows full testability via dependency injection.
98
- */
99
- /**
100
- * A ticket that is blocked by another ticket, with its current column.
101
- */
102
- interface BlockedTicket {
103
- id: string;
104
- column_id: string | null;
105
- }
106
- export interface OrchestratorDeps {
107
- fetchBoardScope: (boardId: string) => Promise<BoardScope>;
108
- fetchColumnScope: (columnId: string) => Promise<ColumnScope>;
109
- startLoop: (ticketId: string, columnId: string, config: LoopConfig) => Promise<LoopResult>;
110
- createComment: (ticketId: string, body: string) => Promise<void>;
111
- createSignal: (ticketId: string, body: string) => Promise<void>;
112
- /** Create a signal on a column when a firing constraint blocks with notify=true */
113
- createColumnSignal?: (columnId: string, body: string) => Promise<void>;
114
- claimTicket: (ticketId: string) => Promise<void>;
115
- fetchBlockedTickets: (ticketId: string) => Promise<BlockedTicket[]>;
116
- hasUnresolvedBlockers: (ticketId: string) => Promise<boolean>;
117
- }
118
- /**
119
- * PipelineOrchestrator — coordination layer for Ralph Loops.
120
- *
121
- * Discovers pipeline columns (has_prompt=true, type !== 'done'),
122
- * spawns loops for tickets with concurrency limits per column,
123
- * and handles WebSocket events for dynamic ticket arrivals.
124
- */
125
- export declare class PipelineOrchestrator {
126
- private boardId;
127
- private projectId;
128
- private deps;
129
- /** Column ID -> column configuration */
130
- private pipelineColumns;
131
- /** Column ID -> cached column scope (from initialize) */
132
- private columnScopes;
133
- /** Ticket ID -> active loop tracking */
134
- private activeLoops;
135
- /** Column ID -> queued ticket IDs (FIFO) */
136
- private loopQueues;
137
- /** Ticket IDs that have been spawned or queued (prevents re-processing) */
138
- private knownTickets;
139
- /** Tickets deferred because they have unresolved blockers. Re-queued when a blocker reaches Done. */
140
- private deferredTickets;
141
- /** Ticket IDs currently in the spawning process (prevents double-spawn race) */
142
- private spawning;
143
- /** Per-column reservation count for in-flight spawns (prevents concurrency overshoot) */
144
- private columnReservations;
145
- /** Cached board scope for constraint evaluation — refreshed each scan cycle */
146
- private cachedBoardScope;
147
- /** Last time a loop was spawned per column — for column.last_fired_at subject */
148
- private lastFiredAt;
149
- /** Column IDs currently blocked by firing constraints (prevents redundant re-evaluation within a scan) */
150
- private blockedColumns;
151
- constructor(boardId: string, projectId: string, deps: OrchestratorDeps);
152
- /** Returns the IDs of all discovered pipeline columns. */
153
- get pipelineColumnIds(): string[];
154
- /** Returns the total number of active loops. */
155
- get activeLoopCount(): number;
156
- /** Returns true if any tickets are queued or deferred (waiting for a slot). */
157
- get hasQueuedWork(): boolean;
158
- /** Returns the number of queued (waiting) tickets for a column. */
159
- queuedCount(columnId: string): number;
160
- /**
161
- * Initialize the orchestrator: fetch board scope, identify pipeline columns,
162
- * and fetch column-level agent configs.
163
- */
164
- initialize(): Promise<void>;
165
- /**
166
- * Refresh the cached column scope for a single column.
167
- * Keeps stale scope on error rather than crashing.
168
- */
169
- refreshColumnScope(columnId: string): Promise<void>;
170
- /**
171
- * Refresh the cached board scope. Called at the start of each scan cycle
172
- * to get fresh ticket counts for constraint evaluation.
173
- */
174
- private refreshBoardScope;
175
- /**
176
- * Public method to invalidate constraint caches when WS events arrive
177
- * (firing_constraint:created/updated/deleted). Forces re-fetch on next access.
178
- */
179
- refreshConstraints(): Promise<void>;
180
- /**
181
- * Build the BoardState required by the constraint evaluator from current
182
- * orchestrator state + cached board scope.
183
- */
184
- private buildBoardState;
185
- /**
186
- * Convert camelCase FiringConstraintLite from column scope to snake_case
187
- * FiringConstraint expected by the evaluator.
188
- */
189
- private toFiringConstraints;
190
- /**
191
- * Evaluate firing constraints for a column. Returns the EvalResult if any
192
- * constraint failed, or null if all passed (column is clear to fire).
193
- *
194
- * Handles logging and optional signal creation for blocked columns.
195
- */
196
- private evaluateColumnConstraints;
197
- /**
198
- * Check if a column is blocked by firing constraints.
199
- * Returns true if blocked (should not fire), false if clear.
200
- */
201
- isColumnBlocked(columnId: string): boolean;
202
- /**
203
- * Scan all pipeline columns for existing tickets and spawn loops.
204
- * Refreshes column scopes before scanning to avoid stale ticket lists.
205
- * Evaluates firing constraints per column before processing tickets.
206
- * Respects per-column concurrency limits — excess tickets are queued.
207
- */
208
- scanAndSpawn(): Promise<void>;
209
- /**
210
- * Handle a pipeline event (typically from WebSocket via EventQueue).
211
- */
212
- handleEvent(event: PipelineEvent): Promise<void>;
213
- /**
214
- * Spawn a loop for a ticket if under concurrency limit, otherwise queue it.
215
- * @param skipKnownCheck - true for event-driven spawns (bypass scan dedup)
216
- */
217
- private spawnOrQueue;
218
- /**
219
- * Start a loop and track it. Attach completion handler for cleanup + queue drain.
220
- */
221
- private startTrackedLoop;
222
- /**
223
- * Called when a loop finishes. Cleans up tracking and drains the queue.
224
- */
225
- private onLoopComplete;
226
- /**
227
- * Start queued tickets for a column until concurrency limit is reached (H16: fills multiple slots).
228
- */
229
- private drainQueue;
230
- /**
231
- * Count active loops + in-flight reservations for a specific column.
232
- */
233
- private activeCountForColumn;
234
- private reserveSlot;
235
- private releaseSlot;
236
- }
237
- export {};
238
- //# sourceMappingURL=orchestrator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/lib/orchestrator.ts"],"names":[],"mappings":"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"}