pm-orchestrator-runner 1.0.13 → 1.0.15
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/README.md +7 -7
- package/dist/cli/index.js +13 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/config/namespace.d.ts +38 -11
- package/dist/config/namespace.d.ts.map +1 -1
- package/dist/config/namespace.js +163 -26
- package/dist/config/namespace.js.map +1 -1
- package/dist/queue/index.d.ts +7 -32
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +11 -28
- package/dist/queue/index.js.map +1 -1
- package/dist/queue/queue-poller.d.ts +20 -1
- package/dist/queue/queue-poller.d.ts.map +1 -1
- package/dist/queue/queue-poller.js +40 -1
- package/dist/queue/queue-poller.js.map +1 -1
- package/dist/queue/queue-store.d.ts +136 -47
- package/dist/queue/queue-store.d.ts.map +1 -1
- package/dist/queue/queue-store.js +385 -107
- package/dist/queue/queue-store.js.map +1 -1
- package/dist/web/index.d.ts +8 -2
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +8 -2
- package/dist/web/index.js.map +1 -1
- package/dist/web/public/index.html +81 -1
- package/dist/web/server.d.ts +13 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +155 -27
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
package/dist/queue/index.js
CHANGED
|
@@ -1,42 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Queue Module
|
|
3
|
+
* Queue Module (v2)
|
|
4
4
|
* Per spec/20_QUEUE_STORE.md
|
|
5
5
|
*
|
|
6
|
+
* v2 Changes:
|
|
7
|
+
* - Single fixed table: pm-runner-queue
|
|
8
|
+
* - Namespace is a required config field
|
|
9
|
+
* - Runner heartbeat support
|
|
10
|
+
*
|
|
6
11
|
* Exports:
|
|
7
12
|
* - QueueStore: DynamoDB-backed queue storage
|
|
8
13
|
* - QueuePoller: Polling and task execution
|
|
9
|
-
* - createNamespacedQueueStore: Factory for namespace-separated QueueStore
|
|
10
14
|
*/
|
|
11
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.QueuePoller = exports.QueueStore = void 0;
|
|
13
|
-
exports.createNamespacedQueueStore = createNamespacedQueueStore;
|
|
16
|
+
exports.QueuePoller = exports.RUNNERS_TABLE_NAME = exports.QUEUE_TABLE_NAME = exports.isValidStatusTransition = exports.VALID_STATUS_TRANSITIONS = exports.QueueStore = void 0;
|
|
14
17
|
var queue_store_1 = require("./queue-store");
|
|
15
18
|
Object.defineProperty(exports, "QueueStore", { enumerable: true, get: function () { return queue_store_1.QueueStore; } });
|
|
19
|
+
Object.defineProperty(exports, "VALID_STATUS_TRANSITIONS", { enumerable: true, get: function () { return queue_store_1.VALID_STATUS_TRANSITIONS; } });
|
|
20
|
+
Object.defineProperty(exports, "isValidStatusTransition", { enumerable: true, get: function () { return queue_store_1.isValidStatusTransition; } });
|
|
21
|
+
Object.defineProperty(exports, "QUEUE_TABLE_NAME", { enumerable: true, get: function () { return queue_store_1.QUEUE_TABLE_NAME; } });
|
|
22
|
+
Object.defineProperty(exports, "RUNNERS_TABLE_NAME", { enumerable: true, get: function () { return queue_store_1.RUNNERS_TABLE_NAME; } });
|
|
16
23
|
var queue_poller_1 = require("./queue-poller");
|
|
17
24
|
Object.defineProperty(exports, "QueuePoller", { enumerable: true, get: function () { return queue_poller_1.QueuePoller; } });
|
|
18
|
-
const queue_store_2 = require("./queue-store");
|
|
19
|
-
/**
|
|
20
|
-
* Create a QueueStore instance with namespace separation
|
|
21
|
-
* Per spec/21_STABLE_DEV.md
|
|
22
|
-
*
|
|
23
|
-
* @param namespaceConfig - Namespace configuration with tableName
|
|
24
|
-
* @param storeConfig - Optional additional QueueStore configuration
|
|
25
|
-
* @returns Configured QueueStore instance
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```typescript
|
|
29
|
-
* const namespaceConfig = buildNamespaceConfig({ namespace: 'dev', projectRoot: '/path' });
|
|
30
|
-
* const store = createNamespacedQueueStore({
|
|
31
|
-
* namespace: namespaceConfig.namespace,
|
|
32
|
-
* tableName: namespaceConfig.tableName,
|
|
33
|
-
* });
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
function createNamespacedQueueStore(namespaceConfig, storeConfig) {
|
|
37
|
-
return new queue_store_2.QueueStore({
|
|
38
|
-
...storeConfig,
|
|
39
|
-
tableName: namespaceConfig.tableName,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
25
|
//# sourceMappingURL=index.js.map
|
package/dist/queue/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,6CAeuB;AAdrB,yGAAA,UAAU,OAAA;AAUV,uHAAA,wBAAwB,OAAA;AACxB,sHAAA,uBAAuB,OAAA;AACvB,+GAAA,gBAAgB,OAAA;AAChB,iHAAA,kBAAkB,OAAA;AAGpB,+CAMwB;AALtB,2GAAA,WAAW,OAAA"}
|
|
@@ -28,6 +28,10 @@ export interface QueuePollerConfig {
|
|
|
28
28
|
maxStaleTaskAgeMs?: number;
|
|
29
29
|
/** Recover stale tasks on startup (default: true) */
|
|
30
30
|
recoverOnStartup?: boolean;
|
|
31
|
+
/** Runner ID for heartbeat tracking (v2) */
|
|
32
|
+
runnerId?: string;
|
|
33
|
+
/** Project root for runner identification (v2) */
|
|
34
|
+
projectRoot?: string;
|
|
31
35
|
}
|
|
32
36
|
/**
|
|
33
37
|
* Poller state
|
|
@@ -38,6 +42,10 @@ export interface QueuePollerState {
|
|
|
38
42
|
lastPollAt: string | null;
|
|
39
43
|
tasksProcessed: number;
|
|
40
44
|
errors: number;
|
|
45
|
+
/** Runner ID (v2) */
|
|
46
|
+
runnerId: string;
|
|
47
|
+
/** Project root (v2) */
|
|
48
|
+
projectRoot: string;
|
|
41
49
|
}
|
|
42
50
|
/**
|
|
43
51
|
* Poller events
|
|
@@ -65,6 +73,8 @@ export declare class QueuePoller extends EventEmitter {
|
|
|
65
73
|
private readonly pollIntervalMs;
|
|
66
74
|
private readonly maxStaleTaskAgeMs;
|
|
67
75
|
private readonly recoverOnStartup;
|
|
76
|
+
private readonly runnerId;
|
|
77
|
+
private readonly projectRoot;
|
|
68
78
|
private pollTimer;
|
|
69
79
|
private inFlight;
|
|
70
80
|
private isRunning;
|
|
@@ -72,6 +82,10 @@ export declare class QueuePoller extends EventEmitter {
|
|
|
72
82
|
private tasksProcessed;
|
|
73
83
|
private errors;
|
|
74
84
|
constructor(store: QueueStore, executor: TaskExecutor, config?: QueuePollerConfig);
|
|
85
|
+
/**
|
|
86
|
+
* Generate a unique runner ID
|
|
87
|
+
*/
|
|
88
|
+
private generateRunnerId;
|
|
75
89
|
/**
|
|
76
90
|
* Start polling
|
|
77
91
|
*/
|
|
@@ -79,9 +93,10 @@ export declare class QueuePoller extends EventEmitter {
|
|
|
79
93
|
/**
|
|
80
94
|
* Stop polling
|
|
81
95
|
*/
|
|
82
|
-
stop(): void
|
|
96
|
+
stop(): Promise<void>;
|
|
83
97
|
/**
|
|
84
98
|
* Single poll iteration
|
|
99
|
+
* - Update heartbeat (v2)
|
|
85
100
|
* - Skip if task in-flight
|
|
86
101
|
* - Claim oldest QUEUED task
|
|
87
102
|
* - Execute and update status
|
|
@@ -91,6 +106,10 @@ export declare class QueuePoller extends EventEmitter {
|
|
|
91
106
|
* Get current state
|
|
92
107
|
*/
|
|
93
108
|
getState(): QueuePollerState;
|
|
109
|
+
/**
|
|
110
|
+
* Get runner ID (v2)
|
|
111
|
+
*/
|
|
112
|
+
getRunnerId(): string;
|
|
94
113
|
/**
|
|
95
114
|
* Check if poller is running
|
|
96
115
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-poller.d.ts","sourceRoot":"","sources":["../../src/queue/queue-poller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAmB,MAAM,eAAe,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,SAAS,KACZ,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"queue-poller.d.ts","sourceRoot":"","sources":["../../src/queue/queue-poller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAmB,MAAM,eAAe,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,SAAS,KACZ,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,EAAE,CAAC;IACZ,OAAO,EAAE,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACrB,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1B,SAAS,EAAE,EAAE,CAAC;IACd,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC;IAC5B,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,MAAM,CAAa;gBAGzB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,YAAY,EACtB,MAAM,GAAE,iBAAsB;IAYhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6E3B;;OAEG;IACH,QAAQ,IAAI,gBAAgB;IAY5B;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,WAAW,IAAI,SAAS,GAAG,IAAI;CAGhC"}
|
|
@@ -22,6 +22,8 @@ class QueuePoller extends events_1.EventEmitter {
|
|
|
22
22
|
pollIntervalMs;
|
|
23
23
|
maxStaleTaskAgeMs;
|
|
24
24
|
recoverOnStartup;
|
|
25
|
+
runnerId;
|
|
26
|
+
projectRoot;
|
|
25
27
|
pollTimer = null;
|
|
26
28
|
inFlight = null;
|
|
27
29
|
isRunning = false;
|
|
@@ -35,6 +37,16 @@ class QueuePoller extends events_1.EventEmitter {
|
|
|
35
37
|
this.pollIntervalMs = config.pollIntervalMs ?? 1000;
|
|
36
38
|
this.maxStaleTaskAgeMs = config.maxStaleTaskAgeMs ?? 5 * 60 * 1000;
|
|
37
39
|
this.recoverOnStartup = config.recoverOnStartup ?? true;
|
|
40
|
+
this.runnerId = config.runnerId ?? this.generateRunnerId();
|
|
41
|
+
this.projectRoot = config.projectRoot ?? process.cwd();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate a unique runner ID
|
|
45
|
+
*/
|
|
46
|
+
generateRunnerId() {
|
|
47
|
+
const timestamp = Date.now().toString(36);
|
|
48
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
49
|
+
return 'runner-' + timestamp + '-' + random;
|
|
38
50
|
}
|
|
39
51
|
/**
|
|
40
52
|
* Start polling
|
|
@@ -72,7 +84,7 @@ class QueuePoller extends events_1.EventEmitter {
|
|
|
72
84
|
/**
|
|
73
85
|
* Stop polling
|
|
74
86
|
*/
|
|
75
|
-
stop() {
|
|
87
|
+
async stop() {
|
|
76
88
|
if (!this.isRunning) {
|
|
77
89
|
return;
|
|
78
90
|
}
|
|
@@ -81,10 +93,20 @@ class QueuePoller extends events_1.EventEmitter {
|
|
|
81
93
|
clearInterval(this.pollTimer);
|
|
82
94
|
this.pollTimer = null;
|
|
83
95
|
}
|
|
96
|
+
// Mark runner as stopped (v2)
|
|
97
|
+
try {
|
|
98
|
+
await this.store.markRunnerStopped(this.runnerId);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Log but don't fail stop - marking stopped is best-effort
|
|
102
|
+
// eslint-disable-next-line no-console
|
|
103
|
+
console.error('[QueuePoller] Failed to mark runner as stopped:', error);
|
|
104
|
+
}
|
|
84
105
|
this.emit('stopped');
|
|
85
106
|
}
|
|
86
107
|
/**
|
|
87
108
|
* Single poll iteration
|
|
109
|
+
* - Update heartbeat (v2)
|
|
88
110
|
* - Skip if task in-flight
|
|
89
111
|
* - Claim oldest QUEUED task
|
|
90
112
|
* - Execute and update status
|
|
@@ -94,6 +116,15 @@ class QueuePoller extends events_1.EventEmitter {
|
|
|
94
116
|
return;
|
|
95
117
|
}
|
|
96
118
|
this.lastPollAt = new Date().toISOString();
|
|
119
|
+
// Update heartbeat (v2) - register this runner as alive
|
|
120
|
+
try {
|
|
121
|
+
await this.store.updateRunnerHeartbeat(this.runnerId, this.projectRoot);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
// Log but don't fail poll - heartbeat is best-effort
|
|
125
|
+
// eslint-disable-next-line no-console
|
|
126
|
+
console.error('[QueuePoller] Heartbeat update failed:', error);
|
|
127
|
+
}
|
|
97
128
|
// In-flight limit: 1
|
|
98
129
|
if (this.inFlight) {
|
|
99
130
|
return;
|
|
@@ -156,8 +187,16 @@ class QueuePoller extends events_1.EventEmitter {
|
|
|
156
187
|
lastPollAt: this.lastPollAt,
|
|
157
188
|
tasksProcessed: this.tasksProcessed,
|
|
158
189
|
errors: this.errors,
|
|
190
|
+
runnerId: this.runnerId,
|
|
191
|
+
projectRoot: this.projectRoot,
|
|
159
192
|
};
|
|
160
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Get runner ID (v2)
|
|
196
|
+
*/
|
|
197
|
+
getRunnerId() {
|
|
198
|
+
return this.runnerId;
|
|
199
|
+
}
|
|
161
200
|
/**
|
|
162
201
|
* Check if poller is running
|
|
163
202
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-poller.js","sourceRoot":"","sources":["../../src/queue/queue-poller.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,mCAAsC;
|
|
1
|
+
{"version":3,"file":"queue-poller.js","sourceRoot":"","sources":["../../src/queue/queue-poller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Queue Store - DynamoDB Local implementation
|
|
2
|
+
* Queue Store - DynamoDB Local implementation (v2)
|
|
3
3
|
* Per spec/20_QUEUE_STORE.md
|
|
4
4
|
*
|
|
5
|
+
* v2 Changes:
|
|
6
|
+
* - Single fixed table: pm-runner-queue
|
|
7
|
+
* - Composite key: PK=namespace, SK=task_id
|
|
8
|
+
* - GSI: status-index (status + created_at)
|
|
9
|
+
* - Namespace-based separation in single table
|
|
10
|
+
*
|
|
5
11
|
* Provides queue operations with:
|
|
6
12
|
* - Atomic QUEUED -> RUNNING transitions (conditional update)
|
|
7
13
|
* - Double execution prevention
|
|
8
14
|
* - Fail-closed error handling
|
|
9
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* Fixed table name (v2: single table for all namespaces)
|
|
18
|
+
*/
|
|
19
|
+
export declare const QUEUE_TABLE_NAME = "pm-runner-queue";
|
|
20
|
+
/**
|
|
21
|
+
* Runners table name (v2: heartbeat tracking)
|
|
22
|
+
*/
|
|
23
|
+
export declare const RUNNERS_TABLE_NAME = "pm-runner-runners";
|
|
10
24
|
/**
|
|
11
25
|
* Queue Item status
|
|
12
|
-
* Per spec/20: QUEUED / RUNNING / COMPLETE / ERROR
|
|
26
|
+
* Per spec/20: QUEUED / RUNNING / COMPLETE / ERROR / CANCELLED
|
|
13
27
|
*/
|
|
14
|
-
export type QueueItemStatus = 'QUEUED' | 'RUNNING' | 'COMPLETE' | 'ERROR';
|
|
28
|
+
export type QueueItemStatus = 'QUEUED' | 'RUNNING' | 'COMPLETE' | 'ERROR' | 'CANCELLED';
|
|
15
29
|
/**
|
|
16
|
-
*
|
|
30
|
+
* Valid status transitions
|
|
31
|
+
* Per spec/20_QUEUE_STORE.md
|
|
32
|
+
*/
|
|
33
|
+
export declare const VALID_STATUS_TRANSITIONS: Record<QueueItemStatus, QueueItemStatus[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a status transition is valid
|
|
36
|
+
*/
|
|
37
|
+
export declare function isValidStatusTransition(fromStatus: QueueItemStatus, toStatus: QueueItemStatus): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Queue Item schema (v2)
|
|
17
40
|
* Per spec/20_QUEUE_STORE.md
|
|
18
41
|
*/
|
|
19
42
|
export interface QueueItem {
|
|
43
|
+
namespace: string;
|
|
20
44
|
task_id: string;
|
|
21
45
|
task_group_id: string;
|
|
22
46
|
session_id: string;
|
|
@@ -26,16 +50,32 @@ export interface QueueItem {
|
|
|
26
50
|
updated_at: string;
|
|
27
51
|
error_message?: string;
|
|
28
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Runner status for heartbeat tracking
|
|
55
|
+
*/
|
|
56
|
+
export type RunnerStatus = 'RUNNING' | 'STOPPED';
|
|
57
|
+
/**
|
|
58
|
+
* Runner record schema (v2)
|
|
59
|
+
* Per spec/20_QUEUE_STORE.md
|
|
60
|
+
*/
|
|
61
|
+
export interface RunnerRecord {
|
|
62
|
+
namespace: string;
|
|
63
|
+
runner_id: string;
|
|
64
|
+
last_heartbeat: string;
|
|
65
|
+
started_at: string;
|
|
66
|
+
status: RunnerStatus;
|
|
67
|
+
project_root: string;
|
|
68
|
+
}
|
|
29
69
|
/**
|
|
30
70
|
* Queue Store configuration
|
|
31
71
|
*/
|
|
32
72
|
export interface QueueStoreConfig {
|
|
33
73
|
/** DynamoDB endpoint (default: http://localhost:8000) */
|
|
34
74
|
endpoint?: string;
|
|
35
|
-
/** Table name (default: pm-runner-queue) */
|
|
36
|
-
tableName?: string;
|
|
37
75
|
/** AWS region (default: local) */
|
|
38
76
|
region?: string;
|
|
77
|
+
/** Namespace for this store instance */
|
|
78
|
+
namespace: string;
|
|
39
79
|
}
|
|
40
80
|
/**
|
|
41
81
|
* Claim result
|
|
@@ -45,6 +85,18 @@ export interface ClaimResult {
|
|
|
45
85
|
item?: QueueItem;
|
|
46
86
|
error?: string;
|
|
47
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Status update result
|
|
90
|
+
* Per spec/19_WEB_UI.md: PATCH /api/tasks/:task_id/status response
|
|
91
|
+
*/
|
|
92
|
+
export interface StatusUpdateResult {
|
|
93
|
+
success: boolean;
|
|
94
|
+
task_id: string;
|
|
95
|
+
old_status?: QueueItemStatus;
|
|
96
|
+
new_status?: QueueItemStatus;
|
|
97
|
+
error?: string;
|
|
98
|
+
message?: string;
|
|
99
|
+
}
|
|
48
100
|
/**
|
|
49
101
|
* Task Group summary for listing
|
|
50
102
|
* Per spec/19_WEB_UI.md: task group list view
|
|
@@ -56,19 +108,33 @@ export interface TaskGroupSummary {
|
|
|
56
108
|
latest_updated_at: string;
|
|
57
109
|
}
|
|
58
110
|
/**
|
|
59
|
-
*
|
|
111
|
+
* Namespace summary for listing
|
|
112
|
+
*/
|
|
113
|
+
export interface NamespaceSummary {
|
|
114
|
+
namespace: string;
|
|
115
|
+
task_count: number;
|
|
116
|
+
runner_count: number;
|
|
117
|
+
active_runner_count: number;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Queue Store (v2)
|
|
60
121
|
* Manages task queue with DynamoDB Local
|
|
122
|
+
* Single table design with namespace-based separation
|
|
61
123
|
*/
|
|
62
124
|
export declare class QueueStore {
|
|
63
125
|
private readonly client;
|
|
64
126
|
private readonly docClient;
|
|
65
|
-
private readonly
|
|
127
|
+
private readonly namespace;
|
|
66
128
|
private readonly endpoint;
|
|
67
|
-
constructor(config
|
|
129
|
+
constructor(config: QueueStoreConfig);
|
|
68
130
|
/**
|
|
69
|
-
* Get table name
|
|
131
|
+
* Get fixed table name (v2: always returns pm-runner-queue)
|
|
70
132
|
*/
|
|
71
133
|
getTableName(): string;
|
|
134
|
+
/**
|
|
135
|
+
* Get namespace
|
|
136
|
+
*/
|
|
137
|
+
getNamespace(): string;
|
|
72
138
|
/**
|
|
73
139
|
* Get endpoint
|
|
74
140
|
*/
|
|
@@ -78,12 +144,25 @@ export declare class QueueStore {
|
|
|
78
144
|
*/
|
|
79
145
|
tableExists(): Promise<boolean>;
|
|
80
146
|
/**
|
|
81
|
-
*
|
|
82
|
-
|
|
147
|
+
* Delete queue table (for testing)
|
|
148
|
+
*/
|
|
149
|
+
deleteTable(): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Create queue table with composite key (v2)
|
|
152
|
+
* PK: namespace, SK: task_id
|
|
83
153
|
*/
|
|
84
154
|
createTable(): Promise<void>;
|
|
85
155
|
/**
|
|
86
|
-
*
|
|
156
|
+
* Create runners table (v2)
|
|
157
|
+
* PK: namespace, SK: runner_id
|
|
158
|
+
*/
|
|
159
|
+
createRunnersTable(): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Check if runners table exists
|
|
162
|
+
*/
|
|
163
|
+
runnersTableExists(): Promise<boolean>;
|
|
164
|
+
/**
|
|
165
|
+
* Ensure both tables exist
|
|
87
166
|
*/
|
|
88
167
|
ensureTable(): Promise<void>;
|
|
89
168
|
/**
|
|
@@ -93,68 +172,78 @@ export declare class QueueStore {
|
|
|
93
172
|
/**
|
|
94
173
|
* Enqueue a new task
|
|
95
174
|
* Creates item with status=QUEUED
|
|
96
|
-
*
|
|
97
|
-
* @param sessionId - Session ID
|
|
98
|
-
* @param taskGroupId - Task Group ID
|
|
99
|
-
* @param prompt - User prompt
|
|
100
|
-
* @param taskId - Optional task ID (generates if not provided)
|
|
101
|
-
* @returns Created queue item
|
|
102
175
|
*/
|
|
103
176
|
enqueue(sessionId: string, taskGroupId: string, prompt: string, taskId?: string): Promise<QueueItem>;
|
|
104
177
|
/**
|
|
105
|
-
* Get item by task_id
|
|
178
|
+
* Get item by task_id (v2: uses composite key)
|
|
106
179
|
*/
|
|
107
|
-
getItem(taskId: string): Promise<QueueItem | null>;
|
|
180
|
+
getItem(taskId: string, targetNamespace?: string): Promise<QueueItem | null>;
|
|
108
181
|
/**
|
|
109
|
-
* Claim the oldest QUEUED task
|
|
110
|
-
* Per spec: Uses conditional update for double execution prevention
|
|
111
|
-
*
|
|
112
|
-
* @returns ClaimResult with success flag and item if claimed
|
|
182
|
+
* Claim the oldest QUEUED task for this namespace
|
|
113
183
|
*/
|
|
114
184
|
claim(): Promise<ClaimResult>;
|
|
115
185
|
/**
|
|
116
186
|
* Update task status
|
|
117
|
-
* Per spec: RUNNING -> COMPLETE or RUNNING -> ERROR
|
|
118
|
-
*
|
|
119
|
-
* @param taskId - Task ID
|
|
120
|
-
* @param status - New status
|
|
121
|
-
* @param errorMessage - Optional error message (for ERROR status)
|
|
122
187
|
*/
|
|
123
188
|
updateStatus(taskId: string, status: QueueItemStatus, errorMessage?: string): Promise<void>;
|
|
124
189
|
/**
|
|
125
|
-
*
|
|
126
|
-
* Uses session-index GSI
|
|
190
|
+
* Update task status with validation
|
|
127
191
|
*/
|
|
128
|
-
|
|
192
|
+
updateStatusWithValidation(taskId: string, newStatus: QueueItemStatus): Promise<StatusUpdateResult>;
|
|
129
193
|
/**
|
|
130
|
-
* Get items by status
|
|
131
|
-
* Uses status-index GSI
|
|
194
|
+
* Get items by status for this namespace
|
|
132
195
|
*/
|
|
133
196
|
getByStatus(status: QueueItemStatus): Promise<QueueItem[]>;
|
|
134
197
|
/**
|
|
135
|
-
* Get items by task group ID
|
|
136
|
-
|
|
137
|
-
|
|
198
|
+
* Get items by task group ID for this namespace
|
|
199
|
+
*/
|
|
200
|
+
getByTaskGroup(taskGroupId: string, targetNamespace?: string): Promise<QueueItem[]>;
|
|
201
|
+
/**
|
|
202
|
+
* Get all items in a namespace
|
|
203
|
+
*/
|
|
204
|
+
getAllItems(targetNamespace?: string): Promise<QueueItem[]>;
|
|
205
|
+
/**
|
|
206
|
+
* Get all distinct task groups for a namespace with summary
|
|
138
207
|
*/
|
|
139
|
-
|
|
208
|
+
getAllTaskGroups(targetNamespace?: string): Promise<TaskGroupSummary[]>;
|
|
140
209
|
/**
|
|
141
|
-
* Get all distinct
|
|
142
|
-
* Per spec/19_WEB_UI.md: for task group list view
|
|
143
|
-
* Note: Uses Scan - consider pagination for large datasets
|
|
210
|
+
* Get all distinct namespaces (scan entire table)
|
|
144
211
|
*/
|
|
145
|
-
|
|
212
|
+
getAllNamespaces(): Promise<NamespaceSummary[]>;
|
|
146
213
|
/**
|
|
147
214
|
* Delete item (for testing)
|
|
148
215
|
*/
|
|
149
216
|
deleteItem(taskId: string): Promise<void>;
|
|
150
217
|
/**
|
|
151
218
|
* Mark stale RUNNING tasks as ERROR
|
|
152
|
-
* Per spec: fail-closed - don't leave tasks in "limbo"
|
|
153
|
-
*
|
|
154
|
-
* @param maxAgeMs - Max age in milliseconds for RUNNING tasks
|
|
155
|
-
* @returns Number of tasks marked as ERROR
|
|
156
219
|
*/
|
|
157
220
|
recoverStaleTasks(maxAgeMs?: number): Promise<number>;
|
|
221
|
+
/**
|
|
222
|
+
* Register or update runner heartbeat
|
|
223
|
+
*/
|
|
224
|
+
updateRunnerHeartbeat(runnerId: string, projectRoot: string): Promise<void>;
|
|
225
|
+
/**
|
|
226
|
+
* Get runner by ID
|
|
227
|
+
*/
|
|
228
|
+
getRunner(runnerId: string): Promise<RunnerRecord | null>;
|
|
229
|
+
/**
|
|
230
|
+
* Get all runners for this namespace
|
|
231
|
+
*/
|
|
232
|
+
getAllRunners(targetNamespace?: string): Promise<RunnerRecord[]>;
|
|
233
|
+
/**
|
|
234
|
+
* Get runners with their alive status
|
|
235
|
+
*/
|
|
236
|
+
getRunnersWithStatus(heartbeatTimeoutMs?: number, targetNamespace?: string): Promise<Array<RunnerRecord & {
|
|
237
|
+
isAlive: boolean;
|
|
238
|
+
}>>;
|
|
239
|
+
/**
|
|
240
|
+
* Mark runner as stopped
|
|
241
|
+
*/
|
|
242
|
+
markRunnerStopped(runnerId: string): Promise<void>;
|
|
243
|
+
/**
|
|
244
|
+
* Delete runner record
|
|
245
|
+
*/
|
|
246
|
+
deleteRunner(runnerId: string): Promise<void>;
|
|
158
247
|
/**
|
|
159
248
|
* Close the client connection
|
|
160
249
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-store.d.ts","sourceRoot":"","sources":["../../src/queue/queue-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"queue-store.d.ts","sourceRoot":"","sources":["../../src/queue/queue-store.ts"],"names":[],"mappings":"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"}
|