@okxweb3/a2a-node 0.2.8 → 0.2.9-beta-cb068eb2d0-260824220115

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.
Files changed (3) hide show
  1. package/dist/cli.js +115 -26
  2. package/dist/index.js +114 -23
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -19931,6 +19931,7 @@ var init_events = __esm({
19931
19931
  AGENT_CLIENT_REMOVED: "Agent client removed",
19932
19932
  AGENT_STREAM_RECOVERED: "Agent stream recovered",
19933
19933
  AGENT_STREAM_RECOVERY_REPLAY_COMPLETED: "Agent stream recovery replay completed",
19934
+ AGENT_STREAM_RECOVERY_REPLAY_TERMINATED: "Agent stream recovery replay terminated",
19934
19935
  ADDRESS_SYNC_COMPLETED: "Address sync completed",
19935
19936
  AGENT_REFRESH_SESSION_EXPIRED: "Agent refresh aborted: onchainos session expired, local clients taken offline",
19936
19937
  OFFLINE_REPLAY_MESSAGE_REPLAYED: "Offline replay message replayed",
@@ -20846,6 +20847,7 @@ var init_sentry_logger = __esm({
20846
20847
  LogEvent.AGENT_STREAM_ERROR,
20847
20848
  LogEvent.AGENT_STREAM_RECOVERED,
20848
20849
  LogEvent.AGENT_STREAM_RECOVERY_REPLAY_COMPLETED,
20850
+ LogEvent.AGENT_STREAM_RECOVERY_REPLAY_TERMINATED,
20849
20851
  LogEvent.ADDRESS_SYNC_COMPLETED,
20850
20852
  LogEvent.AGENTS_REFRESHED,
20851
20853
  LogEvent.AGENTS_WAKEUP_NOTIFIED,
@@ -26932,7 +26934,7 @@ function buildConnectParams(config, instanceId, protocolVersion) {
26932
26934
  client: {
26933
26935
  id: "gateway-client",
26934
26936
  displayName: "okx-a2a-node",
26935
- version: "0.2.8",
26937
+ version: "0.2.9-beta-cb068eb2d0-260824220115",
26936
26938
  platform: "node",
26937
26939
  mode: "backend",
26938
26940
  instanceId
@@ -26943,7 +26945,7 @@ function buildConnectParams(config, instanceId, protocolVersion) {
26943
26945
  commands: [],
26944
26946
  permissions: {},
26945
26947
  locale: Intl.DateTimeFormat().resolvedOptions().locale || "en-US",
26946
- userAgent: `okx-a2a-node/${"0.2.8"}`,
26948
+ userAgent: `okx-a2a-node/${"0.2.9-beta-cb068eb2d0-260824220115"}`,
26947
26949
  auth: {
26948
26950
  ...config.token ? { token: config.token } : {},
26949
26951
  ...config.password ? { password: config.password } : {}
@@ -28910,7 +28912,7 @@ var init_sentry_config = __esm({
28910
28912
  environment = process.env.SENTRY_ENV === "dev" ? "dev" : "prod";
28911
28913
  SENTRY_CONFIG = {
28912
28914
  projectName: "okx/openclaw-okx-a2a-extension",
28913
- release: "0.2.8",
28915
+ release: "0.2.9-beta-cb068eb2d0-260824220115",
28914
28916
  environment,
28915
28917
  runtimeContainer: normalizeRuntimeContainer(process.env.OKX_A2A_RUNTIME_CONTAINER)
28916
28918
  };
@@ -40080,7 +40082,7 @@ async function exportDiagnosticLogs(options) {
40080
40082
  node: process.version,
40081
40083
  platform: process.platform,
40082
40084
  arch: process.arch,
40083
- packageVersion: true ? "0.2.8" : "unknown",
40085
+ packageVersion: true ? "0.2.9-beta-cb068eb2d0-260824220115" : "unknown",
40084
40086
  sensitiveContentIncluded: options.includeSensitiveContent,
40085
40087
  listenerAndLlmContentIncluded: true,
40086
40088
  credentialsAlwaysRedacted: true,
@@ -57126,6 +57128,12 @@ function replayScanBackoffMs(consecutiveFailures) {
57126
57128
  REPLAY_SCAN_MAX_BACKOFF_MS
57127
57129
  );
57128
57130
  }
57131
+ function replayScanBackoffWithJitterMs(consecutiveFailures, randomValue = Math.random()) {
57132
+ const baseMs = replayScanBackoffMs(consecutiveFailures);
57133
+ const boundedRandom = Math.min(1, Math.max(0, randomValue));
57134
+ const jitteredMs = Math.round(baseMs * (0.9 + boundedRandom * 0.2));
57135
+ return Math.min(REPLAY_SCAN_MAX_BACKOFF_MS, jitteredMs);
57136
+ }
57129
57137
  function isOfflineReplayForTrigger(trigger) {
57130
57138
  return trigger === "startup";
57131
57139
  }
@@ -57312,6 +57320,7 @@ var init_xmtp_sdk = __esm({
57312
57320
  replayScanFailuresByAddress = /* @__PURE__ */ new Map();
57313
57321
  replayScanRetryByAddress = /* @__PURE__ */ new Map();
57314
57322
  replayScanNowMs = () => Date.now();
57323
+ replayScanRandom = () => Math.random();
57315
57324
  replayScanSetTimeout = (callback, delayMs) => setTimeout(callback, delayMs);
57316
57325
  replayScanClearTimeout = (timer) => clearTimeout(timer);
57317
57326
  inboundReplayGates = /* @__PURE__ */ new Map();
@@ -57798,7 +57807,7 @@ var init_xmtp_sdk = __esm({
57798
57807
  this.clients.delete(address);
57799
57808
  this.inboundReplayGates.delete(address.toLowerCase());
57800
57809
  this.replayScanFailuresByAddress.delete(address.toLowerCase());
57801
- this.clearReplayScanRetry(address);
57810
+ this.clearReplayScanRetry(address, "client_removed");
57802
57811
  logger.info(LogEvent.AGENT_CLIENT_REMOVED, {
57803
57812
  ...agentExtras({
57804
57813
  walletAddress: address,
@@ -58014,7 +58023,7 @@ var init_xmtp_sdk = __esm({
58014
58023
  this.clients.delete(address);
58015
58024
  this.inboundReplayGates.delete(addressKey);
58016
58025
  this.replayScanFailuresByAddress.delete(addressKey);
58017
- this.clearReplayScanRetry(address);
58026
+ this.clearReplayScanRetry(address, "client_recycled");
58018
58027
  logWithTimestamp(
58019
58028
  `[xmtp-sdk] recycle: stopped client: ${address} (agentId=${agentInfo.agentId})`
58020
58029
  );
@@ -58564,7 +58573,23 @@ var init_xmtp_sdk = __esm({
58564
58573
  this.clientGenerationByClient.set(client, generation);
58565
58574
  return generation;
58566
58575
  }
58567
- clearReplayScanRetry(address) {
58576
+ logStreamRecoveryReplayTerminal(address, clientGeneration, recoveryIdentities, terminalReason) {
58577
+ for (const recoverySequence of recoveryIdentities) {
58578
+ logger.info(LogEvent.AGENT_STREAM_RECOVERY_REPLAY_TERMINATED, {
58579
+ ...agentExtras({
58580
+ walletAddress: address,
58581
+ onchainosAgentId: this.getAgentByAddress(address)?.agentId,
58582
+ role: this.getAgentByAddress(address)?.role
58583
+ }),
58584
+ clientGeneration: String(clientGeneration),
58585
+ recoverySequence,
58586
+ outcome: "terminal",
58587
+ replayOutcome: "terminated",
58588
+ terminalReason
58589
+ });
58590
+ }
58591
+ }
58592
+ clearReplayScanRetry(address, terminalReason) {
58568
58593
  const addressKey = address.toLowerCase();
58569
58594
  const scheduled = this.replayScanRetryByAddress.get(addressKey);
58570
58595
  if (!scheduled) {
@@ -58572,15 +58597,31 @@ var init_xmtp_sdk = __esm({
58572
58597
  }
58573
58598
  this.replayScanRetryByAddress.delete(addressKey);
58574
58599
  this.replayScanClearTimeout(scheduled.timer);
58600
+ if (terminalReason) {
58601
+ this.logStreamRecoveryReplayTerminal(
58602
+ address,
58603
+ scheduled.clientGeneration,
58604
+ scheduled.recoveryIdentities,
58605
+ terminalReason
58606
+ );
58607
+ }
58575
58608
  }
58576
- scheduleReplayScanRetry(address, expectedClient, clientGeneration, retryTrigger, delayMs) {
58609
+ scheduleReplayScanRetry(address, expectedClient, clientGeneration, retryTrigger, delayMs, recoveryIdentities = []) {
58577
58610
  const addressKey = address.toLowerCase();
58578
58611
  const scheduled = this.replayScanRetryByAddress.get(addressKey);
58579
58612
  if (scheduled?.clientGeneration === clientGeneration) {
58613
+ if (retryTrigger === "stream_recovery") {
58614
+ scheduled.retryTrigger = retryTrigger;
58615
+ for (const recoveryIdentity of recoveryIdentities) {
58616
+ if (!scheduled.recoveryIdentities.includes(recoveryIdentity)) {
58617
+ scheduled.recoveryIdentities.push(recoveryIdentity);
58618
+ }
58619
+ }
58620
+ }
58580
58621
  return;
58581
58622
  }
58582
58623
  if (scheduled) {
58583
- this.clearReplayScanRetry(address);
58624
+ this.clearReplayScanRetry(address, "client_replaced");
58584
58625
  }
58585
58626
  const timer = this.replayScanSetTimeout(() => {
58586
58627
  const current = this.replayScanRetryByAddress.get(addressKey);
@@ -58589,12 +58630,18 @@ var init_xmtp_sdk = __esm({
58589
58630
  }
58590
58631
  this.replayScanRetryByAddress.delete(addressKey);
58591
58632
  if (this.clients.get(address) !== expectedClient || this.stoppedAddresses.has(addressKey)) {
58633
+ this.logStreamRecoveryReplayTerminal(
58634
+ address,
58635
+ current.clientGeneration,
58636
+ current.recoveryIdentities,
58637
+ this.stoppedAddresses.has(addressKey) ? "client_stopped" : "client_replaced"
58638
+ );
58592
58639
  return;
58593
58640
  }
58594
58641
  void this.replayOfflineMessagesForAddressSingleFlight(
58595
58642
  address,
58596
- retryTrigger,
58597
- void 0,
58643
+ current.retryTrigger,
58644
+ current.recoveryIdentities.at(-1),
58598
58645
  expectedClient
58599
58646
  ).catch((err2) => {
58600
58647
  logWithTimestamp(
@@ -58615,6 +58662,8 @@ var init_xmtp_sdk = __esm({
58615
58662
  timer.unref?.();
58616
58663
  this.replayScanRetryByAddress.set(addressKey, {
58617
58664
  clientGeneration,
58665
+ retryTrigger,
58666
+ recoveryIdentities: retryTrigger === "stream_recovery" ? [...new Set(recoveryIdentities)] : [],
58618
58667
  timer
58619
58668
  });
58620
58669
  }
@@ -58901,7 +58950,7 @@ var init_xmtp_sdk = __esm({
58901
58950
  String(recovery.recoverySequence),
58902
58951
  agent
58903
58952
  );
58904
- if (summary.outcome === "completed" && !recoveryDisposed && this.clients.get(address) === agent) {
58953
+ if (summary.outcome === "completed" && summary.consecutiveFailures === void 0 && !recoveryDisposed && this.clients.get(address) === agent) {
58905
58954
  logger.info(LogEvent.AGENT_STREAM_RECOVERY_REPLAY_COMPLETED, {
58906
58955
  ...agentExtras(identity),
58907
58956
  clientGeneration: String(clientGeneration),
@@ -58998,10 +59047,16 @@ var init_xmtp_sdk = __esm({
58998
59047
  let priorFailure = this.replayScanFailuresByAddress.get(addressKey);
58999
59048
  if (priorFailure && priorFailure.clientGeneration !== clientGeneration) {
59000
59049
  this.replayScanFailuresByAddress.delete(addressKey);
59001
- this.clearReplayScanRetry(address);
59050
+ this.clearReplayScanRetry(address, "client_replaced");
59002
59051
  priorFailure = void 0;
59003
59052
  }
59004
59053
  if (priorFailure && attemptNowMs < priorFailure.nextAttemptAtMs) {
59054
+ if (trigger === "stream_recovery") {
59055
+ priorFailure.retryTrigger = trigger;
59056
+ if (recoveryIdentity && !priorFailure.recoveryIdentities.includes(recoveryIdentity)) {
59057
+ priorFailure.recoveryIdentities.push(recoveryIdentity);
59058
+ }
59059
+ }
59005
59060
  priorFailure.suppressedAttempts++;
59006
59061
  summary.outcome = "suppressed_backoff";
59007
59062
  summary.failureStage = priorFailure.lastFailureStage;
@@ -59018,7 +59073,8 @@ var init_xmtp_sdk = __esm({
59018
59073
  agent,
59019
59074
  clientGeneration,
59020
59075
  priorFailure.retryTrigger,
59021
- summary.backoffMs
59076
+ summary.backoffMs,
59077
+ priorFailure.recoveryIdentities
59022
59078
  );
59023
59079
  summary.durationMs = Date.now() - addressReplayStartedAt;
59024
59080
  return summary;
@@ -59031,15 +59087,23 @@ var init_xmtp_sdk = __esm({
59031
59087
  const recordScanFailure = (stage, err2) => {
59032
59088
  const previous = this.replayScanFailuresByAddress.get(addressKey);
59033
59089
  const consecutiveFailures = (previous?.consecutiveFailures ?? 0) + 1;
59034
- const backoffMs = replayScanBackoffMs(consecutiveFailures);
59090
+ const backoffMs = replayScanBackoffWithJitterMs(
59091
+ consecutiveFailures,
59092
+ this.replayScanRandom()
59093
+ );
59035
59094
  const suppressedAttempts = previous?.suppressedAttempts ?? 0;
59036
59095
  const failureNowMs = this.replayScanNowMs();
59037
- const retryTrigger = isOfflineReplayForTrigger(trigger) ? "startup" : "periodic_repair";
59096
+ const recoveryIdentities = [...previous?.recoveryIdentities ?? []];
59097
+ if (trigger === "stream_recovery" && recoveryIdentity && !recoveryIdentities.includes(recoveryIdentity)) {
59098
+ recoveryIdentities.push(recoveryIdentity);
59099
+ }
59100
+ const retryTrigger = trigger === "stream_recovery" ? trigger : previous?.retryTrigger ?? trigger;
59038
59101
  this.replayScanFailuresByAddress.set(addressKey, {
59039
59102
  clientGeneration,
59040
59103
  consecutiveFailures,
59041
59104
  nextAttemptAtMs: failureNowMs + backoffMs,
59042
59105
  retryTrigger,
59106
+ recoveryIdentities,
59043
59107
  suppressedAttempts: 0,
59044
59108
  lastFailureStage: stage
59045
59109
  });
@@ -59048,7 +59112,8 @@ var init_xmtp_sdk = __esm({
59048
59112
  agent,
59049
59113
  clientGeneration,
59050
59114
  retryTrigger,
59051
- backoffMs
59115
+ backoffMs,
59116
+ recoveryIdentities
59052
59117
  );
59053
59118
  summary.outcome = stage === "syncAll" ? "sync_failed" : "list_failed";
59054
59119
  summary.failureStage = stage;
@@ -59245,6 +59310,30 @@ var init_xmtp_sdk = __esm({
59245
59310
  recoveredAfterFailures: String(recoveredFailure?.consecutiveFailures ?? 0),
59246
59311
  suppressedAttempts: String(recoveredFailure?.suppressedAttempts ?? 0)
59247
59312
  });
59313
+ if (recoveredFailure) {
59314
+ for (const recoverySequence of recoveredFailure.recoveryIdentities) {
59315
+ logger.info(LogEvent.AGENT_STREAM_RECOVERY_REPLAY_COMPLETED, {
59316
+ ...agentExtras({
59317
+ walletAddress: address,
59318
+ inboxId: agent.client?.inboxId,
59319
+ onchainosAgentId: this.getAgentByAddress(address)?.agentId,
59320
+ role: this.getAgentByAddress(address)?.role
59321
+ }),
59322
+ clientGeneration: String(clientGeneration),
59323
+ recoverySequence,
59324
+ replayed: String(summary.replayed),
59325
+ skipped: String(summary.skipped),
59326
+ conversationCount: String(summary.conversations),
59327
+ replayDurationMs: String(Date.now() - addressReplayStartedAt),
59328
+ outcome: "success",
59329
+ replayOutcome: "completed",
59330
+ recoveredAfterFailures: String(
59331
+ recoveredFailure.consecutiveFailures
59332
+ ),
59333
+ suppressedAttempts: String(recoveredFailure.suppressedAttempts)
59334
+ });
59335
+ }
59336
+ }
59248
59337
  summary.outcome = "completed";
59249
59338
  summary.consecutiveFailures = recoveredFailure?.consecutiveFailures;
59250
59339
  summary.suppressedAttempts = recoveredFailure?.suppressedAttempts;
@@ -68079,12 +68168,12 @@ async function runListenerWithLock(options, paths) {
68079
68168
  });
68080
68169
  }
68081
68170
  });
68082
- service.setPluginVersion("0.2.8");
68171
+ service.setPluginVersion("0.2.9-beta-cb068eb2d0-260824220115");
68083
68172
  await service.init();
68084
68173
  const pluginVersionStatus = service.pluginVersionStatus;
68085
68174
  if (pluginVersionStatus.unavailable) {
68086
68175
  throw new Error(
68087
- `@okxweb3/a2a-node v${"0.2.8"} is below the required minimum v${pluginVersionStatus.minVersion}`
68176
+ `@okxweb3/a2a-node v${"0.2.9-beta-cb068eb2d0-260824220115"} is below the required minimum v${pluginVersionStatus.minVersion}`
68088
68177
  );
68089
68178
  }
68090
68179
  const systemConfig = service.getSystemConfig();
@@ -68112,7 +68201,7 @@ async function runListenerWithLock(options, paths) {
68112
68201
  onchainosAgentId: "*",
68113
68202
  reason: "system-config missing sentryDsn",
68114
68203
  pluginId: "@okxweb3/a2a-node",
68115
- pluginVersion: "0.2.8"
68204
+ pluginVersion: "0.2.9-beta-cb068eb2d0-260824220115"
68116
68205
  });
68117
68206
  }
68118
68207
  logWithTimestamp(
@@ -116519,7 +116608,7 @@ async function getCurrentNodeCliVersion() {
116519
116608
  return await getGlobalNpmPackageVersion(UPDATE_PACKAGES.node) ?? getBundledNodeCliVersion();
116520
116609
  }
116521
116610
  function getBundledNodeCliVersion() {
116522
- return true ? "0.2.8" : null;
116611
+ return true ? "0.2.9-beta-cb068eb2d0-260824220115" : null;
116523
116612
  }
116524
116613
  function readConfiguredAiProvider() {
116525
116614
  const explicit = process.env.OKX_A2A_AI_PROVIDER || process.env.OKX_AGENT_TASK_AI_CLI;
@@ -116729,7 +116818,7 @@ async function updateHermes(release, options) {
116729
116818
  }
116730
116819
  }
116731
116820
  async function installGatewayPluginForDoctor(target) {
116732
- const release = isPrereleaseVersion("0.2.8") ? "beta" : "latest";
116821
+ const release = isPrereleaseVersion("0.2.9-beta-cb068eb2d0-260824220115") ? "beta" : "latest";
116733
116822
  const insideTargetGateway = detectGatewayInvocation() === target;
116734
116823
  const options = {
116735
116824
  restart: !insideTargetGateway,
@@ -117782,7 +117871,7 @@ async function runDoctor(options = {}) {
117782
117871
  platform: options.platform ?? process.platform,
117783
117872
  env: options.env ?? process.env,
117784
117873
  target: options.target ?? resolveDoctorTarget(options.env ?? process.env),
117785
- cliVersion: options.cliVersion ?? (true ? "0.2.8" : "0.0.0"),
117874
+ cliVersion: options.cliVersion ?? (true ? "0.2.9-beta-cb068eb2d0-260824220115" : "0.0.0"),
117786
117875
  fixMode: options.fix === true,
117787
117876
  nonInteractive: options.nonInteractive === true,
117788
117877
  packageChanged: false,
@@ -118810,7 +118899,7 @@ init_sentry_config();
118810
118899
  init_runtime_metadata();
118811
118900
  var CURRENT_GATEWAY_SESSION_KEYS_ENV4 = "OKX_A2A_CURRENT_GATEWAY_SESSION_KEYS";
118812
118901
  function printUsage3() {
118813
- console.log(`okx-a2a ${"0.2.8"}
118902
+ console.log(`okx-a2a ${"0.2.9-beta-cb068eb2d0-260824220115"}
118814
118903
 
118815
118904
  Usage:
118816
118905
  okx-a2a <command> [options]
@@ -118850,7 +118939,7 @@ Run \`okx-a2a <command> -h\` for command-specific help.
118850
118939
  `);
118851
118940
  }
118852
118941
  function printVersion() {
118853
- console.log("0.2.8");
118942
+ console.log("0.2.9-beta-cb068eb2d0-260824220115");
118854
118943
  }
118855
118944
  function printDaemonUsage() {
118856
118945
  console.log(`Usage: okx-a2a daemon <start|restart|stop|status|autostart> [options]
@@ -120331,7 +120420,7 @@ async function main() {
120331
120420
  if (command === "xmtp-test") {
120332
120421
  const { handleXmtpTestCommand: handleXmtpTestCommand2 } = await Promise.resolve().then(() => (init_xmtp_test_cli(), xmtp_test_cli_exports));
120333
120422
  await handleXmtpTestCommand2(process.argv.slice(3), {
120334
- packageVersion: "0.2.8",
120423
+ packageVersion: "0.2.9-beta-cb068eb2d0-260824220115",
120335
120424
  agentSdkVersion: "2.3.0",
120336
120425
  nodeSdkVersion: "6.1.0",
120337
120426
  nodeBindingsVersion: "1.11.0"
package/dist/index.js CHANGED
@@ -19246,6 +19246,7 @@ var init_events = __esm({
19246
19246
  AGENT_CLIENT_REMOVED: "Agent client removed",
19247
19247
  AGENT_STREAM_RECOVERED: "Agent stream recovered",
19248
19248
  AGENT_STREAM_RECOVERY_REPLAY_COMPLETED: "Agent stream recovery replay completed",
19249
+ AGENT_STREAM_RECOVERY_REPLAY_TERMINATED: "Agent stream recovery replay terminated",
19249
19250
  ADDRESS_SYNC_COMPLETED: "Address sync completed",
19250
19251
  AGENT_REFRESH_SESSION_EXPIRED: "Agent refresh aborted: onchainos session expired, local clients taken offline",
19251
19252
  OFFLINE_REPLAY_MESSAGE_REPLAYED: "Offline replay message replayed",
@@ -20167,6 +20168,7 @@ var init_sentry_logger = __esm({
20167
20168
  LogEvent.AGENT_STREAM_ERROR,
20168
20169
  LogEvent.AGENT_STREAM_RECOVERED,
20169
20170
  LogEvent.AGENT_STREAM_RECOVERY_REPLAY_COMPLETED,
20171
+ LogEvent.AGENT_STREAM_RECOVERY_REPLAY_TERMINATED,
20170
20172
  LogEvent.ADDRESS_SYNC_COMPLETED,
20171
20173
  LogEvent.AGENTS_REFRESHED,
20172
20174
  LogEvent.AGENTS_WAKEUP_NOTIFIED,
@@ -32435,7 +32437,7 @@ var init_sentry_config = __esm({
32435
32437
  environment = process.env.SENTRY_ENV === "dev" ? "dev" : "prod";
32436
32438
  SENTRY_CONFIG = {
32437
32439
  projectName: "okx/openclaw-okx-a2a-extension",
32438
- release: "0.2.8",
32440
+ release: "0.2.9-beta-cb068eb2d0-260824220115",
32439
32441
  environment,
32440
32442
  runtimeContainer: normalizeRuntimeContainer(process.env.OKX_A2A_RUNTIME_CONTAINER)
32441
32443
  };
@@ -33376,7 +33378,7 @@ async function getCurrentNodeCliVersion() {
33376
33378
  return await getGlobalNpmPackageVersion(UPDATE_PACKAGES.node) ?? getBundledNodeCliVersion();
33377
33379
  }
33378
33380
  function getBundledNodeCliVersion() {
33379
- return true ? "0.2.8" : null;
33381
+ return true ? "0.2.9-beta-cb068eb2d0-260824220115" : null;
33380
33382
  }
33381
33383
  function readConfiguredAiProvider() {
33382
33384
  const explicit = process.env.OKX_A2A_AI_PROVIDER || process.env.OKX_AGENT_TASK_AI_CLI;
@@ -33586,7 +33588,7 @@ async function updateHermes(release, options) {
33586
33588
  }
33587
33589
  }
33588
33590
  async function installGatewayPluginForDoctor(target) {
33589
- const release = isPrereleaseVersion("0.2.8") ? "beta" : "latest";
33591
+ const release = isPrereleaseVersion("0.2.9-beta-cb068eb2d0-260824220115") ? "beta" : "latest";
33590
33592
  const insideTargetGateway = detectGatewayInvocation() === target;
33591
33593
  const options = {
33592
33594
  restart: !insideTargetGateway,
@@ -44489,6 +44491,7 @@ __export(index_exports, {
44489
44491
  releaseActiveDaemon: () => releaseActiveDaemon,
44490
44492
  removeUserAttentionWatcher: () => removeUserAttentionWatcher,
44491
44493
  replayScanBackoffMs: () => replayScanBackoffMs,
44494
+ replayScanBackoffWithJitterMs: () => replayScanBackoffWithJitterMs,
44492
44495
  reportDoctorRunToSentry: () => reportDoctorRunToSentry,
44493
44496
  reportUserNotificationFailure: () => reportUserNotificationFailure,
44494
44497
  resetMessageEligibleOfflineReplayCapabilityForTests: () => resetMessageEligibleOfflineReplayCapabilityForTests,
@@ -56907,6 +56910,12 @@ function replayScanBackoffMs(consecutiveFailures) {
56907
56910
  REPLAY_SCAN_MAX_BACKOFF_MS
56908
56911
  );
56909
56912
  }
56913
+ function replayScanBackoffWithJitterMs(consecutiveFailures, randomValue = Math.random()) {
56914
+ const baseMs = replayScanBackoffMs(consecutiveFailures);
56915
+ const boundedRandom = Math.min(1, Math.max(0, randomValue));
56916
+ const jitteredMs = Math.round(baseMs * (0.9 + boundedRandom * 0.2));
56917
+ return Math.min(REPLAY_SCAN_MAX_BACKOFF_MS, jitteredMs);
56918
+ }
56910
56919
  function isOfflineReplayForTrigger(trigger) {
56911
56920
  return trigger === "startup";
56912
56921
  }
@@ -56945,6 +56954,7 @@ var XmtpService = class _XmtpService {
56945
56954
  replayScanFailuresByAddress = /* @__PURE__ */ new Map();
56946
56955
  replayScanRetryByAddress = /* @__PURE__ */ new Map();
56947
56956
  replayScanNowMs = () => Date.now();
56957
+ replayScanRandom = () => Math.random();
56948
56958
  replayScanSetTimeout = (callback, delayMs) => setTimeout(callback, delayMs);
56949
56959
  replayScanClearTimeout = (timer) => clearTimeout(timer);
56950
56960
  inboundReplayGates = /* @__PURE__ */ new Map();
@@ -57431,7 +57441,7 @@ var XmtpService = class _XmtpService {
57431
57441
  this.clients.delete(address);
57432
57442
  this.inboundReplayGates.delete(address.toLowerCase());
57433
57443
  this.replayScanFailuresByAddress.delete(address.toLowerCase());
57434
- this.clearReplayScanRetry(address);
57444
+ this.clearReplayScanRetry(address, "client_removed");
57435
57445
  logger.info(LogEvent.AGENT_CLIENT_REMOVED, {
57436
57446
  ...agentExtras({
57437
57447
  walletAddress: address,
@@ -57647,7 +57657,7 @@ var XmtpService = class _XmtpService {
57647
57657
  this.clients.delete(address);
57648
57658
  this.inboundReplayGates.delete(addressKey);
57649
57659
  this.replayScanFailuresByAddress.delete(addressKey);
57650
- this.clearReplayScanRetry(address);
57660
+ this.clearReplayScanRetry(address, "client_recycled");
57651
57661
  logWithTimestamp(
57652
57662
  `[xmtp-sdk] recycle: stopped client: ${address} (agentId=${agentInfo.agentId})`
57653
57663
  );
@@ -58197,7 +58207,23 @@ var XmtpService = class _XmtpService {
58197
58207
  this.clientGenerationByClient.set(client, generation);
58198
58208
  return generation;
58199
58209
  }
58200
- clearReplayScanRetry(address) {
58210
+ logStreamRecoveryReplayTerminal(address, clientGeneration, recoveryIdentities, terminalReason) {
58211
+ for (const recoverySequence of recoveryIdentities) {
58212
+ logger.info(LogEvent.AGENT_STREAM_RECOVERY_REPLAY_TERMINATED, {
58213
+ ...agentExtras({
58214
+ walletAddress: address,
58215
+ onchainosAgentId: this.getAgentByAddress(address)?.agentId,
58216
+ role: this.getAgentByAddress(address)?.role
58217
+ }),
58218
+ clientGeneration: String(clientGeneration),
58219
+ recoverySequence,
58220
+ outcome: "terminal",
58221
+ replayOutcome: "terminated",
58222
+ terminalReason
58223
+ });
58224
+ }
58225
+ }
58226
+ clearReplayScanRetry(address, terminalReason) {
58201
58227
  const addressKey = address.toLowerCase();
58202
58228
  const scheduled = this.replayScanRetryByAddress.get(addressKey);
58203
58229
  if (!scheduled) {
@@ -58205,15 +58231,31 @@ var XmtpService = class _XmtpService {
58205
58231
  }
58206
58232
  this.replayScanRetryByAddress.delete(addressKey);
58207
58233
  this.replayScanClearTimeout(scheduled.timer);
58234
+ if (terminalReason) {
58235
+ this.logStreamRecoveryReplayTerminal(
58236
+ address,
58237
+ scheduled.clientGeneration,
58238
+ scheduled.recoveryIdentities,
58239
+ terminalReason
58240
+ );
58241
+ }
58208
58242
  }
58209
- scheduleReplayScanRetry(address, expectedClient, clientGeneration, retryTrigger, delayMs) {
58243
+ scheduleReplayScanRetry(address, expectedClient, clientGeneration, retryTrigger, delayMs, recoveryIdentities = []) {
58210
58244
  const addressKey = address.toLowerCase();
58211
58245
  const scheduled = this.replayScanRetryByAddress.get(addressKey);
58212
58246
  if (scheduled?.clientGeneration === clientGeneration) {
58247
+ if (retryTrigger === "stream_recovery") {
58248
+ scheduled.retryTrigger = retryTrigger;
58249
+ for (const recoveryIdentity of recoveryIdentities) {
58250
+ if (!scheduled.recoveryIdentities.includes(recoveryIdentity)) {
58251
+ scheduled.recoveryIdentities.push(recoveryIdentity);
58252
+ }
58253
+ }
58254
+ }
58213
58255
  return;
58214
58256
  }
58215
58257
  if (scheduled) {
58216
- this.clearReplayScanRetry(address);
58258
+ this.clearReplayScanRetry(address, "client_replaced");
58217
58259
  }
58218
58260
  const timer = this.replayScanSetTimeout(() => {
58219
58261
  const current = this.replayScanRetryByAddress.get(addressKey);
@@ -58222,12 +58264,18 @@ var XmtpService = class _XmtpService {
58222
58264
  }
58223
58265
  this.replayScanRetryByAddress.delete(addressKey);
58224
58266
  if (this.clients.get(address) !== expectedClient || this.stoppedAddresses.has(addressKey)) {
58267
+ this.logStreamRecoveryReplayTerminal(
58268
+ address,
58269
+ current.clientGeneration,
58270
+ current.recoveryIdentities,
58271
+ this.stoppedAddresses.has(addressKey) ? "client_stopped" : "client_replaced"
58272
+ );
58225
58273
  return;
58226
58274
  }
58227
58275
  void this.replayOfflineMessagesForAddressSingleFlight(
58228
58276
  address,
58229
- retryTrigger,
58230
- void 0,
58277
+ current.retryTrigger,
58278
+ current.recoveryIdentities.at(-1),
58231
58279
  expectedClient
58232
58280
  ).catch((err) => {
58233
58281
  logWithTimestamp(
@@ -58248,6 +58296,8 @@ var XmtpService = class _XmtpService {
58248
58296
  timer.unref?.();
58249
58297
  this.replayScanRetryByAddress.set(addressKey, {
58250
58298
  clientGeneration,
58299
+ retryTrigger,
58300
+ recoveryIdentities: retryTrigger === "stream_recovery" ? [...new Set(recoveryIdentities)] : [],
58251
58301
  timer
58252
58302
  });
58253
58303
  }
@@ -58534,7 +58584,7 @@ var XmtpService = class _XmtpService {
58534
58584
  String(recovery.recoverySequence),
58535
58585
  agent
58536
58586
  );
58537
- if (summary.outcome === "completed" && !recoveryDisposed && this.clients.get(address) === agent) {
58587
+ if (summary.outcome === "completed" && summary.consecutiveFailures === void 0 && !recoveryDisposed && this.clients.get(address) === agent) {
58538
58588
  logger.info(LogEvent.AGENT_STREAM_RECOVERY_REPLAY_COMPLETED, {
58539
58589
  ...agentExtras(identity),
58540
58590
  clientGeneration: String(clientGeneration),
@@ -58631,10 +58681,16 @@ var XmtpService = class _XmtpService {
58631
58681
  let priorFailure = this.replayScanFailuresByAddress.get(addressKey);
58632
58682
  if (priorFailure && priorFailure.clientGeneration !== clientGeneration) {
58633
58683
  this.replayScanFailuresByAddress.delete(addressKey);
58634
- this.clearReplayScanRetry(address);
58684
+ this.clearReplayScanRetry(address, "client_replaced");
58635
58685
  priorFailure = void 0;
58636
58686
  }
58637
58687
  if (priorFailure && attemptNowMs < priorFailure.nextAttemptAtMs) {
58688
+ if (trigger === "stream_recovery") {
58689
+ priorFailure.retryTrigger = trigger;
58690
+ if (recoveryIdentity && !priorFailure.recoveryIdentities.includes(recoveryIdentity)) {
58691
+ priorFailure.recoveryIdentities.push(recoveryIdentity);
58692
+ }
58693
+ }
58638
58694
  priorFailure.suppressedAttempts++;
58639
58695
  summary.outcome = "suppressed_backoff";
58640
58696
  summary.failureStage = priorFailure.lastFailureStage;
@@ -58651,7 +58707,8 @@ var XmtpService = class _XmtpService {
58651
58707
  agent,
58652
58708
  clientGeneration,
58653
58709
  priorFailure.retryTrigger,
58654
- summary.backoffMs
58710
+ summary.backoffMs,
58711
+ priorFailure.recoveryIdentities
58655
58712
  );
58656
58713
  summary.durationMs = Date.now() - addressReplayStartedAt;
58657
58714
  return summary;
@@ -58664,15 +58721,23 @@ var XmtpService = class _XmtpService {
58664
58721
  const recordScanFailure = (stage, err) => {
58665
58722
  const previous = this.replayScanFailuresByAddress.get(addressKey);
58666
58723
  const consecutiveFailures = (previous?.consecutiveFailures ?? 0) + 1;
58667
- const backoffMs = replayScanBackoffMs(consecutiveFailures);
58724
+ const backoffMs = replayScanBackoffWithJitterMs(
58725
+ consecutiveFailures,
58726
+ this.replayScanRandom()
58727
+ );
58668
58728
  const suppressedAttempts = previous?.suppressedAttempts ?? 0;
58669
58729
  const failureNowMs = this.replayScanNowMs();
58670
- const retryTrigger = isOfflineReplayForTrigger(trigger) ? "startup" : "periodic_repair";
58730
+ const recoveryIdentities = [...previous?.recoveryIdentities ?? []];
58731
+ if (trigger === "stream_recovery" && recoveryIdentity && !recoveryIdentities.includes(recoveryIdentity)) {
58732
+ recoveryIdentities.push(recoveryIdentity);
58733
+ }
58734
+ const retryTrigger = trigger === "stream_recovery" ? trigger : previous?.retryTrigger ?? trigger;
58671
58735
  this.replayScanFailuresByAddress.set(addressKey, {
58672
58736
  clientGeneration,
58673
58737
  consecutiveFailures,
58674
58738
  nextAttemptAtMs: failureNowMs + backoffMs,
58675
58739
  retryTrigger,
58740
+ recoveryIdentities,
58676
58741
  suppressedAttempts: 0,
58677
58742
  lastFailureStage: stage
58678
58743
  });
@@ -58681,7 +58746,8 @@ var XmtpService = class _XmtpService {
58681
58746
  agent,
58682
58747
  clientGeneration,
58683
58748
  retryTrigger,
58684
- backoffMs
58749
+ backoffMs,
58750
+ recoveryIdentities
58685
58751
  );
58686
58752
  summary.outcome = stage === "syncAll" ? "sync_failed" : "list_failed";
58687
58753
  summary.failureStage = stage;
@@ -58878,6 +58944,30 @@ var XmtpService = class _XmtpService {
58878
58944
  recoveredAfterFailures: String(recoveredFailure?.consecutiveFailures ?? 0),
58879
58945
  suppressedAttempts: String(recoveredFailure?.suppressedAttempts ?? 0)
58880
58946
  });
58947
+ if (recoveredFailure) {
58948
+ for (const recoverySequence of recoveredFailure.recoveryIdentities) {
58949
+ logger.info(LogEvent.AGENT_STREAM_RECOVERY_REPLAY_COMPLETED, {
58950
+ ...agentExtras({
58951
+ walletAddress: address,
58952
+ inboxId: agent.client?.inboxId,
58953
+ onchainosAgentId: this.getAgentByAddress(address)?.agentId,
58954
+ role: this.getAgentByAddress(address)?.role
58955
+ }),
58956
+ clientGeneration: String(clientGeneration),
58957
+ recoverySequence,
58958
+ replayed: String(summary.replayed),
58959
+ skipped: String(summary.skipped),
58960
+ conversationCount: String(summary.conversations),
58961
+ replayDurationMs: String(Date.now() - addressReplayStartedAt),
58962
+ outcome: "success",
58963
+ replayOutcome: "completed",
58964
+ recoveredAfterFailures: String(
58965
+ recoveredFailure.consecutiveFailures
58966
+ ),
58967
+ suppressedAttempts: String(recoveredFailure.suppressedAttempts)
58968
+ });
58969
+ }
58970
+ }
58881
58971
  summary.outcome = "completed";
58882
58972
  summary.consecutiveFailures = recoveredFailure?.consecutiveFailures;
58883
58973
  summary.suppressedAttempts = recoveredFailure?.suppressedAttempts;
@@ -60933,7 +61023,7 @@ function buildConnectParams(config, instanceId, protocolVersion) {
60933
61023
  client: {
60934
61024
  id: "gateway-client",
60935
61025
  displayName: "okx-a2a-node",
60936
- version: "0.2.8",
61026
+ version: "0.2.9-beta-cb068eb2d0-260824220115",
60937
61027
  platform: "node",
60938
61028
  mode: "backend",
60939
61029
  instanceId
@@ -60944,7 +61034,7 @@ function buildConnectParams(config, instanceId, protocolVersion) {
60944
61034
  commands: [],
60945
61035
  permissions: {},
60946
61036
  locale: Intl.DateTimeFormat().resolvedOptions().locale || "en-US",
60947
- userAgent: `okx-a2a-node/${"0.2.8"}`,
61037
+ userAgent: `okx-a2a-node/${"0.2.9-beta-cb068eb2d0-260824220115"}`,
60948
61038
  auth: {
60949
61039
  ...config.token ? { token: config.token } : {},
60950
61040
  ...config.password ? { password: config.password } : {}
@@ -67172,12 +67262,12 @@ async function runListenerWithLock(options, paths) {
67172
67262
  });
67173
67263
  }
67174
67264
  });
67175
- service.setPluginVersion("0.2.8");
67265
+ service.setPluginVersion("0.2.9-beta-cb068eb2d0-260824220115");
67176
67266
  await service.init();
67177
67267
  const pluginVersionStatus = service.pluginVersionStatus;
67178
67268
  if (pluginVersionStatus.unavailable) {
67179
67269
  throw new Error(
67180
- `@okxweb3/a2a-node v${"0.2.8"} is below the required minimum v${pluginVersionStatus.minVersion}`
67270
+ `@okxweb3/a2a-node v${"0.2.9-beta-cb068eb2d0-260824220115"} is below the required minimum v${pluginVersionStatus.minVersion}`
67181
67271
  );
67182
67272
  }
67183
67273
  const systemConfig = service.getSystemConfig();
@@ -67205,7 +67295,7 @@ async function runListenerWithLock(options, paths) {
67205
67295
  onchainosAgentId: "*",
67206
67296
  reason: "system-config missing sentryDsn",
67207
67297
  pluginId: "@okxweb3/a2a-node",
67208
- pluginVersion: "0.2.8"
67298
+ pluginVersion: "0.2.9-beta-cb068eb2d0-260824220115"
67209
67299
  });
67210
67300
  }
67211
67301
  logWithTimestamp(
@@ -69906,7 +69996,7 @@ async function exportDiagnosticLogs(options) {
69906
69996
  node: process.version,
69907
69997
  platform: process.platform,
69908
69998
  arch: process.arch,
69909
- packageVersion: true ? "0.2.8" : "unknown",
69999
+ packageVersion: true ? "0.2.9-beta-cb068eb2d0-260824220115" : "unknown",
69910
70000
  sensitiveContentIncluded: options.includeSensitiveContent,
69911
70001
  listenerAndLlmContentIncluded: true,
69912
70002
  credentialsAlwaysRedacted: true,
@@ -71788,7 +71878,7 @@ async function runDoctor(options = {}) {
71788
71878
  platform: options.platform ?? process.platform,
71789
71879
  env: options.env ?? process.env,
71790
71880
  target: options.target ?? resolveDoctorTarget(options.env ?? process.env),
71791
- cliVersion: options.cliVersion ?? (true ? "0.2.8" : "0.0.0"),
71881
+ cliVersion: options.cliVersion ?? (true ? "0.2.9-beta-cb068eb2d0-260824220115" : "0.0.0"),
71792
71882
  fixMode: options.fix === true,
71793
71883
  nonInteractive: options.nonInteractive === true,
71794
71884
  packageChanged: false,
@@ -72216,6 +72306,7 @@ init_autostart_windows();
72216
72306
  releaseActiveDaemon,
72217
72307
  removeUserAttentionWatcher,
72218
72308
  replayScanBackoffMs,
72309
+ replayScanBackoffWithJitterMs,
72219
72310
  reportDoctorRunToSentry,
72220
72311
  reportUserNotificationFailure,
72221
72312
  resetMessageEligibleOfflineReplayCapabilityForTests,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okxweb3/a2a-node",
3
- "version": "0.2.8",
3
+ "version": "0.2.9-beta-cb068eb2d0-260824220115",
4
4
  "description": "Host-agnostic Node CLI for E2E encrypted agent-to-agent communication via XMTP",
5
5
  "main": "dist/index.js",
6
6
  "bin": {