@myagentroam/node 0.11.10 → 0.11.11
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/runtime-state.js
CHANGED
|
@@ -42,6 +42,8 @@ export class NodeRuntimeState {
|
|
|
42
42
|
queuedItems = new Map();
|
|
43
43
|
receivingQueueItems = new Set();
|
|
44
44
|
queueVersions = new Map();
|
|
45
|
+
/** Snapshot version of the last FIFO membership or ordering change. */
|
|
46
|
+
queueOrderVersions = new Map();
|
|
45
47
|
pausedQueues = new Set();
|
|
46
48
|
/** Bounded tombstones reject stale internal start envelopes after terminal cleanup. */
|
|
47
49
|
terminalRunIds = new Map();
|
|
@@ -239,6 +241,7 @@ export class NodeRuntimeState {
|
|
|
239
241
|
const turns = this.turns.get(id) ?? [];
|
|
240
242
|
const queue = this.queuedItems.get(id);
|
|
241
243
|
const queueVersion = this.queueVersions.get(id);
|
|
244
|
+
const queueOrderVersion = this.queueOrderVersions.get(id);
|
|
242
245
|
const lease = this.leases.get(id);
|
|
243
246
|
const paused = this.pausedQueues.has(id);
|
|
244
247
|
this.sessions.delete(id);
|
|
@@ -273,6 +276,10 @@ export class NodeRuntimeState {
|
|
|
273
276
|
this.queueVersions.delete(id);
|
|
274
277
|
this.queueVersions.set(nativeSessionId, queueVersion);
|
|
275
278
|
}
|
|
279
|
+
if (queueOrderVersion !== undefined) {
|
|
280
|
+
this.queueOrderVersions.delete(id);
|
|
281
|
+
this.queueOrderVersions.set(nativeSessionId, queueOrderVersion);
|
|
282
|
+
}
|
|
276
283
|
if (lease !== undefined) {
|
|
277
284
|
this.leases.delete(id);
|
|
278
285
|
this.leases.set(nativeSessionId, lease);
|
|
@@ -580,18 +587,20 @@ export class NodeRuntimeState {
|
|
|
580
587
|
}
|
|
581
588
|
pauseSessionQueue(sessionId) {
|
|
582
589
|
this.pausedQueues.add(sessionId);
|
|
583
|
-
this.bumpQueueVersion(sessionId);
|
|
590
|
+
this.bumpQueueVersion(sessionId, false);
|
|
584
591
|
}
|
|
585
592
|
resumeSessionQueue(sessionId) {
|
|
586
593
|
if (!this.pausedQueues.delete(sessionId))
|
|
587
594
|
return;
|
|
588
|
-
this.bumpQueueVersion(sessionId);
|
|
595
|
+
this.bumpQueueVersion(sessionId, false);
|
|
589
596
|
}
|
|
590
597
|
reorderSessionQueue(sessionId, expectedVersion, itemIds) {
|
|
591
598
|
const current = this.queuedItems.get(sessionId) ?? [];
|
|
592
599
|
for (const id of current)
|
|
593
600
|
this.assertQueueItemMutable(id);
|
|
594
|
-
if (
|
|
601
|
+
if (!Number.isInteger(expectedVersion) ||
|
|
602
|
+
expectedVersion < (this.queueOrderVersions.get(sessionId) ?? 0) ||
|
|
603
|
+
expectedVersion > this.sessionQueue(sessionId).version ||
|
|
595
604
|
current.length !== itemIds.length ||
|
|
596
605
|
new Set(current).size !== current.length ||
|
|
597
606
|
current.some((itemId) => !itemIds.includes(itemId)))
|
|
@@ -599,7 +608,7 @@ export class NodeRuntimeState {
|
|
|
599
608
|
if (itemIds.some((itemId) => this.queueItems.get(itemId)?.sessionId !== sessionId))
|
|
600
609
|
throw new Error('QUEUE_ITEM_INVALID');
|
|
601
610
|
this.queuedItems.set(sessionId, [...itemIds]);
|
|
602
|
-
this.bumpQueueVersion(sessionId);
|
|
611
|
+
this.bumpQueueVersion(sessionId, current.some((itemId, index) => itemIds[index] !== itemId));
|
|
603
612
|
}
|
|
604
613
|
prioritizeQueueItem(itemId) {
|
|
605
614
|
this.assertQueueItemMutable(itemId);
|
|
@@ -611,7 +620,7 @@ export class NodeRuntimeState {
|
|
|
611
620
|
itemId,
|
|
612
621
|
...queue.filter((candidate) => candidate !== itemId)
|
|
613
622
|
]);
|
|
614
|
-
this.bumpQueueVersion(item.sessionId);
|
|
623
|
+
this.bumpQueueVersion(item.sessionId, queue[0] !== itemId);
|
|
615
624
|
return item;
|
|
616
625
|
}
|
|
617
626
|
updateQueueItem(itemId, content) {
|
|
@@ -621,7 +630,7 @@ export class NodeRuntimeState {
|
|
|
621
630
|
throw new Error('QUEUE_ITEM_INVALID');
|
|
622
631
|
const next = { ...item, content };
|
|
623
632
|
this.queueItems.set(itemId, next);
|
|
624
|
-
this.bumpQueueVersion(item.sessionId);
|
|
633
|
+
this.bumpQueueVersion(item.sessionId, false);
|
|
625
634
|
return next;
|
|
626
635
|
}
|
|
627
636
|
updateQueueItemAttachments(itemId, attachments, content) {
|
|
@@ -630,7 +639,7 @@ export class NodeRuntimeState {
|
|
|
630
639
|
const next = { ...item, attachments, ...(content === undefined ? {} : { content }) };
|
|
631
640
|
this.queueItems.set(itemId, next);
|
|
632
641
|
if (content !== undefined && content !== item.content)
|
|
633
|
-
this.bumpQueueVersion(item.sessionId);
|
|
642
|
+
this.bumpQueueVersion(item.sessionId, false);
|
|
634
643
|
return next;
|
|
635
644
|
}
|
|
636
645
|
deleteQueueItem(itemId) {
|
|
@@ -1106,6 +1115,7 @@ export class NodeRuntimeState {
|
|
|
1106
1115
|
for (const itemId of queued)
|
|
1107
1116
|
this.queueItems.delete(itemId);
|
|
1108
1117
|
this.queueVersions.delete(sessionId);
|
|
1118
|
+
this.queueOrderVersions.delete(sessionId);
|
|
1109
1119
|
this.pausedQueues.delete(sessionId);
|
|
1110
1120
|
this.leases.delete(sessionId);
|
|
1111
1121
|
for (const runId of runIds) {
|
|
@@ -1205,6 +1215,7 @@ export class NodeRuntimeState {
|
|
|
1205
1215
|
for (const itemId of queued)
|
|
1206
1216
|
this.queueItems.delete(itemId);
|
|
1207
1217
|
this.queueVersions.delete(sessionId);
|
|
1218
|
+
this.queueOrderVersions.delete(sessionId);
|
|
1208
1219
|
this.pausedQueues.delete(sessionId);
|
|
1209
1220
|
this.leases.delete(sessionId);
|
|
1210
1221
|
}
|
|
@@ -1239,8 +1250,11 @@ export class NodeRuntimeState {
|
|
|
1239
1250
|
: (this.recentUserMessages.get(run.id) ?? this.currentRunMessageText(run.id));
|
|
1240
1251
|
this.onRunChanged?.(run, session, userMessage.length === 0 ? undefined : userMessage);
|
|
1241
1252
|
}
|
|
1242
|
-
bumpQueueVersion(sessionId) {
|
|
1243
|
-
|
|
1253
|
+
bumpQueueVersion(sessionId, orderChanged = true) {
|
|
1254
|
+
const version = (this.queueVersions.get(sessionId) ?? 0) + 1;
|
|
1255
|
+
this.queueVersions.set(sessionId, version);
|
|
1256
|
+
if (orderChanged)
|
|
1257
|
+
this.queueOrderVersions.set(sessionId, version);
|
|
1244
1258
|
}
|
|
1245
1259
|
pruneRetainedExecutionTurns(sessionId, retainedTurnIds) {
|
|
1246
1260
|
for (const [executionId, reference] of this.retainedExecutionTurns)
|
|
@@ -11,6 +11,7 @@ export class ContinuousRunCoordinator {
|
|
|
11
11
|
startedExecutions = new Set();
|
|
12
12
|
scheduledSessions = new Map();
|
|
13
13
|
immediateQueueItems = new Set();
|
|
14
|
+
queueExecutionAdmissions = new Map();
|
|
14
15
|
steerInFlight = new Map();
|
|
15
16
|
suspended = false;
|
|
16
17
|
constructor(options) {
|
|
@@ -228,16 +229,23 @@ export class ContinuousRunCoordinator {
|
|
|
228
229
|
return 'QUEUED';
|
|
229
230
|
}
|
|
230
231
|
executeQueueItem(itemId) {
|
|
232
|
+
const inFlight = this.queueExecutionAdmissions.get(itemId);
|
|
233
|
+
if (inFlight !== undefined)
|
|
234
|
+
return inFlight;
|
|
231
235
|
const pending = this.preparedInputs.get(itemId);
|
|
232
236
|
if (this.options.resolveExecutionDirectory && pending) {
|
|
233
|
-
const
|
|
234
|
-
|
|
237
|
+
const task = this.directoryForInput(itemId, pending, true)
|
|
238
|
+
.then((cwd) => {
|
|
235
239
|
if (cwd === undefined || !this.inputCurrent(itemId, pending))
|
|
236
240
|
throw new Error('QUEUE_ITEM_INVALID');
|
|
237
|
-
if (this.options.runtime.sessionQueue(pending.sessionId).version !== version)
|
|
238
|
-
throw new Error('QUEUE_VERSION_CONFLICT');
|
|
239
241
|
return this.executeQueueItemReady(itemId);
|
|
242
|
+
})
|
|
243
|
+
.finally(() => {
|
|
244
|
+
if (this.queueExecutionAdmissions.get(itemId) === task)
|
|
245
|
+
this.queueExecutionAdmissions.delete(itemId);
|
|
240
246
|
});
|
|
247
|
+
this.queueExecutionAdmissions.set(itemId, task);
|
|
248
|
+
return task;
|
|
241
249
|
}
|
|
242
250
|
return this.executeQueueItemReady(itemId);
|
|
243
251
|
}
|
|
@@ -713,6 +721,7 @@ export class ContinuousRunCoordinator {
|
|
|
713
721
|
this.dispatchedExecutions.clear();
|
|
714
722
|
this.startedExecutions.clear();
|
|
715
723
|
this.immediateQueueItems.clear();
|
|
724
|
+
this.queueExecutionAdmissions.clear();
|
|
716
725
|
for (const timer of this.scheduledSessions.values())
|
|
717
726
|
clearTimeout(timer);
|
|
718
727
|
this.scheduledSessions.clear();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myagentroam/node",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.11",
|
|
4
4
|
"description": "MyAgentRoam Node runtime CLI.",
|
|
5
5
|
"license": "Apache-2.0 AND GPL-2.0-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"ws": "^8.21.3",
|
|
39
39
|
"zod": "4.4.3",
|
|
40
40
|
"@myagentroam/code-navigation": "0.11.0",
|
|
41
|
+
"@myagentroam/protocol": "0.11.11",
|
|
41
42
|
"@myagentroam/marctl": "0.11.0",
|
|
42
|
-
"@myagentroam/
|
|
43
|
-
"@myagentroam/agent": "0.11.10"
|
|
43
|
+
"@myagentroam/agent": "0.11.11"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/ws": "^8.18.1"
|