@parall/daemon 1.55.1 → 1.55.2

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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.55.1",
3
- "built_at": "2026-08-12T14:55:20.195Z",
2
+ "version": "1.55.2",
3
+ "built_at": "2026-08-13T12:51:07.413Z",
4
4
  "min_node_version": "20.0.0",
5
5
  "files": {
6
6
  "bb-browser-daemon.js": {
@@ -24,21 +24,21 @@
24
24
  "size": 7220
25
25
  },
26
26
  "parall-claude-agent.js": {
27
- "sha256": "9be3b40a7a07ffe475bc2d89a24873dfb255318fbff44001aa91b46424f74764",
28
- "size": 2814346
27
+ "sha256": "03f72ff9ac4da18f680f012ef3ac2c88dc1b87ce524c1b6fbe763cf3f3ff7d2e",
28
+ "size": 2816084
29
29
  },
30
30
  "parall-codex-agent.js": {
31
- "sha256": "1951a7dd83d82108fb9db3f58d9dd8e338c059d67656de8370053c0355b50221",
32
- "size": 2846371
31
+ "sha256": "d9f0278b7d1be05c9dbaef57e9bf4727f569f90e2d21cbec21091cc5c2caf546",
32
+ "size": 2848031
33
33
  },
34
34
  "parall-daemon.js": {
35
- "sha256": "9b22b08ee0d9bb544bc04cde5bfb81105efc48605cbb04e34bd72fc21cdf2791",
36
- "size": 3011156
35
+ "sha256": "d60fef8269a708cfd623c4011e19b7ee1e11d9fb1d5bdfe678893d86470df7c2",
36
+ "size": 3011385
37
37
  },
38
38
  "parall-openclaw-agent.js": {
39
39
  "sha256": "856a1c3a9ae0ffef8efe2481fa1171dbeb1d67cccb88616aa9bf16da96a69355",
40
40
  "size": 9923
41
41
  }
42
42
  },
43
- "signature": "6Qz7sggq6UHjp8N85qhLEIOUQo3HA2x0Sh0s2dkbSwti5TjfEznbi/jcYhZROXlPIV1wihB9i2eE7w+p3F6DCQ=="
43
+ "signature": "ogOg4KHQBnIv2efZbO6ZI9HCQ/JMZp5Cb52Eya+n5f7k8cTrzKCZoveb102SwOdhx5sVz1lN30Vhh3ZZtSBSBw=="
44
44
  }
@@ -55885,6 +55885,56 @@ async function consumeMessageWorkItem(host, item) {
55885
55885
  }
55886
55886
  }
55887
55887
 
55888
+ // ts/agent-core/dist/dispatch-inactivity-deadline.js
55889
+ var DispatchInactivityDeadline = class {
55890
+ timeoutMs;
55891
+ onExpire;
55892
+ onDispose;
55893
+ timer = null;
55894
+ expired = false;
55895
+ disposed = false;
55896
+ constructor(timeoutMs, onExpire, onDispose) {
55897
+ this.timeoutMs = timeoutMs;
55898
+ this.onExpire = onExpire;
55899
+ this.onDispose = onDispose;
55900
+ }
55901
+ touch = () => {
55902
+ if (this.timeoutMs <= 0 || this.expired || this.disposed)
55903
+ return;
55904
+ if (this.timer)
55905
+ clearTimeout(this.timer);
55906
+ this.timer = setTimeout(() => {
55907
+ this.timer = null;
55908
+ this.expired = true;
55909
+ this.onExpire();
55910
+ }, this.timeoutMs);
55911
+ };
55912
+ dispose() {
55913
+ if (this.disposed)
55914
+ return;
55915
+ this.disposed = true;
55916
+ if (this.timer)
55917
+ clearTimeout(this.timer);
55918
+ this.timer = null;
55919
+ this.onDispose();
55920
+ }
55921
+ };
55922
+ var DispatchInactivityDeadlines = class {
55923
+ active = /* @__PURE__ */ new Map();
55924
+ start(sessionKey, timeoutMs, onExpire) {
55925
+ const deadline = new DispatchInactivityDeadline(timeoutMs, onExpire, () => {
55926
+ if (this.active.get(sessionKey) === deadline)
55927
+ this.active.delete(sessionKey);
55928
+ });
55929
+ this.active.set(sessionKey, deadline);
55930
+ deadline.touch();
55931
+ return deadline;
55932
+ }
55933
+ touch(sessionKey) {
55934
+ this.active.get(sessionKey)?.touch();
55935
+ }
55936
+ };
55937
+
55888
55938
  // ts/agent-core/dist/routing.js
