agent-relay 3.0.2 → 3.1.1
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/README.md +8 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/dist/index.cjs +273 -56
- package/dist/src/cli/commands/core.d.ts +2 -0
- package/dist/src/cli/commands/core.d.ts.map +1 -1
- package/dist/src/cli/commands/core.js +9 -2
- package/dist/src/cli/commands/core.js.map +1 -1
- package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
- package/dist/src/cli/lib/broker-lifecycle.js +87 -28
- package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
- package/package.json +9 -9
- package/packages/acp-bridge/README.md +50 -67
- package/packages/acp-bridge/package.json +2 -2
- package/packages/config/package.json +1 -1
- package/packages/hooks/package.json +4 -4
- package/packages/memory/package.json +2 -2
- package/packages/openclaw/README.md +78 -0
- package/packages/openclaw/bin/relay-openclaw.mjs +2 -0
- package/packages/openclaw/bridge/bridge.mjs +305 -0
- package/packages/openclaw/dist/__tests__/gateway-threads.test.d.ts +2 -0
- package/packages/openclaw/dist/__tests__/gateway-threads.test.d.ts.map +1 -0
- package/packages/openclaw/dist/__tests__/gateway-threads.test.js +320 -0
- package/packages/openclaw/dist/__tests__/gateway-threads.test.js.map +1 -0
- package/packages/openclaw/dist/__tests__/naming.test.d.ts +2 -0
- package/packages/openclaw/dist/__tests__/naming.test.d.ts.map +1 -0
- package/packages/openclaw/dist/__tests__/naming.test.js +21 -0
- package/packages/openclaw/dist/__tests__/naming.test.js.map +1 -0
- package/packages/openclaw/dist/__tests__/spawn-manager.test.d.ts +2 -0
- package/packages/openclaw/dist/__tests__/spawn-manager.test.d.ts.map +1 -0
- package/packages/openclaw/dist/__tests__/spawn-manager.test.js +126 -0
- package/packages/openclaw/dist/__tests__/spawn-manager.test.js.map +1 -0
- package/packages/openclaw/dist/auth/converter.d.ts +28 -0
- package/packages/openclaw/dist/auth/converter.d.ts.map +1 -0
- package/packages/openclaw/dist/auth/converter.js +64 -0
- package/packages/openclaw/dist/auth/converter.js.map +1 -0
- package/packages/openclaw/dist/cli.d.ts +2 -0
- package/packages/openclaw/dist/cli.d.ts.map +1 -0
- package/packages/openclaw/dist/cli.js +230 -0
- package/packages/openclaw/dist/cli.js.map +1 -0
- package/packages/openclaw/dist/config.d.ts +27 -0
- package/packages/openclaw/dist/config.d.ts.map +1 -0
- package/packages/openclaw/dist/config.js +97 -0
- package/packages/openclaw/dist/config.js.map +1 -0
- package/packages/openclaw/dist/control.d.ts +22 -0
- package/packages/openclaw/dist/control.d.ts.map +1 -0
- package/packages/openclaw/dist/control.js +58 -0
- package/packages/openclaw/dist/control.js.map +1 -0
- package/packages/openclaw/dist/gateway.d.ts +71 -0
- package/packages/openclaw/dist/gateway.d.ts.map +1 -0
- package/packages/openclaw/dist/gateway.js +785 -0
- package/packages/openclaw/dist/gateway.js.map +1 -0
- package/packages/openclaw/dist/identity/contract.d.ts +11 -0
- package/packages/openclaw/dist/identity/contract.d.ts.map +1 -0
- package/packages/openclaw/dist/identity/contract.js +40 -0
- package/packages/openclaw/dist/identity/contract.js.map +1 -0
- package/packages/openclaw/dist/identity/files.d.ts +33 -0
- package/packages/openclaw/dist/identity/files.d.ts.map +1 -0
- package/packages/openclaw/dist/identity/files.js +145 -0
- package/packages/openclaw/dist/identity/files.js.map +1 -0
- package/packages/openclaw/dist/identity/model.d.ts +11 -0
- package/packages/openclaw/dist/identity/model.d.ts.map +1 -0
- package/packages/openclaw/dist/identity/model.js +28 -0
- package/packages/openclaw/dist/identity/model.js.map +1 -0
- package/packages/openclaw/dist/identity/naming.d.ts +5 -0
- package/packages/openclaw/dist/identity/naming.d.ts.map +1 -0
- package/packages/openclaw/dist/identity/naming.js +7 -0
- package/packages/openclaw/dist/identity/naming.js.map +1 -0
- package/packages/openclaw/dist/index.d.ts +20 -0
- package/packages/openclaw/dist/index.d.ts.map +1 -0
- package/packages/openclaw/dist/index.js +27 -0
- package/packages/openclaw/dist/index.js.map +1 -0
- package/packages/openclaw/dist/inject.d.ts +14 -0
- package/packages/openclaw/dist/inject.d.ts.map +1 -0
- package/packages/openclaw/dist/inject.js +66 -0
- package/packages/openclaw/dist/inject.js.map +1 -0
- package/packages/openclaw/dist/mcp/server.d.ts +8 -0
- package/packages/openclaw/dist/mcp/server.d.ts.map +1 -0
- package/packages/openclaw/dist/mcp/server.js +105 -0
- package/packages/openclaw/dist/mcp/server.js.map +1 -0
- package/packages/openclaw/dist/mcp/tools.d.ts +17 -0
- package/packages/openclaw/dist/mcp/tools.d.ts.map +1 -0
- package/packages/openclaw/dist/mcp/tools.js +145 -0
- package/packages/openclaw/dist/mcp/tools.js.map +1 -0
- package/packages/openclaw/dist/runtime/openclaw-config.d.ts +20 -0
- package/packages/openclaw/dist/runtime/openclaw-config.d.ts.map +1 -0
- package/packages/openclaw/dist/runtime/openclaw-config.js +50 -0
- package/packages/openclaw/dist/runtime/openclaw-config.js.map +1 -0
- package/packages/openclaw/dist/runtime/patch.d.ts +24 -0
- package/packages/openclaw/dist/runtime/patch.d.ts.map +1 -0
- package/packages/openclaw/dist/runtime/patch.js +92 -0
- package/packages/openclaw/dist/runtime/patch.js.map +1 -0
- package/packages/openclaw/dist/runtime/setup.d.ts +26 -0
- package/packages/openclaw/dist/runtime/setup.d.ts.map +1 -0
- package/packages/openclaw/dist/runtime/setup.js +58 -0
- package/packages/openclaw/dist/runtime/setup.js.map +1 -0
- package/packages/openclaw/dist/setup.d.ts +29 -0
- package/packages/openclaw/dist/setup.d.ts.map +1 -0
- package/packages/openclaw/dist/setup.js +300 -0
- package/packages/openclaw/dist/setup.js.map +1 -0
- package/packages/openclaw/dist/spawn/docker.d.ts +58 -0
- package/packages/openclaw/dist/spawn/docker.d.ts.map +1 -0
- package/packages/openclaw/dist/spawn/docker.js +222 -0
- package/packages/openclaw/dist/spawn/docker.js.map +1 -0
- package/packages/openclaw/dist/spawn/manager.d.ts +45 -0
- package/packages/openclaw/dist/spawn/manager.d.ts.map +1 -0
- package/packages/openclaw/dist/spawn/manager.js +140 -0
- package/packages/openclaw/dist/spawn/manager.js.map +1 -0
- package/packages/openclaw/dist/spawn/process.d.ts +16 -0
- package/packages/openclaw/dist/spawn/process.d.ts.map +1 -0
- package/packages/openclaw/dist/spawn/process.js +241 -0
- package/packages/openclaw/dist/spawn/process.js.map +1 -0
- package/packages/openclaw/dist/spawn/types.d.ts +42 -0
- package/packages/openclaw/dist/spawn/types.d.ts.map +1 -0
- package/packages/openclaw/dist/spawn/types.js +2 -0
- package/packages/openclaw/dist/spawn/types.js.map +1 -0
- package/packages/openclaw/dist/types.d.ts +37 -0
- package/packages/openclaw/dist/types.d.ts.map +1 -0
- package/packages/openclaw/dist/types.js +2 -0
- package/packages/openclaw/dist/types.js.map +1 -0
- package/packages/openclaw/package.json +63 -0
- package/packages/openclaw/skill/SKILL.md +194 -0
- package/packages/openclaw/src/__tests__/gateway-threads.test.ts +384 -0
- package/packages/openclaw/src/__tests__/naming.test.ts +24 -0
- package/packages/openclaw/src/__tests__/spawn-manager.test.ts +152 -0
- package/packages/openclaw/src/auth/converter.ts +90 -0
- package/packages/openclaw/src/cli.ts +269 -0
- package/packages/openclaw/src/config.ts +124 -0
- package/packages/openclaw/src/control.ts +100 -0
- package/packages/openclaw/src/gateway.ts +941 -0
- package/packages/openclaw/src/identity/contract.ts +44 -0
- package/packages/openclaw/src/identity/files.ts +198 -0
- package/packages/openclaw/src/identity/model.ts +27 -0
- package/packages/openclaw/src/identity/naming.ts +6 -0
- package/packages/openclaw/src/index.ts +59 -0
- package/packages/openclaw/src/inject.ts +77 -0
- package/packages/openclaw/src/mcp/server.ts +121 -0
- package/packages/openclaw/src/mcp/tools.ts +174 -0
- package/packages/openclaw/src/runtime/openclaw-config.ts +64 -0
- package/packages/openclaw/src/runtime/patch.ts +103 -0
- package/packages/openclaw/src/runtime/setup.ts +89 -0
- package/packages/openclaw/src/setup.ts +336 -0
- package/packages/openclaw/src/spawn/docker.ts +261 -0
- package/packages/openclaw/src/spawn/manager.ts +181 -0
- package/packages/openclaw/src/spawn/process.ts +272 -0
- package/packages/openclaw/src/spawn/types.ts +43 -0
- package/packages/openclaw/src/types.ts +38 -0
- package/packages/openclaw/templates/SOUL.md.template +34 -0
- package/packages/openclaw/tsconfig.json +12 -0
- package/packages/policy/package.json +2 -2
- package/packages/sdk/README.md +169 -64
- package/packages/sdk/dist/__tests__/contract-fixtures.test.js +76 -9
- package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -1
- package/packages/sdk/dist/__tests__/integration.test.js +5 -4
- package/packages/sdk/dist/__tests__/integration.test.js.map +1 -1
- package/packages/sdk/dist/client.d.ts +34 -3
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +120 -10
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/protocol.d.ts +7 -1
- package/packages/sdk/dist/protocol.d.ts.map +1 -1
- package/packages/sdk/dist/relay.d.ts +47 -11
- package/packages/sdk/dist/relay.d.ts.map +1 -1
- package/packages/sdk/dist/relay.js +114 -23
- package/packages/sdk/dist/relay.js.map +1 -1
- package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/runner.js +71 -36
- package/packages/sdk/dist/workflows/runner.js.map +1 -1
- package/packages/sdk/dist/workflows/types.d.ts +1 -1
- package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
- package/packages/sdk/package.json +2 -2
- package/packages/sdk/src/__tests__/contract-fixtures.test.ts +88 -9
- package/packages/sdk/src/__tests__/error-scenarios.test.ts +1 -1
- package/packages/sdk/src/__tests__/idle-nudge.test.ts +205 -257
- package/packages/sdk/src/__tests__/integration.test.ts +5 -4
- package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +277 -13
- package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +1 -0
- package/packages/sdk/src/__tests__/workflow-runner.test.ts +67 -7
- package/packages/sdk/src/__tests__/workflow-trajectory.test.ts +4 -5
- package/packages/sdk/src/client.ts +171 -14
- package/packages/sdk/src/examples/workflows/runner-idle-refactor.yaml +306 -0
- package/packages/sdk/src/protocol.ts +7 -2
- package/packages/sdk/src/relay.ts +196 -34
- package/packages/sdk/src/workflows/runner.ts +73 -42
- package/packages/sdk/src/workflows/schema.json +1 -1
- package/packages/sdk/src/workflows/types.ts +1 -1
- package/packages/sdk/vitest.config.ts +1 -0
- package/packages/sdk-py/README.md +89 -102
- package/packages/sdk-py/agent_relay/__init__.py +16 -19
- package/packages/sdk-py/pyproject.toml +5 -1
- package/packages/sdk-py/src/agent_relay/__init__.py +35 -1
- package/packages/sdk-py/src/agent_relay/client.py +776 -0
- package/packages/sdk-py/src/agent_relay/models.py +27 -0
- package/packages/sdk-py/src/agent_relay/protocol.py +114 -0
- package/packages/sdk-py/src/agent_relay/relay.py +860 -0
- package/packages/sdk-py/tests/test_relay_lifecycle_hooks.py +250 -0
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
- package/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +0 -50
- package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +0 -50
- package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +0 -50
- package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +0 -50
- package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +0 -91
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
import { getToolDefinitions, handleToolCall, cleanup } from './tools.js';
|
|
3
|
+
/**
|
|
4
|
+
* MCP stdio server — JSON-RPC 2.0 transport over stdin/stdout.
|
|
5
|
+
*
|
|
6
|
+
* Exposes spawn_openclaw, list_openclaws, release_openclaw tools.
|
|
7
|
+
* Registered in openclaw.json as "openclaw-spawner" MCP server.
|
|
8
|
+
*/
|
|
9
|
+
export async function startMcpServer() {
|
|
10
|
+
const rl = createInterface({ input: process.stdin, terminal: false });
|
|
11
|
+
rl.on('line', async (line) => {
|
|
12
|
+
let request;
|
|
13
|
+
try {
|
|
14
|
+
request = JSON.parse(line);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
writeResponse({
|
|
18
|
+
jsonrpc: '2.0',
|
|
19
|
+
id: null,
|
|
20
|
+
error: { code: -32700, message: 'Parse error' },
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const { id, method, params } = request;
|
|
25
|
+
try {
|
|
26
|
+
switch (method) {
|
|
27
|
+
case 'initialize': {
|
|
28
|
+
writeResponse({
|
|
29
|
+
jsonrpc: '2.0',
|
|
30
|
+
id,
|
|
31
|
+
result: {
|
|
32
|
+
protocolVersion: '2024-11-05',
|
|
33
|
+
capabilities: {
|
|
34
|
+
tools: {},
|
|
35
|
+
},
|
|
36
|
+
serverInfo: {
|
|
37
|
+
name: 'openclaw-spawner',
|
|
38
|
+
version: '1.0.0',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case 'notifications/initialized': {
|
|
45
|
+
// No response needed for notifications
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case 'tools/list': {
|
|
49
|
+
const tools = getToolDefinitions();
|
|
50
|
+
writeResponse({
|
|
51
|
+
jsonrpc: '2.0',
|
|
52
|
+
id,
|
|
53
|
+
result: { tools },
|
|
54
|
+
});
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case 'tools/call': {
|
|
58
|
+
const toolName = params?.name ?? '';
|
|
59
|
+
const toolArgs = params?.arguments ?? {};
|
|
60
|
+
const result = await handleToolCall(toolName, toolArgs);
|
|
61
|
+
writeResponse({
|
|
62
|
+
jsonrpc: '2.0',
|
|
63
|
+
id,
|
|
64
|
+
result,
|
|
65
|
+
});
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
default: {
|
|
69
|
+
writeResponse({
|
|
70
|
+
jsonrpc: '2.0',
|
|
71
|
+
id,
|
|
72
|
+
error: { code: -32601, message: `Method not found: ${method}` },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
writeResponse({
|
|
79
|
+
jsonrpc: '2.0',
|
|
80
|
+
id,
|
|
81
|
+
error: {
|
|
82
|
+
code: -32603,
|
|
83
|
+
message: err instanceof Error ? err.message : String(err),
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
rl.on('close', async () => {
|
|
89
|
+
await cleanup();
|
|
90
|
+
process.exit(0);
|
|
91
|
+
});
|
|
92
|
+
process.on('SIGTERM', async () => {
|
|
93
|
+
await cleanup();
|
|
94
|
+
process.exit(0);
|
|
95
|
+
});
|
|
96
|
+
process.on('SIGINT', async () => {
|
|
97
|
+
await cleanup();
|
|
98
|
+
process.exit(0);
|
|
99
|
+
});
|
|
100
|
+
process.stderr.write('[openclaw-spawner] MCP server started (stdio)\n');
|
|
101
|
+
}
|
|
102
|
+
function writeResponse(response) {
|
|
103
|
+
process.stdout.write(JSON.stringify(response) + '\n');
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface McpToolDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export declare function getToolDefinitions(): McpToolDefinition[];
|
|
7
|
+
export declare function handleToolCall(toolName: string, args: Record<string, unknown>): Promise<{
|
|
8
|
+
content: Array<{
|
|
9
|
+
type: 'text';
|
|
10
|
+
text: string;
|
|
11
|
+
}>;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Cleanup: no-op since spawns are managed by the gateway process.
|
|
15
|
+
*/
|
|
16
|
+
export declare function cleanup(): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CA6DxD;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmF7D;AAMD;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { InboundGateway } from '../gateway.js';
|
|
2
|
+
/** Control API base URL — the gateway's spawn control server. */
|
|
3
|
+
const CONTROL_URL = `http://127.0.0.1:${Number(process.env.RELAYCAST_CONTROL_PORT) || InboundGateway.DEFAULT_CONTROL_PORT}`;
|
|
4
|
+
export function getToolDefinitions() {
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
name: 'spawn_openclaw',
|
|
8
|
+
description: 'Spawn a new independent OpenClaw instance. The spawned instance gets its own gateway, ' +
|
|
9
|
+
'relay broker, and Relaycast messaging. It runs as an independent peer, not a child.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
name: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
description: 'Name for the new OpenClaw instance (e.g. "researcher", "coder").',
|
|
16
|
+
},
|
|
17
|
+
role: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'Role description for the agent (e.g. "code review specialist").',
|
|
20
|
+
},
|
|
21
|
+
model: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Model reference (e.g. "openai-codex/gpt-5.3-codex"). Defaults to parent model.',
|
|
24
|
+
},
|
|
25
|
+
channels: {
|
|
26
|
+
type: 'array',
|
|
27
|
+
items: { type: 'string' },
|
|
28
|
+
description: 'Relaycast channels to join (default: ["#general"]).',
|
|
29
|
+
},
|
|
30
|
+
system_prompt: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'System prompt / task description for the spawned agent.',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: ['name'],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'list_openclaws',
|
|
40
|
+
description: 'List all currently running OpenClaw instances spawned by this agent.',
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'release_openclaw',
|
|
48
|
+
description: 'Stop and release a spawned OpenClaw instance by name or ID.',
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
properties: {
|
|
52
|
+
name: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Name of the OpenClaw to release (as provided during spawn).',
|
|
55
|
+
},
|
|
56
|
+
id: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'ID of the OpenClaw to release (from list_openclaws).',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
export async function handleToolCall(toolName, args) {
|
|
66
|
+
switch (toolName) {
|
|
67
|
+
case 'spawn_openclaw': {
|
|
68
|
+
const name = args.name;
|
|
69
|
+
if (!name) {
|
|
70
|
+
return text('Error: "name" is required.');
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const res = await fetch(`${CONTROL_URL}/spawn`, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: { 'Content-Type': 'application/json' },
|
|
76
|
+
body: JSON.stringify(args),
|
|
77
|
+
});
|
|
78
|
+
const body = await res.json();
|
|
79
|
+
if (!body.ok) {
|
|
80
|
+
return text(`Failed to spawn "${name}": ${body.error ?? 'unknown error'}`);
|
|
81
|
+
}
|
|
82
|
+
return text(`Spawned OpenClaw "${name}"\n` +
|
|
83
|
+
` Agent name: ${body.agentName}\n` +
|
|
84
|
+
` ID: ${body.id}\n` +
|
|
85
|
+
` Gateway port: ${body.gatewayPort}\n` +
|
|
86
|
+
` Total active: ${body.active}`);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return text(`Failed to spawn "${name}": ${err instanceof Error ? err.message : String(err)}\n` +
|
|
90
|
+
'Is the gateway running? Start it with: relay-openclaw gateway');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
case 'list_openclaws': {
|
|
94
|
+
try {
|
|
95
|
+
const res = await fetch(`${CONTROL_URL}/list`);
|
|
96
|
+
const body = await res.json();
|
|
97
|
+
const claws = body.claws;
|
|
98
|
+
if (!claws || claws.length === 0) {
|
|
99
|
+
return text('No spawned OpenClaws currently running.');
|
|
100
|
+
}
|
|
101
|
+
const lines = claws.map((h) => `- ${h.name} → ${h.agentName} (id: ${h.id}, port: ${h.gatewayPort})`);
|
|
102
|
+
return text(`Active OpenClaws (${claws.length}):\n${lines.join('\n')}`);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return text(`Failed to list claws: ${err instanceof Error ? err.message : String(err)}\n` +
|
|
106
|
+
'Is the gateway running? Start it with: relay-openclaw gateway');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
case 'release_openclaw': {
|
|
110
|
+
const name = args.name;
|
|
111
|
+
const id = args.id;
|
|
112
|
+
if (!name && !id) {
|
|
113
|
+
return text('Error: provide either "name" or "id" to release.');
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const res = await fetch(`${CONTROL_URL}/release`, {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers: { 'Content-Type': 'application/json' },
|
|
119
|
+
body: JSON.stringify({ name, id }),
|
|
120
|
+
});
|
|
121
|
+
const body = await res.json();
|
|
122
|
+
if (body.ok) {
|
|
123
|
+
return text(`Released OpenClaw "${name ?? id}". Active: ${body.active}`);
|
|
124
|
+
}
|
|
125
|
+
return text(`OpenClaw "${name ?? id}" not found among active spawns.`);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return text(`Failed to release: ${err instanceof Error ? err.message : String(err)}\n` +
|
|
129
|
+
'Is the gateway running? Start it with: relay-openclaw gateway');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
default:
|
|
133
|
+
return text(`Unknown tool: ${toolName}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function text(message) {
|
|
137
|
+
return { content: [{ type: 'text', text: message }] };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Cleanup: no-op since spawns are managed by the gateway process.
|
|
141
|
+
*/
|
|
142
|
+
export async function cleanup() {
|
|
143
|
+
// Spawns live in the gateway — nothing to clean up here.
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface OpenClawConfigOptions {
|
|
2
|
+
/** Fully-qualified model ref, e.g. "openai-codex/gpt-5.3-codex". */
|
|
3
|
+
modelRef: string;
|
|
4
|
+
/** Path to ~/.openclaw/ (default: $HOME/.openclaw). */
|
|
5
|
+
openclawHome?: string;
|
|
6
|
+
/** Default workspace path (default: ~/.openclaw/workspace). */
|
|
7
|
+
workspacePath?: string;
|
|
8
|
+
/** MCP servers to include. Keys are server names, values are MCP server configs. */
|
|
9
|
+
mcpServers?: Record<string, {
|
|
10
|
+
command: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Write (or update) ~/.openclaw/openclaw.json with model, workspace, skipBootstrap,
|
|
17
|
+
* and MCP server configuration.
|
|
18
|
+
*/
|
|
19
|
+
export declare function writeOpenClawConfig(options: OpenClawConfigOptions): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=openclaw-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-config.d.ts","sourceRoot":"","sources":["../../src/runtime/openclaw-config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;CAChG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CvF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Write (or update) ~/.openclaw/openclaw.json with model, workspace, skipBootstrap,
|
|
5
|
+
* and MCP server configuration.
|
|
6
|
+
*/
|
|
7
|
+
export async function writeOpenClawConfig(options) {
|
|
8
|
+
const home = options.openclawHome ?? join(process.env.HOME ?? '/home/node', '.openclaw');
|
|
9
|
+
await mkdir(home, { recursive: true });
|
|
10
|
+
const configPath = join(home, 'openclaw.json');
|
|
11
|
+
let config = {};
|
|
12
|
+
try {
|
|
13
|
+
const raw = await readFile(configPath, 'utf8');
|
|
14
|
+
config = JSON.parse(raw);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// File doesn't exist or isn't valid JSON — start fresh
|
|
18
|
+
config = {};
|
|
19
|
+
}
|
|
20
|
+
if (!config || typeof config !== 'object')
|
|
21
|
+
config = {};
|
|
22
|
+
// agents.defaults
|
|
23
|
+
if (!config.agents || typeof config.agents !== 'object')
|
|
24
|
+
config.agents = {};
|
|
25
|
+
const agents = config.agents;
|
|
26
|
+
if (!agents.defaults || typeof agents.defaults !== 'object')
|
|
27
|
+
agents.defaults = {};
|
|
28
|
+
const defaults = agents.defaults;
|
|
29
|
+
if (!defaults.workspace || typeof defaults.workspace !== 'string') {
|
|
30
|
+
defaults.workspace = options.workspacePath ?? '~/.openclaw/workspace';
|
|
31
|
+
}
|
|
32
|
+
// Model shape: { primary: "provider/model" }
|
|
33
|
+
if (typeof defaults.model === 'string') {
|
|
34
|
+
defaults.model = { primary: defaults.model };
|
|
35
|
+
}
|
|
36
|
+
else if (!defaults.model || typeof defaults.model !== 'object') {
|
|
37
|
+
defaults.model = {};
|
|
38
|
+
}
|
|
39
|
+
defaults.model.primary = options.modelRef;
|
|
40
|
+
defaults.skipBootstrap = true;
|
|
41
|
+
// MCP servers
|
|
42
|
+
if (options.mcpServers) {
|
|
43
|
+
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
44
|
+
config.mcpServers = {};
|
|
45
|
+
}
|
|
46
|
+
Object.assign(config.mcpServers, options.mcpServers);
|
|
47
|
+
}
|
|
48
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=openclaw-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-config.js","sourceRoot":"","sources":["../../src/runtime/openclaw-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA8B;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,EAAE,WAAW,CAAC,CAAC;IACzF,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC/C,IAAI,MAAM,GAA4B,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,MAAM,GAAG,EAAE,CAAC;IAEvD,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAiC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAmC,CAAC;IAE5D,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClE,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC;IACxE,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,QAAQ,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;SAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjE,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;IACtB,CAAC;IACA,QAAQ,CAAC,KAAgC,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAEtE,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;IAE9B,cAAc;IACd,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAqC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Patch OpenClaw's compiled dist JS files to replace hardcoded identity constants.
|
|
3
|
+
*
|
|
4
|
+
* FRAGILE: This is a best-effort operation. OpenClaw bakes Claude defaults into
|
|
5
|
+
* its compiled output. These patterns may change between OpenClaw versions.
|
|
6
|
+
* Prefer runtime identity enforcement (SOUL.md, runtime-identity.json, identity
|
|
7
|
+
* preamble in bridge) over relying on this patch.
|
|
8
|
+
*
|
|
9
|
+
* Known hardcoded constants (as of OpenClaw ~0.x):
|
|
10
|
+
* - DEFAULT_MODEL = "claude-opus-4-6"
|
|
11
|
+
* - KILOCODE_DEFAULT_MODEL_ID = "anthropic/claude-opus-4.6"
|
|
12
|
+
* - KILOCODE_DEFAULT_MODEL_NAME = "Claude Opus 4.6"
|
|
13
|
+
* - "Claude Code" branding
|
|
14
|
+
*
|
|
15
|
+
* @param distDir - Path to OpenClaw's dist directory (e.g. /usr/lib/node_modules/openclaw/dist)
|
|
16
|
+
* @param modelRef - Full model reference (e.g. "openai-codex/gpt-5.3-codex")
|
|
17
|
+
* @returns Number of files patched, or 0 if dist not found or patching skipped
|
|
18
|
+
*/
|
|
19
|
+
export declare function patchOpenClawDist(distDir: string, modelRef: string): Promise<number>;
|
|
20
|
+
/**
|
|
21
|
+
* Clear JIT cache (/tmp/jiti/) which may contain unpatched constants.
|
|
22
|
+
*/
|
|
23
|
+
export declare function clearJitCache(): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/runtime/patch.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqE1F;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAMnD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { readdir, readFile, writeFile, rm } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
/**
|
|
5
|
+
* Patch OpenClaw's compiled dist JS files to replace hardcoded identity constants.
|
|
6
|
+
*
|
|
7
|
+
* FRAGILE: This is a best-effort operation. OpenClaw bakes Claude defaults into
|
|
8
|
+
* its compiled output. These patterns may change between OpenClaw versions.
|
|
9
|
+
* Prefer runtime identity enforcement (SOUL.md, runtime-identity.json, identity
|
|
10
|
+
* preamble in bridge) over relying on this patch.
|
|
11
|
+
*
|
|
12
|
+
* Known hardcoded constants (as of OpenClaw ~0.x):
|
|
13
|
+
* - DEFAULT_MODEL = "claude-opus-4-6"
|
|
14
|
+
* - KILOCODE_DEFAULT_MODEL_ID = "anthropic/claude-opus-4.6"
|
|
15
|
+
* - KILOCODE_DEFAULT_MODEL_NAME = "Claude Opus 4.6"
|
|
16
|
+
* - "Claude Code" branding
|
|
17
|
+
*
|
|
18
|
+
* @param distDir - Path to OpenClaw's dist directory (e.g. /usr/lib/node_modules/openclaw/dist)
|
|
19
|
+
* @param modelRef - Full model reference (e.g. "openai-codex/gpt-5.3-codex")
|
|
20
|
+
* @returns Number of files patched, or 0 if dist not found or patching skipped
|
|
21
|
+
*/
|
|
22
|
+
export async function patchOpenClawDist(distDir, modelRef) {
|
|
23
|
+
if (!existsSync(distDir)) {
|
|
24
|
+
process.stderr.write(`[patch] OpenClaw dist not found at ${distDir}, skipping\n`);
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
// Extract bare model ID (e.g. "gpt-5.3-codex" from "openai-codex/gpt-5.3-codex")
|
|
28
|
+
const modelId = modelRef.includes('/') ? modelRef.split('/').pop() : modelRef;
|
|
29
|
+
// Order matters: replace fully-qualified patterns before bare model IDs,
|
|
30
|
+
// otherwise the bare pattern destroys the substring the qualified pattern needs.
|
|
31
|
+
const replacements = [
|
|
32
|
+
[/anthropic\/claude-opus-4\.6/g, modelRef],
|
|
33
|
+
[/Claude Opus 4\.6/g, modelRef],
|
|
34
|
+
[/claude-opus-4\.6/g, modelId],
|
|
35
|
+
[/claude-opus-4-6/g, modelId],
|
|
36
|
+
[/Claude Code/g, 'OpenClaw Agent'],
|
|
37
|
+
];
|
|
38
|
+
let patchedCount = 0;
|
|
39
|
+
try {
|
|
40
|
+
async function walkAndPatch(dir) {
|
|
41
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const fullPath = join(dir, entry.name);
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
await walkAndPatch(fullPath);
|
|
46
|
+
}
|
|
47
|
+
else if (entry.isFile() && entry.name.endsWith('.js')) {
|
|
48
|
+
try {
|
|
49
|
+
let content = await readFile(fullPath, 'utf8');
|
|
50
|
+
let modified = false;
|
|
51
|
+
for (const [pattern, replacement] of replacements) {
|
|
52
|
+
const newContent = content.replace(pattern, replacement);
|
|
53
|
+
if (newContent !== content) {
|
|
54
|
+
content = newContent;
|
|
55
|
+
modified = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (modified) {
|
|
59
|
+
await writeFile(fullPath, content, 'utf8');
|
|
60
|
+
patchedCount++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
// Individual file patch failure is non-fatal
|
|
65
|
+
process.stderr.write(`[patch] Warning: could not patch ${fullPath}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
await walkAndPatch(distDir);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// Entire patching failure is non-fatal — runtime identity enforcement is the primary defense
|
|
74
|
+
process.stderr.write(`[patch] Warning: dist patching failed (non-fatal): ${err instanceof Error ? err.message : String(err)}\n`);
|
|
75
|
+
}
|
|
76
|
+
if (patchedCount > 0) {
|
|
77
|
+
process.stderr.write(`[patch] Patched ${patchedCount} file(s) in ${distDir}\n`);
|
|
78
|
+
}
|
|
79
|
+
return patchedCount;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Clear JIT cache (/tmp/jiti/) which may contain unpatched constants.
|
|
83
|
+
*/
|
|
84
|
+
export async function clearJitCache() {
|
|
85
|
+
try {
|
|
86
|
+
await rm('/tmp/jiti', { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore — cache may not exist
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/runtime/patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IACvE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,OAAO,cAAc,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,iFAAiF;IACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE/E,yEAAyE;IACzE,iFAAiF;IACjF,MAAM,YAAY,GAAuB;QACvC,CAAC,8BAA8B,EAAE,QAAQ,CAAC;QAC1C,CAAC,mBAAmB,EAAE,QAAQ,CAAC;QAC/B,CAAC,mBAAmB,EAAE,OAAO,CAAC;QAC9B,CAAC,kBAAkB,EAAE,OAAO,CAAC;QAC7B,CAAC,cAAc,EAAE,gBAAgB,CAAC;KACnC,CAAC;IAEF,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,IAAI,CAAC;QACH,KAAK,UAAU,YAAY,CAAC,GAAW;YACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxD,IAAI,CAAC;wBACH,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;wBAErB,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,YAAY,EAAE,CAAC;4BAClD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;4BACzD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gCAC3B,OAAO,GAAG,UAAU,CAAC;gCACrB,QAAQ,GAAG,IAAI,CAAC;4BAClB,CAAC;wBACH,CAAC;wBAED,IAAI,QAAQ,EAAE,CAAC;4BACb,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;4BAC3C,YAAY,EAAE,CAAC;wBACjB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,6CAA6C;wBAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACtG,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,6FAA6F;QAC7F,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sDAAsD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC3G,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,eAAe,OAAO,IAAI,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface RuntimeSetupOptions {
|
|
2
|
+
/** Raw model string (e.g. "gpt-5.3-codex"). Defaults to env OPENCLAW_MODEL. */
|
|
3
|
+
model?: string;
|
|
4
|
+
/** Agent name. Defaults to env OPENCLAW_NAME or AGENT_NAME. */
|
|
5
|
+
name?: string;
|
|
6
|
+
/** Workspace ID. Defaults to env OPENCLAW_WORKSPACE_ID. */
|
|
7
|
+
workspaceId?: string;
|
|
8
|
+
/** Agent role. Defaults to env OPENCLAW_ROLE. */
|
|
9
|
+
role?: string;
|
|
10
|
+
/** OpenClaw dist directory for patching. Defaults to /usr/lib/node_modules/openclaw/dist. */
|
|
11
|
+
openclawDistDir?: string;
|
|
12
|
+
/** Home directory. Defaults to $HOME. */
|
|
13
|
+
homeDir?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Full runtime setup: auth conversion, config writing, identity files, dist patching, JIT cache clear.
|
|
17
|
+
*
|
|
18
|
+
* This replaces the inline node -e block + shell logic in start-claw.sh.
|
|
19
|
+
* Call this before starting the OpenClaw gateway.
|
|
20
|
+
*/
|
|
21
|
+
export declare function runtimeSetup(options?: RuntimeSetupOptions): Promise<{
|
|
22
|
+
modelRef: string;
|
|
23
|
+
agentName: string;
|
|
24
|
+
workspaceId: string;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/runtime/setup.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAiDD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { unlink } from 'node:fs/promises';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { normalizeModelRef } from '../identity/model.js';
|
|
5
|
+
import { convertCodexAuth } from '../auth/converter.js';
|
|
6
|
+
import { writeOpenClawConfig } from './openclaw-config.js';
|
|
7
|
+
import { patchOpenClawDist, clearJitCache } from './patch.js';
|
|
8
|
+
import { ensureWorkspace, } from '../identity/files.js';
|
|
9
|
+
/**
|
|
10
|
+
* Full runtime setup: auth conversion, config writing, identity files, dist patching, JIT cache clear.
|
|
11
|
+
*
|
|
12
|
+
* This replaces the inline node -e block + shell logic in start-claw.sh.
|
|
13
|
+
* Call this before starting the OpenClaw gateway.
|
|
14
|
+
*/
|
|
15
|
+
export async function runtimeSetup(options = {}) {
|
|
16
|
+
const home = options.homeDir ?? process.env.HOME ?? '/home/node';
|
|
17
|
+
const model = options.model ?? process.env.OPENCLAW_MODEL ?? 'openai-codex/gpt-5.3-codex';
|
|
18
|
+
const name = options.name ?? process.env.OPENCLAW_NAME ?? process.env.AGENT_NAME ?? 'agent';
|
|
19
|
+
const workspaceId = options.workspaceId ?? process.env.OPENCLAW_WORKSPACE_ID ?? 'unknown';
|
|
20
|
+
const role = options.role ?? process.env.OPENCLAW_ROLE ?? 'general';
|
|
21
|
+
// Resolve OpenClaw dist dir: try explicit, then known install locations
|
|
22
|
+
const distDirCandidates = options.openclawDistDir
|
|
23
|
+
? [options.openclawDistDir]
|
|
24
|
+
: [
|
|
25
|
+
'/usr/lib/node_modules/openclaw/dist', // Global npm (ClawRunner sandbox)
|
|
26
|
+
'/app/dist', // Vanilla Docker image
|
|
27
|
+
'/usr/local/lib/node_modules/openclaw/dist', // Global npm (macOS/other)
|
|
28
|
+
];
|
|
29
|
+
const distDir = distDirCandidates.find((d) => existsSync(d)) ?? distDirCandidates[0];
|
|
30
|
+
// 1. Convert codex auth
|
|
31
|
+
const { preferredProvider } = await convertCodexAuth();
|
|
32
|
+
const modelRef = normalizeModelRef(model, preferredProvider);
|
|
33
|
+
// 2. Write openclaw.json config
|
|
34
|
+
await writeOpenClawConfig({
|
|
35
|
+
modelRef,
|
|
36
|
+
openclawHome: join(home, '.openclaw'),
|
|
37
|
+
});
|
|
38
|
+
// 3. Write identity files in workspace
|
|
39
|
+
const wsDir = join(home, '.openclaw', 'workspace');
|
|
40
|
+
await ensureWorkspace({
|
|
41
|
+
workspacePath: wsDir,
|
|
42
|
+
workspaceId,
|
|
43
|
+
clawName: name,
|
|
44
|
+
role,
|
|
45
|
+
modelRef,
|
|
46
|
+
});
|
|
47
|
+
// Remove BOOTSTRAP.md if present (agent is pre-configured)
|
|
48
|
+
const bootstrapPath = join(wsDir, 'BOOTSTRAP.md');
|
|
49
|
+
if (existsSync(bootstrapPath)) {
|
|
50
|
+
await unlink(bootstrapPath);
|
|
51
|
+
}
|
|
52
|
+
// 4. Patch OpenClaw dist
|
|
53
|
+
await patchOpenClawDist(distDir, modelRef);
|
|
54
|
+
// 5. Clear JIT cache
|
|
55
|
+
await clearJitCache();
|
|
56
|
+
return { modelRef, agentName: name, workspaceId };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/runtime/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAGL,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAiB9B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAA+B,EAAE;IAKlE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,4BAA4B,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;IAC5F,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC;IACpE,wEAAwE;IACxE,MAAM,iBAAiB,GAAG,OAAO,CAAC,eAAe;QAC/C,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QAC3B,CAAC,CAAC;YACE,qCAAqC,EAAK,kCAAkC;YAC5E,WAAW,EAAiC,uBAAuB;YACnE,2CAA2C,EAAE,2BAA2B;SACzE,CAAC;IACN,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAErF,wBAAwB;IACxB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAE7D,gCAAgC;IAChC,MAAM,mBAAmB,CAAC;QACxB,QAAQ;QACR,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;KACtC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,eAAe,CAAC;QACpB,aAAa,EAAE,KAAK;QACpB,WAAW;QACX,QAAQ,EAAE,IAAI;QACd,IAAI;QACJ,QAAQ;KACT,CAAC,CAAC;IAEH,2DAA2D;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,yBAAyB;IACzB,MAAM,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE3C,qBAAqB;IACrB,MAAM,aAAa,EAAE,CAAC;IAEtB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface SetupOptions {
|
|
2
|
+
/** If provided, join this workspace. Otherwise create a new one. */
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
/** Name for this claw (default: hostname). */
|
|
5
|
+
clawName?: string;
|
|
6
|
+
/** Channels to auto-join (default: ['general']). */
|
|
7
|
+
channels?: string[];
|
|
8
|
+
/** Relaycast API base URL. */
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SetupResult {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
apiKey: string;
|
|
14
|
+
clawName: string;
|
|
15
|
+
skillDir: string;
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Install the Relaycast bridge into an OpenClaw workspace.
|
|
20
|
+
*
|
|
21
|
+
* 1. Detect OpenClaw installation
|
|
22
|
+
* 2. Create/join workspace via Relaycast API (if no key provided)
|
|
23
|
+
* 3. Install SKILL.md
|
|
24
|
+
* 4. Write .env config
|
|
25
|
+
* 5. Configure MCP server in openclaw.json
|
|
26
|
+
* 6. Print success summary
|
|
27
|
+
*/
|
|
28
|
+
export declare function setup(options: SetupOptions): Promise<SetupResult>;
|
|
29
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA4PvE"}
|