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.
Files changed (176) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +2 -0
  3. package/THIRD_PARTY_NOTICES.md +92 -0
  4. package/dashboard/dist/THIRD_PARTY_NOTICES.txt +92 -0
  5. package/dashboard/dist/assets/AchievementBadge-CKjtQp-U.js +1 -0
  6. package/dashboard/dist/assets/AchievementsPage-DpOXrabE.js +2 -0
  7. package/dashboard/dist/assets/{AchievementsSection-BDqKRGyL.js → AchievementsSection-DiXyIoa0.js} +1 -1
  8. package/dashboard/dist/assets/BadgeDetailModal-CILTTkPF.js +1 -0
  9. package/dashboard/dist/assets/{BotAnimated-OQbsVw1O.js → BotAnimated-CrBHWiRi.js} +1 -1
  10. package/dashboard/dist/assets/Card-DUItW3xI.js +1 -0
  11. package/dashboard/dist/assets/CloudCheckoutPage-C_t_PDlG.js +1 -0
  12. package/dashboard/dist/assets/CloudPage-pvJUrhya.js +1 -0
  13. package/dashboard/dist/assets/CloudUsageExport-DQbDwiyk.js +4 -0
  14. package/dashboard/dist/assets/{CommandPalette-8B38qUs0.js → CommandPalette-BvHilrbV.js} +1 -1
  15. package/dashboard/dist/assets/CommunityStatsModal-CizxEYv-.js +1 -0
  16. package/dashboard/dist/assets/{ConfirmModal-Dhu_qmiM.js → ConfirmModal-h9nISVy7.js} +1 -1
  17. package/dashboard/dist/assets/Controls-BjdIonTX.js +1 -0
  18. package/dashboard/dist/assets/DashboardPage-Bxryr4qp.js +1 -0
  19. package/dashboard/dist/assets/DateRangePopover-DpKh-0l8.js +1 -0
  20. package/dashboard/dist/assets/{DevicePage-Bvz7JJwt.js → DevicePage-DUJR9hJC.js} +1 -1
  21. package/dashboard/dist/assets/DialogClose-BmVAmN-o.js +1 -0
  22. package/dashboard/dist/assets/DialogDescription-C0Cgq67g.js +1 -0
  23. package/dashboard/dist/assets/DialogTitle-BsaIbN8k.js +1 -0
  24. package/dashboard/dist/assets/{FadeIn-DDF5PqTX.js → FadeIn-BpSt2P_W.js} +1 -1
  25. package/dashboard/dist/assets/{HeaderGithubStar-CNzQFPol.js → HeaderGithubStar-Cc_VHB0R.js} +1 -1
  26. package/dashboard/dist/assets/{HoverTooltip-BKg9Z6gg.js → HoverTooltip-WFd21iP9.js} +1 -1
  27. package/dashboard/dist/assets/{IpCheckPage-BTdrLt08.js → IpCheckPage-C_mUPSRB.js} +1 -1
  28. package/dashboard/dist/assets/LandingPage-DVR8ClZO.js +2 -0
  29. package/dashboard/dist/assets/LeaderboardPage-D8ydzVpn.js +2 -0
  30. package/dashboard/dist/assets/LeaderboardProBadge-BjX4EFl2.js +1 -0
  31. package/dashboard/dist/assets/LeaderboardProfileModal-vbPMNn7W.js +73 -0
  32. package/dashboard/dist/assets/{LeaderboardProfilePage-CoqcDSTw.js → LeaderboardProfilePage-CqClmuA-.js} +2 -2
  33. package/dashboard/dist/assets/{LimitsPage-3RuSFnn-.js → LimitsPage-DaRggHge.js} +2 -2
  34. package/dashboard/dist/assets/{LocalOnlyNotice-D-OrIXty.js → LocalOnlyNotice-B6nDke_u.js} +1 -1
  35. package/dashboard/dist/assets/LoginCard-C28QVjd7.js +1 -0
  36. package/dashboard/dist/assets/LoginModal-Bx1btNhH.js +1 -0
  37. package/dashboard/dist/assets/LoginPage-DVOGNGYI.js +1 -0
  38. package/dashboard/dist/assets/PetPage-nOKryTde.js +1 -0
  39. package/dashboard/dist/assets/PopoverPopup-Ch6NLnu6.js +1 -0
  40. package/dashboard/dist/assets/{ProviderIcon-BTYVbUti.js → ProviderIcon-BRY2br-g.js} +1 -1
  41. package/dashboard/dist/assets/ResetPasswordPage-ko1OQecQ.js +1 -0
  42. package/dashboard/dist/assets/Select-Q8mS3_od.js +1 -0
  43. package/dashboard/dist/assets/SelectItemText-C1id8GDj.js +1 -0
  44. package/dashboard/dist/assets/SelfHostPage-Dzb2bDiM.js +1 -0
  45. package/dashboard/dist/assets/{ServiceStatusPage-Cb3k_C4g.js → ServiceStatusPage-ewFwz29J.js} +1 -1
  46. package/dashboard/dist/assets/SessionsPage-C6Y8kbnM.js +3 -0
  47. package/dashboard/dist/assets/SessionsPage-GV2fuNmd.css +1 -0
  48. package/dashboard/dist/assets/SettingsPage-nztCXEPs.js +2 -0
  49. package/dashboard/dist/assets/SkillsPage-CcG77tqU.js +1 -0
  50. package/dashboard/dist/assets/{TokenGalaxy-BGRF4I_8.js → TokenGalaxy-D2HDrbQR.js} +2 -2
  51. package/dashboard/dist/assets/TooltipPopup-C_bF2ZwO.js +1 -0
  52. package/dashboard/dist/assets/TrendMonitor-BcyoN5ns.js +19 -0
  53. package/dashboard/dist/assets/WidgetsPage-BirK0U_N.js +1 -0
  54. package/dashboard/dist/assets/{WrappedPage-BqyB7ezg.js → WrappedPage-thsXBuw6.js} +1 -1
  55. package/dashboard/dist/assets/__vite-browser-external-Bq8nj-JV.js +45 -0
  56. package/dashboard/dist/assets/__vite-browser-external-BwmeEfv7.css +1 -0
  57. package/dashboard/dist/assets/{agent-logos-CEcgxIBU.js → agent-logos-CK6SzhI7.js} +1 -1
  58. package/dashboard/dist/assets/arrow-left-c_NOSfoq.js +1 -0
  59. package/dashboard/dist/assets/arrow-right-CP7drKCT.js +1 -0
  60. package/dashboard/dist/assets/{arrow-up-right-CdzAw406.js → arrow-up-right-DQ6QfCpo.js} +1 -1
  61. package/dashboard/dist/assets/calendar-days-D_pxFQvT.js +1 -0
  62. package/dashboard/dist/assets/{check-DhEiHlwq.js → check-HAS31kTT.js} +1 -1
  63. package/dashboard/dist/assets/chevron-down-BIMuk6oN.js +1 -0
  64. package/dashboard/dist/assets/cloud-checkout-COmDwrUT.js +1 -0
  65. package/dashboard/dist/assets/composite-kLwqpqEk.js +1 -0
  66. package/dashboard/dist/assets/download-9RgsZIiH.js +1 -0
  67. package/dashboard/dist/assets/{external-link-SOFbVRrH.js → external-link-C_gYjHGF.js} +1 -1
  68. package/dashboard/dist/assets/{flame-BRdc7HDz.js → flame-BSsCvgT8.js} +1 -1
  69. package/dashboard/dist/assets/{format-tokens-DhIeweGK.js → format-tokens-N22Wqv1X.js} +1 -1
  70. package/dashboard/dist/assets/{host-mode-APftzzvz.js → host-mode-JzrhHX7F.js} +1 -1
  71. package/dashboard/dist/assets/{icons-D-wu8eUg.js → icons-pK99mIMv.js} +1 -1
  72. package/dashboard/dist/assets/{index-CZ3D1Q7c.js → index-BhviBroj.js} +1 -1
  73. package/dashboard/dist/assets/{index-D2g1tPGl.js → index-CmD84EJi.js} +1 -1
  74. package/dashboard/dist/assets/{index-CiWf_0mc.js → index-Dk43KNa6.js} +1 -1
  75. package/dashboard/dist/assets/info-D-RLFnSK.js +1 -0
  76. package/dashboard/dist/assets/{link-2-Cg6bEvjQ.js → link-2-BiKXW9mV.js} +1 -1
  77. package/dashboard/dist/assets/{loader-circle-Cd7h4LcE.js → loader-circle-KVUaEKV2.js} +1 -1
  78. package/dashboard/dist/assets/{modifiers.esm-B7hOvflM.js → modifiers.esm-5NK8j3mT.js} +1 -1
  79. package/dashboard/dist/assets/monitor-smartphone-u9yr-_Es.js +1 -0
  80. package/dashboard/dist/assets/os-DMmhX9tk.js +1 -0
  81. package/dashboard/dist/assets/play-D0MaDCOx.js +1 -0
  82. package/dashboard/dist/assets/plus-DTJVtoAJ.js +1 -0
  83. package/dashboard/dist/assets/provider-display-YhtG0I9Y.js +42 -0
  84. package/dashboard/dist/assets/{react-CfB5zBqR.js → react-gIVxucOB.js} +1 -1
  85. package/dashboard/dist/assets/safePolygon-C_sPnJ1L.js +1 -0
  86. package/dashboard/dist/assets/{search-DMtc6bBy.js → search-DdQRwFYV.js} +1 -1
  87. package/dashboard/dist/assets/server-M0rmbGWy.js +1 -0
  88. package/dashboard/dist/assets/shield-check-9-sqQKdD.js +1 -0
  89. package/dashboard/dist/assets/skills-api-B0qBWnuK.js +1 -0
  90. package/dashboard/dist/assets/{sortable.esm-O7ntEYCi.js → sortable.esm-iqbm7x5D.js} +1 -1
  91. package/dashboard/dist/assets/{store-D-FZbBaC.js → store-DstuWd4a.js} +1 -1
  92. package/dashboard/dist/assets/{terminal-Y3qDL50U.js → terminal-Dz0MxHNG.js} +1 -1
  93. package/dashboard/dist/assets/{trash-D_PaPrXq.js → trash-DBMFOFVz.js} +1 -1
  94. package/dashboard/dist/assets/{use-community-stats-DGTBo_4v.js → use-community-stats-CacbAcUR.js} +1 -1
  95. package/dashboard/dist/assets/{use-latest-request-guard-BpfCferm.js → use-latest-request-guard-nBuQVZOR.js} +1 -1
  96. package/dashboard/dist/assets/use-limits-display-prefs-fqg8hs6b.js +1 -0
  97. package/dashboard/dist/assets/use-native-settings-EAqAFx2x.js +1 -0
  98. package/dashboard/dist/assets/{use-ordered-list-CClTBWi0.js → use-ordered-list-DGLjjU6Q.js} +1 -1
  99. package/dashboard/dist/assets/use-pet-settings-C5MzWHE7.js +2 -0
  100. package/dashboard/dist/assets/use-reduced-motion-DK2oZ2uC.js +1 -0
  101. package/dashboard/dist/assets/{use-transform-CA5mW4u8.js → use-transform-C25eCuz_.js} +1 -1
  102. package/dashboard/dist/assets/use-usage-limits-BhqnEai3.js +1 -0
  103. package/dashboard/dist/assets/{useCurrency-CaOhUMcm.js → useCurrency-t3PYQi1l.js} +1 -1
  104. package/dashboard/dist/assets/usePositioner-C59mj6kG.js +1 -0
  105. package/dashboard/dist/assets/useTokenFormat-C0xQsBGf.js +1 -0
  106. package/dashboard/dist/assets/zap-CyH0tvKM.js +1 -0
  107. package/dashboard/dist/index.html +2 -2
  108. package/dashboard/dist/ip-check.html +2 -2
  109. package/dashboard/dist/leaderboard.html +2 -2
  110. package/dashboard/dist/pricing.html +6 -5
  111. package/dashboard/dist/privacy.html +3 -3
  112. package/dashboard/dist/share.html +2 -2
  113. package/dashboard/dist/terms.html +6 -6
  114. package/package.json +7 -2
  115. package/src/commands/device-login.js +60 -33
  116. package/src/commands/init.js +26 -7
  117. package/src/commands/serve.js +3 -3
  118. package/src/commands/sync.js +43 -22
  119. package/src/lib/atomic-json.js +27 -0
  120. package/src/lib/bearer-token.js +11 -0
  121. package/src/lib/cloud-account.js +4 -1
  122. package/src/lib/local-api.js +282 -69
  123. package/src/lib/openclaw-cli.js +104 -0
  124. package/src/lib/openclaw-hook.js +1 -46
  125. package/src/lib/openclaw-session-plugin.js +1 -59
  126. package/src/lib/pricing/seed-snapshot.json +1 -1
  127. package/src/lib/proxy-env.js +8 -3
  128. package/src/lib/rollout.js +15 -10
  129. package/src/lib/runtime-config.js +84 -14
  130. package/src/lib/skills-manager.js +8 -1
  131. package/src/lib/static-server.js +19 -4
  132. package/src/lib/upload-throttle.js +18 -4
  133. package/dashboard/dist/assets/AchievementBadge-B67_Cp1T.js +0 -1
  134. package/dashboard/dist/assets/AchievementsPage-DNJ5n0Bn.js +0 -2
  135. package/dashboard/dist/assets/BadgeDetailModal-DFL1MPcg.js +0 -1
  136. package/dashboard/dist/assets/Card-dqzakOoX.js +0 -1
  137. package/dashboard/dist/assets/CommunityStatsModal-DnbCiGms.js +0 -1
  138. package/dashboard/dist/assets/Controls-BgQflA-3.js +0 -1
  139. package/dashboard/dist/assets/DashboardPage-DeLRhWU_.js +0 -1
  140. package/dashboard/dist/assets/DialogClose-DUxjaRqf.js +0 -1
  141. package/dashboard/dist/assets/DialogDescription-h6XMtzIU.js +0 -1
  142. package/dashboard/dist/assets/DialogTitle-C8vpXqg8.js +0 -1
  143. package/dashboard/dist/assets/LandingPage-cjoagPAb.js +0 -2
  144. package/dashboard/dist/assets/LeaderboardAvatar-CJdG51hR.js +0 -1
  145. package/dashboard/dist/assets/LeaderboardPage-D-yf2rOQ.js +0 -2
  146. package/dashboard/dist/assets/LeaderboardProfileModal--hrfpUPF.js +0 -73
  147. package/dashboard/dist/assets/LoginCard-BiMyV2Uf.js +0 -1
  148. package/dashboard/dist/assets/LoginModal-D79CMZmf.js +0 -1
  149. package/dashboard/dist/assets/LoginPage-BLyGuPlG.js +0 -1
  150. package/dashboard/dist/assets/PetPage-Bv0K4k2t.js +0 -1
  151. package/dashboard/dist/assets/PopoverPopup-3eucO8QU.js +0 -1
  152. package/dashboard/dist/assets/ResetPasswordPage-VYMl84_-.js +0 -1
  153. package/dashboard/dist/assets/Select-D8N2TJz1.js +0 -1
  154. package/dashboard/dist/assets/SelectItemText-CoTR0Uwm.js +0 -1
  155. package/dashboard/dist/assets/SessionsPage-BngTWN7Q.css +0 -1
  156. package/dashboard/dist/assets/SessionsPage-BtH5iLbi.js +0 -3
  157. package/dashboard/dist/assets/SettingsPage-huGkex5G.js +0 -2
  158. package/dashboard/dist/assets/SkillsPage-B9usVOTU.js +0 -1
  159. package/dashboard/dist/assets/TrendMonitor-B8SKBsWO.js +0 -19
  160. package/dashboard/dist/assets/WidgetsPage-o_91L3Zi.js +0 -1
  161. package/dashboard/dist/assets/__vite-browser-external-Cj9D7QBh.js +0 -45
  162. package/dashboard/dist/assets/__vite-browser-external-gKkiQad5.css +0 -1
  163. package/dashboard/dist/assets/composite-DO7_ilHE.js +0 -1
  164. package/dashboard/dist/assets/download-kGPw24XQ.js +0 -1
  165. package/dashboard/dist/assets/info-Qgc5VctK.js +0 -1
  166. package/dashboard/dist/assets/monitor-smartphone-wFv5VQQf.js +0 -1
  167. package/dashboard/dist/assets/plus-0xHQei42.js +0 -1
  168. package/dashboard/dist/assets/provider-display-DNqVkqfp.js +0 -42
  169. package/dashboard/dist/assets/skills-api-BeN184fz.js +0 -1
  170. package/dashboard/dist/assets/use-limits-display-prefs-Drs82lSi.js +0 -1
  171. package/dashboard/dist/assets/use-pet-settings-DvaQ7XrL.js +0 -2
  172. package/dashboard/dist/assets/use-reduced-motion-Dg10dVuu.js +0 -1
  173. package/dashboard/dist/assets/use-session-efficiency-pref-BiYRXVlN.js +0 -1
  174. package/dashboard/dist/assets/use-usage-limits-B0uafB4O.js +0 -1
  175. package/dashboard/dist/assets/useTokenFormat-JjQCKdIr.js +0 -1
  176. 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 };
@@ -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 cp = require("node:child_process");
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 cp = require("node:child_process");
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
  {