@atbash/cli 0.5.15-dev.17 → 0.5.15-dev.18

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 (37) hide show
  1. package/README.md +6 -55
  2. package/dist/bin/atbash.js +1 -4
  3. package/dist/bin/atbash.js.map +1 -1
  4. package/dist/commands/connect.d.ts +24 -84
  5. package/dist/commands/connect.js +73 -289
  6. package/dist/commands/connect.js.map +1 -1
  7. package/dist/commands/held.js +4 -0
  8. package/dist/commands/held.js.map +1 -1
  9. package/dist/commands/history.js +2 -0
  10. package/dist/commands/history.js.map +1 -1
  11. package/dist/commands/judge.js +1 -0
  12. package/dist/commands/judge.js.map +1 -1
  13. package/dist/commands/policy.js +2 -0
  14. package/dist/commands/policy.js.map +1 -1
  15. package/dist/commands/setup.d.ts +8 -390
  16. package/dist/commands/setup.js +167 -1871
  17. package/dist/commands/setup.js.map +1 -1
  18. package/dist/commands/stats.js +1 -0
  19. package/dist/commands/stats.js.map +1 -1
  20. package/dist/commands/status.js +2 -0
  21. package/dist/commands/status.js.map +1 -1
  22. package/dist/commands/tier.js +2 -0
  23. package/dist/commands/tier.js.map +1 -1
  24. package/dist/commands/tools.js +7 -1
  25. package/dist/commands/tools.js.map +1 -1
  26. package/dist/commands/whoami.js +2 -0
  27. package/dist/commands/whoami.js.map +1 -1
  28. package/package.json +2 -3
  29. package/dist/commands/mcp-cmd.d.ts +0 -13
  30. package/dist/commands/mcp-cmd.js +0 -216
  31. package/dist/commands/mcp-cmd.js.map +0 -1
  32. package/dist/shared/atbash-targets.d.ts +0 -49
  33. package/dist/shared/atbash-targets.js +0 -63
  34. package/dist/shared/atbash-targets.js.map +0 -1
  35. package/dist/shared/openclaw-runtime.d.ts +0 -221
  36. package/dist/shared/openclaw-runtime.js +0 -453
  37. package/dist/shared/openclaw-runtime.js.map +0 -1
