@openclaw-cloud/agent-controller 1.0.0-beta.13 → 1.0.0-beta.14

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 (35) hide show
  1. package/bin/agent-controller.js +3 -0
  2. package/dist/commands/channel-server.d.ts +17 -0
  3. package/dist/commands/channel-server.js +71 -0
  4. package/dist/commands/channel-server.js.map +1 -0
  5. package/dist/config.d.ts +2 -0
  6. package/dist/config.js +4 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/handlers/board-handler.js +32 -19
  9. package/dist/handlers/board-handler.js.map +1 -1
  10. package/dist/handlers/chat.d.ts +15 -0
  11. package/dist/handlers/chat.js +42 -0
  12. package/dist/handlers/chat.js.map +1 -1
  13. package/dist/index.js +12 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/providers/claude-code/channel-server.d.ts +60 -0
  16. package/dist/providers/claude-code/channel-server.js +155 -0
  17. package/dist/providers/claude-code/channel-server.js.map +1 -0
  18. package/dist/providers/claude-code/index.d.ts +46 -9
  19. package/dist/providers/claude-code/index.js +248 -19
  20. package/dist/providers/claude-code/index.js.map +1 -1
  21. package/dist/providers/claude-code/login-flow.d.ts +26 -0
  22. package/dist/providers/claude-code/login-flow.js +129 -0
  23. package/dist/providers/claude-code/login-flow.js.map +1 -0
  24. package/dist/providers/claude-code/settings-writer.d.ts +29 -0
  25. package/dist/providers/claude-code/settings-writer.js +79 -0
  26. package/dist/providers/claude-code/settings-writer.js.map +1 -0
  27. package/dist/providers/claude-code/socket-bridge.d.ts +88 -0
  28. package/dist/providers/claude-code/socket-bridge.js +288 -0
  29. package/dist/providers/claude-code/socket-bridge.js.map +1 -0
  30. package/dist/providers/claude-code/spawn-claude.d.ts +44 -0
  31. package/dist/providers/claude-code/spawn-claude.js +105 -0
  32. package/dist/providers/claude-code/spawn-claude.js.map +1 -0
  33. package/dist/providers/index.js +3 -0
  34. package/dist/providers/index.js.map +1 -1
  35. package/package.json +1 -1
@@ -0,0 +1,44 @@
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
+ /** Allow `--dangerously-load-development-channels` (default true). */
13
+ danglyDev?: boolean;
14
+ /** Override spawn (tests). */
15
+ spawnFn?: typeof spawn;
16
+ /** Max retries on crash (default 5). */
17
+ maxRetries?: number;
18
+ }
19
+ /**
20
+ * Supervise a `claude` subprocess. Emits:
21
+ * - `stderr` (Buffer)
22
+ * - `stdout` (Buffer)
23
+ * - `spawn` (ChildProcess)
24
+ * - `exit` (code|null, signal|null)
25
+ * - `gaveup` — too many crashes, no more restarts.
26
+ *
27
+ * Restart on crash with capped exponential backoff.
28
+ */
29
+ export declare class ClaudeProcess extends EventEmitter {
30
+ private readonly deps;
31
+ private child;
32
+ private retries;
33
+ private shuttingDown;
34
+ private lastSpawnAt;
35
+ constructor(deps: SpawnClaudeDeps);
36
+ start(): void;
37
+ private spawnOnce;
38
+ private buildArgs;
39
+ /** Send SIGINT to interrupt the current turn. */
40
+ interrupt(): void;
41
+ stop(): void;
42
+ isRunning(): boolean;
43
+ getChild(): ChildProcess | null;
44
+ }
@@ -0,0 +1,105 @@
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
+ if (this.retries >= maxRetries) {
59
+ logCollector?.push('claude_giveup', 'error', `claude crashed too many times (${this.retries}), giving up`);
60
+ this.emit('gaveup');
61
+ return;
62
+ }
63
+ this.retries += 1;
64
+ const backoff = Math.min(30_000, 500 * 2 ** (this.retries - 1));
65
+ logCollector?.push('claude_restart_scheduled', 'warn', `claude exited code=${code ?? 'null'} sig=${signal ?? 'null'}; retry ${this.retries}/${maxRetries} in ${backoff}ms`);
66
+ setTimeout(() => {
67
+ if (!this.shuttingDown)
68
+ this.spawnOnce();
69
+ }, backoff).unref();
70
+ });
71
+ this.emit('spawn', child);
72
+ logCollector?.push('claude_spawned', 'info', `claude spawned (pid=${child.pid})`);
73
+ }
74
+ buildArgs() {
75
+ const args = ['--channels', this.deps.channelsFlag ?? 'plugin:agent-controller'];
76
+ if (this.deps.danglyDev !== false)
77
+ args.push('--dangerously-load-development-channels');
78
+ if (this.deps.extraArgs)
79
+ args.push(...this.deps.extraArgs);
80
+ return args;
81
+ }
82
+ /** Send SIGINT to interrupt the current turn. */
83
+ interrupt() {
84
+ this.child?.kill('SIGINT');
85
+ }
86
+ stop() {
87
+ this.shuttingDown = true;
88
+ if (this.child) {
89
+ try {
90
+ this.child.kill('SIGTERM');
91
+ }
92
+ catch {
93
+ /* ignore */
94
+ }
95
+ }
96
+ this.child = null;
97
+ }
98
+ isRunning() {
99
+ return !!this.child && this.child.exitCode === null;
100
+ }
101
+ getChild() {
102
+ return this.child;
103
+ }
104
+ }
105
+ //# 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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"}
@@ -27,6 +27,9 @@ export function createProvider(type, config) {
27
27
  anthropicApiKey: config.anthropicApiKey,
28
28
  anthropicAuthToken: config.anthropicAuthToken,
29
29
  claudeCodeOauthToken: config.claudeCodeOauthToken,
30
+ backendUrl: config.backendUrl,
31
+ agentToken: config.agentToken,
32
+ claudeMdContent: config.claudeMdContent,
30
33
  });
31
34
  default:
32
35
  throw new Error(`Unknown provider type: ${type}`);
@@ -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;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAU5D,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,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,gCAAgC;gBACrE,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;aAClD,CAAC,CAAC;QACL;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,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;AAU5D,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,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,gCAAgC;gBACrE,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw-cloud/agent-controller",
3
- "version": "1.0.0-beta.13",
3
+ "version": "1.0.0-beta.14",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {