pm-orchestrator-runner 1.0.7 → 1.0.8
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 +20 -10
- package/dist/cli/index.js +36 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +19 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/namespace.d.ts +86 -0
- package/dist/config/namespace.d.ts.map +1 -0
- package/dist/config/namespace.js +150 -0
- package/dist/config/namespace.js.map +1 -0
- package/dist/core/runner-core.d.ts +2 -0
- package/dist/core/runner-core.d.ts.map +1 -1
- package/dist/core/runner-core.js +27 -1
- package/dist/core/runner-core.js.map +1 -1
- package/dist/executor/claude-code-executor.d.ts +28 -0
- package/dist/executor/claude-code-executor.d.ts.map +1 -1
- package/dist/executor/claude-code-executor.js +184 -1
- package/dist/executor/claude-code-executor.js.map +1 -1
- package/dist/executor/deterministic-executor.d.ts +2 -1
- package/dist/executor/deterministic-executor.d.ts.map +1 -1
- package/dist/executor/deterministic-executor.js +7 -0
- package/dist/executor/deterministic-executor.js.map +1 -1
- package/dist/executor/recovery-executor.d.ts +2 -1
- package/dist/executor/recovery-executor.d.ts.map +1 -1
- package/dist/executor/recovery-executor.js +7 -0
- package/dist/executor/recovery-executor.js.map +1 -1
- package/dist/models/enums.d.ts +54 -0
- package/dist/models/enums.d.ts.map +1 -1
- package/dist/models/enums.js +59 -1
- package/dist/models/enums.js.map +1 -1
- package/dist/models/index.d.ts +4 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +50 -2
- package/dist/models/index.js.map +1 -1
- package/dist/models/run.d.ts +82 -0
- package/dist/models/run.d.ts.map +1 -0
- package/dist/models/run.js +161 -0
- package/dist/models/run.js.map +1 -0
- package/dist/models/task-group.d.ts +164 -0
- package/dist/models/task-group.d.ts.map +1 -0
- package/dist/models/task-group.js +246 -0
- package/dist/models/task-group.js.map +1 -0
- package/dist/models/task.d.ts +7 -0
- package/dist/models/task.d.ts.map +1 -1
- package/dist/models/task.js.map +1 -1
- package/dist/models/thread.d.ts +53 -0
- package/dist/models/thread.d.ts.map +1 -0
- package/dist/models/thread.js +92 -0
- package/dist/models/thread.js.map +1 -0
- package/dist/pool/agent-pool.d.ts.map +1 -1
- package/dist/pool/agent-pool.js +2 -3
- package/dist/pool/agent-pool.js.map +1 -1
- package/dist/prompt/index.d.ts +8 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +13 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/prompt-assembler.d.ts +145 -0
- package/dist/prompt/prompt-assembler.d.ts.map +1 -0
- package/dist/prompt/prompt-assembler.js +242 -0
- package/dist/prompt/prompt-assembler.js.map +1 -0
- package/dist/queue/index.d.ts +41 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +42 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue-poller.d.ts +107 -0
- package/dist/queue/queue-poller.d.ts.map +1 -0
- package/dist/queue/queue-poller.js +181 -0
- package/dist/queue/queue-poller.js.map +1 -0
- package/dist/queue/queue-store.d.ts +163 -0
- package/dist/queue/queue-store.d.ts.map +1 -0
- package/dist/queue/queue-store.js +421 -0
- package/dist/queue/queue-store.js.map +1 -0
- package/dist/repl/index.d.ts +1 -0
- package/dist/repl/index.d.ts.map +1 -1
- package/dist/repl/index.js +3 -1
- package/dist/repl/index.js.map +1 -1
- package/dist/repl/repl-interface.d.ts +40 -5
- package/dist/repl/repl-interface.d.ts.map +1 -1
- package/dist/repl/repl-interface.js +95 -17
- package/dist/repl/repl-interface.js.map +1 -1
- package/dist/repl/two-pane-renderer.d.ts +148 -0
- package/dist/repl/two-pane-renderer.d.ts.map +1 -0
- package/dist/repl/two-pane-renderer.js +239 -0
- package/dist/repl/two-pane-renderer.js.map +1 -0
- package/dist/web/index.d.ts +45 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +47 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/server.d.ts +71 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +329 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +11 -3
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Queue Store - DynamoDB Local implementation
|
|
4
|
+
* Per spec/20_QUEUE_STORE.md
|
|
5
|
+
*
|
|
6
|
+
* Provides queue operations with:
|
|
7
|
+
* - Atomic QUEUED -> RUNNING transitions (conditional update)
|
|
8
|
+
* - Double execution prevention
|
|
9
|
+
* - Fail-closed error handling
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.QueueStore = void 0;
|
|
13
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
14
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
15
|
+
const uuid_1 = require("uuid");
|
|
16
|
+
/**
|
|
17
|
+
* Queue Store
|
|
18
|
+
* Manages task queue with DynamoDB Local
|
|
19
|
+
*/
|
|
20
|
+
class QueueStore {
|
|
21
|
+
client;
|
|
22
|
+
docClient;
|
|
23
|
+
tableName;
|
|
24
|
+
endpoint;
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
this.endpoint = config.endpoint || 'http://localhost:8000';
|
|
27
|
+
this.tableName = config.tableName || 'pm-runner-queue';
|
|
28
|
+
const region = config.region || 'local';
|
|
29
|
+
this.client = new client_dynamodb_1.DynamoDBClient({
|
|
30
|
+
endpoint: this.endpoint,
|
|
31
|
+
region: region,
|
|
32
|
+
credentials: {
|
|
33
|
+
accessKeyId: 'local',
|
|
34
|
+
secretAccessKey: 'local',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
this.docClient = lib_dynamodb_1.DynamoDBDocumentClient.from(this.client, {
|
|
38
|
+
marshallOptions: {
|
|
39
|
+
removeUndefinedValues: true,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get table name
|
|
45
|
+
*/
|
|
46
|
+
getTableName() {
|
|
47
|
+
return this.tableName;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get endpoint
|
|
51
|
+
*/
|
|
52
|
+
getEndpoint() {
|
|
53
|
+
return this.endpoint;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if table exists
|
|
57
|
+
*/
|
|
58
|
+
async tableExists() {
|
|
59
|
+
try {
|
|
60
|
+
await this.client.send(new client_dynamodb_1.DescribeTableCommand({ TableName: this.tableName }));
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof client_dynamodb_1.ResourceNotFoundException) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create table with required GSIs
|
|
72
|
+
* Per spec/20_QUEUE_STORE.md table definition
|
|
73
|
+
*/
|
|
74
|
+
async createTable() {
|
|
75
|
+
const command = new client_dynamodb_1.CreateTableCommand({
|
|
76
|
+
TableName: this.tableName,
|
|
77
|
+
KeySchema: [{ AttributeName: 'task_id', KeyType: 'HASH' }],
|
|
78
|
+
AttributeDefinitions: [
|
|
79
|
+
{ AttributeName: 'task_id', AttributeType: 'S' },
|
|
80
|
+
{ AttributeName: 'session_id', AttributeType: 'S' },
|
|
81
|
+
{ AttributeName: 'status', AttributeType: 'S' },
|
|
82
|
+
{ AttributeName: 'created_at', AttributeType: 'S' },
|
|
83
|
+
{ AttributeName: 'task_group_id', AttributeType: 'S' },
|
|
84
|
+
],
|
|
85
|
+
GlobalSecondaryIndexes: [
|
|
86
|
+
{
|
|
87
|
+
IndexName: 'session-index',
|
|
88
|
+
KeySchema: [
|
|
89
|
+
{ AttributeName: 'session_id', KeyType: 'HASH' },
|
|
90
|
+
{ AttributeName: 'created_at', KeyType: 'RANGE' },
|
|
91
|
+
],
|
|
92
|
+
Projection: { ProjectionType: 'ALL' },
|
|
93
|
+
ProvisionedThroughput: {
|
|
94
|
+
ReadCapacityUnits: 5,
|
|
95
|
+
WriteCapacityUnits: 5,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
IndexName: 'status-index',
|
|
100
|
+
KeySchema: [
|
|
101
|
+
{ AttributeName: 'status', KeyType: 'HASH' },
|
|
102
|
+
{ AttributeName: 'created_at', KeyType: 'RANGE' },
|
|
103
|
+
],
|
|
104
|
+
Projection: { ProjectionType: 'ALL' },
|
|
105
|
+
ProvisionedThroughput: {
|
|
106
|
+
ReadCapacityUnits: 5,
|
|
107
|
+
WriteCapacityUnits: 5,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
IndexName: 'task-group-index',
|
|
112
|
+
KeySchema: [
|
|
113
|
+
{ AttributeName: 'task_group_id', KeyType: 'HASH' },
|
|
114
|
+
{ AttributeName: 'created_at', KeyType: 'RANGE' },
|
|
115
|
+
],
|
|
116
|
+
Projection: { ProjectionType: 'ALL' },
|
|
117
|
+
ProvisionedThroughput: {
|
|
118
|
+
ReadCapacityUnits: 5,
|
|
119
|
+
WriteCapacityUnits: 5,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
ProvisionedThroughput: {
|
|
124
|
+
ReadCapacityUnits: 5,
|
|
125
|
+
WriteCapacityUnits: 5,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
await this.client.send(command);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Ensure table exists, create if not
|
|
132
|
+
*/
|
|
133
|
+
async ensureTable() {
|
|
134
|
+
const exists = await this.tableExists();
|
|
135
|
+
if (!exists) {
|
|
136
|
+
await this.createTable();
|
|
137
|
+
// Wait for table to be active
|
|
138
|
+
await this.waitForTableActive();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Wait for table to become active
|
|
143
|
+
*/
|
|
144
|
+
async waitForTableActive(maxWaitMs = 30000) {
|
|
145
|
+
const startTime = Date.now();
|
|
146
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
147
|
+
try {
|
|
148
|
+
const result = await this.client.send(new client_dynamodb_1.DescribeTableCommand({ TableName: this.tableName }));
|
|
149
|
+
if (result.Table?.TableStatus === 'ACTIVE') {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Table not ready yet
|
|
155
|
+
}
|
|
156
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
157
|
+
}
|
|
158
|
+
throw new Error(`Table ${this.tableName} did not become active within ${maxWaitMs}ms`);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Enqueue a new task
|
|
162
|
+
* Creates item with status=QUEUED
|
|
163
|
+
*
|
|
164
|
+
* @param sessionId - Session ID
|
|
165
|
+
* @param taskGroupId - Task Group ID
|
|
166
|
+
* @param prompt - User prompt
|
|
167
|
+
* @param taskId - Optional task ID (generates if not provided)
|
|
168
|
+
* @returns Created queue item
|
|
169
|
+
*/
|
|
170
|
+
async enqueue(sessionId, taskGroupId, prompt, taskId) {
|
|
171
|
+
const now = new Date().toISOString();
|
|
172
|
+
const item = {
|
|
173
|
+
task_id: taskId || (0, uuid_1.v4)(),
|
|
174
|
+
task_group_id: taskGroupId,
|
|
175
|
+
session_id: sessionId,
|
|
176
|
+
status: 'QUEUED',
|
|
177
|
+
prompt,
|
|
178
|
+
created_at: now,
|
|
179
|
+
updated_at: now,
|
|
180
|
+
};
|
|
181
|
+
await this.docClient.send(new lib_dynamodb_1.PutCommand({
|
|
182
|
+
TableName: this.tableName,
|
|
183
|
+
Item: item,
|
|
184
|
+
}));
|
|
185
|
+
return item;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get item by task_id
|
|
189
|
+
*/
|
|
190
|
+
async getItem(taskId) {
|
|
191
|
+
const result = await this.docClient.send(new lib_dynamodb_1.GetCommand({
|
|
192
|
+
TableName: this.tableName,
|
|
193
|
+
Key: { task_id: taskId },
|
|
194
|
+
}));
|
|
195
|
+
return result.Item || null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Claim the oldest QUEUED task (atomic QUEUED -> RUNNING)
|
|
199
|
+
* Per spec: Uses conditional update for double execution prevention
|
|
200
|
+
*
|
|
201
|
+
* @returns ClaimResult with success flag and item if claimed
|
|
202
|
+
*/
|
|
203
|
+
async claim() {
|
|
204
|
+
// Query for oldest QUEUED item using status-index
|
|
205
|
+
const queryResult = await this.docClient.send(new lib_dynamodb_1.QueryCommand({
|
|
206
|
+
TableName: this.tableName,
|
|
207
|
+
IndexName: 'status-index',
|
|
208
|
+
KeyConditionExpression: '#status = :queued',
|
|
209
|
+
ExpressionAttributeNames: {
|
|
210
|
+
'#status': 'status',
|
|
211
|
+
},
|
|
212
|
+
ExpressionAttributeValues: {
|
|
213
|
+
':queued': 'QUEUED',
|
|
214
|
+
},
|
|
215
|
+
Limit: 1,
|
|
216
|
+
ScanIndexForward: true, // Ascending by created_at (oldest first)
|
|
217
|
+
}));
|
|
218
|
+
if (!queryResult.Items || queryResult.Items.length === 0) {
|
|
219
|
+
return { success: false };
|
|
220
|
+
}
|
|
221
|
+
const item = queryResult.Items[0];
|
|
222
|
+
// Atomic update: QUEUED -> RUNNING with conditional check
|
|
223
|
+
try {
|
|
224
|
+
const now = new Date().toISOString();
|
|
225
|
+
await this.docClient.send(new lib_dynamodb_1.UpdateCommand({
|
|
226
|
+
TableName: this.tableName,
|
|
227
|
+
Key: { task_id: item.task_id },
|
|
228
|
+
UpdateExpression: 'SET #status = :running, updated_at = :now',
|
|
229
|
+
ConditionExpression: '#status = :queued',
|
|
230
|
+
ExpressionAttributeNames: {
|
|
231
|
+
'#status': 'status',
|
|
232
|
+
},
|
|
233
|
+
ExpressionAttributeValues: {
|
|
234
|
+
':running': 'RUNNING',
|
|
235
|
+
':queued': 'QUEUED',
|
|
236
|
+
':now': now,
|
|
237
|
+
},
|
|
238
|
+
}));
|
|
239
|
+
// Update local item with new status
|
|
240
|
+
item.status = 'RUNNING';
|
|
241
|
+
item.updated_at = now;
|
|
242
|
+
return { success: true, item };
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
// ConditionalCheckFailed means another process claimed it
|
|
246
|
+
if (error &&
|
|
247
|
+
typeof error === 'object' &&
|
|
248
|
+
'name' in error &&
|
|
249
|
+
error.name === 'ConditionalCheckFailedException') {
|
|
250
|
+
return { success: false, error: 'Task already claimed by another process' };
|
|
251
|
+
}
|
|
252
|
+
// Fail-closed: re-throw unexpected errors
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Update task status
|
|
258
|
+
* Per spec: RUNNING -> COMPLETE or RUNNING -> ERROR
|
|
259
|
+
*
|
|
260
|
+
* @param taskId - Task ID
|
|
261
|
+
* @param status - New status
|
|
262
|
+
* @param errorMessage - Optional error message (for ERROR status)
|
|
263
|
+
*/
|
|
264
|
+
async updateStatus(taskId, status, errorMessage) {
|
|
265
|
+
const now = new Date().toISOString();
|
|
266
|
+
const updateExpression = errorMessage
|
|
267
|
+
? 'SET #status = :status, updated_at = :now, error_message = :error'
|
|
268
|
+
: 'SET #status = :status, updated_at = :now';
|
|
269
|
+
const expressionAttributeValues = {
|
|
270
|
+
':status': status,
|
|
271
|
+
':now': now,
|
|
272
|
+
};
|
|
273
|
+
if (errorMessage) {
|
|
274
|
+
expressionAttributeValues[':error'] = errorMessage;
|
|
275
|
+
}
|
|
276
|
+
await this.docClient.send(new lib_dynamodb_1.UpdateCommand({
|
|
277
|
+
TableName: this.tableName,
|
|
278
|
+
Key: { task_id: taskId },
|
|
279
|
+
UpdateExpression: updateExpression,
|
|
280
|
+
ExpressionAttributeNames: {
|
|
281
|
+
'#status': 'status',
|
|
282
|
+
},
|
|
283
|
+
ExpressionAttributeValues: expressionAttributeValues,
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get items by session ID
|
|
288
|
+
* Uses session-index GSI
|
|
289
|
+
*/
|
|
290
|
+
async getBySession(sessionId) {
|
|
291
|
+
const result = await this.docClient.send(new lib_dynamodb_1.QueryCommand({
|
|
292
|
+
TableName: this.tableName,
|
|
293
|
+
IndexName: 'session-index',
|
|
294
|
+
KeyConditionExpression: 'session_id = :sid',
|
|
295
|
+
ExpressionAttributeValues: {
|
|
296
|
+
':sid': sessionId,
|
|
297
|
+
},
|
|
298
|
+
ScanIndexForward: true, // Ascending by created_at
|
|
299
|
+
}));
|
|
300
|
+
return result.Items || [];
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get items by status
|
|
304
|
+
* Uses status-index GSI
|
|
305
|
+
*/
|
|
306
|
+
async getByStatus(status) {
|
|
307
|
+
const result = await this.docClient.send(new lib_dynamodb_1.QueryCommand({
|
|
308
|
+
TableName: this.tableName,
|
|
309
|
+
IndexName: 'status-index',
|
|
310
|
+
KeyConditionExpression: '#status = :status',
|
|
311
|
+
ExpressionAttributeNames: {
|
|
312
|
+
'#status': 'status',
|
|
313
|
+
},
|
|
314
|
+
ExpressionAttributeValues: {
|
|
315
|
+
':status': status,
|
|
316
|
+
},
|
|
317
|
+
ScanIndexForward: true, // Ascending by created_at
|
|
318
|
+
}));
|
|
319
|
+
return result.Items || [];
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get items by task group ID
|
|
323
|
+
* Uses task-group-index GSI
|
|
324
|
+
* Per spec/19_WEB_UI.md: for listing tasks in a task group
|
|
325
|
+
*/
|
|
326
|
+
async getByTaskGroup(taskGroupId) {
|
|
327
|
+
const result = await this.docClient.send(new lib_dynamodb_1.QueryCommand({
|
|
328
|
+
TableName: this.tableName,
|
|
329
|
+
IndexName: 'task-group-index',
|
|
330
|
+
KeyConditionExpression: 'task_group_id = :tgid',
|
|
331
|
+
ExpressionAttributeValues: {
|
|
332
|
+
':tgid': taskGroupId,
|
|
333
|
+
},
|
|
334
|
+
ScanIndexForward: true, // Ascending by created_at
|
|
335
|
+
}));
|
|
336
|
+
return result.Items || [];
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get all distinct task groups with summary
|
|
340
|
+
* Per spec/19_WEB_UI.md: for task group list view
|
|
341
|
+
* Note: Uses Scan - consider pagination for large datasets
|
|
342
|
+
*/
|
|
343
|
+
async getAllTaskGroups() {
|
|
344
|
+
// Scan all items and aggregate by task_group_id
|
|
345
|
+
const result = await this.docClient.send(new lib_dynamodb_1.ScanCommand({
|
|
346
|
+
TableName: this.tableName,
|
|
347
|
+
ProjectionExpression: 'task_group_id, created_at, updated_at',
|
|
348
|
+
}));
|
|
349
|
+
const items = result.Items || [];
|
|
350
|
+
// Aggregate by task_group_id
|
|
351
|
+
const groupMap = new Map();
|
|
352
|
+
for (const item of items) {
|
|
353
|
+
const existing = groupMap.get(item.task_group_id);
|
|
354
|
+
if (existing) {
|
|
355
|
+
existing.count++;
|
|
356
|
+
if (item.created_at < existing.createdAt) {
|
|
357
|
+
existing.createdAt = item.created_at;
|
|
358
|
+
}
|
|
359
|
+
if (item.updated_at > existing.latestUpdatedAt) {
|
|
360
|
+
existing.latestUpdatedAt = item.updated_at;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
groupMap.set(item.task_group_id, {
|
|
365
|
+
count: 1,
|
|
366
|
+
createdAt: item.created_at,
|
|
367
|
+
latestUpdatedAt: item.updated_at,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// Convert to array and sort by created_at (oldest first)
|
|
372
|
+
const groups = [];
|
|
373
|
+
for (const [taskGroupId, data] of groupMap) {
|
|
374
|
+
groups.push({
|
|
375
|
+
task_group_id: taskGroupId,
|
|
376
|
+
task_count: data.count,
|
|
377
|
+
created_at: data.createdAt,
|
|
378
|
+
latest_updated_at: data.latestUpdatedAt,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
groups.sort((a, b) => a.created_at.localeCompare(b.created_at));
|
|
382
|
+
return groups;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Delete item (for testing)
|
|
386
|
+
*/
|
|
387
|
+
async deleteItem(taskId) {
|
|
388
|
+
await this.docClient.send(new lib_dynamodb_1.DeleteCommand({
|
|
389
|
+
TableName: this.tableName,
|
|
390
|
+
Key: { task_id: taskId },
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Mark stale RUNNING tasks as ERROR
|
|
395
|
+
* Per spec: fail-closed - don't leave tasks in "limbo"
|
|
396
|
+
*
|
|
397
|
+
* @param maxAgeMs - Max age in milliseconds for RUNNING tasks
|
|
398
|
+
* @returns Number of tasks marked as ERROR
|
|
399
|
+
*/
|
|
400
|
+
async recoverStaleTasks(maxAgeMs = 5 * 60 * 1000) {
|
|
401
|
+
const runningTasks = await this.getByStatus('RUNNING');
|
|
402
|
+
const now = Date.now();
|
|
403
|
+
let recovered = 0;
|
|
404
|
+
for (const task of runningTasks) {
|
|
405
|
+
const taskAge = now - new Date(task.updated_at).getTime();
|
|
406
|
+
if (taskAge > maxAgeMs) {
|
|
407
|
+
await this.updateStatus(task.task_id, 'ERROR', `Task stale: running for ${Math.round(taskAge / 1000)}s without completion`);
|
|
408
|
+
recovered++;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return recovered;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Close the client connection
|
|
415
|
+
*/
|
|
416
|
+
destroy() {
|
|
417
|
+
this.client.destroy();
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
exports.QueueStore = QueueStore;
|
|
421
|
+
//# sourceMappingURL=queue-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-store.js","sourceRoot":"","sources":["../../src/queue/queue-store.ts"],"names":[],"mappings":"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"}
|
package/dist/repl/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { REPLInterface, REPLConfig, ReplExecutionMode, EXIT_CODES, ProjectMode, VerifiedFile, TaskLog, } from './repl-interface';
|
|
5
5
|
export * from './commands';
|
|
6
|
+
export { TwoPaneRenderer, TwoPaneRendererConfig, RunningInfo, CompleteInfo, } from './two-pane-renderer';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/repl/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,UAAU,EAEV,WAAW,EACX,YAAY,EACZ,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,UAAU,EAEV,WAAW,EACX,YAAY,EACZ,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,YAAY,GACb,MAAM,qBAAqB,CAAC"}
|
package/dist/repl/index.js
CHANGED
|
@@ -17,9 +17,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.EXIT_CODES = exports.REPLInterface = void 0;
|
|
20
|
+
exports.TwoPaneRenderer = exports.EXIT_CODES = exports.REPLInterface = void 0;
|
|
21
21
|
var repl_interface_1 = require("./repl-interface");
|
|
22
22
|
Object.defineProperty(exports, "REPLInterface", { enumerable: true, get: function () { return repl_interface_1.REPLInterface; } });
|
|
23
23
|
Object.defineProperty(exports, "EXIT_CODES", { enumerable: true, get: function () { return repl_interface_1.EXIT_CODES; } });
|
|
24
24
|
__exportStar(require("./commands"), exports);
|
|
25
|
+
var two_pane_renderer_1 = require("./two-pane-renderer");
|
|
26
|
+
Object.defineProperty(exports, "TwoPaneRenderer", { enumerable: true, get: function () { return two_pane_renderer_1.TwoPaneRenderer; } });
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
package/dist/repl/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repl/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,mDAS0B;AARxB,+GAAA,aAAa,OAAA;AAGb,4GAAA,UAAU,OAAA;AAMZ,6CAA2B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repl/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,mDAS0B;AARxB,+GAAA,aAAa,OAAA;AAGb,4GAAA,UAAU,OAAA;AAMZ,6CAA2B;AAC3B,yDAK6B;AAJ3B,oHAAA,eAAe,OAAA"}
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* - Deterministic Exit Code: 0=COMPLETE, 1=ERROR, 2=INCOMPLETE
|
|
13
13
|
*
|
|
14
14
|
* Project Mode (per spec 10_REPL_UX.md, Property 32, 33):
|
|
15
|
-
* -
|
|
15
|
+
* - cwd: Use current working directory (DEFAULT per spec)
|
|
16
|
+
* - temp: Use temporary directory (cleaned up on exit)
|
|
16
17
|
* - fixed: Use specified directory (persists after exit)
|
|
17
18
|
*/
|
|
18
19
|
import { EventEmitter } from 'events';
|
|
@@ -21,10 +22,11 @@ import { ExecutorSupervisor } from '../supervisor/executor-supervisor';
|
|
|
21
22
|
/**
|
|
22
23
|
* Project Mode - per spec 10_REPL_UX.md
|
|
23
24
|
* Controls how verification_root is determined
|
|
24
|
-
* -
|
|
25
|
+
* - cwd: Use current working directory (DEFAULT per spec)
|
|
26
|
+
* - temp: Use temporary directory
|
|
25
27
|
* - fixed: Use specified --project-root directory
|
|
26
28
|
*/
|
|
27
|
-
export type ProjectMode = 'temp' | 'fixed';
|
|
29
|
+
export type ProjectMode = 'cwd' | 'temp' | 'fixed';
|
|
28
30
|
/**
|
|
29
31
|
* Verified File record - per spec 06_CORRECTNESS_PROPERTIES.md Property 33
|
|
30
32
|
* Records file verification result with traceability information
|
|
@@ -63,7 +65,8 @@ export interface REPLConfig {
|
|
|
63
65
|
forceNonInteractive?: boolean;
|
|
64
66
|
/**
|
|
65
67
|
* Project mode - per spec 10_REPL_UX.md
|
|
66
|
-
* - '
|
|
68
|
+
* - 'cwd': Use current working directory (DEFAULT per spec)
|
|
69
|
+
* - 'temp': Use temporary directory for verification_root
|
|
67
70
|
* - 'fixed': Use projectRoot as verification_root
|
|
68
71
|
*/
|
|
69
72
|
projectMode?: ProjectMode;
|
|
@@ -78,6 +81,22 @@ export interface REPLConfig {
|
|
|
78
81
|
* Outputs PROJECT_PATH=<path> for machine-readable parsing
|
|
79
82
|
*/
|
|
80
83
|
printProjectPath?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Namespace for state separation - per spec/21_STABLE_DEV.md
|
|
86
|
+
* Separates QueueStore, state dir, Web UI port
|
|
87
|
+
* Examples: 'stable', 'dev', 'test-1'
|
|
88
|
+
*/
|
|
89
|
+
namespace?: string;
|
|
90
|
+
/**
|
|
91
|
+
* Full namespace configuration - per spec/21_STABLE_DEV.md
|
|
92
|
+
* Contains derived values: tableName, stateDir, port
|
|
93
|
+
*/
|
|
94
|
+
namespaceConfig?: {
|
|
95
|
+
namespace: string;
|
|
96
|
+
tableName: string;
|
|
97
|
+
stateDir: string;
|
|
98
|
+
port: number;
|
|
99
|
+
};
|
|
81
100
|
}
|
|
82
101
|
/**
|
|
83
102
|
* REPL Execution Mode - per spec 05_DATA_MODELS.md
|
|
@@ -188,6 +207,7 @@ export declare class REPLInterface extends EventEmitter {
|
|
|
188
207
|
private modelsCommand;
|
|
189
208
|
private keysCommand;
|
|
190
209
|
private logsCommand;
|
|
210
|
+
private renderer;
|
|
191
211
|
constructor(config?: REPLConfig);
|
|
192
212
|
/**
|
|
193
213
|
* Get project mode - per spec 10_REPL_UX.md
|
|
@@ -228,6 +248,13 @@ export declare class REPLInterface extends EventEmitter {
|
|
|
228
248
|
* Per spec Property 32: temp mode directories may be cleaned up
|
|
229
249
|
*/
|
|
230
250
|
cleanup(): Promise<void>;
|
|
251
|
+
/**
|
|
252
|
+
* Check Claude Code CLI auth status
|
|
253
|
+
* Per spec/15_API_KEY_ENV_SANITIZE.md: Check at startup, exit on failure
|
|
254
|
+
*
|
|
255
|
+
* @returns AuthCheckResult with availability and login status
|
|
256
|
+
*/
|
|
257
|
+
private checkClaudeCodeAuth;
|
|
231
258
|
/**
|
|
232
259
|
* Check API key status and show warning if not configured
|
|
233
260
|
* API keys are stored in global config file (~/.pm-orchestrator-runner/config.json)
|
|
@@ -315,6 +342,7 @@ export declare class REPLInterface extends EventEmitter {
|
|
|
315
342
|
private handleClarificationNeeded;
|
|
316
343
|
/**
|
|
317
344
|
* Print welcome message with clear auth status
|
|
345
|
+
* Per spec/15_API_KEY_ENV_SANITIZE.md: Show required startup display
|
|
318
346
|
*/
|
|
319
347
|
private printWelcome;
|
|
320
348
|
/**
|
|
@@ -370,7 +398,10 @@ export declare class REPLInterface extends EventEmitter {
|
|
|
370
398
|
private handleStatus;
|
|
371
399
|
/**
|
|
372
400
|
* Handle /start command
|
|
373
|
-
* Per spec Property 32, 33: Use verification_root for file operations
|
|
401
|
+
* Per spec Property 32, 33: Use verification_root for file operations
|
|
402
|
+
* - cwd mode: use process.cwd() (verificationRoot)
|
|
403
|
+
* - temp mode: use temp directory (verificationRoot)
|
|
404
|
+
* - fixed mode: use projectRoot
|
|
374
405
|
*/
|
|
375
406
|
private handleStart;
|
|
376
407
|
/**
|
|
@@ -422,6 +453,10 @@ export declare class REPLInterface extends EventEmitter {
|
|
|
422
453
|
/**
|
|
423
454
|
* Print message with flush guarantee for non-interactive mode
|
|
424
455
|
* Per spec 10_REPL_UX.md: Output Flush Guarantee
|
|
456
|
+
* Per spec 18_CLI_TWO_PANE.md: Use TwoPaneRenderer for TTY output
|
|
457
|
+
*
|
|
458
|
+
* Syncs readline input state to renderer before output,
|
|
459
|
+
* ensuring input line is preserved during log output.
|
|
425
460
|
*/
|
|
426
461
|
private print;
|
|
427
462
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl-interface.d.ts","sourceRoot":"","sources":["../../src/repl/repl-interface.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"repl-interface.d.ts","sourceRoot":"","sources":["../../src/repl/repl-interface.ts"],"names":[],"mappings":"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"}
|