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 +42 -22
- package/package.json +1 -1
- package/skills/solana-trader/HEARTBEAT.md +0 -2
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
|
-
|
|
4347
|
-
|
|
4348
|
-
|
|
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.
|
|
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
|