@amirtechai/xclaude 2026.3.25 → 2026.3.26
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/acp-cli-BJyvrvZg.js +2 -2
- package/dist/active-listener-CU_ylekC.js +1 -1
- package/dist/audit-extra.async-B4rRNZiG.js +5 -5
- package/dist/banner-DPmt57Uz.js +2 -2
- package/dist/control-ui/assets/index-3G8b0Cq-.js +1 -1
- package/dist/cron-cli-bEZ6ElMg.js +1 -1
- package/dist/daemon-install-CUiHaOdT.js +1 -1
- package/dist/directive-handling.shared-CQzigvOe.js +1 -1
- package/dist/docker-CXxET5gG.js +2 -2
- package/dist/extensions/matrix/index.js +2 -2
- package/dist/gateway-cli-DuhdO525.js +4 -4
- package/dist/helpers-BVhEa8wW.js +1 -1
- package/dist/hooks-cli-lIaN3kYr.js +4 -4
- package/dist/logs-cli-Bq3nBNR2.js +1 -1
- package/dist/method-scopes-DUy_ix8k.js +1 -1
- package/dist/onboard-0qd28_MN.js +1 -1
- package/dist/onboard-channels-_XyFK_3V.js +1 -1
- package/dist/pairing-challenge-D9O9L50g.js +1 -1
- package/dist/pi-embedded-B9OsuPCO.js +4 -4
- package/dist/plugins-update-command-Dv8ta0bg.js +3 -3
- package/dist/prompt-select-styled-CIEXnJnR.js +4 -4
- package/dist/provider-auth-guidance-TPAXVl-G.js +1 -1
- package/dist/register.maintenance-yXtR6WPz.js +1 -1
- package/dist/routes-qV4l4oA9.js +3 -3
- package/dist/sandbox-CwT9Xq6-.js +3 -3
- package/dist/server-DDdC0fti.js +1 -1
- package/dist/shared-CMqWqPGJ.js +2 -2
- package/dist/skills-C0FaD6iu.js +1 -1
- package/dist/skills-cli-D-35uKN9.js +2 -2
- package/dist/status-BNOiyDPY.js +1 -1
- package/dist/systemd-hints-DAFIxEJ1.js +2 -2
- package/dist/targets-CPrPEKB1.js +1 -1
- package/dist/tui-DThQ1HKV.js +2 -2
- package/dist/update-cli-WDt52NwJ.js +1 -1
- package/package.json +1 -1
- package/xclaw.mjs +2 -2
package/dist/acp-cli-BJyvrvZg.js
CHANGED
|
@@ -392,7 +392,7 @@ async function runAcpClientInteractive(opts = {}) {
|
|
|
392
392
|
input: process.stdin,
|
|
393
393
|
output: process.stdout
|
|
394
394
|
});
|
|
395
|
-
console.log("
|
|
395
|
+
console.log("XClaude ACP client");
|
|
396
396
|
console.log(`Session: ${sessionId}`);
|
|
397
397
|
console.log("Type a prompt, or \"exit\" to quit.\n");
|
|
398
398
|
const prompt = () => {
|
|
@@ -1938,7 +1938,7 @@ function parseArgs(args) {
|
|
|
1938
1938
|
return opts;
|
|
1939
1939
|
}
|
|
1940
1940
|
function printHelp() {
|
|
1941
|
-
console.log(`Usage:
|
|
1941
|
+
console.log(`Usage: xclaude acp [options]
|
|
1942
1942
|
|
|
1943
1943
|
Gateway-backed ACP server for IDE integration.
|
|
1944
1944
|
|
|
@@ -15,7 +15,7 @@ function resolveWebAccountId(accountId) {
|
|
|
15
15
|
function requireActiveWebListener(accountId) {
|
|
16
16
|
const id = resolveWebAccountId(accountId);
|
|
17
17
|
const listener = state.listeners.get(id) ?? null;
|
|
18
|
-
if (!listener) throw new Error(`No active WhatsApp Web listener (account: ${id}). Start the gateway, then link WhatsApp with: ${formatCliCommand(`
|
|
18
|
+
if (!listener) throw new Error(`No active WhatsApp Web listener (account: ${id}). Start the gateway, then link WhatsApp with: ${formatCliCommand(`xclaude channels login --channel whatsapp --account ${id}`)}.`);
|
|
19
19
|
return {
|
|
20
20
|
accountId: id,
|
|
21
21
|
listener
|
|
@@ -416,7 +416,7 @@ async function collectPluginsTrustFindings(params) {
|
|
|
416
416
|
severity: "warn",
|
|
417
417
|
title: "Plugin install records drift from installed package versions",
|
|
418
418
|
detail: `Detected plugin install metadata drift:\n${pluginVersionDrift.map((entry) => `- ${entry}`).join("\n")}`,
|
|
419
|
-
remediation: "Run `
|
|
419
|
+
remediation: "Run `xclaude plugins update --all` (or reinstall affected plugins) to refresh install metadata."
|
|
420
420
|
});
|
|
421
421
|
}
|
|
422
422
|
const hookInstalls = params.cfg.hooks?.internal?.installs ?? {};
|
|
@@ -451,7 +451,7 @@ async function collectPluginsTrustFindings(params) {
|
|
|
451
451
|
severity: "warn",
|
|
452
452
|
title: "Hook install records drift from installed package versions",
|
|
453
453
|
detail: `Detected hook install metadata drift:\n${hookVersionDrift.map((entry) => `- ${entry}`).join("\n")}`,
|
|
454
|
-
remediation: "Run `
|
|
454
|
+
remediation: "Run `xclaude hooks update --all` (or reinstall affected hooks) to refresh install metadata."
|
|
455
455
|
});
|
|
456
456
|
}
|
|
457
457
|
return findings;
|
|
@@ -691,7 +691,7 @@ async function collectPluginsCodeSafetyFindings(params) {
|
|
|
691
691
|
severity: "warn",
|
|
692
692
|
title: "Plugin extensions directory scan failed",
|
|
693
693
|
detail: `Static code scan could not list extensions directory: ${String(err)}`,
|
|
694
|
-
remediation: "Check file permissions and plugin layout, then rerun `
|
|
694
|
+
remediation: "Check file permissions and plugin layout, then rerun `xclaude security audit --deep`."
|
|
695
695
|
});
|
|
696
696
|
}
|
|
697
697
|
});
|
|
@@ -732,7 +732,7 @@ async function collectPluginsCodeSafetyFindings(params) {
|
|
|
732
732
|
severity: "warn",
|
|
733
733
|
title: `Plugin "${pluginName}" code scan failed`,
|
|
734
734
|
detail: `Static code scan could not complete: ${String(err)}`,
|
|
735
|
-
remediation: "Check file permissions and plugin layout, then rerun `
|
|
735
|
+
remediation: "Check file permissions and plugin layout, then rerun `xclaude security audit --deep`."
|
|
736
736
|
});
|
|
737
737
|
return null;
|
|
738
738
|
});
|
|
@@ -783,7 +783,7 @@ async function collectInstalledSkillsCodeSafetyFindings(params) {
|
|
|
783
783
|
severity: "warn",
|
|
784
784
|
title: `Skill "${skillName}" code scan failed`,
|
|
785
785
|
detail: `Static code scan could not complete for ${skillDir}: ${String(err)}`,
|
|
786
|
-
remediation: "Check file permissions and skill layout, then rerun `
|
|
786
|
+
remediation: "Check file permissions and skill layout, then rerun `xclaude security audit --deep`."
|
|
787
787
|
});
|
|
788
788
|
return null;
|
|
789
789
|
});
|
package/dist/banner-DPmt57Uz.js
CHANGED
|
@@ -15,7 +15,7 @@ function readCliBannerTaglineMode(env = process.env) {
|
|
|
15
15
|
}
|
|
16
16
|
//#endregion
|
|
17
17
|
//#region src/cli/tagline.ts
|
|
18
|
-
const DEFAULT_TAGLINE = "All your chats, one
|
|
18
|
+
const DEFAULT_TAGLINE = "All your chats, one XClaude.";
|
|
19
19
|
const HOLIDAY_TAGLINES = {
|
|
20
20
|
newYear: "New Year's Day: New year, new config—same old EADDRINUSE, but this time we resolve it like grown-ups.",
|
|
21
21
|
lunarNewYear: "Lunar New Year: May your builds be lucky, your branches prosperous, and your merge conflicts chased away with fireworks.",
|
|
@@ -301,7 +301,7 @@ function formatCliBannerLine(version, options = {}) {
|
|
|
301
301
|
mode: resolveTaglineMode(options)
|
|
302
302
|
});
|
|
303
303
|
const rich = options.richTty ?? isRich();
|
|
304
|
-
const title = "🦞
|
|
304
|
+
const title = "🦞 XClaude";
|
|
305
305
|
const columns = options.columns ?? process.stdout.columns ?? 120;
|
|
306
306
|
const plainBaseLine = `${title} ${version} (${commitLabel})`;
|
|
307
307
|
const plainFullLine = tagline ? `${plainBaseLine} — ${tagline}` : plainBaseLine;
|
|
@@ -4125,7 +4125,7 @@ ${JSON.stringify(e.issues,null,2)}</pre
|
|
|
4125
4125
|
</div>
|
|
4126
4126
|
`:n`
|
|
4127
4127
|
<div class="muted" style="margin-top: 8px">
|
|
4128
|
-
${P(`overview.auth.failed`,{command:`
|
|
4128
|
+
${P(`overview.auth.failed`,{command:`xclaude dashboard --no-open`})}
|
|
4129
4129
|
<div style="margin-top: 6px">
|
|
4130
4130
|
<a
|
|
4131
4131
|
class="session-link"
|
|
@@ -643,7 +643,7 @@ function registerCronSimpleCommands(cron) {
|
|
|
643
643
|
//#endregion
|
|
644
644
|
//#region src/cli/cron-cli/register.ts
|
|
645
645
|
function registerCronCli(program) {
|
|
646
|
-
const cron = program.command("cron").description("Manage cron jobs (via Gateway)").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/cron", "docs.xclaw.ai/cli/cron")}\n${theme.muted("Upgrade tip:")} run \`
|
|
646
|
+
const cron = program.command("cron").description("Manage cron jobs (via Gateway)").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/cron", "docs.xclaw.ai/cli/cron")}\n${theme.muted("Upgrade tip:")} run \`xclaude doctor --fix\` to normalize legacy cron job storage.\n`);
|
|
647
647
|
registerCronStatusCommand(cron);
|
|
648
648
|
registerCronListCommand(cron);
|
|
649
649
|
registerCronAddCommand(cron);
|
|
@@ -53,7 +53,7 @@ async function installGatewayDaemonNonInteractive(params) {
|
|
|
53
53
|
const daemonRuntimeRaw = opts.daemonRuntime ?? "node";
|
|
54
54
|
const systemdAvailable = process.platform === "linux" ? await isSystemdUserServiceAvailable() : true;
|
|
55
55
|
if (process.platform === "linux" && !systemdAvailable) {
|
|
56
|
-
runtime.log("Systemd user services are unavailable; skipping service install. Use a direct shell run (`
|
|
56
|
+
runtime.log("Systemd user services are unavailable; skipping service install. Use a direct shell run (`xclaude gateway run`) or rerun without --install-daemon on this session.");
|
|
57
57
|
return {
|
|
58
58
|
installed: false,
|
|
59
59
|
skippedReason: "systemd-user-unavailable"
|
|
@@ -146,7 +146,7 @@ function formatElevatedUnavailableText(params) {
|
|
|
146
146
|
const failures = params.failures ?? [];
|
|
147
147
|
if (failures.length > 0) lines.push(`Failing gates: ${failures.map((f) => `${f.gate} (${f.key})`).join(", ")}`);
|
|
148
148
|
else lines.push("Fix-it keys: tools.elevated.enabled, tools.elevated.allowFrom.<provider>, agents.list[].tools.elevated.*");
|
|
149
|
-
if (params.sessionKey) lines.push(`See: ${formatCliCommand(`
|
|
149
|
+
if (params.sessionKey) lines.push(`See: ${formatCliCommand(`xclaude sandbox explain --session ${params.sessionKey}`)}`);
|
|
150
150
|
return lines.join("\n");
|
|
151
151
|
}
|
|
152
152
|
//#endregion
|
package/dist/docker-CXxET5gG.js
CHANGED
|
@@ -1177,8 +1177,8 @@ async function readContainerConfigHash(containerName) {
|
|
|
1177
1177
|
return await readDockerContainerLabel(containerName, "xclaw.configHash");
|
|
1178
1178
|
}
|
|
1179
1179
|
function formatSandboxRecreateHint(params) {
|
|
1180
|
-
if (params.scope === "session") return formatCliCommand(`
|
|
1181
|
-
if (params.scope === "agent") return formatCliCommand(`
|
|
1180
|
+
if (params.scope === "session") return formatCliCommand(`xclaude sandbox recreate --session ${params.sessionKey}`);
|
|
1181
|
+
if (params.scope === "agent") return formatCliCommand(`xclaude sandbox recreate --agent ${resolveSandboxAgentId(params.sessionKey) ?? "main"}`);
|
|
1182
1182
|
return formatCliCommand("xclaw sandbox recreate --all");
|
|
1183
1183
|
}
|
|
1184
1184
|
async function ensureSandboxContainer(params) {
|
|
@@ -269,7 +269,7 @@ function resolveMatrixCliAccountId(accountId) {
|
|
|
269
269
|
}
|
|
270
270
|
function formatMatrixCliCommand(command, accountId) {
|
|
271
271
|
const normalizedAccountId = normalizeAccountId(accountId);
|
|
272
|
-
return `
|
|
272
|
+
return `xclaude matrix ${command}${normalizedAccountId === "default" ? "" : ` --account ${normalizedAccountId}`}`;
|
|
273
273
|
}
|
|
274
274
|
function printMatrixOwnDevices(devices) {
|
|
275
275
|
if (devices.length === 0) {
|
|
@@ -618,7 +618,7 @@ function registerMatrixCli(params) {
|
|
|
618
618
|
console.log(`Profile sync: name ${result.profile.displayNameUpdated ? "updated" : "unchanged"}, avatar ${result.profile.avatarUpdated ? "updated" : "unchanged"}`);
|
|
619
619
|
if (result.profile.convertedAvatarFromHttp && result.profile.resolvedAvatarUrl) console.log(`Avatar converted and saved as: ${result.profile.resolvedAvatarUrl}`);
|
|
620
620
|
}
|
|
621
|
-
const bindHint = `
|
|
621
|
+
const bindHint = `xclaude agents bind --agent <id> --bind matrix:${result.accountId}`;
|
|
622
622
|
console.log(`Bind this account to an agent: ${bindHint}`);
|
|
623
623
|
},
|
|
624
624
|
errorPrefix: "Account setup failed"
|
|
@@ -23941,7 +23941,7 @@ const GENERATED_BASE_CONFIG_SCHEMA = {
|
|
|
23941
23941
|
},
|
|
23942
23942
|
"gateway.nodes.allowCommands": {
|
|
23943
23943
|
label: "Gateway Node Allowlist (Extra Commands)",
|
|
23944
|
-
help: "Extra node.invoke commands to allow beyond the gateway defaults (array of command strings). Enabling dangerous commands here is a security-sensitive override and is flagged by `
|
|
23944
|
+
help: "Extra node.invoke commands to allow beyond the gateway defaults (array of command strings). Enabling dangerous commands here is a security-sensitive override and is flagged by `xclaude security audit`.",
|
|
23945
23945
|
tags: ["access", "network"]
|
|
23946
23946
|
},
|
|
23947
23947
|
"gateway.nodes.denyCommands": {
|
|
@@ -27182,7 +27182,7 @@ const GENERATED_BASE_CONFIG_SCHEMA = {
|
|
|
27182
27182
|
},
|
|
27183
27183
|
"plugins.installs": {
|
|
27184
27184
|
label: "Plugin Install Records",
|
|
27185
|
-
help: "CLI-managed install metadata (used by `
|
|
27185
|
+
help: "CLI-managed install metadata (used by `xclaude plugins update` to locate install sources).",
|
|
27186
27186
|
tags: ["advanced"]
|
|
27187
27187
|
},
|
|
27188
27188
|
"plugins.installs.*.source": {
|
|
@@ -39604,7 +39604,7 @@ function logGatewayStartup(params) {
|
|
|
39604
39604
|
if (params.isNixMode) params.log.info("gateway: running in Nix mode (config managed externally)");
|
|
39605
39605
|
const enabledDangerousFlags = collectEnabledInsecureOrDangerousFlags(params.cfg);
|
|
39606
39606
|
if (enabledDangerousFlags.length > 0) {
|
|
39607
|
-
const warning = `security warning: dangerous config flags enabled: ${enabledDangerousFlags.join(", ")}. Run \`
|
|
39607
|
+
const warning = `security warning: dangerous config flags enabled: ${enabledDangerousFlags.join(", ")}. Run \`xclaude security audit\`.`;
|
|
39608
39608
|
params.log.warn(warning);
|
|
39609
39609
|
}
|
|
39610
39610
|
}
|
|
@@ -41765,7 +41765,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
41765
41765
|
});
|
|
41766
41766
|
cfgAtStart = authBootstrap.cfg;
|
|
41767
41767
|
if (authBootstrap.generatedToken) if (authBootstrap.persistedGeneratedToken) log.info("Gateway auth token was missing. Generated a new token and saved it to config (gateway.auth.token).");
|
|
41768
|
-
else log.warn("Gateway auth token was missing. Generated a runtime token for this startup without changing config; restart will generate a different token. Persist one with `
|
|
41768
|
+
else log.warn("Gateway auth token was missing. Generated a runtime token for this startup without changing config; restart will generate a different token. Persist one with `xclaude config set gateway.auth.mode token` and `xclaude config set gateway.auth.token <token>`.");
|
|
41769
41769
|
const diagnosticsEnabled = isDiagnosticsEnabled(cfgAtStart);
|
|
41770
41770
|
if (diagnosticsEnabled) startDiagnosticHeartbeat();
|
|
41771
41771
|
setGatewaySigusr1RestartPolicy({ allowExternal: isRestartEnabled(cfgAtStart) });
|
package/dist/helpers-BVhEa8wW.js
CHANGED
|
@@ -6,7 +6,7 @@ function resolveChannelDefaultAccountId(params) {
|
|
|
6
6
|
return params.plugin.config.defaultAccountId?.(params.cfg) ?? accountIds[0] ?? "default";
|
|
7
7
|
}
|
|
8
8
|
function formatPairingApproveHint(channelId) {
|
|
9
|
-
return `Approve via: ${formatCliCommand(`
|
|
9
|
+
return `Approve via: ${formatCliCommand(`xclaude pairing list ${channelId}`)} / ${formatCliCommand(`xclaude pairing approve ${channelId} <code>`)}`;
|
|
10
10
|
}
|
|
11
11
|
function parseOptionalDelimitedEntries(value) {
|
|
12
12
|
if (!value?.trim()) return;
|
|
@@ -521,15 +521,15 @@ function registerHooksCli(program) {
|
|
|
521
521
|
hooks.command("disable <name>").description("Disable a hook").action(async (name) => runHooksCliAction(async () => {
|
|
522
522
|
await disableHook(name);
|
|
523
523
|
}));
|
|
524
|
-
hooks.command("install").description("Deprecated: install a hook pack via `
|
|
525
|
-
defaultRuntime.log(theme.warn("`
|
|
524
|
+
hooks.command("install").description("Deprecated: install a hook pack via `xclaude plugins install`").argument("<path-or-spec>", "Path to a hook pack or npm package spec").option("-l, --link", "Link a local path instead of copying", false).option("--pin", "Record npm installs as exact resolved <name>@<version>", false).action(async (raw, opts) => {
|
|
525
|
+
defaultRuntime.log(theme.warn("`xclaude hooks install` is deprecated; use `xclaude plugins install`."));
|
|
526
526
|
await runPluginInstallCommand({
|
|
527
527
|
raw,
|
|
528
528
|
opts
|
|
529
529
|
});
|
|
530
530
|
});
|
|
531
|
-
hooks.command("update").description("Deprecated: update hook packs via `
|
|
532
|
-
defaultRuntime.log(theme.warn("`
|
|
531
|
+
hooks.command("update").description("Deprecated: update hook packs via `xclaude plugins update`").argument("[id]", "Hook pack id (omit with --all)").option("--all", "Update all tracked hooks", false).option("--dry-run", "Show what would change without writing", false).action(async (id, opts) => {
|
|
532
|
+
defaultRuntime.log(theme.warn("`xclaude hooks update` is deprecated; use `xclaude plugins update`."));
|
|
533
533
|
await runPluginUpdateCommand({
|
|
534
534
|
id,
|
|
535
535
|
opts
|
|
@@ -121,7 +121,7 @@ function createLogWriters() {
|
|
|
121
121
|
beforeWrite: () => clearActiveProgressLine(),
|
|
122
122
|
onBrokenPipe: (err, stream) => {
|
|
123
123
|
const code = err.code ?? "EPIPE";
|
|
124
|
-
const message = `
|
|
124
|
+
const message = `xclaude logs: output ${stream === process.stdout ? "stdout" : "stderr"} closed (${code}). Stopping tail.`;
|
|
125
125
|
try {
|
|
126
126
|
clearActiveProgressLine();
|
|
127
127
|
process.stderr.write(`${message}\n`);
|
|
@@ -2064,7 +2064,7 @@ var GatewayClient = class {
|
|
|
2064
2064
|
try {
|
|
2065
2065
|
displayHost = new URL(url).hostname || url;
|
|
2066
2066
|
} catch {}
|
|
2067
|
-
const error = /* @__PURE__ */ new Error(`SECURITY ERROR: Cannot connect to "${displayHost}" over plaintext ws://. Both credentials and chat data would be exposed to network interception. Use wss:// for remote URLs. Safe defaults: keep gateway.bind=loopback and connect via SSH tunnel (ssh -N -L 18789:127.0.0.1:18789 user@gateway-host), or use Tailscale Serve/Funnel. ` + (allowPrivateWs ? "" : "Break-glass (trusted private networks only): set XCLAW_ALLOW_INSECURE_PRIVATE_WS=1. ") + "Run `
|
|
2067
|
+
const error = /* @__PURE__ */ new Error(`SECURITY ERROR: Cannot connect to "${displayHost}" over plaintext ws://. Both credentials and chat data would be exposed to network interception. Use wss:// for remote URLs. Safe defaults: keep gateway.bind=loopback and connect via SSH tunnel (ssh -N -L 18789:127.0.0.1:18789 user@gateway-host), or use Tailscale Serve/Funnel. ` + (allowPrivateWs ? "" : "Break-glass (trusted private networks only): set XCLAW_ALLOW_INSECURE_PRIVATE_WS=1. ") + "Run `xclaude doctor --fix` for guidance.");
|
|
2068
2068
|
this.opts.onConnectError?.(error);
|
|
2069
2069
|
return;
|
|
2070
2070
|
}
|
package/dist/onboard-0qd28_MN.js
CHANGED
|
@@ -380,7 +380,7 @@ async function runNonInteractiveLocalSetup(params) {
|
|
|
380
380
|
skippedReason: daemonInstall.skippedReason
|
|
381
381
|
},
|
|
382
382
|
daemonRuntime: daemonRuntimeRaw,
|
|
383
|
-
hints: daemonInstall.skippedReason === "systemd-user-unavailable" ? ["Fix: rerun without `--install-daemon` for one-shot setup, or enable a working user-systemd session and retry.", "If your auth profile uses env-backed refs, keep those env vars set in the shell that runs `
|
|
383
|
+
hints: daemonInstall.skippedReason === "systemd-user-unavailable" ? ["Fix: rerun without `--install-daemon` for one-shot setup, or enable a working user-systemd session and retry.", "If your auth profile uses env-backed refs, keep those env vars set in the shell that runs `xclaude gateway run` or `xclaude agent --local`."] : [`Run \`${formatCliCommand("xclaw gateway status --deep")}\` for more detail.`]
|
|
384
384
|
});
|
|
385
385
|
runtime.exit(1);
|
|
386
386
|
return;
|
|
@@ -837,7 +837,7 @@ async function maybeConfigureDmPolicies(params) {
|
|
|
837
837
|
};
|
|
838
838
|
await prompter.note([
|
|
839
839
|
"Default: pairing (unknown DMs get a pairing code).",
|
|
840
|
-
`Approve: ${formatCliCommand(`
|
|
840
|
+
`Approve: ${formatCliCommand(`xclaude pairing approve ${policy.channel} <code>`)}`,
|
|
841
841
|
`Allowlist DMs: ${policyKey}="allowlist" + ${allowFromKey} entries.`,
|
|
842
842
|
`Public DMs: ${policyKey}="open" + ${allowFromKey} includes "*".`,
|
|
843
843
|
"Multi-user DMs: run: " + formatCliCommand("xclaw config set session.dmScope \"per-channel-peer\"") + " (or \"per-account-channel-peer\" for multi-account channels) to isolate sessions.",
|
|
@@ -10,7 +10,7 @@ function buildPairingReply(params) {
|
|
|
10
10
|
`Pairing code: ${code}`,
|
|
11
11
|
"",
|
|
12
12
|
"Ask the bot owner to approve with:",
|
|
13
|
-
formatCliCommand(`
|
|
13
|
+
formatCliCommand(`xclaude pairing approve ${channel} ${code}`)
|
|
14
14
|
].join("\n");
|
|
15
15
|
}
|
|
16
16
|
//#endregion
|
|
@@ -95264,7 +95264,7 @@ function formatElevatedUnavailableMessage(params) {
|
|
|
95264
95264
|
lines.push("- tools.elevated.allowFrom.<provider>");
|
|
95265
95265
|
lines.push("- agents.list[].tools.elevated.enabled");
|
|
95266
95266
|
lines.push("- agents.list[].tools.elevated.allowFrom.<provider>");
|
|
95267
|
-
if (params.sessionKey) lines.push(`See: ${formatCliCommand(`
|
|
95267
|
+
if (params.sessionKey) lines.push(`See: ${formatCliCommand(`xclaude sandbox explain --session ${params.sessionKey}`)}`);
|
|
95268
95268
|
return lines.join("\n");
|
|
95269
95269
|
}
|
|
95270
95270
|
//#endregion
|
|
@@ -100372,7 +100372,7 @@ function buildSubagentSystemPrompt(params) {
|
|
|
100372
100372
|
"For ACP harness sessions (codex/claudecode/gemini), use `sessions_spawn` with `runtime: \"acp\"` (set `agentId` unless `acp.defaultAgent` is configured).",
|
|
100373
100373
|
"`agents_list` and `subagents` apply to XClaw sub-agents (`runtime: \"subagent\"`); ACP harness ids are controlled by `acp.allowedAgents`.",
|
|
100374
100374
|
"Do not ask users to run slash commands or CLI when `sessions_spawn` can do it directly.",
|
|
100375
|
-
"Do not use `exec` (`
|
|
100375
|
+
"Do not use `exec` (`xclaude ...`, `acpx ...`) to spawn ACP sessions.",
|
|
100376
100376
|
"Use `subagents` only for XClaw subagents (`runtime: \"subagent\"`).",
|
|
100377
100377
|
"Subagent results auto-announce back to you; ACP sessions continue in their bound thread.",
|
|
100378
100378
|
"Avoid polling loops; spawn, orchestrate, and synthesize results."
|
|
@@ -115552,7 +115552,7 @@ function buildDocsSection(params) {
|
|
|
115552
115552
|
"Community: https://discord.com/invite/clawd",
|
|
115553
115553
|
"Find new skills: https://clawhub.com",
|
|
115554
115554
|
"For XClaw behavior, commands, config, or architecture: consult local docs first.",
|
|
115555
|
-
"When diagnosing issues, run `
|
|
115555
|
+
"When diagnosing issues, run `xclaude status` yourself when possible; only ask the user if you lack access (e.g., sandboxed).",
|
|
115556
115556
|
""
|
|
115557
115557
|
];
|
|
115558
115558
|
}
|
|
@@ -115752,7 +115752,7 @@ function buildAgentSystemPrompt(params) {
|
|
|
115752
115752
|
"- xclaw gateway start",
|
|
115753
115753
|
"- xclaw gateway stop",
|
|
115754
115754
|
"- xclaw gateway restart",
|
|
115755
|
-
"If unsure, ask the user to run `
|
|
115755
|
+
"If unsure, ask the user to run `xclaude help` (or `xclaude gateway --help`) and paste the output.",
|
|
115756
115756
|
"",
|
|
115757
115757
|
...skillsSection,
|
|
115758
115758
|
...memorySection,
|
|
@@ -442,11 +442,11 @@ function buildInvalidPluginInstallConfigError(message) {
|
|
|
442
442
|
return error;
|
|
443
443
|
}
|
|
444
444
|
async function loadConfigFromSnapshotForInstall(request) {
|
|
445
|
-
if (resolvePluginInstallInvalidConfigPolicy(request) !== "recover-matrix-only") throw buildInvalidPluginInstallConfigError("Config invalid; run `
|
|
445
|
+
if (resolvePluginInstallInvalidConfigPolicy(request) !== "recover-matrix-only") throw buildInvalidPluginInstallConfigError("Config invalid; run `xclaude doctor --fix` before installing plugins.");
|
|
446
446
|
const snapshot = await readConfigFileSnapshot();
|
|
447
447
|
const parsed = snapshot.parsed ?? {};
|
|
448
|
-
if (!snapshot.exists || Object.keys(parsed).length === 0) throw buildInvalidPluginInstallConfigError("Config file could not be parsed; run `
|
|
449
|
-
if (snapshot.legacyIssues.length > 0 || snapshot.issues.length === 0 || snapshot.issues.some((issue) => !isAllowedMatrixRecoveryIssue(issue))) throw buildInvalidPluginInstallConfigError("Config invalid outside the Matrix upgrade recovery path; run `
|
|
448
|
+
if (!snapshot.exists || Object.keys(parsed).length === 0) throw buildInvalidPluginInstallConfigError("Config file could not be parsed; run `xclaude doctor` to repair it.");
|
|
449
|
+
if (snapshot.legacyIssues.length > 0 || snapshot.issues.length === 0 || snapshot.issues.some((issue) => !isAllowedMatrixRecoveryIssue(issue))) throw buildInvalidPluginInstallConfigError("Config invalid outside the Matrix upgrade recovery path; run `xclaude doctor --fix` before reinstalling Matrix.");
|
|
450
450
|
return (await cleanStaleMatrixPluginConfig(snapshot.config)).config;
|
|
451
451
|
}
|
|
452
452
|
async function loadConfigForInstall(request) {
|
|
@@ -3368,7 +3368,7 @@ function noteSourceInstallIssues(root) {
|
|
|
3368
3368
|
//#region src/commands/doctor-memory-search.ts
|
|
3369
3369
|
/**
|
|
3370
3370
|
* Check whether memory search has a usable embedding provider.
|
|
3371
|
-
* Runs as part of `
|
|
3371
|
+
* Runs as part of `xclaude doctor` — config-only, no network calls.
|
|
3372
3372
|
*/
|
|
3373
3373
|
async function noteMemorySearchHealth(cfg, opts) {
|
|
3374
3374
|
const agentId = resolveDefaultAgentId(cfg);
|
|
@@ -4443,9 +4443,9 @@ async function noteStateIntegrity(cfg, prompter, configPath) {
|
|
|
4443
4443
|
});
|
|
4444
4444
|
if (missing.length > 0) warnings.push([
|
|
4445
4445
|
`- ${missing.length}/${recentTranscriptCandidates.length} recent sessions are missing transcripts.`,
|
|
4446
|
-
` Verify sessions in store: ${formatCliCommand(`
|
|
4447
|
-
` Preview cleanup impact: ${formatCliCommand(`
|
|
4448
|
-
` Prune missing entries: ${formatCliCommand(`
|
|
4446
|
+
` Verify sessions in store: ${formatCliCommand(`xclaude sessions --store "${absoluteStorePath}"`)}`,
|
|
4447
|
+
` Preview cleanup impact: ${formatCliCommand(`xclaude sessions cleanup --store "${absoluteStorePath}" --dry-run`)}`,
|
|
4448
|
+
` Prune missing entries: ${formatCliCommand(`xclaude sessions cleanup --store "${absoluteStorePath}" --enforce --fix-missing`)}`
|
|
4449
4449
|
].join("\n"));
|
|
4450
4450
|
const mainEntry = store[resolveMainSessionKey(cfg)];
|
|
4451
4451
|
if (mainEntry?.sessionId) {
|
|
@@ -17,7 +17,7 @@ function resolveProviderAuthLoginCommand(params) {
|
|
|
17
17
|
bundledProviderVitestCompat: true
|
|
18
18
|
}).find((candidate) => matchesProviderId(candidate, params.provider));
|
|
19
19
|
if (!provider || provider.auth.length === 0) return;
|
|
20
|
-
return formatCliCommand(`
|
|
20
|
+
return formatCliCommand(`xclaude models auth login --provider ${provider.id}`);
|
|
21
21
|
}
|
|
22
22
|
function buildProviderAuthRecoveryHint(params) {
|
|
23
23
|
const loginCommand = resolveProviderAuthLoginCommand(params);
|
|
@@ -297,7 +297,7 @@ async function dashboardCommand(runtime = defaultRuntime, options = {}) {
|
|
|
297
297
|
if (resolvedToken.tokenSecretRefConfigured && token) runtime.log("Token auto-auth is disabled for SecretRef-managed gateway.auth.token; use your external token source if prompted.");
|
|
298
298
|
if (resolvedToken.unresolvedRefReason) {
|
|
299
299
|
runtime.log(`Token auto-auth unavailable: ${resolvedToken.unresolvedRefReason}`);
|
|
300
|
-
runtime.log("Set XCLAW_GATEWAY_TOKEN in this shell or resolve your secret provider, then rerun `
|
|
300
|
+
runtime.log("Set XCLAW_GATEWAY_TOKEN in this shell or resolve your secret provider, then rerun `xclaude dashboard`.");
|
|
301
301
|
}
|
|
302
302
|
const copied = await copyToClipboard(dashboardUrl).catch(() => false);
|
|
303
303
|
runtime.log(copied ? "Copied to clipboard." : "Copy to clipboard unavailable.");
|
package/dist/routes-qV4l4oA9.js
CHANGED
|
@@ -3871,12 +3871,12 @@ async function launchXClawChrome(resolved, profile) {
|
|
|
3871
3871
|
});
|
|
3872
3872
|
log.info(`🦞 xclaw browser profile decorated (${profile.color})`);
|
|
3873
3873
|
} catch (err) {
|
|
3874
|
-
log.warn(`
|
|
3874
|
+
log.warn(`xclaude browser profile decoration failed: ${String(err)}`);
|
|
3875
3875
|
}
|
|
3876
3876
|
try {
|
|
3877
3877
|
ensureProfileCleanExit(userDataDir);
|
|
3878
3878
|
} catch (err) {
|
|
3879
|
-
log.warn(`
|
|
3879
|
+
log.warn(`xclaude browser clean-exit prefs failed: ${String(err)}`);
|
|
3880
3880
|
}
|
|
3881
3881
|
const proc = spawnOnce();
|
|
3882
3882
|
const stderrChunks = [];
|
|
@@ -4629,7 +4629,7 @@ async function stopKnownBrowserProfiles(params) {
|
|
|
4629
4629
|
await ctx.forProfile(name).stopRunningBrowser();
|
|
4630
4630
|
} catch {}
|
|
4631
4631
|
} catch (err) {
|
|
4632
|
-
params.onWarn(`
|
|
4632
|
+
params.onWarn(`xclaude browser stop failed: ${String(err)}`);
|
|
4633
4633
|
}
|
|
4634
4634
|
}
|
|
4635
4635
|
//#endregion
|
package/dist/sandbox-CwT9Xq6-.js
CHANGED
|
@@ -96,7 +96,7 @@ function formatSandboxToolPolicyBlockedMessage(params) {
|
|
|
96
96
|
lines.push(`- agents.defaults.sandbox.mode=off (disable sandbox)`);
|
|
97
97
|
for (const fix of fixes) lines.push(`- ${fix}`);
|
|
98
98
|
if (runtime.mode === "non-main") lines.push(`- Use main session key (direct): ${runtime.mainSessionKey}`);
|
|
99
|
-
lines.push(`- See: ${formatCliCommand(`
|
|
99
|
+
lines.push(`- See: ${formatCliCommand(`xclaude sandbox explain --session ${runtime.sessionKey}`)}`);
|
|
100
100
|
return lines.join("\n");
|
|
101
101
|
}
|
|
102
102
|
//#endregion
|
|
@@ -1790,8 +1790,8 @@ async function ensureSandboxBrowser(params) {
|
|
|
1790
1790
|
const lastUsedAtMs = registryEntry?.lastUsedAtMs;
|
|
1791
1791
|
if (running && (typeof lastUsedAtMs !== "number" || now - lastUsedAtMs < HOT_BROWSER_WINDOW_MS)) {
|
|
1792
1792
|
const hint = (() => {
|
|
1793
|
-
if (params.cfg.scope === "session") return `
|
|
1794
|
-
if (params.cfg.scope === "agent") return `
|
|
1793
|
+
if (params.cfg.scope === "session") return `xclaude sandbox recreate --browser --session ${params.scopeKey}`;
|
|
1794
|
+
if (params.cfg.scope === "agent") return `xclaude sandbox recreate --browser --agent ${resolveSandboxAgentId(params.scopeKey) ?? "main"}`;
|
|
1795
1795
|
return "xclaw sandbox recreate --browser --all";
|
|
1796
1796
|
})();
|
|
1797
1797
|
defaultRuntime.log(`Sandbox browser config changed for ${containerName} (recently used). Recreate to apply: ${hint}`);
|
package/dist/server-DDdC0fti.js
CHANGED
|
@@ -62,7 +62,7 @@ async function startBrowserControlServerFromConfig() {
|
|
|
62
62
|
const s = app.listen(port, "127.0.0.1", () => resolve(s));
|
|
63
63
|
s.once("error", reject);
|
|
64
64
|
}).catch((err) => {
|
|
65
|
-
logServer.error(`
|
|
65
|
+
logServer.error(`xclaude browser server failed to bind 127.0.0.1:${port}: ${String(err)}`);
|
|
66
66
|
return null;
|
|
67
67
|
});
|
|
68
68
|
if (!server) return null;
|
package/dist/shared-CMqWqPGJ.js
CHANGED
|
@@ -139,8 +139,8 @@ function buildTelegramDmAccessWarningLines(accountId) {
|
|
|
139
139
|
"Your bot is using DM policy: pairing.",
|
|
140
140
|
"Any Telegram user who discovers the bot can send pairing requests.",
|
|
141
141
|
"For private use, configure an allowlist with your Telegram user id:",
|
|
142
|
-
" " + formatCliCommand(`
|
|
143
|
-
" " + formatCliCommand(`
|
|
142
|
+
" " + formatCliCommand(`xclaude config set ${configBase}.dmPolicy "allowlist"`),
|
|
143
|
+
" " + formatCliCommand(`xclaude config set ${configBase}.allowFrom '["YOUR_USER_ID"]'`),
|
|
144
144
|
`Docs: ${formatDocsLink("/channels/pairing", "channels/pairing")}`
|
|
145
145
|
];
|
|
146
146
|
}
|
package/dist/skills-C0FaD6iu.js
CHANGED
|
@@ -664,7 +664,7 @@ function resolveWorkspaceSkillPromptState(workspaceDir, opts) {
|
|
|
664
664
|
eligible,
|
|
665
665
|
prompt: [
|
|
666
666
|
remoteNote,
|
|
667
|
-
truncated ? `⚠️ Skills truncated: included ${skillsForPrompt.length} of ${resolvedSkills.length}${compact ? " (compact format, descriptions omitted)" : ""}. Run \`
|
|
667
|
+
truncated ? `⚠️ Skills truncated: included ${skillsForPrompt.length} of ${resolvedSkills.length}${compact ? " (compact format, descriptions omitted)" : ""}. Run \`xclaude skills check\` to audit.` : compact ? `⚠️ Skills catalog using compact format (descriptions omitted). Run \`xclaude skills check\` to audit.` : "",
|
|
668
668
|
compact ? formatSkillsCompact(skillsForPrompt) : formatSkillsForPrompt(skillsForPrompt)
|
|
669
669
|
].filter(Boolean).join("\n"),
|
|
670
670
|
resolvedSkills
|
|
@@ -21,7 +21,7 @@ import { i as updateSkillsFromClawHub, n as readTrackedClawHubSkillSlugs, r as s
|
|
|
21
21
|
//#region src/cli/skills-cli.format.ts
|
|
22
22
|
function appendClawHubHint(output, json) {
|
|
23
23
|
if (json) return output;
|
|
24
|
-
return `${output}\n\nTip: use \`
|
|
24
|
+
return `${output}\n\nTip: use \`xclaude skills search\`, \`xclaude skills install\`, and \`xclaude skills update\` for ClawHub-backed skills.`;
|
|
25
25
|
}
|
|
26
26
|
function formatSkillStatus(skill) {
|
|
27
27
|
if (skill.eligible) return theme.success("✓ ready");
|
|
@@ -198,7 +198,7 @@ function formatSkillInfo(report, skillName, opts) {
|
|
|
198
198
|
lines.push(theme.heading("API key setup:"));
|
|
199
199
|
if (safeHomepage) lines.push(` Get your key: ${safeHomepage}`);
|
|
200
200
|
lines.push(` Save via UI: ${theme.muted("Control UI → Skills → ")}${safeName}${theme.muted(" → Save key")}`);
|
|
201
|
-
lines.push(` Save via CLI: ${formatCliCommand(`
|
|
201
|
+
lines.push(` Save via CLI: ${formatCliCommand(`xclaude config set skills.entries.${safeSkillKey}.apiKey YOUR_KEY`)}`);
|
|
202
202
|
lines.push(` Stored in: ${theme.muted("~/.xclaw/xclaw.json")} ${theme.muted(`(skills.entries.${safeSkillKey}.apiKey)`)}`);
|
|
203
203
|
}
|
|
204
204
|
return appendClawHubHint(lines.join("\n"), opts.json);
|
package/dist/status-BNOiyDPY.js
CHANGED
|
@@ -1367,7 +1367,7 @@ async function statusCommand(opts, runtime) {
|
|
|
1367
1367
|
if (pairingRecovery) {
|
|
1368
1368
|
runtime.log("");
|
|
1369
1369
|
runtime.log(theme.warn("Gateway pairing approval required."));
|
|
1370
|
-
if (pairingRecovery.requestId) runtime.log(theme.muted(`Recovery: ${formatCliCommand(`
|
|
1370
|
+
if (pairingRecovery.requestId) runtime.log(theme.muted(`Recovery: ${formatCliCommand(`xclaude devices approve ${pairingRecovery.requestId}`)}`));
|
|
1371
1371
|
runtime.log(theme.muted(`Fallback: ${formatCliCommand("xclaw devices approve --latest")}`));
|
|
1372
1372
|
runtime.log(theme.muted(`Inspect: ${formatCliCommand("xclaw devices list")}`));
|
|
1373
1373
|
}
|
|
@@ -173,7 +173,7 @@ function auditGatewayToken(command, issues, expectedGatewayToken) {
|
|
|
173
173
|
issues.push({
|
|
174
174
|
code: SERVICE_AUDIT_CODES.gatewayTokenEmbedded,
|
|
175
175
|
message: "Gateway service embeds XCLAW_GATEWAY_TOKEN and should be reinstalled.",
|
|
176
|
-
detail: "Run `
|
|
176
|
+
detail: "Run `xclaude gateway install --force` to remove embedded service token.",
|
|
177
177
|
level: "recommended"
|
|
178
178
|
});
|
|
179
179
|
const expectedToken = expectedGatewayToken?.trim();
|
|
@@ -277,7 +277,7 @@ function checkTokenDrift(params) {
|
|
|
277
277
|
if (configToken && serviceToken !== configToken) return {
|
|
278
278
|
code: SERVICE_AUDIT_CODES.gatewayTokenDrift,
|
|
279
279
|
message: "Config token differs from service token. The daemon will use the old token after restart.",
|
|
280
|
-
detail: "Run `
|
|
280
|
+
detail: "Run `xclaude gateway install --force` to sync the token.",
|
|
281
281
|
level: "recommended"
|
|
282
282
|
};
|
|
283
283
|
return null;
|
package/dist/targets-CPrPEKB1.js
CHANGED
|
@@ -474,7 +474,7 @@ function resolveAcpInstallCommandHint(cfg) {
|
|
|
474
474
|
const backendId = resolveConfiguredAcpBackendId(cfg).toLowerCase();
|
|
475
475
|
if (backendId === "acpx") {
|
|
476
476
|
const localPath = path.resolve(process.cwd(), "extensions/acpx");
|
|
477
|
-
if (existsSync(localPath)) return `
|
|
477
|
+
if (existsSync(localPath)) return `xclaude plugins install ${localPath}`;
|
|
478
478
|
return "xclaw plugins install acpx";
|
|
479
479
|
}
|
|
480
480
|
return `Install and enable the plugin that provides ACP backend "${backendId}".`;
|
package/dist/tui-DThQ1HKV.js
CHANGED
|
@@ -3206,7 +3206,7 @@ function resolveGatewayDisconnectState(reason) {
|
|
|
3206
3206
|
if (/pairing required/i.test(reasonLabel)) return {
|
|
3207
3207
|
connectionStatus: `gateway disconnected: ${reasonLabel}`,
|
|
3208
3208
|
activityStatus: "pairing required: run xclaw devices list",
|
|
3209
|
-
pairingHint: "Pairing required. Run `
|
|
3209
|
+
pairingHint: "Pairing required. Run `xclaude devices list`, approve your request ID, then reconnect."
|
|
3210
3210
|
};
|
|
3211
3211
|
return {
|
|
3212
3212
|
connectionStatus: `gateway disconnected: ${reasonLabel}`,
|
|
@@ -3492,7 +3492,7 @@ async function runTui(opts) {
|
|
|
3492
3492
|
const updateHeader = () => {
|
|
3493
3493
|
const sessionLabel = formatSessionKey(currentSessionKey);
|
|
3494
3494
|
const agentLabel = formatAgentLabel(currentAgentId);
|
|
3495
|
-
header.setText(theme.header(`
|
|
3495
|
+
header.setText(theme.header(`xclaude tui - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`));
|
|
3496
3496
|
};
|
|
3497
3497
|
const busyStates = new Set([
|
|
3498
3498
|
"sending",
|
|
@@ -1431,7 +1431,7 @@ async function updateCommand(opts) {
|
|
|
1431
1431
|
//#region src/cli/update-cli/wizard.ts
|
|
1432
1432
|
async function updateWizardCommand(opts = {}) {
|
|
1433
1433
|
if (!process.stdin.isTTY) {
|
|
1434
|
-
defaultRuntime.error("Update wizard requires a TTY. Use `
|
|
1434
|
+
defaultRuntime.error("Update wizard requires a TTY. Use `xclaude update --channel <stable|beta|dev>` instead.");
|
|
1435
1435
|
defaultRuntime.exit(1);
|
|
1436
1436
|
return;
|
|
1437
1437
|
}
|
package/package.json
CHANGED
package/xclaw.mjs
CHANGED
|
@@ -109,7 +109,7 @@ const exists = async (specifier) => {
|
|
|
109
109
|
};
|
|
110
110
|
|
|
111
111
|
const buildMissingEntryErrorMessage = async () => {
|
|
112
|
-
const lines = ["
|
|
112
|
+
const lines = ["xclaude: missing dist/entry.(m)js (build output)."];
|
|
113
113
|
if (!(await exists("./src/entry.ts"))) {
|
|
114
114
|
return lines.join("\n");
|
|
115
115
|
}
|
|
@@ -121,7 +121,7 @@ const buildMissingEntryErrorMessage = async () => {
|
|
|
121
121
|
lines.push(
|
|
122
122
|
"For pinned GitHub installs, use `npm install -g github:xclaw/xclaw#<ref>` instead of a raw `/archive/<ref>.tar.gz` URL.",
|
|
123
123
|
);
|
|
124
|
-
lines.push("For releases, use `npm install -g
|
|
124
|
+
lines.push("For releases, use `npm install -g @amirtechai/xclaude@latest`.");
|
|
125
125
|
return lines.join("\n");
|
|
126
126
|
};
|
|
127
127
|
|