@askalf/hands
Advanced tools
| export type CheckStatus = 'ok' | 'warn' | 'fail' | 'info'; | ||
| export interface CheckResult { | ||
| id: string; | ||
| category: string; | ||
| status: CheckStatus; | ||
| label: string; | ||
| detail: string; | ||
| durationMs?: number; | ||
| } | ||
| export interface DoctorReport { | ||
| version: string; | ||
| generatedAt: number; | ||
| checks: CheckResult[]; | ||
| summary: { | ||
| total: number; | ||
| ok: number; | ||
| warn: number; | ||
| fail: number; | ||
| info: number; | ||
| }; | ||
| } | ||
| export interface DoctorOptions { | ||
| skipDario?: boolean; | ||
| skipWhisper?: boolean; | ||
| fetchImpl?: typeof fetch; | ||
| now?: () => number; | ||
| } | ||
| export declare function runDoctor(opts?: DoctorOptions): Promise<DoctorReport>; | ||
| /** Minimum Node version for hands: 20.0.0 (engines.node in package.json). */ | ||
| export declare function nodeMeetsMinimum(version: string): boolean; | ||
| /** Replace $HOME (or Windows USERPROFILE) in a path with `~` so screenshots / error messages don't leak the user's home directory. */ | ||
| export declare function scrubPath(s: string): string; | ||
| /** Remove trailing slashes from a URL without regex (avoids polynomial-ReDoS). */ | ||
| export declare function trimTrailingSlash(url: string): string; | ||
| /** Convert an fs error into a short human string. */ | ||
| export declare function classifyFsError(err: unknown): string; | ||
| /** Convert a fetch error into a short human string. */ | ||
| export declare function classifyFetchError(err: unknown): string; | ||
| /** Render a DoctorReport as a human-readable text block. */ | ||
| export declare function renderDoctorText(report: DoctorReport): string; | ||
| /** Render a DoctorReport as JSON. */ | ||
| export declare function renderDoctorJson(report: DoctorReport): string; | ||
| /** Exit code to use when `hands doctor` finishes: 1 if any check failed, 0 otherwise. */ | ||
| export declare function exitCodeFor(report: DoctorReport): number; | ||
| //# sourceMappingURL=doctor.d.ts.map |
| {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClF;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsB/E;AA0QD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,sIAAsI;AACtI,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3C;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQpD;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQvD;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiC7D;AAED,qCAAqC;AACrC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE7D;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAExD"} |
+409
| // `hands doctor` — one command, one aggregated report. | ||
| // | ||
| // Mirrors dario / deepdive / claude-bridge's doctor philosophy: every | ||
| // subsystem hands depends on (Node, platform tools, Claude CLI, config | ||
| // dir, voice stack, optional dario endpoint) gets probed; anything | ||
| // unhealthy is visible without the user chasing error messages across | ||
| // three separate commands. Paste-able into issues. | ||
| // | ||
| // Non-destructive: config is inspected, not modified. No browser is | ||
| // opened. The optional dario probe sends a single GET to a local | ||
| // endpoint (default http://localhost:3456) only when ANTHROPIC_BASE_URL | ||
| // is set; skipped otherwise. | ||
| import { promises as fs } from 'node:fs'; | ||
| import { homedir, platform as osPlatform, arch as osArch, release as osRelease } from 'node:os'; | ||
| import { join, dirname } from 'node:path'; | ||
| import { fileURLToPath } from 'node:url'; | ||
| import { checkPlatform } from './platform/index.js'; | ||
| import { isWhisperInstalled } from './voice/index.js'; | ||
| import { loadConfig, getConfigDir } from './util/config.js'; | ||
| import { commandExists } from './platform/index.js'; | ||
| import { execFile } from 'node:child_process'; | ||
| import { promisify } from 'node:util'; | ||
| const execFileAsync = promisify(execFile); | ||
| export async function runDoctor(opts = {}) { | ||
| const now = opts.now ?? Date.now; | ||
| const checks = []; | ||
| for (const c of envChecks()) | ||
| checks.push(c); | ||
| for (const c of await configChecks()) | ||
| checks.push(c); | ||
| for (const c of await platformChecks()) | ||
| checks.push(c); | ||
| for (const c of await claudeCliChecks()) | ||
| checks.push(c); | ||
| if (!opts.skipWhisper) | ||
| for (const c of await voiceChecks()) | ||
| checks.push(c); | ||
| if (!opts.skipDario) | ||
| for (const c of await darioChecks(opts)) | ||
| checks.push(c); | ||
| const summary = checks.reduce((s, c) => ({ ...s, total: s.total + 1, [c.status]: s[c.status] + 1 }), { total: 0, ok: 0, warn: 0, fail: 0, info: 0 }); | ||
| return { | ||
| version: await readHandsVersion(), | ||
| generatedAt: now(), | ||
| checks, | ||
| summary, | ||
| }; | ||
| } | ||
| // ─── Categories ──────────────────────────────────────────────────── | ||
| function envChecks() { | ||
| return [ | ||
| { | ||
| id: 'env.hands', | ||
| category: 'environment', | ||
| status: 'info', | ||
| label: 'hands', | ||
| detail: '', // filled by caller via report.version | ||
| }, | ||
| { | ||
| id: 'env.node', | ||
| category: 'environment', | ||
| status: nodeMeetsMinimum(process.version) ? 'ok' : 'fail', | ||
| label: 'Node', | ||
| detail: process.version, | ||
| }, | ||
| { | ||
| id: 'env.platform', | ||
| category: 'environment', | ||
| status: 'info', | ||
| label: 'Platform', | ||
| detail: `${osPlatform()} ${osArch()} (${osRelease()})`, | ||
| }, | ||
| ]; | ||
| } | ||
| async function configChecks() { | ||
| const dir = getConfigDir(); | ||
| const out = []; | ||
| let dirExists = false; | ||
| let dirMode = 0; | ||
| try { | ||
| const stat = await fs.stat(dir); | ||
| dirExists = stat.isDirectory(); | ||
| dirMode = stat.mode & 0o777; | ||
| } | ||
| catch { | ||
| // dir not there — hands hasn't been configured yet, that's fine | ||
| } | ||
| if (!dirExists) { | ||
| out.push({ | ||
| id: 'config.dir', | ||
| category: 'config', | ||
| status: 'info', | ||
| label: 'config dir', | ||
| detail: `${scrubPath(dir)} — not created yet (hands auth will make it)`, | ||
| }); | ||
| return out; | ||
| } | ||
| out.push({ | ||
| id: 'config.dir', | ||
| category: 'config', | ||
| status: 'ok', | ||
| label: 'config dir', | ||
| detail: scrubPath(dir), | ||
| }); | ||
| // Permission check — ~/.hands/ should be 0700 so secrets in config | ||
| // aren't readable by other users on the same machine. | ||
| if (osPlatform() !== 'win32') { | ||
| out.push({ | ||
| id: 'config.perms', | ||
| category: 'config', | ||
| status: dirMode === 0o700 ? 'ok' : 'warn', | ||
| label: 'dir perms', | ||
| detail: `0${dirMode.toString(8)} (expected 0700)`, | ||
| }); | ||
| } | ||
| try { | ||
| const cfg = await loadConfig(); | ||
| out.push({ | ||
| id: 'config.auth', | ||
| category: 'config', | ||
| status: 'info', | ||
| label: 'auth mode', | ||
| detail: cfg.authMode, | ||
| }); | ||
| out.push({ | ||
| id: 'config.model', | ||
| category: 'config', | ||
| status: 'info', | ||
| label: 'model', | ||
| detail: cfg.model, | ||
| }); | ||
| out.push({ | ||
| id: 'config.budget', | ||
| category: 'config', | ||
| status: 'info', | ||
| label: 'budget', | ||
| detail: `$${cfg.maxBudgetUsd.toFixed(2)} / ${cfg.maxTurns} turns`, | ||
| }); | ||
| if (cfg.authMode === 'api_key' && !cfg.apiKey) { | ||
| out.push({ | ||
| id: 'config.api-key', | ||
| category: 'config', | ||
| status: 'fail', | ||
| label: 'api key', | ||
| detail: 'not set — run `hands auth`', | ||
| }); | ||
| } | ||
| } | ||
| catch (err) { | ||
| out.push({ | ||
| id: 'config.load', | ||
| category: 'config', | ||
| status: 'fail', | ||
| label: 'config file', | ||
| detail: classifyFsError(err), | ||
| }); | ||
| } | ||
| return out; | ||
| } | ||
| async function platformChecks() { | ||
| const p = await checkPlatform(); | ||
| const out = [ | ||
| { | ||
| id: 'platform.display', | ||
| category: 'platform', | ||
| status: 'info', | ||
| label: 'display', | ||
| detail: p.displayServer, | ||
| }, | ||
| { | ||
| id: 'platform.screenshot', | ||
| category: 'platform', | ||
| status: p.screenshot.available ? 'ok' : 'fail', | ||
| label: 'screenshot', | ||
| detail: p.screenshot.tool + (p.screenshot.available ? '' : ' — not installed'), | ||
| }, | ||
| { | ||
| id: 'platform.mouse', | ||
| category: 'platform', | ||
| status: p.mouse.available ? 'ok' : 'fail', | ||
| label: 'mouse', | ||
| detail: p.mouse.tool + (p.mouse.available ? '' : ' — not installed'), | ||
| }, | ||
| { | ||
| id: 'platform.keyboard', | ||
| category: 'platform', | ||
| status: p.keyboard.available ? 'ok' : 'fail', | ||
| label: 'keyboard', | ||
| detail: p.keyboard.tool + (p.keyboard.available ? '' : ' — not installed'), | ||
| }, | ||
| ]; | ||
| if (p.missingDeps.length > 0 && p.installHint) { | ||
| out.push({ | ||
| id: 'platform.install-hint', | ||
| category: 'platform', | ||
| status: 'info', | ||
| label: 'install', | ||
| detail: p.installHint, | ||
| }); | ||
| } | ||
| return out; | ||
| } | ||
| async function claudeCliChecks() { | ||
| const installed = await commandExists('claude'); | ||
| if (!installed) { | ||
| return [ | ||
| { | ||
| id: 'claude-cli.present', | ||
| category: 'claude-cli', | ||
| status: 'warn', | ||
| label: 'Claude CLI', | ||
| detail: 'not found — install with `npm i -g @anthropic-ai/claude-code` for zero-per-token Claude Login mode', | ||
| }, | ||
| ]; | ||
| } | ||
| let version = '?'; | ||
| try { | ||
| const { stdout } = await execFileAsync('claude', ['--version']); | ||
| version = stdout.trim().split(/\s+/)[0] ?? '?'; | ||
| } | ||
| catch { | ||
| // leave version as ? | ||
| } | ||
| return [ | ||
| { | ||
| id: 'claude-cli.present', | ||
| category: 'claude-cli', | ||
| status: 'ok', | ||
| label: 'Claude CLI', | ||
| detail: `v${version}`, | ||
| }, | ||
| ]; | ||
| } | ||
| async function voiceChecks() { | ||
| const ok = await isWhisperInstalled(); | ||
| return [ | ||
| { | ||
| id: 'voice.whisper', | ||
| category: 'voice', | ||
| status: ok ? 'ok' : 'info', | ||
| label: 'whisper.cpp', | ||
| detail: ok ? 'installed' : 'not installed — run `hands voice-setup` to enable --voice mode', | ||
| }, | ||
| ]; | ||
| } | ||
| async function darioChecks(opts) { | ||
| const baseUrl = process.env['ANTHROPIC_BASE_URL']; | ||
| if (!baseUrl) { | ||
| return [ | ||
| { | ||
| id: 'dario.base-url', | ||
| category: 'dario', | ||
| status: 'info', | ||
| label: 'routing', | ||
| detail: 'ANTHROPIC_BASE_URL not set — SDK mode will hit api.anthropic.com directly (per-token billing)', | ||
| }, | ||
| ]; | ||
| } | ||
| const fetchImpl = opts.fetchImpl ?? fetch; | ||
| const start = Date.now(); | ||
| try { | ||
| const res = await fetchImpl(`${trimTrailingSlash(baseUrl)}/health`, { | ||
| signal: AbortSignal.timeout(3000), | ||
| }); | ||
| const durationMs = Date.now() - start; | ||
| if (res.ok) { | ||
| return [ | ||
| { | ||
| id: 'dario.reachable', | ||
| category: 'dario', | ||
| status: 'ok', | ||
| label: 'proxy', | ||
| detail: `${baseUrl} — ${res.status} in ${durationMs}ms`, | ||
| durationMs, | ||
| }, | ||
| ]; | ||
| } | ||
| return [ | ||
| { | ||
| id: 'dario.reachable', | ||
| category: 'dario', | ||
| status: 'warn', | ||
| label: 'proxy', | ||
| detail: `${baseUrl} — ${res.status} ${res.statusText}`, | ||
| durationMs, | ||
| }, | ||
| ]; | ||
| } | ||
| catch (err) { | ||
| return [ | ||
| { | ||
| id: 'dario.reachable', | ||
| category: 'dario', | ||
| status: 'fail', | ||
| label: 'proxy', | ||
| detail: `${baseUrl} — ${classifyFetchError(err)}`, | ||
| durationMs: Date.now() - start, | ||
| }, | ||
| ]; | ||
| } | ||
| } | ||
| // ─── Pure helpers (exported for unit tests) ───────────────────────── | ||
| /** Minimum Node version for hands: 20.0.0 (engines.node in package.json). */ | ||
| export function nodeMeetsMinimum(version) { | ||
| const clean = version.replace(/^v/, ''); | ||
| const [major] = clean.split('.').map(Number); | ||
| return typeof major === 'number' && major >= 20; | ||
| } | ||
| /** Replace $HOME (or Windows USERPROFILE) in a path with `~` so screenshots / error messages don't leak the user's home directory. */ | ||
| export function scrubPath(s) { | ||
| const home = homedir(); | ||
| if (!home) | ||
| return s; | ||
| // Simple prefix rewrite, case-insensitive on Windows. | ||
| if (osPlatform() === 'win32') { | ||
| const sLower = s.toLowerCase(); | ||
| const homeLower = home.toLowerCase(); | ||
| if (sLower.startsWith(homeLower)) { | ||
| return '~' + s.slice(home.length); | ||
| } | ||
| } | ||
| else if (s.startsWith(home)) { | ||
| return '~' + s.slice(home.length); | ||
| } | ||
| return s; | ||
| } | ||
| /** Remove trailing slashes from a URL without regex (avoids polynomial-ReDoS). */ | ||
| export function trimTrailingSlash(url) { | ||
| let i = url.length; | ||
| while (i > 0 && url[i - 1] === '/') | ||
| i--; | ||
| return url.slice(0, i); | ||
| } | ||
| /** Convert an fs error into a short human string. */ | ||
| export function classifyFsError(err) { | ||
| if (err instanceof Error) { | ||
| const code = err.code; | ||
| if (code === 'ENOENT') | ||
| return 'not found'; | ||
| if (code === 'EACCES') | ||
| return 'permission denied'; | ||
| return `${code ?? 'error'}: ${err.message.slice(0, 80)}`; | ||
| } | ||
| return String(err).slice(0, 80); | ||
| } | ||
| /** Convert a fetch error into a short human string. */ | ||
| export function classifyFetchError(err) { | ||
| if (err instanceof Error) { | ||
| if (err.name === 'AbortError' || err.name === 'TimeoutError') | ||
| return 'timeout'; | ||
| if (err.message.includes('ECONNREFUSED')) | ||
| return 'connection refused'; | ||
| if (err.message.includes('ENOTFOUND')) | ||
| return 'dns lookup failed'; | ||
| return err.message.slice(0, 80); | ||
| } | ||
| return String(err).slice(0, 80); | ||
| } | ||
| /** Render a DoctorReport as a human-readable text block. */ | ||
| export function renderDoctorText(report) { | ||
| const lines = []; | ||
| lines.push(''); | ||
| lines.push(' hands — Doctor'); | ||
| lines.push(' ─────────────'); | ||
| lines.push(''); | ||
| // Left-pad status icons to a consistent width. | ||
| const ICON = { | ||
| ok: '[ OK ]', | ||
| warn: '[WARN]', | ||
| fail: '[FAIL]', | ||
| info: '[INFO]', | ||
| }; | ||
| // Compute column widths from the check list. | ||
| const labelWidth = Math.max(...report.checks.map(c => c.label.length), 10); | ||
| // Inject version into the first env.hands row. | ||
| const patched = report.checks.map(c => c.id === 'env.hands' ? { ...c, detail: `v${report.version}` } : c); | ||
| for (const c of patched) { | ||
| lines.push(` ${ICON[c.status]} ${c.label.padEnd(labelWidth)} ${c.detail}`); | ||
| } | ||
| lines.push(''); | ||
| const { ok, warn, fail, info } = report.summary; | ||
| lines.push(` summary: ${ok} ok · ${warn} warn · ${fail} fail · ${info} info`); | ||
| lines.push(''); | ||
| return lines.join('\n'); | ||
| } | ||
| /** Render a DoctorReport as JSON. */ | ||
| export function renderDoctorJson(report) { | ||
| return JSON.stringify(report, null, 2); | ||
| } | ||
| /** Exit code to use when `hands doctor` finishes: 1 if any check failed, 0 otherwise. */ | ||
| export function exitCodeFor(report) { | ||
| return report.summary.fail > 0 ? 1 : 0; | ||
| } | ||
| // ─── Internals ───────────────────────────────────────────────────── | ||
| async function readHandsVersion() { | ||
| try { | ||
| const here = dirname(fileURLToPath(import.meta.url)); | ||
| // dist/doctor.js → ../package.json when running as the compiled CLI; | ||
| // src/doctor.ts → ../package.json when running via tsx in dev. | ||
| const pkgPath = join(here, '..', 'package.json'); | ||
| const raw = await fs.readFile(pkgPath, 'utf-8'); | ||
| const pkg = JSON.parse(raw); | ||
| return pkg.version ?? '0.0.0'; | ||
| } | ||
| catch { | ||
| return '0.0.0'; | ||
| } | ||
| } | ||
| //# sourceMappingURL=doctor.js.map |
| {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"} |
| export declare function initInteractive(): Promise<void>; | ||
| //# sourceMappingURL=init.d.ts.map |
| {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAkFrD"} |
+97
| // `hands init` — interactive first-run setup. | ||
| // | ||
| // One command that walks a new user through the choices hands asks them | ||
| // to make before the first `hands run`: which auth mode, whether to set | ||
| // up voice, whether they're routing through dario. Delegates the | ||
| // mode-specific flows (auth → authInteractive, voice → setupWhisper) | ||
| // to the existing modules so there's no duplicated logic. | ||
| // | ||
| // Safe to run repeatedly — every step asks before changing anything, and | ||
| // sane defaults reflect the current config. | ||
| import { commandExists } from './platform/index.js'; | ||
| import { authInteractive } from './auth.js'; | ||
| import { loadConfig } from './util/config.js'; | ||
| import { isWhisperInstalled, setupWhisper } from './voice/index.js'; | ||
| import * as output from './util/output.js'; | ||
| export async function initInteractive() { | ||
| const { default: inquirer } = await import('inquirer'); | ||
| output.header('hands — First-run setup'); | ||
| console.log(); | ||
| // Environment snapshot, informational. | ||
| const claudeInstalled = await commandExists('claude'); | ||
| const whisperReady = await isWhisperInstalled(); | ||
| const darioRoutingHint = process.env['ANTHROPIC_BASE_URL']; | ||
| console.log(` ${fmt(claudeInstalled)} Claude CLI ${claudeInstalled ? 'installed' : 'NOT installed (needed for Claude Login mode)'}`); | ||
| console.log(` ${fmt(whisperReady)} whisper.cpp ${whisperReady ? 'installed' : 'not installed (voice mode off)'}`); | ||
| console.log(` ${fmt(!!darioRoutingHint)} ANTHROPIC_BASE_URL ${darioRoutingHint ? '= ' + darioRoutingHint : 'not set (SDK mode hits api.anthropic.com directly)'}`); | ||
| console.log(); | ||
| // Step 1 — auth mode. If claude CLI is missing, suggest installing it | ||
| // before bailing into API-key-only territory. | ||
| if (!claudeInstalled) { | ||
| const { installClaude } = await inquirer.prompt([{ | ||
| type: 'confirm', | ||
| name: 'installClaude', | ||
| message: 'Claude CLI (`claude`) is not on PATH. Claude Login mode needs it and costs zero per token. Install it now? (`npm i -g @anthropic-ai/claude-code`)', | ||
| default: true, | ||
| }]); | ||
| if (installClaude) { | ||
| output.info('Run: npm i -g @anthropic-ai/claude-code'); | ||
| output.info('Then re-run `hands init` to continue.'); | ||
| return; | ||
| } | ||
| output.warn('Continuing without Claude CLI — only API Key mode will be available.'); | ||
| } | ||
| // Step 2 — delegate to the existing auth flow. It handles Claude Login | ||
| // vs API Key, prompts for a key if needed, and saves config. | ||
| console.log(); | ||
| output.info('Configuring authentication...'); | ||
| await authInteractive(); | ||
| // Step 3 — voice setup offer. Non-destructive skip if already installed. | ||
| console.log(); | ||
| if (whisperReady) { | ||
| output.success('whisper.cpp already installed — `--voice` mode is ready.'); | ||
| } | ||
| else { | ||
| const { wantVoice } = await inquirer.prompt([{ | ||
| type: 'confirm', | ||
| name: 'wantVoice', | ||
| message: 'Set up voice input now? Downloads whisper.cpp locally (~148MB for the base.en model). Offline, private.', | ||
| default: false, | ||
| }]); | ||
| if (wantVoice) { | ||
| await setupWhisper('base'); | ||
| } | ||
| else { | ||
| output.info('Skipped. Run `hands voice-setup` later to enable `--voice`.'); | ||
| } | ||
| } | ||
| // Step 4 — dario routing nudge. Only meaningful for API Key mode (SDK | ||
| // mode routes to whatever ANTHROPIC_BASE_URL points at). We don't | ||
| // write env vars for the user — shells are too varied — we just | ||
| // surface the instruction. | ||
| console.log(); | ||
| const config = await loadConfig(); | ||
| if (config.authMode === 'api_key' && !darioRoutingHint) { | ||
| output.info('Tip: if you run [dario](https://github.com/askalf/dario) locally, point SDK mode at it to bill against your Claude Max subscription instead of per-token API overage:'); | ||
| console.log(); | ||
| console.log(' export ANTHROPIC_BASE_URL=http://localhost:3456'); | ||
| console.log(' export ANTHROPIC_API_KEY=dario'); | ||
| console.log(); | ||
| output.info('(Set these in your shell before running `hands`. The SDK client reads them by default.)'); | ||
| } | ||
| // Final summary. | ||
| console.log(); | ||
| output.header('Ready'); | ||
| output.success(`auth: ${config.authMode}${config.authMode === 'api_key' && config.apiKey ? ' (key stored)' : ''}`); | ||
| output.success(`model: ${config.model}`); | ||
| output.success(`budget: $${config.maxBudgetUsd.toFixed(2)} / ${config.maxTurns} turns`); | ||
| output.success(`voice: ${(await isWhisperInstalled()) ? 'ready' : 'not installed'}`); | ||
| console.log(); | ||
| output.info('Try it:'); | ||
| console.log(' hands run "open notepad and type hello world"'); | ||
| } | ||
| function fmt(ok) { | ||
| // ASCII-only to avoid codepage fights in Windows terminals. | ||
| return ok ? '[ok] ' : '[miss]'; | ||
| } | ||
| //# sourceMappingURL=init.js.map |
| {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"} |
| export interface AuditEntry { | ||
| /** Unix ms. Populated by appendAudit if omitted. */ | ||
| ts?: number | undefined; | ||
| /** Which tool was invoked (e.g. `computer`, `bash`, `text_editor`). */ | ||
| tool: string; | ||
| /** Sub-action within the tool (e.g. `screenshot`, `left_click`, `key`). */ | ||
| action?: string | undefined; | ||
| /** Summarized args — keep short; we're not storing full command bodies. */ | ||
| args?: Record<string, unknown> | undefined; | ||
| /** Wall-clock ms the tool call took. */ | ||
| durationMs?: number | undefined; | ||
| /** Whether the tool reported success. */ | ||
| ok: boolean; | ||
| /** Short error excerpt if ok=false. */ | ||
| error?: string | undefined; | ||
| /** True when this call was suppressed by --dry-run. */ | ||
| dryRun?: boolean | undefined; | ||
| } | ||
| /** | ||
| * Append a single entry to the audit log. Non-fatal on any error. | ||
| * Rotates the live file to `.old` if it would exceed MAX_BYTES after | ||
| * this append. | ||
| */ | ||
| export declare function appendAudit(entry: AuditEntry): Promise<void>; | ||
| /** | ||
| * Rotate `audit.jsonl` → `audit.jsonl.old` when the live file exceeds | ||
| * MAX_BYTES. Silent no-op if the file doesn't exist or is small. | ||
| */ | ||
| export declare function rotateIfNeeded(): Promise<'rotated' | 'kept' | 'absent'>; | ||
| /** | ||
| * Read the most recent N audit entries (from the live file only — old | ||
| * archive is not scanned). Returns newest-last. Best-effort parse: | ||
| * malformed lines are skipped rather than failing the whole read. | ||
| */ | ||
| export declare function readAuditHistory(limit?: number): Promise<AuditEntry[]>; | ||
| /** | ||
| * Turn an audit entry into the single-line JSON we store. Exported | ||
| * for testability — the only reason this is separate from the | ||
| * JSON.stringify call is so tests can pin the line shape without | ||
| * needing a temp filesystem. | ||
| */ | ||
| export declare function summarizeForAudit(entry: AuditEntry): string; | ||
| /** | ||
| * Absolute paths to the audit files. Exported so tests and docs can | ||
| * reference them without duplicating the path construction. | ||
| */ | ||
| export declare function getAuditPaths(): { | ||
| live: string; | ||
| archived: string; | ||
| dir: string; | ||
| maxBytes: number; | ||
| }; | ||
| //# sourceMappingURL=audit.d.ts.map |
| {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/util/audit.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC3C,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,yCAAyC;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlE;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC,CAU7E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAkBjF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOjG"} |
| // Append-only audit log of every tool invocation the agent makes. | ||
| // | ||
| // Every call into the agent's shell / keyboard / mouse / screenshot tools | ||
| // is recorded at `~/.hands/audit.jsonl`. Non-fatal: if the append fails | ||
| // (disk full, permission change, etc.) we log to stderr and continue — | ||
| // the audit log is diagnostic, not authoritative. | ||
| // | ||
| // Only SDK mode is covered. Claude Login mode spawns the `claude` child | ||
| // process and delegates tool execution there, so those actions are | ||
| // outside hands's scope to log. | ||
| // | ||
| // Rotation is simple: when the live file crosses `MAX_BYTES`, it's moved | ||
| // to `audit.jsonl.old` (overwriting any prior archive) and a fresh empty | ||
| // file takes its place. Two files total, bounded disk cost. | ||
| import { promises as fs } from 'node:fs'; | ||
| import { homedir } from 'node:os'; | ||
| import { join } from 'node:path'; | ||
| const AUDIT_DIR = join(homedir(), '.hands'); | ||
| const AUDIT_PATH = join(AUDIT_DIR, 'audit.jsonl'); | ||
| const AUDIT_OLD_PATH = join(AUDIT_DIR, 'audit.jsonl.old'); | ||
| const MAX_BYTES = 10 * 1024 * 1024; // 10 MB cap per live file. | ||
| /** | ||
| * Append a single entry to the audit log. Non-fatal on any error. | ||
| * Rotates the live file to `.old` if it would exceed MAX_BYTES after | ||
| * this append. | ||
| */ | ||
| export async function appendAudit(entry) { | ||
| const full = { ts: Date.now(), ...entry }; | ||
| try { | ||
| await fs.mkdir(AUDIT_DIR, { recursive: true, mode: 0o700 }); | ||
| await rotateIfNeeded(); | ||
| const line = summarizeForAudit(full) + '\n'; | ||
| await fs.appendFile(AUDIT_PATH, line, { mode: 0o600 }); | ||
| } | ||
| catch (err) { | ||
| // Never crash the agent over a logging failure. | ||
| const msg = err instanceof Error ? err.message : String(err); | ||
| process.stderr.write(`[hands.audit] append failed: ${msg}\n`); | ||
| } | ||
| } | ||
| /** | ||
| * Rotate `audit.jsonl` → `audit.jsonl.old` when the live file exceeds | ||
| * MAX_BYTES. Silent no-op if the file doesn't exist or is small. | ||
| */ | ||
| export async function rotateIfNeeded() { | ||
| try { | ||
| const stat = await fs.stat(AUDIT_PATH); | ||
| if (stat.size < MAX_BYTES) | ||
| return 'kept'; | ||
| await fs.rename(AUDIT_PATH, AUDIT_OLD_PATH); | ||
| return 'rotated'; | ||
| } | ||
| catch (err) { | ||
| if (err.code === 'ENOENT') | ||
| return 'absent'; | ||
| throw err; | ||
| } | ||
| } | ||
| /** | ||
| * Read the most recent N audit entries (from the live file only — old | ||
| * archive is not scanned). Returns newest-last. Best-effort parse: | ||
| * malformed lines are skipped rather than failing the whole read. | ||
| */ | ||
| export async function readAuditHistory(limit = 100) { | ||
| try { | ||
| const raw = await fs.readFile(AUDIT_PATH, 'utf-8'); | ||
| const lines = raw.split('\n').filter(Boolean); | ||
| const slice = lines.slice(-limit); | ||
| const out = []; | ||
| for (const line of slice) { | ||
| try { | ||
| out.push(JSON.parse(line)); | ||
| } | ||
| catch { | ||
| // Skip malformed line. | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| catch (err) { | ||
| if (err.code === 'ENOENT') | ||
| return []; | ||
| throw err; | ||
| } | ||
| } | ||
| /** | ||
| * Turn an audit entry into the single-line JSON we store. Exported | ||
| * for testability — the only reason this is separate from the | ||
| * JSON.stringify call is so tests can pin the line shape without | ||
| * needing a temp filesystem. | ||
| */ | ||
| export function summarizeForAudit(entry) { | ||
| return JSON.stringify(entry); | ||
| } | ||
| /** | ||
| * Absolute paths to the audit files. Exported so tests and docs can | ||
| * reference them without duplicating the path construction. | ||
| */ | ||
| export function getAuditPaths() { | ||
| return { | ||
| live: AUDIT_PATH, | ||
| archived: AUDIT_OLD_PATH, | ||
| dir: AUDIT_DIR, | ||
| maxBytes: MAX_BYTES, | ||
| }; | ||
| } | ||
| //# sourceMappingURL=audit.js.map |
| {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/util/audit.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,uEAAuE;AACvE,kDAAkD;AAClD,EAAE;AACF,wEAAwE;AACxE,mEAAmE;AACnE,gCAAgC;AAChC,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,4DAA4D;AAE5D,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAClD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC1D,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAE,2BAA2B;AAqBhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAiB;IACjD,MAAM,IAAI,GAAe,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5C,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gDAAgD;QAChD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS;YAAE,OAAO,MAAM,CAAC;QACzC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACtE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,GAAG;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAChE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,cAAc;QACxB,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC"} |
+45
-0
@@ -14,2 +14,47 @@ # Changelog | ||
| ## [0.2.0] - 2026-04-25 | ||
| Three new commands shipped between v0.1.0 and v0.2.0 — `hands init` (interactive first-run setup), `audit log + --dry-run` (trust-story for the SDK-mode tool dispatch path), and `hands doctor` (aggregated health report). All three are additive; no behavior change for existing v0.1.0 users. | ||
| ### Added — `hands init` (interactive first-run wizard) | ||
| One command to walk a new user through every choice hands asks them to make before their first `hands run`. Environment snapshot at the top (Claude CLI install state, whisper install state, `ANTHROPIC_BASE_URL` routing hint) so it's obvious what will be skipped, then delegates step-by-step to the existing flows — no duplicated logic. | ||
| - If `claude` CLI is missing, offers the one-liner install (`npm i -g @anthropic-ai/claude-code`) and bails cleanly so the user can re-run after install. Continuing without it warns that only API Key mode will be available. | ||
| - Calls the existing `authInteractive()` for Claude Login vs API Key selection (same flow `hands auth` uses). | ||
| - Offers whisper.cpp setup if not already installed. Non-destructive skip if it's there. | ||
| - If auth mode lands on API Key and `ANTHROPIC_BASE_URL` isn't set, surfaces a dario routing tip. Instructions only — we don't write env vars for the user (shells are too varied). | ||
| - Final summary prints auth / model / budget / turns / voice state plus a try-it one-liner. | ||
| Safe to re-run — every step asks before changing anything, and defaults reflect current config. ASCII status markers (`[ok]`/`[miss]`) instead of Unicode to avoid codepage fights in Windows terminals. | ||
| One new smoke-test assertion (init exports `initInteractive`). 36 total (up from 35). | ||
| ### Added — audit log + `--dry-run` | ||
| Trust-story enhancements for a tool that takes shell, keyboard, mouse, and screenshot access on the user's behalf. Both are SDK-mode features — Claude Login mode spawns the `claude` child process and dispatches tools internally, so hands can't intercept actions there. | ||
| **Audit log** — every tool invocation in SDK mode appends one JSONL line to `~/.hands/audit.jsonl`: timestamp, tool name, action, summarized args (image bytes stripped, long strings truncated to 200 chars), wall-clock duration, and outcome (ok/error/dry-run). Non-fatal on failure — if the log-write errors out (disk full, permission flipped), hands logs to stderr and keeps going; the audit log is diagnostic, not authoritative. The live file rotates to `audit.jsonl.old` when it exceeds 10 MB; two files total, bounded disk cost. | ||
| **`hands run --dry-run`** — the agent plans and emits tool calls, but every execution is stubbed out. Shell commands don't run, keys don't press, mouse doesn't move, screenshots return a text placeholder. The agent sees "success" for each stubbed action so the loop continues to completion. Audit-logged with `dryRun: true` so a review shows both what the agent wanted to do and the fact that it didn't. Not supported in Claude Login mode (forces SDK fallback for the invocation, with a clear warning). | ||
| **New exports for library callers:** `appendAudit`, `rotateIfNeeded`, `readAuditHistory`, `summarizeForAudit`, `getAuditPaths` from `util/audit.js`, plus `summarizeToolArgs` from `sdk-mode.js`. 7 new test assertions covering: append+read round-trip, dir-creation on first append, summarization correctness (image bytes dropped, string truncation), rotation behaviour (rotates over cap, returns absent when no file exists, fresh appends after rotation don't read the archive), and malformed-line tolerance in history reads. 35 tests total (up from 28). | ||
| ### Added — `hands doctor` | ||
| Aggregated health report mirroring the pattern from dario / deepdive / claude-bridge. One command probes every subsystem hands depends on and produces a paste-able table: | ||
| - **env** — hands version, Node version (fail below 20), platform + arch + OS release. | ||
| - **config** — `~/.hands/` dir state + perms (warn if not 0700 on non-Windows), auth mode, model, budget, and a fail if `api_key` mode is set but no key stored. | ||
| - **platform** — display server, and availability of screenshot / mouse / keyboard tool for the detected platform (PowerShell on Windows, cliclick on macOS, xdotool+scrot on X11 Linux, ydotool+grim on Wayland). Surfaces the platform-specific install hint if anything's missing. | ||
| - **claude-cli** — `claude` on PATH + version (warn if absent, since Claude Login mode needs it). | ||
| - **voice** — whisper.cpp install state for `--voice` mode. | ||
| - **dario** — if `ANTHROPIC_BASE_URL` is set, probe `/health` with a 3s timeout and surface the verdict. Skipped (info-only) when the env var isn't set. | ||
| Flags: `--json` for structured output (scrapeable in CI, usable by claude-bridge's `/status`), `--skip-dario` / `--skip-whisper` for environments where those checks aren't meaningful. Exit code 1 on any fail, 0 otherwise. | ||
| Pure helpers (`nodeMeetsMinimum`, `scrubPath`, `trimTrailingSlash`, `classifyFsError`, `classifyFetchError`, `renderDoctorText`, `renderDoctorJson`, `exitCodeFor`) all exported for library use. 10 new test assertions in `test/doctor.test.mjs` covering version matching, path scrubbing, URL trimming, error classification, text/JSON rendering, and exit-code logic. 28 total (up from 18). | ||
| `hands check` remains for backwards compat — it's a narrower subset of what `doctor` covers. | ||
| ### Release — publish-ready for npm + public-flip | ||
@@ -16,0 +61,0 @@ |
+24
-1
| #!/usr/bin/env node | ||
| import { Command } from 'commander'; | ||
| import { authInteractive, showAuthStatus } from './auth.js'; | ||
| import { initInteractive } from './init.js'; | ||
| import { run } from './run.js'; | ||
@@ -8,2 +9,3 @@ import { checkPlatform } from './platform/index.js'; | ||
| import { isWhisperInstalled, setupWhisper } from './voice/index.js'; | ||
| import { runDoctor, renderDoctorText, renderDoctorJson, exitCodeFor } from './doctor.js'; | ||
| import * as output from './util/output.js'; | ||
@@ -22,2 +24,8 @@ import chalk from 'chalk'; | ||
| program | ||
| .command('init') | ||
| .description('Interactive first-run setup: auth, voice (optional), dario routing tips. Safe to re-run.') | ||
| .action(async () => { | ||
| await initInteractive(); | ||
| }); | ||
| program | ||
| .command('auth') | ||
@@ -42,2 +50,3 @@ .description('Configure authentication (API key or Claude OAuth)') | ||
| .option('-v, --voice', 'Use voice input (microphone → whisper transcription)') | ||
| .option('--dry-run', 'Log every tool call to ~/.hands/audit.jsonl but don\'t actually execute. SDK mode only.') | ||
| .action(async (prompt, opts) => { | ||
@@ -55,3 +64,3 @@ // Apply CLI overrides to config | ||
| } | ||
| await run(prompt, { voice: opts.voice }); | ||
| await run(prompt, { voice: opts.voice, dryRun: opts.dryRun }); | ||
| }); | ||
@@ -95,2 +104,16 @@ program | ||
| program | ||
| .command('doctor') | ||
| .description('Aggregated health report — env, config, platform tools, Claude CLI, voice, dario routing. Paste into issues.') | ||
| .option('--json', 'Emit structured JSON instead of the text table') | ||
| .option('--skip-dario', 'Skip the dario reachability probe even if ANTHROPIC_BASE_URL is set') | ||
| .option('--skip-whisper', 'Skip the whisper-install check (useful in CI without the binary)') | ||
| .action(async (opts) => { | ||
| const report = await runDoctor({ | ||
| skipDario: !!opts.skipDario, | ||
| skipWhisper: !!opts.skipWhisper, | ||
| }); | ||
| process.stdout.write(opts.json ? renderDoctorJson(report) + '\n' : renderDoctorText(report)); | ||
| process.exit(exitCodeFor(report)); | ||
| }); | ||
| program | ||
| .command('voice-setup') | ||
@@ -97,0 +120,0 @@ .description('Download whisper.cpp binary and speech model for voice control') |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,8EAA8E,CAAC;KAC3F,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0FAA0F,CAAC;KACvG,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,eAAe,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,UAAU,EAAE,+BAA+B,CAAC;KACrD,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC;KAC7C,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,WAAW,CAAC;KAC1C,MAAM,CAAC,aAAa,EAAE,sDAAsD,CAAC;KAC7E,MAAM,CAAC,WAAW,EAAE,yFAAyF,CAAC;KAC9G,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IAC7B,gCAAgC;IAChC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5C,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM;YAAE,SAAS,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IAEpC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,IAAI,GAAG,CAAC,EAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,sBAAsB,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC;IAC3H,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8GAA8G,CAAC;KAC3H,MAAM,CAAC,QAAQ,EAAE,gDAAgD,CAAC;KAClE,MAAM,CAAC,cAAc,EAAE,qEAAqE,CAAC;KAC7F,MAAM,CAAC,gBAAgB,EAAE,kEAAkE,CAAC;KAC5F,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;QAC7B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;QAC3B,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;KAChC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,gBAAgB,EAAE,uCAAuC,EAAE,MAAM,CAAC;KACzE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAmC,CAAC;IACvD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,aAAa,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC9C,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,CAAC;KAC5D,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAC9C,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"} |
+2
-0
| export interface RunOptions { | ||
| voice?: boolean; | ||
| /** When set, SDK mode's tool calls are logged + stubbed — nothing fires on the host. Not supported in Claude Login mode; forces a fallback. */ | ||
| dryRun?: boolean; | ||
| } | ||
| export declare function run(prompt: string, options?: RunOptions): Promise<void>; | ||
| //# sourceMappingURL=run.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CjF"} | ||
| {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+IAA+I;IAC/I,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDjF"} |
+14
-1
@@ -8,2 +8,15 @@ import { loadConfig } from './util/config.js'; | ||
| const config = await loadConfig(); | ||
| // --dry-run only works in SDK mode. In Claude Login (oauth) mode, `claude` | ||
| // spawns as a child process and dispatches tools itself, so hands can't | ||
| // intercept. Force API-key mode for this invocation so dry-run actually | ||
| // holds; fail loudly if no API key. | ||
| if (options.dryRun && config.authMode === 'oauth') { | ||
| if (!config.apiKey) { | ||
| output.error('--dry-run only works in SDK mode (API key), and no API key is configured.'); | ||
| output.info('Run `hands auth` to add an API key, or drop --dry-run to use Claude Login mode.'); | ||
| process.exit(1); | ||
| } | ||
| output.warn('--dry-run only works in SDK mode. Forcing SDK mode for this invocation.'); | ||
| config.authMode = 'api_key'; | ||
| } | ||
| // Auto-detect auth mode | ||
@@ -34,3 +47,3 @@ if (config.authMode === 'oauth') { | ||
| else { | ||
| const result = await runSdkMode(prompt, config); | ||
| const result = await runSdkMode(prompt, config, { dryRun: options.dryRun }); | ||
| if (result.text) { | ||
@@ -37,0 +50,0 @@ output.header('Result'); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAM3C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,MAAc,EAAE,UAAsB,EAAE;IAChE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,wBAAwB;IACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;gBACzE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACrF,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,uDAAuD;YACvD,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,EAC1D,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,KAAK,CACb,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"} | ||
| {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"} |
@@ -9,4 +9,10 @@ import type { AgentConfig } from './util/config.js'; | ||
| } | ||
| export declare function runSdkMode(prompt: string, config: AgentConfig): Promise<RunResult>; | ||
| export interface SdkModeOptions { | ||
| /** When true, every tool call is logged to audit + stubbed — no shell, mouse, keyboard, or screenshot actually fires. Agent still sees "success" results so the loop continues. */ | ||
| dryRun?: boolean | undefined; | ||
| } | ||
| export declare function runSdkMode(prompt: string, config: AgentConfig, opts?: SdkModeOptions): Promise<RunResult>; | ||
| /** Short, lossy-ok summary of tool args for the audit log. Strips image bytes, truncates long strings. */ | ||
| export declare function summarizeToolArgs(toolName: string, input: Record<string, unknown>): Record<string, unknown>; | ||
| export {}; | ||
| //# sourceMappingURL=sdk-mode.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sdk-mode.d.ts","sourceRoot":"","sources":["../src/sdk-mode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAoDD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAkIxF"} | ||
| {"version":3,"file":"sdk-mode.d.ts","sourceRoot":"","sources":["../src/sdk-mode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAoDD,MAAM,WAAW,cAAc;IAC7B,mLAAmL;IACnL,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAkInH;AAyED,0GAA0G;AAC1G,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAW3G"} |
+90
-3
@@ -8,2 +8,3 @@ import Anthropic from '@anthropic-ai/sdk'; | ||
| import { checkCommand, GUARDRAIL_PROMPT } from './util/guardrails.js'; | ||
| import { appendAudit } from './util/audit.js'; | ||
| // Pricing per million tokens (claude-sonnet-4-6) | ||
@@ -56,3 +57,3 @@ const PRICING = { | ||
| ${GUARDRAIL_PROMPT}`; | ||
| export async function runSdkMode(prompt, config) { | ||
| export async function runSdkMode(prompt, config, opts = {}) { | ||
| const client = new Anthropic({ apiKey: config.apiKey }); | ||
@@ -136,3 +137,3 @@ const { width: realWidth, height: realHeight } = await getScreenSize(); | ||
| try { | ||
| result = await executeComputerAction(block.name, block.input, scaleFactor); | ||
| result = await executeComputerAction(block.name, block.input, scaleFactor, { dryRun: opts.dryRun }); | ||
| } | ||
@@ -172,4 +173,90 @@ catch (err) { | ||
| } | ||
| async function executeComputerAction(toolName, input, scaleFactor) { | ||
| /** | ||
| * Audit + dry-run wrapper around the real tool dispatcher. Every call | ||
| * (real or dry-run) is appended to `~/.hands/audit.jsonl` with timing | ||
| * and outcome. When `opts.dryRun` is set, no shell / mouse / keyboard | ||
| * / screenshot actually fires — the agent sees a success stub so the | ||
| * loop continues, but the log shows the call was suppressed. | ||
| */ | ||
| async function executeComputerAction(toolName, input, scaleFactor, opts = {}) { | ||
| const action = input['action']; | ||
| const auditArgs = summarizeToolArgs(toolName, input); | ||
| const start = Date.now(); | ||
| if (opts.dryRun) { | ||
| const stub = dryRunStub(toolName, action, input); | ||
| output.action(toolName, `[dry-run] ${action ?? describeCall(toolName, input)}`); | ||
| await appendAudit({ tool: toolName, action, args: auditArgs, durationMs: 0, ok: true, dryRun: true }); | ||
| return [{ type: 'text', text: stub }]; | ||
| } | ||
| try { | ||
| const result = await executeComputerActionInner(toolName, input, scaleFactor); | ||
| await appendAudit({ tool: toolName, action, args: auditArgs, durationMs: Date.now() - start, ok: true }); | ||
| return result; | ||
| } | ||
| catch (err) { | ||
| const msg = err instanceof Error ? err.message : String(err); | ||
| await appendAudit({ tool: toolName, action, args: auditArgs, durationMs: Date.now() - start, ok: false, error: msg.slice(0, 200) }); | ||
| throw err; | ||
| } | ||
| } | ||
| /** What a tool call would do, rendered as a short human string. */ | ||
| function dryRunStub(toolName, action, input) { | ||
| if (toolName === 'computer' && action) { | ||
| switch (action) { | ||
| case 'screenshot': return '[dry-run] would take screenshot'; | ||
| case 'left_click': | ||
| case 'right_click': | ||
| case 'double_click': { | ||
| const coord = input['coordinate']; | ||
| return `[dry-run] would ${action.replace('_', ' ')} at (${coord?.[0] ?? '?'}, ${coord?.[1] ?? '?'})`; | ||
| } | ||
| case 'mouse_move': { | ||
| const coord = input['coordinate']; | ||
| return `[dry-run] would move mouse to (${coord?.[0] ?? '?'}, ${coord?.[1] ?? '?'})`; | ||
| } | ||
| case 'type': { | ||
| const text = input['text'] ?? ''; | ||
| return `[dry-run] would type: ${text.length > 60 ? text.slice(0, 60) + '...' : text}`; | ||
| } | ||
| case 'key': | ||
| return `[dry-run] would press key: ${input['text']}`; | ||
| case 'scroll': { | ||
| const coord = input['coordinate']; | ||
| return `[dry-run] would scroll at (${coord?.[0] ?? '?'}, ${coord?.[1] ?? '?'})`; | ||
| } | ||
| default: | ||
| return `[dry-run] would invoke computer action: ${action}`; | ||
| } | ||
| } | ||
| if (toolName === 'bash') { | ||
| const cmd = input['command'] ?? ''; | ||
| return `[dry-run] would execute: ${cmd.length > 120 ? cmd.slice(0, 120) + '...' : cmd}`; | ||
| } | ||
| return `[dry-run] would invoke ${toolName}`; | ||
| } | ||
| /** Short, lossy-ok summary of tool args for the audit log. Strips image bytes, truncates long strings. */ | ||
| export function summarizeToolArgs(toolName, input) { | ||
| const out = {}; | ||
| for (const [k, v] of Object.entries(input)) { | ||
| if (k === 'image' || k === 'data' || k === 'source') | ||
| continue; // never log base64 image bytes | ||
| if (typeof v === 'string') { | ||
| out[k] = v.length > 200 ? v.slice(0, 200) + '…' : v; | ||
| } | ||
| else { | ||
| out[k] = v; | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| /** Describe a non-computer tool call when `action` isn't present. */ | ||
| function describeCall(toolName, input) { | ||
| if (toolName === 'bash') { | ||
| const cmd = input['command']; | ||
| return cmd ? cmd.slice(0, 60) : 'bash'; | ||
| } | ||
| return toolName; | ||
| } | ||
| async function executeComputerActionInner(toolName, input, scaleFactor) { | ||
| const action = input['action']; | ||
| // Scale coordinates from screenshot space back to real screen space | ||
@@ -176,0 +263,0 @@ const scaleCoord = (coord) => [Math.round(coord[0] / scaleFactor), Math.round(coord[1] / scaleFactor)]; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sdk-mode.js","sourceRoot":"","sources":["../src/sdk-mode.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"sdk-mode.js","sourceRoot":"","sources":["../src/sdk-mode.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "@askalf/hands", | ||
| "version": "0.1.0", | ||
| "version": "0.2.0", | ||
| "description": "Computer-use agent. Your LLM on your mouse, keyboard, and screen. PowerShell-first, voice optional, safety guardrails. Routes through dario or any Anthropic-compat endpoint.", | ||
@@ -5,0 +5,0 @@ "main": "./dist/cli.js", |
+54
-12
@@ -20,20 +20,16 @@ # hands | ||
| ```bash | ||
| # 1. Install Claude CLI (if you don't have it) | ||
| npm i -g @anthropic-ai/claude-code | ||
| claude auth login | ||
| # 1. One-shot interactive setup — auth + voice (optional) + dario routing tips | ||
| hands init | ||
| # 2. Authenticate | ||
| hands auth | ||
| # Select "Claude Login" (recommended) | ||
| # 3. Run | ||
| # 2. Run | ||
| hands run "open notepad and type hello world" | ||
| # 4. Voice mode — talk to your computer | ||
| hands voice-setup # one-time: downloads whisper.cpp | ||
| # 3. Voice mode — talk to your computer (if you said yes to voice during init) | ||
| hands run "open notepad" --voice | ||
| ``` | ||
| That's it. Claude opens Notepad, types "Hello World", then asks **"What next?"** — type or speak your next command. | ||
| `hands init` walks through every choice the CLI asks you to make: installing the `claude` CLI if missing (needed for zero-per-token Claude Login mode), picking auth mode, optionally downloading whisper.cpp for voice, and — if you're on API Key mode — nudging you toward routing through [dario](https://github.com/askalf/dario) for zero per-token cost. Safe to re-run at any time. | ||
| Then Claude opens Notepad, types "Hello World", and asks **"What next?"** — type or speak your next command. | ||
| ## How It Works | ||
@@ -114,2 +110,12 @@ | ||
| ### `hands init` | ||
| Interactive first-run wizard. One command covers every choice hands asks a new user to make before their first `hands run`: install `claude` CLI if missing, pick auth mode (Claude Login vs API Key), optionally download whisper.cpp for voice, and — if you're on API Key mode — surface the dario routing tip for zero per-token cost. Delegates to the same `hands auth` / `hands voice-setup` flows the individual commands use, so there's no duplicated logic. | ||
| ```bash | ||
| hands init | ||
| ``` | ||
| Safe to re-run — every step asks before changing anything, and defaults reflect current config. Environment snapshot at the top shows what's already installed so you know what will be skipped. | ||
| ### `hands run "<prompt>"` | ||
@@ -149,5 +155,41 @@ | ||
| ### `hands run "<prompt>" --dry-run` | ||
| Run the agent without actually doing anything on the host. In SDK mode, every tool call (shell, keyboard, mouse, screenshot) is **logged and stubbed** — the agent sees success results so the loop continues, but no command executes, no key presses, no cursor moves. The audit log at `~/.hands/audit.jsonl` shows what it would have done. | ||
| ```bash | ||
| hands run "organize my downloads folder" --dry-run | ||
| # → agent plans + the audit log shows every action it would have taken | ||
| cat ~/.hands/audit.jsonl | tail -20 | ||
| ``` | ||
| Useful for reviewing an agent's plan before trusting it with a new task, or smoke-testing a prompt change without side effects. Not supported in Claude Login mode (the `claude` child process dispatches tools itself; hands can't intercept them) — `--dry-run` forces SDK mode for that invocation. | ||
| ### Audit log | ||
| Every tool invocation in SDK mode is appended to `~/.hands/audit.jsonl` with timestamp, tool name, action, summarized args (image bytes stripped, long strings truncated), duration, and outcome. The file rotates to `audit.jsonl.old` when it exceeds 10 MB. Paste the tail into issues when reporting bugs. | ||
| ```bash | ||
| tail -3 ~/.hands/audit.jsonl | ||
| # {"ts":1761307432021,"tool":"computer","action":"screenshot","args":{},"durationMs":45,"ok":true} | ||
| # {"ts":1761307432190,"tool":"bash","args":{"command":"Get-Process"},"durationMs":112,"ok":true} | ||
| # {"ts":1761307432340,"tool":"computer","action":"left_click","args":{"coordinate":[640,400]},"durationMs":22,"ok":true} | ||
| ``` | ||
| Claude Login mode delegates tool execution to the `claude` child process, which doesn't surface individual tool calls back to hands — actions there are not logged. Use SDK mode (`hands auth` → API Key, or `--dry-run` which forces SDK) if you need a full local audit trail. | ||
| ### `hands doctor` | ||
| Aggregated health report covering every subsystem hands depends on: Node version, platform, config dir state + permissions, screenshot / mouse / keyboard tool availability, Claude CLI install + version, whisper.cpp install, and — if `ANTHROPIC_BASE_URL` is set — a reachability probe for dario. Exit code 1 on any fail, 0 otherwise. Paste it into issues. | ||
| ```bash | ||
| hands doctor # text table, non-destructive (no browser opens, no config writes) | ||
| hands doctor --json # structured output for scripts | ||
| hands doctor --skip-dario # skip the dario HTTP probe | ||
| hands doctor --skip-whisper # skip the whisper-install check (useful in CI) | ||
| ``` | ||
| ### `hands check` | ||
| Verify platform dependencies are installed (including voice/whisper status). | ||
| Older narrower version of `doctor` — platform deps only. Kept for backwards compat; `doctor` covers everything `check` does plus auth + config + dario routing state. | ||
@@ -154,0 +196,0 @@ ### `hands config` |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 2 instances in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
285053
31.32%88
15.79%3406
32.63%300
16.28%9
12.5%3
200%