@1claw/cli 0.34.7 → 0.35.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.
Files changed (77) hide show
  1. package/README.md +66 -5
  2. package/dist/bin/1claw.js +0 -0
  3. package/dist/src/commands/containers.d.ts +3 -0
  4. package/dist/src/commands/containers.d.ts.map +1 -0
  5. package/dist/src/commands/containers.js +130 -0
  6. package/dist/src/commands/containers.js.map +1 -0
  7. package/dist/src/commands/daemon.js +18 -9
  8. package/dist/src/commands/daemon.js.map +1 -1
  9. package/dist/src/commands/deploy.d.ts +3 -0
  10. package/dist/src/commands/deploy.d.ts.map +1 -0
  11. package/dist/src/commands/deploy.js +158 -0
  12. package/dist/src/commands/deploy.js.map +1 -0
  13. package/dist/src/commands/eject.d.ts +3 -0
  14. package/dist/src/commands/eject.d.ts.map +1 -0
  15. package/dist/src/commands/eject.js +84 -0
  16. package/dist/src/commands/eject.js.map +1 -0
  17. package/dist/src/commands/init.d.ts +3 -0
  18. package/dist/src/commands/init.d.ts.map +1 -0
  19. package/dist/src/commands/init.js +490 -0
  20. package/dist/src/commands/init.js.map +1 -0
  21. package/dist/src/commands/local.d.ts.map +1 -1
  22. package/dist/src/commands/local.js +61 -14
  23. package/dist/src/commands/local.js.map +1 -1
  24. package/dist/src/commands/publish.d.ts +3 -0
  25. package/dist/src/commands/publish.d.ts.map +1 -0
  26. package/dist/src/commands/publish.js +153 -0
  27. package/dist/src/commands/publish.js.map +1 -0
  28. package/dist/src/deploy/google-cloud/main.tf +74 -0
  29. package/dist/src/deploy/google-cloud/outputs.tf +9 -0
  30. package/dist/src/deploy/google-cloud/variables.tf +44 -0
  31. package/dist/src/docker/base/Dockerfile +34 -0
  32. package/dist/src/docker/base/chat-ui/index.html +110 -0
  33. package/dist/src/docker/base/chat-ui/server.js +233 -0
  34. package/dist/src/docker/base/entrypoint.sh +61 -0
  35. package/dist/src/docker/base/healthcheck.sh +2 -0
  36. package/dist/src/docker/compose.yaml +20 -0
  37. package/dist/src/docker/templates/Dockerfile.tmpl +7 -0
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/dist/src/index.js +11 -0
  40. package/dist/src/index.js.map +1 -1
  41. package/dist/src/lib/container-config.d.ts +43 -0
  42. package/dist/src/lib/container-config.d.ts.map +1 -0
  43. package/dist/src/lib/container-config.js +98 -0
  44. package/dist/src/lib/container-config.js.map +1 -0
  45. package/dist/src/lib/daemon-control.d.ts +10 -0
  46. package/dist/src/lib/daemon-control.d.ts.map +1 -0
  47. package/dist/src/lib/daemon-control.js +58 -0
  48. package/dist/src/lib/daemon-control.js.map +1 -0
  49. package/dist/src/lib/docker-client.d.ts +58 -0
  50. package/dist/src/lib/docker-client.d.ts.map +1 -0
  51. package/dist/src/lib/docker-client.js +193 -0
  52. package/dist/src/lib/docker-client.js.map +1 -0
  53. package/dist/src/lib/image-build.d.ts +30 -0
  54. package/dist/src/lib/image-build.d.ts.map +1 -0
  55. package/dist/src/lib/image-build.js +74 -0
  56. package/dist/src/lib/image-build.js.map +1 -0
  57. package/dist/src/lib/paths.d.ts +14 -0
  58. package/dist/src/lib/paths.d.ts.map +1 -0
  59. package/dist/src/lib/paths.js +38 -0
  60. package/dist/src/lib/paths.js.map +1 -0
  61. package/dist/src/modules/ampersend/config.json +8 -0
  62. package/dist/src/modules/ampersend/module.yaml +32 -0
  63. package/dist/src/modules/ampersend/startup.sh +4 -0
  64. package/dist/src/modules/elizaos/config.json +7 -0
  65. package/dist/src/modules/elizaos/module.yaml +30 -0
  66. package/dist/src/modules/elizaos/startup.sh +3 -0
  67. package/dist/src/modules/langchain/module.yaml +30 -0
  68. package/dist/src/modules/langchain/startup.sh +3 -0
  69. package/dist/src/modules/onchain/module.yaml +28 -0
  70. package/dist/src/modules/onchain/startup.sh +3 -0
  71. package/dist/src/modules/registry.d.ts +48 -0
  72. package/dist/src/modules/registry.d.ts.map +1 -0
  73. package/dist/src/modules/registry.js +201 -0
  74. package/dist/src/modules/registry.js.map +1 -0
  75. package/dist/src/modules/scaffold-agent/module.yaml +30 -0
  76. package/dist/src/modules/scaffold-agent/startup.sh +3 -0
  77. package/package.json +4 -3