55889
55939
  var MAX_CONCURRENT_FORKS = 20;
55890
55940
  var defaultRoutingStrategy = (event, state) => {
@@ -57430,6 +57480,7 @@ var ParallAgentGateway = class {
57430
57480
  * an unrelated stalled fork's lane leased forever).
57431
57481
  */
57432
57482
  sessionActiveLanes = /* @__PURE__ */ new Map();
57483
+ dispatchInactivityDeadlines = new DispatchInactivityDeadlines();
57433
57484
  noteSessionLane(sessionKey, laneKey) {
57434
57485
  if (laneKey == null)
57435
57486
  this.sessionActiveLanes.delete(sessionKey);
@@ -57439,11 +57490,12 @@ var ParallAgentGateway = class {
57439
57490
  /**
57440
57491
  * External runtime-activity signal for adapters whose tool activity does
57441
57492
  * not flow through the RuntimeEvent stream (openclaw hooks call this from
57442
- * the tool-call lifecycle): renews the session's OWN active ledger lane so
57443
- * a long tool call cannot outlive the lease and get dethroned mid-turn.
57444
- * No-op without an active ledger lane for the session.
57493
+ * the tool-call lifecycle): refreshes the dispatch inactivity deadline and
57494
+ * renews the session's OWN active ledger lane, when present, so a long tool
57495
+ * call cannot time out or get dethroned mid-turn.
57445
57496
  */
57446
57497
  touchRuntimeActivity(sessionKey) {
57498
+ this.dispatchInactivityDeadlines.touch(sessionKey);
57447
57499
  if (this.ledgerDisabled)
57448
57500
  return;
57449
57501
  const laneKey = this.sessionActiveLanes.get(sessionKey);
@@ -57919,14 +57971,14 @@ var ParallAgentGateway = class {
57919
57971
  this.writeContextFile(laneContextFilePath2, contextBody);
57920
57972
  }
57921
57973
  this.inFlightDispatches++;
57922
- const deadlineTimer = this.DISPATCH_DEADLINE_MS > 0 ? setTimeout(() => {
57923
- this.opts.log?.warn(`dispatch deadline exceeded (${this.DISPATCH_DEADLINE_MS}ms) for ${event.messageId} on ${sessionKey}; aborting`);
57974
+ const dispatchDeadline = this.dispatchInactivityDeadlines.start(sessionKey, this.DISPATCH_DEADLINE_MS, () => {
57975
+ this.opts.log?.warn(`dispatch inactivity deadline exceeded (${this.DISPATCH_DEADLINE_MS}ms) for ${event.messageId} on ${sessionKey}; aborting`);
57924
57976
  try {
57925
57977
  this.opts.dispatchAdapter.abortDispatch?.(sessionKey);
57926
57978
  } catch (err) {
57927
57979
  this.opts.log?.warn(`abortDispatch threw for ${sessionKey}: ${String(err)}`);
57928
57980
  }
57929
- }, this.DISPATCH_DEADLINE_MS) : null;
57981
+ });
57930
57982
  let binding = this.sessionBindings.get(sessionKey);
57931
57983
  let inputStepsCreated = false;
57932
57984
  let turnHandle;
@@ -57947,8 +57999,10 @@ var ParallAgentGateway = class {
57947
57999
  bodyForAgent,
57948
58000
  sessionKey,
57949
58001
  context: dispatchContext,
57950
- inputLifecycle
58002
+ inputLifecycle,
58003
+ noteActivity: dispatchDeadline.touch
57951
58004
  })) {
58005
+ dispatchDeadline.touch();
57952
58006
  if (runtimeEvent.type === "runtime_session") {
57953
58007
  const priorAgentSessionId = binding?.agentSessionId;
57954
58008
  binding = await this.bindRuntimeSession(sessionKey, runtimeEvent, contextFilePath, laneContextFilePath2);
@@ -58085,8 +58139,7 @@ var ParallAgentGateway = class {
58085
58139
  }
58086
58140
  throw err;
58087
58141
  } finally {
58088
- if (deadlineTimer)
58089
- clearTimeout(deadlineTimer);
58142
+ dispatchDeadline.dispose();
58090
58143
  const metricsSnapshot = getDispatchMetrics(sessionKey);
58091
58144
  const durationMs = metricsSnapshot ? Date.now() - metricsSnapshot.started_at : 0;
58092
58145
  const effectiveOutcome = turnOutcomeEvent?.outcome ?? (dispatchError || sawErrorEvent ? "runtime_crash" : "ok");
@@ -61822,8 +61875,10 @@ async function* parseClaudeStreamJson(readable) {
61822
61875
  yield { type: "assistant_error", message: message2 };
61823
61876
  continue;
61824
61877
  }
61825
- if (asTrimmedString(eventRecord.parent_tool_use_id))
61878
+ if (asTrimmedString(eventRecord.parent_tool_use_id)) {
61879
+ yield { type: "runtime_activity" };
61826
61880
  continue;
61881
+ }
61827
61882
  const message = eventRecord.message;
61828
61883
  const content = message && typeof message === "object" ? message.content : void 0;
61829
61884
  if (!Array.isArray(content))
@@ -61868,8 +61923,10 @@ async function* parseClaudeStreamJson(readable) {
61868
61923
  continue;
61869
61924
  }
61870
61925
  if (eventRecord.type === "user") {
61871
- if (asTrimmedString(eventRecord.parent_tool_use_id))
61926
+ if (asTrimmedString(eventRecord.parent_tool_use_id)) {
61927
+ yield { type: "runtime_activity" };
61872
61928
  continue;
61929
+ }
61873
61930
  const message = eventRecord.message;
61874
61931
  const content = message && typeof message === "object" ? message.content : void 0;
61875
61932
  if (!Array.isArray(content))
@@ -62232,7 +62289,7 @@ var ClaudeCodeAdapter = class {
62232
62289
  return false;
62233
62290
  return state.inputs.hasPendingInjections();
62234
62291
  }
62235
- async *dispatch({ event, bodyForAgent, sessionKey, context: context2, inputLifecycle }) {
62292
+ async *dispatch({ event, bodyForAgent, sessionKey, context: context2, inputLifecycle, noteActivity }) {
62236
62293
  const deliveryKey = inputLifecycle?.deliveryKey ?? event.dispatchEventId ?? event.messageId;
62237
62294
  const existingState = this.processes.get(sessionKey);
62238
62295
  const injected = existingState?.inputs.getByKey(deliveryKey);
@@ -62243,7 +62300,7 @@ var ClaudeCodeAdapter = class {
62243
62300
  injected.drained = true;
62244
62301
  context2.log?.info?.(`consuming steer input ${injected.commandUuid}`);
62245
62302
  try {
62246
- yield* this.consumeDelivery(sessionKey, existingState, injected, context2.log);
62303
+ yield* this.consumeDelivery(sessionKey, existingState, injected, context2.log, noteActivity);
62247
62304
  } finally {
62248
62305
  existingState.inputs.remove(injected);
62249
62306
  }
@@ -62273,7 +62330,7 @@ var ClaudeCodeAdapter = class {
62273
62330
  context2.log?.warn?.(`failed to prepare local attachments: ${String(err)}`);
62274
62331
  }
62275
62332
  try {
62276
- yield* this.runTurn(sessionKey, promptBody, deliveryKey, inputLifecycle, context2.log);
62333
+ yield* this.runTurn(sessionKey, promptBody, deliveryKey, inputLifecycle, context2.log, noteActivity);
62277
62334
  } finally {
62278
62335
  releasePreparedAttachments();
62279
62336
  }
@@ -62314,7 +62371,7 @@ var ClaudeCodeAdapter = class {
62314
62371
  this.resetProcesses();
62315
62372
  await this.opts.sessionManager.shutdownAll();
62316
62373
  }
62317
- async *runTurn(sessionKey, promptBody, deliveryKey, lifecycle, log2) {
62374
+ async *runTurn(sessionKey, promptBody, deliveryKey, lifecycle, log2, noteActivity) {
62318
62375
  let state;
62319
62376
  try {
62320
62377
  await this.ensureRuntimeCapability(log2);
@@ -62339,7 +62396,7 @@ var ClaudeCodeAdapter = class {
62339
62396
  return;
62340
62397
  }
62341
62398
  try {
62342
- yield* this.consumeDelivery(sessionKey, state, delivery, log2);
62399
+ yield* this.consumeDelivery(sessionKey, state, delivery, log2, noteActivity);
62343
62400
  } finally {
62344
62401
  state.inputs.remove(delivery);
62345
62402
  }
@@ -62404,7 +62461,7 @@ var ClaudeCodeAdapter = class {
62404
62461
  * finish while this drain is active; their callbacks advance independently
62405
62462
  * and their later bookkeeping dispatch becomes a no-op.
62406
62463
  */
62407
- async *consumeDelivery(sessionKey, state, target, log2) {
62464
+ async *consumeDelivery(sessionKey, state, target, log2, noteActivity) {
62408
62465
  if (target.terminal)
62409
62466
  return;
62410
62467
  const groupKey = randomUUID3();
@@ -62435,6 +62492,9 @@ var ClaudeCodeAdapter = class {
62435
62492
  return;
62436
62493
  }
62437
62494
  const parsed = next.value;
62495
+ noteActivity?.();
62496
+ if (parsed.type === "runtime_activity")
62497
+ continue;
62438
62498
  if (parsed.type === "runtime_init") {
62439
62499
  state.capabilities = new Set(parsed.capabilities);
62440
62500
  if (parsed.sessionId) {
@@ -55885,6 +55885,56 @@ async function consumeMessageWorkItem(host, item) {
55885
55885
  }
55886
55886
  }
55887
55887
 
55888
+ // ts/agent-core/dist/dispatch-inactivity-deadline.js
55889
+ var DispatchInactivityDeadline = class {
55890
+ timeoutMs;
55891
+ onExpire;
55892
+ onDispose;
55893
+ timer = null;
55894
+ expired = false;
55895
+ disposed = false;
55896
+ constructor(timeoutMs, onExpire, onDispose) {
55897
+ this.timeoutMs = timeoutMs;
55898
+ this.onExpire = onExpire;
55899
+ this.onDispose = onDispose;
55900
+ }
55901
+ touch = () => {
55902
+ if (this.timeoutMs <= 0 || this.expired || this.disposed)
55903
+ return;
55904
+ if (this.timer)
55905
+ clearTimeout(this.timer);
55906
+ this.timer = setTimeout(() => {
55907
+ this.timer = null;
55908
+ this.expired = true;
55909
+ this.onExpire();
55910
+ }, this.timeoutMs);
55911
+ };
55912
+ dispose() {
55913
+ if (this.disposed)
55914
+ return;
55915
+ this.disposed = true;
55916
+ if (this.timer)
55917
+ clearTimeout(this.timer);
55918
+ this.timer = null;
55919
+ this.onDispose();
55920
+ }
55921
+ };
55922
+ var DispatchInactivityDeadlines = class {
55923
+ active = /* @__PURE__ */ new Map();
55924
+ start(sessionKey, timeoutMs, onExpire) {
55925
+ const deadline = new DispatchInactivityDeadline(timeoutMs, onExpire, () => {
55926
+ if (this.active.get(sessionKey) === deadline)
55927
+ this.active.delete(sessionKey);
55928
+ });
55929
+ this.active.set(sessionKey, deadline);
55930
+ deadline.touch();
55931
+ return deadline;
55932
+ }
55933
+ touch(sessionKey) {
55934
+ this.active.get(sessionKey)?.touch();
55935
+ }
55936
+ };
55937
+
55888
55938
  // ts/agent-core/dist/routing.js
55889
55939
  var MAX_CONCURRENT_FORKS = 20;
55890
55940
  var defaultRoutingStrategy = (event, state) => {
@@ -57430,6 +57480,7 @@ var ParallAgentGateway = class {
57430
57480
  * an unrelated stalled fork's lane leased forever).
57431
57481
  */
57432
57482
  sessionActiveLanes = /* @__PURE__ */ new Map();
57483
+ dispatchInactivityDeadlines = new DispatchInactivityDeadlines();
57433
57484
  noteSessionLane(sessionKey, laneKey) {
57434
57485
  if (laneKey == null)
57435
57486
  this.sessionActiveLanes.delete(sessionKey);
@@ -57439,11 +57490,12 @@ var ParallAgentGateway = class {
57439
57490
  /**
57440
57491
  * External runtime-activity signal for adapters whose tool activity does
57441
57492
  * not flow through the RuntimeEvent stream (openclaw hooks call this from
57442
- * the tool-call lifecycle): renews the session's OWN active ledger lane so
57443
- * a long tool call cannot outlive the lease and get dethroned mid-turn.
57444
- * No-op without an active ledger lane for the session.
57493
+ * the tool-call lifecycle): refreshes the dispatch inactivity deadline and
57494
+ * renews the session's OWN active ledger lane, when present, so a long tool
57495
+ * call cannot time out or get dethroned mid-turn.
57445
57496
  */
57446
57497
  touchRuntimeActivity(sessionKey) {
57498
+ this.dispatchInactivityDeadlines.touch(sessionKey);
57447
57499
  if (this.ledgerDisabled)
57448
57500
  return;
57449
57501
  const laneKey = this.sessionActiveLanes.get(sessionKey);
@@ -57919,14 +57971,14 @@ var ParallAgentGateway = class {
57919
57971
  this.writeContextFile(laneContextFilePath2, contextBody);
57920
57972
  }
57921
57973
  this.inFlightDispatches++;
57922
- const deadlineTimer = this.DISPATCH_DEADLINE_MS > 0 ? setTimeout(() => {
57923
- this.opts.log?.warn(`dispatch deadline exceeded (${this.DISPATCH_DEADLINE_MS}ms) for ${event.messageId} on ${sessionKey}; aborting`);
57974
+ const dispatchDeadline = this.dispatchInactivityDeadlines.start(sessionKey, this.DISPATCH_DEADLINE_MS, () => {
57975
+ this.opts.log?.warn(`dispatch inactivity deadline exceeded (${this.DISPATCH_DEADLINE_MS}ms) for ${event.messageId} on ${sessionKey}; aborting`);
57924
57976
  try {
57925
57977
  this.opts.dispatchAdapter.abortDispatch?.(sessionKey);
57926
57978
  } catch (err) {
57927
57979
  this.opts.log?.warn(`abortDispatch threw for ${sessionKey}: ${String(err)}`);
57928
57980
  }
57929
- }, this.DISPATCH_DEADLINE_MS) : null;
57981
+ });
57930
57982
  let binding = this.sessionBindings.get(sessionKey);
57931
57983
  let inputStepsCreated = false;
57932
57984
  let turnHandle;
@@ -57947,8 +57999,10 @@ var ParallAgentGateway = class {
57947
57999
  bodyForAgent,
57948
58000
  sessionKey,
57949
58001
  context: dispatchContext,
57950
- inputLifecycle
58002
+ inputLifecycle,
58003
+ noteActivity: dispatchDeadline.touch
57951
58004
  })) {
58005
+ dispatchDeadline.touch();
57952
58006
  if (runtimeEvent.type === "runtime_session") {
57953
58007
  const priorAgentSessionId = binding?.agentSessionId;
57954
58008
  binding = await this.bindRuntimeSession(sessionKey, runtimeEvent, contextFilePath, laneContextFilePath2);
@@ -58085,8 +58139,7 @@ var ParallAgentGateway = class {
58085
58139
  }
58086
58140
  throw err;
58087
58141
  } finally {
58088
- if (deadlineTimer)
58089
- clearTimeout(deadlineTimer);
58142
+ dispatchDeadline.dispose();
58090
58143
  const metricsSnapshot = getDispatchMetrics(sessionKey);
58091
58144
  const durationMs = metricsSnapshot ? Date.now() - metricsSnapshot.started_at : 0;
58092
58145
  const effectiveOutcome = turnOutcomeEvent?.outcome ?? (dispatchError || sawErrorEvent ? "runtime_crash" : "ok");
@@ -62457,10 +62510,17 @@ function formatCommand(command) {
62457
62510
 
62458
62511
  // ts/codex-agent/dist/turn-sink.js
62459
62512
  var TurnSink = class {
62513
+ noteActivity;
62460
62514
  mapper = new EventMapper();
62461
62515
  queue = [];
62462
62516
  resolver = null;
62463
62517
  closed = false;
62518
+ constructor(noteActivity) {
62519
+ this.noteActivity = noteActivity;
62520
+ }
62521
+ touchActivity() {
62522
+ this.noteActivity?.();
62523
+ }
62464
62524
  push(envelope) {
62465
62525
  if (this.closed)
62466
62526
  return;
@@ -62611,13 +62671,13 @@ var CodexAppServerAdapter = class {
62611
62671
  if (turnId && this.client && !this.client.isDisposed()) {
62612
62672
  this.client.sendRequest("turn/interrupt", { threadId, turnId }).catch((err) => this.opts.log?.warn?.(`turn/interrupt failed: ${errToString2(err)}`));
62613
62673
  }
62614
- sink.push({ kind: "error", message: "dispatch deadline exceeded" });
62674
+ sink.push({ kind: "error", message: "dispatch inactivity deadline exceeded" });
62615
62675
  sink.close();
62616
62676
  }
62617
62677
  hasPendingInjections(sessionKey) {
62618
62678
  return (this.pendingInjections.get(sessionKey) ?? 0) > 0;
62619
62679
  }
62620
- async *dispatch({ event, bodyForAgent, sessionKey, context: context2 }) {
62680
+ async *dispatch({ event, bodyForAgent, sessionKey, context: context2, noteActivity }) {
62621
62681
  const pending = this.pendingInjections.get(sessionKey) ?? 0;
62622
62682
  if (pending > 0) {
62623
62683
  this.pendingInjections.delete(sessionKey);
@@ -62683,7 +62743,7 @@ var CodexAppServerAdapter = class {
62683
62743
  }
62684
62744
  break;
62685
62745
  }
62686
- const sink = new TurnSink();
62746
+ const sink = new TurnSink(noteActivity);
62687
62747
  this.setActiveTurn(threadId, sink, log2);
62688
62748
  const groupKey = randomUUID2();
62689
62749
  let sawTurnEnd = false;
@@ -63197,6 +63257,7 @@ var CodexAppServerAdapter = class {
63197
63257
  }
63198
63258
  return;
63199
63259
  }
63260
+ sink.touchActivity();
63200
63261
  for (const event of sink.mapper.map(method, params)) {
63201
63262
  sink.push({ kind: "runtime", event });
63202
63263
  }
@@ -3657,6 +3657,13 @@ var init_gateway_lane_flow = __esm({
3657
3657
  }
3658
3658
  });
3659
3659
 
3660
+ // ts/agent-core/dist/dispatch-inactivity-deadline.js
3661
+ var init_dispatch_inactivity_deadline = __esm({
3662
+ "ts/agent-core/dist/dispatch-inactivity-deadline.js"() {
3663
+ "use strict";
3664
+ }
3665
+ });
3666
+
3660
3667
  // ts/agent-core/dist/routing.js
3661
3668
  var init_routing = __esm({
3662
3669
  "ts/agent-core/dist/routing.js"() {
@@ -30263,6 +30270,7 @@ var init_gateway_base = __esm({
30263
30270
  init_dispatch_adapter();
30264
30271
  init_gateway_lane_flow();
30265
30272
  init_lane_ledger();
30273
+ init_dispatch_inactivity_deadline();
30266
30274
  init_routing();
30267
30275
  init_redact();
30268
30276
  init_step_persister();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/daemon",
3
- "version": "1.55.1",
3
+ "version": "1.55.2",
4
4
  "description": "Parall local agent runtime — daemon supervisor + bridge runtimes, bundled as standalone JS files",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,11 +33,11 @@
33
33
  "@aws-sdk/client-s3": "3.984.0",
34
34
  "@pinixai/bb-browser-pro": "0.15.0",
35
35
  "ws": "^8.18.0",
36
- "@parall/sdk": "1.55.1",
37
- "@parall/claude-agent": "1.55.1",
38
- "@parall/codex-agent": "1.55.1",
39
- "@parall/openclaw-agent": "1.55.1",
40
- "@parall/agent-core": "1.55.1"
36
+ "@parall/agent-core": "1.55.2",
37
+ "@parall/claude-agent": "1.55.2",
38
+ "@parall/openclaw-agent": "1.55.2",
39
+ "@parall/sdk": "1.55.2",
40
+ "@parall/codex-agent": "1.55.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^22.0.0",