@@ -1,453 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.detectChannel = detectChannel;
7
- exports.updateCommand = updateCommand;
8
- exports.detectOpenclaw = detectOpenclaw;
9
- exports.writeStrategy = writeStrategy;
10
- exports.supportStatus = supportStatus;
11
- exports.verifyOpenclawPlugin = verifyOpenclawPlugin;
12
- exports.pluginEntryAcceptsHooks = pluginEntryAcceptsHooks;
13
- exports.validateConfig = validateConfig;
14
- /**
15
- * What the OpenClaw on THIS machine actually is, and what it can actually do.
16
- *
17
- * WHY THIS MODULE EXISTS — it is the fix for a whole class of bug, not one bug.
18
- *
19
- * `atbash setup` used to assert OpenClaw's shape from a single machine we happened
20
- * to have installed. It hardcoded `~/.openclaw/extensions/<id>` as the plugin
21
- * store and wrote that path into `plugins.load.paths`. On the box it was written
22
- * against — 2026.2.1, brew formula — that was correct. On a fresh 2026.6.6 it is
23
- * a path OpenClaw never creates, and a `load.paths` entry naming a missing
24
- * directory fails the ENTIRE config, which then takes down the
25
- * `openclaw plugins install` in the same run. The command broke its own install
26
- * step and left behind a dangling entry that `openclaw doctor --fix` offers to
27
- * delete — silently un-governing the agent.
28
- *
29
- * The lesson is not "update the hardcoded path". It is that we cannot know what
30
- * OpenClaw a user has:
31
- *
32
- * - It ships on at least three channels, each on its own version number. When
33
- * this was written: brew formula `openclaw-cli` 2026.7.1, brew cask
34
- * `openclaw` 2026.8.1, npm-global 2026.8.2, plus an npm `extended-stable`
35
- * tag on a fourth number. "The latest OpenClaw" does not identify a build.
36
- * - It moved its plugin store twice in six months, and the migration is
37
- * destructive (`plugins/installs.json` → `installs.json.migrated`).
38
- * - Keys change meaning: `plugins.allow` was repurposed to gate bundled
39
- * provider discovery; `plugins.entries.<id>.hooks` went from a FATAL unknown
40
- * key on 2026.2.1 to a valid one on 2026.6.6.
41
- *
42
- * So: ASK, never assume. Everything here is probed from the binary on the box,
43
- * and version numbers are used for REPORTING, not for deciding. Capability
44
- * detection is what makes a range of versions supportable instead of one —
45
- * comparing version strings is how you end up shipping a table that goes stale
46
- * the next time OpenClaw releases.
47
- */
48
- const child_process_1 = require("child_process");
49
- const path_1 = __importDefault(require("path"));
50
- const NO_CAPS = { patch: false, validate: false, schema: false, configFile: false };
51
- /** Bounded probe of a command. Never throws; a missing binary is a normal answer. */
52
- function probe(command, args) {
53
- const r = (0, child_process_1.spawnSync)(command, args, { encoding: "utf8", timeout: 20000 });
54
- const out = `${r.stdout ?? ""}${r.stderr ?? ""}`;
55
- return { ok: !r.error && r.status === 0, out };
56
- }
57
- /**
58
- * Where the `openclaw` on PATH came from.
59
- *
60
- * Path-based rather than asked of a package manager, because shelling out to
61
- * brew and npm to answer a question we can read off a path is slow and can hang
62
- * on a bad network — and this runs before we have written anything, where a
63
- * hang looks like the command being broken.
64
- *
65
- * ⚠️ The npm case is not hypothetical or unusual: the machine that reported the
66
- * original failure ran `/Users/m4/.nvm/versions/node/v24.13.0/bin/openclaw`,
67
- * so `brew info openclaw-cli` there said "Not installed" while OpenClaw was
68
- * plainly running. Telling that user `brew upgrade openclaw-cli` would have been
69
- * useless, which is the whole reason this returns a channel at all.
70
- */
71
- function detectChannel(binPath) {
72
- if (!binPath)
73
- return "unknown";
74
- const p = binPath.replace(/\\/g, "/");
75
- // Follows the formula's Cellar layout, and the /opt/homebrew symlink to it.
76
- if (/\/Cellar\/openclaw-cli\//.test(p) || /\/(opt\/homebrew|usr\/local)\/(bin|Cellar)\//.test(p))
77
- return "brew-formula";
78
- if (/\/Applications\/OpenClaw\.app\//.test(p))
79
- return "brew-cask";
80
- // nvm, fnm, volta, asdf and a plain global prefix all land under a node dir or
81
- // an npm/lib/node_modules path.
82
- if (/\/(\.nvm|\.fnm|\.volta|\.asdf)\//.test(p) || /\/lib\/node_modules\//.test(p) || /\/node\/v?\d/.test(p))
83
- return "npm";
84
- return "unknown";
85
- }
86
- /**
87
- * The command that updates THIS install, or undefined when we cannot tell.
88
- *
89
- * Returning undefined is deliberate and better than a plausible guess: a user
90
- * told to run `brew upgrade openclaw-cli` on an npm install gets "No available
91
- * formula", concludes our instructions are wrong, and is no closer to an
92
- * upgrade. `openclaw update` is the honest fallback where the channel is
93
- * unknown — it is OpenClaw's own self-updater, and 2026.6.6's `doctor` already
94
- * recommends exactly that ("Run `openclaw update` to update via your package
95
- * manager (npm/pnpm)").
96
- */
97
- function updateCommand(channel) {
98
- switch (channel) {
99
- case "brew-formula":
100
- return "brew upgrade openclaw-cli";
101
- case "brew-cask":
102
- return "brew upgrade --cask openclaw";
103
- case "npm":
104
- return "openclaw update";
105
- default:
106
- return "openclaw update";
107
- }
108
- }
109
- /**
110
- * Parse the subcommand list out of `openclaw config --help`.
111
- *
112
- * Reads the two-space-indented ` <name> <description>` rows commander prints
113
- * under `Commands:`. A capability we cannot see is reported as absent, which is
114
- * the safe direction: we fall back to the path that works everywhere rather than
115
- * invoking a subcommand that exits "unknown command" mid-run.
116
- */
117
- function parseConfigCaps(help) {
118
- const lines = help.split(/\r?\n/);
119
- // Only the `Commands:` section. `Options:` lists flags, and the trailing
120
- // `Docs:` line is prose — neither describes a subcommand.
121
- const start = lines.findIndex((l) => /^\s*Commands:\s*$/.test(l));
122
- const section = start === -1 ? lines : lines.slice(start + 1);
123
- const names = new Set(section
124
- // EXACTLY two spaces of indent. Commander puts subcommand names at 2 and
125
- // wraps long descriptions much deeper, and 2026.7.1's `config --help` is
126
- // full of those continuations — `patch` and `set` each carry several lines
127
- // of examples like "openclaw config patch --stdin". A looser `^ {2,}`
128
- // could read a wrapped line as a subcommand and invent a capability that
129
- // does not exist, which then gets invoked mid-run and exits "unknown
130
- // command" after earlier steps have already written.
131
- .map((line) => /^ {2}(?! )([a-z][a-z-]*)\s{2,}\S/.exec(line)?.[1])
132
- .filter((n) => Boolean(n)));
133
- return {
134
- patch: names.has("patch"),
135
- validate: names.has("validate"),
136
- schema: names.has("schema"),
137
- configFile: names.has("file"),
138
- };
139
- }
140
- /**
141
- * The version out of `openclaw --version`, in either format OpenClaw has used.
142
- *
143
- * ⚠️ THE OUTPUT FORMAT CHANGED TOO, and this function's first version only
144
- * handled the newer one — the exact mistake this module exists to prevent,
145
- * committed inside the module itself. Caught only by running a real old binary:
146
- *
147
- * 2026.2.1 → "2026.2.1\n" (bare, verified with od -c)
148
- * 2026.7.1 → "OpenClaw 2026.7.1 (2d2ddc4)"
149
- *
150
- * A regex anchored on the word "OpenClaw" returned undefined for every 2026.2.x
151
- * machine. Behavior did not break — capabilities drive every decision here, which
152
- * is the point of the design — but the operator lost the version from the message
153
- * that tells them what was detected, and any future version-dependent reporting
154
- * would have silently had nothing to work with.
155
- *
156
- * Neither format can be assumed, so try the labelled form first and fall back to
157
- * a line that is nothing but a version. Both are matched by PATTERN rather than
158
- * by line position: a loaded Atbash plugin prints `[atbash] plugin loaded` and
159
- * `guard manager ready …` ahead of anything else on stdout.
160
- */
161
- function parseVersion(out) {
162
- const labelled = /OpenClaw\s+v?(\d[\w.-]*)(?:\s+\(([0-9a-f]{4,})\))?/i.exec(out);
163
- if (labelled)
164
- return { version: labelled[1], ...(labelled[2] ? { build: labelled[2] } : {}) };
165
- // A line holding only a version, e.g. 2026.2.1 — with an optional build hash,
166
- // since a future build could print that form too.
167
- const bare = /^[ \t]*v?(\d{4}\.\d+[\w.-]*)(?:[ \t]+\(([0-9a-f]{4,})\))?[ \t]*$/m.exec(out);
168
- if (bare)
169
- return { version: bare[1], ...(bare[2] ? { build: bare[2] } : {}) };
170
- return {};
171
- }
172
- /**
173
- * Inspect the OpenClaw on this machine. Read-only: probes `--version` and
174
- * `config --help`, writes nothing, and never throws.
175
- */
176
- function detectOpenclaw(binary = "openclaw") {
177
- const which = (0, child_process_1.spawnSync)(process.platform === "win32" ? "where" : "which", [binary], { encoding: "utf8" });
178
- const binPath = which.status === 0 ? (which.stdout ?? "").split(/\r?\n/)[0]?.trim() || undefined : undefined;
179
- if (!binPath)
180
- return { present: false, channel: "unknown", caps: { ...NO_CAPS } };
181
- const channel = detectChannel(binPath);
182
- const ver = probe(binary, ["--version"]);
183
- const parsedVersion = parseVersion(ver.out);
184
- const help = probe(binary, ["config", "--help"]);
185
- return {
186
- present: true,
187
- binPath,
188
- channel,
189
- ...parsedVersion,
190
- caps: help.out ? parseConfigCaps(help.out) : { ...NO_CAPS },
191
- };
192
- }
193
- function writeStrategy(rt) {
194
- return rt.caps.patch ? "openclaw-patch" : "hand-merge";
195
- }
196
- /**
197
- * Whether this OpenClaw is one we can wire at all, and what to say if not.
198
- *
199
- * DELIBERATELY PERMISSIVE. The floor is "there is an OpenClaw here", not "it has
200
- * the newest config commands", because 2026.2.x installs are real — the box every
201
- * CLI attestation was verified on is one — and the minimal entry-only config we
202
- * now write was confirmed to load there with the plugin reporting
203
- * `[atbash] plugin loaded` and `guard manager ready`. Narrowing support to the
204
- * versions we happen to run is the mistake that produced this whole module.
205
- *
206
- * So an older build is a DEGRADED path with an offer, never a refusal: it gets
207
- * the hand-merge, and the reason to upgrade is stated once, with the command for
208
- * its own channel. Refusal is reserved for "no OpenClaw at all", where there is
209
- * genuinely nothing to configure.
210
- */
211
- function supportStatus(rt) {
212
- if (!rt.present) {
213
- return {
214
- supported: false,
215
- degraded: false,
216
- message: "No OpenClaw found on this machine. Nothing was changed. If this agent runs on a different computer, run this command there instead — the plugin has to be installed where the agent actually runs.",
217
- };
218
- }
219
- const where = rt.version ? `OpenClaw ${rt.version}` : "This OpenClaw";
220
- if (writeStrategy(rt) === "openclaw-patch") {
221
- return { supported: true, degraded: false, message: `${where} — supported, and OpenClaw will validate the config change itself.` };
222
- }
223
- return {
224
- supported: true,
225
- degraded: true,
226
- message: `${where} is supported, but it predates OpenClaw's validated config commands (\`config patch\` / \`config validate\`), so Atbash has to edit the config file directly and cannot ask OpenClaw to check it first. Upgrading is optional and makes this step safer.`,
227
- upgrade: updateCommand(rt.channel),
228
- };
229
- }
230
- /**
231
- * Parse JSON out of a stream that also carries log lines.
232
- *
233
- * `openclaw plugins list --json` is clean on stdout, but a loaded plugin prints
234
- * its own startup lines — this project's plugin logs `[atbash] plugin loaded` and
235
- * `guard manager ready` — and those can interleave. So find the JSON rather than
236
- * assuming the output begins with it.
237
- */
238
- function parseLooseJson(text) {
239
- for (let start = text.indexOf("{"); start !== -1; start = text.indexOf("{", start + 1)) {
240
- // Walk to the matching brace instead of parsing "the rest of the output".
241
- //
242
- // ⚠️ Slicing to the end and parsing that is what the first version did, and
243
- // it failed on real 2026.2.1: its plugin log lines land on the SAME stream
244
- // AFTER the JSON object, so `JSON.parse` saw `{…}` followed by
245
- // `[plugins] [atbash] plugin loaded` and threw on the trailing text. The
246
- // whole verification then reported "unknown" for a plugin that was
247
- // demonstrably loaded — a false negative on the one check that says whether
248
- // an agent is governed.
249
- //
250
- // String-aware, because a description field legitimately contains braces:
251
- // this project's own plugin describes itself as mapping OpenClaw's hook, and
252
- // other plugins embed JSON snippets in their descriptions.
253
- let depth = 0;
254
- let inString = false;
255
- let escaped = false;
256
- for (let i = start; i < text.length; i++) {
257
- const ch = text[i];
258
- if (inString) {
259
- if (escaped)
260
- escaped = false;
261
- else if (ch === "\\")
262
- escaped = true;
263
- else if (ch === '"')
264
- inString = false;
265
- continue;
266
- }
267
- if (ch === '"')
268
- inString = true;
269
- else if (ch === "{")
270
- depth++;
271
- else if (ch === "}") {
272
- depth--;
273
- if (depth === 0) {
274
- try {
275
- return JSON.parse(text.slice(start, i + 1));
276
- }
277
- catch {
278
- break; // this `{` began something that is not JSON; try the next
279
- }
280
- }
281
- }
282
- }
283
- }
284
- return undefined;
285
- }
286
- /**
287
- * Ask OpenClaw whether the plugin actually loaded — the check setup never had.
288
- *
289
- * ⚠️ WHY THIS IS NOT OPTIONAL. Setup used to declare success on the strength of
290
- * having written what it meant to write. That is not the same claim: on the
291
- * machine that reported the original failure, the config entry existed and the
292
- * plugin did not, and OpenClaw said so plainly —
293
- *
294
- * plugins.entries.atbash-openclaw: plugin not found: atbash-openclaw
295
- * (stale config entry ignored; remove it from plugins config)
296
- *
297
- * — while setup reported the run as done. An owner reading that summary believes
298
- * their agent is governed. Nothing is more expensive than a false green on a
299
- * control boundary, so the last word belongs to OpenClaw, not to us.
300
- *
301
- * ⚠️ DO NOT check `hookCount` or `hookNames` here. They are 0 and empty for a
302
- * perfectly healthy plugin: hooks register when the GATEWAY starts, not when
303
- * `plugins list` runs. Verified against a plugin that was demonstrably loaded and
304
- * enforcing — it reports `hookCount: 0`. Treating that as a fault would fail
305
- * every correct install.
306
- */
307
- function verifyOpenclawPlugin(rt, opts) {
308
- const binary = opts.binary ?? "openclaw";
309
- if (!rt.present)
310
- return { state: "unknown", detail: "OpenClaw is not on this machine." };
311
- const r = (0, child_process_1.spawnSync)(binary, ["plugins", "list", "--json"], {
312
- encoding: "utf8",
313
- timeout: 120000,
314
- env: {
315
- ...process.env,
316
- ...(opts.configPath ? { OPENCLAW_CONFIG_PATH: path_1.default.resolve(opts.configPath) } : {}),
317
- ...(opts.home ? { HOME: opts.home } : {}),
318
- },
319
- });
320
- if (r.error)
321
- return { state: "unknown", detail: `\`${binary} plugins list\` could not run: ${r.error.message}` };
322
- const parsed = parseLooseJson(`${r.stdout ?? ""}${r.stderr ?? ""}`);
323
- const plugins = parsed?.plugins;
324
- // No parseable answer is UNKNOWN, never "missing" — reporting a governed agent
325
- // as ungoverned on a parse failure is its own kind of wrong.
326
- if (!Array.isArray(plugins)) {
327
- return { state: "unknown", detail: `Could not read \`${binary} plugins list --json\` output.` };
328
- }
329
- const rows = plugins;
330
- // Preference order, so a stood-down legacy entry cannot shadow the live one —
331
- // the same rule the dashboard scan needs for the same reason.
332
- const found = opts.entryIds
333
- .map((id) => rows.find((p) => typeof p.id === "string" && p.id === id))
334
- .filter((p) => Boolean(p));
335
- const row = found.find((p) => p.enabled !== false) ?? found[0];
336
- if (!row) {
337
- return {
338
- state: "missing",
339
- detail: `OpenClaw does not list the Atbash plugin (looked for: ${opts.entryIds.join(", ")}). The config may name a plugin that is not installed — OpenClaw calls that a stale entry and \`openclaw doctor --fix\` will delete it.`,
340
- };
341
- }
342
- const entry = typeof row.id === "string" ? row.id : undefined;
343
- const version = typeof row.version === "string" ? row.version : undefined;
344
- const missing = Array.isArray(row.dependencyStatus?.missing)
345
- ? row.dependencyStatus.missing.filter((m) => typeof m === "string")
346
- : [];
347
- const base = { entry, ...(version ? { version } : {}), ...(missing.length ? { missingDeps: missing } : {}) };
348
- if (row.enabled === false) {
349
- return { ...base, state: "disabled", detail: "The plugin is installed but switched off in the config, so it governs nothing." };
350
- }
351
- if (typeof row.status === "string" && row.status !== "loaded") {
352
- return { ...base, state: "load-error", detail: `OpenClaw reports its status as "${row.status}" rather than "loaded".` };
353
- }
354
- // A plugin whose required dependencies are absent loads and then fails at the
355
- // moment it matters — the SDK it signs with is one of them.
356
- if (row.dependencyStatus?.requiredInstalled === false || missing.length) {
357
- return {
358
- ...base,
359
- state: "load-error",
360
- detail: `OpenClaw reports required dependencies missing${missing.length ? `: ${missing.join(", ")}` : ""}. The plugin cannot reach the judge without them.`,
361
- };
362
- }
363
- // Right plugin, wrong build. Loads cleanly, hooks fire, and every judge call
364
- // fails because the agent does not exist on the chain that build targets.
365
- if (opts.expectedSpec && version) {
366
- const wantsDev = /@dev$/.test(opts.expectedSpec);
367
- const isDev = /-dev\./.test(version);
368
- if (wantsDev !== isDev) {
369
- return {
370
- ...base,
371
- state: "load-error",
372
- detail: `The installed build (${version}) does not match the deployment this agent was onboarded on (${opts.expectedSpec}). It will load and fire its hook, then fail every judge call because the agent does not exist on the chain that build targets.`,
373
- };
374
- }
375
- }
376
- return { ...base, state: "loaded" };
377
- }
378
- /**
379
- * Ask OpenClaw whether a config is valid, when it can answer.
380
- *
381
- * This is the PREFLIGHT the command never had. Setup merged into
382
- * `~/.openclaw/openclaw.json` without ever checking whether that file currently
383
- * loads — so on a machine whose config was already broken it added its own entry
384
- * to an unloadable file, and then its `openclaw plugins install` step died on the
385
- * pre-existing breakage. Reported as an Atbash failure; it was not one.
386
- *
387
- * `undefined` means "cannot tell" (no `validate` on this build) and must be
388
- * treated as such — not as a pass and not as a failure.
389
- */
390
- /**
391
- * Does THIS build accept `hooks` on a plugin entry?
392
- *
393
- * Asked of `openclaw config schema`, never inferred from a version number or
394
- * correlated with other capabilities — the whole point of this module.
395
- *
396
- * ⚠️ WHY THIS QUESTION EXISTS. `hooks` was ADDED, not removed: it is unknown on
397
- * 2026.2.1 and valid, optional and undeprecated on 2026.6.6 and 2026.7.1, where
398
- * an entry accepts `enabled | hooks | subagent | llm | config`. Because the entry
399
- * schema is `additionalProperties: false`, the same key is FATAL on the old build
400
- * and legitimate on the new one.
401
- *
402
- * Setup never writes `hooks` — nothing under it is required, and it gates hook
403
- * families this plugin does not use (it registers only `before_tool_call`). But
404
- * it also used to DELETE an operator's `hooks` block unconditionally, and on a
405
- * build that accepts the key that is destroying their configuration:
406
- * `hooks.timeoutMs` bounds this plugin's hook latency "without changing plugin
407
- * code", which is a deliberate operator choice, not damage to repair.
408
- *
409
- * `undefined` means "cannot tell" (no `config schema` on this build). The caller
410
- * must treat that as NOT supported and strip: keeping an unrecognized key makes
411
- * OpenClaw refuse the entire config, and losing a timeout knob is a far smaller
412
- * harm than a machine whose config will not load at all.
413
- */
414
- function pluginEntryAcceptsHooks(rt, binary = "openclaw") {
415
- if (!rt.present || !rt.caps.schema)
416
- return undefined;
417
- const r = (0, child_process_1.spawnSync)(binary, ["config", "schema"], {
418
- encoding: "utf8",
419
- timeout: 120000,
420
- maxBuffer: 64 * 1024 * 1024, // the schema is a few MB
421
- });
422
- if (r.error || r.status !== 0)
423
- return undefined;
424
- const parsed = parseLooseJson(`${r.stdout ?? ""}`);
425
- const entry = parsed?.properties?.plugins?.properties?.entries?.additionalProperties?.properties;
426
- if (!entry || typeof entry !== "object")
427
- return undefined;
428
- return Object.prototype.hasOwnProperty.call(entry, "hooks");
429
- }
430
- function validateConfig(rt, configPath, binary = "openclaw",
431
- /** The home being configured, when not the process's own — see verifyOpenclawPlugin. */
432
- home) {
433
- if (!rt.caps.validate)
434
- return undefined;
435
- const r = (0, child_process_1.spawnSync)(binary, ["config", "validate"], {
436
- encoding: "utf8",
437
- timeout: 60000,
438
- env: { ...process.env, OPENCLAW_CONFIG_PATH: path_1.default.resolve(configPath), ...(home ? { HOME: home } : {}) },
439
- });
440
- if (r.error)
441
- return undefined;
442
- const out = `${r.stdout ?? ""}${r.stderr ?? ""}`;
443
- // 2026.6.6/2026.7.1 print "Config valid: <path>" on success, and
444
- // "OpenClaw config is invalid: <path>" followed by `× <key>: <reason>` lines.
445
- const valid = r.status === 0 && /config valid/i.test(out);
446
- const problems = out
447
- .split(/\r?\n/)
448
- .filter((l) => /^\s*[×x✘]\s/.test(l))
449
- .map((l) => l.replace(/^\s*[×x✘]\s*/, "").trim())
450
- .join("\n");
451
- return { valid, problems: problems || (valid ? "" : out.trim()) };
452
- }
453
- //# sourceMappingURL=openclaw-runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openclaw-runtime.js","sourceRoot":"","sources":["../../src/shared/openclaw-runtime.ts"],"names":[],"mappings":"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"}