@openclaw-cloud/agent-controller 2.3.2 → 2.3.3
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.
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type AutoPairOutcome = {
|
|
2
|
+
status: 'approved';
|
|
3
|
+
requestId: string;
|
|
4
|
+
deviceId: string;
|
|
5
|
+
} | {
|
|
6
|
+
status: 'skipped';
|
|
7
|
+
reason: 'cli_missing' | 'no_pending' | 'no_match' | 'list_failed' | 'approve_failed' | 'identity_error';
|
|
8
|
+
detail?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Best-effort one-shot auto-approval of our own pending pairing request via
|
|
12
|
+
* the local `openclaw` CLI. Never throws — all failures resolve to a
|
|
13
|
+
* `{ status: 'skipped', reason }` outcome so the caller can treat it as a
|
|
14
|
+
* no-op and continue its retry loop.
|
|
15
|
+
*/
|
|
16
|
+
export declare function autoApproveOwnPairing(): Promise<AutoPairOutcome>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { logCollector } from '../../connection.js';
|
|
4
|
+
import { toErrorMessage } from '../../utils/response.js';
|
|
5
|
+
import { loadOrCreateDeviceIdentity } from './device-identity.js';
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
const CLI_TIMEOUT_MS = 10_000;
|
|
8
|
+
function isErrnoException(e) {
|
|
9
|
+
return e instanceof Error && typeof e.code === 'string';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Best-effort one-shot auto-approval of our own pending pairing request via
|
|
13
|
+
* the local `openclaw` CLI. Never throws — all failures resolve to a
|
|
14
|
+
* `{ status: 'skipped', reason }` outcome so the caller can treat it as a
|
|
15
|
+
* no-op and continue its retry loop.
|
|
16
|
+
*/
|
|
17
|
+
export async function autoApproveOwnPairing() {
|
|
18
|
+
let ownDeviceId;
|
|
19
|
+
try {
|
|
20
|
+
ownDeviceId = loadOrCreateDeviceIdentity().deviceId;
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const detail = toErrorMessage(err);
|
|
24
|
+
logCollector?.push('chat_provider_auto_pair', 'warn', `Failed to load device identity: ${detail}`, {});
|
|
25
|
+
return { status: 'skipped', reason: 'identity_error', detail };
|
|
26
|
+
}
|
|
27
|
+
logCollector?.push('chat_provider_auto_pair', 'info', 'Pairing required — attempting auto-approve', { deviceId: ownDeviceId });
|
|
28
|
+
// 1. List pending pairing requests.
|
|
29
|
+
let listStdout;
|
|
30
|
+
try {
|
|
31
|
+
const { stdout } = await execFileAsync('openclaw', ['devices', 'list', '--json'], {
|
|
32
|
+
timeout: CLI_TIMEOUT_MS,
|
|
33
|
+
});
|
|
34
|
+
listStdout = stdout;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (isErrnoException(err) && err.code === 'ENOENT') {
|
|
38
|
+
logCollector?.push('chat_provider_auto_pair', 'warn', 'openclaw CLI not found in PATH — skipping auto-pair', { deviceId: ownDeviceId });
|
|
39
|
+
return { status: 'skipped', reason: 'cli_missing' };
|
|
40
|
+
}
|
|
41
|
+
const detail = toErrorMessage(err);
|
|
42
|
+
logCollector?.push('chat_provider_auto_pair', 'warn', `openclaw devices list failed: ${detail}`, { deviceId: ownDeviceId });
|
|
43
|
+
return { status: 'skipped', reason: 'list_failed', detail };
|
|
44
|
+
}
|
|
45
|
+
// 2. Parse the JSON payload.
|
|
46
|
+
let parsed;
|
|
47
|
+
try {
|
|
48
|
+
parsed = JSON.parse(listStdout);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const detail = toErrorMessage(err);
|
|
52
|
+
logCollector?.push('chat_provider_auto_pair', 'warn', `openclaw devices list failed: ${detail}`, { deviceId: ownDeviceId, parseError: true });
|
|
53
|
+
return { status: 'skipped', reason: 'list_failed', detail };
|
|
54
|
+
}
|
|
55
|
+
const pending = Array.isArray(parsed?.pending) ? parsed.pending : [];
|
|
56
|
+
if (pending.length === 0) {
|
|
57
|
+
logCollector?.push('chat_provider_auto_pair', 'info', 'No pending pairing requests on gateway', { deviceId: ownDeviceId });
|
|
58
|
+
return { status: 'skipped', reason: 'no_pending' };
|
|
59
|
+
}
|
|
60
|
+
// 3. Match our own deviceId.
|
|
61
|
+
const match = pending.find((p) => p?.deviceId === ownDeviceId);
|
|
62
|
+
if (!match) {
|
|
63
|
+
logCollector?.push('chat_provider_auto_pair', 'warn', 'No pending request matches our deviceId', { ownDeviceId, pendingCount: pending.length });
|
|
64
|
+
return { status: 'skipped', reason: 'no_match' };
|
|
65
|
+
}
|
|
66
|
+
// 4. Approve.
|
|
67
|
+
const { requestId } = match;
|
|
68
|
+
try {
|
|
69
|
+
await execFileAsync('openclaw', ['devices', 'approve', requestId, '--json'], {
|
|
70
|
+
timeout: CLI_TIMEOUT_MS,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const detail = toErrorMessage(err);
|
|
75
|
+
logCollector?.push('chat_provider_auto_pair', 'warn', `openclaw devices approve failed: ${detail}`, { requestId, deviceId: ownDeviceId });
|
|
76
|
+
return { status: 'skipped', reason: 'approve_failed', detail };
|
|
77
|
+
}
|
|
78
|
+
logCollector?.push('chat_provider_auto_pair', 'info', 'Approved own pending pairing request', {
|
|
79
|
+
requestId,
|
|
80
|
+
deviceId: ownDeviceId,
|
|
81
|
+
});
|
|
82
|
+
return { status: 'approved', requestId, deviceId: ownDeviceId };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=auto-pair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-pair.js","sourceRoot":"","sources":["../../../src/providers/openclaw/auto-pair.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import net from 'node:net';
|
|
2
2
|
import { OpenclawGatewayAdapter } from './gateway-adapter.js';
|
|
3
|
+
import { autoApproveOwnPairing } from './auto-pair.js';
|
|
3
4
|
export { OpenclawGatewayAdapter } from './gateway-adapter.js';
|
|
4
5
|
function tcpPing(host, port, timeoutMs) {
|
|
5
6
|
return new Promise((resolve) => {
|
|
@@ -41,6 +42,7 @@ export class OpenclawProvider {
|
|
|
41
42
|
this._connecting = (async () => {
|
|
42
43
|
const maxRetries = 5;
|
|
43
44
|
const baseDelayMs = 2000;
|
|
45
|
+
let attemptedAutoPair = false;
|
|
44
46
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
45
47
|
try {
|
|
46
48
|
// Always create fresh adapter — old one may have stale state after gateway restart
|
|
@@ -55,6 +57,14 @@ export class OpenclawProvider {
|
|
|
55
57
|
console.warn(`Chat provider connect failed (attempt ${attempt}/${maxRetries}): ${msg}`);
|
|
56
58
|
this.adapter?.disconnect();
|
|
57
59
|
this.adapter = null;
|
|
60
|
+
if (!attemptedAutoPair && msg.includes('pairing required')) {
|
|
61
|
+
attemptedAutoPair = true;
|
|
62
|
+
const outcome = await autoApproveOwnPairing();
|
|
63
|
+
if (outcome.status === 'approved') {
|
|
64
|
+
// Skip back-off — retry immediately on the next iteration
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
58
68
|
if (attempt < maxRetries) {
|
|
59
69
|
await new Promise((r) => setTimeout(r, baseDelayMs * Math.min(attempt, 5)));
|
|
60
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openclaw/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openclaw/index.ts"],"names":[],"mappings":"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"}
|