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 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
- /** Generates clawdbot.json and writes it to the workspace directory. */
5
- export declare function generateConfig(profileKey: SecurityProfileKey, apiKey: string): Promise<void>;
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
@@ -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;AAGrD,eAAO,MAAM,cAAc,QAAmD,CAAC;AAC/E,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C,wEAAwE;AACxE,wBAAsB,cAAc,CAClC,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAef"}
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
- /** Generates clawdbot.json and writes it to the workspace directory. */
8
- export async function generateConfig(profileKey, apiKey) {
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 });
@@ -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,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAA8B,EAC9B,MAAc;IAEd,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,OAAO,CAAC,MAAM;QACjB,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"}
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"}
@@ -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
@@ -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;AAMrD,yEAAyE;AACzE,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAepE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB3B"}
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 PORT = 3845;
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
- await execa('docker', ['pull', IMAGE], { stdio: 'inherit' });
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
- await execa('docker', [
30
- 'run',
31
- '--detach',
32
- '--rm',
33
- '--name', 'openclaw_sandbox',
34
- '--publish', `${PORT}:${PORT}`,
35
- '--volume', `${WORKSPACE_PATH}:/workspace`,
36
- '--env', `ANTHROPIC_API_KEY=${apiKey}`,
37
- IMAGE,
38
- ], { stdio: 'ignore' });
39
- return { port: PORT };
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
@@ -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,IAAI,GAAG,IAAI,CAAC;AAElB,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAE7D,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,MAAM,KAAK,CACT,QAAQ,EACR;QACE,KAAK;QACL,UAAU;QACV,MAAM;QACN,QAAQ,EAAE,kBAAkB;QAC5B,WAAW,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE;QAC9B,UAAU,EAAE,GAAG,cAAc,aAAa;QAC1C,OAAO,EAAE,qBAAqB,MAAM,EAAE;QACtC,KAAK;KACN,EACD,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
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
- /** Silent check — returns true if docker CLI is available. */
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
- /** Open Docker.app and poll `docker info` until daemon is ready (max 60s). */
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
@@ -1 +1 @@
1
- {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,gDAAgD;AAChD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED,8EAA8E;AAC9E,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BvD"}
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
- /** Silent check returns true if docker CLI is available. */
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
- await execa('brew', ['install', '--cask', 'docker'], { stdio: 'inherit' });
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
- /** Open Docker.app and poll `docker info` until daemon is ready (max 60s). */
17
- export async function startDockerDaemon() {
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; // Already running
34
+ return true;
22
35
  }
23
36
  catch {
24
- // Not running — launch it
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 < MAX_WAIT_MS) {
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 start within 60 seconds.');
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
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,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,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,kBAAkB;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtC,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAC9B,MAAM,WAAW,GAAG,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,WAAW,EAAE,CAAC;QACxC,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,gDAAgD,CAAC,CAAC;AACpE,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, startDockerDaemon } from './docker.js';
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
- const installed = await checkDocker();
83
- if (!installed) {
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
- p.cancel(`Setup failed: ${err.message}`);
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
- // ── 3.7 Outro ───────────────────────────────────────────────────────────────
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('│')} ☕ Pouring some coffee for your new AI intern...`,
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('│')} Drop files into the workspace folder to begin.`,
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
- p.cancel(`Unexpected error: ${err.message}`);
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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"}
@@ -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"}
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claw-zero",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "One-Click CLI to securely install and sandbox the OpenClaw AI agent",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",