claw-zero 0.1.0 → 0.1.2
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/config.d.ts +6 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -3
- package/dist/config.js.map +1 -1
- package/dist/container.d.ts +2 -0
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +40 -13
- package/dist/container.js.map +1 -1
- package/dist/docker.d.ts +13 -3
- package/dist/docker.d.ts.map +1 -1
- package/dist/docker.js +36 -11
- package/dist/docker.js.map +1 -1
- package/dist/index.js +218 -11
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +34 -0
- package/dist/logger.js.map +1 -0
- package/dist/network.d.ts +15 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +89 -0
- package/dist/network.js.map +1 -0
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { SecurityProfileKey } from './types.js';
|
|
1
|
+
import type { SecurityProfileKey, ClawdbotConfig } from './types.js';
|
|
2
2
|
export declare const WORKSPACE_PATH: string;
|
|
3
3
|
export declare const CONFIG_FILENAME = "clawdbot.json";
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Generates clawdbot.json and writes it to the workspace directory.
|
|
6
|
+
* Pass `overrideConfig` to use custom values instead of the profile defaults.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateConfig(profileKey: SecurityProfileKey, apiKey: string, overrideConfig?: ClawdbotConfig): Promise<void>;
|
|
6
9
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGrE,eAAO,MAAM,cAAc,QAAmD,CAAC;AAC/E,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C;;;GAGG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,IAAI,CAAC,CAef"}
|
package/dist/config.js
CHANGED
|
@@ -4,13 +4,16 @@ import { homedir } from 'node:os';
|
|
|
4
4
|
import { PROFILES } from './profiles.js';
|
|
5
5
|
export const WORKSPACE_PATH = join(homedir(), 'Desktop', 'OpenClaw_Workspace');
|
|
6
6
|
export const CONFIG_FILENAME = 'clawdbot.json';
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Generates clawdbot.json and writes it to the workspace directory.
|
|
9
|
+
* Pass `overrideConfig` to use custom values instead of the profile defaults.
|
|
10
|
+
*/
|
|
11
|
+
export async function generateConfig(profileKey, apiKey, overrideConfig) {
|
|
9
12
|
const profile = PROFILES[profileKey];
|
|
10
13
|
if (!profile)
|
|
11
14
|
throw new Error(`Unknown profile: ${profileKey}`);
|
|
12
15
|
const configData = {
|
|
13
|
-
...profile.config,
|
|
16
|
+
...(overrideConfig ?? profile.config),
|
|
14
17
|
api_key: apiKey,
|
|
15
18
|
};
|
|
16
19
|
await mkdir(WORKSPACE_PATH, { recursive: true });
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAA8B,EAC9B,MAAc,EACd,cAA+B;IAE/B,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,MAAM;KAChB,CAAC;IAEF,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,SAAS,CACb,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,EACrC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EACnC,OAAO,CACR,CAAC;AACJ,CAAC"}
|
package/dist/container.d.ts
CHANGED
|
@@ -12,4 +12,6 @@ export declare function pullContainerImage(): Promise<{
|
|
|
12
12
|
export declare function launchContainer(apiKey: string, _profileKey: SecurityProfileKey): Promise<{
|
|
13
13
|
port: number;
|
|
14
14
|
}>;
|
|
15
|
+
/** Stops the running OpenClaw container; no-op if it isn't running. */
|
|
16
|
+
export declare function stopContainer(): Promise<void>;
|
|
15
17
|
//# sourceMappingURL=container.d.ts.map
|
package/dist/container.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AASrD,yEAAyE;AACzE,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBpE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB3B;AAED,uEAAuE;AACvE,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAMnD"}
|
package/dist/container.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { execa } from 'execa';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
const CONTAINER_NAME = 'openclaw_sandbox';
|
|
4
5
|
const WORKSPACE_PATH = join(homedir(), 'Desktop', 'OpenClaw_Workspace');
|
|
5
6
|
const IMAGE = 'ghcr.io/openclaw/openclaw:latest';
|
|
6
|
-
const
|
|
7
|
+
const GATEWAY_PORT = 18789; // Control UI + WebSocket gateway
|
|
8
|
+
const EXPOSED_PORT = 3845; // Image's declared EXPOSE (kept for compatibility)
|
|
7
9
|
/** Pulls the OpenClaw container image; returns the pulled image size. */
|
|
8
10
|
export async function pullContainerImage() {
|
|
9
|
-
|
|
11
|
+
try {
|
|
12
|
+
await execa('docker', ['pull', IMAGE], { stdio: 'pipe', timeout: 600_000 });
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
const stderr = err.stderr ?? '';
|
|
16
|
+
const lastLine = stderr.trim().split('\n').pop() ?? 'docker pull failed';
|
|
17
|
+
throw new Error(lastLine);
|
|
18
|
+
}
|
|
10
19
|
// Get image size after pull
|
|
11
20
|
const { stdout } = await execa('docker', [
|
|
12
21
|
'image',
|
|
@@ -26,16 +35,34 @@ export async function pullContainerImage() {
|
|
|
26
35
|
* - Passes the API key as ANTHROPIC_API_KEY env var
|
|
27
36
|
*/
|
|
28
37
|
export async function launchContainer(apiKey, _profileKey) {
|
|
29
|
-
|
|
30
|
-
'
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
try {
|
|
39
|
+
await execa('docker', [
|
|
40
|
+
'run',
|
|
41
|
+
'--detach',
|
|
42
|
+
'--rm',
|
|
43
|
+
'--name', CONTAINER_NAME,
|
|
44
|
+
'--publish', `${GATEWAY_PORT}:${GATEWAY_PORT}`,
|
|
45
|
+
'--publish', `${EXPOSED_PORT}:${EXPOSED_PORT}`,
|
|
46
|
+
'--volume', `${WORKSPACE_PATH}:/workspace`,
|
|
47
|
+
'--env', `ANTHROPIC_API_KEY=${apiKey}`,
|
|
48
|
+
IMAGE,
|
|
49
|
+
], { stdio: 'ignore', timeout: 30_000 });
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err.timedOut) {
|
|
53
|
+
throw new Error('docker run timed out after 30s — check your internet connection');
|
|
54
|
+
}
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
return { port: GATEWAY_PORT };
|
|
58
|
+
}
|
|
59
|
+
/** Stops the running OpenClaw container; no-op if it isn't running. */
|
|
60
|
+
export async function stopContainer() {
|
|
61
|
+
try {
|
|
62
|
+
await execa('docker', ['stop', CONTAINER_NAME], { stdio: 'pipe', timeout: 15_000 });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Container not running or already stopped — ignore
|
|
66
|
+
}
|
|
40
67
|
}
|
|
41
68
|
//# sourceMappingURL=container.js.map
|
package/dist/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;AACxE,MAAM,KAAK,GAAG,kCAAkC,CAAC;AACjD,MAAM,
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;AACxE,MAAM,KAAK,GAAG,kCAAkC,CAAC;AACjD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,iCAAiC;AAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,CAAE,mDAAmD;AAE/E,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,IAAI,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,oBAAoB,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACvC,OAAO;QACP,SAAS;QACT,KAAK;QACL,UAAU;QACV,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAEnF,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,WAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,KAAK,CACT,QAAQ,EACR;YACE,KAAK;YACL,UAAU;YACV,MAAM;YACN,QAAQ,EAAE,cAAc;YACxB,WAAW,EAAE,GAAG,YAAY,IAAI,YAAY,EAAE;YAC9C,WAAW,EAAE,GAAG,YAAY,IAAI,YAAY,EAAE;YAC9C,UAAU,EAAE,GAAG,cAAc,aAAa;YAC1C,OAAO,EAAE,qBAAqB,MAAM,EAAE;YACtC,KAAK;SACN,EACD,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CACrC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA8B,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAChC,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;AACH,CAAC"}
|
package/dist/docker.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if Docker Desktop is installed OR the docker CLI responds.
|
|
3
|
+
* Checks /Applications/Docker.app first (covers the installed-but-not-launched case)
|
|
4
|
+
* before falling back to `docker --version`.
|
|
5
|
+
*/
|
|
2
6
|
export declare function checkDocker(): Promise<boolean>;
|
|
3
|
-
/** Install Docker Desktop via Homebrew Cask. */
|
|
7
|
+
/** Install Docker Desktop via Homebrew Cask. Captures output — does not bleed into Listr spinner. */
|
|
4
8
|
export declare function installDocker(): Promise<void>;
|
|
5
|
-
/**
|
|
9
|
+
/** Returns true if the Docker daemon is currently responding. */
|
|
10
|
+
export declare function isDaemonRunning(): Promise<boolean>;
|
|
11
|
+
/** Open Docker.app without waiting — caller is responsible for waiting via pollDaemonReady(). */
|
|
12
|
+
export declare function launchDockerApp(): Promise<void>;
|
|
13
|
+
/** Poll `docker info` until the daemon responds or the timeout elapses. */
|
|
14
|
+
export declare function pollDaemonReady(timeoutMs?: number): Promise<void>;
|
|
15
|
+
/** @deprecated Use isDaemonRunning() + launchDockerApp() + pollDaemonReady() instead. */
|
|
6
16
|
export declare function startDockerDaemon(): Promise<void>;
|
|
7
17
|
//# sourceMappingURL=docker.d.ts.map
|
package/dist/docker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAQpD;AAED,qGAAqG;AACrG,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAQnD;AAED,iEAAiE;AACjE,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,iGAAiG;AACjG,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,2EAA2E;AAC3E,wBAAsB,eAAe,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAevE;AAED,yFAAyF;AACzF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIvD"}
|
package/dist/docker.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { execa } from 'execa';
|
|
2
|
-
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
/**
|
|
4
|
+
* Returns true if Docker Desktop is installed OR the docker CLI responds.
|
|
5
|
+
* Checks /Applications/Docker.app first (covers the installed-but-not-launched case)
|
|
6
|
+
* before falling back to `docker --version`.
|
|
7
|
+
*/
|
|
3
8
|
export async function checkDocker() {
|
|
9
|
+
if (existsSync('/Applications/Docker.app'))
|
|
10
|
+
return true;
|
|
4
11
|
try {
|
|
5
12
|
await execa('docker', ['--version']);
|
|
6
13
|
return true;
|
|
@@ -9,25 +16,36 @@ export async function checkDocker() {
|
|
|
9
16
|
return false;
|
|
10
17
|
}
|
|
11
18
|
}
|
|
12
|
-
/** Install Docker Desktop via Homebrew Cask. */
|
|
19
|
+
/** Install Docker Desktop via Homebrew Cask. Captures output — does not bleed into Listr spinner. */
|
|
13
20
|
export async function installDocker() {
|
|
14
|
-
|
|
21
|
+
try {
|
|
22
|
+
await execa('brew', ['install', '--cask', 'docker'], { stdio: 'pipe', timeout: 600_000 });
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
const stderr = err.stderr ?? '';
|
|
26
|
+
const lastLine = stderr.trim().split('\n').pop() ?? 'brew install failed';
|
|
27
|
+
throw new Error(lastLine);
|
|
28
|
+
}
|
|
15
29
|
}
|
|
16
|
-
/**
|
|
17
|
-
export async function
|
|
18
|
-
// Check if daemon is already running
|
|
30
|
+
/** Returns true if the Docker daemon is currently responding. */
|
|
31
|
+
export async function isDaemonRunning() {
|
|
19
32
|
try {
|
|
20
33
|
await execa('docker', ['info'], { stdio: 'ignore' });
|
|
21
|
-
return;
|
|
34
|
+
return true;
|
|
22
35
|
}
|
|
23
36
|
catch {
|
|
24
|
-
|
|
37
|
+
return false;
|
|
25
38
|
}
|
|
39
|
+
}
|
|
40
|
+
/** Open Docker.app without waiting — caller is responsible for waiting via pollDaemonReady(). */
|
|
41
|
+
export async function launchDockerApp() {
|
|
26
42
|
await execa('open', ['-a', 'Docker']);
|
|
43
|
+
}
|
|
44
|
+
/** Poll `docker info` until the daemon responds or the timeout elapses. */
|
|
45
|
+
export async function pollDaemonReady(timeoutMs = 30_000) {
|
|
27
46
|
const POLL_INTERVAL_MS = 2000;
|
|
28
|
-
const MAX_WAIT_MS = 60_000;
|
|
29
47
|
const start = Date.now();
|
|
30
|
-
while (Date.now() - start <
|
|
48
|
+
while (Date.now() - start < timeoutMs) {
|
|
31
49
|
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
32
50
|
try {
|
|
33
51
|
await execa('docker', ['info'], { stdio: 'ignore' });
|
|
@@ -37,6 +55,13 @@ export async function startDockerDaemon() {
|
|
|
37
55
|
// Still starting — keep polling
|
|
38
56
|
}
|
|
39
57
|
}
|
|
40
|
-
throw new Error('Docker daemon did not
|
|
58
|
+
throw new Error('Docker daemon did not respond within 30s — try again once Docker is fully started');
|
|
59
|
+
}
|
|
60
|
+
/** @deprecated Use isDaemonRunning() + launchDockerApp() + pollDaemonReady() instead. */
|
|
61
|
+
export async function startDockerDaemon() {
|
|
62
|
+
if (await isDaemonRunning())
|
|
63
|
+
return;
|
|
64
|
+
await launchDockerApp();
|
|
65
|
+
await pollDaemonReady();
|
|
41
66
|
}
|
|
42
67
|
//# sourceMappingURL=docker.js.map
|
package/dist/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,UAAU,CAAC,0BAA0B,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,IAAI,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,qBAAqB,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAS,GAAG,MAAM;IACtD,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,eAAe;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;AACvG,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,MAAM,eAAe,EAAE;QAAE,OAAO;IACpC,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,eAAe,EAAE,CAAC;AAC1B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,9 +5,11 @@ import { Listr } from 'listr2';
|
|
|
5
5
|
import { PROFILES } from './profiles.js';
|
|
6
6
|
import { generateConfig, WORKSPACE_PATH } from './config.js';
|
|
7
7
|
import { execa } from 'execa';
|
|
8
|
-
import { checkDocker, installDocker,
|
|
8
|
+
import { checkDocker, installDocker, isDaemonRunning, launchDockerApp, pollDaemonReady } from './docker.js';
|
|
9
9
|
import { createWorkspace } from './workspace.js';
|
|
10
|
-
import { pullContainerImage, launchContainer } from './container.js';
|
|
10
|
+
import { pullContainerImage, launchContainer, stopContainer } from './container.js';
|
|
11
|
+
import { checkInternetSpeed, buildDownloadManifest, formatManifestTable } from './network.js';
|
|
12
|
+
import { initLog, log, logError, getLogPath } from './logger.js';
|
|
11
13
|
/** Formats API key for inline confirmation: first 7 + last 4 chars. */
|
|
12
14
|
function maskApiKey(key) {
|
|
13
15
|
if (key.length <= 11)
|
|
@@ -28,6 +30,124 @@ function highlightJson(obj) {
|
|
|
28
30
|
})
|
|
29
31
|
.join('\n');
|
|
30
32
|
}
|
|
33
|
+
/** Formats a config value for display in the settings table. */
|
|
34
|
+
function formatConfigValue(key, config) {
|
|
35
|
+
switch (key) {
|
|
36
|
+
case 'sandbox.mode': return config.sandbox.mode;
|
|
37
|
+
case 'workspaceAccess': return config.workspaceAccess;
|
|
38
|
+
case 'skill_registry_trust': return config.skill_registry_trust;
|
|
39
|
+
case 'max_budget': return config.max_budget === 0 ? 'unlimited' : String(config.max_budget);
|
|
40
|
+
case 'require_human_approval':
|
|
41
|
+
return config.require_human_approval.length === 0
|
|
42
|
+
? '(none)'
|
|
43
|
+
: config.require_human_approval.join(', ');
|
|
44
|
+
default: return '';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Displays the active config as a summary table and optionally lets the user
|
|
49
|
+
* change individual settings. Returns the (possibly updated) config.
|
|
50
|
+
*/
|
|
51
|
+
async function settingsReview(config, profileLabel, apiKey, profileKey, currentPort) {
|
|
52
|
+
const SETTINGS = [
|
|
53
|
+
{ key: 'sandbox.mode', label: 'Sandbox mode' },
|
|
54
|
+
{ key: 'workspaceAccess', label: 'Workspace access' },
|
|
55
|
+
{ key: 'skill_registry_trust', label: 'Skill registry trust' },
|
|
56
|
+
{ key: 'max_budget', label: 'Max budget (tokens)' },
|
|
57
|
+
{ key: 'require_human_approval', label: 'Require human approval' },
|
|
58
|
+
];
|
|
59
|
+
const colW = 28;
|
|
60
|
+
const table = [
|
|
61
|
+
pc.dim(' Setting Value'),
|
|
62
|
+
pc.dim(' ' + '─'.repeat(44)),
|
|
63
|
+
...SETTINGS.map((s) => ` ${pc.cyan(s.label.padEnd(colW))} ${pc.white(formatConfigValue(s.key, config))}`),
|
|
64
|
+
].join('\n');
|
|
65
|
+
console.log(`\n${pc.dim('◇')} ${pc.bold(`Active profile: ${profileLabel}`)}\n${table}\n`);
|
|
66
|
+
const wantChange = await p.confirm({ message: 'Would you like to change any settings?' });
|
|
67
|
+
if (p.isCancel(wantChange) || !wantChange)
|
|
68
|
+
return { config, port: currentPort };
|
|
69
|
+
let updated = { ...config, sandbox: { ...config.sandbox } };
|
|
70
|
+
const settingToChange = await p.select({
|
|
71
|
+
message: 'Which setting would you like to change?',
|
|
72
|
+
options: SETTINGS.map((s) => ({
|
|
73
|
+
value: s.key,
|
|
74
|
+
label: s.label,
|
|
75
|
+
hint: formatConfigValue(s.key, config),
|
|
76
|
+
})),
|
|
77
|
+
});
|
|
78
|
+
if (p.isCancel(settingToChange))
|
|
79
|
+
return { config, port: currentPort };
|
|
80
|
+
if (settingToChange === 'sandbox.mode') {
|
|
81
|
+
const val = await p.select({
|
|
82
|
+
message: 'Sandbox mode',
|
|
83
|
+
options: [
|
|
84
|
+
{ value: 'all', label: 'all', hint: 'Full sandbox — all commands intercepted' },
|
|
85
|
+
{ value: 'non-main', label: 'non-main', hint: 'Sandbox non-critical commands only' },
|
|
86
|
+
{ value: 'off', label: 'off', hint: 'No sandboxing' },
|
|
87
|
+
],
|
|
88
|
+
initialValue: updated.sandbox.mode,
|
|
89
|
+
});
|
|
90
|
+
if (!p.isCancel(val))
|
|
91
|
+
updated.sandbox.mode = val;
|
|
92
|
+
}
|
|
93
|
+
else if (settingToChange === 'workspaceAccess') {
|
|
94
|
+
const val = await p.select({
|
|
95
|
+
message: 'Workspace access',
|
|
96
|
+
options: [
|
|
97
|
+
{ value: 'ro', label: 'ro', hint: 'Read-only' },
|
|
98
|
+
{ value: 'scoped', label: 'scoped', hint: 'Scoped read/write' },
|
|
99
|
+
{ value: 'rw', label: 'rw', hint: 'Full read/write' },
|
|
100
|
+
],
|
|
101
|
+
initialValue: updated.workspaceAccess,
|
|
102
|
+
});
|
|
103
|
+
if (!p.isCancel(val))
|
|
104
|
+
updated.workspaceAccess = val;
|
|
105
|
+
}
|
|
106
|
+
else if (settingToChange === 'skill_registry_trust') {
|
|
107
|
+
const val = await p.select({
|
|
108
|
+
message: 'Skill registry trust',
|
|
109
|
+
options: [
|
|
110
|
+
{ value: 'none', label: 'none', hint: 'No external skills allowed' },
|
|
111
|
+
{ value: 'verified_only', label: 'verified_only', hint: 'Only verified skills' },
|
|
112
|
+
{ value: 'all', label: 'all', hint: 'All skills allowed' },
|
|
113
|
+
],
|
|
114
|
+
initialValue: updated.skill_registry_trust,
|
|
115
|
+
});
|
|
116
|
+
if (!p.isCancel(val))
|
|
117
|
+
updated.skill_registry_trust = val;
|
|
118
|
+
}
|
|
119
|
+
else if (settingToChange === 'max_budget') {
|
|
120
|
+
const val = await p.text({
|
|
121
|
+
message: 'Max budget (tokens). Enter 0 for unlimited.',
|
|
122
|
+
initialValue: String(updated.max_budget),
|
|
123
|
+
validate: (v) => {
|
|
124
|
+
if (!/^\d+$/.test(v))
|
|
125
|
+
return 'Must be a non-negative integer.';
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
if (!p.isCancel(val))
|
|
129
|
+
updated.max_budget = parseInt(val, 10);
|
|
130
|
+
}
|
|
131
|
+
else if (settingToChange === 'require_human_approval') {
|
|
132
|
+
const val = await p.text({
|
|
133
|
+
message: 'Commands requiring human approval (comma-separated). Leave empty for none.',
|
|
134
|
+
initialValue: updated.require_human_approval.join(', '),
|
|
135
|
+
});
|
|
136
|
+
if (!p.isCancel(val)) {
|
|
137
|
+
updated.require_human_approval = val
|
|
138
|
+
.split(',')
|
|
139
|
+
.map((s) => s.trim())
|
|
140
|
+
.filter(Boolean);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Rewrite clawdbot.json and restart container with updated config
|
|
144
|
+
console.log(pc.dim('\n Applying changes...'));
|
|
145
|
+
await generateConfig(profileKey, apiKey, updated);
|
|
146
|
+
await stopContainer();
|
|
147
|
+
const { port } = await launchContainer(apiKey, profileKey);
|
|
148
|
+
console.log(pc.green(' ✔ Settings applied and container restarted.\n'));
|
|
149
|
+
return { config: updated, port };
|
|
150
|
+
}
|
|
31
151
|
async function main() {
|
|
32
152
|
// ── 3.2 Welcome intro ───────────────────────────────────────────────────────
|
|
33
153
|
console.clear();
|
|
@@ -71,6 +191,67 @@ async function main() {
|
|
|
71
191
|
console.log(`\n${pc.dim('◇')} ${pc.dim('Generating clawdbot.json')}`);
|
|
72
192
|
console.log(highlightJson(selectedProfile.config));
|
|
73
193
|
console.log();
|
|
194
|
+
// ── 8.5 Pre-flight gate ──────────────────────────────────────────────────────
|
|
195
|
+
const dockerInstalled = await checkDocker();
|
|
196
|
+
// ── 9.1 Docker daemon wait with user guidance ────────────────────────────────
|
|
197
|
+
if (dockerInstalled && !(await isDaemonRunning())) {
|
|
198
|
+
await launchDockerApp();
|
|
199
|
+
p.note([
|
|
200
|
+
'Docker Desktop is launching.',
|
|
201
|
+
'',
|
|
202
|
+
' 1. Complete sign-in or registration in the Docker window.',
|
|
203
|
+
' 2. Accept the license agreement if prompted.',
|
|
204
|
+
' 3. Wait for the Docker menu-bar icon to show "Engine running".',
|
|
205
|
+
'',
|
|
206
|
+
'Press Enter below once Docker is fully started.',
|
|
207
|
+
].join('\n'), 'Docker setup required');
|
|
208
|
+
const ready = await p.confirm({ message: 'Is Docker running and ready?' });
|
|
209
|
+
if (p.isCancel(ready) || !ready) {
|
|
210
|
+
p.cancel('Setup cancelled — restart once Docker is running.');
|
|
211
|
+
process.exit(0);
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
await pollDaemonReady(30_000);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
logError('Docker daemon poll timed out', err);
|
|
218
|
+
const lp = getLogPath();
|
|
219
|
+
const logHint = lp ? `\n Log: ${lp}` : '';
|
|
220
|
+
p.cancel(`Docker is not responding. Start Docker Desktop and try again.${logHint}`);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
let speedMbps = 0;
|
|
225
|
+
try {
|
|
226
|
+
process.stdout.write(pc.dim(' Measuring download speed...'));
|
|
227
|
+
const speedResult = await checkInternetSpeed();
|
|
228
|
+
speedMbps = speedResult.mbps;
|
|
229
|
+
process.stdout.write(`\r${' '.repeat(40)}\r`); // clear the line
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
logError('Internet speed check failed (non-fatal)', err);
|
|
233
|
+
process.stdout.write(`\r${' '.repeat(40)}\r`);
|
|
234
|
+
// Non-fatal — proceed without estimate
|
|
235
|
+
}
|
|
236
|
+
const manifest = buildDownloadManifest(dockerInstalled);
|
|
237
|
+
if (manifest.length > 0) {
|
|
238
|
+
const table = formatManifestTable(manifest, speedMbps);
|
|
239
|
+
console.log(`\n${pc.dim('◇')} ${pc.bold('Download plan')}`);
|
|
240
|
+
console.log(pc.dim(table));
|
|
241
|
+
console.log();
|
|
242
|
+
if (speedMbps > 0 && speedMbps < 10) {
|
|
243
|
+
console.log(pc.yellow(` ⚠ Slow connection detected (${speedMbps.toFixed(1)} MB/s). Downloads may take a while.`));
|
|
244
|
+
console.log();
|
|
245
|
+
}
|
|
246
|
+
const proceed = await p.confirm({ message: 'Proceed with download?' });
|
|
247
|
+
if (p.isCancel(proceed) || !proceed) {
|
|
248
|
+
p.cancel('Setup cancelled.');
|
|
249
|
+
process.exit(0);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Initialise session log (workspace may not exist yet — logger handles mkdir)
|
|
253
|
+
const logFilePath = initLog();
|
|
254
|
+
log('INFO', `Profile selected: ${profileKey}`);
|
|
74
255
|
// ── 3.6 Sequential install checklist (listr2) ───────────────────────────────
|
|
75
256
|
let dockerVersion = 'Docker';
|
|
76
257
|
let imageSize = '1.2 GB';
|
|
@@ -79,12 +260,13 @@ async function main() {
|
|
|
79
260
|
{
|
|
80
261
|
title: 'Checking Docker daemon...',
|
|
81
262
|
task: async (_, task) => {
|
|
82
|
-
|
|
83
|
-
if (!
|
|
263
|
+
log('INFO', 'Task 1 start: Docker check');
|
|
264
|
+
if (!dockerInstalled) {
|
|
84
265
|
task.title = 'Installing Docker via Homebrew...';
|
|
266
|
+
log('INFO', 'Docker not found — starting Homebrew install');
|
|
85
267
|
await installDocker();
|
|
268
|
+
log('INFO', 'Docker installed via Homebrew');
|
|
86
269
|
}
|
|
87
|
-
await startDockerDaemon();
|
|
88
270
|
try {
|
|
89
271
|
const { stdout } = await execa('docker', ['--version']);
|
|
90
272
|
dockerVersion = stdout.trim();
|
|
@@ -92,36 +274,45 @@ async function main() {
|
|
|
92
274
|
catch {
|
|
93
275
|
// version string is cosmetic — don't block
|
|
94
276
|
}
|
|
277
|
+
log('INFO', `Task 1 done: ${dockerVersion} running`);
|
|
95
278
|
task.title = pc.dim(`✔ ${dockerVersion} is running`);
|
|
96
279
|
},
|
|
97
280
|
},
|
|
98
281
|
{
|
|
99
282
|
title: 'Creating workspace directory...',
|
|
100
283
|
task: async (_, task) => {
|
|
284
|
+
log('INFO', 'Task 2 start: create workspace');
|
|
101
285
|
await createWorkspace();
|
|
286
|
+
log('INFO', `Task 2 done: workspace at ${WORKSPACE_PATH}`);
|
|
102
287
|
task.title = pc.dim(`✔ Workspace ready at ${WORKSPACE_PATH}`);
|
|
103
288
|
},
|
|
104
289
|
},
|
|
105
290
|
{
|
|
106
291
|
title: 'Writing clawdbot.json...',
|
|
107
292
|
task: async (_, task) => {
|
|
293
|
+
log('INFO', 'Task 3 start: write clawdbot.json');
|
|
108
294
|
await generateConfig(profileKey, apiKey);
|
|
295
|
+
log('INFO', 'Task 3 done: clawdbot.json written');
|
|
109
296
|
task.title = pc.dim('✔ clawdbot.json written');
|
|
110
297
|
},
|
|
111
298
|
},
|
|
112
299
|
{
|
|
113
300
|
title: 'Pulling OpenClaw container image...',
|
|
114
301
|
task: async (_, task) => {
|
|
302
|
+
log('INFO', 'Task 4 start: docker pull');
|
|
115
303
|
const result = await pullContainerImage();
|
|
116
304
|
imageSize = result.size;
|
|
305
|
+
log('INFO', `Task 4 done: image pulled (${imageSize})`);
|
|
117
306
|
task.title = pc.dim(`✔ Image pulled (${imageSize})`);
|
|
118
307
|
},
|
|
119
308
|
},
|
|
120
309
|
{
|
|
121
310
|
title: 'Booting container...',
|
|
122
311
|
task: async (_, task) => {
|
|
312
|
+
log('INFO', 'Task 5 start: docker run');
|
|
123
313
|
const result = await launchContainer(apiKey, profileKey);
|
|
124
314
|
containerPort = result.port;
|
|
315
|
+
log('INFO', `Task 5 done: container live on port ${containerPort}`);
|
|
125
316
|
task.title = pc.dim(`✔ Container live on port ${containerPort}`);
|
|
126
317
|
},
|
|
127
318
|
},
|
|
@@ -132,23 +323,39 @@ async function main() {
|
|
|
132
323
|
await tasks.run();
|
|
133
324
|
}
|
|
134
325
|
catch (err) {
|
|
135
|
-
|
|
326
|
+
logError('Setup failed during install tasks', err);
|
|
327
|
+
const firstLine = (err instanceof Error ? err.message : String(err)).split('\n')[0];
|
|
328
|
+
const lp = getLogPath();
|
|
329
|
+
const logHint = lp ? `\n Log: ${lp}` : '';
|
|
330
|
+
p.cancel(`Setup failed: ${firstLine}${logHint}`);
|
|
136
331
|
process.exit(1);
|
|
137
332
|
}
|
|
138
|
-
// ──
|
|
333
|
+
// ── 9.4 Settings review ──────────────────────────────────────────────────────
|
|
334
|
+
const reviewResult = await settingsReview(selectedProfile.config, selectedProfile.label, apiKey, profileKey, containerPort);
|
|
335
|
+
containerPort = reviewResult.port;
|
|
336
|
+
// ── 9.5 Outro ────────────────────────────────────────────────────────────────
|
|
139
337
|
const box = [
|
|
140
|
-
` ${pc.dim('│')} ☕
|
|
338
|
+
` ${pc.dim('│')} ☕ Your AI sandbox is ready.`,
|
|
141
339
|
` ${pc.dim('│')}`,
|
|
142
340
|
` ${pc.dim('│')} Workspace → ${pc.cyan(WORKSPACE_PATH)}`,
|
|
143
|
-
` ${pc.dim('│')} Access → ${pc.cyan(`localhost:${containerPort}`)}`,
|
|
144
341
|
` ${pc.dim('│')} Profile → ${pc.yellow(selectedProfile.label)}`,
|
|
342
|
+
` ${pc.dim('│')} Control UI → ${pc.cyan(`http://127.0.0.1:${containerPort}/`)}`,
|
|
343
|
+
` ${pc.dim('│')}`,
|
|
344
|
+
` ${pc.dim('│')} ${pc.bold('Next steps')}`,
|
|
345
|
+
` ${pc.dim('│')} 1. Open ${pc.cyan(`http://127.0.0.1:${containerPort}/`)} in your browser`,
|
|
346
|
+
` ${pc.dim('│')} 2. Paste your ${pc.yellow('gateway token')} into Settings to authenticate`,
|
|
347
|
+
` ${pc.dim('│')} (run ${pc.dim('docker logs openclaw_sandbox')} to find it)`,
|
|
348
|
+
` ${pc.dim('│')} 3. Drop files into the workspace folder to share with the agent`,
|
|
145
349
|
` ${pc.dim('│')}`,
|
|
146
|
-
` ${pc.dim('│')}
|
|
350
|
+
` ${pc.dim('│')} Health check: ${pc.dim(`http://127.0.0.1:${containerPort}/readyz`)}`,
|
|
147
351
|
].join('\n');
|
|
148
352
|
p.outro(`${pc.green('✔')} Sandbox successfully booted!\n\n${box}`);
|
|
149
353
|
}
|
|
150
354
|
main().catch((err) => {
|
|
151
|
-
|
|
355
|
+
logError('Unexpected top-level error', err);
|
|
356
|
+
const lp = getLogPath();
|
|
357
|
+
const logHint = lp ? `\n Log: ${lp}` : '';
|
|
358
|
+
p.cancel(`An unexpected error occurred.${logHint}`);
|
|
152
359
|
process.exit(1);
|
|
153
360
|
});
|
|
154
361
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Creates the log file at ~/Desktop/OpenClaw_Workspace/claw_zero_YYYY-MM-DD_HHMMSS.log */
|
|
2
|
+
export declare function initLog(): string;
|
|
3
|
+
/** Appends a timestamped line to the session log. No-op if initLog() hasn't been called. */
|
|
4
|
+
export declare function log(level: 'INFO' | 'WARN' | 'ERROR', message: string): void;
|
|
5
|
+
/** Logs the full error stack to the session log; does NOT surface details to the user. */
|
|
6
|
+
export declare function logError(context: string, err: unknown): void;
|
|
7
|
+
/** Returns the current log file path, or null if not initialised. */
|
|
8
|
+
export declare function getLogPath(): string | null;
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAQA,2FAA2F;AAC3F,wBAAgB,OAAO,IAAI,MAAM,CAYhC;AAED,4FAA4F;AAC5F,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI3E;AAED,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAG5D;AAED,qEAAqE;AACrE,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const WORKSPACE_PATH = join(homedir(), 'Desktop', 'OpenClaw_Workspace');
|
|
5
|
+
let logPath = null;
|
|
6
|
+
/** Creates the log file at ~/Desktop/OpenClaw_Workspace/claw_zero_YYYY-MM-DD_HHMMSS.log */
|
|
7
|
+
export function initLog() {
|
|
8
|
+
const now = new Date();
|
|
9
|
+
const datePart = now.toISOString().slice(0, 10); // YYYY-MM-DD
|
|
10
|
+
const timePart = now.toTimeString().slice(0, 8).replace(/:/g, ''); // HHMMSS
|
|
11
|
+
const filename = `claw_zero_${datePart}_${timePart}.log`;
|
|
12
|
+
// Workspace may not exist yet — create it if needed
|
|
13
|
+
mkdirSync(WORKSPACE_PATH, { recursive: true });
|
|
14
|
+
logPath = join(WORKSPACE_PATH, filename);
|
|
15
|
+
log('INFO', 'claw_zero session started');
|
|
16
|
+
return logPath;
|
|
17
|
+
}
|
|
18
|
+
/** Appends a timestamped line to the session log. No-op if initLog() hasn't been called. */
|
|
19
|
+
export function log(level, message) {
|
|
20
|
+
if (!logPath)
|
|
21
|
+
return;
|
|
22
|
+
const time = new Date().toTimeString().slice(0, 8); // HH:MM:SS
|
|
23
|
+
appendFileSync(logPath, `[${time}] [${level}] ${message}\n`);
|
|
24
|
+
}
|
|
25
|
+
/** Logs the full error stack to the session log; does NOT surface details to the user. */
|
|
26
|
+
export function logError(context, err) {
|
|
27
|
+
const stack = err instanceof Error ? (err.stack ?? err.message) : String(err);
|
|
28
|
+
log('ERROR', `${context}\n${stack}`);
|
|
29
|
+
}
|
|
30
|
+
/** Returns the current log file path, or null if not initialised. */
|
|
31
|
+
export function getLogPath() {
|
|
32
|
+
return logPath;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAExE,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,2FAA2F;AAC3F,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;IAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;IAC5E,MAAM,QAAQ,GAAG,aAAa,QAAQ,IAAI,QAAQ,MAAM,CAAC;IAEzD,oDAAoD;IACpD,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACzC,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,GAAG,CAAC,KAAgC,EAAE,OAAe;IACnE,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW;IAC/D,cAAc,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,GAAY;IACpD,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9E,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface SpeedResult {
|
|
2
|
+
mbps: number;
|
|
3
|
+
}
|
|
4
|
+
/** Downloads 10 MB from Cloudflare and returns measured throughput in MB/s. */
|
|
5
|
+
export declare function checkInternetSpeed(): Promise<SpeedResult>;
|
|
6
|
+
export interface DownloadItem {
|
|
7
|
+
name: string;
|
|
8
|
+
source: string;
|
|
9
|
+
sizeMB: number;
|
|
10
|
+
}
|
|
11
|
+
/** Returns the list of things that need to be downloaded. */
|
|
12
|
+
export declare function buildDownloadManifest(dockerInstalled: boolean): DownloadItem[];
|
|
13
|
+
/** Formats a manifest table with per-item and total time estimates. */
|
|
14
|
+
export declare function formatManifestTable(items: DownloadItem[], speedMbps: number): string;
|
|
15
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,CAwC/D;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,OAAO,GAAG,YAAY,EAAE,CAkB9E;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAmCpF"}
|
package/dist/network.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import https from 'node:https';
|
|
2
|
+
const SPEED_TEST_URL = 'https://speed.cloudflare.com/__down?bytes=10000000';
|
|
3
|
+
const SPEED_TEST_SIZE_MB = 10;
|
|
4
|
+
const SPEED_TEST_TIMEOUT_MS = 15_000;
|
|
5
|
+
/** Downloads 10 MB from Cloudflare and returns measured throughput in MB/s. */
|
|
6
|
+
export async function checkInternetSpeed() {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
const timer = setTimeout(() => {
|
|
10
|
+
controller.abort();
|
|
11
|
+
reject(new Error('Internet speed check timed out after 15s'));
|
|
12
|
+
}, SPEED_TEST_TIMEOUT_MS);
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
let received = 0;
|
|
15
|
+
const req = https.get(SPEED_TEST_URL, (res) => {
|
|
16
|
+
res.on('data', (chunk) => {
|
|
17
|
+
received += chunk.length;
|
|
18
|
+
});
|
|
19
|
+
res.on('end', () => {
|
|
20
|
+
clearTimeout(timer);
|
|
21
|
+
const elapsedSec = (Date.now() - start) / 1000;
|
|
22
|
+
const mbps = SPEED_TEST_SIZE_MB / elapsedSec;
|
|
23
|
+
resolve({ mbps });
|
|
24
|
+
});
|
|
25
|
+
res.on('error', (err) => {
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
reject(err);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
req.on('error', (err) => {
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
if (controller.signal.aborted) {
|
|
33
|
+
reject(new Error('Internet speed check timed out after 15s'));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
reject(err);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
controller.signal.addEventListener('abort', () => {
|
|
40
|
+
req.destroy();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Returns the list of things that need to be downloaded. */
|
|
45
|
+
export function buildDownloadManifest(dockerInstalled) {
|
|
46
|
+
const items = [];
|
|
47
|
+
if (!dockerInstalled) {
|
|
48
|
+
items.push({
|
|
49
|
+
name: 'Docker Desktop',
|
|
50
|
+
source: 'brew --cask',
|
|
51
|
+
sizeMB: 1200,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
items.push({
|
|
55
|
+
name: 'OpenClaw image',
|
|
56
|
+
source: 'ghcr.io/openclaw/openclaw:latest',
|
|
57
|
+
sizeMB: 800,
|
|
58
|
+
});
|
|
59
|
+
return items;
|
|
60
|
+
}
|
|
61
|
+
/** Formats a manifest table with per-item and total time estimates. */
|
|
62
|
+
export function formatManifestTable(items, speedMbps) {
|
|
63
|
+
if (items.length === 0)
|
|
64
|
+
return '';
|
|
65
|
+
const COL = { name: 24, source: 42, size: 10, time: 16 };
|
|
66
|
+
const pad = (s, n) => s.slice(0, n).padEnd(n);
|
|
67
|
+
const header = pad('Component', COL.name) +
|
|
68
|
+
pad('Source', COL.source) +
|
|
69
|
+
pad('Size', COL.size) +
|
|
70
|
+
pad('Est. Time', COL.time);
|
|
71
|
+
const divider = '─'.repeat(COL.name + COL.source + COL.size + COL.time);
|
|
72
|
+
const rows = items.map((item) => {
|
|
73
|
+
const estSec = speedMbps > 0 ? item.sizeMB / speedMbps : 0;
|
|
74
|
+
const estTime = estSec < 60 ? `~${Math.ceil(estSec)}s` : `~${Math.ceil(estSec / 60)}m`;
|
|
75
|
+
return (pad(item.name, COL.name) +
|
|
76
|
+
pad(item.source, COL.source) +
|
|
77
|
+
pad(`${item.sizeMB} MB`, COL.size) +
|
|
78
|
+
pad(estTime, COL.time));
|
|
79
|
+
});
|
|
80
|
+
const totalMB = items.reduce((sum, i) => sum + i.sizeMB, 0);
|
|
81
|
+
const totalSec = speedMbps > 0 ? totalMB / speedMbps : 0;
|
|
82
|
+
const totalTime = totalSec < 60 ? `~${Math.ceil(totalSec)}s` : `~${Math.ceil(totalSec / 60)}m`;
|
|
83
|
+
const totalRow = pad('TOTAL', COL.name) +
|
|
84
|
+
pad('', COL.source) +
|
|
85
|
+
pad(`${totalMB} MB`, COL.size) +
|
|
86
|
+
pad(totalTime, COL.time);
|
|
87
|
+
return [header, divider, ...rows, divider, totalRow].join('\n');
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
|