@@ -0,0 +1,58 @@
1
+ import { type ChildProcess } from "node:child_process";
2
+ /**
3
+ * Thin wrapper around the Docker CLI via `child_process.execFile`.
4
+ *
5
+ * We deliberately avoid `dockerode` / any Docker SDK to keep the CLI's
6
+ * dependency surface minimal. Every call shells out to the local `docker`
7
+ * binary with an argv array (never a `/bin/sh -c` string), so user-supplied
8
+ * values (image names, env values, tags) cannot inject shell metacharacters.
9
+ */
10
+ export interface DockerRunOptions {
11
+ image: string;
12
+ name: string;
13
+ /** Host port → container port, e.g. { "3000": "3000" } */
14
+ ports: Record<string, string>;
15
+ /** Host path → container mount spec, e.g. { "/host/x.sock": "/run/x.sock:ro" } */
16
+ volumes: Record<string, string>;
17
+ env: Record<string, string>;
18
+ detach: boolean;
19
+ restart?: string;
20
+ labels?: Record<string, string>;
21
+ }
22
+ export interface DockerBuildOptions {
23
+ context: string;
24
+ dockerfile: string;
25
+ tag: string;
26
+ buildArgs?: Record<string, string>;
27
+ onProgress?: (line: string) => void;
28
+ }
29
+ declare class DockerError extends Error {
30
+ stderr?: string | undefined;
31
+ constructor(message: string, stderr?: string | undefined);
32
+ }
33
+ export declare function dockerAvailable(): Promise<boolean>;
34
+ /** True if Docker is installed but the daemon is unreachable. */
35
+ export declare function dockerDaemonError(): Promise<string | null>;
36
+ export declare function dockerImageExists(image: string): Promise<boolean>;
37
+ export declare function dockerPull(image: string, onProgress?: (line: string) => void): Promise<void>;
38
+ export declare function dockerBuild(opts: DockerBuildOptions): Promise<string>;
39
+ export declare function dockerRun(opts: DockerRunOptions): Promise<string>;
40
+ export declare function dockerStop(nameOrId: string): Promise<void>;
41
+ export declare function dockerRm(nameOrId: string, force?: boolean): Promise<void>;
42
+ export declare function dockerInspect(nameOrId: string): Promise<unknown>;
43
+ export interface ContainerStatus {
44
+ exists: boolean;
45
+ running: boolean;
46
+ status?: string;
47
+ health?: string;
48
+ }
49
+ export declare function dockerContainerStatus(nameOrId: string): Promise<ContainerStatus>;
50
+ export declare function dockerPush(tag: string, onProgress?: (line: string) => void): Promise<void>;
51
+ export declare function dockerTag(source: string, target: string): Promise<void>;
52
+ export declare function dockerCommit(container: string, tag: string): Promise<string>;
53
+ /** Spawn `docker logs -f` and return the child process so the caller streams it. */
54
+ export declare function dockerLogs(nameOrId: string, follow: boolean): ChildProcess;
55
+ /** True if the local docker client is authenticated to the given registry. */
56
+ export declare function dockerLoggedIn(registry?: string): Promise<boolean>;
57
+ export { DockerError };
58
+ //# sourceMappingURL=docker-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-client.d.ts","sourceRoot":"","sources":["../../../src/lib/docker-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ class DockerError extends Error {
3
+ stderr;
4
+ constructor(message, stderr) {
5
+ super(message);
6
+ this.stderr = stderr;
7
+ this.name = "DockerError";
8
+ }
9
+ }
10
+ function run(args, opts = {}) {
11
+ return new Promise((resolve, reject) => {
12
+ execFile("docker", args, { cwd: opts.cwd, maxBuffer: 64 * 1024 * 1024 }, (err, stdout, stderr) => {
13
+ if (err) {
14
+ reject(translateError(err, stderr));
15
+ return;
16
+ }
17
+ resolve({ stdout: stdout.toString(), stderr: stderr.toString() });
18
+ });
19
+ });
20
+ }
21
+ function translateError(err, stderr) {
22
+ if (err.code === "ENOENT") {
23
+ return new DockerError("Docker is not installed or not on your PATH. Install Docker Desktop (https://docs.docker.com/get-docker/) and try again.");
24
+ }
25
+ const s = (stderr || "").trim();
26
+ if (s.includes("Cannot connect to the Docker daemon") ||
27
+ s.includes("Is the docker daemon running")) {
28
+ return new DockerError("Docker is not running. Start Docker Desktop, or run `sudo systemctl start docker` on Linux.", s);
29
+ }
30
+ return new DockerError(s || err.message || "docker command failed", s);
31
+ }
32
+ /** Stream a long-running docker command, forwarding output line-by-line. */
33
+ function runStreaming(args, onProgress, cwd) {
34
+ return new Promise((resolve, reject) => {
35
+ const child = spawn("docker", args, { cwd });
36
+ let stderrTail = "";
37
+ const onData = (buf) => {
38
+ const text = buf.toString();
39
+ stderrTail = (stderrTail + text).slice(-4096);
40
+ if (onProgress) {
41
+ for (const line of text.split("\n")) {
42
+ if (line.trim())
43
+ onProgress(line.trimEnd());
44
+ }
45
+ }
46
+ };
47
+ child.stdout?.on("data", onData);
48
+ child.stderr?.on("data", onData);
49
+ child.on("error", (err) => reject(translateError(err, stderrTail)));
50
+ child.on("close", (code) => {
51
+ if (code === 0)
52
+ resolve();
53
+ else
54
+ reject(new DockerError(`docker ${args[0]} exited with code ${code}`, stderrTail));
55
+ });
56
+ });
57
+ }
58
+ export async function dockerAvailable() {
59
+ try {
60
+ await run(["info", "--format", "{{.ServerVersion}}"]);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ /** True if Docker is installed but the daemon is unreachable. */
68
+ export async function dockerDaemonError() {
69
+ try {
70
+ await run(["info", "--format", "{{.ServerVersion}}"]);
71
+ return null;
72
+ }
73
+ catch (err) {
74
+ return err instanceof Error ? err.message : String(err);
75
+ }
76
+ }
77
+ export async function dockerImageExists(image) {
78
+ try {
79
+ await run(["image", "inspect", image]);
80
+ return true;
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ export async function dockerPull(image, onProgress) {
87
+ await runStreaming(["pull", image], onProgress);
88
+ }
89
+ export async function dockerBuild(opts) {
90
+ const args = ["build", "-t", opts.tag, "-f", opts.dockerfile];
91
+ if (opts.buildArgs) {
92
+ for (const [k, v] of Object.entries(opts.buildArgs)) {
93
+ args.push("--build-arg", `${k}=${v}`);
94
+ }
95
+ }
96
+ args.push(opts.context);
97
+ await runStreaming(args, opts.onProgress);
98
+ // Resolve the built image ID.
99
+ const { stdout } = await run(["image", "inspect", opts.tag, "--format", "{{.Id}}"]);
100
+ return stdout.trim();
101
+ }
102
+ export async function dockerRun(opts) {
103
+ const args = ["run", "--name", opts.name];
104
+ args.push(opts.detach ? "-d" : "-d"); // always detached; logs streamed separately
105
+ if (opts.restart)
106
+ args.push("--restart", opts.restart);
107
+ for (const [host, container] of Object.entries(opts.ports)) {
108
+ args.push("-p", `${host}:${container}`);
109
+ }
110
+ for (const [host, container] of Object.entries(opts.volumes)) {
111
+ args.push("-v", `${host}:${container}`);
112
+ }
113
+ for (const [k, v] of Object.entries(opts.env)) {
114
+ args.push("-e", `${k}=${v}`);
115
+ }
116
+ for (const [k, v] of Object.entries(opts.labels ?? {})) {
117
+ args.push("--label", `${k}=${v}`);
118
+ }
119
+ args.push(opts.image);
120
+ const { stdout } = await run(args);
121
+ return stdout.trim();
122
+ }
123
+ export async function dockerStop(nameOrId) {
124
+ await run(["stop", nameOrId]);
125
+ }
126
+ export async function dockerRm(nameOrId, force = false) {
127
+ const args = ["rm"];
128
+ if (force)
129
+ args.push("-f");
130
+ args.push(nameOrId);
131
+ await run(args);
132
+ }
133
+ export async function dockerInspect(nameOrId) {
134
+ const { stdout } = await run(["inspect", nameOrId]);
135
+ const parsed = JSON.parse(stdout);
136
+ return Array.isArray(parsed) ? parsed[0] : parsed;
137
+ }
138
+ export async function dockerContainerStatus(nameOrId) {
139
+ try {
140
+ const { stdout } = await run([
141
+ "inspect",
142
+ nameOrId,
143
+ "--format",
144
+ "{{.State.Status}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}",
145
+ ]);
146
+ const [status, health] = stdout.trim().split("|");
147
+ return {
148
+ exists: true,
149
+ running: status === "running",
150
+ status,
151
+ health: health === "none" ? undefined : health,
152
+ };
153
+ }
154
+ catch {
155
+ return { exists: false, running: false };
156
+ }
157
+ }
158
+ export async function dockerPush(tag, onProgress) {
159
+ await runStreaming(["push", tag], onProgress);
160
+ }
161
+ export async function dockerTag(source, target) {
162
+ await run(["tag", source, target]);
163
+ }
164
+ export async function dockerCommit(container, tag) {
165
+ const { stdout } = await run(["commit", container, tag]);
166
+ return stdout.trim();
167
+ }
168
+ /** Spawn `docker logs -f` and return the child process so the caller streams it. */
169
+ export function dockerLogs(nameOrId, follow) {
170
+ const args = ["logs"];
171
+ if (follow)
172
+ args.push("-f");
173
+ args.push(nameOrId);
174
+ return spawn("docker", args, { stdio: ["ignore", "inherit", "inherit"] });
175
+ }
176
+ /** True if the local docker client is authenticated to the given registry. */
177
+ export async function dockerLoggedIn(registry = "https://index.docker.io/v1/") {
178
+ try {
179
+ const { stdout } = await run(["system", "info", "--format", "{{json .}}"]);
180
+ const info = JSON.parse(stdout);
181
+ // `docker info` doesn't reliably expose auth; fall back to checking the
182
+ // config file via `docker logout --help`-free heuristic is unreliable,
183
+ // so we simply return true and let `docker push` surface auth errors.
184
+ void info;
185
+ void registry;
186
+ return true;
187
+ }
188
+ catch {
189
+ return true;
190
+ }
191
+ }
192
+ export { DockerError };
193
+ //# sourceMappingURL=docker-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-client.js","sourceRoot":"","sources":["../../../src/lib/docker-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type ModuleManifest } from "../modules/registry.js";
2
+ export declare const DEFAULT_BASE_IMAGE = "1claw/agent:stable";
3
+ /** Build the base image from the bundled Docker context. */
4
+ export declare function buildBaseImage(tag?: string, onProgress?: (line: string) => void): Promise<string>;
5
+ /**
6
+ * Ensure the base image is available locally. If it's the default 1Claw image
7
+ * and missing, build it from bundled assets (works offline). Otherwise pull it.
8
+ */
9
+ export declare function ensureBaseImage(baseImage: string, onProgress?: (line: string) => void): Promise<void>;
10
+ /** Produce the full Dockerfile content for a base image + module layers. */
11
+ export declare function generateDockerfile(baseImage: string, modules: ModuleManifest[]): string;
12
+ /**
13
+ * Stage a build context (Dockerfile + module COPY assets) into `dir`.
14
+ * Module copy sources are placed under `modules/<name>/<src>` to match the
15
+ * paths emitted by `generateDockerLayers`.
16
+ */
17
+ export declare function stageBuildContext(dir: string, baseImage: string, modules: ModuleManifest[]): {
18
+ dockerfile: string;
19
+ };
20
+ /** Custom image tag for a given module set. */
21
+ export declare function customImageTag(modules: ModuleManifest[]): string;
22
+ /**
23
+ * Build a module-customized image (FROM base + module layers). Returns the
24
+ * resulting image tag.
25
+ */
26
+ export declare function buildModuleImage(baseImage: string, modules: ModuleManifest[], onProgress?: (line: string) => void): Promise<{
27
+ tag: string;
28
+ contextDir: string;
29
+ }>;
30
+ //# sourceMappingURL=image-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-build.d.ts","sourceRoot":"","sources":["../../../src/lib/image-build.ts"],"names":[],"mappings":"AAeA,OAAO,EAGH,KAAK,cAAc,EACtB,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,4DAA4D;AAC5D,wBAAsB,cAAc,CAChC,GAAG,SAAqB,EACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACpC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACpC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EAAE,GAC1B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EAAE,GAC1B;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAkBxB;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAEhE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACpC,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAM9C"}
@@ -0,0 +1,74 @@
1
+ import { mkdtempSync, mkdirSync, copyFileSync, writeFileSync, existsSync, } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join, dirname } from "node:path";
4
+ import { dockerImageExists, dockerPull, dockerBuild, } from "./docker-client.js";
5
+ import { dockerBaseContext, moduleDir } from "./paths.js";
6
+ import { generateDockerLayers, moduleSetHash, } from "../modules/registry.js";
7
+ export const DEFAULT_BASE_IMAGE = "1claw/agent:stable";
8
+ /** Build the base image from the bundled Docker context. */
9
+ export async function buildBaseImage(tag = DEFAULT_BASE_IMAGE, onProgress) {
10
+ const context = dockerBaseContext();
11
+ const dockerfile = join(context, "Dockerfile");
12
+ if (!existsSync(dockerfile)) {
13
+ throw new Error(`Base Dockerfile not found at ${dockerfile}`);
14
+ }
15
+ return dockerBuild({ context, dockerfile, tag, onProgress });
16
+ }
17
+ /**
18
+ * Ensure the base image is available locally. If it's the default 1Claw image
19
+ * and missing, build it from bundled assets (works offline). Otherwise pull it.
20
+ */
21
+ export async function ensureBaseImage(baseImage, onProgress) {
22
+ if (await dockerImageExists(baseImage))
23
+ return;
24
+ if (baseImage === DEFAULT_BASE_IMAGE) {
25
+ await buildBaseImage(baseImage, onProgress);
26
+ return;
27
+ }
28
+ await dockerPull(baseImage, onProgress);
29
+ }
30
+ /** Produce the full Dockerfile content for a base image + module layers. */
31
+ export function generateDockerfile(baseImage, modules) {
32
+ const header = "# Generated by 1claw — base image + module layers.\n" +
33
+ `FROM ${baseImage}\n`;
34
+ if (modules.length === 0)
35
+ return header;
36
+ return header + generateDockerLayers(modules);
37
+ }
38
+ /**
39
+ * Stage a build context (Dockerfile + module COPY assets) into `dir`.
40
+ * Module copy sources are placed under `modules/<name>/<src>` to match the
41
+ * paths emitted by `generateDockerLayers`.
42
+ */
43
+ export function stageBuildContext(dir, baseImage, modules) {
44
+ const dockerfilePath = join(dir, "Dockerfile");
45
+ writeFileSync(dockerfilePath, generateDockerfile(baseImage, modules));
46
+ for (const m of modules) {
47
+ for (const c of m.docker.copy) {
48
+ const srcPath = join(moduleDir(m.name), c.src);
49
+ if (!existsSync(srcPath)) {
50
+ throw new Error(`Module "${m.name}" references missing file "${c.src}".`);
51
+ }
52
+ const destPath = join(dir, "modules", m.name, c.src);
53
+ mkdirSync(dirname(destPath), { recursive: true });
54
+ copyFileSync(srcPath, destPath);
55
+ }
56
+ }
57
+ return { dockerfile: dockerfilePath };
58
+ }
59
+ /** Custom image tag for a given module set. */
60
+ export function customImageTag(modules) {
61
+ return `1claw-custom-${moduleSetHash(modules)}:latest`;
62
+ }
63
+ /**
64
+ * Build a module-customized image (FROM base + module layers). Returns the
65
+ * resulting image tag.
66
+ */
67
+ export async function buildModuleImage(baseImage, modules, onProgress) {
68
+ const tag = customImageTag(modules);
69
+ const dir = mkdtempSync(join(tmpdir(), "1claw-build-"));
70
+ const { dockerfile } = stageBuildContext(dir, baseImage, modules);
71
+ await dockerBuild({ context: dir, dockerfile, tag, onProgress });
72
+ return { tag, contextDir: dir };
73
+ }
74
+ //# sourceMappingURL=image-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-build.js","sourceRoot":"","sources":["../../../src/lib/image-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Directory containing the base Docker build context. */
2
+ export declare function dockerBaseContext(): string;
3
+ /** Path to the modules-aware Dockerfile template. */
4
+ export declare function dockerTemplatePath(): string;
5
+ /** docker-compose template path. */
6
+ export declare function composeTemplatePath(): string;
7
+ /** Root directory holding bundled module manifests. */
8
+ export declare function modulesRoot(): string;
9
+ /** Directory for a single module's assets. */
10
+ export declare function moduleDir(name: string): string;
11
+ /** Terraform template directory for a cloud provider. */
12
+ export declare function deployTemplateDir(provider: string): string;
13
+ export declare function assetExists(path: string): boolean;
14
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/lib/paths.ts"],"names":[],"mappings":"AAYA,0DAA0D;AAC1D,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,oCAAoC;AACpC,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,uDAAuD;AACvD,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD"}
@@ -0,0 +1,38 @@
1
+ import { dirname, join } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { existsSync } from "node:fs";
4
+ // Resolves bundled, non-TypeScript assets (Docker base context + module
5
+ // manifests) both when running from compiled `dist/` and from `src/` in dev.
6
+ //
7
+ // This file compiles to `dist/src/lib/paths.js`, so `../` lands at
8
+ // `dist/src/`, alongside the copied `docker/` and `modules/` asset trees.
9
+ const here = dirname(fileURLToPath(import.meta.url));
10
+ const srcRoot = join(here, "..");
11
+ /** Directory containing the base Docker build context. */
12
+ export function dockerBaseContext() {
13
+ return join(srcRoot, "docker", "base");
14
+ }
15
+ /** Path to the modules-aware Dockerfile template. */
16
+ export function dockerTemplatePath() {
17
+ return join(srcRoot, "docker", "templates", "Dockerfile.tmpl");
18
+ }
19
+ /** docker-compose template path. */
20
+ export function composeTemplatePath() {
21
+ return join(srcRoot, "docker", "compose.yaml");
22
+ }
23
+ /** Root directory holding bundled module manifests. */
24
+ export function modulesRoot() {
25
+ return join(srcRoot, "modules");
26
+ }
27
+ /** Directory for a single module's assets. */
28
+ export function moduleDir(name) {
29
+ return join(modulesRoot(), name);
30
+ }
31
+ /** Terraform template directory for a cloud provider. */
32
+ export function deployTemplateDir(provider) {
33
+ return join(srcRoot, "deploy", provider);
34
+ }
35
+ export function assetExists(path) {
36
+ return existsSync(path);
37
+ }
38
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,wEAAwE;AACxE,6EAA6E;AAC7E,EAAE;AACF,mEAAmE;AACnE,0EAA0E;AAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAEjC,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACnE,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,mBAAmB;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AACnD,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,WAAW;IACvB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,8 @@
1
+ {
2
+ "module": "ampersend",
3
+ "x402": {
4
+ "chain": "base",
5
+ "asset": "USDC",
6
+ "session_key_ttl_seconds": 900
7
+ }
8
+ }
@@ -0,0 +1,32 @@
1
+ name: ampersend
2
+ version: 1.0.0
3
+ description: >
4
+ x402 payment control layer via Ampersend. Adds session-key management and
5
+ smart-account USDC payments on Base.
6
+ author: Edge & Node
7
+ homepage: https://ampersend.ai
8
+
9
+ docker:
10
+ packages:
11
+ - "@ampersend/sdk@latest"
12
+ apk: []
13
+ copy:
14
+ - src: config.json
15
+ dest: /app/modules/ampersend/config.json
16
+ - src: startup.sh
17
+ dest: /app/modules/ampersend/startup.sh
18
+ env:
19
+ AMPERSEND_ENABLED: "true"
20
+ ports: []
21
+
22
+ required_secrets:
23
+ - path: integrations/ampersend/api-key
24
+ description: "Ampersend API key for x402 payments"
25
+ optional: true
26
+
27
+ tools:
28
+ - create_x402_payment
29
+ - get_session_key
30
+
31
+ conflicts: []
32
+ depends: []
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ # Ampersend module startup hook. Runs inside the container before the chat UI.
3
+ echo "[ampersend] x402 payment layer enabled (chain=base, asset=USDC)."
4
+ echo "[ampersend] Ensure 'integrations/ampersend/api-key' is available via your daemon policy."
@@ -0,0 +1,7 @@
1
+ {
2
+ "module": "elizaos",
3
+ "character": {
4
+ "name": "1Claw Agent",
5
+ "secrets_source": "1claw-daemon"
6
+ }
7
+ }
@@ -0,0 +1,30 @@
1
+ name: elizaos
2
+ version: 1.0.0
3
+ description: >
4
+ ElizaOS character runtime with vault-backed secrets. Adds the ElizaOS core
5
+ so character agents can run with 1Claw-managed credentials.
6
+ author: 1Claw
7
+ homepage: https://1claw.xyz
8
+
9
+ docker:
10
+ packages:
11
+ - "@elizaos/core@latest"
12
+ apk: []
13
+ copy:
14
+ - src: config.json
15
+ dest: /app/modules/elizaos/config.json
16
+ - src: startup.sh
17
+ dest: /app/modules/elizaos/startup.sh
18
+ env:
19
+ ELIZAOS_ENABLED: "true"
20
+ ports: []
21
+
22
+ required_secrets:
23
+ - path: integrations/llm/api-key
24
+ description: "Model provider API key for the character runtime"
25
+ optional: true
26
+
27
+ tools: []
28
+
29
+ conflicts: []
30
+ depends: []
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ echo "[elizaos] ElizaOS character runtime enabled."
3
+ echo "[elizaos] Character secrets are resolved through the 1Claw daemon."
@@ -0,0 +1,30 @@
1
+ name: langchain
2
+ version: 1.0.0
3
+ description: >
4
+ LangChain / LangGraph agent runtime with Shroud-routed LLM calls. Adds the
5
+ core LangChain packages for building tool-using agents.
6
+ author: 1Claw
7
+ homepage: https://1claw.xyz
8
+
9
+ docker:
10
+ packages:
11
+ - "langchain@latest"
12
+ - "@langchain/core@latest"
13
+ - "@langchain/langgraph@latest"
14
+ apk: []
15
+ copy:
16
+ - src: startup.sh
17
+ dest: /app/modules/langchain/startup.sh
18
+ env:
19
+ LANGCHAIN_ENABLED: "true"
20
+ ports: []
21
+
22
+ required_secrets:
23
+ - path: integrations/llm/api-key
24
+ description: "LLM provider API key (routed through Shroud)"
25
+ optional: true
26
+
27
+ tools: []
28
+
29
+ conflicts: []
30
+ depends: []
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ echo "[langchain] LangChain/LangGraph runtime enabled."
3
+ echo "[langchain] Route LLM calls through Shroud; provide 'integrations/llm/api-key' via your daemon policy."
@@ -0,0 +1,28 @@
1
+ name: onchain
2
+ version: 1.0.0
3
+ description: >
4
+ Multi-chain signing and Intents API tooling. Adds transaction submission,
5
+ signing-key management, and on-chain intent helpers.
6
+ author: 1Claw
7
+ homepage: https://1claw.xyz
8
+
9
+ docker:
10
+ packages:
11
+ - "@1claw/sdk@latest"
12
+ apk: []
13
+ copy:
14
+ - src: startup.sh
15
+ dest: /app/modules/onchain/startup.sh
16
+ env:
17
+ ONCHAIN_SIGNING_ENABLED: "true"
18
+ ports: []
19
+
20
+ required_secrets: []
21
+
22
+ tools:
23
+ - submit_transaction
24
+ - sign_transaction
25
+ - list_signing_keys
26
+
27
+ conflicts: []
28
+ depends: []
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ echo "[onchain] Multi-chain signing + Intents API tools enabled."
3
+ echo "[onchain] Transactions are signed through the daemon/Vault — keys never enter this container."