@crewhaus/docker-images 0.5.0 → 0.5.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/embedded.d.ts +19 -0
- package/dist/embedded.js +35 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +47 -10
- package/docker/batch/Dockerfile +29 -0
- package/docker/browser/Dockerfile +41 -0
- package/docker/channel/Dockerfile +29 -0
- package/docker/cli/Dockerfile +37 -0
- package/docker/crew/Dockerfile +28 -0
- package/docker/digests.json +652 -0
- package/docker/eval/Dockerfile +27 -0
- package/docker/graph/Dockerfile +27 -0
- package/docker/managed/Dockerfile +29 -0
- package/docker/pipeline/Dockerfile +27 -0
- package/docker/research/Dockerfile +27 -0
- package/docker/voice/Dockerfile +29 -0
- package/docker/workflow/Dockerfile +26 -0
- package/package.json +3 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-time-baked bodies of the per-shape `docker/<target>/Dockerfile`
|
|
3
|
+
* files.
|
|
4
|
+
*
|
|
5
|
+
* Reading them package-relative broke `crewhaus build-image` on every
|
|
6
|
+
* PUBLISHED channel — `dockerfile missing for target cli (expected at
|
|
7
|
+
* /$bunfs/docker/cli/Dockerfile)` from the compiled binary, and the same miss
|
|
8
|
+
* against an npm tarball whose `files` array omitted `docker/`. Both are now
|
|
9
|
+
* fixed: the bodies live here, and `docker/` ships in `files` so the real
|
|
10
|
+
* files are still present for a build context.
|
|
11
|
+
*
|
|
12
|
+
* These are literals rather than `with { type: "text" }` imports because Bun's
|
|
13
|
+
* `--compile` does not embed EXTENSIONLESS files: a bare `Dockerfile` inlines
|
|
14
|
+
* fine under the interpreter and resolves to `undefined` in the standalone
|
|
15
|
+
* binary. `digests.json` is deliberately absent — `loadDigests` already
|
|
16
|
+
* returns an empty file when it is missing, and it is only read or written
|
|
17
|
+
* from a source checkout during the release workflow.
|
|
18
|
+
*/
|
|
19
|
+
export declare const DOCKERFILE_BODIES: Readonly<Record<string, string>>;
|
package/dist/embedded.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-dockerfile-bodies.ts — do not edit by hand.
|
|
2
|
+
// Re-run that script after changing any docker/<target>/Dockerfile;
|
|
3
|
+
// docker-images' tests assert these bodies match the files byte-for-byte.
|
|
4
|
+
/**
|
|
5
|
+
* Build-time-baked bodies of the per-shape `docker/<target>/Dockerfile`
|
|
6
|
+
* files.
|
|
7
|
+
*
|
|
8
|
+
* Reading them package-relative broke `crewhaus build-image` on every
|
|
9
|
+
* PUBLISHED channel — `dockerfile missing for target cli (expected at
|
|
10
|
+
* /$bunfs/docker/cli/Dockerfile)` from the compiled binary, and the same miss
|
|
11
|
+
* against an npm tarball whose `files` array omitted `docker/`. Both are now
|
|
12
|
+
* fixed: the bodies live here, and `docker/` ships in `files` so the real
|
|
13
|
+
* files are still present for a build context.
|
|
14
|
+
*
|
|
15
|
+
* These are literals rather than `with { type: "text" }` imports because Bun's
|
|
16
|
+
* `--compile` does not embed EXTENSIONLESS files: a bare `Dockerfile` inlines
|
|
17
|
+
* fine under the interpreter and resolves to `undefined` in the standalone
|
|
18
|
+
* binary. `digests.json` is deliberately absent — `loadDigests` already
|
|
19
|
+
* returns an empty file when it is missing, and it is only read or written
|
|
20
|
+
* from a source checkout during the release workflow.
|
|
21
|
+
*/
|
|
22
|
+
export const DOCKERFILE_BODIES = {
|
|
23
|
+
batch: '# Section 32 — docker-images: batch target shape (queue worker daemon).\n# Section 23 BATCH worker pulls from queue-protocol, runs one runChatLoop per job.\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=batch\nEXPOSE 0\n# Batch worker is a long-running consumer; healthcheck just verifies the process is alive.\nHEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \\\n CMD pgrep -f crewhaus.js > /dev/null || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
24
|
+
browser: '# Section 32 — docker-images: browser target shape (computer-use agent).\n# Adds chromium + Playwright runtime so the BROW driver can spawn real browsers.\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\n# chromium + the libs Playwright\'s bundled chromium needs at runtime\nRUN apk add --no-cache \\\n chromium \\\n nss \\\n freetype \\\n harfbuzz \\\n ca-certificates \\\n ttf-freefont \\\n dbus \\\n curl && \\\n addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=browser \\\n PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 \\\n PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium-browser \\\n PORT=8080\nEXPOSE 8080\nHEALTHCHECK --interval=20s --timeout=10s --start-period=10s --retries=3 \\\n CMD curl -fsS http://localhost:${PORT:-8080}/healthz || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
25
|
+
channel: '# Section 32 — docker-images: channel target shape (long-running daemon).\n# Section 12 daemon listens on $PORT (default 3000) for inbound webhooks.\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN apk add --no-cache curl ca-certificates && \\\n addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=channel PORT=3000\nEXPOSE 3000\nHEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \\\n CMD curl -fsS http://localhost:${PORT:-3000}/healthz || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
26
|
+
cli: '# Section 32 — docker-images: CLI target shape (interactive REPL).\n# Multi-stage: deps → build → runtime. Non-root user, read-only root, HEALTHCHECK.\n\n# ──────────────────────────────────────────────────────────────────────────────\n# Stage 1: deps (cached layer for node_modules)\n# ──────────────────────────────────────────────────────────────────────────────\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\n# ──────────────────────────────────────────────────────────────────────────────\n# Stage 2: build (typecheck + bundle the CLI entrypoint)\n# ──────────────────────────────────────────────────────────────────────────────\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\n# ──────────────────────────────────────────────────────────────────────────────\n# Stage 3: runtime (minimal — only what the CLI needs at boot)\n# ──────────────────────────────────────────────────────────────────────────────\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=cli\nEXPOSE 0\nHEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \\\n CMD bun /app/crewhaus.js doctor --liveness || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["--help"]\n',
|
|
27
|
+
crew: '# Section 32 — docker-images: crew target shape (multi-agent A2A daemon).\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN apk add --no-cache curl ca-certificates && \\\n addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=crew PORT=3000\nEXPOSE 3000\nHEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \\\n CMD curl -fsS http://localhost:${PORT:-3000}/healthz || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
28
|
+
eval: '# Section 32 — docker-images: eval target shape (deployable eval bundle).\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus/evals && chown -R crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=eval\nEXPOSE 0\nHEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \\\n CMD bun /app/crewhaus.js doctor --liveness || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["eval", "/spec/crewhaus.yaml"]\n',
|
|
29
|
+
graph: '# Section 32 — docker-images: graph target shape (durable graph runtime).\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus/graphs && chown -R crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=graph\nEXPOSE 0\nHEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \\\n CMD bun /app/crewhaus.js doctor --liveness || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
30
|
+
managed: '# Section 32 — docker-images: managed target shape (multi-tenant gateway daemon).\n# Section 20 daemon listens on $PORT (default 8080) for tenant API traffic.\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN apk add --no-cache curl ca-certificates && \\\n addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus/audit && chown -R crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=managed PORT=8080\nEXPOSE 8080\nHEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \\\n CMD curl -fsS http://localhost:${PORT:-8080}/healthz || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
31
|
+
pipeline: '# Section 32 — docker-images: pipeline target shape (RAG ingest pipeline).\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus/vector && chown -R crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=pipeline\nEXPOSE 0\nHEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \\\n CMD bun /app/crewhaus.js doctor --liveness || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
32
|
+
research: '# Section 32 — docker-images: research target shape (autonomous research agent).\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus/research && chown -R crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=research\nEXPOSE 0\nHEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \\\n CMD bun /app/crewhaus.js doctor --liveness || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
33
|
+
voice: '# Section 32 — docker-images: voice target shape (realtime telephony agent).\n# Adds opus (PCM ↔ Opus codec for telephony codecs) on top of the base.\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN apk add --no-cache curl ca-certificates opus opus-tools && \\\n addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \\\n mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=voice PORT=8080\nEXPOSE 8080\nHEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \\\n CMD curl -fsS http://localhost:${PORT:-8080}/healthz || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
34
|
+
workflow: '# Section 32 — docker-images: workflow target shape (sequential multi-step agent).\nFROM oven/bun:1.2-alpine AS deps\nWORKDIR /app\nCOPY bun.lock package.json ./\nCOPY packages packages\nCOPY apps apps\nRUN bun install --frozen-lockfile\n\nFROM deps AS build\nWORKDIR /app\nCOPY tsconfig.base.json tsconfig.json ./\nRUN bun run typecheck\nRUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js\n\nFROM oven/bun:1.2-alpine AS runtime\nRUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001\nWORKDIR /app\nCOPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js\nCOPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules\nUSER crewhaus\nENV NODE_ENV=production CREWHAUS_TARGET=workflow\nEXPOSE 0\nHEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \\\n CMD bun /app/crewhaus.js doctor --liveness || exit 1\nENTRYPOINT ["bun", "/app/crewhaus.js"]\nCMD ["run", "/spec/crewhaus.yaml"]\n',
|
|
35
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -40,6 +40,15 @@ export declare function isTargetShape(value: unknown): value is TargetShape;
|
|
|
40
40
|
export declare function dockerRoot(): string;
|
|
41
41
|
export declare function digestsPath(): string;
|
|
42
42
|
export declare function dockerfilePath(target: TargetShape): string;
|
|
43
|
+
/**
|
|
44
|
+
* The Dockerfile body for a shape, served from {@link DOCKERFILE_BODIES}.
|
|
45
|
+
*
|
|
46
|
+
* Reading it from disk broke `build-image` on both published channels — under
|
|
47
|
+
* `/$bunfs` in the compiled binary and against an npm tarball that omitted
|
|
48
|
+
* `docker/`. See `embedded.ts`. {@link dockerfilePath} still returns a real
|
|
49
|
+
* path for the build CONTEXT and for humans; only the body comes from the
|
|
50
|
+
* embedded map.
|
|
51
|
+
*/
|
|
43
52
|
export declare function readDockerfile(target: TargetShape): string;
|
|
44
53
|
export declare function dockerfileSize(target: TargetShape): number;
|
|
45
54
|
export declare function listAvailableTargets(): readonly TargetShape[];
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
2
4
|
import { dirname, join, resolve } from "node:path";
|
|
3
5
|
import { fileURLToPath } from "node:url";
|
|
4
6
|
/**
|
|
@@ -27,6 +29,7 @@ import { fileURLToPath } from "node:url";
|
|
|
27
29
|
* the lockfile would hand users an unpullable pin.
|
|
28
30
|
*/
|
|
29
31
|
import { CrewhausError } from "@crewhaus/errors";
|
|
32
|
+
import { DOCKERFILE_BODIES } from "./embedded";
|
|
30
33
|
export class DockerImagesError extends CrewhausError {
|
|
31
34
|
name = "DockerImagesError";
|
|
32
35
|
constructor(message, cause) {
|
|
@@ -68,18 +71,29 @@ export function digestsPath() {
|
|
|
68
71
|
export function dockerfilePath(target) {
|
|
69
72
|
return join(DOCKER_ROOT, target, "Dockerfile");
|
|
70
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* The Dockerfile body for a shape, served from {@link DOCKERFILE_BODIES}.
|
|
76
|
+
*
|
|
77
|
+
* Reading it from disk broke `build-image` on both published channels — under
|
|
78
|
+
* `/$bunfs` in the compiled binary and against an npm tarball that omitted
|
|
79
|
+
* `docker/`. See `embedded.ts`. {@link dockerfilePath} still returns a real
|
|
80
|
+
* path for the build CONTEXT and for humans; only the body comes from the
|
|
81
|
+
* embedded map.
|
|
82
|
+
*/
|
|
71
83
|
export function readDockerfile(target) {
|
|
72
|
-
const
|
|
73
|
-
if (
|
|
74
|
-
throw new DockerImagesError(`dockerfile missing for target ${target} (expected at ${
|
|
84
|
+
const body = DOCKERFILE_BODIES[target];
|
|
85
|
+
if (body === undefined) {
|
|
86
|
+
throw new DockerImagesError(`dockerfile missing for target ${target} (expected at ${dockerfilePath(target)})`);
|
|
75
87
|
}
|
|
76
|
-
return
|
|
88
|
+
return body;
|
|
77
89
|
}
|
|
78
90
|
export function dockerfileSize(target) {
|
|
79
|
-
|
|
91
|
+
// Byte length of the embedded body — `statSync` would fail wherever the file
|
|
92
|
+
// is not on disk, which is every shipped artifact.
|
|
93
|
+
return Buffer.byteLength(readDockerfile(target), "utf8");
|
|
80
94
|
}
|
|
81
95
|
export function listAvailableTargets() {
|
|
82
|
-
return TARGET_SHAPES.filter((t) =>
|
|
96
|
+
return TARGET_SHAPES.filter((t) => DOCKERFILE_BODIES[t] !== undefined);
|
|
83
97
|
}
|
|
84
98
|
export async function buildImage(opts) {
|
|
85
99
|
if (!isTargetShape(opts.target)) {
|
|
@@ -88,10 +102,14 @@ export async function buildImage(opts) {
|
|
|
88
102
|
if (!opts.tag || /[\s\n\r]/.test(opts.tag)) {
|
|
89
103
|
throw new DockerImagesError(`invalid tag: ${JSON.stringify(opts.tag)} — must be non-empty and contain no whitespace`);
|
|
90
104
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
105
|
+
// `docker build --file` needs a REAL path, and the checked-in Dockerfile is
|
|
106
|
+
// absent from every shipped artifact — `/$bunfs` in the compiled binary, and
|
|
107
|
+
// (before this release) an npm tarball without `docker/`. The body is
|
|
108
|
+
// embedded, so materialize it when the file is not on disk and hand docker
|
|
109
|
+
// the temp copy. Prefer the real file when present: a source checkout then
|
|
110
|
+
// builds from exactly what the developer is editing.
|
|
111
|
+
const onDisk = dockerfilePath(opts.target);
|
|
112
|
+
const dockerfile = existsSync(onDisk) ? onDisk : materializeDockerfile(opts.target);
|
|
95
113
|
const contextPath = opts.contextPath ?? resolve(PACKAGE_ROOT, "..", "..");
|
|
96
114
|
const argv = [
|
|
97
115
|
"docker",
|
|
@@ -114,6 +132,25 @@ export async function buildImage(opts) {
|
|
|
114
132
|
}
|
|
115
133
|
return { tag: opts.tag, target: opts.target, buildArgv: argv };
|
|
116
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Write the embedded Dockerfile for a shape to a temp file and return its
|
|
137
|
+
* path, for the one caller that needs a real one: `docker build --file`.
|
|
138
|
+
*
|
|
139
|
+
* Only reached where the checked-in file is absent — i.e. every shipped
|
|
140
|
+
* artifact. Deterministic per (target, body) so repeat builds reuse one file
|
|
141
|
+
* instead of littering tmp, and content-addressed so a changed body never
|
|
142
|
+
* reuses a stale copy.
|
|
143
|
+
*/
|
|
144
|
+
function materializeDockerfile(target) {
|
|
145
|
+
const body = readDockerfile(target);
|
|
146
|
+
const stamp = createHash("sha256").update(body).digest("hex").slice(0, 16);
|
|
147
|
+
const dir = join(tmpdir(), `crewhaus-dockerfiles-${stamp}`);
|
|
148
|
+
mkdirSync(dir, { recursive: true });
|
|
149
|
+
const path = join(dir, `${target}.Dockerfile`);
|
|
150
|
+
if (!existsSync(path))
|
|
151
|
+
writeFileSync(path, body, { mode: 0o644 });
|
|
152
|
+
return path;
|
|
153
|
+
}
|
|
117
154
|
export const defaultRunner = async (argv, cwd) => {
|
|
118
155
|
const { spawn } = await import("node:child_process");
|
|
119
156
|
return new Promise((resolve_) => {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Section 32 — docker-images: batch target shape (queue worker daemon).
|
|
2
|
+
# Section 23 BATCH worker pulls from queue-protocol, runs one runChatLoop per job.
|
|
3
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
COPY bun.lock package.json ./
|
|
6
|
+
COPY packages packages
|
|
7
|
+
COPY apps apps
|
|
8
|
+
RUN bun install --frozen-lockfile
|
|
9
|
+
|
|
10
|
+
FROM deps AS build
|
|
11
|
+
WORKDIR /app
|
|
12
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
13
|
+
RUN bun run typecheck
|
|
14
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
15
|
+
|
|
16
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
17
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
18
|
+
mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
21
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
22
|
+
USER crewhaus
|
|
23
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=batch
|
|
24
|
+
EXPOSE 0
|
|
25
|
+
# Batch worker is a long-running consumer; healthcheck just verifies the process is alive.
|
|
26
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
|
|
27
|
+
CMD pgrep -f crewhaus.js > /dev/null || exit 1
|
|
28
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
29
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Section 32 — docker-images: browser target shape (computer-use agent).
|
|
2
|
+
# Adds chromium + Playwright runtime so the BROW driver can spawn real browsers.
|
|
3
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
COPY bun.lock package.json ./
|
|
6
|
+
COPY packages packages
|
|
7
|
+
COPY apps apps
|
|
8
|
+
RUN bun install --frozen-lockfile
|
|
9
|
+
|
|
10
|
+
FROM deps AS build
|
|
11
|
+
WORKDIR /app
|
|
12
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
13
|
+
RUN bun run typecheck
|
|
14
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
15
|
+
|
|
16
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
17
|
+
# chromium + the libs Playwright's bundled chromium needs at runtime
|
|
18
|
+
RUN apk add --no-cache \
|
|
19
|
+
chromium \
|
|
20
|
+
nss \
|
|
21
|
+
freetype \
|
|
22
|
+
harfbuzz \
|
|
23
|
+
ca-certificates \
|
|
24
|
+
ttf-freefont \
|
|
25
|
+
dbus \
|
|
26
|
+
curl && \
|
|
27
|
+
addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
28
|
+
mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus
|
|
29
|
+
WORKDIR /app
|
|
30
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
31
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
32
|
+
USER crewhaus
|
|
33
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=browser \
|
|
34
|
+
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 \
|
|
35
|
+
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium-browser \
|
|
36
|
+
PORT=8080
|
|
37
|
+
EXPOSE 8080
|
|
38
|
+
HEALTHCHECK --interval=20s --timeout=10s --start-period=10s --retries=3 \
|
|
39
|
+
CMD curl -fsS http://localhost:${PORT:-8080}/healthz || exit 1
|
|
40
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
41
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Section 32 — docker-images: channel target shape (long-running daemon).
|
|
2
|
+
# Section 12 daemon listens on $PORT (default 3000) for inbound webhooks.
|
|
3
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
COPY bun.lock package.json ./
|
|
6
|
+
COPY packages packages
|
|
7
|
+
COPY apps apps
|
|
8
|
+
RUN bun install --frozen-lockfile
|
|
9
|
+
|
|
10
|
+
FROM deps AS build
|
|
11
|
+
WORKDIR /app
|
|
12
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
13
|
+
RUN bun run typecheck
|
|
14
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
15
|
+
|
|
16
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
17
|
+
RUN apk add --no-cache curl ca-certificates && \
|
|
18
|
+
addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
19
|
+
mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus
|
|
20
|
+
WORKDIR /app
|
|
21
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
22
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
23
|
+
USER crewhaus
|
|
24
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=channel PORT=3000
|
|
25
|
+
EXPOSE 3000
|
|
26
|
+
HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \
|
|
27
|
+
CMD curl -fsS http://localhost:${PORT:-3000}/healthz || exit 1
|
|
28
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
29
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Section 32 — docker-images: CLI target shape (interactive REPL).
|
|
2
|
+
# Multi-stage: deps → build → runtime. Non-root user, read-only root, HEALTHCHECK.
|
|
3
|
+
|
|
4
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
# Stage 1: deps (cached layer for node_modules)
|
|
6
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
8
|
+
WORKDIR /app
|
|
9
|
+
COPY bun.lock package.json ./
|
|
10
|
+
COPY packages packages
|
|
11
|
+
COPY apps apps
|
|
12
|
+
RUN bun install --frozen-lockfile
|
|
13
|
+
|
|
14
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
# Stage 2: build (typecheck + bundle the CLI entrypoint)
|
|
16
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
FROM deps AS build
|
|
18
|
+
WORKDIR /app
|
|
19
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
20
|
+
RUN bun run typecheck
|
|
21
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
22
|
+
|
|
23
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
# Stage 3: runtime (minimal — only what the CLI needs at boot)
|
|
25
|
+
# ──────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
27
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001
|
|
28
|
+
WORKDIR /app
|
|
29
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
30
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
31
|
+
USER crewhaus
|
|
32
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=cli
|
|
33
|
+
EXPOSE 0
|
|
34
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \
|
|
35
|
+
CMD bun /app/crewhaus.js doctor --liveness || exit 1
|
|
36
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
37
|
+
CMD ["--help"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Section 32 — docker-images: crew target shape (multi-agent A2A daemon).
|
|
2
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
COPY bun.lock package.json ./
|
|
5
|
+
COPY packages packages
|
|
6
|
+
COPY apps apps
|
|
7
|
+
RUN bun install --frozen-lockfile
|
|
8
|
+
|
|
9
|
+
FROM deps AS build
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
12
|
+
RUN bun run typecheck
|
|
13
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
14
|
+
|
|
15
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
16
|
+
RUN apk add --no-cache curl ca-certificates && \
|
|
17
|
+
addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
18
|
+
mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
21
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
22
|
+
USER crewhaus
|
|
23
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=crew PORT=3000
|
|
24
|
+
EXPOSE 3000
|
|
25
|
+
HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \
|
|
26
|
+
CMD curl -fsS http://localhost:${PORT:-3000}/healthz || exit 1
|
|
27
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
28
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,652 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Pinned image digests for reproducible builds. Every entry is a REGISTRY MANIFEST digest (the only digest `docker pull repo@sha256:...` accepts), recorded from pushed builds only: `crewhaus build-image --push` records here by default (opt out with --no-record), and the Release workflow's docker-digests job records the pushed ghcr.io/crewhaus/<target> digests for each v* tag. Local --load builds record nothing — a local image ID is a config digest, not a pullable pin. Format: `{ \"<target>\": { \"<tag>\": { \"sha256\": \"<digest>\", \"builtAt\": \"<iso>\" } } }`.",
|
|
3
|
+
"_format_version": 1,
|
|
4
|
+
"batch": {
|
|
5
|
+
"0.2.0": {
|
|
6
|
+
"sha256": "sha256:4eea75fe9147aad30c11339b1291215a6136ceb1e97d59010a91304cf2a6031a",
|
|
7
|
+
"builtAt": "2026-07-03T06:44:26.432Z"
|
|
8
|
+
},
|
|
9
|
+
"0.2.1": {
|
|
10
|
+
"sha256": "sha256:77078a1c2d1e43866d8f54253c81ae569207271413200dae68d66433a96ff7fd",
|
|
11
|
+
"builtAt": "2026-07-05T08:53:49.137Z"
|
|
12
|
+
},
|
|
13
|
+
"0.2.2": {
|
|
14
|
+
"sha256": "sha256:a002490668de740a1b662fc35fd71f492f56c6fb04503857c5c5b84fa16552cc",
|
|
15
|
+
"builtAt": "2026-07-06T01:44:26.315Z"
|
|
16
|
+
},
|
|
17
|
+
"0.2.3": {
|
|
18
|
+
"sha256": "sha256:ee0c2e2cb77e0dc0286e088f500b2cfa2b4e885f6f86b45dc227881da07af256",
|
|
19
|
+
"builtAt": "2026-07-07T20:18:48.437Z"
|
|
20
|
+
},
|
|
21
|
+
"0.2.4": {
|
|
22
|
+
"sha256": "sha256:62f9122abc1efbb3d7ce813cc3b54330803ce59ffdab15b12f723518a8847cb9",
|
|
23
|
+
"builtAt": "2026-07-08T20:06:58.038Z"
|
|
24
|
+
},
|
|
25
|
+
"0.3.0": {
|
|
26
|
+
"sha256": "sha256:8944ed96795b2552141e1499526ce6fedfbe1478cc085f4f4eee090943382db0",
|
|
27
|
+
"builtAt": "2026-07-14T18:22:51.756Z"
|
|
28
|
+
},
|
|
29
|
+
"0.3.1": {
|
|
30
|
+
"sha256": "sha256:5fa99182fa2e018196147669871ae81f6b67f7c4d8a7d80e04ea10e27a16230e",
|
|
31
|
+
"builtAt": "2026-07-16T05:03:06.490Z"
|
|
32
|
+
},
|
|
33
|
+
"0.3.2": {
|
|
34
|
+
"sha256": "sha256:9a3be0cb23cc2b31661edaa998edaf557243357a162fb13785e5ffef76e37cfc",
|
|
35
|
+
"builtAt": "2026-07-17T00:31:58.504Z"
|
|
36
|
+
},
|
|
37
|
+
"0.4.0": {
|
|
38
|
+
"sha256": "sha256:9cf3655cbb174998c6b3ed9c5d40caa1aace5f31e030a5a4ff915d9509b81429",
|
|
39
|
+
"builtAt": "2026-07-18T16:42:04.878Z"
|
|
40
|
+
},
|
|
41
|
+
"0.4.1": {
|
|
42
|
+
"sha256": "sha256:bf7b417c198651537e76b6f56d7135d09f722e001e3bdfaabbd65daa54e853e6",
|
|
43
|
+
"builtAt": "2026-07-27T04:03:47.176Z"
|
|
44
|
+
},
|
|
45
|
+
"0.4.2": {
|
|
46
|
+
"sha256": "sha256:50fbad6647d56da45582873b33ccdfae071550d8b468cf482a0d2c7ee273ab28",
|
|
47
|
+
"builtAt": "2026-07-27T21:28:50.474Z"
|
|
48
|
+
},
|
|
49
|
+
"0.5.0": {
|
|
50
|
+
"sha256": "sha256:6a563a125b589a997f8a5830bf09bbfb0a757b0a35ecf8e914f146c567bbd013",
|
|
51
|
+
"builtAt": "2026-08-05T21:56:10.633Z"
|
|
52
|
+
},
|
|
53
|
+
"0.5.1": {
|
|
54
|
+
"sha256": "sha256:f6f507560dfeb9156fee2c7a7054002e1a6dc97e1f93fa05879e07d468e2ded3",
|
|
55
|
+
"builtAt": "2026-08-06T02:20:15.769Z"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"browser": {
|
|
59
|
+
"0.2.0": {
|
|
60
|
+
"sha256": "sha256:55db38c2e88ac16b95a349fc69172669984a061f2b8af9a95660e15c27663e96",
|
|
61
|
+
"builtAt": "2026-07-03T06:44:27.172Z"
|
|
62
|
+
},
|
|
63
|
+
"0.2.1": {
|
|
64
|
+
"sha256": "sha256:6d19322d045fc9a7344975ec34a14b8d80c2ea14257256c81df3860763e7c6f5",
|
|
65
|
+
"builtAt": "2026-07-05T08:53:49.483Z"
|
|
66
|
+
},
|
|
67
|
+
"0.2.2": {
|
|
68
|
+
"sha256": "sha256:5cee7018195cc239c11db4bb15c6e63af5c7050f85022d5ffa69cc5bd054f643",
|
|
69
|
+
"builtAt": "2026-07-06T01:44:27.048Z"
|
|
70
|
+
},
|
|
71
|
+
"0.2.3": {
|
|
72
|
+
"sha256": "sha256:241cd53ab49dd7a4276a3c4e2cd06c871c8a24e8563c14e75d24b0074be5a1df",
|
|
73
|
+
"builtAt": "2026-07-07T20:18:48.687Z"
|
|
74
|
+
},
|
|
75
|
+
"0.2.4": {
|
|
76
|
+
"sha256": "sha256:3f68dd265233a3dce348e2b0aa471a705664fb3b6a9f5b47a170271763d888c1",
|
|
77
|
+
"builtAt": "2026-07-08T20:06:58.427Z"
|
|
78
|
+
},
|
|
79
|
+
"0.3.0": {
|
|
80
|
+
"sha256": "sha256:c3bf518930a57916e0fed7b2959c56a99c352f3f26ef2128266d272ef2a91410",
|
|
81
|
+
"builtAt": "2026-07-14T18:22:52.283Z"
|
|
82
|
+
},
|
|
83
|
+
"0.3.1": {
|
|
84
|
+
"sha256": "sha256:a6a901d2a264652fe02a30100c0f2eed5a17de99bed48490d58dc7fdc8b8e76e",
|
|
85
|
+
"builtAt": "2026-07-16T05:03:07.190Z"
|
|
86
|
+
},
|
|
87
|
+
"0.3.2": {
|
|
88
|
+
"sha256": "sha256:8f7d3405cf627e6a6b773444e2a5cf45aa2a53a9dc732e9b7e039b84be34b003",
|
|
89
|
+
"builtAt": "2026-07-17T00:31:58.880Z"
|
|
90
|
+
},
|
|
91
|
+
"0.4.0": {
|
|
92
|
+
"sha256": "sha256:399e7a52f9734718641cc6c218aa6fd0275d7f1e4c92f75ed8cc4c4aee2b3f12",
|
|
93
|
+
"builtAt": "2026-07-18T16:42:05.216Z"
|
|
94
|
+
},
|
|
95
|
+
"0.4.1": {
|
|
96
|
+
"sha256": "sha256:b890726bbcdf68ef600129332dcb78a10d89287458ae7f3c8f83c27dfce11807",
|
|
97
|
+
"builtAt": "2026-07-27T04:03:47.867Z"
|
|
98
|
+
},
|
|
99
|
+
"0.4.2": {
|
|
100
|
+
"sha256": "sha256:e886333333da8047babe095b2200b00e920c43d270541162045b7dc14ba26ac1",
|
|
101
|
+
"builtAt": "2026-07-27T21:28:50.721Z"
|
|
102
|
+
},
|
|
103
|
+
"0.5.0": {
|
|
104
|
+
"sha256": "sha256:99cc56dc44cb1283151b46f40e28fcad0966908fcf527070d8169a9c0b201c2d",
|
|
105
|
+
"builtAt": "2026-08-05T21:56:11.339Z"
|
|
106
|
+
},
|
|
107
|
+
"0.5.1": {
|
|
108
|
+
"sha256": "sha256:c67666d971f2b2580325e069d80b2c0f6a0f5c1508cc7664c2a30a76145c8cb0",
|
|
109
|
+
"builtAt": "2026-08-06T02:20:15.989Z"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"channel": {
|
|
113
|
+
"0.2.0": {
|
|
114
|
+
"sha256": "sha256:3917cbdda86a401b72767c57e3307a01bae3a8b5467436be69b1c0d43a00e732",
|
|
115
|
+
"builtAt": "2026-07-03T06:44:27.959Z"
|
|
116
|
+
},
|
|
117
|
+
"0.2.1": {
|
|
118
|
+
"sha256": "sha256:78de16e1d83eb8b0128cd02f079f5649a421249d68f8c8f77e014759cac7b75c",
|
|
119
|
+
"builtAt": "2026-07-05T08:53:49.811Z"
|
|
120
|
+
},
|
|
121
|
+
"0.2.2": {
|
|
122
|
+
"sha256": "sha256:2123ff2ea1e9329ad9121ca8909353dba3b5cfe14ee0830fbf747a9fc6fab500",
|
|
123
|
+
"builtAt": "2026-07-06T01:44:27.705Z"
|
|
124
|
+
},
|
|
125
|
+
"0.2.3": {
|
|
126
|
+
"sha256": "sha256:62bc930603aed1a7ada76757691ae04d3642a433da48325092e49cb76bb4095f",
|
|
127
|
+
"builtAt": "2026-07-07T20:18:48.931Z"
|
|
128
|
+
},
|
|
129
|
+
"0.2.4": {
|
|
130
|
+
"sha256": "sha256:e7bfc3eb7378d39cb5d81e8d9dd6df3143b778076336d497f35413fbdd5cc9ff",
|
|
131
|
+
"builtAt": "2026-07-08T20:06:58.816Z"
|
|
132
|
+
},
|
|
133
|
+
"0.3.0": {
|
|
134
|
+
"sha256": "sha256:fc5b00a5621b3db2dfbc38bf4c51b19d1673492ceebc7a9c52781230070ce75b",
|
|
135
|
+
"builtAt": "2026-07-14T18:22:52.792Z"
|
|
136
|
+
},
|
|
137
|
+
"0.3.1": {
|
|
138
|
+
"sha256": "sha256:4da0a91d7361dbb5cac452f34510ee7ddfe1341bc0439e4f3d871cdae949ff17",
|
|
139
|
+
"builtAt": "2026-07-16T05:03:07.880Z"
|
|
140
|
+
},
|
|
141
|
+
"0.3.2": {
|
|
142
|
+
"sha256": "sha256:856f66aa6f2cda183279873b2eb86548d2500458327f176da52226e2162fc2d4",
|
|
143
|
+
"builtAt": "2026-07-17T00:31:59.266Z"
|
|
144
|
+
},
|
|
145
|
+
"0.4.0": {
|
|
146
|
+
"sha256": "sha256:510cdf19d78b34fb3650a122cd09951350f6f71c7617a0b8fd8b686f88360ab2",
|
|
147
|
+
"builtAt": "2026-07-18T16:42:05.540Z"
|
|
148
|
+
},
|
|
149
|
+
"0.4.1": {
|
|
150
|
+
"sha256": "sha256:df101d4bfd7e69b767d90b587f427ce3f6684073cc73fa6973bf3862b04184af",
|
|
151
|
+
"builtAt": "2026-07-27T04:03:48.719Z"
|
|
152
|
+
},
|
|
153
|
+
"0.4.2": {
|
|
154
|
+
"sha256": "sha256:4f96169a3b14a526e98b1364eee8cfbb418023f7dbb8b0d0585f72c960856580",
|
|
155
|
+
"builtAt": "2026-07-27T21:28:50.979Z"
|
|
156
|
+
},
|
|
157
|
+
"0.5.0": {
|
|
158
|
+
"sha256": "sha256:cbcdb755b75eb2b2f1823859e4d40ac15d979ea4b7f3b0be605c98042fa3490b",
|
|
159
|
+
"builtAt": "2026-08-05T21:56:12.021Z"
|
|
160
|
+
},
|
|
161
|
+
"0.5.1": {
|
|
162
|
+
"sha256": "sha256:8b864f4a4c97caf5ff348088c1b2d2d21a0110af4326afa81a870b895d9a00fe",
|
|
163
|
+
"builtAt": "2026-08-06T02:20:16.194Z"
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"cli": {
|
|
167
|
+
"0.2.0": {
|
|
168
|
+
"sha256": "sha256:072dabd488f3d24568ba7a76bce13f55d39493fb5f5b79b8ca272190f75fa2be",
|
|
169
|
+
"builtAt": "2026-07-03T06:44:28.759Z"
|
|
170
|
+
},
|
|
171
|
+
"0.2.1": {
|
|
172
|
+
"sha256": "sha256:76d6c765c0120278a02fc175b9ed6c3ee70e58531ea6c95b6007538f818cad36",
|
|
173
|
+
"builtAt": "2026-07-05T08:53:50.149Z"
|
|
174
|
+
},
|
|
175
|
+
"0.2.2": {
|
|
176
|
+
"sha256": "sha256:795d1623022060d03b1b433f435ec370354a582ec0510cc3398b6f60038fb932",
|
|
177
|
+
"builtAt": "2026-07-06T01:44:28.447Z"
|
|
178
|
+
},
|
|
179
|
+
"0.2.3": {
|
|
180
|
+
"sha256": "sha256:d2eb6e402619f48756d8c11fb45f951a1881fbdb870bb3acec07d464ceafb3f6",
|
|
181
|
+
"builtAt": "2026-07-07T20:18:49.174Z"
|
|
182
|
+
},
|
|
183
|
+
"0.2.4": {
|
|
184
|
+
"sha256": "sha256:7cbdf2513df47e8bb53f6c966ba1a0df7c020567faceefbecb303ebc227ca02c",
|
|
185
|
+
"builtAt": "2026-07-08T20:06:59.207Z"
|
|
186
|
+
},
|
|
187
|
+
"0.3.0": {
|
|
188
|
+
"sha256": "sha256:39565e54cce2ab284745b337538128928feea5c2c0521a287168d8338064af80",
|
|
189
|
+
"builtAt": "2026-07-14T18:22:53.220Z"
|
|
190
|
+
},
|
|
191
|
+
"0.3.1": {
|
|
192
|
+
"sha256": "sha256:e568887ddc71d4a63da922d27472d986540d194c5d6777ef78bf674da595ad7d",
|
|
193
|
+
"builtAt": "2026-07-16T05:03:08.598Z"
|
|
194
|
+
},
|
|
195
|
+
"0.3.2": {
|
|
196
|
+
"sha256": "sha256:d4db54c13bc3cf3b250ad24b8739e32383781bbd9d83e96e1d72eb2027806087",
|
|
197
|
+
"builtAt": "2026-07-17T00:31:59.634Z"
|
|
198
|
+
},
|
|
199
|
+
"0.4.0": {
|
|
200
|
+
"sha256": "sha256:136db43058a878fddfa7c4fa2b20cc14016ba3d0a7218181697dcb14c3fc6c36",
|
|
201
|
+
"builtAt": "2026-07-18T16:42:05.857Z"
|
|
202
|
+
},
|
|
203
|
+
"0.4.1": {
|
|
204
|
+
"sha256": "sha256:7c83b0197350948111cfd89e07978e7183e82fb67df7148c772ed422ae6e8cda",
|
|
205
|
+
"builtAt": "2026-07-27T04:03:49.439Z"
|
|
206
|
+
},
|
|
207
|
+
"0.4.2": {
|
|
208
|
+
"sha256": "sha256:3376a5566f08c3530d19e61ad1800e2770c353948341a0882ea0a9dc501c9a08",
|
|
209
|
+
"builtAt": "2026-07-27T21:28:51.266Z"
|
|
210
|
+
},
|
|
211
|
+
"0.5.0": {
|
|
212
|
+
"sha256": "sha256:988e65d61c9a6a0beb15a0504ec56f286e7ad8d149461bf9bed716e97fbce14f",
|
|
213
|
+
"builtAt": "2026-08-05T21:56:12.772Z"
|
|
214
|
+
},
|
|
215
|
+
"0.5.1": {
|
|
216
|
+
"sha256": "sha256:b859ca9b048f718293b46dd1a39dd4e06ed231d48b77b7359c6719dc9a2f04af",
|
|
217
|
+
"builtAt": "2026-08-06T02:20:16.414Z"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
"crew": {
|
|
221
|
+
"0.2.0": {
|
|
222
|
+
"sha256": "sha256:bf82a585954fc35bd4b2af6ae2d5b866bf478f9abbcd9d77c8b47ddde610ffde",
|
|
223
|
+
"builtAt": "2026-07-03T06:44:29.458Z"
|
|
224
|
+
},
|
|
225
|
+
"0.2.1": {
|
|
226
|
+
"sha256": "sha256:42e6ec750e0eca70ac7ce222ee14cf6b4a6c09a26220f0a8b9d043a95a9c61cf",
|
|
227
|
+
"builtAt": "2026-07-05T08:53:50.493Z"
|
|
228
|
+
},
|
|
229
|
+
"0.2.2": {
|
|
230
|
+
"sha256": "sha256:14362221ee7b1d540aaa88f166c64bfbb24fa5aeb70066c99fafb5e0ecc4a6c8",
|
|
231
|
+
"builtAt": "2026-07-06T01:44:29.168Z"
|
|
232
|
+
},
|
|
233
|
+
"0.2.3": {
|
|
234
|
+
"sha256": "sha256:3e9ec8d9805413e8b3e8c0b37d06ee76a338ee344c41f06dfd2ba6f185539e30",
|
|
235
|
+
"builtAt": "2026-07-07T20:18:49.435Z"
|
|
236
|
+
},
|
|
237
|
+
"0.2.4": {
|
|
238
|
+
"sha256": "sha256:a381333d3a7aa6060734a31acd55d9333098903abf43f18fd11143213942436f",
|
|
239
|
+
"builtAt": "2026-07-08T20:06:59.647Z"
|
|
240
|
+
},
|
|
241
|
+
"0.3.0": {
|
|
242
|
+
"sha256": "sha256:932ed93eac40ded1de5afa2d18c99204aa961ad2983f2f207cb1a332802ad4eb",
|
|
243
|
+
"builtAt": "2026-07-14T18:22:54.786Z"
|
|
244
|
+
},
|
|
245
|
+
"0.3.1": {
|
|
246
|
+
"sha256": "sha256:6bd56c07ac646cda925cd68c74e99bbc52720851d722d3ec886fa9c1bc2401c2",
|
|
247
|
+
"builtAt": "2026-07-16T05:03:09.273Z"
|
|
248
|
+
},
|
|
249
|
+
"0.3.2": {
|
|
250
|
+
"sha256": "sha256:ccf3628ae078d3a43f62e52d1b12748fff9836710f48100e5782256f20a39583",
|
|
251
|
+
"builtAt": "2026-07-17T00:32:00.004Z"
|
|
252
|
+
},
|
|
253
|
+
"0.4.0": {
|
|
254
|
+
"sha256": "sha256:be1b617fe7386a543d656aa7255ee086b68a26e37463e89ac733ad72415f66c8",
|
|
255
|
+
"builtAt": "2026-07-18T16:42:06.196Z"
|
|
256
|
+
},
|
|
257
|
+
"0.4.1": {
|
|
258
|
+
"sha256": "sha256:2c35ccbe99272eef3a5efe616ff722b44c48333e6494ed5f99bf12a916094e7e",
|
|
259
|
+
"builtAt": "2026-07-27T04:03:50.283Z"
|
|
260
|
+
},
|
|
261
|
+
"0.4.2": {
|
|
262
|
+
"sha256": "sha256:c80305416de1fecd4c6054109a1f55f26db7d29afcfa13c65344585642ca2b1e",
|
|
263
|
+
"builtAt": "2026-07-27T21:28:51.507Z"
|
|
264
|
+
},
|
|
265
|
+
"0.5.0": {
|
|
266
|
+
"sha256": "sha256:d8eba3a4beaf303e07eac7381b467058781d450eda4165fe002adc565913c9e4",
|
|
267
|
+
"builtAt": "2026-08-05T21:56:13.513Z"
|
|
268
|
+
},
|
|
269
|
+
"0.5.1": {
|
|
270
|
+
"sha256": "sha256:dff3fc477fc11df151c98f9d9c61590958ae847310aec3ad5595bf93095cc391",
|
|
271
|
+
"builtAt": "2026-08-06T02:20:16.612Z"
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
"eval": {
|
|
275
|
+
"0.2.0": {
|
|
276
|
+
"sha256": "sha256:7cf684200e60c0985aee9fab5c35140483baee0bcb62fb983d987d70e593d3d7",
|
|
277
|
+
"builtAt": "2026-07-03T06:44:30.149Z"
|
|
278
|
+
},
|
|
279
|
+
"0.2.1": {
|
|
280
|
+
"sha256": "sha256:52aab14cf9531f80b4d51e0e1b5d1afed46bec5c423478f7161b1aaec06dbcba",
|
|
281
|
+
"builtAt": "2026-07-05T08:53:50.821Z"
|
|
282
|
+
},
|
|
283
|
+
"0.2.2": {
|
|
284
|
+
"sha256": "sha256:6368a67b518ea9e833137f15e13b1374c8540a26f1b9565869c0b626e33e25b0",
|
|
285
|
+
"builtAt": "2026-07-06T01:44:29.860Z"
|
|
286
|
+
},
|
|
287
|
+
"0.2.3": {
|
|
288
|
+
"sha256": "sha256:0f6e719ce9d5032155d71e2873f09602bf39ab814967d4a5eb519dee3aafe69f",
|
|
289
|
+
"builtAt": "2026-07-07T20:18:49.679Z"
|
|
290
|
+
},
|
|
291
|
+
"0.2.4": {
|
|
292
|
+
"sha256": "sha256:f83f91e9c283ec7aa5d60c01d00ceafaf8d37381e5711017eba4c9239e068a37",
|
|
293
|
+
"builtAt": "2026-07-08T20:07:00.028Z"
|
|
294
|
+
},
|
|
295
|
+
"0.3.0": {
|
|
296
|
+
"sha256": "sha256:03b1c8022984ce7b8f0661a3082267341a0b7ce99a91b80ebb81d884034363b7",
|
|
297
|
+
"builtAt": "2026-07-14T18:22:55.230Z"
|
|
298
|
+
},
|
|
299
|
+
"0.3.1": {
|
|
300
|
+
"sha256": "sha256:322ca2330de21b06f899d1d5f0ac4d84c5d26d6f445cd73b93662c6a160ff22b",
|
|
301
|
+
"builtAt": "2026-07-16T05:03:09.981Z"
|
|
302
|
+
},
|
|
303
|
+
"0.3.2": {
|
|
304
|
+
"sha256": "sha256:bd819a19e132c7630a73250d463a733e4ecf1de47a41ace20acebc1486bc2e98",
|
|
305
|
+
"builtAt": "2026-07-17T00:32:00.361Z"
|
|
306
|
+
},
|
|
307
|
+
"0.4.0": {
|
|
308
|
+
"sha256": "sha256:5d83618073af91fcd0483aa5405ed885b65fb5fdcf692f80a26e5da0abaf7975",
|
|
309
|
+
"builtAt": "2026-07-18T16:42:06.511Z"
|
|
310
|
+
},
|
|
311
|
+
"0.4.1": {
|
|
312
|
+
"sha256": "sha256:2bc8603e39780a320f7b667b5f90142a6ad2d5055b4cfc6d2c25ae899de09eb6",
|
|
313
|
+
"builtAt": "2026-07-27T04:03:50.979Z"
|
|
314
|
+
},
|
|
315
|
+
"0.4.2": {
|
|
316
|
+
"sha256": "sha256:1443f6c3d491319d3e80561790788a701eb8ef6e077572ba8637064031634c39",
|
|
317
|
+
"builtAt": "2026-07-27T21:28:51.742Z"
|
|
318
|
+
},
|
|
319
|
+
"0.5.0": {
|
|
320
|
+
"sha256": "sha256:372c6b477b4e3f09b6dd1721ef5b8eb28cf29ab49ed478decc376b51f2823d9f",
|
|
321
|
+
"builtAt": "2026-08-05T21:56:14.193Z"
|
|
322
|
+
},
|
|
323
|
+
"0.5.1": {
|
|
324
|
+
"sha256": "sha256:41c5e1446b2b3757077824881b323ba6492ea396c962b3d8f19090c098d670df",
|
|
325
|
+
"builtAt": "2026-08-06T02:20:16.837Z"
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
"graph": {
|
|
329
|
+
"0.2.0": {
|
|
330
|
+
"sha256": "sha256:c78e2a76ac4cfe86066554671dc835d9b94b217fdd73254f9a15ba55b9ef3765",
|
|
331
|
+
"builtAt": "2026-07-03T06:44:30.846Z"
|
|
332
|
+
},
|
|
333
|
+
"0.2.1": {
|
|
334
|
+
"sha256": "sha256:f31628b0541fb1a396c38b9caf4767e6d7af0a273e4c79042539ae88b4563c45",
|
|
335
|
+
"builtAt": "2026-07-05T08:53:51.136Z"
|
|
336
|
+
},
|
|
337
|
+
"0.2.2": {
|
|
338
|
+
"sha256": "sha256:2848579399ad91e40233b01f10319f221d0e9e25079bf3a4a80af5218525475b",
|
|
339
|
+
"builtAt": "2026-07-06T01:44:30.489Z"
|
|
340
|
+
},
|
|
341
|
+
"0.2.3": {
|
|
342
|
+
"sha256": "sha256:8eef79d1fcff0315925488f5fcc4288f467b144ab61bda2d8d79154b9756a5b2",
|
|
343
|
+
"builtAt": "2026-07-07T20:18:49.907Z"
|
|
344
|
+
},
|
|
345
|
+
"0.2.4": {
|
|
346
|
+
"sha256": "sha256:a50c3160c40534756c66648664cd0253bd4faf57d7e6884cc6dfca6a88247aa7",
|
|
347
|
+
"builtAt": "2026-07-08T20:07:00.397Z"
|
|
348
|
+
},
|
|
349
|
+
"0.3.0": {
|
|
350
|
+
"sha256": "sha256:957dc0ab466b6b4aee9657f675bef381e6fcb03d295c1e912c4a2be2a3a3a61f",
|
|
351
|
+
"builtAt": "2026-07-14T18:22:55.650Z"
|
|
352
|
+
},
|
|
353
|
+
"0.3.1": {
|
|
354
|
+
"sha256": "sha256:bc8cf728ea700d529f3c2fa09834ccc206d6a2110a148c2153c0f2165f5eb587",
|
|
355
|
+
"builtAt": "2026-07-16T05:03:11.046Z"
|
|
356
|
+
},
|
|
357
|
+
"0.3.2": {
|
|
358
|
+
"sha256": "sha256:d4f0a1f48bd06e7582b9f3992c27202725cd984509ff4e2a6f7f6956198044e1",
|
|
359
|
+
"builtAt": "2026-07-17T00:32:00.735Z"
|
|
360
|
+
},
|
|
361
|
+
"0.4.0": {
|
|
362
|
+
"sha256": "sha256:216f2890e5e10d249a31a53489b4bd0eed9a0341d39ef7a557a8303a678ba578",
|
|
363
|
+
"builtAt": "2026-07-18T16:42:06.830Z"
|
|
364
|
+
},
|
|
365
|
+
"0.4.1": {
|
|
366
|
+
"sha256": "sha256:bad88d2e12a6c42f0c04fa00ced1d1b41533822830e291bb57a1eebef3f13fd7",
|
|
367
|
+
"builtAt": "2026-07-27T04:03:51.768Z"
|
|
368
|
+
},
|
|
369
|
+
"0.4.2": {
|
|
370
|
+
"sha256": "sha256:459c4eab5378b99ebc5b79a891f7fc9e1d6c65b466270fbd9fa772de37f57d8b",
|
|
371
|
+
"builtAt": "2026-07-27T21:28:51.965Z"
|
|
372
|
+
},
|
|
373
|
+
"0.5.0": {
|
|
374
|
+
"sha256": "sha256:9690f2386c40f8375087ea1f7f46ec2d9ed4a03207030bd4cbe9037a60096d80",
|
|
375
|
+
"builtAt": "2026-08-05T21:56:14.881Z"
|
|
376
|
+
},
|
|
377
|
+
"0.5.1": {
|
|
378
|
+
"sha256": "sha256:b241f458399a8098482d0dcfdb383bd1cfd87804ea5cb0a39063e18aa4202e3f",
|
|
379
|
+
"builtAt": "2026-08-06T02:20:17.052Z"
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"managed": {
|
|
383
|
+
"0.2.0": {
|
|
384
|
+
"sha256": "sha256:d6ac46d7268435028c3327b345b420ae234901fe43480cdcbba17c3688fab43c",
|
|
385
|
+
"builtAt": "2026-07-03T06:44:31.735Z"
|
|
386
|
+
},
|
|
387
|
+
"0.2.1": {
|
|
388
|
+
"sha256": "sha256:a6acaa654bce50657fb22ea6b5b1033c885d25d28a46645dcfd351ed1c36c6ff",
|
|
389
|
+
"builtAt": "2026-07-05T08:53:51.445Z"
|
|
390
|
+
},
|
|
391
|
+
"0.2.2": {
|
|
392
|
+
"sha256": "sha256:3ffa3c58f12f3b1fc4198a9ff10898b7d4fcd5129dc49ea3d33020409e8d4e10",
|
|
393
|
+
"builtAt": "2026-07-06T01:44:31.213Z"
|
|
394
|
+
},
|
|
395
|
+
"0.2.3": {
|
|
396
|
+
"sha256": "sha256:5e2a67f3043e3961da2ecbdb7e1a19a26a3de25fade8e371566a94ebc9eb37e0",
|
|
397
|
+
"builtAt": "2026-07-07T20:18:50.165Z"
|
|
398
|
+
},
|
|
399
|
+
"0.2.4": {
|
|
400
|
+
"sha256": "sha256:0f68a6329d6244101a6f356c08a0121fd51a62fd1c58b7f116755b32324028a6",
|
|
401
|
+
"builtAt": "2026-07-08T20:07:00.840Z"
|
|
402
|
+
},
|
|
403
|
+
"0.3.0": {
|
|
404
|
+
"sha256": "sha256:3700113f07fb44ed1d4070cc1bc98b00d1e23f55b841a41adf8476523b52df44",
|
|
405
|
+
"builtAt": "2026-07-14T18:22:56.559Z"
|
|
406
|
+
},
|
|
407
|
+
"0.3.1": {
|
|
408
|
+
"sha256": "sha256:c78e4f625e084b5e788103840a0d99d864475aa8e09898460d0cff74ecec2201",
|
|
409
|
+
"builtAt": "2026-07-16T05:03:11.708Z"
|
|
410
|
+
},
|
|
411
|
+
"0.3.2": {
|
|
412
|
+
"sha256": "sha256:168cba60b72a674595e738771a4b2a4cb612e97275f07afdfc1d40f0b7cb68e2",
|
|
413
|
+
"builtAt": "2026-07-17T00:32:01.105Z"
|
|
414
|
+
},
|
|
415
|
+
"0.4.0": {
|
|
416
|
+
"sha256": "sha256:0727f0648f451cc174b72899874e7976bd9952d7151f00117c6996094fa6d62d",
|
|
417
|
+
"builtAt": "2026-07-18T16:42:07.148Z"
|
|
418
|
+
},
|
|
419
|
+
"0.4.1": {
|
|
420
|
+
"sha256": "sha256:89a6f689999db404a42019e1f7e7bc0e70931545d5ec41018beafe15491306ef",
|
|
421
|
+
"builtAt": "2026-07-27T04:03:52.515Z"
|
|
422
|
+
},
|
|
423
|
+
"0.4.2": {
|
|
424
|
+
"sha256": "sha256:7b0753264744a44ca8856a5a5e4a4d675016f8209fcc2322ad842be2db3e1f6b",
|
|
425
|
+
"builtAt": "2026-07-27T21:28:52.190Z"
|
|
426
|
+
},
|
|
427
|
+
"0.5.0": {
|
|
428
|
+
"sha256": "sha256:2c7fcf9b7014ad4c2a2845b4e1d68c71fd7eddc5db53ca53b8eeaebdf094381c",
|
|
429
|
+
"builtAt": "2026-08-05T21:56:15.645Z"
|
|
430
|
+
},
|
|
431
|
+
"0.5.1": {
|
|
432
|
+
"sha256": "sha256:148fba2b2d827e782c060f6b459cbd3437aa97a6d0cdb1850beb73c2aec939ac",
|
|
433
|
+
"builtAt": "2026-08-06T02:20:17.272Z"
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
"pipeline": {
|
|
437
|
+
"0.2.0": {
|
|
438
|
+
"sha256": "sha256:78a94fd966bd9e49f5549b4bfb0477a4547355bb65bfff4882ab7920a0c228dc",
|
|
439
|
+
"builtAt": "2026-07-03T06:44:32.481Z"
|
|
440
|
+
},
|
|
441
|
+
"0.2.1": {
|
|
442
|
+
"sha256": "sha256:ddc47e70afc81c79f50672fd91a9b3d5f6087bf3ed4a2ae7661318983c2e584c",
|
|
443
|
+
"builtAt": "2026-07-05T08:53:51.764Z"
|
|
444
|
+
},
|
|
445
|
+
"0.2.2": {
|
|
446
|
+
"sha256": "sha256:fefb46fc21ea494154aeece445a92ba95536aea4a4852fdc863e8cbae21f9589",
|
|
447
|
+
"builtAt": "2026-07-06T01:44:31.918Z"
|
|
448
|
+
},
|
|
449
|
+
"0.2.3": {
|
|
450
|
+
"sha256": "sha256:30251cb349d7c538972dc4576a021f73e0eceb130ab81770362df4d55be02c72",
|
|
451
|
+
"builtAt": "2026-07-07T20:18:50.431Z"
|
|
452
|
+
},
|
|
453
|
+
"0.2.4": {
|
|
454
|
+
"sha256": "sha256:261b9e2b3dff244116a7689e185125bf3edae23b49f15cfd558e55e706967fdc",
|
|
455
|
+
"builtAt": "2026-07-08T20:07:01.205Z"
|
|
456
|
+
},
|
|
457
|
+
"0.3.0": {
|
|
458
|
+
"sha256": "sha256:f77e514314f48ade0e86cf7a376cfae1885087b09db1bb52ead0dd010be8cfb0",
|
|
459
|
+
"builtAt": "2026-07-14T18:22:57.216Z"
|
|
460
|
+
},
|
|
461
|
+
"0.3.1": {
|
|
462
|
+
"sha256": "sha256:b043c866bff7c7484d5b16272482315b9533f56ed740f1245c178c013a3661c0",
|
|
463
|
+
"builtAt": "2026-07-16T05:03:12.417Z"
|
|
464
|
+
},
|
|
465
|
+
"0.3.2": {
|
|
466
|
+
"sha256": "sha256:33c06933cb534b1720231d2d1dd0478490be404c5ef6ce9a2a04033b727f5224",
|
|
467
|
+
"builtAt": "2026-07-17T00:32:01.488Z"
|
|
468
|
+
},
|
|
469
|
+
"0.4.0": {
|
|
470
|
+
"sha256": "sha256:252f1d6a4398c9e242753b262b5251345afdecac70edaefdbf0596cbb2afdfb1",
|
|
471
|
+
"builtAt": "2026-07-18T16:42:07.468Z"
|
|
472
|
+
},
|
|
473
|
+
"0.4.1": {
|
|
474
|
+
"sha256": "sha256:7579be73ed62acf1fb3e0e34d1f1e4645a584d81c1c832f00452087be83862fc",
|
|
475
|
+
"builtAt": "2026-07-27T04:03:53.221Z"
|
|
476
|
+
},
|
|
477
|
+
"0.4.2": {
|
|
478
|
+
"sha256": "sha256:02a87272da885ed71813ac0217cf9e7e9407f1749658712a4f2649dc9abf7362",
|
|
479
|
+
"builtAt": "2026-07-27T21:28:52.445Z"
|
|
480
|
+
},
|
|
481
|
+
"0.5.0": {
|
|
482
|
+
"sha256": "sha256:094304916dbbcc71e7263988b6838f564270c67b398346a9df9d36b74eb872bd",
|
|
483
|
+
"builtAt": "2026-08-05T21:56:16.311Z"
|
|
484
|
+
},
|
|
485
|
+
"0.5.1": {
|
|
486
|
+
"sha256": "sha256:a2140946ad704fa2d2dc780e956bb61ce756b59dedde39e537ca617636f29ef0",
|
|
487
|
+
"builtAt": "2026-08-06T02:20:17.519Z"
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
"research": {
|
|
491
|
+
"0.2.0": {
|
|
492
|
+
"sha256": "sha256:a104f567eb676633b09d490af30579d60b1eb80e74c3ac86e6931f25f8012968",
|
|
493
|
+
"builtAt": "2026-07-03T06:44:33.178Z"
|
|
494
|
+
},
|
|
495
|
+
"0.2.1": {
|
|
496
|
+
"sha256": "sha256:bf37b93e260ada2892b5886fd7986b32cc431aa5b034dba8245d5a6c0d70d770",
|
|
497
|
+
"builtAt": "2026-07-05T08:53:52.071Z"
|
|
498
|
+
},
|
|
499
|
+
"0.2.2": {
|
|
500
|
+
"sha256": "sha256:aec31336824dbb43287503b8655f288218c69df6ceb4113f42328228565a3513",
|
|
501
|
+
"builtAt": "2026-07-06T01:44:32.612Z"
|
|
502
|
+
},
|
|
503
|
+
"0.2.3": {
|
|
504
|
+
"sha256": "sha256:f8e629041a3c8ec4530712591d4d15f51301e1cce9c7d13617df4c8f4e82fe78",
|
|
505
|
+
"builtAt": "2026-07-07T20:18:50.688Z"
|
|
506
|
+
},
|
|
507
|
+
"0.2.4": {
|
|
508
|
+
"sha256": "sha256:e8ac59c0428520d95de14d57f48331ceb136308a7aa74377798ebefa625ccfec",
|
|
509
|
+
"builtAt": "2026-07-08T20:07:01.622Z"
|
|
510
|
+
},
|
|
511
|
+
"0.3.0": {
|
|
512
|
+
"sha256": "sha256:1a1161eb192e6e14e61f85f45c4257cde6689779434e891e11b408dd9536654b",
|
|
513
|
+
"builtAt": "2026-07-14T18:22:58.004Z"
|
|
514
|
+
},
|
|
515
|
+
"0.3.1": {
|
|
516
|
+
"sha256": "sha256:e7d80ecd10aa2b43544754668b9921618c8983c6c85cbc1832c590711f82ac23",
|
|
517
|
+
"builtAt": "2026-07-16T05:03:13.184Z"
|
|
518
|
+
},
|
|
519
|
+
"0.3.2": {
|
|
520
|
+
"sha256": "sha256:3f4a5f6f57aeebbc0dd3b08fe7396bcee153ae520a61587c5a4dff359bdaa553",
|
|
521
|
+
"builtAt": "2026-07-17T00:32:01.882Z"
|
|
522
|
+
},
|
|
523
|
+
"0.4.0": {
|
|
524
|
+
"sha256": "sha256:fa9eadfb3e024e110c959e56e0bf6454dfc4ef46b1dfc4e43f7365935289cfd0",
|
|
525
|
+
"builtAt": "2026-07-18T16:42:07.865Z"
|
|
526
|
+
},
|
|
527
|
+
"0.4.1": {
|
|
528
|
+
"sha256": "sha256:eef65cae7553982141b99d76b4b1f751e488274b0b07371f07ac50e161588fef",
|
|
529
|
+
"builtAt": "2026-07-27T04:03:53.935Z"
|
|
530
|
+
},
|
|
531
|
+
"0.4.2": {
|
|
532
|
+
"sha256": "sha256:54f1d0714143455ef67f1f218be26da8b3ed7adff1065f45f58b600bc4a9d6ac",
|
|
533
|
+
"builtAt": "2026-07-27T21:28:52.691Z"
|
|
534
|
+
},
|
|
535
|
+
"0.5.0": {
|
|
536
|
+
"sha256": "sha256:43700f5b194800dd952d2d0068f2898ddd6b95757c87e3e1bfd839b4a2297290",
|
|
537
|
+
"builtAt": "2026-08-05T21:56:16.948Z"
|
|
538
|
+
},
|
|
539
|
+
"0.5.1": {
|
|
540
|
+
"sha256": "sha256:fabbd43b7e51e725adc758bb1c17da0f04500d208be54f252240444fb71cf528",
|
|
541
|
+
"builtAt": "2026-08-06T02:20:17.734Z"
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
"voice": {
|
|
545
|
+
"0.2.0": {
|
|
546
|
+
"sha256": "sha256:ac1da178f6c97ba26531da552de2305ff1f620b95803a463dd98b09a2e3d1c0b",
|
|
547
|
+
"builtAt": "2026-07-03T06:44:33.893Z"
|
|
548
|
+
},
|
|
549
|
+
"0.2.1": {
|
|
550
|
+
"sha256": "sha256:92de309973c808727a72116fccb1bb4484fe2fe78432ed9020697b9a5b3531de",
|
|
551
|
+
"builtAt": "2026-07-05T08:53:52.403Z"
|
|
552
|
+
},
|
|
553
|
+
"0.2.2": {
|
|
554
|
+
"sha256": "sha256:187a434ff2e9f7c4393c9aa19c86ddce6ef027a82961a03023978bcc2ff908fa",
|
|
555
|
+
"builtAt": "2026-07-06T01:44:33.306Z"
|
|
556
|
+
},
|
|
557
|
+
"0.2.3": {
|
|
558
|
+
"sha256": "sha256:9b69f2b9bfcdaa89dcde73d37f189c01a62eaf40c5a29be428230a6ba89042f0",
|
|
559
|
+
"builtAt": "2026-07-07T20:18:50.907Z"
|
|
560
|
+
},
|
|
561
|
+
"0.2.4": {
|
|
562
|
+
"sha256": "sha256:0d8ca4cfa955ec92d3a36267b6fc1aa3bf1d9726fb0451b625e82387b38d67e0",
|
|
563
|
+
"builtAt": "2026-07-08T20:07:02.072Z"
|
|
564
|
+
},
|
|
565
|
+
"0.3.0": {
|
|
566
|
+
"sha256": "sha256:1962b786a831e0bb16befbe0530a68fe0e9d1bb525a16ebcf78ce896e00751d5",
|
|
567
|
+
"builtAt": "2026-07-14T18:22:59.033Z"
|
|
568
|
+
},
|
|
569
|
+
"0.3.1": {
|
|
570
|
+
"sha256": "sha256:fb0443bccfc54986192a991d6e42cfc3bf5045ab769f6919a178aae91210c2d0",
|
|
571
|
+
"builtAt": "2026-07-16T05:03:13.931Z"
|
|
572
|
+
},
|
|
573
|
+
"0.3.2": {
|
|
574
|
+
"sha256": "sha256:93629a24e5aed89958d5e3a438b72808b90dca2de58938e84393336e34581a47",
|
|
575
|
+
"builtAt": "2026-07-17T00:32:02.321Z"
|
|
576
|
+
},
|
|
577
|
+
"0.4.0": {
|
|
578
|
+
"sha256": "sha256:8a0ce9db10a30ad2ae3898eab8098eac840f027a9c59f82ef3310d2ffce29368",
|
|
579
|
+
"builtAt": "2026-07-18T16:42:08.189Z"
|
|
580
|
+
},
|
|
581
|
+
"0.4.1": {
|
|
582
|
+
"sha256": "sha256:9ee3ce7c7680a95bfe56032d537b8ea3de3693aaba9f7cd1ab655321d14e3402",
|
|
583
|
+
"builtAt": "2026-07-27T04:03:54.645Z"
|
|
584
|
+
},
|
|
585
|
+
"0.4.2": {
|
|
586
|
+
"sha256": "sha256:2107cc4b960a88e60756b5a7a29ba88c22aba99ede460002f20113d17d8be83b",
|
|
587
|
+
"builtAt": "2026-07-27T21:28:52.914Z"
|
|
588
|
+
},
|
|
589
|
+
"0.5.0": {
|
|
590
|
+
"sha256": "sha256:27e28326cf727c57594c530eee806df0ef848eddd9e27c7465bd739d337c01c0",
|
|
591
|
+
"builtAt": "2026-08-05T21:56:17.661Z"
|
|
592
|
+
},
|
|
593
|
+
"0.5.1": {
|
|
594
|
+
"sha256": "sha256:3575d1a7ed1f1293545b1fbe77734e41eb1dac200d15feed0c3eafcc0a3c86c7",
|
|
595
|
+
"builtAt": "2026-08-06T02:20:17.933Z"
|
|
596
|
+
}
|
|
597
|
+
},
|
|
598
|
+
"workflow": {
|
|
599
|
+
"0.2.0": {
|
|
600
|
+
"sha256": "sha256:850568bc4aa59ded05f30dcb71e0a62a8e0116d1c9dd897d85cd5bc93cbf8e42",
|
|
601
|
+
"builtAt": "2026-07-03T06:44:34.581Z"
|
|
602
|
+
},
|
|
603
|
+
"0.2.1": {
|
|
604
|
+
"sha256": "sha256:77ef9b30a2e772b3298cb91ad97e3bfed9c150f3666f1847cceb89c12b70d722",
|
|
605
|
+
"builtAt": "2026-07-05T08:53:52.770Z"
|
|
606
|
+
},
|
|
607
|
+
"0.2.2": {
|
|
608
|
+
"sha256": "sha256:c8704f399af2b4e5732b27ac32a1650063e448914f0bf31d3e6f9dacd082c801",
|
|
609
|
+
"builtAt": "2026-07-06T01:44:34.047Z"
|
|
610
|
+
},
|
|
611
|
+
"0.2.3": {
|
|
612
|
+
"sha256": "sha256:f934f3cc311b615963bd8bf19ca894cb708a3d440cf201b9469290b04816b5e0",
|
|
613
|
+
"builtAt": "2026-07-07T20:18:51.136Z"
|
|
614
|
+
},
|
|
615
|
+
"0.2.4": {
|
|
616
|
+
"sha256": "sha256:710356166c9365b6dc3be49ccbb64a72fc846058559b09ed91be22954b3cda9e",
|
|
617
|
+
"builtAt": "2026-07-08T20:07:02.467Z"
|
|
618
|
+
},
|
|
619
|
+
"0.3.0": {
|
|
620
|
+
"sha256": "sha256:dd24d95339c4fd393594ab6d991015513586c7d58ffc37ef9b4dff02c6ca16c3",
|
|
621
|
+
"builtAt": "2026-07-14T18:22:59.812Z"
|
|
622
|
+
},
|
|
623
|
+
"0.3.1": {
|
|
624
|
+
"sha256": "sha256:2ab7034d26c4029209c56d99fd9a10d9f7fa299e09799a720439c906d8f7fbcd",
|
|
625
|
+
"builtAt": "2026-07-16T05:03:14.796Z"
|
|
626
|
+
},
|
|
627
|
+
"0.3.2": {
|
|
628
|
+
"sha256": "sha256:a7c4a9d3368f513969748c8384c0531e541dc1fd24f294c14bc8b24c4a8560b0",
|
|
629
|
+
"builtAt": "2026-07-17T00:32:02.711Z"
|
|
630
|
+
},
|
|
631
|
+
"0.4.0": {
|
|
632
|
+
"sha256": "sha256:8dd14a3020e0f766be2b77f93886c5d550cc857e2f4eb6fec0e386fc3e6180f8",
|
|
633
|
+
"builtAt": "2026-07-18T16:42:08.526Z"
|
|
634
|
+
},
|
|
635
|
+
"0.4.1": {
|
|
636
|
+
"sha256": "sha256:414d4bdcd33ebfc920dd8d3b8730bab23b694bf1fabb61d6d3b444ec4ec588c1",
|
|
637
|
+
"builtAt": "2026-07-27T04:03:55.350Z"
|
|
638
|
+
},
|
|
639
|
+
"0.4.2": {
|
|
640
|
+
"sha256": "sha256:8f9a5174e3b9f6abfb9bce626845dc297dc293458c2428f5bb58e3c64ca9efed",
|
|
641
|
+
"builtAt": "2026-07-27T21:28:53.124Z"
|
|
642
|
+
},
|
|
643
|
+
"0.5.0": {
|
|
644
|
+
"sha256": "sha256:56badbd1ac660314c875ba3e942826cacc103c059b1475a4dbd8384329427a0c",
|
|
645
|
+
"builtAt": "2026-08-05T21:56:18.397Z"
|
|
646
|
+
},
|
|
647
|
+
"0.5.1": {
|
|
648
|
+
"sha256": "sha256:55732a9a0614cbb7dec286851700cf8c7dc0211815d971dbff9d05bf5d839a72",
|
|
649
|
+
"builtAt": "2026-08-06T02:20:18.156Z"
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Section 32 — docker-images: eval target shape (deployable eval bundle).
|
|
2
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
COPY bun.lock package.json ./
|
|
5
|
+
COPY packages packages
|
|
6
|
+
COPY apps apps
|
|
7
|
+
RUN bun install --frozen-lockfile
|
|
8
|
+
|
|
9
|
+
FROM deps AS build
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
12
|
+
RUN bun run typecheck
|
|
13
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
14
|
+
|
|
15
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
16
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
17
|
+
mkdir -p /app/.crewhaus/evals && chown -R crewhaus:crewhaus /app/.crewhaus
|
|
18
|
+
WORKDIR /app
|
|
19
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
20
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
21
|
+
USER crewhaus
|
|
22
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=eval
|
|
23
|
+
EXPOSE 0
|
|
24
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \
|
|
25
|
+
CMD bun /app/crewhaus.js doctor --liveness || exit 1
|
|
26
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
27
|
+
CMD ["eval", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Section 32 — docker-images: graph target shape (durable graph runtime).
|
|
2
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
COPY bun.lock package.json ./
|
|
5
|
+
COPY packages packages
|
|
6
|
+
COPY apps apps
|
|
7
|
+
RUN bun install --frozen-lockfile
|
|
8
|
+
|
|
9
|
+
FROM deps AS build
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
12
|
+
RUN bun run typecheck
|
|
13
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
14
|
+
|
|
15
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
16
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
17
|
+
mkdir -p /app/.crewhaus/graphs && chown -R crewhaus:crewhaus /app/.crewhaus
|
|
18
|
+
WORKDIR /app
|
|
19
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
20
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
21
|
+
USER crewhaus
|
|
22
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=graph
|
|
23
|
+
EXPOSE 0
|
|
24
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \
|
|
25
|
+
CMD bun /app/crewhaus.js doctor --liveness || exit 1
|
|
26
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
27
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Section 32 — docker-images: managed target shape (multi-tenant gateway daemon).
|
|
2
|
+
# Section 20 daemon listens on $PORT (default 8080) for tenant API traffic.
|
|
3
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
COPY bun.lock package.json ./
|
|
6
|
+
COPY packages packages
|
|
7
|
+
COPY apps apps
|
|
8
|
+
RUN bun install --frozen-lockfile
|
|
9
|
+
|
|
10
|
+
FROM deps AS build
|
|
11
|
+
WORKDIR /app
|
|
12
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
13
|
+
RUN bun run typecheck
|
|
14
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
15
|
+
|
|
16
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
17
|
+
RUN apk add --no-cache curl ca-certificates && \
|
|
18
|
+
addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
19
|
+
mkdir -p /app/.crewhaus/audit && chown -R crewhaus:crewhaus /app/.crewhaus
|
|
20
|
+
WORKDIR /app
|
|
21
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
22
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
23
|
+
USER crewhaus
|
|
24
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=managed PORT=8080
|
|
25
|
+
EXPOSE 8080
|
|
26
|
+
HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \
|
|
27
|
+
CMD curl -fsS http://localhost:${PORT:-8080}/healthz || exit 1
|
|
28
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
29
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Section 32 — docker-images: pipeline target shape (RAG ingest pipeline).
|
|
2
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
COPY bun.lock package.json ./
|
|
5
|
+
COPY packages packages
|
|
6
|
+
COPY apps apps
|
|
7
|
+
RUN bun install --frozen-lockfile
|
|
8
|
+
|
|
9
|
+
FROM deps AS build
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
12
|
+
RUN bun run typecheck
|
|
13
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
14
|
+
|
|
15
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
16
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
17
|
+
mkdir -p /app/.crewhaus/vector && chown -R crewhaus:crewhaus /app/.crewhaus
|
|
18
|
+
WORKDIR /app
|
|
19
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
20
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
21
|
+
USER crewhaus
|
|
22
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=pipeline
|
|
23
|
+
EXPOSE 0
|
|
24
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \
|
|
25
|
+
CMD bun /app/crewhaus.js doctor --liveness || exit 1
|
|
26
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
27
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Section 32 — docker-images: research target shape (autonomous research agent).
|
|
2
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
COPY bun.lock package.json ./
|
|
5
|
+
COPY packages packages
|
|
6
|
+
COPY apps apps
|
|
7
|
+
RUN bun install --frozen-lockfile
|
|
8
|
+
|
|
9
|
+
FROM deps AS build
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
12
|
+
RUN bun run typecheck
|
|
13
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
14
|
+
|
|
15
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
16
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
17
|
+
mkdir -p /app/.crewhaus/research && chown -R crewhaus:crewhaus /app/.crewhaus
|
|
18
|
+
WORKDIR /app
|
|
19
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
20
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
21
|
+
USER crewhaus
|
|
22
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=research
|
|
23
|
+
EXPOSE 0
|
|
24
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \
|
|
25
|
+
CMD bun /app/crewhaus.js doctor --liveness || exit 1
|
|
26
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
27
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Section 32 — docker-images: voice target shape (realtime telephony agent).
|
|
2
|
+
# Adds opus (PCM ↔ Opus codec for telephony codecs) on top of the base.
|
|
3
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
COPY bun.lock package.json ./
|
|
6
|
+
COPY packages packages
|
|
7
|
+
COPY apps apps
|
|
8
|
+
RUN bun install --frozen-lockfile
|
|
9
|
+
|
|
10
|
+
FROM deps AS build
|
|
11
|
+
WORKDIR /app
|
|
12
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
13
|
+
RUN bun run typecheck
|
|
14
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
15
|
+
|
|
16
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
17
|
+
RUN apk add --no-cache curl ca-certificates opus opus-tools && \
|
|
18
|
+
addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001 && \
|
|
19
|
+
mkdir -p /app/.crewhaus && chown crewhaus:crewhaus /app/.crewhaus
|
|
20
|
+
WORKDIR /app
|
|
21
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
22
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
23
|
+
USER crewhaus
|
|
24
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=voice PORT=8080
|
|
25
|
+
EXPOSE 8080
|
|
26
|
+
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
|
|
27
|
+
CMD curl -fsS http://localhost:${PORT:-8080}/healthz || exit 1
|
|
28
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
29
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Section 32 — docker-images: workflow target shape (sequential multi-step agent).
|
|
2
|
+
FROM oven/bun:1.2-alpine AS deps
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
COPY bun.lock package.json ./
|
|
5
|
+
COPY packages packages
|
|
6
|
+
COPY apps apps
|
|
7
|
+
RUN bun install --frozen-lockfile
|
|
8
|
+
|
|
9
|
+
FROM deps AS build
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY tsconfig.base.json tsconfig.json ./
|
|
12
|
+
RUN bun run typecheck
|
|
13
|
+
RUN bun build apps/cli/src/index.ts --target=bun --outfile=/app/dist/crewhaus.js
|
|
14
|
+
|
|
15
|
+
FROM oven/bun:1.2-alpine AS runtime
|
|
16
|
+
RUN addgroup -S crewhaus && adduser -S crewhaus -G crewhaus -u 10001
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
COPY --from=build --chown=crewhaus:crewhaus /app/dist/crewhaus.js /app/crewhaus.js
|
|
19
|
+
COPY --from=deps --chown=crewhaus:crewhaus /app/node_modules /app/node_modules
|
|
20
|
+
USER crewhaus
|
|
21
|
+
ENV NODE_ENV=production CREWHAUS_TARGET=workflow
|
|
22
|
+
EXPOSE 0
|
|
23
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=2s --retries=3 \
|
|
24
|
+
CMD bun /app/crewhaus.js doctor --liveness || exit 1
|
|
25
|
+
ENTRYPOINT ["bun", "/app/crewhaus.js"]
|
|
26
|
+
CMD ["run", "/spec/crewhaus.yaml"]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewhaus/docker-images",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Per-target-shape Docker images (multi-stage, non-root, healthchecked) + crewhaus build-image CLI wrapper (Section 32)",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"test": "bun test src"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@crewhaus/errors": "0.5.
|
|
18
|
+
"@crewhaus/errors": "0.5.2"
|
|
19
19
|
},
|
|
20
20
|
"license": "Apache-2.0",
|
|
21
21
|
"author": {
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
|
37
37
|
},
|
|
38
|
-
"files": ["
|
|
38
|
+
"files": ["LICENSE", "NOTICE", "README.md", "docker", "dist"]
|
|
39
39
|
}
|