tokentracker-cli 1.2.1 → 1.3.3
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/README.md +2 -0
- package/README.zh-CN.md +2 -0
- package/dashboard/dist/assets/AchievementBadge-BaqdyZaV.js +1 -0
- package/dashboard/dist/assets/AchievementsPage-B4Ju0guv.js +2 -0
- package/dashboard/dist/assets/{AchievementsSection-DoYMz2Rr.js → AchievementsSection-CDUUEfIi.js} +1 -1
- package/dashboard/dist/assets/BadgeDetailModal-B-XMJAvL.js +1 -0
- package/dashboard/dist/assets/{BotAnimated-C21PdYSf.js → BotAnimated-Dx_vvTtC.js} +1 -1
- package/dashboard/dist/assets/Card-D-5mABVt.js +1 -0
- package/dashboard/dist/assets/CloudCheckoutPage-BELoh56h.js +1 -0
- package/dashboard/dist/assets/CloudPage-CfBruNxe.js +1 -0
- package/dashboard/dist/assets/CloudUsageExport-BoFU7xCT.js +4 -0
- package/dashboard/dist/assets/CommandPalette-BmmKZWn-.js +1 -0
- package/dashboard/dist/assets/CommunityStatsModal-BF77zVhN.js +1 -0
- package/dashboard/dist/assets/{ConfirmModal-zUljpLNe.js → ConfirmModal-BQ-xB1S_.js} +1 -1
- package/dashboard/dist/assets/Controls-BnTeX7T4.js +1 -0
- package/dashboard/dist/assets/DashboardPage-BWulHa5J.js +1 -0
- package/dashboard/dist/assets/{DevicePage-CCIyAYH3.js → DevicePage-Dg6XkIaY.js} +1 -1
- package/dashboard/dist/assets/DialogClose-DAyilsH-.js +1 -0
- package/dashboard/dist/assets/DialogDescription-j4XnRy6y.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-6q0jyME6.js → DialogTitle-B1iNGD2S.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-BUm1z22V.js → FadeIn-ChVf45WW.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-CxdmloMy.js → HeaderGithubStar-B740_G7a.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-CrMdGYZj.js → HoverTooltip-BzP5FudR.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-w6UUK_1K.js → IpCheckPage-BuZH3F14.js} +1 -1
- package/dashboard/dist/assets/LandingPage-Dtgq_caz.js +2 -0
- package/dashboard/dist/assets/LeaderboardPage-Di1kEg2O.js +2 -0
- package/dashboard/dist/assets/LeaderboardProBadge-h8FfR0au.js +1 -0
- package/dashboard/dist/assets/LeaderboardProfileModal-OUZvO6u-.js +73 -0
- package/dashboard/dist/assets/{LeaderboardProfilePage-Fljho5RP.js → LeaderboardProfilePage-bHI1oTEK.js} +2 -2
- package/dashboard/dist/assets/{LimitsPage-Do_uJqdQ.js → LimitsPage-DKojB73_.js} +2 -2
- package/dashboard/dist/assets/{LocalOnlyNotice-RIj2XT_X.js → LocalOnlyNotice-BaEq6qN7.js} +1 -1
- package/dashboard/dist/assets/LoginCard-Dn5Xy4If.js +1 -0
- package/dashboard/dist/assets/LoginModal-C5h-5GOA.js +1 -0
- package/dashboard/dist/assets/LoginPage-BpX8Tgjj.js +1 -0
- package/dashboard/dist/assets/PetPage-BPBsUHyL.js +1 -0
- package/dashboard/dist/assets/PopoverPopup-CVTiEVHs.js +1 -0
- package/dashboard/dist/assets/{ProviderIcon-BSI-1Cy8.js → ProviderIcon-BshO2uER.js} +1 -1
- package/dashboard/dist/assets/ResetPasswordPage-RTFTD8Dr.js +1 -0
- package/dashboard/dist/assets/{Select-B6CM0ico.js → Select-CtTceC4T.js} +1 -1
- package/dashboard/dist/assets/SelectItemText-C7xi8iGp.js +1 -0
- package/dashboard/dist/assets/SelfHostPage-BlwTt8XM.js +1 -0
- package/dashboard/dist/assets/{ServiceStatusPage-B4lIs2fc.js → ServiceStatusPage-BkIcJpYK.js} +1 -1
- package/dashboard/dist/assets/SessionsPage-okHobk_L.js +3 -0
- package/dashboard/dist/assets/SettingsPage-C-cc6wcF.js +2 -0
- package/dashboard/dist/assets/SkillsPage-D2LlKKJN.js +1 -0
- package/dashboard/dist/assets/{TokenGalaxy-Bk3kGSGi.js → TokenGalaxy-DiXUpXKF.js} +2 -2
- package/dashboard/dist/assets/TrendMonitor-C88S-5aa.js +19 -0
- package/dashboard/dist/assets/WidgetsPage-WsEFPNwp.js +1 -0
- package/dashboard/dist/assets/{WrappedPage-DHRmP4Ey.js → WrappedPage-ClEo-RmR.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-DFRX9dp-.css +1 -0
- package/dashboard/dist/assets/__vite-browser-external-DUJeOWgd.js +45 -0
- package/dashboard/dist/assets/agent-logos-BM9jlReI.js +1 -0
- package/dashboard/dist/assets/arrow-left-BEM-HVmC.js +1 -0
- package/dashboard/dist/assets/arrow-right-CwBz5dwb.js +1 -0
- package/dashboard/dist/assets/{arrow-up-right-c39fdiDQ.js → arrow-up-right-jPmRN562.js} +1 -1
- package/dashboard/dist/assets/{check-8LQ7IvkH.js → check-CKwHc4Hv.js} +1 -1
- package/dashboard/dist/assets/cloud-checkout-nYNHDFoR.js +1 -0
- package/dashboard/dist/assets/composite-B4Z3F65o.js +1 -0
- package/dashboard/dist/assets/{download-x3Gmv-wu.js → download-CJUnX1Bs.js} +1 -1
- package/dashboard/dist/assets/{external-link-daw-XTjZ.js → external-link-B5yXxdPy.js} +1 -1
- package/dashboard/dist/assets/{flame-B9o0_EF8.js → flame-CKjAluj_.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-o9atQGtV.js → format-tokens-mk49THtv.js} +1 -1
- package/dashboard/dist/assets/{host-mode-GPY2DxE4.js → host-mode-efKlSYjX.js} +1 -1
- package/dashboard/dist/assets/{icons-CmM2z-Jt.js → icons-ZB1ZthjH.js} +1 -1
- package/dashboard/dist/assets/{index-CPcJP0uH.js → index-BImBG3eS.js} +1 -1
- package/dashboard/dist/assets/{index-CtQOew7C.js → index-BgdM7kBl.js} +1 -1
- package/dashboard/dist/assets/{index-Bfgblk6o.js → index-DweUMAUD.js} +1 -1
- package/dashboard/dist/assets/{info-BaK8Hoi2.js → info-CyDY7NYM.js} +1 -1
- package/dashboard/dist/assets/{link-2-CV3uvMH3.js → link-2-Dn2soiyd.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-DYpa-xTZ.js → loader-circle-CNT630zn.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-Ds4Uh7JO.js → modifiers.esm-WPx0bc2K.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-BbeYHvY-.js → monitor-smartphone-C-qC0RAt.js} +1 -1
- package/dashboard/dist/assets/os-DMmhX9tk.js +1 -0
- package/dashboard/dist/assets/{plus-C9qGVLFv.js → plus-Cx82jb7o.js} +1 -1
- package/dashboard/dist/assets/{provider-display-BWYNyitK.js → provider-display-CodMmiRb.js} +2 -2
- package/dashboard/dist/assets/{react-CO1HovF5.js → react-B7SkZTgg.js} +1 -1
- package/dashboard/dist/assets/safePolygon-CKpREa4K.js +1 -0
- package/dashboard/dist/assets/{search-DBnhkzG_.js → search-Ol3OZBm4.js} +1 -1
- package/dashboard/dist/assets/server-DFCbznC7.js +1 -0
- package/dashboard/dist/assets/shield-check-YcmLwVZ6.js +1 -0
- package/dashboard/dist/assets/skills-api-C-9vK884.js +1 -0
- package/dashboard/dist/assets/{sortable.esm-SVl6OixH.js → sortable.esm-CKC9NuR-.js} +1 -1
- package/dashboard/dist/assets/store-C9yWYHfg.js +1 -0
- package/dashboard/dist/assets/{terminal-kUMdPZhq.js → terminal-B3_fCLFs.js} +1 -1
- package/dashboard/dist/assets/{trash-Dd_vbrYo.js → trash-CZGfgbFa.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-Bmlmv4H-.js → use-community-stats-CW-qkYn7.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-CqZwzrCW.js → use-latest-request-guard-DHv7vfFE.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-CDC0MZRY.js → use-limits-display-prefs-NZ-AAYD5.js} +1 -1
- package/dashboard/dist/assets/use-native-settings-CWiLqfZh.js +1 -0
- package/dashboard/dist/assets/{use-ordered-list-DvBI7mUU.js → use-ordered-list-Df8pw-WJ.js} +1 -1
- package/dashboard/dist/assets/use-pet-settings-Bg2CDprr.js +2 -0
- package/dashboard/dist/assets/use-reduced-motion-iDZEUyua.js +1 -0
- package/dashboard/dist/assets/{use-transform-uSKYTYaW.js → use-transform-BHwEAfmO.js} +1 -1
- package/dashboard/dist/assets/use-usage-limits-CSxFFn3_.js +1 -0
- package/dashboard/dist/assets/{useCurrency-t1iy_pC3.js → useCurrency-pwClnCZ5.js} +1 -1
- package/dashboard/dist/assets/usePositioner-B0j1orGj.js +1 -0
- package/dashboard/dist/assets/useTokenFormat-BMvVAe6V.js +1 -0
- package/dashboard/dist/assets/{zap-DFM6AsYo.js → zap-DvX2aYx5.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/pricing.html +6 -5
- package/dashboard/dist/privacy.html +3 -3
- package/dashboard/dist/share.html +2 -2
- package/dashboard/dist/terms.html +6 -6
- package/package.json +6 -2
- package/src/commands/device-login.js +60 -33
- package/src/commands/init.js +26 -7
- package/src/commands/serve.js +3 -3
- package/src/commands/sync.js +43 -22
- package/src/lib/atomic-json.js +27 -0
- package/src/lib/bearer-token.js +11 -0
- package/src/lib/cloud-account.js +4 -1
- package/src/lib/local-api.js +282 -69
- package/src/lib/openclaw-cli.js +104 -0
- package/src/lib/openclaw-hook.js +1 -46
- package/src/lib/openclaw-session-plugin.js +1 -59
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/proxy-env.js +8 -3
- package/src/lib/rollout.js +15 -10
- package/src/lib/runtime-config.js +84 -14
- package/src/lib/skills-manager.js +8 -1
- package/src/lib/static-server.js +19 -4
- package/src/lib/upload-throttle.js +18 -4
- package/dashboard/dist/assets/AchievementBadge-DPlXNqoK.js +0 -1
- package/dashboard/dist/assets/AchievementsPage-B49wjdK_.js +0 -2
- package/dashboard/dist/assets/BadgeDetailModal-DUCS6K1n.js +0 -1
- package/dashboard/dist/assets/Card-BU2CqxfU.js +0 -1
- package/dashboard/dist/assets/CommandPalette-O3pOLyJo.js +0 -1
- package/dashboard/dist/assets/CommunityStatsModal-Bt82neQ7.js +0 -1
- package/dashboard/dist/assets/Controls-D56v-YJw.js +0 -1
- package/dashboard/dist/assets/DashboardPage-CKEuFzuc.js +0 -1
- package/dashboard/dist/assets/DialogClose-C-QK97qp.js +0 -1
- package/dashboard/dist/assets/DialogDescription-COXweCuc.js +0 -1
- package/dashboard/dist/assets/LandingPage-DLDE7wdR.js +0 -2
- package/dashboard/dist/assets/LeaderboardAvatar-BqD4dEvQ.js +0 -1
- package/dashboard/dist/assets/LeaderboardPage-kgHSryiT.js +0 -2
- package/dashboard/dist/assets/LeaderboardProfileModal-zLdeOiA3.js +0 -73
- package/dashboard/dist/assets/LoginCard-Dx6MmGjU.js +0 -1
- package/dashboard/dist/assets/LoginModal-BWaZVRnT.js +0 -1
- package/dashboard/dist/assets/LoginPage-BNkU-riS.js +0 -1
- package/dashboard/dist/assets/PetPage-CyEgU2Vm.js +0 -1
- package/dashboard/dist/assets/PopoverPopup-CmUIY8lF.js +0 -1
- package/dashboard/dist/assets/ResetPasswordPage-CUXKkLb4.js +0 -1
- package/dashboard/dist/assets/SelectItemText-CZ7puxuB.js +0 -1
- package/dashboard/dist/assets/SessionsPage-D99UfBgy.js +0 -3
- package/dashboard/dist/assets/SettingsPage-DT3rld91.js +0 -2
- package/dashboard/dist/assets/SkillsPage-Dv47kVCB.js +0 -1
- package/dashboard/dist/assets/TrendMonitor-mB1x3c_o.js +0 -19
- package/dashboard/dist/assets/WidgetsPage-BhUArowe.js +0 -1
- package/dashboard/dist/assets/__vite-browser-external-BW1rxvYq.js +0 -45
- package/dashboard/dist/assets/__vite-browser-external-gKkiQad5.css +0 -1
- package/dashboard/dist/assets/agent-logos-D7f7AMF-.js +0 -1
- package/dashboard/dist/assets/composite-BgLSXWKA.js +0 -1
- package/dashboard/dist/assets/skills-api-BSkbxC8-.js +0 -1
- package/dashboard/dist/assets/store-DrEEdO_u.js +0 -1
- package/dashboard/dist/assets/use-pet-settings-C_FrqySO.js +0 -2
- package/dashboard/dist/assets/use-reduced-motion-BEOENqBa.js +0 -1
- package/dashboard/dist/assets/use-session-efficiency-pref-D8cAb4A9.js +0 -1
- package/dashboard/dist/assets/use-usage-limits-DFgOKTtv.js +0 -1
- package/dashboard/dist/assets/useTokenFormat-0bPjtaaM.js +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const cp = require("node:child_process");
|
|
2
|
+
const fs = require("node:fs");
|
|
3
|
+
const path = require("node:path");
|
|
4
|
+
|
|
5
|
+
function cliError(message, code) {
|
|
6
|
+
return Object.assign(new Error(message), { code });
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function isFile(file) {
|
|
10
|
+
try {
|
|
11
|
+
return fs.statSync(file).isFile();
|
|
12
|
+
} catch (error) {
|
|
13
|
+
if (error.code === "ENOENT" || error.code === "ENOTDIR") return false;
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function resolveOpenclawCommand(env, platform = process.platform) {
|
|
19
|
+
if (platform !== "win32") return { command: "openclaw", prefixArgs: [] };
|
|
20
|
+
|
|
21
|
+
// Match Node's case-insensitive Windows environment lookup. An explicit
|
|
22
|
+
// empty PATH must not fall back to the user's real OpenClaw installation.
|
|
23
|
+
const pathKey = Object.keys(env).sort().find((key) => key.toUpperCase() === "PATH");
|
|
24
|
+
const searchPath = pathKey === undefined ? process.env.PATH || "" : env[pathKey];
|
|
25
|
+
for (const entry of String(searchPath || "").split(";")) {
|
|
26
|
+
const dir = entry.trim().replace(/^"(.*)"$/, "$1");
|
|
27
|
+
if (!dir) continue;
|
|
28
|
+
const executable = path.join(dir, "openclaw.exe");
|
|
29
|
+
if (isFile(executable)) return { command: executable, prefixArgs: [] };
|
|
30
|
+
if (!isFile(path.join(dir, "openclaw.cmd"))) continue;
|
|
31
|
+
|
|
32
|
+
// npm puts Windows shims in the prefix, alongside node_modules. Launch
|
|
33
|
+
// the declared JS bin with Node directly: cmd.exe would re-interpret
|
|
34
|
+
// user paths containing %, &, or other shell metacharacters.
|
|
35
|
+
const packageDir = path.join(dir, "node_modules", "openclaw");
|
|
36
|
+
let metadata;
|
|
37
|
+
try {
|
|
38
|
+
metadata = JSON.parse(fs.readFileSync(path.join(packageDir, "package.json"), "utf8"));
|
|
39
|
+
} catch (error) {
|
|
40
|
+
throw cliError(`Cannot resolve npm OpenClaw entry: ${error.message}`, "EINVAL");
|
|
41
|
+
}
|
|
42
|
+
const bin = typeof metadata.bin === "string" ? metadata.bin : metadata.bin?.openclaw;
|
|
43
|
+
if (metadata.name !== "openclaw" || typeof bin !== "string" || !/\.(?:[cm]?js)$/i.test(bin)) {
|
|
44
|
+
throw cliError("Unsupported npm OpenClaw entry", "EINVAL");
|
|
45
|
+
}
|
|
46
|
+
const packageRoot = fs.realpathSync.native(packageDir);
|
|
47
|
+
const target = fs.realpathSync.native(path.resolve(packageDir, bin));
|
|
48
|
+
const relative = path.relative(packageRoot, target);
|
|
49
|
+
if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative) || !isFile(target)) {
|
|
50
|
+
throw cliError("npm OpenClaw entry is outside its package", "EINVAL");
|
|
51
|
+
}
|
|
52
|
+
return { command: process.execPath, prefixArgs: [target] };
|
|
53
|
+
}
|
|
54
|
+
throw cliError("OpenClaw CLI is not on PATH", "ENOENT");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function runOpenclawCli(args, env = process.env) {
|
|
58
|
+
if (env?.TOKENTRACKER_SKIP_OPENCLAW_CLI === "1") {
|
|
59
|
+
return {
|
|
60
|
+
code: 1,
|
|
61
|
+
skippedReason: "openclaw-cli-missing",
|
|
62
|
+
error: "skipped via TOKENTRACKER_SKIP_OPENCLAW_CLI",
|
|
63
|
+
stdout: "",
|
|
64
|
+
stderr: "",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
let result;
|
|
68
|
+
try {
|
|
69
|
+
const { command, prefixArgs } = resolveOpenclawCommand(env);
|
|
70
|
+
result = cp.spawnSync(command, [...prefixArgs, ...args], {
|
|
71
|
+
env,
|
|
72
|
+
encoding: "utf8",
|
|
73
|
+
timeout: 30_000,
|
|
74
|
+
windowsHide: true,
|
|
75
|
+
shell: false,
|
|
76
|
+
});
|
|
77
|
+
} catch (error) {
|
|
78
|
+
result = { error };
|
|
79
|
+
}
|
|
80
|
+
const stdout = result.stdout || "";
|
|
81
|
+
const stderr = result.stderr || "";
|
|
82
|
+
if (result.error) {
|
|
83
|
+
return {
|
|
84
|
+
code: 1,
|
|
85
|
+
skippedReason: result.error.code === "ENOENT" ? "openclaw-cli-missing" : "openclaw-cli-error",
|
|
86
|
+
error: result.error.message || String(result.error),
|
|
87
|
+
stdout,
|
|
88
|
+
stderr,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (result.status !== 0) {
|
|
92
|
+
const scope = args[0] === "hooks" ? "hooks" : "plugins";
|
|
93
|
+
return {
|
|
94
|
+
code: Number(result.status || 1),
|
|
95
|
+
skippedReason: `openclaw-${scope}-install-failed`,
|
|
96
|
+
error: (stderr || stdout).trim() || `openclaw ${scope} install failed`,
|
|
97
|
+
stdout,
|
|
98
|
+
stderr,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { code: 0, stdout, stderr };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = { resolveOpenclawCommand, runOpenclawCli };
|
package/src/lib/openclaw-hook.js
CHANGED
|
@@ -2,7 +2,7 @@ const os = require("node:os");
|
|
|
2
2
|
const path = require("node:path");
|
|
3
3
|
const fs = require("node:fs/promises");
|
|
4
4
|
const fssync = require("node:fs");
|
|
5
|
-
const
|
|
5
|
+
const { runOpenclawCli } = require("./openclaw-cli");
|
|
6
6
|
|
|
7
7
|
const OPENCLAW_HOOK_NAME = "tokentracker-openclaw-sync";
|
|
8
8
|
const OPENCLAW_HOOK_DIRNAME = "openclaw-hook";
|
|
@@ -223,51 +223,6 @@ async function removeOpenclawHookConfig({
|
|
|
223
223
|
return { removed: changed, ...paths };
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
function runOpenclawCli(args, env = process.env) {
|
|
227
|
-
let res;
|
|
228
|
-
try {
|
|
229
|
-
res = cp.spawnSync("openclaw", args, {
|
|
230
|
-
env,
|
|
231
|
-
encoding: "utf8",
|
|
232
|
-
timeout: 30_000,
|
|
233
|
-
});
|
|
234
|
-
} catch (err) {
|
|
235
|
-
return {
|
|
236
|
-
code: 1,
|
|
237
|
-
skippedReason: err?.code === "ENOENT" ? "openclaw-cli-missing" : "openclaw-cli-error",
|
|
238
|
-
error: err?.message || String(err),
|
|
239
|
-
stdout: "",
|
|
240
|
-
stderr: "",
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
if (res.error?.code === "ENOENT") {
|
|
245
|
-
return {
|
|
246
|
-
code: 1,
|
|
247
|
-
skippedReason: "openclaw-cli-missing",
|
|
248
|
-
error: res.error.message,
|
|
249
|
-
stdout: res.stdout || "",
|
|
250
|
-
stderr: res.stderr || "",
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
if ((res.status || 0) !== 0) {
|
|
255
|
-
return {
|
|
256
|
-
code: Number(res.status || 1),
|
|
257
|
-
skippedReason: "openclaw-hooks-install-failed",
|
|
258
|
-
error: (res.stderr || res.stdout || "").trim() || "openclaw hooks install failed",
|
|
259
|
-
stdout: res.stdout || "",
|
|
260
|
-
stderr: res.stderr || "",
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
return {
|
|
265
|
-
code: 0,
|
|
266
|
-
stdout: res.stdout || "",
|
|
267
|
-
stderr: res.stderr || "",
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
|
|
271
226
|
function buildHookMarkdown() {
|
|
272
227
|
return `---
|
|
273
228
|
name: ${OPENCLAW_HOOK_NAME}
|
|
@@ -2,7 +2,7 @@ const os = require("node:os");
|
|
|
2
2
|
const path = require("node:path");
|
|
3
3
|
const fs = require("node:fs/promises");
|
|
4
4
|
const fssync = require("node:fs");
|
|
5
|
-
const
|
|
5
|
+
const { runOpenclawCli } = require("./openclaw-cli");
|
|
6
6
|
|
|
7
7
|
const OPENCLAW_SESSION_PLUGIN_ID = "openclaw-session-sync";
|
|
8
8
|
const OPENCLAW_SESSION_PLUGIN_DIRNAME = "openclaw-plugin";
|
|
@@ -311,64 +311,6 @@ async function removeOpenclawSessionPluginConfig({
|
|
|
311
311
|
return { removed: changed || hadFiles, ...paths };
|
|
312
312
|
}
|
|
313
313
|
|
|
314
|
-
function runOpenclawCli(args, env = process.env) {
|
|
315
|
-
// Test-only escape hatch: skip spawning the real `openclaw` CLI. Behaves like
|
|
316
|
-
// the CLI being absent (which is the CI environment anyway), so callers take
|
|
317
|
-
// their graceful skip path. Avoids a ~2s `plugins install --link` per cmdInit
|
|
318
|
-
// on dev machines that happen to have openclaw installed.
|
|
319
|
-
if ((env && env.TOKENTRACKER_SKIP_OPENCLAW_CLI) === "1") {
|
|
320
|
-
return {
|
|
321
|
-
code: 1,
|
|
322
|
-
skippedReason: "openclaw-cli-missing",
|
|
323
|
-
error: "skipped via TOKENTRACKER_SKIP_OPENCLAW_CLI",
|
|
324
|
-
stdout: "",
|
|
325
|
-
stderr: "",
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
let res;
|
|
329
|
-
try {
|
|
330
|
-
res = cp.spawnSync("openclaw", args, {
|
|
331
|
-
env,
|
|
332
|
-
encoding: "utf8",
|
|
333
|
-
timeout: 30_000,
|
|
334
|
-
});
|
|
335
|
-
} catch (err) {
|
|
336
|
-
return {
|
|
337
|
-
code: 1,
|
|
338
|
-
skippedReason: err?.code === "ENOENT" ? "openclaw-cli-missing" : "openclaw-cli-error",
|
|
339
|
-
error: err?.message || String(err),
|
|
340
|
-
stdout: "",
|
|
341
|
-
stderr: "",
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
if (res.error?.code === "ENOENT") {
|
|
346
|
-
return {
|
|
347
|
-
code: 1,
|
|
348
|
-
skippedReason: "openclaw-cli-missing",
|
|
349
|
-
error: res.error.message,
|
|
350
|
-
stdout: res.stdout || "",
|
|
351
|
-
stderr: res.stderr || "",
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if ((res.status || 0) !== 0) {
|
|
356
|
-
return {
|
|
357
|
-
code: Number(res.status || 1),
|
|
358
|
-
skippedReason: "openclaw-plugins-install-failed",
|
|
359
|
-
error: (res.stderr || res.stdout || "").trim() || "openclaw plugins install failed",
|
|
360
|
-
stdout: res.stdout || "",
|
|
361
|
-
stderr: res.stderr || "",
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
return {
|
|
366
|
-
code: 0,
|
|
367
|
-
stdout: res.stdout || "",
|
|
368
|
-
stderr: res.stderr || "",
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
|
|
372
314
|
function buildSessionPluginPackageJson() {
|
|
373
315
|
return `${JSON.stringify(
|
|
374
316
|
{
|