solana-traderclaw 1.0.141 → 1.0.145

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/index.js CHANGED
@@ -1,7 +1,5 @@
1
1
  import {
2
- readRecoverySecretFromDisk,
3
- writeRecoverySecretToOpenclawAtomic,
4
- writeRefreshTokenToOpenclawAtomic
2
+ readRecoverySecretFromDisk
5
3
  } from "./chunk-IAQC34O7.js";
6
4
  import {
7
5
  SessionManager,
@@ -1027,14 +1025,6 @@ var solanaTraderPlugin = {
1027
1025
  `[solana-trader] Failed to write rotated recovery secret to sidecar: ${err instanceof Error ? err.message : String(err)}`
1028
1026
  );
1029
1027
  }
1030
- try {
1031
- writeRecoverySecretToOpenclawAtomic(newSecret);
1032
- api.logger.info("[solana-trader] Persisted rotated recovery secret to openclaw.json");
1033
- } catch (err) {
1034
- api.logger.warn(
1035
- `[solana-trader] Failed to write rotated recovery secret to openclaw.json: ${err instanceof Error ? err.message : String(err)}`
1036
- );
1037
- }
1038
1028
  },
1039
1029
  clientLabel: "openclaw-plugin-runtime",
1040
1030
  timeout: apiTimeout,
@@ -1057,14 +1047,6 @@ var solanaTraderPlugin = {
1057
1047
  `[solana-trader] Failed to persist session sidecar: ${err instanceof Error ? err.message : String(err)}`
1058
1048
  );
1059
1049
  }
1060
- try {
1061
- writeRefreshTokenToOpenclawAtomic(tokens.refreshToken);
1062
- api.logger.info("[solana-trader] Persisted rotated refresh token to openclaw.json");
1063
- } catch (err) {
1064
- api.logger.warn(
1065
- `[solana-trader] Failed to write rotated refresh token to openclaw.json: ${err instanceof Error ? err.message : String(err)}`
1066
- );
1067
- }
1068
1050
  },
1069
1051
  logger: {
1070
1052
  info: (msg) => api.logger.info(`[solana-trader] ${msg}`),
@@ -4337,17 +4319,30 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4337
4319
  }
4338
4320
  );
4339
4321
  let solanaTraderSessionWatchdogTimer = null;
4322
+ let solanaTraderLifecycleDisposed = false;
4323
+ __solanaTraderDisposers.push(() => {
4324
+ solanaTraderLifecycleDisposed = true;
4325
+ });
4340
4326
  __solanaTraderDisposers.push(() => {
4341
4327
  if (solanaTraderSessionWatchdogTimer !== null) {
4342
4328
  clearInterval(solanaTraderSessionWatchdogTimer);
4343
4329
  solanaTraderSessionWatchdogTimer = null;
4344
4330
  }
4345
4331
  });
