{"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 ` 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"}}}}