clawconnect-agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.env.example +41 -0
  2. package/README.md +259 -0
  3. package/README.zh-CN.md +329 -0
  4. package/dist/commands/backup-manager.d.ts +21 -0
  5. package/dist/commands/backup-manager.js +346 -0
  6. package/dist/commands/backup-manager.js.map +1 -0
  7. package/dist/commands/install.d.ts +6 -0
  8. package/dist/commands/install.js +107 -0
  9. package/dist/commands/install.js.map +1 -0
  10. package/dist/commands/local-handlers.d.ts +2 -0
  11. package/dist/commands/local-handlers.js +375 -0
  12. package/dist/commands/local-handlers.js.map +1 -0
  13. package/dist/commands/local-runtime.d.ts +36 -0
  14. package/dist/commands/local-runtime.js +445 -0
  15. package/dist/commands/local-runtime.js.map +1 -0
  16. package/dist/commands/pair.d.ts +7 -0
  17. package/dist/commands/pair.js +100 -0
  18. package/dist/commands/pair.js.map +1 -0
  19. package/dist/commands/provider-config.d.ts +35 -0
  20. package/dist/commands/provider-config.js +291 -0
  21. package/dist/commands/provider-config.js.map +1 -0
  22. package/dist/commands/provider-handlers.d.ts +2 -0
  23. package/dist/commands/provider-handlers.js +216 -0
  24. package/dist/commands/provider-handlers.js.map +1 -0
  25. package/dist/commands/provider-registry.d.ts +19 -0
  26. package/dist/commands/provider-registry.js +120 -0
  27. package/dist/commands/provider-registry.js.map +1 -0
  28. package/dist/commands/run.d.ts +1 -0
  29. package/dist/commands/run.js +35 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/commands/send-file-utils.d.ts +6 -0
  32. package/dist/commands/send-file-utils.js +94 -0
  33. package/dist/commands/send-file-utils.js.map +1 -0
  34. package/dist/commands/send-file.d.ts +41 -0
  35. package/dist/commands/send-file.js +492 -0
  36. package/dist/commands/send-file.js.map +1 -0
  37. package/dist/commands/set-token.d.ts +1 -0
  38. package/dist/commands/set-token.js +43 -0
  39. package/dist/commands/set-token.js.map +1 -0
  40. package/dist/commands/status.d.ts +1 -0
  41. package/dist/commands/status.js +135 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/commands/voice-reply.d.ts +39 -0
  44. package/dist/commands/voice-reply.js +329 -0
  45. package/dist/commands/voice-reply.js.map +1 -0
  46. package/dist/config/config.d.ts +32 -0
  47. package/dist/config/config.js +103 -0
  48. package/dist/config/config.js.map +1 -0
  49. package/dist/config/env.d.ts +16 -0
  50. package/dist/config/env.js +138 -0
  51. package/dist/config/env.js.map +1 -0
  52. package/dist/i18n/index.d.ts +1 -0
  53. package/dist/i18n/index.js +147 -0
  54. package/dist/i18n/index.js.map +1 -0
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.js +117 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/platform/service-manager-common.d.ts +26 -0
  59. package/dist/platform/service-manager-common.js +51 -0
  60. package/dist/platform/service-manager-common.js.map +1 -0
  61. package/dist/platform/service-manager-linux.d.ts +6 -0
  62. package/dist/platform/service-manager-linux.js +229 -0
  63. package/dist/platform/service-manager-linux.js.map +1 -0
  64. package/dist/platform/service-manager.d.ts +16 -0
  65. package/dist/platform/service-manager.js +165 -0
  66. package/dist/platform/service-manager.js.map +1 -0
  67. package/dist/relay/attachment-staging.d.ts +12 -0
  68. package/dist/relay/attachment-staging.js +116 -0
  69. package/dist/relay/attachment-staging.js.map +1 -0
  70. package/dist/relay/chat-history.d.ts +29 -0
  71. package/dist/relay/chat-history.js +69 -0
  72. package/dist/relay/chat-history.js.map +1 -0
  73. package/dist/relay/chat-payload.d.ts +6 -0
  74. package/dist/relay/chat-payload.js +170 -0
  75. package/dist/relay/chat-payload.js.map +1 -0
  76. package/dist/relay/chat-send-attachments.d.ts +4 -0
  77. package/dist/relay/chat-send-attachments.js +47 -0
  78. package/dist/relay/chat-send-attachments.js.map +1 -0
  79. package/dist/relay/gateway-client.d.ts +41 -0
  80. package/dist/relay/gateway-client.js +288 -0
  81. package/dist/relay/gateway-client.js.map +1 -0
  82. package/dist/relay/office-payload.d.ts +19 -0
  83. package/dist/relay/office-payload.js +205 -0
  84. package/dist/relay/office-payload.js.map +1 -0
  85. package/dist/relay/reconnect.d.ts +14 -0
  86. package/dist/relay/reconnect.js +27 -0
  87. package/dist/relay/reconnect.js.map +1 -0
  88. package/dist/relay/relay-manager.d.ts +36 -0
  89. package/dist/relay/relay-manager.js +619 -0
  90. package/dist/relay/relay-manager.js.map +1 -0
  91. package/dist/relay/session-context.d.ts +19 -0
  92. package/dist/relay/session-context.js +323 -0
  93. package/dist/relay/session-context.js.map +1 -0
  94. package/dist/relay/slash-command-catalog.d.ts +8 -0
  95. package/dist/relay/slash-command-catalog.generated.d.ts +226 -0
  96. package/dist/relay/slash-command-catalog.generated.js +275 -0
  97. package/dist/relay/slash-command-catalog.generated.js.map +1 -0
  98. package/dist/relay/slash-command-catalog.js +3 -0
  99. package/dist/relay/slash-command-catalog.js.map +1 -0
  100. package/dist/relay/voice-reply-preference.d.ts +25 -0
  101. package/dist/relay/voice-reply-preference.js +103 -0
  102. package/dist/relay/voice-reply-preference.js.map +1 -0
  103. package/package.json +50 -0