4346
- api.registerService({
4347
- id: "solana-trader-session",
4348
- start: async () => {
4332
+ let solanaTraderBootstrapPromise = null;
4333
+ const bootstrapSessionAndArmWatchdog = () => {
4334
+ if (solanaTraderBootstrapPromise) return solanaTraderBootstrapPromise;
4335
+ solanaTraderBootstrapPromise = (async () => {
4336
+ const checkDisposed = (stage) => {
4337
+ if (solanaTraderLifecycleDisposed) {
4338
+ api.logger.info(`[solana-trader] Bootstrap aborted at ${stage}: lifecycle disposed by newer register`);
4339
+ return true;
4340
+ }
4341
+ return false;
4342
+ };
4349
4343
  try {
4350
4344
  await sessionManager.initialize();
4345
+ if (checkDisposed("after sessionManager.initialize")) return;
4351
4346
  const info = sessionManager.getSessionInfo();
4352
4347
  api.logger.info(
4353
4348
  `[solana-trader] Session active. Tier: ${info.tier}, Scopes: ${info.scopes.join(", ")}`
@@ -4369,6 +4364,7 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4369
4364
  timeout: 5e3,
4370
4365
  accessToken: await sessionManager.getAccessToken()
4371
4366
  });
4367
+ if (checkDisposed("after healthz")) return;
4372
4368
  api.logger.info(`[solana-trader] Orchestrator healthz OK at ${orchestratorUrl}`);
4373
4369
  if (healthz && typeof healthz === "object") {
4374
4370
  const h = healthz;
@@ -4377,8 +4373,10 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4377
4373
  } catch (err) {
4378
4374
  api.logger.warn(`[solana-trader] /healthz unreachable at ${orchestratorUrl}: ${err instanceof Error ? err.message : String(err)}`);
4379
4375
  }
4376
+ if (checkDisposed("after healthz catch")) return;
4380
4377
  try {
4381
4378
  const status = await get("/api/system/status");
4379
+ if (checkDisposed("after /api/system/status")) return;
4382
4380
  api.logger.info(`[solana-trader] Connected to orchestrator (walletId: ${walletId})`);
4383
4381
  if (status && typeof status === "object") {
4384
4382
  api.logger.info(`[solana-trader] System status: ${JSON.stringify(status)}`);
@@ -4386,8 +4384,10 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4386
4384
  } catch (err) {
4387
4385
  api.logger.warn(`[solana-trader] /api/system/status unreachable: ${err instanceof Error ? err.message : String(err)}`);
4388
4386
  }
4387
+ if (checkDisposed("after system-status catch")) return;
4389
4388
  try {
4390
4389
  const startupGate = await runStartupGate({ autoFixGateway: true, force: true });
4390
+ if (checkDisposed("after startup gate")) return;
4391
4391
  api.logger.info(`[solana-trader] Startup gate completed: ok=${startupGate.ok}, passed=${startupGate.summary.passed}, failed=${startupGate.summary.failed}`);
4392
4392
  if (!startupGate.ok) {
4393
4393
  api.logger.warn(`[solana-trader] Startup gate failures: ${JSON.stringify(startupGate.steps.filter((step) => !step.ok))}`);
@@ -4395,12 +4395,15 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4395
4395
  } catch (err) {
4396
4396
  api.logger.warn(`[solana-trader] Startup gate run failed: ${err instanceof Error ? err.message : String(err)}`);
4397
4397
  }
4398
+ if (checkDisposed("after startup gate catch")) return;
4398
4399
  try {
4399
4400
  const probe = await runForwardProbe({ agentId: config.agentId || "main", source: "service_startup" });
4401
+ if (checkDisposed("after forward probe")) return;
4400
4402
  api.logger.info(`[solana-trader] Forward probe result: ${JSON.stringify(probe)}`);
4401
4403
  } catch (err) {
4402
4404
  api.logger.warn(`[solana-trader] Forward probe failed: ${err instanceof Error ? err.message : String(err)}`);
4403
4405
  }
4406
+ if (checkDisposed("before watchdog arm")) return;
4404
4407
  const WATCHDOG_INTERVAL_MS = 20 * 60 * 1e3;
4405
4408
  const FORWARD_PROBE_WATCHDOG_MS = 7 * 60 * 1e3;
4406
4409
  const STARTUP_GATE_AFTER_PROBE_FAIL_COOLDOWN_MS = 10 * 60 * 1e3;
@@ -4500,6 +4503,18 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4500
4503
  if (solanaTraderSessionWatchdogTimer && typeof solanaTraderSessionWatchdogTimer === "object" && "unref" in solanaTraderSessionWatchdogTimer) {
4501
4504
  solanaTraderSessionWatchdogTimer.unref();
4502
4505
  }
4506
+ if (solanaTraderLifecycleDisposed && solanaTraderSessionWatchdogTimer !== null) {
4507
+ clearInterval(solanaTraderSessionWatchdogTimer);
4508
+ solanaTraderSessionWatchdogTimer = null;
4509
+ api.logger.info("[solana-trader] Bootstrap cleared freshly-armed watchdog: lifecycle disposed during setInterval window");
4510
+ }
4511
+ })();
4512
+ return solanaTraderBootstrapPromise;
4513
+ };
4514
+ api.registerService({
4515
+ id: "solana-trader-session",
4516
+ start: async () => {
4517
+ await bootstrapSessionAndArmWatchdog();
4503
4518
  },
4504
4519
  stop: async () => {
4505
4520
  if (solanaTraderSessionWatchdogTimer !== null) {
@@ -4603,6 +4618,11 @@ Context compaction triggered. STATE.md synced from last persisted state. Decisio
4603
4618
  }
4604
4619
  }
4605
4620
  });
4621
+ void bootstrapSessionAndArmWatchdog().catch((err) => {
4622
+ api.logger.error(
4623
+ `[solana-trader] Post-register bootstrap failed: ${err instanceof Error ? err.message : String(err)}`
4624
+ );
4625
+ });
4606
4626
  }
4607
4627
  };
4608
4628
  var index_default = solanaTraderPlugin;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solana-traderclaw",
3
- "version": "1.0.141",
3
+ "version": "1.0.145",
4
4
  "description": "TraderClaw V1-Upgraded — Solana trading for OpenClaw with intelligence lab, tool envelopes, prompt scrubbing, read-only X social intel, and split skill docs",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -54,8 +54,6 @@ If ALL four true → exit immediately. Do NOT hold hoping for recovery. A positi
54
54
 
55
55
  ## STEP 1: SCAN
56
56
 
57
- Call `solana_scan_launches` for new launches and `solana_scan_hot_pairs` for hot pairs.
58
-
59
57
  **Bitquery subscription events:** Check `solana_bitquery_subscriptions` for active streams. Process buffered events from real-time subscriptions. If no subscriptions active and first heartbeat of session, call `solana_bitquery_templates` to discover available templates and cache in memory.
60
58
 
61
59
  ## STEP 1.5: ALPHA SIGNALS