@rethinkingstudio/clawpilot 1.0.10 → 1.0.12

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.
@@ -2,6 +2,7 @@ import { writeFileSync, mkdirSync, existsSync, unlinkSync } from "fs";
2
2
  import { join } from "path";
3
3
  import { homedir } from "os";
4
4
  import { execSync } from "child_process";
5
+ import { t } from "../i18n/index.js";
5
6
  const PLIST_LABEL = "com.rethinkingstudio.clawpilot";
6
7
  const PLIST_LABEL_OLD = "com.rethinkingstudio.clawai"; // legacy, cleaned up by stop
7
8
  const LAUNCH_AGENTS_DIR = join(homedir(), "Library", "LaunchAgents");
@@ -50,32 +51,32 @@ ${argsXml}
50
51
  writeFileSync(PLIST_PATH, plistContent, "utf-8");
51
52
  try {
52
53
  execSync(`launchctl load -w "${PLIST_PATH}"`, { stdio: "inherit" });
53
- console.log(`Service installed and started: ${PLIST_LABEL}`);
54
+ console.log(t("install.serviceStarted", PLIST_LABEL));
54
55
  }
55
56
  catch (err) {
56
- console.error("Failed to load launchd service:", err);
57
- console.log(`Plist written to: ${PLIST_PATH}`);
58
- console.log(`Run manually: launchctl load -w "${PLIST_PATH}"`);
57
+ console.error(t("install.loadFailed"), err);
58
+ console.log(t("install.plistWritten", PLIST_PATH));
59
+ console.log(t("install.loadManually", PLIST_PATH));
59
60
  }
60
61
  }
61
62
  export function restartCommand() {
62
- console.log("Restarting relay service…");
63
+ console.log(t("install.restarting"));
63
64
  installCommand();
64
65
  }
65
66
  export function uninstallCommand() {
66
67
  try {
67
68
  execSync(`launchctl unload -w "${PLIST_PATH}"`, { stdio: "inherit" });
68
- console.log(`Service stopped: ${PLIST_LABEL}`);
69
+ console.log(t("install.serviceStopped", PLIST_LABEL));
69
70
  }
70
71
  catch {
71
72
  // May fail if not loaded
72
73
  }
73
74
  try {
74
75
  execSync(`rm -f "${PLIST_PATH}"`, { stdio: "inherit" });
75
- console.log(`Plist removed: ${PLIST_PATH}`);
76
+ console.log(t("install.plistRemoved", PLIST_PATH));
76
77
  }
77
78
  catch (err) {
78
- console.error("Failed to remove plist:", err);
79
+ console.error(t("install.removePlistFailed"), err);
79
80
  }
80
81
  }
81
82
  /** Stop relay client and remove from launchd (also cleans up legacy clawai service). */