@@ -0,0 +1,445 @@
1
+ import { existsSync } from "fs";
2
+ import { dirname, join, resolve } from "path";
3
+ import { homedir } from "os";
4
+ import { execFileSync, execSync, spawn } from "child_process";
5
+ // ---------------------------------------------------------------------------
6
+ // Subprocess environment
7
+ //
8
+ // launchd services run with a minimal PATH that lacks:
9
+ // - The node binary itself (breaks #!/usr/bin/env node shebangs)
10
+ // - Homebrew / local bins (breaks finding `openclaw`)
11
+ //
12
+ // Fix: build a rich PATH for every subprocess by prepending:
13
+ // 1. dirname(process.execPath) -- the dir containing the node binary running
14
+ // this very process. Guarantees #!/usr/bin/env node always resolves.
15
+ // 2. Common package-manager bin dirs (homebrew, /usr/local).
16
+ // ---------------------------------------------------------------------------
17
+ const NODE_BIN_DIR = dirname(process.execPath);
18
+ const SUBPROCESS_ENV = {
19
+ ...process.env,
20
+ HOME: homedir(),
21
+ PATH: [
22
+ NODE_BIN_DIR,
23
+ join(homedir(), ".openclaw", "bin"),
24
+ join(homedir(), ".local", "bin"),
25
+ join(homedir(), ".npm-global", "bin"),
26
+ process.env.PNPM_HOME,
27
+ join(homedir(), ".local", "share", "pnpm"),
28
+ "/opt/homebrew/bin",
29
+ "/opt/homebrew/sbin",
30
+ "/usr/local/bin",
31
+ "/usr/local/sbin",
32
+ process.env.PATH ?? "/usr/bin:/bin",
33
+ ].join(":"),
34
+ };
35
+ function canRunOpenclawBin(candidate) {
36
+ try {
37
+ execFileSync(candidate, ["--version"], { stdio: "pipe", env: SUBPROCESS_ENV, timeout: 3000 });
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ function bundledOpenclawBin() {
45
+ const explicitPackageBin = process.env.OPENCLAW_PACKAGE_BIN?.trim();
46
+ if (explicitPackageBin && existsSync(explicitPackageBin)) {
47
+ return explicitPackageBin;
48
+ }
49
+ const candidate = resolve(NODE_BIN_DIR, "..", "lib", "node_modules", "openclaw", "openclaw.mjs");
50
+ return existsSync(candidate) ? candidate : null;
51
+ }
52
+ export function selectOpenclawBinCandidate(options) {
53
+ const exists = options.exists ?? existsSync;
54
+ const canRun = options.canRun ?? canRunOpenclawBin;
55
+ const explicitBin = options.explicitBin?.trim();
56
+ if (explicitBin && exists(explicitBin) && canRun(explicitBin)) {
57
+ return explicitBin;
58
+ }
59
+ const candidates = [
60
+ options.pathBin,
61
+ ...(options.extraBins ?? []),
62
+ options.packageBin ?? undefined,
63
+ ]
64
+ .map((candidate) => candidate?.trim())
65
+ .filter((candidate) => Boolean(candidate && exists(candidate)));
66
+ for (const candidate of candidates) {
67
+ if (canRun(candidate)) {
68
+ return candidate;
69
+ }
70
+ }
71
+ return "openclaw";
72
+ }
73
+ function resolveOpenclawBin() {
74
+ let pathBin;
75
+ try {
76
+ const p = execSync("which openclaw", { stdio: "pipe", env: SUBPROCESS_ENV, timeout: 3000 })
77
+ .toString().trim();
78
+ pathBin = p || undefined;
79
+ }
80
+ catch {
81
+ // fall through
82
+ }
83
+ return selectOpenclawBinCandidate({
84
+ explicitBin: process.env.OPENCLAW_BIN,
85
+ pathBin,
86
+ extraBins: [
87
+ join(homedir(), ".openclaw", "bin", "openclaw"),
88
+ join(homedir(), ".local", "bin", "openclaw"),
89
+ join(homedir(), ".npm-global", "bin", "openclaw"),
90
+ ...(process.env.PNPM_HOME ? [join(process.env.PNPM_HOME, "openclaw")] : []),
91
+ join(homedir(), ".local", "share", "pnpm", "openclaw"),
92
+ ],
93
+ packageBin: bundledOpenclawBin(),
94
+ });
95
+ }
96
+ let cachedOpenclawBin = null;
97
+ function getOpenclawBin() {
98
+ if (cachedOpenclawBin == null) {
99
+ cachedOpenclawBin = resolveOpenclawBin();
100
+ }
101
+ return cachedOpenclawBin;
102
+ }
103
+ export function execErrorOutput(err) {
104
+ const e = err;
105
+ const out = e.stdout?.toString() ?? "";
106
+ const errStr = e.stderr?.toString() ?? "";
107
+ if (out && errStr)
108
+ return `${out}\n${errStr}`;
109
+ return out || errStr;
110
+ }
111
+ export function errorMessage(err) {
112
+ if (err instanceof Error) {
113
+ return err.message;
114
+ }
115
+ return String(err);
116
+ }
117
+ /** Run openclaw with the resolved path and the enriched subprocess environment. */
118
+ export function openclaw(args) {
119
+ return execSync(`"${getOpenclawBin()}" ${args}`, { stdio: "pipe", env: SUBPROCESS_ENV });
120
+ }
121
+ function launchGatewayLifecycleCommand(action, source = "clawconnect") {
122
+ try {
123
+ const child = spawn(getOpenclawBin(), ["gateway", action], {
124
+ env: SUBPROCESS_ENV,
125
+ stdio: "ignore",
126
+ detached: true,
127
+ windowsHide: true,
128
+ });
129
+ child.once("error", (err) => {
130
+ console.warn(`[${source}] gateway ${action} failed to start:`, String(err));
131
+ });
132
+ child.unref();
133
+ return { ok: true, payload: { output: `Gateway ${action} requested.` } };
134
+ }
135
+ catch (err) {
136
+ const output = execErrorOutput(err);
137
+ return output ? { ok: true, payload: { output } } : { ok: false, error: errorMessage(err) };
138
+ }
139
+ }
140
+ export function parseGatewayRuntimeState(output) {
141
+ const stripped = output.replace(/\u001B\[[0-9;]*[A-Za-z]/g, "");
142
+ const runtimeLine = stripped
143
+ .split(/\r?\n/)
144
+ .map((line) => line.trim())
145
+ .find((line) => /^Runtime:/i.test(line));
146
+ if (!runtimeLine) {
147
+ return "unknown";
148
+ }
149
+ const runtime = runtimeLine.replace(/^Runtime:\s*/i, "").trim().toLowerCase();
150
+ if (runtime === "running" || (runtime.includes("running") && !runtime.includes("not running"))) {
151
+ return "running";
152
+ }
153
+ if (runtime === "stopped" || runtime.includes("stopped") || runtime.includes("not running")) {
154
+ return "stopped";
155
+ }
156
+ return "unknown";
157
+ }
158
+ export function resolveGatewayRemoteRestartAction(runtime) {
159
+ return runtime === "running" ? "restart" : "start";
160
+ }
161
+ function readGatewayRuntimeState() {
162
+ try {
163
+ const output = openclaw("gateway status --no-probe").toString();
164
+ return parseGatewayRuntimeState(output);
165
+ }
166
+ catch (err) {
167
+ return parseGatewayRuntimeState(execErrorOutput(err));
168
+ }
169
+ }
170
+ export function requestGatewayRestart(source = "clawconnect", context = {}) {
171
+ if (context.publishEvent && context.requestId) {
172
+ return runGatewayLifecycleStreaming("restart", context);
173
+ }
174
+ return launchGatewayLifecycleCommand("restart", source);
175
+ }
176
+ export function requestGatewayRemoteRestart(source = "clawconnect", context = {}) {
177
+ const runtime = readGatewayRuntimeState();
178
+ const action = resolveGatewayRemoteRestartAction(runtime);
179
+ if (context.publishEvent && context.requestId) {
180
+ return runGatewayLifecycleStreaming(action, context);
181
+ }
182
+ return launchGatewayLifecycleCommand(action, source);
183
+ }
184
+ export async function runGatewayLifecycleStreaming(action, context = {}) {
185
+ const openclawBin = getOpenclawBin();
186
+ const child = spawn(openclawBin, ["gateway", action], {
187
+ env: SUBPROCESS_ENV,
188
+ stdio: ["ignore", "pipe", "pipe"],
189
+ windowsHide: true,
190
+ });
191
+ let output = "";
192
+ let sequence = 0;
193
+ const buffers = {
194
+ stdout: "",
195
+ stderr: "",
196
+ };
197
+ const publishEvent = context.publishEvent;
198
+ const requestId = context.requestId;
199
+ const gatewayId = context.gatewayId;
200
+ const emitLine = (stream, line) => {
201
+ const trimmed = line.replace(/\u001B\[[0-9;]*[A-Za-z]/g, "").replace(/\r$/, "");
202
+ if (!trimmed && stream !== "stderr") {
203
+ return;
204
+ }
205
+ const timestamp = new Date().toISOString();
206
+ if (publishEvent) {
207
+ publishEvent({
208
+ type: "event",
209
+ event: "doctor_fix_log",
210
+ payload: {
211
+ gatewayId,
212
+ requestId,
213
+ runId: requestId,
214
+ stream,
215
+ seq: sequence += 1,
216
+ ts: Date.parse(timestamp),
217
+ text: trimmed,
218
+ },
219
+ });
220
+ }
221
+ };
222
+ const pump = (stream, label) => {
223
+ if (!stream) {
224
+ return;
225
+ }
226
+ stream.on("data", (chunk) => {
227
+ const text = typeof chunk === "string" ? chunk : chunk.toString();
228
+ if (!text.trim()) {
229
+ return;
230
+ }
231
+ const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
232
+ buffers[label] += normalized;
233
+ const parts = buffers[label].split("\n");
234
+ buffers[label] = parts.pop() ?? "";
235
+ for (const part of parts) {
236
+ const line = part.replace(/\u001B\[[0-9;]*[A-Za-z]/g, "").trimEnd();
237
+ output += `${line}\n`;
238
+ emitLine(label, line);
239
+ }
240
+ });
241
+ stream.once("end", () => {
242
+ const trailing = buffers[label].replace(/\u001B\[[0-9;]*[A-Za-z]/g, "").trimEnd();
243
+ if (trailing) {
244
+ output += `${trailing}\n`;
245
+ emitLine(label, trailing);
246
+ }
247
+ });
248
+ };
249
+ pump(child.stdout, "stdout");
250
+ pump(child.stderr, "stderr");
251
+ emitLine("stdout", `Running: openclaw gateway ${action}...`);
252
+ return await new Promise((resolve) => {
253
+ let settled = false;
254
+ const finish = (result) => {
255
+ if (settled) {
256
+ return;
257
+ }
258
+ settled = true;
259
+ resolve(result);
260
+ };
261
+ child.once("error", (error) => {
262
+ if (publishEvent) {
263
+ publishEvent({
264
+ type: "event",
265
+ event: "doctor_fix_log",
266
+ payload: {
267
+ gatewayId,
268
+ requestId,
269
+ runId: requestId,
270
+ stream: "stderr",
271
+ seq: sequence += 1,
272
+ ts: Date.now(),
273
+ text: `failed to start gateway ${action}: ${String(error)}`,
274
+ },
275
+ });
276
+ }
277
+ finish({ ok: false, error: errorMessage(error) });
278
+ });
279
+ child.once("close", (code, signal) => {
280
+ if (settled) {
281
+ return;
282
+ }
283
+ const exitSummary = typeof code === "number"
284
+ ? `openclaw gateway ${action} exited with code ${code}`
285
+ : `openclaw gateway ${action} exited${signal ? ` with signal ${signal}` : ""}`;
286
+ if (publishEvent) {
287
+ publishEvent({
288
+ type: "event",
289
+ event: "doctor_fix_log",
290
+ payload: {
291
+ gatewayId,
292
+ requestId,
293
+ runId: requestId,
294
+ stream: "status",
295
+ seq: sequence += 1,
296
+ ts: Date.now(),
297
+ text: exitSummary,
298
+ },
299
+ });
300
+ }
301
+ if (code && code !== 0) {
302
+ finish({
303
+ ok: false,
304
+ error: output.trim() ? `${exitSummary}\n${output.trim()}` : exitSummary,
305
+ });
306
+ return;
307
+ }
308
+ finish({
309
+ ok: true,
310
+ payload: { output: output.trim() || `openclaw gateway ${action} completed.` },
311
+ });
312
+ });
313
+ });
314
+ }
315
+ export async function runDoctorFix(context = {}) {
316
+ const openclawBin = getOpenclawBin();
317
+ const child = spawn(openclawBin, ["doctor", "--fix"], {
318
+ env: SUBPROCESS_ENV,
319
+ stdio: ["ignore", "pipe", "pipe"],
320
+ windowsHide: true,
321
+ });
322
+ let output = "";
323
+ let sequence = 0;
324
+ const buffers = {
325
+ stdout: "",
326
+ stderr: "",
327
+ };
328
+ const publishEvent = context.publishEvent;
329
+ const requestId = context.requestId;
330
+ const gatewayId = context.gatewayId;
331
+ const emitLine = (stream, line) => {
332
+ const trimmed = line.replace(/\u001B\[[0-9;]*[A-Za-z]/g, "").replace(/\r$/, "");
333
+ if (!trimmed && stream !== "stderr") {
334
+ return;
335
+ }
336
+ const timestamp = new Date().toISOString();
337
+ if (publishEvent) {
338
+ publishEvent({
339
+ type: "event",
340
+ event: "doctor_fix_log",
341
+ payload: {
342
+ gatewayId,
343
+ requestId,
344
+ runId: requestId,
345
+ stream,
346
+ seq: sequence += 1,
347
+ ts: Date.parse(timestamp),
348
+ text: trimmed,
349
+ },
350
+ });
351
+ }
352
+ };
353
+ const pump = (stream, label) => {
354
+ if (!stream) {
355
+ return;
356
+ }
357
+ stream.on("data", (chunk) => {
358
+ const text = typeof chunk === "string" ? chunk : chunk.toString();
359
+ if (!text.trim()) {
360
+ return;
361
+ }
362
+ const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
363
+ buffers[label] += normalized;
364
+ const parts = buffers[label].split("\n");
365
+ buffers[label] = parts.pop() ?? "";
366
+ for (const part of parts) {
367
+ const line = part.replace(/\u001B\[[0-9;]*[A-Za-z]/g, "").trimEnd();
368
+ output += `${line}\n`;
369
+ emitLine(label, line);
370
+ }
371
+ });
372
+ stream.once("end", () => {
373
+ const trailing = buffers[label].replace(/\u001B\[[0-9;]*[A-Za-z]/g, "").trimEnd();
374
+ if (trailing) {
375
+ output += `${trailing}\n`;
376
+ emitLine(label, trailing);
377
+ }
378
+ });
379
+ };
380
+ pump(child.stdout, "stdout");
381
+ pump(child.stderr, "stderr");
382
+ return await new Promise((resolve) => {
383
+ let settled = false;
384
+ const finish = (result) => {
385
+ if (settled) {
386
+ return;
387
+ }
388
+ settled = true;
389
+ resolve(result);
390
+ };
391
+ child.once("error", (error) => {
392
+ if (publishEvent) {
393
+ publishEvent({
394
+ type: "event",
395
+ event: "doctor_fix_log",
396
+ payload: {
397
+ gatewayId,
398
+ requestId,
399
+ runId: requestId,
400
+ stream: "stderr",
401
+ seq: sequence += 1,
402
+ ts: Date.now(),
403
+ text: `failed to start: ${String(error)}`,
404
+ },
405
+ });
406
+ }
407
+ finish({ ok: false, error: errorMessage(error) });
408
+ });
409
+ child.once("close", (code, signal) => {
410
+ if (settled) {
411
+ return;
412
+ }
413
+ const exitSummary = typeof code === "number"
414
+ ? `openclaw doctor --fix exited with code ${code}`
415
+ : `openclaw doctor --fix exited${signal ? ` with signal ${signal}` : ""}`;
416
+ if (publishEvent) {
417
+ publishEvent({
418
+ type: "event",
419
+ event: "doctor_fix_log",
420
+ payload: {
421
+ gatewayId,
422
+ requestId,
423
+ runId: requestId,
424
+ stream: "status",
425
+ seq: sequence += 1,
426
+ ts: Date.now(),
427
+ text: exitSummary,
428
+ },
429
+ });
430
+ }
431
+ if (code && code !== 0) {
432
+ finish({
433
+ ok: false,
434
+ error: output.trim() ? `${exitSummary}\n${output.trim()}` : exitSummary,
435
+ });
436
+ return;
437
+ }
438
+ finish({
439
+ ok: true,
440
+ payload: { output: output.trim() || "openclaw doctor --fix completed." },
441
+ });
442
+ });
443
+ });
444
+ }
445
+ //# sourceMappingURL=local-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runtime.js","sourceRoot":"","sources":["../../src/commands/local-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface PairOptions {
2
+ server?: string;
3
+ name?: string;
4
+ codeOnly?: boolean;
5
+ }
6
+ export declare function pairCommand(opts: PairOptions): Promise<void>;
7
+ export {};
@@ -0,0 +1,100 @@
1
+ import { configExists, readConfig, writeConfig } from "../config/config.js";
2
+ import { installCommand } from "./install.js";
3
+ import qrcodeTerminal from "qrcode-terminal";
4
+ import { t } from "../i18n/index.js";
5
+ import { execSync } from "child_process";
6
+ import { hostname } from "os";
7
+ import { getServicePlatform } from "../platform/service-manager.js";
8
+ import { toRelayHttpBase } from "./send-file-utils.js";
9
+ import { getDefaultRelayServerUrl } from "../config/env.js";
10
+ export async function pairCommand(opts) {
11
+ let gatewayId;
12
+ let relaySecret;
13
+ let accessCode;
14
+ let displayName;
15
+ let relayServerUrl;
16
+ if (configExists()) {
17
+ const config = readConfig();
18
+ relayServerUrl = opts.server ?? config.relayServerUrl ?? getDefaultRelayServerUrl();
19
+ gatewayId = config.gatewayId;
20
+ relaySecret = config.relaySecret;
21
+ displayName = opts.name ? sanitizeDisplayName(opts.name) : config.displayName;
22
+ console.log(t("pair.alreadyRegistered", gatewayId));
23
+ const httpBase = toRelayHttpBase(relayServerUrl);
24
+ const res = await fetch(`${httpBase}/api/relay/accesscode`, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/json" },
27
+ body: JSON.stringify({ gatewayId, relaySecret }),
28
+ });
29
+ if (!res.ok) {
30
+ const body = await res.text();
31
+ if (res.status === 401) {
32
+ throw new Error(t("pair.invalidCredentials"));
33
+ }
34
+ throw new Error(t("pair.refreshFailed", String(res.status), body));
35
+ }
36
+ const data = (await res.json());
37
+ accessCode = data.accessCode;
38
+ writeConfig({ ...config, relayServerUrl, displayName });
39
+ }
40
+ else {
41
+ relayServerUrl = opts.server ?? getDefaultRelayServerUrl();
42
+ displayName = opts.name ? sanitizeDisplayName(opts.name) : getDisplayName();
43
+ console.log(t("pair.registering"));
44
+ const httpBase = toRelayHttpBase(relayServerUrl);
45
+ const res = await fetch(`${httpBase}/api/relay/register`, {
46
+ method: "POST",
47
+ headers: { "Content-Type": "application/json" },
48
+ body: JSON.stringify({ displayName }),
49
+ });
50
+ if (!res.ok) {
51
+ const body = await res.text();
52
+ throw new Error(t("pair.registrationFailed", String(res.status), body));
53
+ }
54
+ const data = (await res.json());
55
+ gatewayId = data.gatewayId;
56
+ relaySecret = data.relaySecret;
57
+ accessCode = data.accessCode;
58
+ writeConfig({ relayServerUrl, gatewayId, relaySecret, displayName });
59
+ console.log(t("pair.registered", gatewayId));
60
+ }
61
+ const httpBase = toRelayHttpBase(relayServerUrl);
62
+ const qrPayload = JSON.stringify({
63
+ version: 1,
64
+ server: httpBase,
65
+ gatewayId,
66
+ accessCode,
67
+ displayName,
68
+ });
69
+ if (opts.codeOnly) {
70
+ console.log(accessCode);
71
+ }
72
+ else {
73
+ console.log(t("pair.scanQR"));
74
+ qrcodeTerminal.generate(qrPayload, { small: true });
75
+ console.log(t("pair.accessCode", accessCode));
76
+ }
77
+ console.log(t("pair.installingService"));
78
+ installCommand();
79
+ }
80
+ function sanitizeDisplayName(name) {
81
+ // Replace smart quotes and other problematic characters with regular ones
82
+ return name
83
+ .replace(/[\u2018\u2019\u201C\u201D]/g, "'") // Smart quotes -> regular quotes
84
+ .replace(/[\u2013\u2014]/g, "-") // En/em dashes -> regular dash
85
+ .replace(/[\u00A0]/g, " ") // Non-breaking space -> regular space
86
+ .replace(/[^\x20-\x7E]/g, ""); // Remove any other non-ASCII characters
87
+ }
88
+ function getDisplayName() {
89
+ if (getServicePlatform() !== "macos") {
90
+ return hostname();
91
+ }
92
+ try {
93
+ const raw = execSync("scutil --get ComputerName", { encoding: "utf8" }).trim();
94
+ return sanitizeDisplayName(raw);
95
+ }
96
+ catch {
97
+ return hostname();
98
+ }
99
+ }
100
+ //# sourceMappingURL=pair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface ProviderEntry {
2
+ id: string;
3
+ type: string;
4
+ name: string;
5
+ baseUrl: string;
6
+ modelId: string | null;
7
+ keyMasked: string | null;
8
+ hasKey: boolean;
9
+ isDefault: boolean;
10
+ }
11
+ export interface ConfiguredModelEntry {
12
+ providerId: string;
13
+ provider: string;
14
+ modelId: string;
15
+ alias: string;
16
+ name: string;
17
+ contextWindow: string;
18
+ tags: string[];
19
+ isSelected: boolean;
20
+ isDefault: boolean;
21
+ }
22
+ export declare function listProviderEntries(): Promise<ProviderEntry[]>;
23
+ export declare function listConfiguredModels(): Promise<ConfiguredModelEntry[]>;
24
+ export declare function addProvider(params: {
25
+ id: string;
26
+ type: string;
27
+ apiKey: string | null;
28
+ baseUrl: string;
29
+ api: string;
30
+ apiKeyEnvName: string;
31
+ modelId?: string;
32
+ }): Promise<void>;
33
+ export declare function deleteProvider(id: string): Promise<void>;
34
+ export declare function setDefaultProvider(id: string): Promise<void>;
35
+ export declare function setDefaultModel(providerId: string, modelId: string): Promise<void>;