@getaclaw/agent 0.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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +203 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/manage/channels.d.ts +15 -0
- package/dist/manage/channels.d.ts.map +1 -0
- package/dist/manage/channels.js +34 -0
- package/dist/manage/channels.js.map +1 -0
- package/dist/manage/config.d.ts +3 -0
- package/dist/manage/config.d.ts.map +1 -0
- package/dist/manage/config.js +36 -0
- package/dist/manage/config.js.map +1 -0
- package/dist/manage/devices.d.ts +5 -0
- package/dist/manage/devices.d.ts.map +1 -0
- package/dist/manage/devices.js +90 -0
- package/dist/manage/devices.js.map +1 -0
- package/dist/manage/health.d.ts +3 -0
- package/dist/manage/health.d.ts.map +1 -0
- package/dist/manage/health.js +115 -0
- package/dist/manage/health.js.map +1 -0
- package/dist/manage/update.d.ts +3 -0
- package/dist/manage/update.d.ts.map +1 -0
- package/dist/manage/update.js +303 -0
- package/dist/manage/update.js.map +1 -0
- package/dist/protocol.d.ts +31 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +11 -0
- package/dist/protocol.js.map +1 -0
- package/dist/server.d.ts +29 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +339 -0
- package/dist/server.js.map +1 -0
- package/dist/setup/orchestrator.d.ts +23 -0
- package/dist/setup/orchestrator.d.ts.map +1 -0
- package/dist/setup/orchestrator.js +142 -0
- package/dist/setup/orchestrator.js.map +1 -0
- package/dist/setup/steps/channels.d.ts +3 -0
- package/dist/setup/steps/channels.d.ts.map +1 -0
- package/dist/setup/steps/channels.js +38 -0
- package/dist/setup/steps/channels.js.map +1 -0
- package/dist/setup/steps/configure.d.ts +3 -0
- package/dist/setup/steps/configure.d.ts.map +1 -0
- package/dist/setup/steps/configure.js +65 -0
- package/dist/setup/steps/configure.js.map +1 -0
- package/dist/setup/steps/health.d.ts +3 -0
- package/dist/setup/steps/health.d.ts.map +1 -0
- package/dist/setup/steps/health.js +95 -0
- package/dist/setup/steps/health.js.map +1 -0
- package/dist/setup/steps/openclaw.d.ts +3 -0
- package/dist/setup/steps/openclaw.d.ts.map +1 -0
- package/dist/setup/steps/openclaw.js +22 -0
- package/dist/setup/steps/openclaw.js.map +1 -0
- package/dist/setup/steps/service.d.ts +3 -0
- package/dist/setup/steps/service.d.ts.map +1 -0
- package/dist/setup/steps/service.js +37 -0
- package/dist/setup/steps/service.js.map +1 -0
- package/dist/setup/steps/system.d.ts +3 -0
- package/dist/setup/steps/system.d.ts.map +1 -0
- package/dist/setup/steps/system.js +60 -0
- package/dist/setup/steps/system.js.map +1 -0
- package/dist/setup/steps/tailscale.d.ts +3 -0
- package/dist/setup/steps/tailscale.d.ts.map +1 -0
- package/dist/setup/steps/tailscale.js +40 -0
- package/dist/setup/steps/tailscale.js.map +1 -0
- package/dist/setup/types.d.ts +36 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +2 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/utils/crypto.d.ts +11 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +47 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/exec.d.ts +12 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +99 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +30 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { safeExec } from '../../utils/exec.js';
|
|
5
|
+
import { logger } from '../../utils/logger.js';
|
|
6
|
+
/** Run openclaw config set and throw on failure. */
|
|
7
|
+
async function configSet(key, value) {
|
|
8
|
+
const result = await safeExec('openclaw', ['config', 'set', key, value]);
|
|
9
|
+
if (result.exitCode !== 0) {
|
|
10
|
+
throw new Error(`openclaw config set ${key} failed (exit ${result.exitCode}): ${result.stderr.trim()}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export const configureStep = {
|
|
14
|
+
name: 'configure',
|
|
15
|
+
description: 'Generate OpenClaw configuration files',
|
|
16
|
+
required: true,
|
|
17
|
+
shouldRun: () => true,
|
|
18
|
+
async execute(ctx) {
|
|
19
|
+
const openclawDir = path.join(os.homedir(), '.openclaw');
|
|
20
|
+
const envPath = path.join(openclawDir, '.env');
|
|
21
|
+
ctx.emit('log', 'configure', 'Configuring OpenClaw via CLI...');
|
|
22
|
+
ctx.emit('step.progress', 'configure', 10);
|
|
23
|
+
await fs.mkdir(openclawDir, { recursive: true });
|
|
24
|
+
// Configure gateway settings via openclaw config set
|
|
25
|
+
// Both password and tailscale modes bind to lan — password auth or tailnet is the security layer
|
|
26
|
+
const bindMode = 'lan';
|
|
27
|
+
await configSet('gateway.mode', 'local');
|
|
28
|
+
await configSet('gateway.port', '18789');
|
|
29
|
+
await configSet('gateway.bind', bindMode);
|
|
30
|
+
ctx.emit('step.progress', 'configure', 30);
|
|
31
|
+
// Configure gateway auth
|
|
32
|
+
if (ctx.config.securityMode === 'password' && ctx.config.gatewayToken) {
|
|
33
|
+
await configSet('gateway.auth.mode', 'token');
|
|
34
|
+
await configSet('gateway.auth.token', ctx.config.gatewayToken);
|
|
35
|
+
// Allow Control UI over plain HTTP as fallback
|
|
36
|
+
await configSet('gateway.controlUi.allowInsecureAuth', 'true');
|
|
37
|
+
}
|
|
38
|
+
else if (ctx.config.securityMode === 'tailscale') {
|
|
39
|
+
await configSet('gateway.auth.mode', 'token');
|
|
40
|
+
}
|
|
41
|
+
ctx.emit('step.progress', 'configure', 50);
|
|
42
|
+
// Set the default model
|
|
43
|
+
ctx.emit('log', 'configure', 'Setting default model...');
|
|
44
|
+
const model = ctx.config.selectedModels?.[0];
|
|
45
|
+
if (model) {
|
|
46
|
+
const result = await safeExec('openclaw', ['models', 'set', model]);
|
|
47
|
+
if (result.exitCode !== 0) {
|
|
48
|
+
throw new Error(`openclaw models set failed (exit ${result.exitCode}): ${result.stderr.trim()}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
ctx.emit('step.progress', 'configure', 70);
|
|
52
|
+
// Write .env file with API keys for the gateway environment
|
|
53
|
+
ctx.emit('log', 'configure', 'Writing environment file...');
|
|
54
|
+
const envContent = [
|
|
55
|
+
`OPENROUTER_API_KEY=${ctx.config.openrouterApiKey}`,
|
|
56
|
+
'',
|
|
57
|
+
].join('\n');
|
|
58
|
+
await fs.writeFile(envPath, envContent, 'utf-8');
|
|
59
|
+
await fs.chmod(envPath, 0o600);
|
|
60
|
+
ctx.emit('step.progress', 'configure', 100);
|
|
61
|
+
ctx.emit('log', 'configure', 'OpenClaw configuration complete');
|
|
62
|
+
logger.info('OpenClaw configuration written via CLI', { envPath });
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/setup/steps/configure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,oDAAoD;AACpD,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,iBAAiB,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,uCAAuC;IACpD,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IAErB,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAE/C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,iCAAiC,CAAC,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,qDAAqD;QACrD,iGAAiG;QACjG,MAAM,QAAQ,GAAG,KAAK,CAAC;QACvB,MAAM,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,yBAAyB;QACzB,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACtE,MAAM,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC/D,+CAA+C;YAC/C,MAAM,SAAS,CAAC,qCAAqC,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;YACnD,MAAM,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,wBAAwB;QACxB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,0BAA0B,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,4DAA4D;QAC5D,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,6BAA6B,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG;YACjB,sBAAsB,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACnD,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE/B,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,iCAAiC,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAO1D,eAAO,MAAM,UAAU,EAAE,SAiGxB,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { safeExec } from '../../utils/exec.js';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
const HEALTH_CHECK_RETRIES = 5;
|
|
4
|
+
const HEALTH_CHECK_INTERVAL_MS = 3000;
|
|
5
|
+
export const healthStep = {
|
|
6
|
+
name: 'health',
|
|
7
|
+
description: 'Verify OpenClaw gateway is running and accessible',
|
|
8
|
+
required: true,
|
|
9
|
+
shouldRun: () => true,
|
|
10
|
+
async execute(ctx) {
|
|
11
|
+
ctx.emit('log', 'health', 'Running final health checks...');
|
|
12
|
+
ctx.emit('step.progress', 'health', 10);
|
|
13
|
+
// Check 1: Gateway HTTP endpoint
|
|
14
|
+
ctx.emit('log', 'health', 'Checking gateway HTTP endpoint...');
|
|
15
|
+
let gatewayReachable = false;
|
|
16
|
+
for (let i = 0; i < HEALTH_CHECK_RETRIES; i++) {
|
|
17
|
+
try {
|
|
18
|
+
const result = await safeExec('curl', [
|
|
19
|
+
'-s',
|
|
20
|
+
'-o', '/dev/null',
|
|
21
|
+
'-w', '%{http_code}',
|
|
22
|
+
'--max-time', '5',
|
|
23
|
+
'http://127.0.0.1:18789',
|
|
24
|
+
]);
|
|
25
|
+
const httpCode = parseInt(result.stdout.trim(), 10);
|
|
26
|
+
if (httpCode >= 200 && httpCode < 500) {
|
|
27
|
+
gatewayReachable = true;
|
|
28
|
+
ctx.emit('log', 'health', `Gateway responding (HTTP ${httpCode})`);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Retry
|
|
34
|
+
}
|
|
35
|
+
if (i < HEALTH_CHECK_RETRIES - 1) {
|
|
36
|
+
ctx.emit('log', 'health', `Gateway not ready, retrying in ${HEALTH_CHECK_INTERVAL_MS / 1000}s...`);
|
|
37
|
+
await sleep(HEALTH_CHECK_INTERVAL_MS);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (!gatewayReachable) {
|
|
41
|
+
throw new Error('OpenClaw gateway is not responding on port 18789');
|
|
42
|
+
}
|
|
43
|
+
ctx.emit('step.progress', 'health', 40);
|
|
44
|
+
// Check 2: WebSocket connectivity
|
|
45
|
+
ctx.emit('log', 'health', 'Checking WebSocket connectivity...');
|
|
46
|
+
try {
|
|
47
|
+
const wsResult = await safeExec('curl', [
|
|
48
|
+
'-s',
|
|
49
|
+
'-o', '/dev/null',
|
|
50
|
+
'-w', '%{http_code}',
|
|
51
|
+
'--max-time', '5',
|
|
52
|
+
'-H', 'Upgrade: websocket',
|
|
53
|
+
'-H', 'Connection: Upgrade',
|
|
54
|
+
'http://127.0.0.1:18789',
|
|
55
|
+
]);
|
|
56
|
+
ctx.emit('log', 'health', `WebSocket endpoint check: HTTP ${wsResult.stdout.trim()}`);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
logger.warn('WebSocket check returned non-zero, but gateway may still be functional');
|
|
60
|
+
ctx.emit('log', 'health', 'WebSocket check inconclusive, continuing...');
|
|
61
|
+
}
|
|
62
|
+
ctx.emit('step.progress', 'health', 70);
|
|
63
|
+
// Check 3: Control UI accessibility
|
|
64
|
+
ctx.emit('log', 'health', 'Checking Control UI...');
|
|
65
|
+
try {
|
|
66
|
+
const uiResult = await safeExec('curl', [
|
|
67
|
+
'-s',
|
|
68
|
+
'-o', '/dev/null',
|
|
69
|
+
'-w', '%{http_code}',
|
|
70
|
+
'--max-time', '5',
|
|
71
|
+
'http://127.0.0.1:18789',
|
|
72
|
+
]);
|
|
73
|
+
const uiCode = parseInt(uiResult.stdout.trim(), 10);
|
|
74
|
+
ctx.emit('log', 'health', `Control UI responding (HTTP ${uiCode})`);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
ctx.emit('log', 'health', 'Warning: Control UI check failed, but this may be expected');
|
|
78
|
+
}
|
|
79
|
+
ctx.emit('step.progress', 'health', 90);
|
|
80
|
+
// Build connection details
|
|
81
|
+
const tailscaleIp = ctx.results.get('tailscaleIp');
|
|
82
|
+
const controlUiUrl = tailscaleIp
|
|
83
|
+
? `http://${tailscaleIp}:18789`
|
|
84
|
+
: 'http://127.0.0.1:18789';
|
|
85
|
+
ctx.results.set('controlUiUrl', controlUiUrl);
|
|
86
|
+
ctx.results.set('healthCheckPassed', true);
|
|
87
|
+
ctx.emit('step.progress', 'health', 100);
|
|
88
|
+
ctx.emit('log', 'health', `Health checks passed. Control UI: ${controlUiUrl}`);
|
|
89
|
+
logger.info('All health checks passed', { controlUiUrl });
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
function sleep(ms) {
|
|
93
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/setup/steps/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAG1D,eAAO,MAAM,YAAY,EAAE,SA8B1B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { safeExec, safeExecPipe } from '../../utils/exec.js';
|
|
2
|
+
export const openclawStep = {
|
|
3
|
+
name: 'openclaw',
|
|
4
|
+
description: 'Install OpenClaw globally via npm',
|
|
5
|
+
required: true,
|
|
6
|
+
shouldRun: () => true,
|
|
7
|
+
async execute(ctx) {
|
|
8
|
+
ctx.emit('log', 'openclaw', 'Installing openclaw@latest globally...');
|
|
9
|
+
ctx.emit('step.progress', 'openclaw', 10);
|
|
10
|
+
await safeExecPipe('npm', ['install', '-g', 'openclaw@latest'], {}, (output) => ctx.emit('log', 'openclaw', output), (output) => ctx.emit('log', 'openclaw', output));
|
|
11
|
+
ctx.emit('step.progress', 'openclaw', 80);
|
|
12
|
+
// Verify installation
|
|
13
|
+
ctx.emit('log', 'openclaw', 'Verifying openclaw installation...');
|
|
14
|
+
const result = await safeExec('openclaw', ['--version']);
|
|
15
|
+
const version = result.stdout.trim();
|
|
16
|
+
ctx.emit('log', 'openclaw', `OpenClaw version: ${version}`);
|
|
17
|
+
ctx.results.set('openclawVersion', version);
|
|
18
|
+
ctx.emit('step.progress', 'openclaw', 100);
|
|
19
|
+
ctx.emit('log', 'openclaw', 'OpenClaw installed successfully');
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=openclaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../../src/setup/steps/openclaw.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,mCAAmC;IAChD,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IAErB,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,wCAAwC,CAAC,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAE1C,MAAM,YAAY,CAChB,KAAK,EACL,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,EACpC,EAAE,EACF,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EACvD,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CACxD,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAE1C,sBAAsB;QACtB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,oCAAoC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,qBAAqB,OAAO,EAAE,CAAC,CAAC;QAE5D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,iCAAiC,CAAC,CAAC;IACjE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAI1D,eAAO,MAAM,WAAW,EAAE,SAuCzB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { safeExec } from '../../utils/exec.js';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
export const serviceStep = {
|
|
4
|
+
name: 'service',
|
|
5
|
+
description: 'Set up OpenClaw as a systemd service',
|
|
6
|
+
required: true,
|
|
7
|
+
shouldRun: () => true,
|
|
8
|
+
async execute(ctx) {
|
|
9
|
+
ctx.emit('log', 'service', 'Installing OpenClaw gateway service...');
|
|
10
|
+
ctx.emit('step.progress', 'service', 10);
|
|
11
|
+
// Use OpenClaw's built-in service installer (creates user-level systemd unit)
|
|
12
|
+
await safeExec('openclaw', ['gateway', 'install', '--force', '--port', '18789']);
|
|
13
|
+
ctx.emit('step.progress', 'service', 40);
|
|
14
|
+
// Start the gateway service
|
|
15
|
+
ctx.emit('log', 'service', 'Starting OpenClaw gateway service...');
|
|
16
|
+
await safeExec('openclaw', ['gateway', 'start']);
|
|
17
|
+
ctx.emit('step.progress', 'service', 70);
|
|
18
|
+
// Verify it's running via openclaw gateway status
|
|
19
|
+
ctx.emit('log', 'service', 'Verifying service is running...');
|
|
20
|
+
const result = await safeExec('openclaw', ['gateway', 'status', '--json']);
|
|
21
|
+
let status;
|
|
22
|
+
try {
|
|
23
|
+
status = JSON.parse(result.stdout);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new Error('Failed to parse gateway status output');
|
|
27
|
+
}
|
|
28
|
+
const state = status?.service?.runtime?.state;
|
|
29
|
+
if (state !== 'active') {
|
|
30
|
+
throw new Error(`OpenClaw gateway service is not active (state: ${state ?? 'unknown'})`);
|
|
31
|
+
}
|
|
32
|
+
ctx.emit('step.progress', 'service', 100);
|
|
33
|
+
ctx.emit('log', 'service', 'OpenClaw gateway service installed and running');
|
|
34
|
+
logger.info('OpenClaw gateway service is active');
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/setup/steps/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,sCAAsC;IACnD,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IAErB,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,wCAAwC,CAAC,CAAC;QACrE,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAEzC,8EAA8E;QAC9E,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACjF,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAEzC,4BAA4B;QAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,sCAAsC,CAAC,CAAC;QACnE,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAEzC,kDAAkD;QAClD,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,iCAAiC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE3E,IAAI,MAAsD,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;QAC9C,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,IAAI,SAAS,GAAG,CAAC,CAAC;QAC3F,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,gDAAgD,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/system.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAM1D,eAAO,MAAM,UAAU,EAAE,SA2ExB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import { safeExec, safeExecPipe } from '../../utils/exec.js';
|
|
3
|
+
import { logger } from '../../utils/logger.js';
|
|
4
|
+
const MIN_RAM_FOR_SWAP = 2 * 1024 * 1024 * 1024; // 2GB in bytes
|
|
5
|
+
export const systemStep = {
|
|
6
|
+
name: 'system',
|
|
7
|
+
description: 'System preparation: update packages, configure swap, verify Node.js',
|
|
8
|
+
required: true,
|
|
9
|
+
shouldRun: () => true,
|
|
10
|
+
async execute(ctx) {
|
|
11
|
+
// Step 1: apt update & upgrade
|
|
12
|
+
ctx.emit('log', 'system', 'Running apt update...');
|
|
13
|
+
ctx.emit('step.progress', 'system', 10);
|
|
14
|
+
await safeExecPipe('apt-get', ['update', '-y'], { env: { ...process.env, DEBIAN_FRONTEND: 'noninteractive' } }, (output) => ctx.emit('log', 'system', output));
|
|
15
|
+
ctx.emit('step.progress', 'system', 30);
|
|
16
|
+
ctx.emit('log', 'system', 'Running apt upgrade...');
|
|
17
|
+
await safeExecPipe('apt-get', ['upgrade', '-y'], { env: { ...process.env, DEBIAN_FRONTEND: 'noninteractive' } }, (output) => ctx.emit('log', 'system', output));
|
|
18
|
+
ctx.emit('step.progress', 'system', 50);
|
|
19
|
+
// Step 2: Install essential packages
|
|
20
|
+
ctx.emit('log', 'system', 'Installing essential packages...');
|
|
21
|
+
await safeExec('apt-get', ['install', '-y', 'curl', 'ca-certificates', 'gnupg', 'build-essential'], {
|
|
22
|
+
env: { ...process.env, DEBIAN_FRONTEND: 'noninteractive' },
|
|
23
|
+
});
|
|
24
|
+
ctx.emit('step.progress', 'system', 65);
|
|
25
|
+
// Step 3: Setup swap if RAM < 2GB
|
|
26
|
+
const totalMem = os.totalmem();
|
|
27
|
+
if (totalMem < MIN_RAM_FOR_SWAP) {
|
|
28
|
+
ctx.emit('log', 'system', `RAM is ${Math.round(totalMem / 1024 / 1024)}MB, setting up 2GB swap...`);
|
|
29
|
+
try {
|
|
30
|
+
await safeExec('fallocate', ['-l', '2G', '/swapfile']);
|
|
31
|
+
await safeExec('chmod', ['600', '/swapfile']);
|
|
32
|
+
await safeExec('mkswap', ['/swapfile']);
|
|
33
|
+
await safeExec('swapon', ['/swapfile']);
|
|
34
|
+
ctx.emit('log', 'system', 'Swap configured successfully');
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
logger.warn('Failed to set up swap, continuing anyway', {
|
|
38
|
+
error: err instanceof Error ? err.message : String(err),
|
|
39
|
+
});
|
|
40
|
+
ctx.emit('log', 'system', 'Warning: Failed to set up swap, continuing...');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
ctx.emit('log', 'system', `RAM is ${Math.round(totalMem / 1024 / 1024)}MB, swap not needed`);
|
|
45
|
+
}
|
|
46
|
+
ctx.emit('step.progress', 'system', 80);
|
|
47
|
+
// Step 4: Verify Node.js 22
|
|
48
|
+
ctx.emit('log', 'system', 'Verifying Node.js version...');
|
|
49
|
+
const nodeResult = await safeExec('node', ['--version']);
|
|
50
|
+
const nodeVersion = nodeResult.stdout.trim();
|
|
51
|
+
ctx.emit('log', 'system', `Node.js version: ${nodeVersion}`);
|
|
52
|
+
const majorVersion = parseInt(nodeVersion.replace('v', '').split('.')[0], 10);
|
|
53
|
+
if (majorVersion < 22) {
|
|
54
|
+
throw new Error(`Node.js 22+ is required, found ${nodeVersion}`);
|
|
55
|
+
}
|
|
56
|
+
ctx.emit('step.progress', 'system', 100);
|
|
57
|
+
ctx.emit('log', 'system', 'System preparation complete');
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/setup/steps/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/tailscale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAG1D,eAAO,MAAM,aAAa,EAAE,SA4D3B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { safeExec, safeExecPipe } from '../../utils/exec.js';
|
|
2
|
+
export const tailscaleStep = {
|
|
3
|
+
name: 'tailscale',
|
|
4
|
+
description: 'Install and configure Tailscale VPN',
|
|
5
|
+
required: false,
|
|
6
|
+
shouldRun: (config) => config.securityMode === 'tailscale',
|
|
7
|
+
async execute(ctx) {
|
|
8
|
+
if (!ctx.config.tailscaleAuthKey) {
|
|
9
|
+
throw new Error('Tailscale auth key is required when security mode is tailscale');
|
|
10
|
+
}
|
|
11
|
+
// Install Tailscale
|
|
12
|
+
ctx.emit('log', 'tailscale', 'Downloading Tailscale installer...');
|
|
13
|
+
ctx.emit('step.progress', 'tailscale', 10);
|
|
14
|
+
await safeExecPipe('curl', ['-fsSL', 'https://tailscale.com/install.sh', '-o', '/tmp/tailscale-install.sh'], {}, (output) => ctx.emit('log', 'tailscale', output));
|
|
15
|
+
ctx.emit('step.progress', 'tailscale', 30);
|
|
16
|
+
ctx.emit('log', 'tailscale', 'Running Tailscale installer...');
|
|
17
|
+
await safeExecPipe('sh', ['/tmp/tailscale-install.sh'], {}, (output) => ctx.emit('log', 'tailscale', output), (output) => ctx.emit('log', 'tailscale', output));
|
|
18
|
+
ctx.emit('step.progress', 'tailscale', 60);
|
|
19
|
+
// Authenticate with auth key
|
|
20
|
+
ctx.emit('log', 'tailscale', 'Authenticating with Tailscale...');
|
|
21
|
+
await safeExec('tailscale', [
|
|
22
|
+
'up',
|
|
23
|
+
`--authkey=${ctx.config.tailscaleAuthKey}`,
|
|
24
|
+
'--hostname=openclaw-vps',
|
|
25
|
+
]);
|
|
26
|
+
ctx.emit('step.progress', 'tailscale', 80);
|
|
27
|
+
// Get Tailscale IP
|
|
28
|
+
ctx.emit('log', 'tailscale', 'Retrieving Tailscale IP...');
|
|
29
|
+
const ipResult = await safeExec('tailscale', ['ip', '-4']);
|
|
30
|
+
const tailscaleIp = ipResult.stdout.trim();
|
|
31
|
+
ctx.emit('log', 'tailscale', `Tailscale IP: ${tailscaleIp}`);
|
|
32
|
+
ctx.results.set('tailscaleIp', tailscaleIp);
|
|
33
|
+
// Update firewall: restrict agent port to Tailscale subnet
|
|
34
|
+
ctx.emit('log', 'tailscale', 'Updating firewall rules for Tailscale...');
|
|
35
|
+
await safeExec('ufw', ['allow', 'in', 'on', 'tailscale0']);
|
|
36
|
+
ctx.emit('step.progress', 'tailscale', 100);
|
|
37
|
+
ctx.emit('log', 'tailscale', 'Tailscale configured successfully');
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=tailscale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale.js","sourceRoot":"","sources":["../../../src/setup/steps/tailscale.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,qCAAqC;IAClD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,WAAW;IAE1D,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QAED,oBAAoB;QACpB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,oCAAoC,CAAC,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,YAAY,CAChB,MAAM,EACN,CAAC,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,2BAA2B,CAAC,EAChF,EAAE,EACF,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CACzD,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,gCAAgC,CAAC,CAAC;QAE/D,MAAM,YAAY,CAChB,IAAI,EACJ,CAAC,2BAA2B,CAAC,EAC7B,EAAE,EACF,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EACxD,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CACzD,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,6BAA6B;QAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,kCAAkC,CAAC,CAAC;QACjE,MAAM,QAAQ,CAAC,WAAW,EAAE;YAC1B,IAAI;YACJ,aAAa,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC1C,yBAAyB;SAC1B,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE3C,mBAAmB;QACnB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,4BAA4B,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAE7D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAE5C,2DAA2D;QAC3D,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,0CAA0C,CAAC,CAAC;QACzE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QAE3D,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,mCAAmC,CAAC,CAAC;IACpE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type StepName = 'system' | 'openclaw' | 'configure' | 'tailscale' | 'channels' | 'service' | 'health';
|
|
2
|
+
export type StepState = 'pending' | 'running' | 'completed' | 'error' | 'skipped';
|
|
3
|
+
export interface StepStatus {
|
|
4
|
+
name: StepName;
|
|
5
|
+
state: StepState;
|
|
6
|
+
error?: string;
|
|
7
|
+
duration?: number;
|
|
8
|
+
retries: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SetupConfig {
|
|
11
|
+
openrouterApiKey: string;
|
|
12
|
+
selectedModels: string[];
|
|
13
|
+
securityMode: 'password' | 'tailscale';
|
|
14
|
+
gatewayToken?: string;
|
|
15
|
+
tailscaleAuthKey?: string;
|
|
16
|
+
channels: ChannelConfig[];
|
|
17
|
+
}
|
|
18
|
+
export interface ChannelConfig {
|
|
19
|
+
type: string;
|
|
20
|
+
name: string;
|
|
21
|
+
config: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export interface StepContext {
|
|
24
|
+
config: SetupConfig;
|
|
25
|
+
configDir: string;
|
|
26
|
+
emit: (event: string, ...args: unknown[]) => void;
|
|
27
|
+
results: Map<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface SetupStep {
|
|
30
|
+
name: StepName;
|
|
31
|
+
description: string;
|
|
32
|
+
required: boolean;
|
|
33
|
+
shouldRun: (config: SetupConfig) => boolean;
|
|
34
|
+
execute: (ctx: StepContext) => Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/setup/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,UAAU,GACV,WAAW,GACX,WAAW,GACX,UAAU,GACV,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAElF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,UAAU,GAAG,WAAW,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC;IAC5C,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/setup/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TlsCert {
|
|
2
|
+
cert: string;
|
|
3
|
+
key: string;
|
|
4
|
+
fingerprint: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function generateToken(length?: number): string;
|
|
7
|
+
export declare function generateSessionToken(): string;
|
|
8
|
+
export declare function hashToken(token: string): string;
|
|
9
|
+
export declare function generateTlsCert(pairingToken: string): TlsCert;
|
|
10
|
+
export declare function computeCertFingerprint(certPem: string): string;
|
|
11
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,MAAM,SAAK,GAAG,MAAM,CAEjD;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CA8B7D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM9D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { randomBytes, createHash } from 'node:crypto';
|
|
2
|
+
import selfsigned from 'selfsigned';
|
|
3
|
+
export function generateToken(length = 32) {
|
|
4
|
+
return randomBytes(length).toString('hex');
|
|
5
|
+
}
|
|
6
|
+
export function generateSessionToken() {
|
|
7
|
+
return randomBytes(48).toString('base64url');
|
|
8
|
+
}
|
|
9
|
+
export function hashToken(token) {
|
|
10
|
+
return createHash('sha256').update(token).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
export function generateTlsCert(pairingToken) {
|
|
13
|
+
const attrs = [{ name: 'commonName', value: 'getaclaw-agent' }];
|
|
14
|
+
const options = {
|
|
15
|
+
days: 365,
|
|
16
|
+
keySize: 2048,
|
|
17
|
+
algorithm: 'sha256',
|
|
18
|
+
extensions: [
|
|
19
|
+
{
|
|
20
|
+
name: 'subjectAltName',
|
|
21
|
+
altNames: [
|
|
22
|
+
{ type: 2, value: 'localhost' },
|
|
23
|
+
{ type: 7, ip: '127.0.0.1' },
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
const pems = selfsigned.generate(attrs, options);
|
|
29
|
+
const fingerprint = createHash('sha256')
|
|
30
|
+
.update(pems.cert)
|
|
31
|
+
.digest('hex')
|
|
32
|
+
.match(/.{2}/g)
|
|
33
|
+
.join(':');
|
|
34
|
+
return {
|
|
35
|
+
cert: pems.cert,
|
|
36
|
+
key: pems.private,
|
|
37
|
+
fingerprint,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function computeCertFingerprint(certPem) {
|
|
41
|
+
return createHash('sha256')
|
|
42
|
+
.update(certPem)
|
|
43
|
+
.digest('hex')
|
|
44
|
+
.match(/.{2}/g)
|
|
45
|
+
.join(':');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,UAAU,MAAM,YAAY,CAAC;AAQpC,MAAM,UAAU,aAAa,CAAC,MAAM,GAAG,EAAE;IACvC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,QAAiB;QAC5B,UAAU,EAAE;YACV;gBACE,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;oBAC/B,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE;iBAC7B;aACF;SACF;KACF,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;SACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACjB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,OAAO,CAAE;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,IAAI,CAAC,OAAO;QACjB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,OAAO,CAAE;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ExecFileOptions } from 'node:child_process';
|
|
2
|
+
export interface ExecResult {
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
exitCode: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class CommandNotAllowedError extends Error {
|
|
8
|
+
constructor(command: string);
|
|
9
|
+
}
|
|
10
|
+
export declare function safeExec(command: string, args: string[], options?: ExecFileOptions): Promise<ExecResult>;
|
|
11
|
+
export declare function safeExecPipe(command: string, args: string[], options?: ExecFileOptions, onStdout?: (data: string) => void, onStderr?: (data: string) => void): Promise<ExecResult>;
|
|
12
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,eAAe,EAAqB,MAAM,oBAAoB,CAAC;AA8B9F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAqCrB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,eAAoB,EAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACjC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,UAAU,CAAC,CAsCrB"}
|