@openclaw-cloud/agent-controller 2.0.0 → 2.2.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.
- package/bin/agent-controller.js +11 -2
- package/dist/commands/bootstrap.js +3 -28
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/channel-server.d.ts +17 -0
- package/dist/commands/channel-server.js +71 -0
- package/dist/commands/channel-server.js.map +1 -0
- package/dist/config-file.js +6 -0
- package/dist/config-file.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -1
- package/dist/connection.js +11 -0
- package/dist/connection.js.map +1 -1
- package/dist/handlers/board-handler.js +56 -20
- package/dist/handlers/board-handler.js.map +1 -1
- package/dist/handlers/chat.d.ts +17 -0
- package/dist/handlers/chat.js +93 -0
- package/dist/handlers/chat.js.map +1 -1
- package/dist/handlers/memory.d.ts +6 -0
- package/dist/handlers/memory.js +100 -13
- package/dist/handlers/memory.js.map +1 -1
- package/dist/index.js +47 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/claude-code/channel-server.d.ts +60 -0
- package/dist/providers/claude-code/channel-server.js +155 -0
- package/dist/providers/claude-code/channel-server.js.map +1 -0
- package/dist/providers/claude-code/index.d.ts +68 -0
- package/dist/providers/claude-code/index.js +280 -0
- package/dist/providers/claude-code/index.js.map +1 -0
- package/dist/providers/claude-code/login-flow.d.ts +26 -0
- package/dist/providers/claude-code/login-flow.js +135 -0
- package/dist/providers/claude-code/login-flow.js.map +1 -0
- package/dist/providers/claude-code/settings-writer.d.ts +29 -0
- package/dist/providers/claude-code/settings-writer.js +94 -0
- package/dist/providers/claude-code/settings-writer.js.map +1 -0
- package/dist/providers/claude-code/socket-bridge.d.ts +98 -0
- package/dist/providers/claude-code/socket-bridge.js +301 -0
- package/dist/providers/claude-code/socket-bridge.js.map +1 -0
- package/dist/providers/claude-code/spawn-claude.d.ts +48 -0
- package/dist/providers/claude-code/spawn-claude.js +108 -0
- package/dist/providers/claude-code/spawn-claude.js.map +1 -0
- package/dist/providers/index.d.ts +3 -1
- package/dist/providers/index.js +16 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/utils/agent-controller-bin.d.ts +8 -0
- package/dist/utils/agent-controller-bin.js +58 -0
- package/dist/utils/agent-controller-bin.js.map +1 -0
- package/dist/utils/anthropic-auth.d.ts +25 -0
- package/dist/utils/anthropic-auth.js +13 -0
- package/dist/utils/anthropic-auth.js.map +1 -0
- package/dist/utils/apply-config.d.ts +28 -0
- package/dist/utils/apply-config.js +226 -0
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/claude-env.js +9 -4
- package/dist/utils/claude-env.js.map +1 -1
- package/dist/utils/config-merge-paths.d.ts +21 -0
- package/dist/utils/config-merge-paths.js +27 -0
- package/dist/utils/config-merge-paths.js.map +1 -0
- package/dist/utils/write-workspace-files.d.ts +15 -0
- package/dist/utils/write-workspace-files.js +48 -0
- package/dist/utils/write-workspace-files.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-bridge.js","sourceRoot":"","sources":["../../../src/providers/claude-code/socket-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { spawn, type ChildProcess } from 'node:child_process';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
export interface SpawnClaudeDeps {
|
|
4
|
+
/** Working directory for the claude process (workspace). */
|
|
5
|
+
workspaceDir: string;
|
|
6
|
+
/** Channels plugin flag argument (defaults to `plugin:agent-controller`). */
|
|
7
|
+
channelsFlag?: string;
|
|
8
|
+
/** Extra CLI flags to append. */
|
|
9
|
+
extraArgs?: string[];
|
|
10
|
+
/** Environment variables to merge on top of process.env. */
|
|
11
|
+
env?: Record<string, string | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Pass `--dangerously-load-development-channels` to claude. Only needed
|
|
14
|
+
* when the channels feature is routed through an MCP-based dev plugin;
|
|
15
|
+
* production flows do not require it. Default: `false`.
|
|
16
|
+
*/
|
|
17
|
+
danglyDev?: boolean;
|
|
18
|
+
/** Override spawn (tests). */
|
|
19
|
+
spawnFn?: typeof spawn;
|
|
20
|
+
/** Max retries on crash (default 5). */
|
|
21
|
+
maxRetries?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Supervise a `claude` subprocess. Emits:
|
|
25
|
+
* - `stderr` (Buffer)
|
|
26
|
+
* - `stdout` (Buffer)
|
|
27
|
+
* - `spawn` (ChildProcess)
|
|
28
|
+
* - `exit` (code|null, signal|null)
|
|
29
|
+
* - `gaveup` — too many crashes, no more restarts.
|
|
30
|
+
*
|
|
31
|
+
* Restart on crash with capped exponential backoff.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ClaudeProcess extends EventEmitter {
|
|
34
|
+
private readonly deps;
|
|
35
|
+
private child;
|
|
36
|
+
private retries;
|
|
37
|
+
private shuttingDown;
|
|
38
|
+
private lastSpawnAt;
|
|
39
|
+
constructor(deps: SpawnClaudeDeps);
|
|
40
|
+
start(): void;
|
|
41
|
+
private spawnOnce;
|
|
42
|
+
private buildArgs;
|
|
43
|
+
/** Send SIGINT to interrupt the current turn. */
|
|
44
|
+
interrupt(): void;
|
|
45
|
+
stop(): void;
|
|
46
|
+
isRunning(): boolean;
|
|
47
|
+
getChild(): ChildProcess | null;
|
|
48
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { logCollector } from '../../connection.js';
|
|
4
|
+
/**
|
|
5
|
+
* Supervise a `claude` subprocess. Emits:
|
|
6
|
+
* - `stderr` (Buffer)
|
|
7
|
+
* - `stdout` (Buffer)
|
|
8
|
+
* - `spawn` (ChildProcess)
|
|
9
|
+
* - `exit` (code|null, signal|null)
|
|
10
|
+
* - `gaveup` — too many crashes, no more restarts.
|
|
11
|
+
*
|
|
12
|
+
* Restart on crash with capped exponential backoff.
|
|
13
|
+
*/
|
|
14
|
+
export class ClaudeProcess extends EventEmitter {
|
|
15
|
+
deps;
|
|
16
|
+
child = null;
|
|
17
|
+
retries = 0;
|
|
18
|
+
shuttingDown = false;
|
|
19
|
+
lastSpawnAt = 0;
|
|
20
|
+
constructor(deps) {
|
|
21
|
+
super();
|
|
22
|
+
this.deps = deps;
|
|
23
|
+
}
|
|
24
|
+
start() {
|
|
25
|
+
if (this.child)
|
|
26
|
+
return;
|
|
27
|
+
this.shuttingDown = false;
|
|
28
|
+
this.spawnOnce();
|
|
29
|
+
}
|
|
30
|
+
spawnOnce() {
|
|
31
|
+
const spawnFn = this.deps.spawnFn ?? spawn;
|
|
32
|
+
const args = this.buildArgs();
|
|
33
|
+
this.lastSpawnAt = Date.now();
|
|
34
|
+
const child = spawnFn('claude', args, {
|
|
35
|
+
cwd: this.deps.workspaceDir,
|
|
36
|
+
env: { ...process.env, ...(this.deps.env ?? {}) },
|
|
37
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
38
|
+
});
|
|
39
|
+
this.child = child;
|
|
40
|
+
child.stdout?.on('data', (data) => this.emit('stdout', data));
|
|
41
|
+
child.stderr?.on('data', (data) => {
|
|
42
|
+
this.emit('stderr', data);
|
|
43
|
+
logCollector?.push('claude_stderr', 'debug', data.toString().slice(0, 500));
|
|
44
|
+
});
|
|
45
|
+
child.on('error', (err) => {
|
|
46
|
+
logCollector?.push('claude_spawn_error', 'error', err.message);
|
|
47
|
+
this.emit('error', err);
|
|
48
|
+
});
|
|
49
|
+
child.on('exit', (code, signal) => {
|
|
50
|
+
this.emit('exit', code, signal);
|
|
51
|
+
this.child = null;
|
|
52
|
+
if (this.shuttingDown)
|
|
53
|
+
return;
|
|
54
|
+
// Reset retries on a healthy long run
|
|
55
|
+
if (Date.now() - this.lastSpawnAt > 60_000)
|
|
56
|
+
this.retries = 0;
|
|
57
|
+
const maxRetries = this.deps.maxRetries ?? 5;
|
|
58
|
+
// Semantics: maxRetries is the number of RESTART attempts allowed.
|
|
59
|
+
// Increment first, then check — so maxRetries=5 yields exactly 5 restarts
|
|
60
|
+
// (retry counts 1..5) before giving up on the 6th crash.
|
|
61
|
+
this.retries += 1;
|
|
62
|
+
if (this.retries > maxRetries) {
|
|
63
|
+
logCollector?.push('claude_giveup', 'error', `claude crashed too many times (${this.retries - 1}/${maxRetries}), giving up`);
|
|
64
|
+
this.emit('gaveup');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const backoff = Math.min(30_000, 500 * 2 ** (this.retries - 1));
|
|
68
|
+
logCollector?.push('claude_restart_scheduled', 'warn', `claude exited code=${code ?? 'null'} sig=${signal ?? 'null'}; retry ${this.retries}/${maxRetries} in ${backoff}ms`);
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
if (!this.shuttingDown)
|
|
71
|
+
this.spawnOnce();
|
|
72
|
+
}, backoff).unref();
|
|
73
|
+
});
|
|
74
|
+
this.emit('spawn', child);
|
|
75
|
+
logCollector?.push('claude_spawned', 'info', `claude spawned (pid=${child.pid})`);
|
|
76
|
+
}
|
|
77
|
+
buildArgs() {
|
|
78
|
+
const args = ['--channels', this.deps.channelsFlag ?? 'plugin:agent-controller'];
|
|
79
|
+
if (this.deps.danglyDev === true)
|
|
80
|
+
args.push('--dangerously-load-development-channels');
|
|
81
|
+
if (this.deps.extraArgs)
|
|
82
|
+
args.push(...this.deps.extraArgs);
|
|
83
|
+
return args;
|
|
84
|
+
}
|
|
85
|
+
/** Send SIGINT to interrupt the current turn. */
|
|
86
|
+
interrupt() {
|
|
87
|
+
this.child?.kill('SIGINT');
|
|
88
|
+
}
|
|
89
|
+
stop() {
|
|
90
|
+
this.shuttingDown = true;
|
|
91
|
+
if (this.child) {
|
|
92
|
+
try {
|
|
93
|
+
this.child.kill('SIGTERM');
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* ignore */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.child = null;
|
|
100
|
+
}
|
|
101
|
+
isRunning() {
|
|
102
|
+
return !!this.child && this.child.exitCode === null;
|
|
103
|
+
}
|
|
104
|
+
getChild() {
|
|
105
|
+
return this.child;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=spawn-claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-claude.js","sourceRoot":"","sources":["../../../src/providers/claude-code/spawn-claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,10 @@ export type { ChatSession, ChatMessage, ChatAttachment, ChatContentBlock, IChatP
|
|
|
4
4
|
export { OpenclawProvider } from './openclaw/index.js';
|
|
5
5
|
export { MockProvider } from './mock/index.js';
|
|
6
6
|
export type { MockAction } from './mock/index.js';
|
|
7
|
+
export { ClaudeCodeProvider } from './claude-code/index.js';
|
|
8
|
+
export type { ClaudeCodeProviderConfig } from './claude-code/index.js';
|
|
7
9
|
export declare function configureProvider(provider: IAgentProvider): void;
|
|
8
10
|
export declare function getProvider(): IAgentProvider | null;
|
|
9
11
|
/** For testing only — reset the global provider */
|
|
10
12
|
export declare function resetProvider(): void;
|
|
11
|
-
export declare function createProvider(type: string, config: Record<string, string>): IAgentProvider;
|
|
13
|
+
export declare function createProvider(type: string, config: Record<string, string | undefined>): IAgentProvider;
|
package/dist/providers/index.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { OpenclawProvider } from './openclaw/index.js';
|
|
2
2
|
import { MockProvider } from './mock/index.js';
|
|
3
|
+
import { ClaudeCodeProvider } from './claude-code/index.js';
|
|
4
|
+
import { getWorkspaceDir } from '../workspace.js';
|
|
3
5
|
export { OpenclawProvider } from './openclaw/index.js';
|
|
4
6
|
export { MockProvider } from './mock/index.js';
|
|
7
|
+
export { ClaudeCodeProvider } from './claude-code/index.js';
|
|
5
8
|
let _provider = null;
|
|
6
9
|
export function configureProvider(provider) {
|
|
7
10
|
_provider = provider;
|
|
@@ -19,6 +22,19 @@ export function createProvider(type, config) {
|
|
|
19
22
|
return new OpenclawProvider(config.wsUrl ?? 'ws://localhost:18789', config.wsToken ?? '');
|
|
20
23
|
case 'mock':
|
|
21
24
|
return new MockProvider();
|
|
25
|
+
case 'claude-code':
|
|
26
|
+
return new ClaudeCodeProvider({
|
|
27
|
+
// Prefer explicit workspaceDir from caller; otherwise fall back to the
|
|
28
|
+
// shared workspace util so K8s / VM / standalone all resolve
|
|
29
|
+
// consistently (no hardcoded /home/ubuntu).
|
|
30
|
+
workspaceDir: config.workspaceDir ?? getWorkspaceDir(),
|
|
31
|
+
anthropicApiKey: config.anthropicApiKey,
|
|
32
|
+
anthropicAuthToken: config.anthropicAuthToken,
|
|
33
|
+
claudeCodeOauthToken: config.claudeCodeOauthToken,
|
|
34
|
+
backendUrl: config.backendUrl,
|
|
35
|
+
agentToken: config.agentToken,
|
|
36
|
+
claudeMdContent: config.claudeMdContent,
|
|
37
|
+
});
|
|
22
38
|
default:
|
|
23
39
|
throw new Error(`Unknown provider type: ${type}`);
|
|
24
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAUlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,IAAI,SAAS,GAA0B,IAAI,CAAC;AAE5C,MAAM,UAAU,iBAAiB,CAAC,QAAwB;IACxD,SAAS,GAAG,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,aAAa;IAC3B,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,MAA0C;IAE1C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC5F,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,KAAK,aAAa;YAChB,OAAO,IAAI,kBAAkB,CAAC;gBAC5B,uEAAuE;gBACvE,6DAA6D;gBAC7D,4CAA4C;gBAC5C,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,eAAe,EAAE;gBACtD,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;gBACjD,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC,CAAC,CAAC;QACL;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the absolute path to the `agent-controller` executable, or
|
|
3
|
+
* `undefined` when resolution fails (e.g. when running under `npx` from a
|
|
4
|
+
* temp directory with an unusual layout).
|
|
5
|
+
*/
|
|
6
|
+
export declare function getAgentControllerBinPath(): string | undefined;
|
|
7
|
+
/** Test-only: reset the cached value. */
|
|
8
|
+
export declare function __resetAgentControllerBinCacheForTests(): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the absolute path of the `agent-controller` executable currently
|
|
3
|
+
* running this process. Used when writing `.mcp.json` for Claude Code so that
|
|
4
|
+
* spawned subprocesses do not depend on PATH containing the npm-global bin.
|
|
5
|
+
*
|
|
6
|
+
* Resolution order:
|
|
7
|
+
* 1. `which agent-controller` (via spawnSync) — finds the version the user
|
|
8
|
+
* installed on PATH. Most reliable on both macOS and Linux.
|
|
9
|
+
* 2. Fallback to `process.argv[1]` — absolute path to the script Node ran,
|
|
10
|
+
* i.e. the `bin/agent-controller.js` entry.
|
|
11
|
+
* 3. Returns `undefined` if neither resolves to an absolute path — callers
|
|
12
|
+
* should then fall back to the bare command `agent-controller`.
|
|
13
|
+
*
|
|
14
|
+
* Result is cached in a module-level variable.
|
|
15
|
+
*/
|
|
16
|
+
import { spawnSync } from 'node:child_process';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
let cached;
|
|
19
|
+
function runWhich() {
|
|
20
|
+
try {
|
|
21
|
+
const res = spawnSync('which', ['agent-controller'], { encoding: 'utf8' });
|
|
22
|
+
if (res.status === 0) {
|
|
23
|
+
const out = (res.stdout || '').trim().split('\n')[0]?.trim();
|
|
24
|
+
if (out && path.isAbsolute(out)) {
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// ignore — `which` may not exist on some platforms (Windows)
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
function fromArgv() {
|
|
35
|
+
const argv1 = process.argv[1];
|
|
36
|
+
if (argv1 && path.isAbsolute(argv1)) {
|
|
37
|
+
return argv1;
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns the absolute path to the `agent-controller` executable, or
|
|
43
|
+
* `undefined` when resolution fails (e.g. when running under `npx` from a
|
|
44
|
+
* temp directory with an unusual layout).
|
|
45
|
+
*/
|
|
46
|
+
export function getAgentControllerBinPath() {
|
|
47
|
+
if (cached !== undefined) {
|
|
48
|
+
return cached ?? undefined;
|
|
49
|
+
}
|
|
50
|
+
const resolved = runWhich() ?? fromArgv();
|
|
51
|
+
cached = resolved ?? null;
|
|
52
|
+
return resolved;
|
|
53
|
+
}
|
|
54
|
+
/** Test-only: reset the cached value. */
|
|
55
|
+
export function __resetAgentControllerBinCacheForTests() {
|
|
56
|
+
cached = undefined;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=agent-controller-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-controller-bin.js","sourceRoot":"","sources":["../../src/utils/agent-controller-bin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,IAAI,MAAiC,CAAC;AAEtC,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC7D,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;IAC1C,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,sCAAsC;IACpD,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared classifier for Anthropic credentials.
|
|
3
|
+
*
|
|
4
|
+
* Both `providers/claude-code/settings-writer.ts` and `utils/claude-env.ts`
|
|
5
|
+
* need the same rule when writing Claude settings.json: an OAuth-like token
|
|
6
|
+
* (prefix `sk-ant-oat`) must be passed via `ANTHROPIC_AUTH_TOKEN`, a regular
|
|
7
|
+
* API key via `ANTHROPIC_API_KEY`, and an explicit auth token (when provided)
|
|
8
|
+
* wins over both.
|
|
9
|
+
*
|
|
10
|
+
* Returning a discriminated union keeps both call sites in sync and means
|
|
11
|
+
* the precedence is documented in one place.
|
|
12
|
+
*/
|
|
13
|
+
export type AnthropicAuth = {
|
|
14
|
+
kind: 'auth_token';
|
|
15
|
+
value: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'api_key';
|
|
18
|
+
value: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'none';
|
|
21
|
+
};
|
|
22
|
+
export declare function classifyAnthropicAuth(input: {
|
|
23
|
+
anthropicAuthToken?: string;
|
|
24
|
+
anthropicApiKey?: string;
|
|
25
|
+
}): AnthropicAuth;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function classifyAnthropicAuth(input) {
|
|
2
|
+
const authToken = input.anthropicAuthToken?.trim();
|
|
3
|
+
if (authToken)
|
|
4
|
+
return { kind: 'auth_token', value: authToken };
|
|
5
|
+
const apiKey = input.anthropicApiKey?.trim();
|
|
6
|
+
if (!apiKey)
|
|
7
|
+
return { kind: 'none' };
|
|
8
|
+
// `sk-ant-oat*` are OAuth access tokens — must use ANTHROPIC_AUTH_TOKEN.
|
|
9
|
+
if (apiKey.startsWith('sk-ant-oat'))
|
|
10
|
+
return { kind: 'auth_token', value: apiKey };
|
|
11
|
+
return { kind: 'api_key', value: apiKey };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=anthropic-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-auth.js","sourceRoot":"","sources":["../../src/utils/anthropic-auth.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,qBAAqB,CAAC,KAGrC;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAE/D,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAErC,yEAAyE;IACzE,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAElF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -7,3 +7,31 @@ import type { BootstrapResult } from '../api.js';
|
|
|
7
7
|
* 4. Restart gateway
|
|
8
8
|
*/
|
|
9
9
|
export declare function applyBootstrapConfig(data: BootstrapResult): Promise<void>;
|
|
10
|
+
type MergeOutcome = 'added' | 'equal' | 'conflict' | 'merged';
|
|
11
|
+
interface MergeResult {
|
|
12
|
+
changed: boolean;
|
|
13
|
+
outcomes: Array<{
|
|
14
|
+
path: string;
|
|
15
|
+
outcome: MergeOutcome;
|
|
16
|
+
detail?: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Merge allowlisted mergeable sections from remote payload into existing
|
|
21
|
+
* openclaw.json. Used for standalone deployments where users own their own
|
|
22
|
+
* config and a full overwrite would destroy customizations.
|
|
23
|
+
*
|
|
24
|
+
* Rules:
|
|
25
|
+
* - Only paths in `MERGEABLE_CONFIG_PATHS` are considered.
|
|
26
|
+
* - Missing local value → remote is written.
|
|
27
|
+
* - Equal values → no-op.
|
|
28
|
+
* - Differing values → conflict, local wins, warn+skip logged.
|
|
29
|
+
* - For `mcpServers` (and other object paths): conflict detection is
|
|
30
|
+
* per-key inside the dict.
|
|
31
|
+
* - Does NOT restart the gateway (standalone owns their own lifecycle).
|
|
32
|
+
* - Settings.json (~/.claude/settings.json) gets the same treatment for
|
|
33
|
+
* `mcpServers` and `env` only — apiKeyHelper/permissions/etc untouched.
|
|
34
|
+
* - auth-profiles.json and .env are NOT touched on standalone.
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyMergeableConfig(data: BootstrapResult): Promise<MergeResult>;
|
|
37
|
+
export {};
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
3
4
|
import { writeClaudeEnv } from './claude-env.js';
|
|
5
|
+
import { writeWorkspaceFiles } from './write-workspace-files.js';
|
|
4
6
|
import { restartGateway } from './gateway-restart.js';
|
|
5
7
|
import { VM_ENV_PATH } from '../config-file.js';
|
|
6
8
|
import { config } from '../config.js';
|
|
9
|
+
import { getWorkspaceDir } from '../workspace.js';
|
|
10
|
+
import { MERGEABLE_CONFIG_PATHS, MERGEABLE_SETTINGS_PATHS } from './config-merge-paths.js';
|
|
7
11
|
function getOpenclawDir() {
|
|
8
12
|
return config.stateDir;
|
|
9
13
|
}
|
|
@@ -87,6 +91,12 @@ export async function applyBootstrapConfig(data) {
|
|
|
87
91
|
await fs.writeFile(configPath, JSON.stringify(data.openclawConfig, null, 2) + '\n');
|
|
88
92
|
console.log('[apply-config] openclaw.json updated');
|
|
89
93
|
}
|
|
94
|
+
// 1a. Write workspace files (shared files pushed by backend on update_config)
|
|
95
|
+
if (data.workspaceFiles && Object.keys(data.workspaceFiles).length > 0) {
|
|
96
|
+
const workspaceDir = getWorkspaceDir();
|
|
97
|
+
await writeWorkspaceFiles(data.workspaceFiles, workspaceDir);
|
|
98
|
+
console.log(`[apply-config] wrote ${Object.keys(data.workspaceFiles).length} workspace files`);
|
|
99
|
+
}
|
|
90
100
|
// 2. Write auth-profiles.json from openclawConfig.auth.profiles + envVars (API keys)
|
|
91
101
|
if (data.openclawConfig && data.envVars) {
|
|
92
102
|
await writeAuthProfiles(data.openclawConfig, data.envVars);
|
|
@@ -121,4 +131,220 @@ export async function applyBootstrapConfig(data) {
|
|
|
121
131
|
console.error('[apply-config] gateway restart failed:', err instanceof Error ? err.message : err);
|
|
122
132
|
}
|
|
123
133
|
}
|
|
134
|
+
function isPlainObject(v) {
|
|
135
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
136
|
+
}
|
|
137
|
+
function deepEqual(a, b) {
|
|
138
|
+
if (a === b)
|
|
139
|
+
return true;
|
|
140
|
+
if (typeof a !== typeof b)
|
|
141
|
+
return false;
|
|
142
|
+
if (a === null || b === null)
|
|
143
|
+
return a === b;
|
|
144
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
145
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
|
|
146
|
+
return false;
|
|
147
|
+
for (let i = 0; i < a.length; i++)
|
|
148
|
+
if (!deepEqual(a[i], b[i]))
|
|
149
|
+
return false;
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
if (isPlainObject(a) && isPlainObject(b)) {
|
|
153
|
+
const ak = Object.keys(a);
|
|
154
|
+
const bk = Object.keys(b);
|
|
155
|
+
if (ak.length !== bk.length)
|
|
156
|
+
return false;
|
|
157
|
+
for (const k of ak)
|
|
158
|
+
if (!deepEqual(a[k], b[k]))
|
|
159
|
+
return false;
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
/** Walk dot-path into object; returns undefined if any segment missing. */
|
|
165
|
+
function getPath(obj, dotPath) {
|
|
166
|
+
const parts = dotPath.split('.');
|
|
167
|
+
let cur = obj;
|
|
168
|
+
for (const p of parts) {
|
|
169
|
+
if (!isPlainObject(cur))
|
|
170
|
+
return undefined;
|
|
171
|
+
cur = cur[p];
|
|
172
|
+
}
|
|
173
|
+
return cur;
|
|
174
|
+
}
|
|
175
|
+
/** Set dot-path on object, creating intermediate objects as needed. */
|
|
176
|
+
function setPath(obj, dotPath, value) {
|
|
177
|
+
const parts = dotPath.split('.');
|
|
178
|
+
let cur = obj;
|
|
179
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
180
|
+
const key = parts[i];
|
|
181
|
+
if (!isPlainObject(cur[key]))
|
|
182
|
+
cur[key] = {};
|
|
183
|
+
cur = cur[key];
|
|
184
|
+
}
|
|
185
|
+
cur[parts[parts.length - 1]] = value;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Merge a single allowlisted path from remote into local.
|
|
189
|
+
*
|
|
190
|
+
* Semantics:
|
|
191
|
+
* - If local missing → copy remote (added).
|
|
192
|
+
* - If both plain objects → key-by-key merge; new keys added, conflicting
|
|
193
|
+
* keys (existing key with different value) logged + skipped (local wins).
|
|
194
|
+
* - Otherwise (scalars / arrays / subtree) → equality check: equal = no-op,
|
|
195
|
+
* differ = conflict (local wins).
|
|
196
|
+
*/
|
|
197
|
+
function mergePath(local, remote, dotPath, logPrefix) {
|
|
198
|
+
const remoteVal = getPath(remote, dotPath);
|
|
199
|
+
if (remoteVal === undefined)
|
|
200
|
+
return { changed: false, outcome: 'equal' };
|
|
201
|
+
const localVal = getPath(local, dotPath);
|
|
202
|
+
if (localVal === undefined) {
|
|
203
|
+
setPath(local, dotPath, remoteVal);
|
|
204
|
+
console.log(`${logPrefix} ADDED ${dotPath}`);
|
|
205
|
+
return { changed: true, outcome: 'added' };
|
|
206
|
+
}
|
|
207
|
+
// Both objects → key-level merge
|
|
208
|
+
if (isPlainObject(localVal) && isPlainObject(remoteVal)) {
|
|
209
|
+
let anyAdded = false;
|
|
210
|
+
const conflicts = [];
|
|
211
|
+
for (const [k, v] of Object.entries(remoteVal)) {
|
|
212
|
+
if (!(k in localVal)) {
|
|
213
|
+
localVal[k] = v;
|
|
214
|
+
anyAdded = true;
|
|
215
|
+
console.log(`${logPrefix} ADDED ${dotPath}.${k}`);
|
|
216
|
+
}
|
|
217
|
+
else if (!deepEqual(localVal[k], v)) {
|
|
218
|
+
conflicts.push(k);
|
|
219
|
+
console.warn(`[config-merge] SKIPPED conflict at ${dotPath}.${k}: keeping local value`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (conflicts.length > 0 && !anyAdded) {
|
|
223
|
+
return { changed: false, outcome: 'conflict', detail: conflicts.join(',') };
|
|
224
|
+
}
|
|
225
|
+
if (conflicts.length > 0 && anyAdded) {
|
|
226
|
+
return { changed: true, outcome: 'merged', detail: `conflicts:${conflicts.join(',')}` };
|
|
227
|
+
}
|
|
228
|
+
if (anyAdded)
|
|
229
|
+
return { changed: true, outcome: 'merged' };
|
|
230
|
+
return { changed: false, outcome: 'equal' };
|
|
231
|
+
}
|
|
232
|
+
// Leaf or array or mismatched types → equality check
|
|
233
|
+
if (deepEqual(localVal, remoteVal)) {
|
|
234
|
+
return { changed: false, outcome: 'equal' };
|
|
235
|
+
}
|
|
236
|
+
console.warn(`[config-merge] SKIPPED conflict at ${dotPath}: keeping local value`);
|
|
237
|
+
return { changed: false, outcome: 'conflict' };
|
|
238
|
+
}
|
|
239
|
+
async function readJsonSafe(filePath) {
|
|
240
|
+
try {
|
|
241
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
242
|
+
const parsed = JSON.parse(raw);
|
|
243
|
+
return isPlainObject(parsed) ? parsed : null;
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function writeJsonAtomic(filePath, data, mode) {
|
|
250
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
251
|
+
const tmp = filePath + '.tmp';
|
|
252
|
+
const opts = mode !== undefined ? { mode } : undefined;
|
|
253
|
+
await fs.writeFile(tmp, JSON.stringify(data, null, 2) + '\n', opts);
|
|
254
|
+
await fs.rename(tmp, filePath);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Merge allowlisted mergeable sections from remote payload into existing
|
|
258
|
+
* openclaw.json. Used for standalone deployments where users own their own
|
|
259
|
+
* config and a full overwrite would destroy customizations.
|
|
260
|
+
*
|
|
261
|
+
* Rules:
|
|
262
|
+
* - Only paths in `MERGEABLE_CONFIG_PATHS` are considered.
|
|
263
|
+
* - Missing local value → remote is written.
|
|
264
|
+
* - Equal values → no-op.
|
|
265
|
+
* - Differing values → conflict, local wins, warn+skip logged.
|
|
266
|
+
* - For `mcpServers` (and other object paths): conflict detection is
|
|
267
|
+
* per-key inside the dict.
|
|
268
|
+
* - Does NOT restart the gateway (standalone owns their own lifecycle).
|
|
269
|
+
* - Settings.json (~/.claude/settings.json) gets the same treatment for
|
|
270
|
+
* `mcpServers` and `env` only — apiKeyHelper/permissions/etc untouched.
|
|
271
|
+
* - auth-profiles.json and .env are NOT touched on standalone.
|
|
272
|
+
*/
|
|
273
|
+
export async function applyMergeableConfig(data) {
|
|
274
|
+
const result = { changed: false, outcomes: [] };
|
|
275
|
+
// Surface the intentional MVP gap: workspace files are skipped on standalone.
|
|
276
|
+
if (data.workspaceFiles && Object.keys(data.workspaceFiles).length > 0) {
|
|
277
|
+
console.log('[config-merge] workspaceFiles not applied on standalone — intentional MVP limitation');
|
|
278
|
+
}
|
|
279
|
+
// --- openclaw.json ---
|
|
280
|
+
if (data.openclawConfig && isPlainObject(data.openclawConfig)) {
|
|
281
|
+
const openclawDir = config.stateDir;
|
|
282
|
+
const configPath = path.join(openclawDir, 'openclaw.json');
|
|
283
|
+
const existing = await readJsonSafe(configPath);
|
|
284
|
+
const local = existing ?? {};
|
|
285
|
+
const isFreshFile = existing === null;
|
|
286
|
+
let changed = false;
|
|
287
|
+
for (const p of MERGEABLE_CONFIG_PATHS) {
|
|
288
|
+
const r = mergePath(local, data.openclawConfig, p, '[config-merge]');
|
|
289
|
+
result.outcomes.push({ path: p, outcome: r.outcome, detail: r.detail });
|
|
290
|
+
if (r.changed)
|
|
291
|
+
changed = true;
|
|
292
|
+
}
|
|
293
|
+
if (changed || (isFreshFile && Object.keys(local).length > 0)) {
|
|
294
|
+
await writeJsonAtomic(configPath, local);
|
|
295
|
+
result.changed = true;
|
|
296
|
+
console.log(`[config-merge] openclaw.json ${isFreshFile ? 'created' : 'updated'} at ${configPath}`);
|
|
297
|
+
}
|
|
298
|
+
else if (isFreshFile) {
|
|
299
|
+
console.log('[config-merge] openclaw.json absent and no mergeable sections in bootstrap — nothing written');
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
console.log('[config-merge] openclaw.json unchanged');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// --- ~/.claude/settings.json ---
|
|
306
|
+
// Only merge if we have either envVars (→ env) or mcpServers in the payload.
|
|
307
|
+
const settingsLikeRemote = {};
|
|
308
|
+
if (data.envVars && Object.keys(data.envVars).length > 0) {
|
|
309
|
+
const cleanEnv = {};
|
|
310
|
+
for (const [k, v] of Object.entries(data.envVars))
|
|
311
|
+
if (v !== '')
|
|
312
|
+
cleanEnv[k] = v;
|
|
313
|
+
if (Object.keys(cleanEnv).length > 0)
|
|
314
|
+
settingsLikeRemote.env = cleanEnv;
|
|
315
|
+
}
|
|
316
|
+
if (data.openclawConfig &&
|
|
317
|
+
isPlainObject(data.openclawConfig) &&
|
|
318
|
+
isPlainObject(data.openclawConfig.mcpServers)) {
|
|
319
|
+
settingsLikeRemote.mcpServers = data.openclawConfig.mcpServers;
|
|
320
|
+
}
|
|
321
|
+
if (Object.keys(settingsLikeRemote).length > 0) {
|
|
322
|
+
const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
|
|
323
|
+
const existing = await readJsonSafe(settingsPath);
|
|
324
|
+
// Only touch settings.json if the user already has one — we don't want to
|
|
325
|
+
// synthesize Claude CLI settings on a machine that doesn't use Claude CLI.
|
|
326
|
+
if (existing) {
|
|
327
|
+
const local = existing;
|
|
328
|
+
let changed = false;
|
|
329
|
+
for (const p of MERGEABLE_SETTINGS_PATHS) {
|
|
330
|
+
const r = mergePath(local, settingsLikeRemote, p, '[settings-merge]');
|
|
331
|
+
result.outcomes.push({ path: `settings:${p}`, outcome: r.outcome, detail: r.detail });
|
|
332
|
+
if (r.changed)
|
|
333
|
+
changed = true;
|
|
334
|
+
}
|
|
335
|
+
if (changed) {
|
|
336
|
+
await writeJsonAtomic(settingsPath, local);
|
|
337
|
+
result.changed = true;
|
|
338
|
+
console.log(`[settings-merge] settings.json updated at ${settingsPath}`);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
console.log('[settings-merge] settings.json unchanged');
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
console.log('[settings-merge] ~/.claude/settings.json absent — skipping (standalone user owns it)');
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return result;
|
|
349
|
+
}
|
|
124
350
|
//# sourceMappingURL=apply-config.js.map
|