Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
139 KiB
JSON

{"repo": "aretw0/refarm", "files": {"scripts/tractor-start.sh": {"710ccdc0e08cf159ecedd57fb02c5603e5f4b8cb": {"t": 1785745970.9248116, "n": 8848, "h": "f2cd42c4f8f7df9d", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `refarm runtime stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n # cargo anchors a relative target-dir to the config's directory, not the cwd\n case \"$from_config\" in\n /*) printf \"%s\" \"$from_config\" ;;\n *) printf \"%s\" \"$ROOT/$from_config\" ;;\n esac\n return\n fi\n fi\n printf \"%s\" \"$ROOT/.cache/cargo-target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nAGENT_PLUGIN=\"$_CARGO_TARGET/wasm32-wasip1/release/agent.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_HOME=\"${REFARM_HOME:-$ROOT/.refarm}\"\nXDG_DATA_HOME=\"${XDG_DATA_HOME:-$REFARM_HOME/data}\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$REFARM_HOME/streams}\"\nINSTALLED_AGENT_PLUGIN=\"$REFARM_HOME/plugins/@refarm/agent/plugin.wasm\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If another runtime is running: refarm runtime stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\n# Prefer the INSTALLED agent (in $REFARM_HOME/plugins) over the raw compiled artifact —\n# but only if it is not STALE. A freshly-compiled agent (e.g. after a WIT rename) whose\n# import names moved will not match the daemon's linker, and the daemon would load the old\n# installed copy and fail (`component imports instance ... not found in the linker`). So if\n# the compiled build is newer than the installed copy, reinstall it first. This is the\n# dist-stale guard: source (the compiled wasm) is truth; the install is a derived snapshot.\nif [ -f \"$INSTALLED_AGENT_PLUGIN\" ]; then\n if [ -f \"$AGENT_PLUGIN\" ] && [ \"$AGENT_PLUGIN\" -nt \"$INSTALLED_AGENT_PLUGIN\" ]; then\n echo \" ↻ Installed agent is older than the compiled build — reinstalling…\"\n if [ -f \"$REFARM_CLI\" ]; then\n REFARM_HOME=\"$REFARM_HOME\" CARGO_TARGET_DIR=\"$_CARGO_TARGET\" \\\n node \"$ROOT/scripts/agent-install.mjs\" >/dev/null 2>&1 || true\n fi\n fi\n # Use the installed copy if it (still) exists after the optional reinstall.\n [ -f \"$INSTALLED_AGENT_PLUGIN\" ] && AGENT_PLUGIN=\"$INSTALLED_AGENT_PLUGIN\"\nfi\n\nif [ ! -f \"$AGENT_PLUGIN\" ]; then\n echo \"❌ agent plugin wasm not found at $AGENT_PLUGIN\"\n echo \" Install it with: refarm plugin update\"\n echo \" Build it first: cargo component build --manifest-path packages/agent/Cargo.toml --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell --include-secrets 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai-codex) require_key OPENAI_CODEX_ACCESS_TOKEN ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$AGENT_PLUGIN\")\n\n# Boot the COMPOSITION, not just the agent: load every INSTALLED plugin whose\n# runtime id is trusted (`trusted_plugins` in config.json), minus the agent (loaded\n# above). The resolver owns the JSON parse + trust/dedup rules (and stays silent on\n# error, so a hiccup never blocks the agent-only boot). This is the orchestrator step\n# ADR-059 assigns to the CLI: the Rust host stays imperative `--plugin`; discovery +\n# translation happen here. Requires the built CLI (present after `plugin update`).\nTRUSTED_PLUGINS=()\nif [ -f \"$REFARM_CLI\" ]; then\n while IFS= read -r _p; do\n [ -n \"$_p\" ] && TRUSTED_PLUGINS+=(\"$_p\")\n done < <(node \"$ROOT/scripts/resolve-boot-plugins.mjs\" \"$REFARM_HOME\" 2>/dev/null)\nfi\nfor _p in ${TRUSTED_PLUGINS[@]+\"${TRUSTED_PLUGINS[@]}\"}; do\n TRACTOR_ARGS+=(--plugin \"$_p\")\ndone\n\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(--refarm-dir \"$REFARM_HOME\")\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $AGENT_PLUGIN\"\n[ ${#TRUSTED_PLUGINS[@]} -gt 0 ] && echo \" +trusted : ${#TRUSTED_PLUGINS[@]} plugin(s) from composition\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_HOME\" \"$REFARM_STREAMS_DIR\" \"$XDG_DATA_HOME\"\nexport REFARM_HOME\nexport REFARM_STREAMS_DIR\nexport XDG_DATA_HOME\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : refarm runtime\"\n echo \" Stop runtime : refarm runtime stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "34c8ab79cd50e1749d85348d305738fda62e4273": {"t": 1785758378.411314, "n": 8848, "h": "f2cd42c4f8f7df9d", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `refarm runtime stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n # cargo anchors a relative target-dir to the config's directory, not the cwd\n case \"$from_config\" in\n /*) printf \"%s\" \"$from_config\" ;;\n *) printf \"%s\" \"$ROOT/$from_config\" ;;\n esac\n return\n fi\n fi\n printf \"%s\" \"$ROOT/.cache/cargo-target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nAGENT_PLUGIN=\"$_CARGO_TARGET/wasm32-wasip1/release/agent.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_HOME=\"${REFARM_HOME:-$ROOT/.refarm}\"\nXDG_DATA_HOME=\"${XDG_DATA_HOME:-$REFARM_HOME/data}\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$REFARM_HOME/streams}\"\nINSTALLED_AGENT_PLUGIN=\"$REFARM_HOME/plugins/@refarm/agent/plugin.wasm\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If another runtime is running: refarm runtime stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\n# Prefer the INSTALLED agent (in $REFARM_HOME/plugins) over the raw compiled artifact —\n# but only if it is not STALE. A freshly-compiled agent (e.g. after a WIT rename) whose\n# import names moved will not match the daemon's linker, and the daemon would load the old\n# installed copy and fail (`component imports instance ... not found in the linker`). So if\n# the compiled build is newer than the installed copy, reinstall it first. This is the\n# dist-stale guard: source (the compiled wasm) is truth; the install is a derived snapshot.\nif [ -f \"$INSTALLED_AGENT_PLUGIN\" ]; then\n if [ -f \"$AGENT_PLUGIN\" ] && [ \"$AGENT_PLUGIN\" -nt \"$INSTALLED_AGENT_PLUGIN\" ]; then\n echo \" ↻ Installed agent is older than the compiled build — reinstalling…\"\n if [ -f \"$REFARM_CLI\" ]; then\n REFARM_HOME=\"$REFARM_HOME\" CARGO_TARGET_DIR=\"$_CARGO_TARGET\" \\\n node \"$ROOT/scripts/agent-install.mjs\" >/dev/null 2>&1 || true\n fi\n fi\n # Use the installed copy if it (still) exists after the optional reinstall.\n [ -f \"$INSTALLED_AGENT_PLUGIN\" ] && AGENT_PLUGIN=\"$INSTALLED_AGENT_PLUGIN\"\nfi\n\nif [ ! -f \"$AGENT_PLUGIN\" ]; then\n echo \"❌ agent plugin wasm not found at $AGENT_PLUGIN\"\n echo \" Install it with: refarm plugin update\"\n echo \" Build it first: cargo component build --manifest-path packages/agent/Cargo.toml --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell --include-secrets 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai-codex) require_key OPENAI_CODEX_ACCESS_TOKEN ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$AGENT_PLUGIN\")\n\n# Boot the COMPOSITION, not just the agent: load every INSTALLED plugin whose\n# runtime id is trusted (`trusted_plugins` in config.json), minus the agent (loaded\n# above). The resolver owns the JSON parse + trust/dedup rules (and stays silent on\n# error, so a hiccup never blocks the agent-only boot). This is the orchestrator step\n# ADR-059 assigns to the CLI: the Rust host stays imperative `--plugin`; discovery +\n# translation happen here. Requires the built CLI (present after `plugin update`).\nTRUSTED_PLUGINS=()\nif [ -f \"$REFARM_CLI\" ]; then\n while IFS= read -r _p; do\n [ -n \"$_p\" ] && TRUSTED_PLUGINS+=(\"$_p\")\n done < <(node \"$ROOT/scripts/resolve-boot-plugins.mjs\" \"$REFARM_HOME\" 2>/dev/null)\nfi\nfor _p in ${TRUSTED_PLUGINS[@]+\"${TRUSTED_PLUGINS[@]}\"}; do\n TRACTOR_ARGS+=(--plugin \"$_p\")\ndone\n\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(--refarm-dir \"$REFARM_HOME\")\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $AGENT_PLUGIN\"\n[ ${#TRUSTED_PLUGINS[@]} -gt 0 ] && echo \" +trusted : ${#TRUSTED_PLUGINS[@]} plugin(s) from composition\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_HOME\" \"$REFARM_STREAMS_DIR\" \"$XDG_DATA_HOME\"\nexport REFARM_HOME\nexport REFARM_STREAMS_DIR\nexport XDG_DATA_HOME\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : refarm runtime\"\n echo \" Stop runtime : refarm runtime stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "7850d4a1f75a1e8468d9c07d739ad26c56ec1827": {"t": 1785758379.5980294, "n": 8673, "h": "bfdb5b8e63460842", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `refarm runtime stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nAGENT_PLUGIN=\"$_CARGO_TARGET/wasm32-wasip1/release/agent.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_HOME=\"${REFARM_HOME:-$ROOT/.refarm}\"\nXDG_DATA_HOME=\"${XDG_DATA_HOME:-$REFARM_HOME/data}\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$REFARM_HOME/streams}\"\nINSTALLED_AGENT_PLUGIN=\"$REFARM_HOME/plugins/@refarm/agent/plugin.wasm\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If another runtime is running: refarm runtime stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\n# Prefer the INSTALLED agent (in $REFARM_HOME/plugins) over the raw compiled artifact —\n# but only if it is not STALE. A freshly-compiled agent (e.g. after a WIT rename) whose\n# import names moved will not match the daemon's linker, and the daemon would load the old\n# installed copy and fail (`component imports instance ... not found in the linker`). So if\n# the compiled build is newer than the installed copy, reinstall it first. This is the\n# dist-stale guard: source (the compiled wasm) is truth; the install is a derived snapshot.\nif [ -f \"$INSTALLED_AGENT_PLUGIN\" ]; then\n if [ -f \"$AGENT_PLUGIN\" ] && [ \"$AGENT_PLUGIN\" -nt \"$INSTALLED_AGENT_PLUGIN\" ]; then\n echo \" ↻ Installed agent is older than the compiled build — reinstalling…\"\n if [ -f \"$REFARM_CLI\" ]; then\n REFARM_HOME=\"$REFARM_HOME\" CARGO_TARGET_DIR=\"$_CARGO_TARGET\" \\\n node \"$ROOT/scripts/agent-install.mjs\" >/dev/null 2>&1 || true\n fi\n fi\n # Use the installed copy if it (still) exists after the optional reinstall.\n [ -f \"$INSTALLED_AGENT_PLUGIN\" ] && AGENT_PLUGIN=\"$INSTALLED_AGENT_PLUGIN\"\nfi\n\nif [ ! -f \"$AGENT_PLUGIN\" ]; then\n echo \"❌ agent plugin wasm not found at $AGENT_PLUGIN\"\n echo \" Install it with: refarm plugin update\"\n echo \" Build it first: cargo component build --manifest-path packages/agent/Cargo.toml --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell --include-secrets 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai-codex) require_key OPENAI_CODEX_ACCESS_TOKEN ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$AGENT_PLUGIN\")\n\n# Boot the COMPOSITION, not just the agent: load every INSTALLED plugin whose\n# runtime id is trusted (`trusted_plugins` in config.json), minus the agent (loaded\n# above). The resolver owns the JSON parse + trust/dedup rules (and stays silent on\n# error, so a hiccup never blocks the agent-only boot). This is the orchestrator step\n# ADR-059 assigns to the CLI: the Rust host stays imperative `--plugin`; discovery +\n# translation happen here. Requires the built CLI (present after `plugin update`).\nTRUSTED_PLUGINS=()\nif [ -f \"$REFARM_CLI\" ]; then\n while IFS= read -r _p; do\n [ -n \"$_p\" ] && TRUSTED_PLUGINS+=(\"$_p\")\n done < <(node \"$ROOT/scripts/resolve-boot-plugins.mjs\" \"$REFARM_HOME\" 2>/dev/null)\nfi\nfor _p in ${TRUSTED_PLUGINS[@]+\"${TRUSTED_PLUGINS[@]}\"}; do\n TRACTOR_ARGS+=(--plugin \"$_p\")\ndone\n\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(--refarm-dir \"$REFARM_HOME\")\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $AGENT_PLUGIN\"\n[ ${#TRUSTED_PLUGINS[@]} -gt 0 ] && echo \" +trusted : ${#TRUSTED_PLUGINS[@]} plugin(s) from composition\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_HOME\" \"$REFARM_STREAMS_DIR\" \"$XDG_DATA_HOME\"\nexport REFARM_HOME\nexport REFARM_STREAMS_DIR\nexport XDG_DATA_HOME\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : refarm runtime\"\n echo \" Stop runtime : refarm runtime stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "51c094c2b928056f33d8c60154d148f2d17ba515": {"t": 1785758381.8884559, "n": 7756, "h": "a4506c6263aa2d92", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `refarm runtime stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nAGENT_PLUGIN=\"$_CARGO_TARGET/wasm32-wasip1/release/agent.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_HOME=\"${REFARM_HOME:-$ROOT/.refarm}\"\nXDG_DATA_HOME=\"${XDG_DATA_HOME:-$REFARM_HOME/data}\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$REFARM_HOME/streams}\"\nINSTALLED_AGENT_PLUGIN=\"$REFARM_HOME/plugins/@refarm/agent/plugin.wasm\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If another runtime is running: refarm runtime stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\n# Prefer the INSTALLED agent (in $REFARM_HOME/plugins) over the raw compiled artifact —\n# but only if it is not STALE. A freshly-compiled agent (e.g. after a WIT rename) whose\n# import names moved will not match the daemon's linker, and the daemon would load the old\n# installed copy and fail (`component imports instance ... not found in the linker`). So if\n# the compiled build is newer than the installed copy, reinstall it first. This is the\n# dist-stale guard: source (the compiled wasm) is truth; the install is a derived snapshot.\nif [ -f \"$INSTALLED_AGENT_PLUGIN\" ]; then\n if [ -f \"$AGENT_PLUGIN\" ] && [ \"$AGENT_PLUGIN\" -nt \"$INSTALLED_AGENT_PLUGIN\" ]; then\n echo \" ↻ Installed agent is older than the compiled build — reinstalling…\"\n if [ -f \"$REFARM_CLI\" ]; then\n REFARM_HOME=\"$REFARM_HOME\" CARGO_TARGET_DIR=\"$_CARGO_TARGET\" \\\n node \"$ROOT/scripts/agent-install.mjs\" >/dev/null 2>&1 || true\n fi\n fi\n # Use the installed copy if it (still) exists after the optional reinstall.\n [ -f \"$INSTALLED_AGENT_PLUGIN\" ] && AGENT_PLUGIN=\"$INSTALLED_AGENT_PLUGIN\"\nfi\n\nif [ ! -f \"$AGENT_PLUGIN\" ]; then\n echo \"❌ agent plugin wasm not found at $AGENT_PLUGIN\"\n echo \" Install it with: refarm plugin update\"\n echo \" Build it first: cargo component build --manifest-path packages/agent/Cargo.toml --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell --include-secrets 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai-codex) require_key OPENAI_CODEX_ACCESS_TOKEN ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$AGENT_PLUGIN\")\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(--refarm-dir \"$REFARM_HOME\")\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $AGENT_PLUGIN\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_HOME\" \"$REFARM_STREAMS_DIR\" \"$XDG_DATA_HOME\"\nexport REFARM_HOME\nexport REFARM_STREAMS_DIR\nexport XDG_DATA_HOME\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : refarm runtime\"\n echo \" Stop runtime : refarm runtime stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "ba36c741170b4d92148f2e6e04580da88f464b31": {"t": 1785758383.2221417, "n": 6750, "h": "afdd4db55d951eea", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `refarm runtime stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nAGENT_PLUGIN=\"$_CARGO_TARGET/wasm32-wasip1/release/agent.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_HOME=\"${REFARM_HOME:-$ROOT/.refarm}\"\nXDG_DATA_HOME=\"${XDG_DATA_HOME:-$REFARM_HOME/data}\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$REFARM_HOME/streams}\"\nINSTALLED_AGENT_PLUGIN=\"$REFARM_HOME/plugins/@refarm/agent/plugin.wasm\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If another runtime is running: refarm runtime stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\nif [ -f \"$INSTALLED_AGENT_PLUGIN\" ]; then\n AGENT_PLUGIN=\"$INSTALLED_AGENT_PLUGIN\"\nfi\n\nif [ ! -f \"$AGENT_PLUGIN\" ]; then\n echo \"❌ agent plugin wasm not found at $AGENT_PLUGIN\"\n echo \" Install it with: refarm plugin update\"\n echo \" Build it first: cargo component build --manifest-path packages/agent/Cargo.toml --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell --include-secrets 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai-codex) require_key OPENAI_CODEX_ACCESS_TOKEN ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$AGENT_PLUGIN\")\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(--refarm-dir \"$REFARM_HOME\")\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $AGENT_PLUGIN\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_HOME\" \"$REFARM_STREAMS_DIR\" \"$XDG_DATA_HOME\"\nexport REFARM_HOME\nexport REFARM_STREAMS_DIR\nexport XDG_DATA_HOME\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : refarm runtime\"\n echo \" Stop runtime : refarm runtime stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "d84c3b93706ddeac1b955e92c5bf92f69d9b8175": {"t": 1785758384.8015895, "n": 6762, "h": "6aa189102133eb6c", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with pi-agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `refarm runtime stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nAGENT_PLUGIN=\"$_CARGO_TARGET/wasm32-wasip1/release/pi_agent.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_HOME=\"${REFARM_HOME:-$ROOT/.refarm}\"\nXDG_DATA_HOME=\"${XDG_DATA_HOME:-$REFARM_HOME/data}\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$REFARM_HOME/streams}\"\nINSTALLED_AGENT_PLUGIN=\"$REFARM_HOME/plugins/@refarm/pi-agent/plugin.wasm\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If another runtime is running: refarm runtime stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\nif [ -f \"$INSTALLED_AGENT_PLUGIN\" ]; then\n AGENT_PLUGIN=\"$INSTALLED_AGENT_PLUGIN\"\nfi\n\nif [ ! -f \"$AGENT_PLUGIN\" ]; then\n echo \"❌ agent plugin wasm not found at $AGENT_PLUGIN\"\n echo \" Install it with: refarm plugin update\"\n echo \" Build it first: cargo component build --manifest-path packages/pi-agent/Cargo.toml --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell --include-secrets 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai-codex) require_key OPENAI_CODEX_ACCESS_TOKEN ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$AGENT_PLUGIN\")\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(--refarm-dir \"$REFARM_HOME\")\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $AGENT_PLUGIN\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_HOME\" \"$REFARM_STREAMS_DIR\" \"$XDG_DATA_HOME\"\nexport REFARM_HOME\nexport REFARM_STREAMS_DIR\nexport XDG_DATA_HOME\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : refarm runtime\"\n echo \" Stop runtime : refarm runtime stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "dae1e90d95512b6c91a01a11f5e18e630b05d2d3": {"t": 1785758386.2460856, "n": 6911, "h": "c0b610d18ebd5765", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with pi-agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `refarm sow` to configure them.\n# Run `<package-manager> run agent:stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nPACKAGE_MANAGER_HELPER=\"$ROOT/scripts/package-manager.sh\"\nMODEL_PROVIDER_HELPER=\"$ROOT/scripts/model-provider.sh\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nPI_AGENT=\"$_CARGO_TARGET/wasm32-wasip1/release/pi_agent.wasm\"\nINSTALLED_PI_AGENT=\"$HOME/.refarm/plugins/@refarm/pi-agent/plugin.wasm\"\nREFARM_CLI=\"$ROOT/apps/refarm/dist/index.js\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$HOME/.refarm/streams}\"\nREFARM_HTTP_HOST=\"${REFARM_HTTP_HOST:-}\"\n\nif [ -z \"$REFARM_HTTP_HOST\" ]; then\n if [ -f \"/.dockerenv\" ]; then\n REFARM_HTTP_HOST=\"0.0.0.0\"\n else\n REFARM_HTTP_HOST=\"127.0.0.1\"\n fi\nfi\n\nif [ ! -f \"$PACKAGE_MANAGER_HELPER\" ]; then\n echo \"❌ package manager helper not found: $PACKAGE_MANAGER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$PACKAGE_MANAGER_HELPER\"\n\nif [ ! -f \"$MODEL_PROVIDER_HELPER\" ]; then\n echo \"❌ model provider helper not found: $MODEL_PROVIDER_HELPER\"\n exit 1\nfi\n\n# shellcheck disable=SC1090\nsource \"$MODEL_PROVIDER_HELPER\"\n\nPACKAGE_MANAGER=\"$(resolve_package_manager \"$ROOT\")\"\n\nscript_command() {\n local script=\"$1\"\n script_command_for_package_manager \"$PACKAGE_MANAGER\" \"$script\"\n}\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If farmhand is running: $(script_command farmhand:stop)\"\n echo \" If another tractor is running: $(script_command agent:stop)\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cargo build --manifest-path packages/tractor/Cargo.toml --release\"\n exit 1\nfi\n\nif [ ! -f \"$PI_AGENT\" ]; then\n echo \"❌ pi_agent.wasm not found at $PI_AGENT\"\n echo \" Build it first: cargo component build --manifest-path packages/pi-agent/Cargo.toml --release\"\n exit 1\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n node \"$REFARM_CLI\" plugin update --json >/dev/null 2>&1 || true\nfi\n\nif [ -f \"$INSTALLED_PI_AGENT\" ]; then\n PI_AGENT=\"$INSTALLED_PI_AGENT\"\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n MODEL_PROVIDER=\"$(resolve_refarm_model_provider \"$ROOT\")\"\n export MODEL_PROVIDER\nfi\n\nif [ -f \"$REFARM_CLI\" ]; then\n _model_env_exports=\"$(node \"$REFARM_CLI\" model env --shell 2>/dev/null || true)\"\n if [ -n \"$_model_env_exports\" ]; then\n eval \"$_model_env_exports\"\n fi\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\nHAS_HTTP_HOST=0\nfor arg in \"$@\"; do\n case \"$arg\" in\n --http-host|--http-host=*) HAS_HTTP_HOST=1 ;;\n esac\ndone\n\nTRACTOR_ARGS=(--plugin \"$PI_AGENT\")\nif [ \"$HAS_HTTP_HOST\" = \"0\" ]; then\n TRACTOR_ARGS+=(--http-host \"$REFARM_HTTP_HOST\")\nfi\nTRACTOR_ARGS+=(\"$@\")\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $PI_AGENT\"\necho \" streams : $REFARM_STREAMS_DIR\"\necho \" http bind: $REFARM_HTTP_HOST:42001\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_STREAMS_DIR\"\nexport REFARM_STREAMS_DIR\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : $(script_command agent:status)\"\n echo \" Stop daemon : $(script_command agent:stop)\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" \"${TRACTOR_ARGS[@]}\"\nfi\n"}, "06845fe694e1405ac20b78aa06742a77773c3ad9": {"t": 1785758387.4358823, "n": 5663, "h": "d8adab35df49dcc2", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with pi-agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# MODEL_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `npm run agent:keys` to configure them.\n# Run `npm run agent:stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nPI_AGENT=\"$_CARGO_TARGET/wasm32-wasip1/release/pi_agent.wasm\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$HOME/.refarm/streams}\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If farmhand is running: npm run farmhand:stop\"\n echo \" If another tractor is running: npm run agent:stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cd packages/tractor && cargo build --release\"\n exit 1\nfi\n\nif [ ! -f \"$PI_AGENT\" ]; then\n echo \"❌ pi_agent.wasm not found at $PI_AGENT\"\n echo \" Build it first: cd packages/pi-agent && cargo component build --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: refarm sow\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\n# Priority: MODEL_PROVIDER env > .refarm/config.json provider field > ollama (sovereign default)\nif [ -z \"${MODEL_PROVIDER:-}\" ]; then\n CONFIG=\"$ROOT/.refarm/config.json\"\n if [ -f \"$CONFIG\" ] && command -v node >/dev/null 2>&1; then\n PROVIDER_FROM_CONFIG=$(node -e \"try{const c=JSON.parse(require('fs').readFileSync('$CONFIG','utf8'));process.stdout.write(c.provider||'')}catch{}\" 2>/dev/null || true)\n if [ -n \"$PROVIDER_FROM_CONFIG\" ]; then\n export MODEL_PROVIDER=\"$PROVIDER_FROM_CONFIG\"\n fi\n fi\n MODEL_PROVIDER=\"${MODEL_PROVIDER:-ollama}\"\n export MODEL_PROVIDER\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" MODEL_PROVIDER=$MODEL_PROVIDER but $var is not set.\"\n echo \" Configure keys with: refarm sow\"\n exit 1\n fi\n}\n\ncase \"$MODEL_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" MODEL_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\necho \" Starting tractor daemon\"\necho \" provider : $MODEL_PROVIDER\"\necho \" plugin : $PI_AGENT\"\necho \" streams : $REFARM_STREAMS_DIR\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_STREAMS_DIR\"\nexport REFARM_STREAMS_DIR\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" --plugin \"$PI_AGENT\" \"$@\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : npm run agent:status\"\n echo \" Stop daemon : npm run agent:stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" --plugin \"$PI_AGENT\" \"$@\"\nfi\n"}, "548c472d5188b6c4fd58c566d9f247abcc91ed45": {"t": 1785758390.884691, "n": 5652, "h": "1ffe4ae151e0f621", "c": "#!/usr/bin/env bash\n# tractor-start.sh — start the tractor daemon with pi-agent, auto-loading .refarm/.env\n#\n# Usage:\n# ./scripts/tractor-start.sh # foreground (default)\n# ./scripts/tractor-start.sh --background # background with PID file\n# ./scripts/tractor-start.sh --namespace myproject # custom namespace\n# LLM_PROVIDER=openai ./scripts/tractor-start.sh # override provider\n#\n# Keys are loaded from .refarm/.env (gitignored).\n# Run `npm run agent:keys` to configure them.\n# Run `npm run agent:stop` to stop a backgrounded daemon.\n\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nENV_FILE=\"$ROOT/.refarm/.env\"\nPID_FILE=\"$ROOT/.refarm/tractor.pid\"\nLOG_FILE=\"$ROOT/.refarm/tractor.log\"\n\n# ── resolve CARGO_TARGET_DIR: env → .cargo/config.toml → workspace fallback ──\n\nresolve_cargo_target() {\n if [ -n \"${CARGO_TARGET_DIR:-}\" ]; then\n printf \"%s\" \"$CARGO_TARGET_DIR\"\n return\n fi\n local config=\"$ROOT/.cargo/config.toml\"\n if [ -f \"$config\" ]; then\n local from_config\n from_config=\"$(grep -m1 '^\\s*target-dir\\s*=' \"$config\" | sed 's/.*=\\s*\"\\(.*\\)\"/\\1/')\"\n if [ -n \"$from_config\" ]; then\n printf \"%s\" \"$from_config\"\n return\n fi\n fi\n printf \"%s\" \"$ROOT/packages/tractor/target\"\n}\n\n_CARGO_TARGET=\"$(resolve_cargo_target)\"\nTRACTOR=\"$_CARGO_TARGET/release/tractor\"\nPI_AGENT=\"$_CARGO_TARGET/wasm32-wasip1/release/pi_agent.wasm\"\nREFARM_STREAMS_DIR=\"${REFARM_STREAMS_DIR:-$HOME/.refarm/streams}\"\n\n# ── parse --background flag (strip before forwarding to tractor) ──────────────\n\nBACKGROUND=0\nFORWARDED_ARGS=()\nfor arg in \"$@\"; do\n if [ \"$arg\" = \"--background\" ]; then\n BACKGROUND=1\n else\n FORWARDED_ARGS+=(\"$arg\")\n fi\ndone\nset -- \"${FORWARDED_ARGS[@]+\"${FORWARDED_ARGS[@]}\"}\"\n\n# ── port pre-check ────────────────────────────────────────────────────────────\n\n_port_pid() {\n ss -tlnp 2>/dev/null \\\n | { grep \":${1}\" || true; } \\\n | { grep -o 'pid=[0-9]*' || true; } \\\n | cut -d= -f2 \\\n | head -1\n}\n\n_existing=\"$(_port_pid 42000)\"\nif [ -n \"$_existing\" ]; then\n echo \"❌ Port 42000 is already bound by PID $_existing.\"\n echo \" If farmhand is running: npm run farmhand:stop\"\n echo \" If another tractor is running: npm run agent:stop\"\n echo \" See: docs/PROCESS_PLAYBOOK.md\"\n exit 1\nfi\n\n# ── preflight checks ──────────────────────────────────────────────────────────\n\nif [ ! -f \"$TRACTOR\" ]; then\n echo \"❌ tractor binary not found at $TRACTOR\"\n echo \" Build it first: cd packages/tractor && cargo build --release\"\n exit 1\nfi\n\nif [ ! -f \"$PI_AGENT\" ]; then\n echo \"❌ pi_agent.wasm not found at $PI_AGENT\"\n echo \" Build it first: cd packages/pi-agent && cargo component build --release\"\n exit 1\nfi\n\n# ── load .refarm/.env ─────────────────────────────────────────────────────────\n\nif [ -f \"$ENV_FILE\" ]; then\n set -a\n # shellcheck disable=SC1090\n source \"$ENV_FILE\"\n set +a\nelse\n echo \"⚠ No .refarm/.env found. LLM calls may fail without API keys.\"\n echo \" Run: node scripts/setup-llm-keys.mjs\"\nfi\n\n# ── provider selection ────────────────────────────────────────────────────────\n\n# Priority: LLM_PROVIDER env > .refarm/config.json provider field > ollama (sovereign default)\nif [ -z \"${LLM_PROVIDER:-}\" ]; then\n CONFIG=\"$ROOT/.refarm/config.json\"\n if [ -f \"$CONFIG\" ] && command -v node >/dev/null 2>&1; then\n PROVIDER_FROM_CONFIG=$(node -e \"try{const c=JSON.parse(require('fs').readFileSync('$CONFIG','utf8'));process.stdout.write(c.provider||'')}catch{}\" 2>/dev/null || true)\n if [ -n \"$PROVIDER_FROM_CONFIG\" ]; then\n export LLM_PROVIDER=\"$PROVIDER_FROM_CONFIG\"\n fi\n fi\n LLM_PROVIDER=\"${LLM_PROVIDER:-ollama}\"\n export LLM_PROVIDER\nfi\n\n# ── key check ─────────────────────────────────────────────────────────────────\n\nrequire_key() {\n local var=\"$1\"\n if [ -z \"${!var:-}\" ]; then\n echo \" LLM_PROVIDER=$LLM_PROVIDER but $var is not set.\"\n echo \" Run: npm run agent:keys\"\n exit 1\n fi\n}\n\ncase \"$LLM_PROVIDER\" in\n anthropic) require_key ANTHROPIC_API_KEY ;;\n openai*) require_key OPENAI_API_KEY ;;\n groq) require_key GROQ_API_KEY ;;\n mistral) require_key MISTRAL_API_KEY ;;\n xai) require_key XAI_API_KEY ;;\n deepseek) require_key DEEPSEEK_API_KEY ;;\n together) require_key TOGETHER_API_KEY ;;\n openrouter) require_key OPENROUTER_API_KEY ;;\n gemini) require_key GEMINI_API_KEY ;;\n ollama)\n echo \" LLM_PROVIDER=ollama (sovereign default — no API key needed)\"\n echo \" Ensure Ollama is running: ollama serve\"\n ;;\nesac\n\n# ── start daemon ──────────────────────────────────────────────────────────────\n\necho \" Starting tractor daemon\"\necho \" provider : $LLM_PROVIDER\"\necho \" plugin : $PI_AGENT\"\necho \" streams : $REFARM_STREAMS_DIR\"\n[ $# -gt 0 ] && echo \" extra : $*\"\n\nmkdir -p \"$(dirname \"$PID_FILE\")\" \"$REFARM_STREAMS_DIR\"\nexport REFARM_STREAMS_DIR\n\nif [ \"$BACKGROUND\" = \"1\" ]; then\n # Kill any existing daemon from a previous run\n if [ -f \"$PID_FILE\" ]; then\n OLD_PID=\"$(cat \"$PID_FILE\" 2>/dev/null || true)\"\n if [ -n \"$OLD_PID\" ] && kill -0 \"$OLD_PID\" 2>/dev/null; then\n echo \" Stopping previous daemon (pid $OLD_PID)...\"\n kill \"$OLD_PID\" 2>/dev/null || true\n sleep 0.5\n fi\n rm -f \"$PID_FILE\"\n fi\n\n echo \" Log : $LOG_FILE\"\n nohup \"$TRACTOR\" --plugin \"$PI_AGENT\" \"$@\" > \"$LOG_FILE\" 2>&1 &\n echo $! > \"$PID_FILE\"\n echo \" Started : pid $(cat \"$PID_FILE\")\"\n echo \"\"\n echo \" Check status : npm run agent:status\"\n echo \" Stop daemon : npm run agent:stop\"\n echo \" Follow log : tail -f $LOG_FILE\"\nelse\n echo \"\"\n exec \"$TRACTOR\" --plugin \"$PI_AGENT\" \"$@\"\nfi\n"}}, "apps/refarm/src/commands/session-launch.test.ts": {"710ccdc0e08cf159ecedd57fb02c5603e5f4b8cb": {"t": 1786068275.0757802, "n": 33147, "h": "9482dadb93d45e4d", "c": "import { createScriptedOperatorChannel } from \"@refarm.dev/prompt-contract-v1\";\nimport { mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n\tautoStartFarmhand,\n\tautoStartRuntime,\n\tcheckSessionReadiness,\n\tisFirstRun,\n\tisRuntimeRunning,\n\tisSessionReady,\n\tprintSessionGuide,\n\treadAutostartMode,\n\treadTractorEngineMode,\n\trefarmSearchDirs,\n\tresolveLaunchRuntime,\n\ttype LaunchDeps,\n} from \"./session-launch.js\";\n\nlet stdoutWriteSpy: ReturnType<typeof vi.spyOn>;\nlet stderrWriteSpy: ReturnType<typeof vi.spyOn>;\nlet consoleErrorSpy: ReturnType<typeof vi.spyOn>;\nconst providerEnvKeys = [\n\t\"MODEL_PROVIDER\",\n\t\"MODEL_DEFAULT_PROVIDER\",\n\t\"OPENAI_API_KEY\",\n\t\"OPENAI_CODEX_ACCESS_TOKEN\",\n\t\"GITHUB_COPILOT_ACCESS_TOKEN\",\n\t\"ANTHROPIC_API_KEY\",\n\t\"GROQ_API_KEY\",\n\t\"MISTRAL_API_KEY\",\n\t\"GEMINI_API_KEY\",\n\t\"XAI_API_KEY\",\n\t\"DEEPSEEK_API_KEY\",\n\t\"TOGETHER_API_KEY\",\n\t\"OPENROUTER_API_KEY\",\n] as const;\nconst originalProviderEnv = Object.fromEntries(\n\tproviderEnvKeys.map((key) => [key, process.env[key]]),\n) as Record<(typeof providerEnvKeys)[number], string | undefined>;\nconst originalRefarmHome = process.env.REFARM_HOME;\n\nbeforeEach(() => {\n\tfor (const key of providerEnvKeys) {\n\t\tdelete process.env[key];\n\t}\n\tdelete process.env.REFARM_HOME;\n\tstdoutWriteSpy = vi.spyOn(process.stdout, \"write\").mockImplementation(() => true);\n\tstderrWriteSpy = vi.spyOn(process.stderr, \"write\").mockImplementation(() => true);\n\tconsoleErrorSpy = vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n});\n\nafterEach(() => {\n\tfor (const key of providerEnvKeys) {\n\t\tconst value = originalProviderEnv[key];\n\t\tif (value === undefined) {\n\t\t\tdelete process.env[key];\n\t\t} else {\n\t\t\tprocess.env[key] = value;\n\t\t}\n\t}\n\tif (originalRefarmHome === undefined) {\n\t\tdelete process.env.REFARM_HOME;\n\t} else {\n\t\tprocess.env.REFARM_HOME = originalRefarmHome;\n\t}\n\tstdoutWriteSpy.mockRestore();\n\tstderrWriteSpy.mockRestore();\n\tconsoleErrorSpy.mockRestore();\n});\n\ndescribe(\"isSessionReady\", () => {\n\tit(\"returns true when both provider and farmhand are ready\", () => {\n\t\texpect(isSessionReady({ providerConfigured: true, farmhandRunning: true })).toBe(true);\n\t});\n\n\tit(\"uses runtimeRunning as the canonical readiness field\", () => {\n\t\texpect(isSessionReady({ providerConfigured: true, runtimeRunning: true })).toBe(true);\n\t\texpect(\n\t\t\tisRuntimeRunning({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: true,\n\t\t\t}),\n\t\t).toBe(false);\n\t});\n\n\tit(\"returns false when the runtime is not running\", () => {\n\t\texpect(isSessionReady({ providerConfigured: true, farmhandRunning: false })).toBe(false);\n\t});\n\n\tit(\"returns false when provider is not configured\", () => {\n\t\texpect(isSessionReady({ providerConfigured: false, farmhandRunning: true })).toBe(false);\n\t});\n\n\tit(\"returns false when neither is ready\", () => {\n\t\texpect(isSessionReady({ providerConfigured: false, farmhandRunning: false })).toBe(false);\n\t});\n});\n\ndescribe(\"isFirstRun\", () => {\n\tconst originalHome = process.env.HOME;\n\tlet cwdSpy: ReturnType<typeof vi.spyOn>;\n\n\tbeforeEach(() => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\tcwdSpy = vi.spyOn(process, \"cwd\").mockReturnValue(\"/tmp/refarm-test-cwd-nonexistent\");\n\t});\n\n\tafterEach(() => {\n\t\tdelete process.env.REFARM_FARMHAND_AUTOSTART;\n\t\tdelete process.env.REFARM_RUNTIME_AUTOSTART;\n\t\tprocess.env.HOME = originalHome;\n\t\tcwdSpy.mockRestore();\n\t});\n\n\tit(\"returns true when neither home nor project-local .refarm exist\", () => {\n\t\texpect(isFirstRun()).toBe(true);\n\t});\n\n\tit(\"returns false when project-local .refarm/config.json exists\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-test-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({ provider: \"anthropic\" }));\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\n\t\ttry {\n\t\t\texpect(isFirstRun()).toBe(false);\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"returns false when a Silo identity exists\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-test-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(refarmDir, \"identity.json\"),\n\t\t\tJSON.stringify({ tokens: { modelProvider: \"openai\" } }),\n\t\t);\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\n\t\ttry {\n\t\t\texpect(isFirstRun()).toBe(false);\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n});\n\ndescribe(\"refarmSearchDirs\", () => {\n\tit(\"includes home dir and cwd-based dir\", () => {\n\t\tconst dirs = refarmSearchDirs();\n\t\texpect(dirs.some((d) => d.includes(\".refarm\"))).toBe(true);\n\t\texpect(dirs.length).toBeGreaterThanOrEqual(2);\n\t});\n\n\tit(\"prefers REFARM_HOME when present\", () => {\n\t\tconst refarmHome = join(tmpdir(), `refarm-home-${Date.now()}`);\n\t\tprocess.env.REFARM_HOME = refarmHome;\n\t\tconst dirs = refarmSearchDirs();\n\t\texpect(dirs[0]).toBe(refarmHome);\n\t});\n});\n\ndescribe(\"checkSessionReadiness\", () => {\n\tconst originalHome = process.env.HOME;\n\tconst originalModelProvider = process.env.MODEL_PROVIDER;\n\tlet cwdSpy: ReturnType<typeof vi.spyOn>;\n\tconst originalModelDefaultProvider = process.env.MODEL_DEFAULT_PROVIDER;\n\tconst originalOpenAiKey = process.env.OPENAI_API_KEY;\n\n\tbeforeEach(() => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\tdelete process.env.MODEL_PROVIDER;\n\t\tdelete process.env.MODEL_DEFAULT_PROVIDER;\n\t\tdelete process.env.OPENAI_API_KEY;\n\t\tcwdSpy = vi.spyOn(process, \"cwd\").mockReturnValue(\"/tmp/refarm-test-cwd-nonexistent\");\n\t});\n\n\tafterEach(() => {\n\t\tprocess.env.HOME = originalHome;\n\t\tif (originalModelProvider === undefined) {\n\t\t\tdelete process.env.MODEL_PROVIDER;\n\t\t} else {\n\t\t\tprocess.env.MODEL_PROVIDER = originalModelProvider;\n\t\t}\n\t\tif (originalModelDefaultProvider === undefined) {\n\t\t\tdelete process.env.MODEL_DEFAULT_PROVIDER;\n\t\t} else {\n\t\t\tprocess.env.MODEL_DEFAULT_PROVIDER = originalModelDefaultProvider;\n\t\t}\n\t\tif (originalOpenAiKey === undefined) {\n\t\t\tdelete process.env.OPENAI_API_KEY;\n\t\t} else {\n\t\t\tprocess.env.OPENAI_API_KEY = originalOpenAiKey;\n\t\t}\n\t\tcwdSpy.mockRestore();\n\t\tvi.unstubAllGlobals();\n\t});\n\n\tit(\"recognizes MODEL_DEFAULT_PROVIDER with its credential env as configured\", async () => {\n\t\tprocess.env.MODEL_DEFAULT_PROVIDER = \"openai\";\n\t\tprocess.env.OPENAI_API_KEY = \"sk-test\";\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\tproviderConfigured: true,\n\t\t\truntimeRunning: false,\n\t\t\tfarmhandRunning: false,\n\t\t});\n\t});\n\n\tit(\"does not treat a credential-only provider env as configured without credentials\", async () => {\n\t\tprocess.env.MODEL_DEFAULT_PROVIDER = \"openai\";\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\tproviderConfigured: false,\n\t\t\truntimeRunning: false,\n\t\t\tfarmhandRunning: false,\n\t\t});\n\t});\n\n\tit(\"recognizes the default provider credential env without an explicit provider\", async () => {\n\t\tprocess.env.OPENAI_API_KEY = \"sk-test\";\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\tproviderConfigured: true,\n\t\t\truntimeRunning: false,\n\t\t\tfarmhandRunning: false,\n\t\t});\n\t});\n\n\tit(\"recognizes a default provider credential from .refarm/.env\", async () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \".env\"), \"OPENAI_API_KEY=sk-test\\n\");\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"does not treat an unrelated credential-only .env as a chosen provider, but stays ready via the ollama floor\", async () => {\n\t\t// A stray GEMINI_API_KEY with no MODEL_PROVIDER does NOT make gemini the\n\t\t// chosen provider (evidence \"none\", not \"declared-missing\"). Since nothing\n\t\t// was chosen anywhere, the keyless ollama floor makes the session ready —\n\t\t// the negative (gemini is not activated) still holds.\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \".env\"), \"GEMINI_API_KEY=gemini-test\\n\");\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"recognizes a Silo identity with an API key as a configured provider\", async () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(refarmDir, \"identity.json\"),\n\t\t\tJSON.stringify({\n\t\t\t\ttokens: { modelProvider: \"openai\", modelApiKey: \"sk-test\" },\n\t\t\t}),\n\t\t);\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"recognizes subscription OAuth identity from REFARM_HOME\", async () => {\n\t\tconst refarmHome = join(tmpdir(), `refarm-home-readiness-${Date.now()}`);\n\t\tmkdirSync(refarmHome, { recursive: true });\n\t\tprocess.env.REFARM_HOME = refarmHome;\n\t\twriteFileSync(\n\t\t\tjoin(refarmHome, \"identity.json\"),\n\t\t\tJSON.stringify({\n\t\t\t\ttokens: {\n\t\t\t\t\tmodelProvider: \"openai-codex\",\n\t\t\t\t\toauthProvider: \"openai-codex\",\n\t\t\t\t\toauthCredentials: {\n\t\t\t\t\t\t\"openai-codex\": { access: \"oauth-access-test\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(refarmHome, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"continues searching identity credentials when MODEL_PROVIDER is set\", async () => {\n\t\tconst refarmHome = join(tmpdir(), `refarm-home-readiness-${Date.now()}`);\n\t\tmkdirSync(refarmHome, { recursive: true });\n\t\tprocess.env.REFARM_HOME = refarmHome;\n\t\tprocess.env.MODEL_PROVIDER = \"openai-codex\";\n\t\twriteFileSync(\n\t\t\tjoin(refarmHome, \"identity.json\"),\n\t\t\tJSON.stringify({\n\t\t\t\ttokens: {\n\t\t\t\t\tmodelProvider: \"openai-codex\",\n\t\t\t\t\toauthProvider: \"openai-codex\",\n\t\t\t\t\toauthCredentials: {\n\t\t\t\t\t\t\"openai-codex\": { access: \"oauth-access-test\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(refarmHome, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"does not treat a Silo identity provider as configured without credentials\", async () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(refarmDir, \"identity.json\"),\n\t\t\tJSON.stringify({ tokens: { modelProvider: \"openai\" } }),\n\t\t);\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: false,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"recognizes modelProvider with modelApiKey in config.json as a configured provider\", async () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(refarmDir, \"config.json\"),\n\t\t\tJSON.stringify({ modelProvider: \"openai\", modelApiKey: \"sk-test\" }),\n\t\t);\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"does not use nested credentials for a different config provider\", async () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(refarmDir, \"config.json\"),\n\t\t\tJSON.stringify({\n\t\t\t\tdefault_provider: \"gemini\",\n\t\t\t\ttokens: { modelProvider: \"openai\", modelApiKey: \"sk-openai\" },\n\t\t\t}),\n\t\t);\n\t\tprocess.env.HOME = join(tmpdir(), `refarm-readiness-home-${Date.now()}`);\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: false,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"recognizes local providers without credential env requirements\", async () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-readiness-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(refarmDir, \"identity.json\"),\n\t\t\tJSON.stringify({ tokens: { modelProvider: \"ollama\" } }),\n\t\t);\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tvi.stubGlobal(\"fetch\", vi.fn().mockRejectedValue(new Error(\"down\")));\n\n\t\ttry {\n\t\t\tawait expect(checkSessionReadiness()).resolves.toMatchObject({\n\t\t\t\tproviderConfigured: true,\n\t\t\t\truntimeRunning: false,\n\t\t\t\tfarmhandRunning: false,\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n});\n\nfunction makeLaunchDeps(overrides: Partial<LaunchDeps> = {}): LaunchDeps {\n\treturn {\n\t\toperator: createScriptedOperatorChannel([true]),\n\t\tspawnRuntime: vi.fn(),\n\t\tprobeRuntimeUntilReady: vi.fn().mockResolvedValue(true),\n\t\t...overrides,\n\t};\n}\n\ndescribe(\"autoStartRuntime — mode: ask (default)\", () => {\n\tit(\"returns true when user confirms and runtime becomes ready\", async () => {\n\t\tconst deps = makeLaunchDeps();\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(true);\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledWith(\"/fake/root\");\n\t});\n\n\tit(\"returns false and does not spawn when user declines\", async () => {\n\t\tconst deps = makeLaunchDeps({\n\t\t\toperator: createScriptedOperatorChannel([false]),\n\t\t});\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(false);\n\t\texpect(deps.spawnRuntime).not.toHaveBeenCalled();\n\t\tconst output = (consoleErrorSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\\n\");\n\t\texpect(output).toContain(\"Next action: refarm doctor --next-action\");\n\t});\n\n\tit(\"reports 'still starting' (not failure) when a slow boot times out but the daemon is alive\", async () => {\n\t\t// Only the boolean probe is injected → the machine can't tell live-but-slow from\n\t\t// dead, so it defaults to the SAFER \"still starting\" narration, never a false failure.\n\t\tconst deps = makeLaunchDeps({\n\t\t\tprobeRuntimeUntilReady: vi.fn().mockResolvedValue(false),\n\t\t});\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(false);\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledOnce();\n\t\tconst stdout = (stdoutWriteSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\");\n\t\texpect(stdout).toContain(\"Still starting\");\n\t\texpect(stdout).not.toContain(\"Failed to start\");\n\t});\n\n\tit(\"reports '✗ Failed to start' when the outcome probe reports the daemon is dead\", async () => {\n\t\tconst deps = makeLaunchDeps({\n\t\t\tprobeRuntimeUntilOutcome: vi\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue({ ready: false, status: \"timed-out-dead\" }),\n\t\t});\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(false);\n\t\tconst stdout = (stdoutWriteSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\");\n\t\texpect(stdout).toContain(\"Failed to start\");\n\t\tconst output = (consoleErrorSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\\n\");\n\t\texpect(output).toContain(\"Run `refarm doctor --next-action` for the next recovery action.\");\n\t});\n\n\tit(\"passes the repo root to spawnRuntime\", async () => {\n\t\tconst deps = makeLaunchDeps();\n\t\tawait autoStartRuntime(\"/my/repo\", deps);\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledWith(\"/my/repo\");\n\t});\n\n\tit(\"prints the selected runtime engine and start command\", async () => {\n\t\tconst deps = makeLaunchDeps({\n\t\t\tresolveRuntime: vi.fn().mockReturnValue({\n\t\t\t\tconfiguredEngine: \"auto\",\n\t\t\t\tactiveEngine: \"rust\",\n\t\t\t\treason: \"auto-rust-available\",\n\t\t\t}),\n\t\t});\n\n\t\tawait autoStartRuntime(\"/fake/root\", deps);\n\n\t\tconst output = (stdoutWriteSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\");\n\t\texpect(output).toContain(\"Starting Rust Tractor\");\n\t\texpect(output).toContain(\"command:\");\n\t\texpect(output).toContain(\"tractor\");\n\t});\n\n\tit(\"explains the TypeScript fallback when Rust Tractor is not built\", async () => {\n\t\tconst deps = makeLaunchDeps({\n\t\t\tresolveRuntime: vi.fn().mockReturnValue({\n\t\t\t\tconfiguredEngine: \"auto\",\n\t\t\t\tactiveEngine: \"ts\",\n\t\t\t\treason: \"auto-ts-fallback\",\n\t\t\t}),\n\t\t});\n\n\t\tawait autoStartRuntime(\"/fake/root\", deps);\n\n\t\tconst output = (stdoutWriteSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\");\n\t\texpect(output).toContain(\"Starting TypeScript Farmhand\");\n\t\texpect(output).toContain(\"rust tractor: not built; using TypeScript fallback\");\n\t\texpect(output).toContain(\"build rust:\");\n\t\texpect(output).toContain(\"packages/tractor\");\n\t});\n});\n\ndescribe(\"autoStartRuntime — mode: always\", () => {\n\tit(\"spawns without asking when autostartMode is always\", async () => {\n\t\tconst askSpy = vi.fn();\n\t\tconst deps = makeLaunchDeps({\n\t\t\tautostartMode: \"always\",\n\t\t\toperator: { ask: askSpy },\n\t\t});\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(true);\n\t\texpect(askSpy).not.toHaveBeenCalled();\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledWith(\"/fake/root\");\n\t});\n\n\tit(\"returns false when runtime times out even in always mode\", async () => {\n\t\tconst askSpy = vi.fn();\n\t\tconst deps = makeLaunchDeps({\n\t\t\tautostartMode: \"always\",\n\t\t\toperator: { ask: askSpy },\n\t\t\tprobeRuntimeUntilReady: vi.fn().mockResolvedValue(false),\n\t\t});\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(false);\n\t\texpect(askSpy).not.toHaveBeenCalled();\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledOnce();\n\t});\n});\n\ndescribe(\"autoStartRuntime — mode: never\", () => {\n\tit(\"returns false immediately without asking or spawning\", async () => {\n\t\tconst askSpy = vi.fn();\n\t\tconst deps = makeLaunchDeps({\n\t\t\tautostartMode: \"never\",\n\t\t\toperator: { ask: askSpy },\n\t\t});\n\t\tconst result = await autoStartRuntime(\"/fake/root\", deps);\n\t\texpect(result).toBe(false);\n\t\texpect(askSpy).not.toHaveBeenCalled();\n\t\texpect(deps.spawnRuntime).not.toHaveBeenCalled();\n\t\tconst output = (consoleErrorSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\\n\");\n\t\texpect(output).toContain(\"Next action: refarm doctor --next-action\");\n\t});\n});\n\ndescribe(\"autoStartFarmhand\", () => {\n\tit(\"prefers farmhand spawn and probe hooks when provided\", async () => {\n\t\tconst spawnFarmhand = vi.fn();\n\t\tconst deps = makeLaunchDeps({\n\t\t\tspawnFarmhand,\n\t\t\tresolveRuntime: vi.fn().mockReturnValue({\n\t\t\t\tconfiguredEngine: \"rust\",\n\t\t\t\tactiveEngine: \"rust\",\n\t\t\t\treason: \"configured-rust\",\n\t\t\t}),\n\t\t\tprobeFarmhandUntilReady: vi.fn().mockResolvedValue(true),\n\t\t});\n\t\tconst result = await autoStartFarmhand(\"/fake/root\", deps);\n\n\t\texpect(result).toBe(true);\n\t\texpect(spawnFarmhand).toHaveBeenCalledWith(\"/fake/root\");\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledTimes(0);\n\n\t\tconst output = (stdoutWriteSpy.mock.calls as unknown[][])\n\t\t\t.map((call) => String(call[0]))\n\t\t\t.join(\"\");\n\t\texpect(output).toContain(\"Starting TypeScript Farmhand\");\n\t\texpect(output).toContain(\"farmhand\");\n\t\texpect(output).not.toContain(\"Starting Rust Tractor\");\n\t});\n\n\tit(\"falls back to runtime spawn and probe when no farmhand hooks are supplied\", async () => {\n\t\tconst deps = makeLaunchDeps();\n\t\tconst result = await autoStartFarmhand(\"/fake/root\", deps);\n\t\texpect(result).toBe(true);\n\t\texpect(deps.spawnRuntime).toHaveBeenCalledWith(\"/fake/root\");\n\t});\n});\n\ndescribe(\"printSessionGuide\", () => {\n\tit(\"points provider setup failures at model current\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-guide-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({}));\n\t\tconst cwdSpy = vi.spyOn(process, \"cwd\").mockReturnValue(tmpBase);\n\n\t\ttry {\n\t\t\tprintSessionGuide({ providerConfigured: false, farmhandRunning: true });\n\n\t\t\tconst output = (consoleErrorSpy.mock.calls as unknown[][])\n\t\t\t\t.map((call) => String(call[0]))\n\t\t\t\t.join(\"\\n\");\n\t\t\texpect(output).toContain(\"refarm sow\");\n\t\t\texpect(output).toContain(\"refarm model current\");\n\t\t\texpect(output).toContain(\"refarm model providers\");\n\t\t} finally {\n\t\t\tcwdSpy.mockRestore();\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n});\n\ndescribe(\"readAutostartMode\", () => {\n\tconst originalHome = process.env.HOME;\n\tconst originalFarmhandAutostart = process.env.REFARM_FARMHAND_AUTOSTART;\n\tconst originalRuntimeAutostart = process.env.REFARM_RUNTIME_AUTOSTART;\n\tlet cwdSpy: ReturnType<typeof vi.spyOn>;\n\n\tbeforeEach(() => {\n\t\tdelete process.env.REFARM_FARMHAND_AUTOSTART;\n\t\tdelete process.env.REFARM_RUNTIME_AUTOSTART;\n\t\tcwdSpy = vi.spyOn(process, \"cwd\").mockReturnValue(\"/tmp/refarm-test-cwd-nonexistent\");\n\t});\n\n\tafterEach(() => {\n\t\tprocess.env.HOME = originalHome;\n\t\tif (originalFarmhandAutostart === undefined) {\n\t\t\tdelete process.env.REFARM_FARMHAND_AUTOSTART;\n\t\t} else {\n\t\t\tprocess.env.REFARM_FARMHAND_AUTOSTART = originalFarmhandAutostart;\n\t\t}\n\t\tif (originalRuntimeAutostart === undefined) {\n\t\t\tdelete process.env.REFARM_RUNTIME_AUTOSTART;\n\t\t} else {\n\t\t\tprocess.env.REFARM_RUNTIME_AUTOSTART = originalRuntimeAutostart;\n\t\t}\n\t\tcwdSpy.mockRestore();\n\t});\n\n\tit(\"returns 'ask' when no config file exists\", () => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\texpect(readAutostartMode()).toBe(\"ask\");\n\t});\n\n\tit(\"returns the env override when REFARM_RUNTIME_AUTOSTART is set\", () => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\tprocess.env.REFARM_RUNTIME_AUTOSTART = \"never\";\n\n\t\texpect(readAutostartMode()).toBe(\"never\");\n\t});\n\n\tit(\"ignores REFARM_FARMHAND_AUTOSTART\", () => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\tprocess.env.REFARM_FARMHAND_AUTOSTART = \"never\";\n\n\t\texpect(readAutostartMode()).toBe(\"ask\");\n\t});\n\n\tit(\"uses REFARM_RUNTIME_AUTOSTART when the removed farmhand env override is also present\", () => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\tprocess.env.REFARM_RUNTIME_AUTOSTART = \"always\";\n\t\tprocess.env.REFARM_FARMHAND_AUTOSTART = \"never\";\n\n\t\texpect(readAutostartMode()).toBe(\"always\");\n\t});\n\n\tit(\"lets the env override force ask even when config says always\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-autostart-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({ autostart: \"always\" }));\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tprocess.env.REFARM_RUNTIME_AUTOSTART = \"ask\";\n\n\t\ttry {\n\t\t\texpect(readAutostartMode()).toBe(\"ask\");\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"ignores unrecognized env overrides and falls back to config\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-autostart-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({ autostart: \"never\" }));\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\t\tprocess.env.REFARM_FARMHAND_AUTOSTART = \"sometimes\";\n\n\t\ttry {\n\t\t\texpect(readAutostartMode()).toBe(\"never\");\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"returns 'always' when config.autostart is always\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-autostart-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({ autostart: \"always\" }));\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\n\t\ttry {\n\t\t\texpect(readAutostartMode()).toBe(\"always\");\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"returns 'never' when config.autostart is never\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-autostart-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({ autostart: \"never\" }));\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\n\t\ttry {\n\t\t\texpect(readAutostartMode()).toBe(\"never\");\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"lets project-local autostart override home preference\", () => {\n\t\tconst homeBase = join(tmpdir(), `refarm-autostart-home-${Date.now()}`);\n\t\tconst cwdBase = join(tmpdir(), `refarm-autostart-cwd-${Date.now()}`);\n\t\tmkdirSync(join(homeBase, \".refarm\"), { recursive: true });\n\t\tmkdirSync(join(cwdBase, \".refarm\"), { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(homeBase, \".refarm\", \"config.json\"),\n\t\t\tJSON.stringify({ autostart: \"always\" }),\n\t\t);\n\t\twriteFileSync(join(cwdBase, \".refarm\", \"config.json\"), JSON.stringify({ autostart: \"never\" }));\n\t\tprocess.env.HOME = homeBase;\n\t\tcwdSpy.mockReturnValue(cwdBase);\n\n\t\ttry {\n\t\t\texpect(readAutostartMode()).toBe(\"never\");\n\t\t} finally {\n\t\t\trmSync(homeBase, { recursive: true, force: true });\n\t\t\trmSync(cwdBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"returns 'ask' when config.autostart has an unrecognized value\", () => {\n\t\tconst tmpBase = join(tmpdir(), `refarm-autostart-${Date.now()}`);\n\t\tconst refarmDir = join(tmpBase, \".refarm\");\n\t\tmkdirSync(refarmDir, { recursive: true });\n\t\twriteFileSync(join(refarmDir, \"config.json\"), JSON.stringify({ autostart: \"maybe\" }));\n\t\tcwdSpy.mockReturnValue(tmpBase);\n\n\t\ttry {\n\t\t\texpect(readAutostartMode()).toBe(\"ask\");\n\t\t} finally {\n\t\t\trmSync(tmpBase, { recursive: true, force: true });\n\t\t}\n\t});\n});\n\ndescribe(\"readTractorEngineMode\", () => {\n\tconst originalHome = process.env.HOME;\n\tconst originalTractorEngine = process.env.REFARM_TRACTOR_ENGINE;\n\tlet cwdSpy: ReturnType<typeof vi.spyOn>;\n\n\tbeforeEach(() => {\n\t\tprocess.env.HOME = \"/tmp/refarm-test-home-nonexistent\";\n\t\tdelete process.env.REFARM_TRACTOR_ENGINE;\n\t\tcwdSpy = vi.spyOn(process, \"cwd\").mockReturnValue(\"/tmp/refarm-test-cwd-nonexistent\");\n\t});\n\n\tafterEach(() => {\n\t\tprocess.env.HOME = originalHome;\n\t\tif (originalTractorEngine === undefined) {\n\t\t\tdelete process.env.REFARM_TRACTOR_ENGINE;\n\t\t} else {\n\t\t\tprocess.env.REFARM_TRACTOR_ENGINE = originalTractorEngine;\n\t\t}\n\t\tcwdSpy.mockRestore();\n\t});\n\n\tit(\"returns auto when no tractor engine preference exists\", () => {\n\t\texpect(readTractorEngineMode()).toBe(\"auto\");\n\t});\n\n\tit(\"lets project-local tractor engine override home preference\", () => {\n\t\tconst homeBase = join(tmpdir(), `refarm-tractor-home-${Date.now()}`);\n\t\tconst cwdBase = join(tmpdir(), `refarm-tractor-cwd-${Date.now()}`);\n\t\tmkdirSync(join(homeBase, \".refarm\"), { recursive: true });\n\t\tmkdirSync(join(cwdBase, \".refarm\"), { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(homeBase, \".refarm\", \"config.json\"),\n\t\t\tJSON.stringify({ tractor: { engine: \"ts\" } }),\n\t\t);\n\t\twriteFileSync(\n\t\t\tjoin(cwdBase, \".refarm\", \"config.json\"),\n\t\t\tJSON.stringify({ tractor: { engine: \"rust\" } }),\n\t\t);\n\t\tprocess.env.HOME = homeBase;\n\t\tcwdSpy.mockReturnValue(cwdBase);\n\n\t\ttry {\n\t\t\texpect(readTractorEngineMode()).toBe(\"rust\");\n\t\t} finally {\n\t\t\trmSync(homeBase, { recursive: true, force: true });\n\t\t\trmSync(cwdBase, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"lets env tractor engine override persisted preferences\", () => {\n\t\tconst cwdBase = join(tmpdir(), `refarm-tractor-cwd-${Date.now()}`);\n\t\tmkdirSync(join(cwdBase, \".refarm\"), { recursive: true });\n\t\twriteFileSync(\n\t\t\tjoin(cwdBase, \".refarm\", \"config.json\"),\n\t\t\tJSON.stringify({ tractor: { engine: \"rust\" } }),\n\t\t);\n\t\tprocess.env.REFARM_TRACTOR_ENGINE = \"ts\";\n\t\tcwdSpy.mockReturnValue(cwdBase);\n\n\t\ttry {\n\t\t\texpect(readTractorEngineMode()).toBe(\"ts\");\n\t\t} finally {\n\t\t\trmSync(cwdBase, { recursive: true, force: true });\n\t\t}\n\t});\n});\n\ndescribe(\"resolveLaunchRuntime\", () => {\n\tconst originalCargoTargetDir = process.env.CARGO_TARGET_DIR;\n\n\tbeforeEach(() => {\n\t\tdelete process.env.CARGO_TARGET_DIR;\n\t});\n\n\tafterEach(() => {\n\t\tif (originalCargoTargetDir === undefined) {\n\t\t\tdelete process.env.CARGO_TARGET_DIR;\n\t\t} else {\n\t\t\tprocess.env.CARGO_TARGET_DIR = originalCargoTargetDir;\n\t\t}\n\t});\n\n\tit(\"uses TS when explicitly configured\", () => {\n\t\texpect(resolveLaunchRuntime(\"/fake/root\", \"ts\")).toMatchObject({\n\t\t\tactiveEngine: \"ts\",\n\t\t\treason: \"configured-ts\",\n\t\t});\n\t});\n\n\tit(\"uses TS in auto mode when the Rust tractor binary is absent\", () => {\n\t\tconst repoRoot = join(tmpdir(), `refarm-runtime-no-rust-${Date.now()}`);\n\t\tmkdirSync(repoRoot, { recursive: true });\n\n\t\ttry {\n\t\t\texpect(resolveLaunchRuntime(repoRoot, \"auto\")).toMatchObject({\n\t\t\t\tactiveEngine: \"ts\",\n\t\t\t\treason: \"auto-ts-fallback\",\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(repoRoot, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"uses Rust in auto mode when the Rust tractor binary exists\", () => {\n\t\tconst repoRoot = join(tmpdir(), `refarm-runtime-rust-${Date.now()}`);\n\t\t// `.cargo/config.toml` (`target-dir = \".cache/cargo-target\"`) resolves against the\n\t\t// repo root, so this is where every default build actually puts the binary.\n\t\tconst binDir = join(repoRoot, \".cache\", \"cargo-target\", \"release\");\n\t\tmkdirSync(binDir, { recursive: true });\n\t\twriteFileSync(join(binDir, process.platform === \"win32\" ? \"tractor.exe\" : \"tractor\"), \"\");\n\n\t\ttry {\n\t\t\texpect(resolveLaunchRuntime(repoRoot, \"auto\")).toMatchObject({\n\t\t\t\tactiveEngine: \"rust\",\n\t\t\t\treason: \"auto-rust-available\",\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(repoRoot, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"uses Rust when explicitly configured and the workspace binary exists\", () => {\n\t\tconst repoRoot = join(tmpdir(), `refarm-runtime-rust-explicit-${Date.now()}`);\n\t\tconst binDir = join(repoRoot, \".cache\", \"cargo-target\", \"release\");\n\t\tmkdirSync(binDir, { recursive: true });\n\t\twriteFileSync(join(binDir, process.platform === \"win32\" ? \"tractor.exe\" : \"tractor\"), \"\");\n\n\t\ttry {\n\t\t\texpect(resolveLaunchRuntime(repoRoot, \"rust\")).toMatchObject({\n\t\t\t\tactiveEngine: \"rust\",\n\t\t\t\treason: \"configured-rust\",\n\t\t\t});\n\t\t} finally {\n\t\t\trmSync(repoRoot, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"honors CARGO_TARGET_DIR over the workspace target dir\", () => {\n\t\tconst repoRoot = join(tmpdir(), `refarm-runtime-rust-envdir-${Date.now()}`);\n\t\tconst overrideDir = join(repoRoot, \"custom-target\");\n\t\tconst binDir = join(overrideDir, \"release\");\n\t\tmkdirSync(binDir, { recursive: true });\n\t\twriteFileSync(join(binDir, process.platform === \"win32\" ? \"tractor.exe\" : \"tractor\"), \"\");\n\t\tconst saved = process.env.CARGO_TARGET_DIR;\n\t\tprocess.env.CARGO_TARGET_DIR = overrideDir;\n\n\t\ttry {\n\t\t\texpect(resolveLaunchRuntime(repoRoot, \"rust\")).toMatchObject({\n\t\t\t\tactiveEngine: \"rust\",\n\t\t\t\treason: \"configured-rust\",\n\t\t\t});\n\t\t} finally {\n\t\t\tif (saved === undefined) delete process.env.CARGO_TARGET_DIR;\n\t\t\telse process.env.CARGO_TARGET_DIR = saved;\n\t\t\trmSync(repoRoot, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"fails early when Rust is explicitly configured but the binary is absent\", () => {\n\t\tconst repoRoot = join(tmpdir(), `refarm-runtime-rust-missing-${Date.now()}`);\n\t\tmkdirSync(repoRoot, { recursive: true });\n\t\tconst saved = process.env.CARGO_TARGET_DIR;\n\t\tdelete process.env.CARGO_TARGET_DIR;\n\n\t\ttry {\n\t\t\t// The guidance must name the path a default build will actually use.\n\t\t\texpect(() => resolveLaunchRuntime(repoRoot, \"rust\")).toThrow(\n\t\t\t\tjoin(repoRoot, \".cache\", \"cargo-target\"),\n\t\t\t);\n\t\t} finally {\n\t\t\tif (saved !== undefined) process.env.CARGO_TARGET_DIR = saved;\n\t\t\trmSync(repoRoot, { recursive: true, force: true });\n\t\t}\n\t});\n});\n"}}, "packages/tractor/src/host/sensitive_aliases/policy.rs": {"710ccdc0e08cf159ecedd57fb02c5603e5f4b8cb": {"t": 1786068334.9646232, "n": 24970, "h": "d8bce138b401f2dd", "c": "// Shared policy evaluators for MODEL_ forwarding and spawn env gating.\n// Extracted from sensitive_aliases.rs to keep policy mechanics isolated\n// from alias catalogs.\n\npub(crate) fn is_disallowed_model_forward_env_upper(upper: &str) -> bool {\n matches!(\n upper,\n \"MODEL_SHELL_ALLOWLIST\"\n | \"MODEL_FS_ROOT\"\n | \"MODEL_TRUSTED_PLUGINS\"\n | \"MODEL_USER\"\n | \"MODEL_USER_NAME\"\n | \"MODEL_EMAIL\"\n | \"MODEL_AUTHENTICATION\"\n ) || upper.ends_with(\"_API_KEY\")\n || upper.ends_with(\"_KEY\")\n || upper.contains(\"_KEY_\")\n || super::is_compact_sensitive_env_alias_suffix_or_segment(upper)\n || super::is_generic_sensitive_env_token_suffix_or_segment(upper)\n || super::is_shared_sensitive_env_canonical_suffix_or_segment(upper)\n || super::is_shared_sensitive_env_namespace_segment(upper)\n || upper.ends_with(\"_HONEYCOMB_TEAM\")\n || upper.ends_with(\"_OTEL_EXPORTER_OTLP_HEADERS\")\n || upper.ends_with(\"_OTEL_EXPORTER_OTLP_TRACES_HEADERS\")\n || upper.ends_with(\"_OTEL_EXPORTER_OTLP_METRICS_HEADERS\")\n || upper.ends_with(\"_OTEL_EXPORTER_OTLP_LOGS_HEADERS\")\n || upper.ends_with(\"_SQLCIPHER_KEY\")\n || upper.ends_with(\"_LIBSQL_AUTH_TOKEN\")\n || upper.ends_with(\"_TURSO_AUTH_TOKEN\")\n || upper.ends_with(\"_PGLITE_DATA_DIR\")\n || upper.ends_with(\"_PGLITE_DB_PATH\")\n || upper.ends_with(\"_PGLITE_OPFS_PATH\")\n || upper.ends_with(\"_OPFS_PATH\")\n || upper.ends_with(\"_OPFS_ROOT\")\n || upper.ends_with(\"_BROKER_URL\")\n || upper.ends_with(\"_AMQP_URL\")\n || upper.ends_with(\"_OIDC\")\n || upper.ends_with(\"_OIDC_DATA\")\n || upper.ends_with(\"_OIDC_IDENTITY\")\n || upper.ends_with(\"_ACCESSTOKEN\")\n || upper.ends_with(\"_CLIENT_PRINCIPAL\")\n || upper.ends_with(\"_CLIENT_PRINCIPAL_ID\")\n || upper.ends_with(\"_CLIENT_PRINCIPAL_NAME\")\n || upper.ends_with(\"_CLIENT_PRINCIPAL_IDP\")\n || upper.contains(\"_MS_TOKEN_AAD_\")\n || upper.ends_with(\"_PRINCIPAL\")\n || upper.ends_with(\"_PRINCIPAL_ID\")\n || upper.ends_with(\"_PRINCIPAL_NAME\")\n || upper.ends_with(\"_PRINCIPAL_IDP\")\n || upper.ends_with(\"_GITLAB_USER_ID\")\n || upper.ends_with(\"_GITLAB_USERNAME\")\n || upper.ends_with(\"_GITLAB_USER_LOGIN\")\n || upper.ends_with(\"_GITLAB_USER_EMAIL\")\n || upper.contains(\"_GITLAB_USER_\")\n || upper.ends_with(\"_USERID\")\n || upper.ends_with(\"_USERNAME\")\n || upper.ends_with(\"_USER_LOGIN\")\n || upper.ends_with(\"_GITHUB_USER_ID\")\n || upper.ends_with(\"_GITHUB_LOGIN\")\n || upper.ends_with(\"_GITHUB_USER_EMAIL\")\n || upper.contains(\"_GITHUB_USER_\")\n || upper.ends_with(\"_BITBUCKET_USER\")\n || upper.ends_with(\"_BITBUCKET_UUID\")\n || upper.ends_with(\"_BITBUCKET_USER_EMAIL\")\n || upper.contains(\"_BITBUCKET_USER_\")\n || upper.ends_with(\"_USER_ID\")\n || upper.ends_with(\"_USER_EMAIL\")\n || upper.ends_with(\"_GROUPS\")\n || upper.ends_with(\"_FORWARDED_USER\")\n || upper.ends_with(\"_FORWARDED_GROUPS\")\n || upper.contains(\"_FORWARDED_USER_\")\n || upper.ends_with(\"_REMOTE_USER\")\n || upper.ends_with(\"_REMOTE_EMAIL\")\n || upper.ends_with(\"_REMOTE_GROUPS\")\n || upper.contains(\"_REMOTE_USER_\")\n || upper.ends_with(\"_ORIGINAL_USER\")\n || upper.ends_with(\"_ORIGINAL_GROUPS\")\n || upper.ends_with(\"_AUTH_REQUEST_USER\")\n || upper.ends_with(\"_AUTH_REQUEST_USER_ID\")\n || upper.ends_with(\"_AUTH_REQUEST_UID\")\n || upper.ends_with(\"_AUTH_REQUEST_NAME\")\n || upper.ends_with(\"_AUTH_REQUEST_EMAIL\")\n || upper.contains(\"_AUTH_REQUEST_\")\n || upper.ends_with(\"_AUTH_REQUEST_GROUPS\")\n || upper.ends_with(\"_AUTH_REQUEST_PREFERRED_USERNAME\")\n || upper.ends_with(\"_IMPERSONATE_USER\")\n || upper.ends_with(\"_IMPERSONATE_GROUP\")\n || upper.ends_with(\"_IMPERSONATE_UID\")\n || upper.ends_with(\"_IMPERSONATE_EXTRA\")\n || upper.contains(\"_IMPERSONATE_EXTRA_\")\n || upper.ends_with(\"_FORWARDED_EMAIL\")\n || upper.ends_with(\"_AUTH_USER\")\n || upper.ends_with(\"_AUTH_EMAIL\")\n || upper.contains(\"_AUTH_USER_\")\n || upper.ends_with(\"_AUTHENTICATED_USERID\")\n || upper.ends_with(\"_AUTHENTICATED_USER_ID\")\n || upper.ends_with(\"_AUTHENTICATED_USER_EMAIL\")\n || upper.ends_with(\"_AUTHENTICATED_EMAIL\")\n || upper.ends_with(\"_AUTHENTICATED_USER\")\n || upper.ends_with(\"_AUTHENTICATED_USER_NAME\")\n || upper.ends_with(\"_AUTHENTICATED_GROUPS\")\n || upper.contains(\"_AUTHENTICATED_USER_\")\n || upper.ends_with(\"_VERIFIED_USER\")\n || upper.ends_with(\"_VERIFIED_USER_ID\")\n || upper.ends_with(\"_VERIFIED_USERID\")\n || upper.ends_with(\"_VERIFIED_USERNAME\")\n || upper.ends_with(\"_VERIFIED_EMAIL\")\n || upper.contains(\"_VERIFIED_USER_\")\n || upper.ends_with(\"_GOOG_AUTHENTICATED_USER_EMAIL\")\n || upper.ends_with(\"_GOOG_AUTHENTICATED_USER_ID\")\n || upper.contains(\"_GOOG_AUTHENTICATED_USER_\")\n || upper.ends_with(\"_GOOGLE_AUTHENTICATED_USER_EMAIL\")\n || upper.ends_with(\"_GOOGLE_AUTHENTICATED_USER_ID\")\n || upper.contains(\"_GOOGLE_AUTHENTICATED_USER_\")\n || upper.ends_with(\"_END_USER\")\n || upper.ends_with(\"_END_USER_EMAIL\")\n || upper.contains(\"_END_USER_\")\n || upper.ends_with(\"_CF_ACCESS_AUTHENTICATED_USER_ID\")\n || upper.contains(\"_CF_ACCESS_AUTHENTICATED_USER_\")\n || upper.contains(\"_CF_ACCESS_CLIENT_\")\n || upper.contains(\"_CLOUDFLARE_ACCESS_CLIENT_\")\n || upper.contains(\"_CF_ACCESS_\")\n || upper.contains(\"_CF_API_\")\n || upper.contains(\"_CLOUDFLARE_ACCESS_\")\n || upper.contains(\"_CLOUDFLARE_API_\")\n || upper.contains(\"_MB_DB_\")\n || upper.contains(\"_OP_SERVICE_\")\n || upper.contains(\"_CLOUDFLARE_TUNNEL_\")\n || upper.contains(\"_NEW_RELIC_\")\n || upper.contains(\"_OCI_CLI_\")\n || upper.contains(\"_NPM_CONFIG_\")\n || upper.contains(\"_NODE_AUTH_\")\n || upper.contains(\"_YARN_NPM_\")\n || upper.contains(\"_MB_JWT_\")\n || upper.contains(\"_MB_ENCRYPTION_\")\n || upper.ends_with(\"_FORWARDED_IP\")\n || upper.ends_with(\"_FORWARDED_FOR\")\n || upper.ends_with(\"_FORWARDED_HOST\")\n || upper.contains(\"_FORWARDED_HOST_\")\n || upper.ends_with(\"_FORWARDED_CLIENT_IP\")\n || upper.ends_with(\"_FORWARDED_SCHEME\")\n || upper.ends_with(\"_AWS_EC2_METADATA_TOKEN\")\n || upper.ends_with(\"_AWS_EC2_METADATA_TOKEN_TTL_SECONDS\")\n || upper.ends_with(\"_AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\")\n || upper.ends_with(\"_AWS_CONTAINER_CREDENTIALS_FULL_URI\")\n || upper.ends_with(\"_AWS_CONTAINER_AUTHORIZATION_TOKEN\")\n || upper.ends_with(\"_AWS_WEB_IDENTITY_TOKEN_FILE\")\n || upper.ends_with(\"_METADATA_FLAVOR\")\n || upper.ends_with(\"_GOOGLE_METADATA_REQUEST\")\n || upper.ends_with(\"_GOOGLE_APPLICATION_CREDENTIALS\")\n || upper.ends_with(\"_GCE_METADATA_HOST\")\n || upper.ends_with(\"_CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE\")\n || upper.ends_with(\"_AZURE_FEDERATED_TOKEN_FILE\")\n || upper.ends_with(\"_IDENTITY_ENDPOINT\")\n || upper.ends_with(\"_IDENTITY_HEADER\")\n || upper.ends_with(\"_IMDS_ENDPOINT\")\n || upper.ends_with(\"_MSI_ENDPOINT\")\n || upper.ends_with(\"_ENVOY_ORIGINAL_PATH\")\n || upper.ends_with(\"_ENVOY_ORIGINAL_URL\")\n || upper.ends_with(\"_FASTLY_CLIENT_IP\")\n || upper.ends_with(\"_SSL_CLIENT_SAN\")\n}\n\nfn is_safe_model_forward_env_key_format(key: &str) -> bool {\n const MAX_SUFFIX_LEN: usize = 96;\n let suffix = &key[\"MODEL_\".len()..];\n !suffix.is_empty()\n && suffix.len() <= MAX_SUFFIX_LEN\n && suffix\n .bytes()\n .all(|b| b.is_ascii_uppercase() || b.is_ascii_digit() || b == b'_')\n}\n\n/// Shared plugin-forwarding policy for `MODEL_*` env keys.\npub(crate) fn is_forwardable_model_env_key(key: &str) -> bool {\n if !key.starts_with(\"MODEL_\") {\n return false;\n }\n if key.len() <= \"MODEL_\".len() {\n return false;\n }\n if !is_safe_model_forward_env_key_format(key) {\n return false;\n }\n let upper = key.to_ascii_uppercase();\n !super::is_disallowed_model_forward_env_upper(&upper)\n}\n\n/// Shared plugin-forwarding policy for `MODEL_*` env values.\n///\n/// The default rule is deliberately CREDENTIAL-shaped: a forwardable value is a single\n/// non-whitespace ASCII token under 4 KiB. That is right for the keys this policy was\n/// built for (provider base URLs, model ids, flags) and is a cheap second line against\n/// forwarding a secret-looking blob — but it is WRONG for keys whose value is prose.\npub(crate) fn is_forwardable_model_env_value(value: &str) -> bool {\n const MAX_MODEL_ENV_VALUE_LEN: usize = 4096;\n !value.trim().is_empty()\n && value.trim() == value\n && value.len() <= MAX_MODEL_ENV_VALUE_LEN\n && value.is_ascii()\n && !value.chars().any(|c| c.is_whitespace())\n && !value.chars().any(|c| c.is_control())\n}\n\n/// A `MODEL_*` key whose value is TEXT CONTENT the model reads, not a credential:\n/// the skill disclosure index (`MODEL_SKILLS`), the on-demand skill bodies map\n/// (`MODEL_SKILL_BODIES`), and the ADR-012 routing config list of which providers are\n/// configured (`MODEL_CONFIGURED_PROVIDERS` — a space/comma-separated list of provider\n/// NAMES, never the keys themselves). Their values legitimately contain whitespace and\n/// are more than a single token — so they need a text-shaped forward policy, not the\n/// credential-shaped default. This is a CLOSED allowlist (not a pattern) so it can never\n/// accidentally widen to a real secret key.\npub(crate) fn is_text_content_model_env_key(key: &str) -> bool {\n matches!(\n key,\n \"MODEL_SKILLS\" | \"MODEL_SKILL_BODIES\" | \"MODEL_CONFIGURED_PROVIDERS\"\n )\n}\n\n/// The value policy for a text-content key: much larger cap (a bodies map holds\n/// several SKILL.md files), and whitespace/newlines/unicode allowed — but still\n/// non-empty and free of NUL / other C0 control chars except the ordinary `\\t`/`\\n`/`\\r`\n/// that text carries (a NUL in an env value is a real red flag, never legitimate text).\nfn is_forwardable_text_content_value(value: &str) -> bool {\n const MAX_TEXT_CONTENT_VALUE_LEN: usize = 256 * 1024;\n !value.trim().is_empty()\n && value.len() <= MAX_TEXT_CONTENT_VALUE_LEN\n && !value\n .chars()\n .any(|c| c.is_control() && !matches!(c, '\\t' | '\\n' | '\\r'))\n}\n\n/// The forwarding decision for a `MODEL_*` (key, value) PAIR — the key-aware entry\n/// point. A text-content key (skills) gets the text policy; everything else gets the\n/// credential-shaped default. Keeping the split here means a caller can't forward a\n/// prose value under a non-text key, nor a token-shaped bypass under a text key.\npub(crate) fn is_forwardable_model_env_pair(key: &str, value: &str) -> bool {\n if !is_forwardable_model_env_key(key) {\n return false;\n }\n if is_text_content_model_env_key(key) {\n is_forwardable_text_content_value(value)\n } else {\n is_forwardable_model_env_value(value)\n }\n}\n\n/// Shared spawn boundary env-key policy (exact keys + prefixes + shared alias catalogs).\npub(crate) fn is_spawn_sensitive_env_key(key: &str) -> bool {\n let upper = key.to_ascii_uppercase();\n if upper.starts_with(\"LD_\")\n || upper.starts_with(\"DYLD_\")\n || upper.starts_with(\"MALLOC_\")\n || upper.starts_with(\"GIT_CONFIG_\")\n || upper.starts_with(\"NPM_CONFIG_\")\n || upper.starts_with(\"PROXY_\")\n || upper.starts_with(\"REMOTE_USER_\")\n || upper.starts_with(\"AUTH_REQUEST_\")\n || upper.starts_with(\"AUTH_USER_\")\n || upper.starts_with(\"AUTHENTICATED_USER_\")\n || upper.starts_with(\"END_USER_\")\n || upper.starts_with(\"CLIENT_PRINCIPAL_\")\n || upper.starts_with(\"VERIFIED_USER_\")\n || upper.starts_with(\"IMPERSONATE_EXTRA_\")\n || upper.starts_with(\"OCI_CLI_\")\n || upper.starts_with(\"NETRC_\")\n || upper.starts_with(\"MB_DB_\")\n || upper.starts_with(\"CF_ACCESS_\")\n || upper.starts_with(\"CF_API_\")\n || upper.starts_with(\"CLOUDFLARE_ACCESS_\")\n || upper.starts_with(\"CLOUDFLARE_API_\")\n || upper.starts_with(\"MB_JWT_\")\n || upper.starts_with(\"MB_ENCRYPTION_\")\n || upper.starts_with(\"CLOUDFLARE_TUNNEL_\")\n || super::is_compact_sensitive_env_alias_suffix(&upper)\n || super::is_generic_sensitive_env_token_suffix_or_segment(&upper)\n || super::is_shared_sensitive_env_canonical_suffix_or_segment(&upper)\n || super::is_shared_sensitive_env_namespace_prefix(&upper)\n || upper.starts_with(\"AMZN_OIDC_\")\n || upper.starts_with(\"GOOG_\")\n || upper.starts_with(\"MS_TOKEN_AAD_\")\n || upper.starts_with(\"NEW_RELIC_\")\n || upper.starts_with(\"NODE_AUTH_\")\n || upper.starts_with(\"YARN_NPM_\")\n || upper.starts_with(\"OP_SERVICE_\")\n {\n return true;\n }\n matches!(\n upper.as_str(),\n \"PATH\"\n | \"HOME\"\n | \"USERPROFILE\"\n | \"XDG_CONFIG_HOME\"\n | \"XDG_DATA_HOME\"\n | \"XDG_CACHE_HOME\"\n | \"IFS\"\n | \"SHELLOPTS\"\n | \"BASHOPTS\"\n | \"BASH_ENV\"\n | \"ENV\"\n | \"GCONV_PATH\"\n | \"GLIBC_TUNABLES\"\n | \"NODE_OPTIONS\"\n | \"NODE_PATH\"\n | \"CLASSPATH\"\n | \"JAVA_TOOL_OPTIONS\"\n | \"_JAVA_OPTIONS\"\n | \"PYTHONPATH\"\n | \"PYTHONHOME\"\n | \"PYTHONSTARTUP\"\n | \"PYTHONUSERBASE\"\n | \"RUBYOPT\"\n | \"RUBYLIB\"\n | \"PERL5OPT\"\n | \"PERL5LIB\"\n | \"GEM_HOME\"\n | \"GEM_PATH\"\n | \"LUA_PATH\"\n | \"LUA_CPATH\"\n | \"SSL_CERT_FILE\"\n | \"SSL_CERT_DIR\"\n | \"REQUESTS_CA_BUNDLE\"\n | \"CURL_CA_BUNDLE\"\n | \"GIT_SSL_CAINFO\"\n | \"HTTP_PROXY\"\n | \"HTTPS_PROXY\"\n | \"ALL_PROXY\"\n | \"NO_PROXY\"\n | \"SSH_AUTH_SOCK\"\n | \"SSH_AGENT_PID\"\n | \"SSH_ASKPASS\"\n | \"GIT_ASKPASS\"\n | \"GIT_SSH\"\n | \"GIT_SSH_COMMAND\"\n | \"AWS_SHARED_CREDENTIALS_FILE\"\n | \"AWS_CONFIG_FILE\"\n | \"AWS_ACCESS_KEY_ID\"\n | \"AWS_SECRET_ACCESS_KEY\"\n | \"AWS_SESSION_TOKEN\"\n | \"AWS_PROFILE\"\n | \"AWS_DEFAULT_PROFILE\"\n | \"AWS_ROLE_ARN\"\n | \"AWS_ROLE_SESSION_NAME\"\n | \"AWS_ROLE_SESSION_DURATION\"\n | \"AWS_WEB_IDENTITY_TOKEN_FILE\"\n | \"AWS_EC2_METADATA_DISABLED\"\n | \"AWS_EC2_METADATA_SERVICE_ENDPOINT\"\n | \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\"\n | \"AWS_METADATA_SERVICE_TIMEOUT\"\n | \"AWS_METADATA_SERVICE_NUM_ATTEMPTS\"\n | \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\"\n | \"AWS_CONTAINER_CREDENTIALS_FULL_URI\"\n | \"AWS_CONTAINER_AUTHORIZATION_TOKEN\"\n | \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\"\n | \"BOTO_CONFIG\"\n | \"GOOGLE_APPLICATION_CREDENTIALS\"\n | \"GOOGLE_OAUTH_ACCESS_TOKEN\"\n | \"GOOGLE_OAUTH_REFRESH_TOKEN\"\n | \"GOOGLE_ID_TOKEN\"\n | \"GCP_ACCESS_TOKEN\"\n | \"GCP_ID_TOKEN\"\n | \"GOOGLE_GHA_CREDS_PATH\"\n | \"GOOGLE_CLOUD_PROJECT\"\n | \"GOOGLE_IMPERSONATE_SERVICE_ACCOUNT\"\n | \"GCE_METADATA_HOST\"\n | \"GCLOUD_PROJECT\"\n | \"CLOUDSDK_CONFIG\"\n | \"CLOUDSDK_AUTH_ACCESS_TOKEN\"\n | \"CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE\"\n | \"AZURE_CONFIG_DIR\"\n | \"AZURE_FEDERATED_TOKEN_FILE\"\n | \"AZURE_ACCESS_TOKEN\"\n | \"AZURE_ID_TOKEN\"\n | \"AZURE_CLIENT_ID\"\n | \"AZURE_TENANT_ID\"\n | \"AZURE_CLIENT_SECRET\"\n | \"AZURE_USERNAME\"\n | \"AZURE_PASSWORD\"\n | \"IDENTITY_ENDPOINT\"\n | \"IDENTITY_HEADER\"\n | \"IMDS_ENDPOINT\"\n | \"MSI_ENDPOINT\"\n | \"MSI_SECRET\"\n | \"ARM_CLIENT_ID\"\n | \"ARM_TENANT_ID\"\n | \"ARM_CLIENT_SECRET\"\n | \"ARM_ACCESS_KEY\"\n | \"ARM_SUBSCRIPTION_ID\"\n | \"ARM_USE_OIDC\"\n | \"ARM_OIDC_TOKEN\"\n | \"ARM_OIDC_TOKEN_FILE\"\n | \"ARM_USE_MSI\"\n | \"ARM_USE_AZUREAD\"\n | \"AZURE_SUBSCRIPTION_ID\"\n | \"KUBECONFIG\"\n | \"KUBE_CONFIG_PATH\"\n | \"HELM_KUBEAPISERVER\"\n | \"HELM_KUBETOKEN\"\n | \"HELM_KUBECAFILE\"\n | \"DOCKER_CONFIG\"\n | \"DOCKER_AUTH_CONFIG\"\n | \"DOCKER_USERNAME\"\n | \"DOCKER_PASSWORD\"\n | \"REGISTRY_AUTH_FILE\"\n | \"CONTAINERS_AUTH_FILE\"\n | \"HELM_REGISTRY_CONFIG\"\n | \"CR_PAT\"\n | \"GHCR_TOKEN\"\n | \"QUAY_TOKEN\"\n | \"QUAY_OAUTH_TOKEN\"\n | \"HARBOR_USERNAME\"\n | \"HARBOR_PASSWORD\"\n | \"ARTIFACTORY_API_KEY\"\n | \"JFROG_ACCESS_TOKEN\"\n | \"OCI_CLI_KEY_FILE\"\n | \"OCI_CLI_SECURITY_TOKEN_FILE\"\n | \"OCI_CLI_AUTH\"\n | \"NETRC\"\n | \"_NETRC\"\n | \"CURL_HOME\"\n | \"WGETRC\"\n | \"RUSTFLAGS\"\n | \"RUSTDOCFLAGS\"\n | \"RUSTC_WRAPPER\"\n | \"RUSTC_WORKSPACE_WRAPPER\"\n | \"GITHUB_TOKEN\"\n | \"GH_TOKEN\"\n | \"GH_ENTERPRISE_TOKEN\"\n | \"GITHUB_PAT\"\n | \"GITLAB_TOKEN\"\n | \"GITLAB_PRIVATE_TOKEN\"\n | \"GITLAB_CI_TOKEN\"\n | \"CI_JOB_TOKEN\"\n | \"CI_JOB_JWT\"\n | \"CI_JOB_JWT_V2\"\n | \"ACTIONS_ID_TOKEN_REQUEST_TOKEN\"\n | \"ACTIONS_ID_TOKEN_REQUEST_URL\"\n | \"ACTIONS_RUNTIME_TOKEN\"\n | \"GITLAB_OIDC_TOKEN\"\n | \"CIRCLE_OIDC_TOKEN\"\n | \"OIDC_TOKEN\"\n | \"CIRCLE_TOKEN\"\n | \"BUILDKITE_AGENT_ACCESS_TOKEN\"\n | \"BUILDKITE_API_TOKEN\"\n | \"DRONE_TOKEN\"\n | \"JENKINS_API_TOKEN\"\n | \"CI_REGISTRY_PASSWORD\"\n | \"CI_DEPLOY_PASSWORD\"\n | \"BITBUCKET_TOKEN\"\n | \"BITBUCKET_APP_PASSWORD\"\n | \"CODECOV_TOKEN\"\n | \"SENTRY_AUTH_TOKEN\"\n | \"SONAR_TOKEN\"\n | \"DATADOG_API_KEY\"\n | \"HONEYCOMB_API_KEY\"\n | \"NEW_RELIC_API_KEY\"\n | \"NEW_RELIC_LICENSE_KEY\"\n | \"LOGDNA_INGESTION_KEY\"\n | \"ROLLBAR_ACCESS_TOKEN\"\n | \"BUGSNAG_API_KEY\"\n | \"PAGERDUTY_API_TOKEN\"\n | \"GRAFANA_CLOUD_API_KEY\"\n | \"OTEL_EXPORTER_OTLP_HEADERS\"\n | \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\"\n | \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\"\n | \"OTEL_EXPORTER_OTLP_LOGS_HEADERS\"\n | \"CLOUDFLARE_API_TOKEN\"\n | \"CLOUDFLARE_API_KEY\"\n | \"CF_API_TOKEN\"\n | \"CF_ACCESS_CLIENT_ID\"\n | \"CF_ACCESS_CLIENT_SECRET\"\n | \"CLOUDFLARE_ACCESS_CLIENT_ID\"\n | \"CLOUDFLARE_ACCESS_CLIENT_SECRET\"\n | \"FASTLY_API_TOKEN\"\n | \"AKAMAI_CLIENT_TOKEN\"\n | \"AKAMAI_CLIENT_SECRET\"\n | \"AKAMAI_ACCESS_TOKEN\"\n | \"NETLIFY_AUTH_TOKEN\"\n | \"VERCEL_TOKEN\"\n | \"RENDER_API_KEY\"\n | \"RAILWAY_TOKEN\"\n | \"NGROK_AUTHTOKEN\"\n | \"NGROK_API_KEY\"\n | \"NGROK_AUTHTOKEN_FILE\"\n | \"NGROK_CONFIG\"\n | \"CLOUDFLARE_TUNNEL_TOKEN\"\n | \"TAILSCALE_AUTHKEY\"\n | \"TS_AUTHKEY\"\n | \"TAILSCALE_API_KEY\"\n | \"TAILSCALE_OAUTH_CLIENT_SECRET\"\n | \"HEROKU_API_KEY\"\n | \"FLY_API_TOKEN\"\n | \"DIGITALOCEAN_ACCESS_TOKEN\"\n | \"LINODE_TOKEN\"\n | \"HCLOUD_TOKEN\"\n | \"VULTR_API_KEY\"\n | \"SCW_ACCESS_KEY\"\n | \"SCW_SECRET_KEY\"\n | \"SUPABASE_ACCESS_TOKEN\"\n | \"SUPABASE_SERVICE_ROLE_KEY\"\n | \"SUPABASE_SERVICE_KEY\"\n | \"SUPABASE_ANON_KEY\"\n | \"SUPABASE_JWT_SECRET\"\n | \"SUPABASE_SECRET_KEY\"\n | \"SUPABASE_DB_PASSWORD\"\n | \"SUPABASE_URL\"\n | \"SUPABASE_DB_URL\"\n | \"METABASE_API_KEY\"\n | \"METABASE_SITE_URL\"\n | \"METABASE_DB_CONNECTION_URI\"\n | \"MB_DB_CONNECTION_URI\"\n | \"METABASE_DB_USER\"\n | \"METABASE_DB_PASS\"\n | \"MB_DB_USER\"\n | \"MB_DB_PASS\"\n | \"METABASE_ENCRYPTION_SECRET_KEY\"\n | \"METABASE_JWT_SHARED_SECRET\"\n | \"MB_ENCRYPTION_SECRET_KEY\"\n | \"MB_JWT_SHARED_SECRET\"\n | \"NEON_API_KEY\"\n | \"VAULT_TOKEN\"\n | \"SOPS_AGE_KEY\"\n | \"SOPS_AGE_KEY_FILE\"\n | \"AGE_SECRET_KEY\"\n | \"AGE_KEY_FILE\"\n | \"GPG_PRIVATE_KEY\"\n | \"GPG_PASSPHRASE\"\n | \"SIGSTORE_ID_TOKEN\"\n | \"COSIGN_PASSWORD\"\n | \"COSIGN_PRIVATE_KEY\"\n | \"KUBE_TOKEN\"\n | \"KUBE_BEARER_TOKEN\"\n | \"ARGOCD_AUTH_TOKEN\"\n | \"TF_TOKEN_APP_TERRAFORM_IO\"\n | \"TERRAFORM_CLOUD_TOKEN\"\n | \"TFC_TOKEN\"\n | \"PULUMI_ACCESS_TOKEN\"\n | \"DOPPLER_TOKEN\"\n | \"INFISICAL_TOKEN\"\n | \"OP_SERVICE_ACCOUNT_TOKEN\"\n | \"NODE_AUTH_TOKEN\"\n | \"NPM_TOKEN\"\n | \"YARN_NPM_AUTH_TOKEN\"\n | \"BUN_AUTH_TOKEN\"\n | \"PYPI_TOKEN\"\n | \"PYPI_API_TOKEN\"\n | \"TWINE_USERNAME\"\n | \"TWINE_PASSWORD\"\n | \"RUBYGEMS_API_KEY\"\n | \"NUGET_API_KEY\"\n | \"NUGET_AUTH_TOKEN\"\n | \"TELEGRAM_BOT_TOKEN\"\n | \"TELEGRAM_BOT_API_SECRET_TOKEN\"\n | \"TELEGRAM_API_HASH\"\n | \"TWITTER_BEARER_TOKEN\"\n | \"TWITTER_API_KEY\"\n | \"TWITTER_API_SECRET\"\n | \"TWITTER_ACCESS_TOKEN\"\n | \"TWITTER_ACCESS_TOKEN_SECRET\"\n | \"X_API_KEY\"\n | \"SIGNAL_CLI_PASSWORD\"\n | \"SIGNAL_CLI_USERNAME\"\n | \"TWILIO_AUTH_TOKEN\"\n | \"TWILIO_API_KEY\"\n | \"STRIPE_API_KEY\"\n | \"STRIPE_SECRET_KEY\"\n | \"STRIPE_WEBHOOK_SECRET\"\n | \"SHOPIFY_WEBHOOK_SECRET\"\n | \"SHOPIFY_API_SECRET\"\n | \"GITHUB_WEBHOOK_SECRET\"\n | \"GITLAB_WEBHOOK_SECRET_TOKEN\"\n | \"LINE_CHANNEL_SECRET\"\n | \"FACEBOOK_ACCESS_TOKEN\"\n | \"FACEBOOK_APP_SECRET\"\n | \"META_ACCESS_TOKEN\"\n | \"INSTAGRAM_ACCESS_TOKEN\"\n | \"WHATSAPP_TOKEN\"\n | \"WHATSAPP_VERIFY_TOKEN\"\n | \"MATRIX_ACCESS_TOKEN\"\n | \"MATRIX_HOMESERVER_TOKEN\"\n | \"MATRIX_REGISTRATION_SHARED_SECRET\"\n | \"MATRIX_MACAROON_SECRET_KEY\"\n | \"DISCORD_TOKEN\"\n | \"DISCORD_WEBHOOK_URL\"\n | \"SLACK_BOT_TOKEN\"\n | \"SLACK_APP_TOKEN\"\n | \"SLACK_SIGNING_SECRET\"\n | \"SLACK_WEBHOOK_URL\"\n | \"SENDGRID_API_KEY\"\n | \"MAILGUN_API_KEY\"\n | \"POSTMARK_API_TOKEN\"\n | \"RESEND_API_KEY\"\n | \"DATABASE_URL\"\n | \"DATABASE_DSN\"\n | \"REDIS_URL\"\n | \"MONGODB_URI\"\n | \"POSTGRES_URL\"\n | \"MYSQL_URL\"\n | \"BROKER_URL\"\n | \"AMQP_URL\"\n | \"SQLITE_URL\"\n | \"SQLITE_PATH\"\n | \"SQLITE_FILE\"\n | \"SQLITE_TMPDIR\"\n | \"SQLITE_HISTORY\"\n | \"SQLCIPHER_KEY\"\n | \"LIBSQL_AUTH_TOKEN\"\n | \"TURSO_AUTH_TOKEN\"\n | \"PGLITE_DATA_DIR\"\n | \"PGLITE_DB_PATH\"\n | \"PGLITE_OPFS_PATH\"\n | \"OPFS_ROOT\"\n | \"OPFS_PATH\"\n | \"OPENAI_API_KEY\"\n | \"OPENROUTER_API_KEY\"\n | \"AZURE_OPENAI_API_KEY\"\n | \"ANTHROPIC_API_KEY\"\n | \"GEMINI_API_KEY\"\n | \"MISTRAL_API_KEY\"\n | \"COHERE_API_KEY\"\n | \"GROQ_API_KEY\"\n | \"TOGETHER_API_KEY\"\n | \"PERPLEXITY_API_KEY\"\n | \"DEEPSEEK_API_KEY\"\n | \"XAI_API_KEY\"\n | \"FIREWORKS_API_KEY\"\n | \"HUGGINGFACEHUB_API_TOKEN\"\n | \"HF_TOKEN\"\n | \"REPLICATE_API_TOKEN\"\n | \"ELEVENLABS_API_KEY\"\n | \"ACCESS_TOKEN\"\n | \"ID_TOKEN\"\n | \"REFRESH_TOKEN\"\n | \"LD_PRELOAD\"\n | \"LD_AUDIT\"\n | \"LD_LIBRARY_PATH\"\n | \"DYLD_INSERT_LIBRARIES\"\n | \"DYLD_LIBRARY_PATH\"\n | \"DYLD_FRAMEWORK_PATH\"\n | \"DYLD_FALLBACK_LIBRARY_PATH\"\n )\n}\n"}}}}