@myagentroam/node 0.11.9 → 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.
@@ -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 (this.sessionQueue(sessionId).version !== expectedVersion ||
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
- this.queueVersions.set(sessionId, (this.queueVersions.get(sessionId) ?? 0) + 1);
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 version = this.options.runtime.sessionQueue(pending.sessionId).version;
234
- return this.directoryForInput(itemId, pending, true).then((cwd) => {
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.9",
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",
@@ -37,10 +37,10 @@
37
37
  "playwright": "1.62.1",
38
38
  "ws": "^8.21.3",
39
39
  "zod": "4.4.3",
40
- "@myagentroam/agent": "0.11.9",
41
- "@myagentroam/protocol": "0.11.9",
42
40
  "@myagentroam/code-navigation": "0.11.0",
43
- "@myagentroam/marctl": "0.11.0"
41
+ "@myagentroam/protocol": "0.11.11",
42
+ "@myagentroam/marctl": "0.11.0",
43
+ "@myagentroam/agent": "0.11.11"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/ws": "^8.18.1"