@@ -84,7 +85,7 @@ export function stopCommand() {
84
85
  // Stop + remove new label
85
86
  try {
86
87
  execSync(`launchctl unload -w "${PLIST_PATH}"`, { stdio: "pipe" });
87
- console.log(`Stopped: ${PLIST_LABEL}`);
88
+ console.log(t("install.stopped", PLIST_LABEL));
88
89
  stopped = true;
89
90
  }
90
91
  catch {
@@ -97,7 +98,7 @@ export function stopCommand() {
97
98
  // Stop + remove legacy clawai label
98
99
  try {
99
100
  execSync(`launchctl unload -w "${PLIST_PATH_OLD}"`, { stdio: "pipe" });
100
- console.log(`Stopped: ${PLIST_LABEL_OLD}`);
101
+ console.log(t("install.stopped", PLIST_LABEL_OLD));
101
102
  stopped = true;
102
103
  }
103
104
  catch {
@@ -108,10 +109,10 @@ export function stopCommand() {
108
109
  }
109
110
  catch { /* ignore */ }
110
111
  if (stopped) {
111
- console.log("Relay client stopped and removed from launchd.");
112
+ console.log(t("install.stoppedAndRemoved"));
112
113
  }
113
114
  else {
114
- console.log("No running relay service found.");
115
+ console.log(t("install.noService"));
115
116
  }
116
117
  }
117
118
  /** Clear saved config and stop the service — use this when switching servers or on auth errors. */
@@ -123,15 +124,15 @@ export function resetCommand() {
123
124
  if (existsSync(configPath)) {
124
125
  try {
125
126
  unlinkSync(configPath);
126
- console.log(`Config removed: ${configPath}`);
127
+ console.log(t("install.configRemoved", configPath));
127
128
  }
128
129
  catch (err) {
129
- console.error("Failed to remove config:", err);
130
+ console.error(t("install.removeConfigFailed"), err);
130
131
  }
131
132
  }
132
133
  else {
133
- console.log("No config file found.");
134
+ console.log(t("install.noConfig"));
134
135
  }
135
- console.log("\nReset complete. Run `clawpilot pair` to re-register.");
136
+ console.log(t("install.resetComplete"));
136
137
  }
137
138
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -59,7 +59,7 @@ function restoreConfig() {
59
59
  */
60
60
  function watchSkill() {
61
61
  try {
62
- execSync("openclaw config set skills.load.watch true", { stdio: "pipe" });
62
+ loginShell("openclaw config set skills.load.watch true");
63
63
  console.log("[clawpilot] skills.load.watch set to true");
64
64
  return { ok: true, payload: { message: "skills.load.watch enabled" } };
65
65
  }
@@ -76,12 +76,19 @@ function execErrorOutput(err) {
76
76
  return `${out}\n${errStr}`;
77
77
  return out || errStr;
78
78
  }
79
+ /**
80
+ * Runs a shell command via login bash so that PATH includes homebrew / user-installed bins.
81
+ * The command string must not contain user-controlled input (hardcoded calls only).
82
+ */
83
+ function loginShell(cmd) {
84
+ return execSync(`/bin/bash -lc '${cmd}'`, { stdio: "pipe" });
85
+ }
79
86
  /**
80
87
  * Runs openclaw doctor to check system health.
81
88
  */
82
89
  function runDoctor() {
83
90
  try {
84
- const output = execSync("openclaw doctor", { stdio: "pipe" }).toString();
91
+ const output = loginShell("openclaw doctor").toString();
85
92
  console.log("[clawpilot] doctor completed");
86
93
  return { ok: true, payload: { output } };
87
94
  }
@@ -130,7 +137,7 @@ function readLogs() {
130
137
  */
131
138
  function restartGateway() {
132
139
  try {
133
- const output = execSync("openclaw gateway restart", { stdio: "pipe" }).toString();
140
+ const output = loginShell("openclaw gateway restart").toString();
134
141
  console.log("[clawpilot] gateway restarted");
135
142
  return { ok: true, payload: { output: output || "Gateway restarted successfully." } };
136
143
  }
@@ -146,7 +153,7 @@ function restartGateway() {
146
153
  */
147
154
  function updateOpenclaw() {
148
155
  try {
149
- const output = execSync("openclaw update", { stdio: "pipe" }).toString();
156
+ const output = loginShell("openclaw update").toString();
150
157
  console.log("[clawpilot] openclaw updated");
151
158
  return { ok: true, payload: { output: output || "openclaw updated successfully." } };
152
159
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-handlers.js","sourceRoot":"","sources":["../../src/commands/local-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-handlers.js","sourceRoot":"","sources":["../../src/commands/local-handlers.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ function getDisplayName() {
11
11
  import { configExists, readConfig, writeConfig } from "../config/config.js";
12
12
  import { installCommand } from "./install.js";
13
13
  import qrcodeTerminal from "qrcode-terminal";
14
+ import { t } from "../i18n/index.js";
14
15
  const DEFAULT_RELAY_SERVER = "https://clawpilot.codeaddict.cn";
15
16
  export async function pairCommand(opts) {
16
17
  const relayServerUrl = opts.server ?? DEFAULT_RELAY_SERVER;
@@ -24,7 +25,7 @@ export async function pairCommand(opts) {
24
25
  gatewayId = config.gatewayId;
25
26
  relaySecret = config.relaySecret;
26
27
  displayName = opts.name ?? config.displayName;
27
- console.log(`Gateway already registered (id=${gatewayId}). Refreshing access code…`);
28
+ console.log(t("pair.alreadyRegistered", gatewayId));
28
29
  const res = await fetch(`${httpBase}/api/relay/accesscode`, {
29
30
  method: "POST",
30
31
  headers: { "Content-Type": "application/json" },
@@ -33,9 +34,9 @@ export async function pairCommand(opts) {
33
34
  if (!res.ok) {
34
35
  const body = await res.text();
35
36
  if (res.status === 401) {
36
- throw new Error(`Invalid credentials (401). The server doesn't recognize this gateway.\nRun \`clawpilot reset\` to clear config and re-register.`);
37
+ throw new Error(t("pair.invalidCredentials"));
37
38
  }
38
- throw new Error(`Failed to refresh access code: ${res.status} ${body}`);
39
+ throw new Error(t("pair.refreshFailed", String(res.status), body));
39
40
  }
40
41
  const data = (await res.json());
41
42
  accessCode = data.accessCode;
@@ -43,7 +44,7 @@ export async function pairCommand(opts) {
43
44
  }
44
45
  else {
45
46
  displayName = opts.name ?? getDisplayName();
46
- console.log("Registering with relay server…");
47
+ console.log(t("pair.registering"));
47
48
  const res = await fetch(`${httpBase}/api/relay/register`, {
48
49
  method: "POST",
49
50
  headers: { "Content-Type": "application/json" },
@@ -51,14 +52,14 @@ export async function pairCommand(opts) {
51
52
  });
52
53
  if (!res.ok) {
53
54
  const body = await res.text();
54
- throw new Error(`Registration failed: ${res.status} ${body}`);
55
+ throw new Error(t("pair.registrationFailed", String(res.status), body));
55
56
  }
56
57
  const data = (await res.json());
57
58
  gatewayId = data.gatewayId;
58
59
  relaySecret = data.relaySecret;
59
60
  accessCode = data.accessCode;
60
61
  writeConfig({ relayServerUrl, gatewayId, relaySecret, displayName });
61
- console.log(`Registered! Gateway ID: ${gatewayId}`);
62
+ console.log(t("pair.registered", gatewayId));
62
63
  }
63
64
  const qrPayload = JSON.stringify({
64
65
  version: 1,
@@ -67,10 +68,10 @@ export async function pairCommand(opts) {
67
68
  accessCode,
68
69
  displayName,
69
70
  });
70
- console.log("\nScan this QR code with the Clawai iOS app:\n");
71
+ console.log(t("pair.scanQR"));
71
72
  qrcodeTerminal.generate(qrPayload, { small: true });
72
- console.log("\nAccess code (one-time use):", accessCode);
73
- console.log("\nInstalling/updating relay background service…");
73
+ console.log(t("pair.accessCode", accessCode));
74
+ console.log(t("pair.installingService"));
74
75
  installCommand();
75
76
  }
76
77
  //# sourceMappingURL=pair.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,15 @@
1
1
  import { readConfig, readGatewayUrl, readGatewayAuth } from "../config/config.js";
2
2
  import { runRelayManager } from "../relay/relay-manager.js";
3
3
  import { withReconnect } from "../relay/reconnect.js";
4
+ import { t } from "../i18n/index.js";
4
5
  export async function runCommand() {
5
6
  const config = readConfig();
6
7
  const gatewayUrl = readGatewayUrl();
7
8
  const gatewayAuth = readGatewayAuth(config);
8
- console.log(`Starting ClawAI relay client…`);
9
- console.log(` Gateway ID: ${config.gatewayId}`);
10
- console.log(` Relay Server: ${config.relayServerUrl}`);
11
- console.log(` Gateway URL: ${gatewayUrl}`);
9
+ console.log(t("run.starting"));
10
+ console.log(t("run.gatewayId", config.gatewayId));
11
+ console.log(t("run.relayServer", config.relayServerUrl));
12
+ console.log(t("run.gatewayUrl", gatewayUrl));
12
13
  await withReconnect(() => runRelayManager({
13
14
  relayServerUrl: config.relayServerUrl,
14
15
  gatewayId: config.gatewayId,
@@ -16,11 +17,11 @@ export async function runCommand() {
16
17
  gatewayUrl,
17
18
  gatewayToken: gatewayAuth.token,
18
19
  gatewayPassword: gatewayAuth.password,
19
- onConnected: () => console.log("Relay connected."),
20
- onDisconnected: () => console.log("Relay disconnected. Reconnecting…"),
20
+ onConnected: () => console.log(t("run.connected")),
21
+ onDisconnected: () => console.log(t("run.disconnected")),
21
22
  }), {
22
23
  onRetry: (attempt, delayMs) => {
23
- console.log(`Retry attempt ${attempt}, waiting ${delayMs}ms…`);
24
+ console.log(t("run.retry", String(attempt), String(delayMs)));
24
25
  },
25
26
  });
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAE7C,MAAM,aAAa,CACjB,GAAG,EAAE,CACH,eAAe,CAAC;QACd,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,KAAK;QAC/B,eAAe,EAAE,WAAW,CAAC,QAAQ;QACrC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAClD,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;KACvE,CAAC,EACJ;QACE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,aAAa,OAAO,KAAK,CAAC,CAAC;QACjE,CAAC;KACF,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,aAAa,CACjB,GAAG,EAAE,CACH,eAAe,CAAC;QACd,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,KAAK;QAC/B,eAAe,EAAE,WAAW,CAAC,QAAQ;QACrC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAClD,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;KACzD,CAAC,EACJ;QACE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;KACF,CACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import readline from "readline";
2
2
  import { readConfig, writeConfig } from "../config/config.js";
3
+ import { t } from "../i18n/index.js";
3
4
  export async function setTokenCommand() {
4
5
  // Require pairing to be done first
5
6
  let config;
@@ -7,19 +8,19 @@ export async function setTokenCommand() {
7
8
  config = readConfig();
8
9
  }
9
10
  catch {
10
- console.error("No pairing config found. Run 'clawpilot pair' first.");
11
+ console.error(t("setToken.noPairing"));
11
12
  process.exit(1);
12
13
  }
13
14
  // Tell the user where to find the token
14
- console.log("\nWhere to find your Gateway Token:");
15
- console.log(" Option 1 — OpenClaw desktop app: Settings → Advanced → Gateway Token");
16
- console.log(" Option 2 — Terminal:");
17
- console.log(" cat ~/.openclaw/openclaw.json | grep -A2 'auth'");
18
- console.log(" Option 3 — If set via environment variable: echo $OPENCLAW_GATEWAY_TOKEN\n");
15
+ console.log(t("setToken.whereToFind"));
16
+ console.log(t("setToken.option1"));
17
+ console.log(t("setToken.option2"));
18
+ console.log(t("setToken.option2cmd"));
19
+ console.log(t("setToken.option3"));
19
20
  // Prompt for the token
20
21
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
21
22
  const token = await new Promise((resolve) => {
22
- rl.question("Gateway Token (leave blank to clear): ", (answer) => {
23
+ rl.question(t("setToken.prompt"), (answer) => {
23
24
  rl.close();
24
25
  resolve(answer.trim());
25
26
  });
@@ -29,14 +30,14 @@ export async function setTokenCommand() {
29
30
  config.gatewayToken = token;
30
31
  delete config.gatewayPassword;
31
32
  writeConfig(config);
32
- console.log("\nToken saved to ~/.clawai/config.json.");
33
+ console.log(t("setToken.saved"));
33
34
  }
34
35
  else {
35
36
  delete config.gatewayToken;
36
37
  delete config.gatewayPassword;
37
38
  writeConfig(config);
38
- console.log("\nToken cleared from ~/.clawai/config.json.");
39
+ console.log(t("setToken.cleared"));
39
40
  }
40
- console.log("Run 'clawpilot restart' to apply the change.\n");
41
+ console.log(t("setToken.restart"));
41
42
  }
42
43
  //# sourceMappingURL=set-token.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"set-token.js","sourceRoot":"","sources":["../../src/commands/set-token.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,mCAAmC;IACnC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAE5F,uBAAuB;IACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QAClD,EAAE,CAAC,QAAQ,CAAC,wCAAwC,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/D,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,OAAO,MAAM,CAAC,eAAe,CAAC;QAC9B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC,YAAY,CAAC;QAC3B,OAAO,MAAM,CAAC,eAAe,CAAC;QAC9B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"set-token.js","sourceRoot":"","sources":["../../src/commands/set-token.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,mCAAmC;IACnC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEnC,uBAAuB;IACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QAClD,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,OAAO,MAAM,CAAC,eAAe,CAAC;QAC9B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC,YAAY,CAAC;QAC3B,OAAO,MAAM,CAAC,eAAe,CAAC;QAC9B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrC,CAAC"}
@@ -3,6 +3,7 @@ import { join } from "path";
3
3
  import { homedir } from "os";
4
4
  import { execSync } from "child_process";
5
5
  import { configExists, readConfig, readGatewayUrl } from "../config/config.js";
6
+ import { t } from "../i18n/index.js";
6
7
  const PLIST_LABEL = "com.rethinkingstudio.clawpilot";
7
8
  const PLIST_PATH = join(homedir(), "Library", "LaunchAgents", `${PLIST_LABEL}.plist`);
8
9
  const LOG_PATH = join(homedir(), ".clawai", "clawpilot.log");
@@ -16,40 +17,40 @@ function isServiceRunning() {
16
17
  }
17
18
  }
18
19
  export function statusCommand() {
19
- console.log("── ClawPilot Relay Client Status ──\n");
20
+ console.log(t("status.title"));
20
21
  // Pairing config
21
22
  if (!configExists()) {
22
- console.log("Config: ✗ Not paired — run 'clawpilot pair' first");
23
+ console.log(t("status.notPaired"));
23
24
  }
24
25
  else {
25
26
  try {
26
27
  const config = readConfig();
27
- console.log("Config: ✓ Paired");
28
- console.log(` Display name : ${config.displayName}`);
29
- console.log(` Gateway ID : ${config.gatewayId}`);
30
- console.log(` Relay server : ${config.relayServerUrl}`);
28
+ console.log(t("status.paired"));
29
+ console.log(t("status.displayName", config.displayName));
30
+ console.log(t("status.gatewayId", config.gatewayId));
31
+ console.log(t("status.relayServer", config.relayServerUrl));
31
32
  }
32
33
  catch {
33
- console.log("Config: ✗ File exists but is corrupted");
34
+ console.log(t("status.configCorrupted"));
34
35
  }
35
36
  }
36
37
  // Local gateway
37
38
  const gatewayUrl = readGatewayUrl();
38
- console.log(`\nGateway: ${gatewayUrl}`);
39
+ console.log(t("status.gateway", gatewayUrl));
39
40
  // launchd service
40
41
  const plistExists = existsSync(PLIST_PATH);
41
42
  const running = isServiceRunning();
42
43
  if (!plistExists) {
43
- console.log("\nService: ✗ Not installed — run 'clawpilot install'");
44
+ console.log(t("status.serviceNotInstalled"));
44
45
  }
45
46
  else if (running) {
46
- console.log("\nService: ✓ Running (launchd)");
47
- console.log(` Log : ${LOG_PATH}`);
47
+ console.log(t("status.serviceRunning"));
48
+ console.log(t("status.serviceLog", LOG_PATH));
48
49
  }
49
50
  else {
50
- console.log("\nService: ⚠ Installed but not running");
51
- console.log(` Plist : ${PLIST_PATH}`);
52
- console.log(" Start : launchctl start " + PLIST_LABEL);
51
+ console.log(t("status.serviceNotRunning"));
52
+ console.log(t("status.servicePlist", PLIST_PATH));
53
+ console.log(t("status.serviceStart", PLIST_LABEL));
53
54
  }
54
55
  console.log("");
55
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,WAAW,GAAG,gCAAgC,CAAC;AACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,WAAW,QAAQ,CAAC,CAAC;AACtF,MAAM,QAAQ,GAAK,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAE/D,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAErD,iBAAiB;IACjB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IAEzC,kBAAkB;IAClB,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function t(key: string, ...args: string[]): string;
@@ -0,0 +1,137 @@
1
+ const en = {
2
+ // pair
3
+ "pair.alreadyRegistered": (id) => `Gateway already registered (id=${id}). Refreshing access code…`,
4
+ "pair.invalidCredentials": "Invalid credentials (401). The server doesn't recognize this gateway.\nRun `clawpilot reset` to clear config and re-register.",
5
+ "pair.refreshFailed": (status, body) => `Failed to refresh access code: ${status} ${body}`,
6
+ "pair.registering": "Registering with relay server…",
7
+ "pair.registrationFailed": (status, body) => `Registration failed: ${status} ${body}`,
8
+ "pair.registered": (id) => `Registered! Gateway ID: ${id}`,
9
+ "pair.scanQR": "\nScan this QR code with the Clawai iOS app:\n",
10
+ "pair.accessCode": (code) => `\nAccess code (one-time use): ${code}`,
11
+ "pair.installingService": "\nInstalling/updating relay background service…",
12
+ // run
13
+ "run.starting": "Starting ClawAI relay client…",
14
+ "run.gatewayId": (id) => ` Gateway ID: ${id}`,
15
+ "run.relayServer": (url) => ` Relay Server: ${url}`,
16
+ "run.gatewayUrl": (url) => ` Gateway URL: ${url}`,
17
+ "run.connected": "Relay connected.",
18
+ "run.disconnected": "Relay disconnected. Reconnecting…",
19
+ "run.retry": (attempt, delay) => `Retry attempt ${attempt}, waiting ${delay}ms…`,
20
+ // install
21
+ "install.serviceStarted": (label) => `Service installed and started: ${label}`,
22
+ "install.loadFailed": "Failed to load launchd service:",
23
+ "install.plistWritten": (path) => `Plist written to: ${path}`,
24
+ "install.loadManually": (path) => `Run manually: launchctl load -w "${path}"`,
25
+ "install.restarting": "Restarting relay service…",
26
+ "install.serviceStopped": (label) => `Service stopped: ${label}`,
27
+ "install.removePlistFailed": "Failed to remove plist:",
28
+ "install.plistRemoved": (path) => `Plist removed: ${path}`,
29
+ "install.stopped": (label) => `Stopped: ${label}`,
30
+ "install.stoppedAndRemoved": "Relay client stopped and removed from launchd.",
31
+ "install.noService": "No running relay service found.",
32
+ "install.configRemoved": (path) => `Config removed: ${path}`,
33
+ "install.removeConfigFailed": "Failed to remove config:",
34
+ "install.noConfig": "No config file found.",
35
+ "install.resetComplete": "\nReset complete. Run `clawpilot pair` to re-register.",
36
+ // status
37
+ "status.title": "── ClawPilot Relay Client Status ──\n",
38
+ "status.notPaired": "Config: ✗ Not paired — run 'clawpilot pair' first",
39
+ "status.paired": "Config: ✓ Paired",
40
+ "status.displayName": (name) => ` Display name : ${name}`,
41
+ "status.gatewayId": (id) => ` Gateway ID : ${id}`,
42
+ "status.relayServer": (url) => ` Relay server : ${url}`,
43
+ "status.configCorrupted": "Config: ✗ File exists but is corrupted",
44
+ "status.gateway": (url) => `\nGateway: ${url}`,
45
+ "status.serviceNotInstalled": "\nService: ✗ Not installed — run 'clawpilot install'",
46
+ "status.serviceRunning": "\nService: ✓ Running (launchd)",
47
+ "status.serviceLog": (path) => ` Log : ${path}`,
48
+ "status.serviceNotRunning": "\nService: ⚠ Installed but not running",
49
+ "status.servicePlist": (path) => ` Plist : ${path}`,
50
+ "status.serviceStart": (label) => ` Start : launchctl start ${label}`,
51
+ // set-token
52
+ "setToken.noPairing": "No pairing config found. Run 'clawpilot pair' first.",
53
+ "setToken.whereToFind": "\nWhere to find your Gateway Token:",
54
+ "setToken.option1": " Option 1 — OpenClaw desktop app: Settings → Advanced → Gateway Token",
55
+ "setToken.option2": " Option 2 — Terminal:",
56
+ "setToken.option2cmd": " cat ~/.openclaw/openclaw.json | grep -A2 'auth'",
57
+ "setToken.option3": " Option 3 — If set via environment variable: echo $OPENCLAW_GATEWAY_TOKEN\n",
58
+ "setToken.prompt": "Gateway Token (leave blank to clear): ",
59
+ "setToken.saved": "\nToken saved to ~/.clawai/config.json.",
60
+ "setToken.cleared": "\nToken cleared from ~/.clawai/config.json.",
61
+ "setToken.restart": "Run 'clawpilot restart' to apply the change.\n",
62
+ };
63
+ const zh = {
64
+ // pair
65
+ "pair.alreadyRegistered": (id) => `网关已注册 (id=${id}),正在刷新访问码…`,
66
+ "pair.invalidCredentials": "凭证无效 (401),服务器无法识别此网关。\n请运行 `clawpilot reset` 清除配置后重新注册。",
67
+ "pair.refreshFailed": (status, body) => `刷新访问码失败:${status} ${body}`,
68
+ "pair.registering": "正在向中继服务器注册…",
69
+ "pair.registrationFailed": (status, body) => `注册失败:${status} ${body}`,
70
+ "pair.registered": (id) => `注册成功!网关 ID:${id}`,
71
+ "pair.scanQR": "\n请用 Clawai iOS 应用扫描此二维码:\n",
72
+ "pair.accessCode": (code) => `\n访问码(一次性使用):${code}`,
73
+ "pair.installingService": "\n正在安装/更新中继后台服务…",
74
+ // run
75
+ "run.starting": "正在启动 ClawAI 中继客户端…",
76
+ "run.gatewayId": (id) => ` 网关 ID: ${id}`,
77
+ "run.relayServer": (url) => ` 中继服务器:${url}`,
78
+ "run.gatewayUrl": (url) => ` 网关地址: ${url}`,
79
+ "run.connected": "中继已连接。",
80
+ "run.disconnected": "中继已断开,正在重连…",
81
+ "run.retry": (attempt, delay) => `第 ${attempt} 次重试,等待 ${delay}ms…`,
82
+ // install
83
+ "install.serviceStarted": (label) => `服务已安装并启动:${label}`,
84
+ "install.loadFailed": "加载 launchd 服务失败:",
85
+ "install.plistWritten": (path) => `Plist 已写入:${path}`,
86
+ "install.loadManually": (path) => `请手动运行:launchctl load -w "${path}"`,
87
+ "install.restarting": "正在重启中继服务…",
88
+ "install.serviceStopped": (label) => `服务已停止:${label}`,
89
+ "install.removePlistFailed": "删除 Plist 失败:",
90
+ "install.plistRemoved": (path) => `Plist 已删除:${path}`,
91
+ "install.stopped": (label) => `已停止:${label}`,
92
+ "install.stoppedAndRemoved": "中继客户端已停止并从 launchd 移除。",
93
+ "install.noService": "未找到正在运行的中继服务。",
94
+ "install.configRemoved": (path) => `配置文件已删除:${path}`,
95
+ "install.removeConfigFailed": "删除配置文件失败:",
96
+ "install.noConfig": "未找到配置文件。",
97
+ "install.resetComplete": "\n重置完成。请运行 `clawpilot pair` 重新注册。",
98
+ // status
99
+ "status.title": "── ClawPilot 中继客户端状态 ──\n",
100
+ "status.notPaired": "配置:✗ 未配对 — 请先运行 'clawpilot pair'",
101
+ "status.paired": "配置:✓ 已配对",
102
+ "status.displayName": (name) => ` 显示名称:${name}`,
103
+ "status.gatewayId": (id) => ` 网关 ID: ${id}`,
104
+ "status.relayServer": (url) => ` 中继服务器:${url}`,
105
+ "status.configCorrupted": "配置:✗ 文件存在但已损坏",
106
+ "status.gateway": (url) => `\n网关地址:${url}`,
107
+ "status.serviceNotInstalled": "\n服务:✗ 未安装 — 请运行 'clawpilot install'",
108
+ "status.serviceRunning": "\n服务:✓ 运行中 (launchd)",
109
+ "status.serviceLog": (path) => ` 日志:${path}`,
110
+ "status.serviceNotRunning": "\n服务:⚠ 已安装但未运行",
111
+ "status.servicePlist": (path) => ` Plist:${path}`,
112
+ "status.serviceStart": (label) => ` 启动命令:launchctl start ${label}`,
113
+ // set-token
114
+ "setToken.noPairing": "未找到配对配置,请先运行 'clawpilot pair'。",
115
+ "setToken.whereToFind": "\n如何查找 Gateway Token:",
116
+ "setToken.option1": " 方式一 — OpenClaw 桌面应用:设置 → 高级 → Gateway Token",
117
+ "setToken.option2": " 方式二 — 终端:",
118
+ "setToken.option2cmd": " cat ~/.openclaw/openclaw.json | grep -A2 'auth'",
119
+ "setToken.option3": " 方式三 — 若通过环境变量设置:echo $OPENCLAW_GATEWAY_TOKEN\n",
120
+ "setToken.prompt": "Gateway Token(留空则清除):",
121
+ "setToken.saved": "\nToken 已保存到 ~/.clawai/config.json。",
122
+ "setToken.cleared": "\nToken 已从 ~/.clawai/config.json 清除。",
123
+ "setToken.restart": "请运行 'clawpilot restart' 使修改生效。\n",
124
+ };
125
+ function detectLocale() {
126
+ const lang = process.env.LANG ?? process.env.LC_ALL ?? process.env.LANGUAGE ?? "";
127
+ return lang.toLowerCase().startsWith("zh") ? "zh" : "en";
128
+ }
129
+ const locale = detectLocale();
130
+ const msgs = locale === "zh" ? zh : en;
131
+ export function t(key, ...args) {
132
+ const val = msgs[key] ?? en[key] ?? key;
133
+ if (typeof val === "function")
134
+ return val(...args);
135
+ return val;
136
+ }
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { runCommand } from "./commands/run.js";
5
5
  import { installCommand, uninstallCommand, stopCommand, restartCommand, resetCommand } from "./commands/install.js";
6
6
  import { statusCommand } from "./commands/status.js";
7
7
  import { setTokenCommand } from "./commands/set-token.js";
8
- const version = "1.0.10";
8
+ const version = "1.0.12";
9
9
  const program = new Command();
10
10
  program
11
11
  .name("clawpilot")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rethinkingstudio/clawpilot",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "ClawAI relay client for Mac mini",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2,6 +2,7 @@ import { writeFileSync, mkdirSync, existsSync, unlinkSync } from "fs";
2
2
  import { join } from "path";
3
3
  import { homedir } from "os";
4
4
  import { execSync } from "child_process";
5
+ import { t } from "../i18n/index.js";
5
6
 
6
7
  const PLIST_LABEL = "com.rethinkingstudio.clawpilot";
7
8
  const PLIST_LABEL_OLD = "com.rethinkingstudio.clawai"; // legacy, cleaned up by stop
@@ -59,32 +60,32 @@ ${argsXml}
59
60
 
60
61
  try {
61
62
  execSync(`launchctl load -w "${PLIST_PATH}"`, { stdio: "inherit" });
62
- console.log(`Service installed and started: ${PLIST_LABEL}`);
63
+ console.log(t("install.serviceStarted", PLIST_LABEL));
63
64
  } catch (err) {
64
- console.error("Failed to load launchd service:", err);
65
- console.log(`Plist written to: ${PLIST_PATH}`);
66
- console.log(`Run manually: launchctl load -w "${PLIST_PATH}"`);
65
+ console.error(t("install.loadFailed"), err);
66
+ console.log(t("install.plistWritten", PLIST_PATH));
67
+ console.log(t("install.loadManually", PLIST_PATH));
67
68
  }
68
69
  }
69
70
 
70
71
  export function restartCommand(): void {
71
- console.log("Restarting relay service…");
72
+ console.log(t("install.restarting"));
72
73
  installCommand();
73
74
  }
74
75
 
75
76
  export function uninstallCommand(): void {
76
77
  try {
77
78
  execSync(`launchctl unload -w "${PLIST_PATH}"`, { stdio: "inherit" });
78
- console.log(`Service stopped: ${PLIST_LABEL}`);
79
+ console.log(t("install.serviceStopped", PLIST_LABEL));
79
80
  } catch {
80
81
  // May fail if not loaded
81
82
  }
82
83
 
83
84
  try {
84
85
  execSync(`rm -f "${PLIST_PATH}"`, { stdio: "inherit" });
85
- console.log(`Plist removed: ${PLIST_PATH}`);
86
+ console.log(t("install.plistRemoved", PLIST_PATH));
86
87
  } catch (err) {
87
- console.error("Failed to remove plist:", err);
88
+ console.error(t("install.removePlistFailed"), err);
88
89
  }
89
90
  }
90
91
 
@@ -95,7 +96,7 @@ export function stopCommand(): void {
95
96
  // Stop + remove new label
96
97
  try {
97
98
  execSync(`launchctl unload -w "${PLIST_PATH}"`, { stdio: "pipe" });
98
- console.log(`Stopped: ${PLIST_LABEL}`);
99
+ console.log(t("install.stopped", PLIST_LABEL));
99
100
  stopped = true;
100
101
  } catch {
101
102
  // Not loaded — that's fine
@@ -107,7 +108,7 @@ export function stopCommand(): void {
107
108
  // Stop + remove legacy clawai label
108
109
  try {
109
110
  execSync(`launchctl unload -w "${PLIST_PATH_OLD}"`, { stdio: "pipe" });
110
- console.log(`Stopped: ${PLIST_LABEL_OLD}`);
111
+ console.log(t("install.stopped", PLIST_LABEL_OLD));
111
112
  stopped = true;
112
113
  } catch {
113
114
  // Not loaded — that's fine
@@ -117,9 +118,9 @@ export function stopCommand(): void {
117
118
  } catch { /* ignore */ }
118
119
 
119
120
  if (stopped) {
120
- console.log("Relay client stopped and removed from launchd.");
121
+ console.log(t("install.stoppedAndRemoved"));
121
122
  } else {
122
- console.log("No running relay service found.");
123
+ console.log(t("install.noService"));
123
124
  }
124
125
  }
125
126
 
@@ -133,13 +134,13 @@ export function resetCommand(): void {
133
134
  if (existsSync(configPath)) {
134
135
  try {
135
136
  unlinkSync(configPath);
136
- console.log(`Config removed: ${configPath}`);
137
+ console.log(t("install.configRemoved", configPath));
137
138
  } catch (err) {
138
- console.error("Failed to remove config:", err);
139
+ console.error(t("install.removeConfigFailed"), err);
139
140
  }
140
141
  } else {
141
- console.log("No config file found.");
142
+ console.log(t("install.noConfig"));
142
143
  }
143
144
 
144
- console.log("\nReset complete. Run `clawpilot pair` to re-register.");
145
+ console.log(t("install.resetComplete"));
145
146
  }
@@ -70,7 +70,7 @@ function restoreConfig(): LocalResult {
70
70
  */
71
71
  function watchSkill(): LocalResult {
72
72
  try {
73
- execSync("openclaw config set skills.load.watch true", { stdio: "pipe" });
73
+ loginShell("openclaw config set skills.load.watch true");
74
74
  console.log("[clawpilot] skills.load.watch set to true");
75
75
  return { ok: true, payload: { message: "skills.load.watch enabled" } };
76
76
  } catch (err) {
@@ -87,12 +87,20 @@ function execErrorOutput(err: unknown): string {
87
87
  return out || errStr;
88
88
  }
89
89
 
90
+ /**
91
+ * Runs a shell command via login bash so that PATH includes homebrew / user-installed bins.
92
+ * The command string must not contain user-controlled input (hardcoded calls only).
93
+ */
94
+ function loginShell(cmd: string): Buffer {
95
+ return execSync(`/bin/bash -lc '${cmd}'`, { stdio: "pipe" });
96
+ }
97
+
90
98
  /**
91
99
  * Runs openclaw doctor to check system health.
92
100
  */
93
101
  function runDoctor(): LocalResult {
94
102
  try {
95
- const output = execSync("openclaw doctor", { stdio: "pipe" }).toString();
103
+ const output = loginShell("openclaw doctor").toString();
96
104
  console.log("[clawpilot] doctor completed");
97
105
  return { ok: true, payload: { output } };
98
106
  } catch (err) {
@@ -144,7 +152,7 @@ function readLogs(): LocalResult {
144
152
  */
145
153
  function restartGateway(): LocalResult {
146
154
  try {
147
- const output = execSync("openclaw gateway restart", { stdio: "pipe" }).toString();
155
+ const output = loginShell("openclaw gateway restart").toString();
148
156
  console.log("[clawpilot] gateway restarted");
149
157
  return { ok: true, payload: { output: output || "Gateway restarted successfully." } };
150
158
  } catch (err) {
@@ -160,7 +168,7 @@ function restartGateway(): LocalResult {
160
168
  */
161
169
  function updateOpenclaw(): LocalResult {
162
170
  try {
163
- const output = execSync("openclaw update", { stdio: "pipe" }).toString();
171
+ const output = loginShell("openclaw update").toString();
164
172
  console.log("[clawpilot] openclaw updated");
165
173
  return { ok: true, payload: { output: output || "openclaw updated successfully." } };
166
174
  } catch (err) {
@@ -11,6 +11,7 @@ function getDisplayName(): string {
11
11
  import { configExists, readConfig, writeConfig } from "../config/config.js";
12
12
  import { installCommand } from "./install.js";
13
13
  import qrcodeTerminal from "qrcode-terminal";
14
+ import { t } from "../i18n/index.js";
14
15
 
15
16
  const DEFAULT_RELAY_SERVER = "https://clawpilot.codeaddict.cn";
16
17
 
@@ -34,7 +35,7 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
34
35
  relaySecret = config.relaySecret;
35
36
  displayName = opts.name ?? config.displayName;
36
37
 
37
- console.log(`Gateway already registered (id=${gatewayId}). Refreshing access code…`);
38
+ console.log(t("pair.alreadyRegistered", gatewayId));
38
39
 
39
40
  const res = await fetch(`${httpBase}/api/relay/accesscode`, {
40
41
  method: "POST",
@@ -45,11 +46,9 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
45
46
  if (!res.ok) {
46
47
  const body = await res.text();
47
48
  if (res.status === 401) {
48
- throw new Error(
49
- `Invalid credentials (401). The server doesn't recognize this gateway.\nRun \`clawpilot reset\` to clear config and re-register.`
50
- );
49
+ throw new Error(t("pair.invalidCredentials"));
51
50
  }
52
- throw new Error(`Failed to refresh access code: ${res.status} ${body}`);
51
+ throw new Error(t("pair.refreshFailed", String(res.status), body));
53
52
  }
54
53
 
55
54
  const data = (await res.json()) as { accessCode: string };
@@ -58,7 +57,7 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
58
57
  writeConfig({ ...config, relayServerUrl, displayName });
59
58
  } else {
60
59
  displayName = opts.name ?? getDisplayName();
61
- console.log("Registering with relay server…");
60
+ console.log(t("pair.registering"));
62
61
 
63
62
  const res = await fetch(`${httpBase}/api/relay/register`, {
64
63
  method: "POST",
@@ -68,7 +67,7 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
68
67
 
69
68
  if (!res.ok) {
70
69
  const body = await res.text();
71
- throw new Error(`Registration failed: ${res.status} ${body}`);
70
+ throw new Error(t("pair.registrationFailed", String(res.status), body));
72
71
  }
73
72
 
74
73
  const data = (await res.json()) as {
@@ -83,7 +82,7 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
83
82
 
84
83
  writeConfig({ relayServerUrl, gatewayId, relaySecret, displayName });
85
84
 
86
- console.log(`Registered! Gateway ID: ${gatewayId}`);
85
+ console.log(t("pair.registered", gatewayId));
87
86
  }
88
87
 
89
88
  const qrPayload = JSON.stringify({
@@ -94,10 +93,10 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
94
93
  displayName,
95
94
  });
96
95
 
97
- console.log("\nScan this QR code with the Clawai iOS app:\n");
96
+ console.log(t("pair.scanQR"));
98
97
  qrcodeTerminal.generate(qrPayload, { small: true });
99
- console.log("\nAccess code (one-time use):", accessCode);
98
+ console.log(t("pair.accessCode", accessCode));
100
99
 
101
- console.log("\nInstalling/updating relay background service…");
100
+ console.log(t("pair.installingService"));
102
101
  installCommand();
103
102
  }
@@ -1,16 +1,17 @@
1
1
  import { readConfig, readGatewayUrl, readGatewayAuth } from "../config/config.js";
2
2
  import { runRelayManager } from "../relay/relay-manager.js";
3
3
  import { withReconnect } from "../relay/reconnect.js";
4
+ import { t } from "../i18n/index.js";
4
5
 
5
6
  export async function runCommand(): Promise<void> {
6
7
  const config = readConfig();
7
8
  const gatewayUrl = readGatewayUrl();
8
9
  const gatewayAuth = readGatewayAuth(config);
9
10
 
10
- console.log(`Starting ClawAI relay client…`);
11
- console.log(` Gateway ID: ${config.gatewayId}`);
12
- console.log(` Relay Server: ${config.relayServerUrl}`);
13
- console.log(` Gateway URL: ${gatewayUrl}`);
11
+ console.log(t("run.starting"));
12
+ console.log(t("run.gatewayId", config.gatewayId));
13
+ console.log(t("run.relayServer", config.relayServerUrl));
14
+ console.log(t("run.gatewayUrl", gatewayUrl));
14
15
 
15
16
  await withReconnect(
16
17
  () =>
@@ -21,12 +22,12 @@ export async function runCommand(): Promise<void> {
21
22
  gatewayUrl,
22
23
  gatewayToken: gatewayAuth.token,
23
24
  gatewayPassword: gatewayAuth.password,
24
- onConnected: () => console.log("Relay connected."),
25
- onDisconnected: () => console.log("Relay disconnected. Reconnecting…"),
25
+ onConnected: () => console.log(t("run.connected")),
26
+ onDisconnected: () => console.log(t("run.disconnected")),
26
27
  }),
27
28
  {
28
29
  onRetry: (attempt, delayMs) => {
29
- console.log(`Retry attempt ${attempt}, waiting ${delayMs}ms…`);
30
+ console.log(t("run.retry", String(attempt), String(delayMs)));
30
31
  },
31
32
  }
32
33
  );
@@ -1,5 +1,6 @@
1
1
  import readline from "readline";
2
2
  import { readConfig, writeConfig } from "../config/config.js";
3
+ import { t } from "../i18n/index.js";
3
4
 
4
5
  export async function setTokenCommand(): Promise<void> {
5
6
  // Require pairing to be done first
@@ -7,21 +8,21 @@ export async function setTokenCommand(): Promise<void> {
7
8
  try {
8
9
  config = readConfig();
9
10
  } catch {
10
- console.error("No pairing config found. Run 'clawpilot pair' first.");
11
+ console.error(t("setToken.noPairing"));
11
12
  process.exit(1);
12
13
  }
13
14
 
14
15
  // Tell the user where to find the token
15
- console.log("\nWhere to find your Gateway Token:");
16
- console.log(" Option 1 — OpenClaw desktop app: Settings → Advanced → Gateway Token");
17
- console.log(" Option 2 — Terminal:");
18
- console.log(" cat ~/.openclaw/openclaw.json | grep -A2 'auth'");
19
- console.log(" Option 3 — If set via environment variable: echo $OPENCLAW_GATEWAY_TOKEN\n");
16
+ console.log(t("setToken.whereToFind"));
17
+ console.log(t("setToken.option1"));
18
+ console.log(t("setToken.option2"));
19
+ console.log(t("setToken.option2cmd"));
20
+ console.log(t("setToken.option3"));
20
21
 
21
22
  // Prompt for the token
22
23
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
23
24
  const token = await new Promise<string>((resolve) => {
24
- rl.question("Gateway Token (leave blank to clear): ", (answer) => {
25
+ rl.question(t("setToken.prompt"), (answer) => {
25
26
  rl.close();
26
27
  resolve(answer.trim());
27
28
  });
@@ -32,13 +33,13 @@ export async function setTokenCommand(): Promise<void> {
32
33
  config.gatewayToken = token;
33
34
  delete config.gatewayPassword;
34
35
  writeConfig(config);
35
- console.log("\nToken saved to ~/.clawai/config.json.");
36
+ console.log(t("setToken.saved"));
36
37
  } else {
37
38
  delete config.gatewayToken;
38
39
  delete config.gatewayPassword;
39
40
  writeConfig(config);
40
- console.log("\nToken cleared from ~/.clawai/config.json.");
41
+ console.log(t("setToken.cleared"));
41
42
  }
42
43
 
43
- console.log("Run 'clawpilot restart' to apply the change.\n");
44
+ console.log(t("setToken.restart"));
44
45
  }
@@ -3,6 +3,7 @@ import { join } from "path";
3
3
  import { homedir } from "os";
4
4
  import { execSync } from "child_process";
5
5
  import { configExists, readConfig, readGatewayUrl } from "../config/config.js";
6
+ import { t } from "../i18n/index.js";
6
7
 
7
8
  const PLIST_LABEL = "com.rethinkingstudio.clawpilot";
8
9
  const PLIST_PATH = join(homedir(), "Library", "LaunchAgents", `${PLIST_LABEL}.plist`);
@@ -18,40 +19,40 @@ function isServiceRunning(): boolean {
18
19
  }
19
20
 
20
21
  export function statusCommand(): void {
21
- console.log("── ClawPilot Relay Client Status ──\n");
22
+ console.log(t("status.title"));
22
23
 
23
24
  // Pairing config
24
25
  if (!configExists()) {
25
- console.log("Config: ✗ Not paired — run 'clawpilot pair' first");
26
+ console.log(t("status.notPaired"));
26
27
  } else {
27
28
  try {
28
29
  const config = readConfig();
29
- console.log("Config: ✓ Paired");
30
- console.log(` Display name : ${config.displayName}`);
31
- console.log(` Gateway ID : ${config.gatewayId}`);
32
- console.log(` Relay server : ${config.relayServerUrl}`);
30
+ console.log(t("status.paired"));
31
+ console.log(t("status.displayName", config.displayName));
32
+ console.log(t("status.gatewayId", config.gatewayId));
33
+ console.log(t("status.relayServer", config.relayServerUrl));
33
34
  } catch {
34
- console.log("Config: ✗ File exists but is corrupted");
35
+ console.log(t("status.configCorrupted"));
35
36
  }
36
37
  }
37
38
 
38
39
  // Local gateway
39
40
  const gatewayUrl = readGatewayUrl();
40
- console.log(`\nGateway: ${gatewayUrl}`);
41
+ console.log(t("status.gateway", gatewayUrl));
41
42
 
42
43
  // launchd service
43
44
  const plistExists = existsSync(PLIST_PATH);
44
45
  const running = isServiceRunning();
45
46
 
46
47
  if (!plistExists) {
47
- console.log("\nService: ✗ Not installed — run 'clawpilot install'");
48
+ console.log(t("status.serviceNotInstalled"));
48
49
  } else if (running) {
49
- console.log("\nService: ✓ Running (launchd)");
50
- console.log(` Log : ${LOG_PATH}`);
50
+ console.log(t("status.serviceRunning"));
51
+ console.log(t("status.serviceLog", LOG_PATH));
51
52
  } else {
52
- console.log("\nService: ⚠ Installed but not running");
53
- console.log(` Plist : ${PLIST_PATH}`);
54
- console.log(" Start : launchctl start " + PLIST_LABEL);
53
+ console.log(t("status.serviceNotRunning"));
54
+ console.log(t("status.servicePlist", PLIST_PATH));
55
+ console.log(t("status.serviceStart", PLIST_LABEL));
55
56
  }
56
57
 
57
58
  console.log("");
@@ -0,0 +1,151 @@
1
+ type Locale = "en" | "zh";
2
+ type MsgFn = (...args: string[]) => string;
3
+ type MsgValue = string | MsgFn;
4
+
5
+ const en: Record<string, MsgValue> = {
6
+ // pair
7
+ "pair.alreadyRegistered": (id) => `Gateway already registered (id=${id}). Refreshing access code…`,
8
+ "pair.invalidCredentials": "Invalid credentials (401). The server doesn't recognize this gateway.\nRun `clawpilot reset` to clear config and re-register.",
9
+ "pair.refreshFailed": (status, body) => `Failed to refresh access code: ${status} ${body}`,
10
+ "pair.registering": "Registering with relay server…",
11
+ "pair.registrationFailed": (status, body) => `Registration failed: ${status} ${body}`,
12
+ "pair.registered": (id) => `Registered! Gateway ID: ${id}`,
13
+ "pair.scanQR": "\nScan this QR code with the Clawai iOS app:\n",
14
+ "pair.accessCode": (code) => `\nAccess code (one-time use): ${code}`,
15
+ "pair.installingService": "\nInstalling/updating relay background service…",
16
+
17
+ // run
18
+ "run.starting": "Starting ClawAI relay client…",
19
+ "run.gatewayId": (id) => ` Gateway ID: ${id}`,
20
+ "run.relayServer": (url) => ` Relay Server: ${url}`,
21
+ "run.gatewayUrl": (url) => ` Gateway URL: ${url}`,
22
+ "run.connected": "Relay connected.",
23
+ "run.disconnected": "Relay disconnected. Reconnecting…",
24
+ "run.retry": (attempt, delay) => `Retry attempt ${attempt}, waiting ${delay}ms…`,
25
+
26
+ // install
27
+ "install.serviceStarted": (label) => `Service installed and started: ${label}`,
28
+ "install.loadFailed": "Failed to load launchd service:",
29
+ "install.plistWritten": (path) => `Plist written to: ${path}`,
30
+ "install.loadManually": (path) => `Run manually: launchctl load -w "${path}"`,
31
+ "install.restarting": "Restarting relay service…",
32
+ "install.serviceStopped": (label) => `Service stopped: ${label}`,
33
+ "install.removePlistFailed": "Failed to remove plist:",
34
+ "install.plistRemoved": (path) => `Plist removed: ${path}`,
35
+ "install.stopped": (label) => `Stopped: ${label}`,
36
+ "install.stoppedAndRemoved": "Relay client stopped and removed from launchd.",
37
+ "install.noService": "No running relay service found.",
38
+ "install.configRemoved": (path) => `Config removed: ${path}`,
39
+ "install.removeConfigFailed": "Failed to remove config:",
40
+ "install.noConfig": "No config file found.",
41
+ "install.resetComplete": "\nReset complete. Run `clawpilot pair` to re-register.",
42
+
43
+ // status
44
+ "status.title": "── ClawPilot Relay Client Status ──\n",
45
+ "status.notPaired": "Config: ✗ Not paired — run 'clawpilot pair' first",
46
+ "status.paired": "Config: ✓ Paired",
47
+ "status.displayName": (name) => ` Display name : ${name}`,
48
+ "status.gatewayId": (id) => ` Gateway ID : ${id}`,
49
+ "status.relayServer": (url) => ` Relay server : ${url}`,
50
+ "status.configCorrupted": "Config: ✗ File exists but is corrupted",
51
+ "status.gateway": (url) => `\nGateway: ${url}`,
52
+ "status.serviceNotInstalled": "\nService: ✗ Not installed — run 'clawpilot install'",
53
+ "status.serviceRunning": "\nService: ✓ Running (launchd)",
54
+ "status.serviceLog": (path) => ` Log : ${path}`,
55
+ "status.serviceNotRunning": "\nService: ⚠ Installed but not running",
56
+ "status.servicePlist": (path) => ` Plist : ${path}`,
57
+ "status.serviceStart": (label) => ` Start : launchctl start ${label}`,
58
+
59
+ // set-token
60
+ "setToken.noPairing": "No pairing config found. Run 'clawpilot pair' first.",
61
+ "setToken.whereToFind": "\nWhere to find your Gateway Token:",
62
+ "setToken.option1": " Option 1 — OpenClaw desktop app: Settings → Advanced → Gateway Token",
63
+ "setToken.option2": " Option 2 — Terminal:",
64
+ "setToken.option2cmd": " cat ~/.openclaw/openclaw.json | grep -A2 'auth'",
65
+ "setToken.option3": " Option 3 — If set via environment variable: echo $OPENCLAW_GATEWAY_TOKEN\n",
66
+ "setToken.prompt": "Gateway Token (leave blank to clear): ",
67
+ "setToken.saved": "\nToken saved to ~/.clawai/config.json.",
68
+ "setToken.cleared": "\nToken cleared from ~/.clawai/config.json.",
69
+ "setToken.restart": "Run 'clawpilot restart' to apply the change.\n",
70
+ };
71
+
72
+ const zh: Record<string, MsgValue> = {
73
+ // pair
74
+ "pair.alreadyRegistered": (id) => `网关已注册 (id=${id}),正在刷新访问码…`,
75
+ "pair.invalidCredentials": "凭证无效 (401),服务器无法识别此网关。\n请运行 `clawpilot reset` 清除配置后重新注册。",
76
+ "pair.refreshFailed": (status, body) => `刷新访问码失败:${status} ${body}`,
77
+ "pair.registering": "正在向中继服务器注册…",
78
+ "pair.registrationFailed": (status, body) => `注册失败:${status} ${body}`,
79
+ "pair.registered": (id) => `注册成功!网关 ID:${id}`,
80
+ "pair.scanQR": "\n请用 Clawai iOS 应用扫描此二维码:\n",
81
+ "pair.accessCode": (code) => `\n访问码(一次性使用):${code}`,
82
+ "pair.installingService": "\n正在安装/更新中继后台服务…",
83
+
84
+ // run
85
+ "run.starting": "正在启动 ClawAI 中继客户端…",
86
+ "run.gatewayId": (id) => ` 网关 ID: ${id}`,
87
+ "run.relayServer": (url) => ` 中继服务器:${url}`,
88
+ "run.gatewayUrl": (url) => ` 网关地址: ${url}`,
89
+ "run.connected": "中继已连接。",
90
+ "run.disconnected": "中继已断开,正在重连…",
91
+ "run.retry": (attempt, delay) => `第 ${attempt} 次重试,等待 ${delay}ms…`,
92
+
93
+ // install
94
+ "install.serviceStarted": (label) => `服务已安装并启动:${label}`,
95
+ "install.loadFailed": "加载 launchd 服务失败:",
96
+ "install.plistWritten": (path) => `Plist 已写入:${path}`,
97
+ "install.loadManually": (path) => `请手动运行:launchctl load -w "${path}"`,
98
+ "install.restarting": "正在重启中继服务…",
99
+ "install.serviceStopped": (label) => `服务已停止:${label}`,
100
+ "install.removePlistFailed": "删除 Plist 失败:",
101
+ "install.plistRemoved": (path) => `Plist 已删除:${path}`,
102
+ "install.stopped": (label) => `已停止:${label}`,
103
+ "install.stoppedAndRemoved": "中继客户端已停止并从 launchd 移除。",
104
+ "install.noService": "未找到正在运行的中继服务。",
105
+ "install.configRemoved": (path) => `配置文件已删除:${path}`,
106
+ "install.removeConfigFailed": "删除配置文件失败:",
107
+ "install.noConfig": "未找到配置文件。",
108
+ "install.resetComplete": "\n重置完成。请运行 `clawpilot pair` 重新注册。",
109
+
110
+ // status
111
+ "status.title": "── ClawPilot 中继客户端状态 ──\n",
112
+ "status.notPaired": "配置:✗ 未配对 — 请先运行 'clawpilot pair'",
113
+ "status.paired": "配置:✓ 已配对",
114
+ "status.displayName": (name) => ` 显示名称:${name}`,
115
+ "status.gatewayId": (id) => ` 网关 ID: ${id}`,
116
+ "status.relayServer": (url) => ` 中继服务器:${url}`,
117
+ "status.configCorrupted": "配置:✗ 文件存在但已损坏",
118
+ "status.gateway": (url) => `\n网关地址:${url}`,
119
+ "status.serviceNotInstalled": "\n服务:✗ 未安装 — 请运行 'clawpilot install'",
120
+ "status.serviceRunning": "\n服务:✓ 运行中 (launchd)",
121
+ "status.serviceLog": (path) => ` 日志:${path}`,
122
+ "status.serviceNotRunning": "\n服务:⚠ 已安装但未运行",
123
+ "status.servicePlist": (path) => ` Plist:${path}`,
124
+ "status.serviceStart": (label) => ` 启动命令:launchctl start ${label}`,
125
+
126
+ // set-token
127
+ "setToken.noPairing": "未找到配对配置,请先运行 'clawpilot pair'。",
128
+ "setToken.whereToFind": "\n如何查找 Gateway Token:",
129
+ "setToken.option1": " 方式一 — OpenClaw 桌面应用:设置 → 高级 → Gateway Token",
130
+ "setToken.option2": " 方式二 — 终端:",
131
+ "setToken.option2cmd": " cat ~/.openclaw/openclaw.json | grep -A2 'auth'",
132
+ "setToken.option3": " 方式三 — 若通过环境变量设置:echo $OPENCLAW_GATEWAY_TOKEN\n",
133
+ "setToken.prompt": "Gateway Token(留空则清除):",
134
+ "setToken.saved": "\nToken 已保存到 ~/.clawai/config.json。",
135
+ "setToken.cleared": "\nToken 已从 ~/.clawai/config.json 清除。",
136
+ "setToken.restart": "请运行 'clawpilot restart' 使修改生效。\n",
137
+ };
138
+
139
+ function detectLocale(): Locale {
140
+ const lang = process.env.LANG ?? process.env.LC_ALL ?? process.env.LANGUAGE ?? "";
141
+ return lang.toLowerCase().startsWith("zh") ? "zh" : "en";
142
+ }
143
+
144
+ const locale: Locale = detectLocale();
145
+ const msgs = locale === "zh" ? zh : en;
146
+
147
+ export function t(key: string, ...args: string[]): string {
148
+ const val = msgs[key] ?? en[key] ?? key;
149
+ if (typeof val === "function") return (val as MsgFn)(...args);
150
+ return val as string;
151
+ }
package/src/index.ts CHANGED
@@ -6,7 +6,7 @@ import { installCommand, uninstallCommand, stopCommand, restartCommand, resetCom
6
6
  import { statusCommand } from "./commands/status.js";
7
7
  import { setTokenCommand } from "./commands/set-token.js";
8
8
 
9
- const version = "1.0.10";
9
+ const version = "1.0.12";
10
10
 
11
11
  const program = new Command();
12
12