tokentracker-cli 1.2.2 → 1.3.4
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/THIRD_PARTY_NOTICES.md +92 -0
- package/dashboard/dist/THIRD_PARTY_NOTICES.txt +92 -0
- package/dashboard/dist/assets/AchievementBadge-CKjtQp-U.js +1 -0
- package/dashboard/dist/assets/AchievementsPage-DpOXrabE.js +2 -0
- package/dashboard/dist/assets/{AchievementsSection-BDqKRGyL.js → AchievementsSection-DiXyIoa0.js} +1 -1
- package/dashboard/dist/assets/BadgeDetailModal-CILTTkPF.js +1 -0
- package/dashboard/dist/assets/{BotAnimated-OQbsVw1O.js → BotAnimated-CrBHWiRi.js} +1 -1
- package/dashboard/dist/assets/Card-DUItW3xI.js +1 -0
- package/dashboard/dist/assets/CloudCheckoutPage-C_t_PDlG.js +1 -0
- package/dashboard/dist/assets/CloudPage-pvJUrhya.js +1 -0
- package/dashboard/dist/assets/CloudUsageExport-DQbDwiyk.js +4 -0
- package/dashboard/dist/assets/{CommandPalette-8B38qUs0.js → CommandPalette-BvHilrbV.js} +1 -1
- package/dashboard/dist/assets/CommunityStatsModal-CizxEYv-.js +1 -0
- package/dashboard/dist/assets/{ConfirmModal-Dhu_qmiM.js → ConfirmModal-h9nISVy7.js} +1 -1
- package/dashboard/dist/assets/Controls-BjdIonTX.js +1 -0
- package/dashboard/dist/assets/DashboardPage-Bxryr4qp.js +1 -0
- package/dashboard/dist/assets/DateRangePopover-DpKh-0l8.js +1 -0
- package/dashboard/dist/assets/{DevicePage-Bvz7JJwt.js → DevicePage-DUJR9hJC.js} +1 -1
- package/dashboard/dist/assets/DialogClose-BmVAmN-o.js +1 -0
- package/dashboard/dist/assets/DialogDescription-C0Cgq67g.js +1 -0
- package/dashboard/dist/assets/DialogTitle-BsaIbN8k.js +1 -0
- package/dashboard/dist/assets/{FadeIn-DDF5PqTX.js → FadeIn-BpSt2P_W.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-CNzQFPol.js → HeaderGithubStar-Cc_VHB0R.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-BKg9Z6gg.js → HoverTooltip-WFd21iP9.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-BTdrLt08.js → IpCheckPage-C_mUPSRB.js} +1 -1
- package/dashboard/dist/assets/LandingPage-DVR8ClZO.js +2 -0
- package/dashboard/dist/assets/LeaderboardPage-D8ydzVpn.js +2 -0
- package/dashboard/dist/assets/LeaderboardProBadge-BjX4EFl2.js +1 -0
- package/dashboard/dist/assets/LeaderboardProfileModal-vbPMNn7W.js +73 -0
- package/dashboard/dist/assets/{LeaderboardProfilePage-CoqcDSTw.js → LeaderboardProfilePage-CqClmuA-.js} +2 -2
- package/dashboard/dist/assets/{LimitsPage-3RuSFnn-.js → LimitsPage-DaRggHge.js} +2 -2
- package/dashboard/dist/assets/{LocalOnlyNotice-D-OrIXty.js → LocalOnlyNotice-B6nDke_u.js} +1 -1
- package/dashboard/dist/assets/LoginCard-C28QVjd7.js +1 -0
- package/dashboard/dist/assets/LoginModal-Bx1btNhH.js +1 -0
- package/dashboard/dist/assets/LoginPage-DVOGNGYI.js +1 -0
- package/dashboard/dist/assets/PetPage-nOKryTde.js +1 -0
- package/dashboard/dist/assets/PopoverPopup-Ch6NLnu6.js +1 -0
- package/dashboard/dist/assets/{ProviderIcon-BTYVbUti.js → ProviderIcon-BRY2br-g.js} +1 -1
- package/dashboard/dist/assets/ResetPasswordPage-ko1OQecQ.js +1 -0
- package/dashboard/dist/assets/Select-Q8mS3_od.js +1 -0
- package/dashboard/dist/assets/SelectItemText-C1id8GDj.js +1 -0
- package/dashboard/dist/assets/SelfHostPage-Dzb2bDiM.js +1 -0
- package/dashboard/dist/assets/{ServiceStatusPage-Cb3k_C4g.js → ServiceStatusPage-ewFwz29J.js} +1 -1
- package/dashboard/dist/assets/SessionsPage-C6Y8kbnM.js +3 -0
- package/dashboard/dist/assets/SessionsPage-GV2fuNmd.css +1 -0
- package/dashboard/dist/assets/SettingsPage-nztCXEPs.js +2 -0
- package/dashboard/dist/assets/SkillsPage-CcG77tqU.js +1 -0
- package/dashboard/dist/assets/{TokenGalaxy-BGRF4I_8.js → TokenGalaxy-D2HDrbQR.js} +2 -2
- package/dashboard/dist/assets/TooltipPopup-C_bF2ZwO.js +1 -0
- package/dashboard/dist/assets/TrendMonitor-BcyoN5ns.js +19 -0
- package/dashboard/dist/assets/WidgetsPage-BirK0U_N.js +1 -0
- package/dashboard/dist/assets/{WrappedPage-BqyB7ezg.js → WrappedPage-thsXBuw6.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-Bq8nj-JV.js +45 -0
- package/dashboard/dist/assets/__vite-browser-external-BwmeEfv7.css +1 -0
- package/dashboard/dist/assets/{agent-logos-CEcgxIBU.js → agent-logos-CK6SzhI7.js} +1 -1
- package/dashboard/dist/assets/arrow-left-c_NOSfoq.js +1 -0
- package/dashboard/dist/assets/arrow-right-CP7drKCT.js +1 -0
- package/dashboard/dist/assets/{arrow-up-right-CdzAw406.js → arrow-up-right-DQ6QfCpo.js} +1 -1
- package/dashboard/dist/assets/calendar-days-D_pxFQvT.js +1 -0
- package/dashboard/dist/assets/{check-DhEiHlwq.js → check-HAS31kTT.js} +1 -1
- package/dashboard/dist/assets/chevron-down-BIMuk6oN.js +1 -0
- package/dashboard/dist/assets/cloud-checkout-COmDwrUT.js +1 -0
- package/dashboard/dist/assets/composite-kLwqpqEk.js +1 -0
- package/dashboard/dist/assets/download-9RgsZIiH.js +1 -0
- package/dashboard/dist/assets/{external-link-SOFbVRrH.js → external-link-C_gYjHGF.js} +1 -1
- package/dashboard/dist/assets/{flame-BRdc7HDz.js → flame-BSsCvgT8.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-DhIeweGK.js → format-tokens-N22Wqv1X.js} +1 -1
- package/dashboard/dist/assets/{host-mode-APftzzvz.js → host-mode-JzrhHX7F.js} +1 -1
- package/dashboard/dist/assets/{icons-D-wu8eUg.js → icons-pK99mIMv.js} +1 -1
- package/dashboard/dist/assets/{index-CZ3D1Q7c.js → index-BhviBroj.js} +1 -1
- package/dashboard/dist/assets/{index-D2g1tPGl.js → index-CmD84EJi.js} +1 -1
- package/dashboard/dist/assets/{index-CiWf_0mc.js → index-Dk43KNa6.js} +1 -1
- package/dashboard/dist/assets/info-D-RLFnSK.js +1 -0
- package/dashboard/dist/assets/{link-2-Cg6bEvjQ.js → link-2-BiKXW9mV.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-Cd7h4LcE.js → loader-circle-KVUaEKV2.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-B7hOvflM.js → modifiers.esm-5NK8j3mT.js} +1 -1
- package/dashboard/dist/assets/monitor-smartphone-u9yr-_Es.js +1 -0
- package/dashboard/dist/assets/os-DMmhX9tk.js +1 -0
- package/dashboard/dist/assets/play-D0MaDCOx.js +1 -0
- package/dashboard/dist/assets/plus-DTJVtoAJ.js +1 -0
- package/dashboard/dist/assets/provider-display-YhtG0I9Y.js +42 -0
- package/dashboard/dist/assets/{react-CfB5zBqR.js → react-gIVxucOB.js} +1 -1
- package/dashboard/dist/assets/safePolygon-C_sPnJ1L.js +1 -0
- package/dashboard/dist/assets/{search-DMtc6bBy.js → search-DdQRwFYV.js} +1 -1
- package/dashboard/dist/assets/server-M0rmbGWy.js +1 -0
- package/dashboard/dist/assets/shield-check-9-sqQKdD.js +1 -0
- package/dashboard/dist/assets/skills-api-B0qBWnuK.js +1 -0
- package/dashboard/dist/assets/{sortable.esm-O7ntEYCi.js → sortable.esm-iqbm7x5D.js} +1 -1
- package/dashboard/dist/assets/{store-D-FZbBaC.js → store-DstuWd4a.js} +1 -1
- package/dashboard/dist/assets/{terminal-Y3qDL50U.js → terminal-Dz0MxHNG.js} +1 -1
- package/dashboard/dist/assets/{trash-D_PaPrXq.js → trash-DBMFOFVz.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-DGTBo_4v.js → use-community-stats-CacbAcUR.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-BpfCferm.js → use-latest-request-guard-nBuQVZOR.js} +1 -1
- package/dashboard/dist/assets/use-limits-display-prefs-fqg8hs6b.js +1 -0
- package/dashboard/dist/assets/use-native-settings-EAqAFx2x.js +1 -0
- package/dashboard/dist/assets/{use-ordered-list-CClTBWi0.js → use-ordered-list-DGLjjU6Q.js} +1 -1
- package/dashboard/dist/assets/use-pet-settings-C5MzWHE7.js +2 -0
- package/dashboard/dist/assets/use-reduced-motion-DK2oZ2uC.js +1 -0
- package/dashboard/dist/assets/{use-transform-CA5mW4u8.js → use-transform-C25eCuz_.js} +1 -1
- package/dashboard/dist/assets/use-usage-limits-BhqnEai3.js +1 -0
- package/dashboard/dist/assets/{useCurrency-CaOhUMcm.js → useCurrency-t3PYQi1l.js} +1 -1
- package/dashboard/dist/assets/usePositioner-C59mj6kG.js +1 -0
- package/dashboard/dist/assets/useTokenFormat-C0xQsBGf.js +1 -0
- package/dashboard/dist/assets/zap-CyH0tvKM.js +1 -0
- 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 +7 -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-B67_Cp1T.js +0 -1
- package/dashboard/dist/assets/AchievementsPage-DNJ5n0Bn.js +0 -2
- package/dashboard/dist/assets/BadgeDetailModal-DFL1MPcg.js +0 -1
- package/dashboard/dist/assets/Card-dqzakOoX.js +0 -1
- package/dashboard/dist/assets/CommunityStatsModal-DnbCiGms.js +0 -1
- package/dashboard/dist/assets/Controls-BgQflA-3.js +0 -1
- package/dashboard/dist/assets/DashboardPage-DeLRhWU_.js +0 -1
- package/dashboard/dist/assets/DialogClose-DUxjaRqf.js +0 -1
- package/dashboard/dist/assets/DialogDescription-h6XMtzIU.js +0 -1
- package/dashboard/dist/assets/DialogTitle-C8vpXqg8.js +0 -1
- package/dashboard/dist/assets/LandingPage-cjoagPAb.js +0 -2
- package/dashboard/dist/assets/LeaderboardAvatar-CJdG51hR.js +0 -1
- package/dashboard/dist/assets/LeaderboardPage-D-yf2rOQ.js +0 -2
- package/dashboard/dist/assets/LeaderboardProfileModal--hrfpUPF.js +0 -73
- package/dashboard/dist/assets/LoginCard-BiMyV2Uf.js +0 -1
- package/dashboard/dist/assets/LoginModal-D79CMZmf.js +0 -1
- package/dashboard/dist/assets/LoginPage-BLyGuPlG.js +0 -1
- package/dashboard/dist/assets/PetPage-Bv0K4k2t.js +0 -1
- package/dashboard/dist/assets/PopoverPopup-3eucO8QU.js +0 -1
- package/dashboard/dist/assets/ResetPasswordPage-VYMl84_-.js +0 -1
- package/dashboard/dist/assets/Select-D8N2TJz1.js +0 -1
- package/dashboard/dist/assets/SelectItemText-CoTR0Uwm.js +0 -1
- package/dashboard/dist/assets/SessionsPage-BngTWN7Q.css +0 -1
- package/dashboard/dist/assets/SessionsPage-BtH5iLbi.js +0 -3
- package/dashboard/dist/assets/SettingsPage-huGkex5G.js +0 -2
- package/dashboard/dist/assets/SkillsPage-B9usVOTU.js +0 -1
- package/dashboard/dist/assets/TrendMonitor-B8SKBsWO.js +0 -19
- package/dashboard/dist/assets/WidgetsPage-o_91L3Zi.js +0 -1
- package/dashboard/dist/assets/__vite-browser-external-Cj9D7QBh.js +0 -45
- package/dashboard/dist/assets/__vite-browser-external-gKkiQad5.css +0 -1
- package/dashboard/dist/assets/composite-DO7_ilHE.js +0 -1
- package/dashboard/dist/assets/download-kGPw24XQ.js +0 -1
- package/dashboard/dist/assets/info-Qgc5VctK.js +0 -1
- package/dashboard/dist/assets/monitor-smartphone-wFv5VQQf.js +0 -1
- package/dashboard/dist/assets/plus-0xHQei42.js +0 -1
- package/dashboard/dist/assets/provider-display-DNqVkqfp.js +0 -42
- package/dashboard/dist/assets/skills-api-BeN184fz.js +0 -1
- package/dashboard/dist/assets/use-limits-display-prefs-Drs82lSi.js +0 -1
- package/dashboard/dist/assets/use-pet-settings-DvaQ7XrL.js +0 -2
- package/dashboard/dist/assets/use-reduced-motion-Dg10dVuu.js +0 -1
- package/dashboard/dist/assets/use-session-efficiency-pref-BiYRXVlN.js +0 -1
- package/dashboard/dist/assets/use-usage-limits-B0uafB4O.js +0 -1
- package/dashboard/dist/assets/useTokenFormat-JjQCKdIr.js +0 -1
- package/dashboard/dist/assets/zap-Cqur2X5s.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
|
{
|