#!/usr/bin/env node import { buildMetadataFromEnv } from "../../internal/build-metadata.mjs"; import { AGENT_WORKER_SERVICE_ID } from "../../internal/agent/index.mjs"; import { assessSkillsInjection, resolveAgentRuntimeStateDir, runLocalWorkerDryRun } from "../../internal/agent/runtime.mjs"; const command = process.argv[2] || "help"; const options = parseOptions(process.argv.slice(3)); try { const result = await dispatch(command, options); printJSON(result); } catch (error) { printJSON( { serviceId: AGENT_WORKER_SERVICE_ID, ok: false, error: { message: error.message } }, { stderr: true } ); process.exit(1); } async function dispatch(name, opts) { if (name === "help" || opts.help) { return help(); } if (name === "health") { return { serviceId: AGENT_WORKER_SERVICE_ID, ok: true, status: "ok", environment: process.env.HWLAB_ENVIRONMENT || "dev", ...buildMetadataFromEnv(process.env, { serviceId: AGENT_WORKER_SERVICE_ID }), runtimeMode: "local-dry-run", skills: assessSkillsInjection({ skillCommitId: opts.skillCommitId, skillVersion: opts.skillVersion, role: "worker" }) }; } if (name === "dry-run" || name === "smoke") { return { ok: true, ...(await runLocalWorkerDryRun({ stateDir: opts.stateDir, agentSessionId: requireOption(opts, "agentSessionId", "--agent-session-id"), skillCommitId: opts.skillCommitId || null, skillVersion: opts.skillVersion || null })) }; } throw new Error(`unknown command ${JSON.stringify(name)}`); } function parseOptions(argv) { const opts = { stateDir: process.env.HWLAB_AGENT_RUNTIME_STATE_DIR || "", agentSessionId: process.env.HWLAB_AGENT_SESSION_ID || "", skillCommitId: process.env.HWLAB_SKILL_COMMIT_ID || "", skillVersion: process.env.HWLAB_SKILL_VERSION || "" }; for (let i = 0; i < argv.length; i += 1) { const arg = argv[i]; if (arg === "--agent-session-id") opts.agentSessionId = argv[++i] || ""; else if (arg === "--skill-commit-id") opts.skillCommitId = argv[++i] || ""; else if (arg === "--skill-version") opts.skillVersion = argv[++i] || ""; else if (arg === "--state-dir") opts.stateDir = argv[++i] || ""; else if (arg === "--help" || arg === "-h") opts.help = true; else throw new Error(`unknown option ${JSON.stringify(arg)}`); } if (opts.stateDir) { opts.stateDir = resolveAgentRuntimeStateDir(opts.stateDir); } return opts; } function requireOption(opts, key, flag) { if (!opts[key]) { throw new Error(`${flag} is required`); } return opts[key]; } function help() { return { serviceId: AGENT_WORKER_SERVICE_ID, ok: true, usage: [ "bun run cmd/hwlab-agent-worker/main.ts health [--skill-commit-id COMMIT --skill-version VERSION]", "bun run cmd/hwlab-agent-worker/main.ts dry-run --agent-session-id ID [--skill-commit-id COMMIT --skill-version VERSION] [--state-dir DIR]" ], contract: { output: "json", runtimeMode: "local-dry-run", prodDisabled: true, behavior: "claim queued local session, write trace and evidence, cleanup workspace, exit" } }; } function printJSON(value, { stderr = false } = {}) { const target = stderr ? process.stderr : process.stdout; target.write(`${JSON.stringify(value, null, 2)}\n`); }