Files
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

92 lines
4.7 KiB
Markdown

# @elizaos/plugin-sub-agent-claude-code
Compatibility package for the remote-mode Claude Code sub-agent plugin.
The implementation now lives in `@elizaos/plugin-remote-manifest/sub-agent-claude-code`; this package keeps the historical `@elizaos/plugin-sub-agent-claude-code` imports working.
## What it does
The plugin wraps the `claude` CLI binary in an OS-sandboxed Bun subprocess and exposes session management over host-RPC so an Eliza agent can:
- Spawn a Claude Code session pointed at a workspace directory.
- Send prompts to the session over stdin.
- Read buffered stdout output on demand.
- Terminate the session when done.
Hardening covers SOC2 controls A-2, A-3, and O-8:
- **Env filtering** — only an explicit allowlist of env keys is forwarded to the child process; a blocklist regex drops any credential-shaped keys.
- **CWD validation** — the working directory is resolved via `realpath` and must be under a workspace root or `/tmp`; symlink escapes are rejected.
- **Binary allowlisting** — the `claude` binary is resolved against a static whitelist of directories (`/usr/local/bin`, `/opt/homebrew/bin`, `~/.local/bin`, `~/.bun/bin`, etc.).
- **OS sandboxing** — macOS uses `sandbox-exec` with a Seatbelt profile (`packages/plugin-remote-manifest/sandbox/macos.sb`); Linux uses `bwrap` via `packages/plugin-remote-manifest/sandbox/linux-bwrap.sh`. When neither helper is available the plugin logs a WARN and falls back to allowlist-only.
- **Session transcripts** — each session's I/O is redacted and written to `~/.eliza/sub-agent-sessions/<sessionId>/transcript.log`; an audit event carrying the transcript hash is emitted on termination.
## Installation
This package is `private: true` and intended for use as a workspace dependency within the elizaOS monorepo. It is a wrapper around the implementation in `@elizaos/plugin-remote-manifest/sub-agent-claude-code` and is loaded via the worker-runtime remote-plugin mechanism:
```ts
import { plugin } from "@elizaos/plugin-sub-agent-claude-code";
await runtime.installRemotePlugin(plugin, {
source: { kind: "workspace", pkgName: "@elizaos/plugin-sub-agent-claude-code" },
lifetime: "session",
});
```
## Usage
After installation, obtain the service and call its RPC methods:
```ts
const svc = await runtime.getService("sub-agent.claude-code");
// Spawn a session
const { sessionId } = await svc.createSession({
cwd: "/absolute/path/to/project",
model: "claude-opus-4-5", // optional; defaults to claude CLI default
initialPrompt: "List files in src/",
// Note: ANTHROPIC_API_KEY cannot be passed via extraEnv (filterEnv throws for API_KEY/TOKEN keys).
// The worker reads it from process.env via Bun env permissions.
extraEnv: { ANTHROPIC_BASE_URL: "https://api.anthropic.com" }, // safe non-sensitive key example
});
// Send additional prompts
await svc.sendPrompt({ sessionId, prompt: "Explain the main entry point." });
// Read new output since the last call
const { lines } = await svc.getOutput({ sessionId, mode: "since-last" });
// Read all output buffered so far
const { lines: all } = await svc.getOutput({ sessionId, mode: "all" });
// Terminate
await svc.terminate({ sessionId });
```
## Environment variables
| Variable | Default | Purpose |
|---|---|---|
| `ELIZA_WORKSPACE_DIR` | — | Workspace root; `cwd` passed to `createSession` must be under this (or `ELIZA_STATE_DIR`, or process cwd). |
| `ELIZA_STATE_DIR` | — | State dir; used as workspace root fallback. |
| `ELIZA_SUB_AGENT_SESSIONS_DIR` | `~/.eliza/sub-agent-sessions` | Where session transcript directories are written. |
| `ELIZA_SUB_AGENT_SESSION_RETENTION_DAYS` | `30` | Age threshold for transcript pruning. |
`ANTHROPIC_API_KEY` and `CLAUDE_CODE_OAUTH_TOKEN` are available to the worker process via Bun env permissions declared in the plugin descriptor. They cannot be forwarded to the claude subprocess via `extraEnv``filterEnv` throws for keys matching `SENSITIVE_ENV_RE` (`TOKEN` and `API_KEY` both match). Only non-sensitive keys (e.g. `ANTHROPIC_BASE_URL`) may be passed via `extraEnv`.
## Sandbox smoke tests
See `packages/plugin-remote-manifest/sandbox/SMOKE.md` for manual verification steps confirming the macOS and Linux sandbox profiles block reads outside the workspace root.
## Development
```bash
bun run --cwd packages/plugin-sub-agent-claude-code build
bun run --cwd packages/plugin-sub-agent-claude-code typecheck
bun run --cwd packages/plugin-sub-agent-claude-code test
bun run --cwd packages/plugin-sub-agent-claude-code lint
```
Implementation changes belong in `packages/plugin-remote-manifest/src/sub-agent-claude-code/`; keep this package limited to compatibility re-exports unless the public compatibility surface itself changes.