@holoscript/holoscript-agent 2.1.3 → 2.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +53 -5
- package/dist/index.js.map +1 -1
- package/dist/runner.js +53 -5
- package/dist/runner.js.map +1 -1
- package/dist/supervisor.js +53 -5
- package/dist/supervisor.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/identity.ts","../src/brain.ts","../src/cost-guard.ts","../src/capability-router.ts","../src/holomesh-client.ts","../src/bearer-broker.ts","../src/runner.ts","../src/cael-builder.ts","../src/tools.ts","../src/cognitive-verbs.ts","../src/commit-hook.ts","../src/ablation.ts","../src/supervisor.ts","../src/audit-log.ts","../src/supervisor-config.ts","../src/provision.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { homedir, hostname } from 'node:os';\nimport { join } from 'node:path';\nimport { createHash, createDecipheriv, randomBytes, type DecipherGCM } from 'node:crypto';\nimport { Wallet } from 'ethers';\nimport {\n createAnthropicProvider,\n createOpenAIProvider,\n createGeminiProvider,\n createMockProvider,\n createLocalLLMProvider,\n createXAIProvider,\n createOpenRouterProvider,\n resolveSovereignProviderAsync,\n} from '@holoscript/llm-provider';\nimport type { ILLMProvider, LLMProviderName } from '@holoscript/llm-provider';\nimport { loadIdentity, identityForLog } from './identity.js';\nimport { loadBrain } from './brain.js';\nimport { CostGuard, defaultPricerForProvider } from './cost-guard.js';\nimport { pickProvider, BUILT_IN_CANDIDATES } from './capability-router.js';\nimport { HolomeshClient } from './holomesh-client.js';\nimport { resolveBearerViaBroker } from './bearer-broker.js';\nimport { AgentRunner } from './runner.js';\nimport { makeCommitHook } from './commit-hook.js';\nimport { runAblation, renderAblationMarkdown } from './ablation.js';\nimport type { AblationProviderSpec, AblationTaskSpec } from './ablation.js';\nimport { Supervisor } from './supervisor.js';\nimport type { ProviderFactory } from './supervisor.js';\nimport { loadSupervisorConfig } from './supervisor-config.js';\nimport type { AgentSpec } from './supervisor-config.js';\nimport { provisionAgent } from './provision.js';\nimport { AuditLog } from './audit-log.js';\nimport { writeFileSync, readFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { AgentIdentity, BoardTask, ExecutionResult } from './types.js';\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const cmd = args[0] ?? 'help';\n\n switch (cmd) {\n case 'run':\n await cmdRun({ once: false });\n return;\n case 'tick':\n await cmdRun({ once: true });\n return;\n case 'whoami':\n await cmdWhoami();\n return;\n case 'ablate':\n await cmdAblate(args.slice(1));\n return;\n case 'supervise':\n await cmdSupervise(args.slice(1));\n return;\n case 'status':\n await cmdStatus(args.slice(1));\n return;\n case 'provision':\n await cmdProvision(args.slice(1));\n return;\n case 'audit':\n await cmdAudit(args.slice(1));\n return;\n case 'help':\n case '--help':\n case '-h':\n printHelp();\n return;\n default:\n console.error(`Unknown command: ${cmd}`);\n printHelp();\n process.exit(2);\n }\n}\n\nasync function cmdRun(opts: { once: boolean }): Promise<void> {\n const identity = loadIdentity();\n const brain = await loadBrain(identity.brainPath, scopeTierFromEnv());\n\n // Capability-aware routing (Lane 3 Phase 4 — founder ruling 2026-05-06):\n // brain.requires/prefers/avoids drives provider selection at session start;\n // HOLOSCRIPT_AGENT_PROVIDER env becomes OVERRIDE, not source-of-truth.\n // Brains with empty requires (today's default) preserve current behavior.\n const decision = pickProvider({\n brain,\n envOverride: identity.llmProvider,\n candidates: BUILT_IN_CANDIDATES,\n });\n const effectiveIdentity =\n decision.picked === identity.llmProvider\n ? identity\n : { ...identity, llmProvider: decision.picked };\n if (decision.reason === 'env-override-mismatch') {\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'capability-router-mismatch',\n envOverride: identity.llmProvider,\n unsatisfiedRequires: decision.unsatisfiedRequires,\n excludedByAvoids: decision.excludedByAvoids,\n })\n );\n }\n\n const provider = await buildProvider(effectiveIdentity);\n const costGuard = new CostGuard({\n statePath: stateFilePath(identity),\n dailyBudgetUsd: identity.budgetUsdPerDay,\n pricer: defaultPricerForProvider(effectiveIdentity.llmProvider),\n });\n // Load the seat wallet ONCE: it both signs strict-mode requests AND (when no\n // explicit bearer is set) proves ownership to the HoloKey broker to fetch the\n // mesh bearer — so the edge holds only its wallet, not a plaintext bearer.\n const seat = loadSeatWallet(identity.handle);\n let bearer = identity.x402Bearer;\n if (!bearer) {\n if (!seat) {\n throw new Error(\n 'No HOLOSCRIPT_AGENT_X402_BEARER set and no seat wallet found to resolve it from the ' +\n 'HoloKey broker. Provide a bearer, or point at the seat wallet via ' +\n 'HOLOSCRIPT_AGENT_SEATS_ROOT + HOLOSCRIPT_AGENT_SEAT_ID (+ HOLOSCRIPT_AGENT_SEAT_MASTER_KEY).'\n );\n }\n bearer = await resolveBearerViaBroker({\n privateKey: seat.wallet.privateKey,\n meshApiBase: identity.meshApiBase,\n });\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'bearer-resolved-via-broker',\n wallet: `${seat.address.slice(0, 6)}…${seat.address.slice(-4)}`,\n })\n );\n }\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer,\n teamId: identity.teamId,\n signer: buildRequestSigner(seat),\n localKnowledgePath: process.env.HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH,\n });\n\n const commitHook = buildCommitHook(identity, mesh);\n const auditLog = buildAuditLog();\n\n // Wallet-signed hardware receipts (F.123 — make the provenance artifact\n // verifiable, not plain JSON). With a seat wallet present, sign the receipt's\n // canonical body (EIP-191 personal_sign); otherwise receipts are content-hashed\n // but self-report `signed:false`.\n const signReceipt = seat\n ? async (canonical: string) => {\n const wallet = new Wallet(seat.wallet.privateKey);\n return {\n alg: 'eip191-personal-sign',\n signer: wallet.address,\n signature: await wallet.signMessage(canonical),\n };\n }\n : undefined;\n\n const runner = new AgentRunner({\n identity,\n brain,\n provider,\n costGuard,\n mesh,\n logger: (ev) => console.log(JSON.stringify({ ts: new Date().toISOString(), ...ev })),\n onTaskExecuted: commitHook,\n auditLog,\n signReceipt,\n });\n\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'boot',\n identity: identityForLog(identity),\n brain: { domain: brain.domain, tags: brain.capabilityTags, tier: brain.scopeTier },\n })\n );\n\n if (opts.once) {\n const result = await runner.tick();\n console.log(JSON.stringify({ ts: new Date().toISOString(), ev: 'tick-result', ...result }));\n return;\n }\n\n const interval = Number(process.env.HOLOSCRIPT_AGENT_TICK_MS ?? '60000');\n const onSig = () => {\n console.log(JSON.stringify({ ts: new Date().toISOString(), ev: 'shutdown' }));\n runner.stop();\n setTimeout(() => process.exit(0), 250);\n };\n process.on('SIGINT', onSig);\n process.on('SIGTERM', onSig);\n await runner.runForever({ tickIntervalMs: interval });\n}\n\nfunction supervisorProviderFactory(): ProviderFactory {\n return (spec: AgentSpec) => {\n switch (spec.provider) {\n case 'anthropic':\n return createAnthropicProvider({ defaultModel: spec.model });\n case 'openai':\n return createOpenAIProvider({ defaultModel: spec.model });\n case 'gemini':\n return createGeminiProvider({ defaultModel: spec.model });\n case 'xai':\n return createXAIProvider({ defaultModel: spec.model });\n case 'openrouter':\n return createOpenRouterProvider({ defaultModel: spec.model });\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: spec.model,\n timeoutMs: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS\n ? Number(process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS)\n : 300000,\n });\n case 'sovereign':\n // Universal sovereign-first resolution (founder 2026-06-10): serving\n // fleet → cloud → local Ollama → BYOK frontier keys — the same policy\n // HoloClaw's daemon and Brittney use. spec.model (when set) overrides.\n return resolveSovereignProviderAsync(spec.model ? { model: spec.model } : {}).then(\n (r) => r.provider\n );\n case 'mock':\n return createMockProvider();\n default:\n throw new Error(\n `Provider \"${spec.provider}\" not yet wired in supervisor — add a case here.`\n );\n }\n };\n}\n\nasync function cmdSupervise(rest: string[]): Promise<void> {\n const cfgPath = rest.find((a) => a.startsWith('--config='))?.split('=')[1];\n if (!cfgPath) {\n throw new Error('Usage: holoscript-agent supervise --config=<path-to-agents.json>');\n }\n const teamId = process.env.HOLOMESH_TEAM_ID;\n if (!teamId) throw new Error('HOLOMESH_TEAM_ID env var required for supervise command');\n\n const config = loadSupervisorConfig(cfgPath);\n const sup = new Supervisor({\n config,\n providerFactory: supervisorProviderFactory(),\n teamId,\n meshApiBase: process.env.HOLOMESH_API_BASE,\n auditLogPath: auditLogPath(),\n logger: (ev) => console.log(JSON.stringify(ev)),\n });\n\n const onSig = async () => {\n await sup.stop();\n setTimeout(() => process.exit(0), 250);\n };\n process.on('SIGINT', onSig);\n process.on('SIGTERM', onSig);\n\n await sup.start();\n console.log(\n JSON.stringify({ ts: new Date().toISOString(), ev: 'supervise-running', config: cfgPath })\n );\n\n const reportEvery = Number(process.env.HOLOSCRIPT_AGENT_STATUS_REPORT_MS ?? '300000');\n if (reportEvery > 0) {\n setInterval(() => {\n console.log(\n JSON.stringify({ ts: new Date().toISOString(), ev: 'supervisor-status', ...sup.status() })\n );\n }, reportEvery);\n }\n}\n\nasync function cmdAudit(rest: string[]): Promise<void> {\n const logPath =\n rest.find((a) => a.startsWith('--log='))?.split('=')[1] ??\n process.env.HOLOSCRIPT_AGENT_AUDIT_LOG ??\n join(homedir(), '.holoscript-agent', 'audit', 'audit.jsonl');\n const sub = rest.find((a) => !a.startsWith('--')) ?? 'rollup';\n const filter: {\n agent?: string;\n provider?: string;\n task?: string;\n kind?: string;\n limit?: number;\n } = {};\n for (const arg of rest) {\n if (arg.startsWith('--agent=')) filter.agent = arg.split('=')[1];\n if (arg.startsWith('--provider=')) filter.provider = arg.split('=')[1];\n if (arg.startsWith('--task=')) filter.task = arg.split('=')[1];\n if (arg.startsWith('--kind=')) filter.kind = arg.split('=')[1];\n if (arg.startsWith('--limit=')) filter.limit = Number(arg.split('=')[1]);\n }\n const log = new AuditLog({ logPath });\n if (sub === 'rollup') {\n console.log(JSON.stringify(log.rollup(filter as never), null, 2));\n } else if (sub === 'tail' || sub === 'query') {\n const events = log.query(filter as never);\n for (const e of events) console.log(JSON.stringify(e));\n } else {\n throw new Error(\n 'Usage: holoscript-agent audit [rollup|query|tail] [--agent=<h>] [--provider=<p>] [--task=<id>] [--kind=<k>] [--limit=<n>] [--log=<path>]'\n );\n }\n}\n\nasync function cmdProvision(rest: string[]): Promise<void> {\n const handle = rest.find((a) => a.startsWith('--handle='))?.split('=')[1];\n if (!handle) {\n throw new Error('Usage: holoscript-agent provision --handle=<name> [--execute] [--force]');\n }\n const execute = rest.includes('--execute');\n const force = rest.includes('--force');\n const founderBearer = process.env.HOLOMESH_API_KEY;\n if (!founderBearer) {\n throw new Error(\n 'HOLOMESH_API_KEY env var required for provisioning (founder-tier bearer for /register endpoints)'\n );\n }\n const result = await provisionAgent(\n {\n handle,\n founderBearer,\n meshApiBase: process.env.HOLOMESH_API_BASE,\n seatsRoot: process.env.HOLOSCRIPT_AGENT_SEATS_ROOT,\n autoJoinTeamId: rest.includes('--no-join') ? undefined : process.env.HOLOMESH_TEAM_ID,\n },\n { execute, force }\n );\n console.log(\n JSON.stringify({ ts: new Date().toISOString(), ev: 'provision-result', ...result }, null, 2)\n );\n if (result.status === 'executed' || result.status === 'reused') {\n console.log('\\n# Add these lines to your .env to use this seat:');\n for (const line of result.envVarLines) console.log(line);\n }\n}\n\nasync function cmdStatus(rest: string[]): Promise<void> {\n const cfgPath = rest.find((a) => a.startsWith('--config='))?.split('=')[1];\n if (!cfgPath) {\n throw new Error('Usage: holoscript-agent status --config=<path-to-agents.json>');\n }\n const config = loadSupervisorConfig(cfgPath);\n console.log(\n JSON.stringify(\n {\n config: cfgPath,\n agentCount: config.agents.length,\n enabled: config.agents.filter((a) => a.enabled !== false).map((a) => a.handle),\n disabled: config.agents.filter((a) => a.enabled === false).map((a) => a.handle),\n globalBudgetUsdPerDay: config.globalBudgetUsdPerDay ?? null,\n defaultTickIntervalMs: config.defaultTickIntervalMs ?? null,\n },\n null,\n 2\n )\n );\n}\n\nasync function cmdAblate(rest: string[]): Promise<void> {\n const specPath = rest.find((a) => a.startsWith('--spec='))?.split('=')[1];\n if (!specPath) {\n throw new Error(\n 'Usage: holoscript-agent ablate --spec=<path-to-ablation.json> [--out-md=<path>] [--out-json=<path>]'\n );\n }\n const outMd = rest.find((a) => a.startsWith('--out-md='))?.split('=')[1];\n const outJson = rest.find((a) => a.startsWith('--out-json='))?.split('=')[1];\n if (!existsSync(specPath)) throw new Error(`Spec file not found: ${specPath}`);\n\n const spec = JSON.parse(readFileSync(specPath, 'utf8')) as {\n task: AblationTaskSpec;\n providers: Array<{\n label: string;\n provider: 'anthropic' | 'openai' | 'gemini' | 'local-llm' | 'mock';\n model: string;\n pricePerMtokInput?: number;\n pricePerMtokOutput?: number;\n pricePerCallUsd?: number;\n }>;\n timeoutPerCellMs?: number;\n };\n\n const providers: AblationProviderSpec[] = spec.providers.map((p) => ({\n label: p.label,\n provider: p.provider,\n model: p.model,\n build: () => {\n switch (p.provider) {\n case 'anthropic':\n return createAnthropicProvider({ defaultModel: p.model });\n case 'openai':\n return createOpenAIProvider({ defaultModel: p.model });\n case 'gemini':\n return createGeminiProvider({ defaultModel: p.model });\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: p.model,\n });\n case 'mock':\n return createMockProvider();\n }\n },\n pricer:\n p.pricePerCallUsd != null\n ? () => p.pricePerCallUsd!\n : p.pricePerMtokInput != null && p.pricePerMtokOutput != null\n ? (u) =>\n (u.promptTokens * p.pricePerMtokInput! + u.completionTokens * p.pricePerMtokOutput!) /\n 1_000_000\n : undefined,\n }));\n\n const startMsg = JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'ablation-start',\n task: spec.task.taskId,\n cells: providers.length,\n });\n console.log(startMsg);\n\n const matrix = await runAblation({\n task: spec.task,\n providers,\n timeoutPerCellMs: spec.timeoutPerCellMs,\n });\n\n if (outJson) {\n mkdirSync(dirname(resolve(outJson)), { recursive: true });\n writeFileSync(outJson, JSON.stringify(matrix, null, 2), 'utf8');\n }\n if (outMd) {\n mkdirSync(dirname(resolve(outMd)), { recursive: true });\n writeFileSync(outMd, renderAblationMarkdown(matrix), 'utf8');\n }\n if (!outMd && !outJson) {\n console.log(renderAblationMarkdown(matrix));\n }\n\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'ablation-done',\n task: matrix.taskId,\n cells: matrix.cells.length,\n errors: matrix.cells.filter((c) => c.errorMessage).length,\n totalCostUsd: matrix.totalCostUsd,\n promptHash: matrix.promptHash,\n outMd: outMd ?? null,\n outJson: outJson ?? null,\n })\n );\n}\n\nasync function cmdWhoami(): Promise<void> {\n const identity = loadIdentity();\n const seat = loadSeatWallet(identity.handle);\n let bearer = identity.x402Bearer;\n if (!bearer && seat) {\n bearer = await resolveBearerViaBroker({\n privateKey: seat.wallet.privateKey,\n meshApiBase: identity.meshApiBase,\n });\n }\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer,\n teamId: identity.teamId,\n signer: buildRequestSigner(seat),\n localKnowledgePath: process.env.HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH,\n });\n const me = await mesh.whoAmI();\n console.log(JSON.stringify({ identity: identityForLog(identity), me }, null, 2));\n}\n\nasync function buildProvider(identity: AgentIdentity): Promise<ILLMProvider> {\n const p: LLMProviderName = identity.llmProvider;\n switch (p) {\n case 'anthropic':\n return createAnthropicProvider({ defaultModel: identity.llmModel });\n case 'openai':\n return createOpenAIProvider({ defaultModel: identity.llmModel });\n case 'gemini':\n return createGeminiProvider({ defaultModel: identity.llmModel });\n case 'xai':\n return createXAIProvider({ defaultModel: identity.llmModel });\n case 'openrouter':\n return createOpenRouterProvider({ defaultModel: identity.llmModel });\n case 'mock':\n return createMockProvider();\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_MODEL ?? identity.llmModel,\n // Edge devices (Jetson ~15 tok/s) need more than the 120s default.\n // HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS overrides; default 300s.\n timeoutMs: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS\n ? Number(process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS)\n : 300000,\n });\n case 'sovereign':\n // Match the supervisor (D.089 sovereign-first): serving fleet → cloud →\n // local Ollama → BYOK frontier keys. identity.llmModel (when set) overrides.\n return (\n await resolveSovereignProviderAsync(identity.llmModel ? { model: identity.llmModel } : {})\n ).provider;\n default:\n throw new Error(`Provider \"${p}\" not yet wired in CLI — add a case in buildProvider.`);\n }\n}\n\nfunction buildCommitHook(\n identity: AgentIdentity,\n mesh: HolomeshClient\n): ((result: ExecutionResult, task: BoardTask) => Promise<void>) | undefined {\n const enabled = (process.env.HOLOSCRIPT_AGENT_COMMIT_RESPONSES ?? '').toLowerCase();\n if (enabled !== '1' && enabled !== 'true') return undefined;\n\n const outputDir = process.env.HOLOSCRIPT_AGENT_OUTPUT_DIR ?? 'agent-out';\n const workingDir = process.env.HOLOSCRIPT_AGENT_WORKING_DIR ?? process.cwd();\n const scope = process.env.HOLOSCRIPT_AGENT_COMMIT_SCOPE ?? `agent(${identity.handle})`;\n const writer = makeCommitHook({ outputDir, workingDir, scope });\n\n return async (result, task) => {\n const out = await writer(result, task, identity);\n await mesh.sendMessageOnTask(\n task.id,\n `[${identity.handle}] response committed at ${out.commitHash?.slice(0, 12) ?? '(no-hash)'} -> ${out.filePath}`\n );\n if (out.commitHash) {\n await mesh.markDone(task.id, `auto: ${task.title}`, out.commitHash);\n }\n };\n}\n\n// ── Request signing (EIP-191) for strict-mode endpoints like /team/:id/join ──────────────────\n\nfunction canonicalizeSigning(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value))\n return `[${(value as unknown[]).map(canonicalizeSigning).join(',')}]`;\n const obj = value as Record<string, unknown>;\n return `{${Object.keys(obj)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${canonicalizeSigning(obj[k])}`)\n .join(',')}}`;\n}\n\ninterface SeatWallet {\n wallet: Wallet;\n address: string;\n}\n\n/**\n * Load + decrypt the seat wallet for the given handle. This is the agent's ROOT\n * credential (F.119): it both signs strict-mode requests (/join etc.) AND proves\n * ownership to the HoloKey broker to fetch the mesh bearer (bearer-broker.ts), so\n * the bearer never has to live in plaintext .env.\n *\n * `HOLOSCRIPT_AGENT_SEAT_ID` overrides the computed seat-dir name — needed when a\n * seat was provisioned under a non-default layout (e.g. the sovereign x402 seats at\n * `~/.ai-ecosystem/seats/sovereign-<surface>-<fp>-default-x402`). `HOLOSCRIPT_AGENT_SEAT_MASTER_KEY`\n * overrides the master-key path. Returns undefined when the files are absent.\n */\nfunction loadSeatWallet(handle: string): SeatWallet | undefined {\n // Fast path: raw private key in env (edge/sovereign devices that provision via\n // wallet key directly rather than encrypted seat files, e.g. Jetson).\n const rawKey = process.env.HOLOSCRIPT_AGENT_WALLET_PRIVATE_KEY;\n if (rawKey) {\n try {\n const wallet = new Wallet(rawKey);\n return { wallet, address: wallet.address };\n } catch {\n // Fall through to seat-file path if key is malformed.\n }\n }\n const seatsRoot =\n process.env.HOLOSCRIPT_AGENT_SEATS_ROOT ?? join(homedir(), '.holoscript-agent', 'seats');\n const fp = createHash('sha256').update(hostname() + homedir()).digest('hex').slice(0, 8);\n const seatId = process.env.HOLOSCRIPT_AGENT_SEAT_ID ?? `holoscript-${handle}-${fp}-x402`;\n const walletPath = join(seatsRoot, seatId, 'wallet.enc');\n const masterKeyPath =\n process.env.HOLOSCRIPT_AGENT_SEAT_MASTER_KEY ?? join(seatsRoot, '.master-key');\n if (!existsSync(walletPath) || !existsSync(masterKeyPath)) return undefined;\n try {\n const blob = JSON.parse(readFileSync(walletPath, 'utf8')) as {\n address: string;\n encrypted_privkey: { iv: string; ct: string; tag: string; alg?: string };\n };\n const masterKey = readFileSync(masterKeyPath);\n const iv = Buffer.from(blob.encrypted_privkey.iv, 'base64');\n const ct = Buffer.from(blob.encrypted_privkey.ct, 'base64');\n const tag = Buffer.from(blob.encrypted_privkey.tag, 'base64');\n const decipher = createDecipheriv(\n blob.encrypted_privkey.alg ?? 'aes-256-gcm',\n masterKey,\n iv\n ) as DecipherGCM;\n decipher.setAuthTag(tag);\n const privateKey = Buffer.concat([decipher.update(ct), decipher.final()]).toString('utf8');\n return { wallet: new Wallet(privateKey), address: blob.address };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Build an EIP-191 RequestSigner from an already-loaded seat wallet (signs\n * strict-mode endpoints like /team/:id/join). Returns undefined when no seat.\n */\nfunction buildRequestSigner(\n seat: SeatWallet | undefined\n): ((body: Record<string, unknown>) => Promise<Record<string, unknown>>) | undefined {\n if (!seat) return undefined;\n return async (body: Record<string, unknown>) => {\n const nonce = randomBytes(16).toString('hex');\n const timestamp = new Date().toISOString();\n const payload = canonicalizeSigning({ body, nonce, timestamp });\n const signature = await seat.wallet.signMessage(payload);\n return { body, signature, signer_address: seat.address, nonce, timestamp };\n };\n}\n\nfunction scopeTierFromEnv(): 'cold' | 'warm' | 'hot' {\n const t = (process.env.HOLOSCRIPT_AGENT_SCOPE_TIER ?? 'warm').toLowerCase();\n if (t === 'cold' || t === 'warm' || t === 'hot') return t;\n throw new Error(`HOLOSCRIPT_AGENT_SCOPE_TIER must be cold|warm|hot, got: ${t}`);\n}\n\nfunction stateFilePath(identity: AgentIdentity): string {\n const dir =\n process.env.HOLOSCRIPT_AGENT_STATE_DIR ?? join(homedir(), '.holoscript-agent', 'cost-state');\n return join(dir, `${identity.handle}.json`);\n}\n\nfunction auditLogPath(): string {\n return (\n process.env.HOLOSCRIPT_AGENT_AUDIT_LOG ??\n join(homedir(), '.holoscript-agent', 'audit', 'audit.jsonl')\n );\n}\n\nfunction buildAuditLog(): AuditLog | undefined {\n const enabled = (process.env.HOLOSCRIPT_AGENT_AUDIT_ENABLED ?? '1').toLowerCase();\n if (enabled === '0' || enabled === 'false') return undefined;\n return new AuditLog({ logPath: auditLogPath() });\n}\n\nfunction printHelp(): void {\n console.log(`holoscript-agent — headless agent runtime\n\nUSAGE\n holoscript-agent run start the daemon (heartbeat + claim + execute loop)\n holoscript-agent tick single tick, then exit (useful in CI / cron / smoke tests)\n holoscript-agent whoami verify identity tuple resolves end-to-end (/me + env)\n holoscript-agent ablate --spec=<path> run a cross-LLM ablation; spec = JSON with task + providers\n [--out-md=<path>] optional: write markdown ablation table\n [--out-json=<path>] optional: write structured JSON matrix\n holoscript-agent supervise --config=<path> run N agents from agents.json (multi-agent daemon)\n holoscript-agent status --config=<path> print parsed config summary (validates schema)\n holoscript-agent provision --handle=<name> provision a fresh x402 seat for a brain (dry-run by default)\n [--execute] actually generate wallet + register against production\n [--force] re-register a handle whose seat already exists (dangerous)\n holoscript-agent audit [rollup|query|tail] query the per-agent audit log (default sub: rollup)\n [--agent=<h>] filter by agent handle\n [--provider=<p>] filter by LLM provider\n [--task=<id>] filter by task id\n [--kind=<k>] filter by kind (task-executed | ablation-cell | ...)\n [--limit=<n>] keep last N events\n [--log=<path>] override log path (default ~/.holoscript-agent/audit/audit.jsonl)\n holoscript-agent help print this\n\nREQUIRED ENV\n HOLOSCRIPT_AGENT_HANDLE agent handle (e.g. \"security-auditor\")\n HOLOSCRIPT_AGENT_PROVIDER anthropic | openai | gemini | xai | openrouter | local-llm | sovereign | mock\n HOLOSCRIPT_AGENT_MODEL model id (e.g. \"claude-opus-4-8\")\n HOLOSCRIPT_AGENT_BRAIN path to .hsplus brain composition\n HOLOSCRIPT_AGENT_WALLET 0x… wallet address\n HOLOMESH_TEAM_ID target team id\n ANTHROPIC_API_KEY | OPENAI_API_KEY | GEMINI_API_KEY per provider\n\nOPTIONAL ENV\n HOLOSCRIPT_AGENT_X402_BEARER per-surface mesh bearer. OPTIONAL: when absent, the runner\n resolves it from the HoloKey broker by proving wallet\n ownership (POST /key/challenge → sign → /key/recover), so the\n bearer is never stored in plaintext .env. Requires a seat wallet.\n HOLOSCRIPT_AGENT_WALLET_PRIVATE_KEY raw 0x… private key (edge/sovereign devices without encrypted seat\n files — skips seat-wallet discovery entirely; bearer still required)\n HOLOSCRIPT_AGENT_SEAT_ID override the computed seat-dir name (e.g. a sovereign x402 seat\n \"sovereign-<surface>-<fp>-default-x402\"); pairs with SEATS_ROOT\n HOLOSCRIPT_AGENT_SEAT_MASTER_KEY override the master-key path used to decrypt the seat wallet.enc\n HOLOSCRIPT_AGENT_BUDGET_USD_DAY default 5\n HOLOSCRIPT_AGENT_SCOPE_TIER cold | warm | hot (default warm)\n HOLOSCRIPT_AGENT_TICK_MS daemon tick interval, default 60000\n HOLOSCRIPT_AGENT_STATE_DIR where to persist cost state (default ~/.holoscript-agent/cost-state)\n HOLOSCRIPT_AGENT_SURFACE label for handoffs / presence (default = handle)\n HOLOMESH_API_BASE default https://mcp.holoscript.net/api/holomesh\n HOLOSCRIPT_AGENT_COMMIT_RESPONSES \"1\" or \"true\" → write responses as memos and git-commit them\n HOLOSCRIPT_AGENT_OUTPUT_DIR memo output dir (rel to working dir, default \"agent-out\")\n HOLOSCRIPT_AGENT_WORKING_DIR git repo to commit into (default process.cwd())\n HOLOSCRIPT_AGENT_COMMIT_SCOPE commit subject scope (default \"agent(<handle>)\")\n HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL local-llm provider base URL (default http://localhost:8080)\n HOLOSCRIPT_AGENT_LOCAL_LLM_MODEL local-llm model id (e.g. \"qwen3:4b-instruct\"); overrides HOLOSCRIPT_AGENT_MODEL for the local provider\n HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS local-llm request timeout in ms (default 300000 — edge devices like Jetson need >120s)\n HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH local JSONL path for sovereign private knowledge store (bypasses mcp-orchestrator /knowledge/sync)\n`);\n}\n\nmain().catch((err) => {\n console.error(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'fatal',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n});\n","import type { LLMProviderName } from '@holoscript/llm-provider';\nimport type { AgentIdentity } from './types.js';\n\nconst VALID_PROVIDERS: ReadonlySet<LLMProviderName> = new Set([\n 'anthropic',\n 'openai',\n 'gemini',\n 'xai',\n 'openrouter',\n 'mock',\n 'bitnet',\n 'local-llm',\n]);\n\nexport function loadIdentity(env: NodeJS.ProcessEnv = process.env): AgentIdentity {\n const handle = required(env, 'HOLOSCRIPT_AGENT_HANDLE');\n const provider = required(env, 'HOLOSCRIPT_AGENT_PROVIDER');\n if (!VALID_PROVIDERS.has(provider as LLMProviderName)) {\n throw new Error(\n `HOLOSCRIPT_AGENT_PROVIDER=${provider} not in [${[...VALID_PROVIDERS].join(', ')}]`\n );\n }\n // Bearer is OPTIONAL: when absent, the runner resolves it from the HoloKey\n // broker by proving wallet ownership (bearer-broker.ts) — the edge holds only\n // its wallet, not a plaintext bearer in .env. cmdRun fails clearly if neither\n // an env bearer nor a resolvable seat wallet is available.\n const x402Bearer = (env.HOLOSCRIPT_AGENT_X402_BEARER ?? '').trim();\n const wallet = required(env, 'HOLOSCRIPT_AGENT_WALLET');\n if (!/^0x[0-9a-fA-F]{40}$/.test(wallet)) {\n throw new Error(`HOLOSCRIPT_AGENT_WALLET is not a 0x-prefixed 40-hex address: ${wallet}`);\n }\n const budgetRaw = env.HOLOSCRIPT_AGENT_BUDGET_USD_DAY ?? '5';\n const budget = Number(budgetRaw);\n if (!Number.isFinite(budget) || budget < 0) {\n throw new Error(\n `HOLOSCRIPT_AGENT_BUDGET_USD_DAY must be >= 0 (0 = unlimited), got ${budgetRaw}`\n );\n }\n\n return {\n handle,\n surface: env.HOLOSCRIPT_AGENT_SURFACE ?? handle,\n wallet,\n x402Bearer,\n llmProvider: provider as LLMProviderName,\n llmModel: required(env, 'HOLOSCRIPT_AGENT_MODEL'),\n brainPath: required(env, 'HOLOSCRIPT_AGENT_BRAIN'),\n budgetUsdPerDay: budget,\n teamId: required(env, 'HOLOMESH_TEAM_ID'),\n meshApiBase: env.HOLOMESH_API_BASE ?? 'https://mcp.holoscript.net/api/holomesh',\n };\n}\n\nfunction required(env: NodeJS.ProcessEnv, key: string): string {\n const v = env[key];\n if (!v || v.trim().length === 0) {\n throw new Error(`Missing required env var: ${key}`);\n }\n return v.trim();\n}\n\nexport function identityForLog(id: AgentIdentity): Record<string, string | number> {\n return {\n handle: id.handle,\n surface: id.surface,\n wallet: `${id.wallet.slice(0, 6)}…${id.wallet.slice(-4)}`,\n bearer: id.x402Bearer ? `${id.x402Bearer.slice(0, 6)}…` : '(broker-resolved)',\n provider: id.llmProvider,\n model: id.llmModel,\n brain: id.brainPath,\n budgetUsdPerDay: id.budgetUsdPerDay,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport type { OnTaskAction, RuntimeBrainConfig } from './types.js';\n\nexport async function loadBrain(\n brainPath: string,\n scopeTier: 'cold' | 'warm' | 'hot' = 'warm'\n): Promise<RuntimeBrainConfig> {\n const raw = await readFile(brainPath, 'utf8');\n const { domain, capabilityTags, requires, prefers, avoids } = extractIdentity(raw);\n // For .hsplus brains: the file begins with a free-text instruction block\n // (the actual system prompt for the LLM) followed by HoloScript structured\n // sections (#version, #target, identity {}, state {}, etc.). Sending the\n // full file bloats the context by ~1500+ tokens of metadata the LLM does\n // not need and — on constrained-context local models (qwen3:4b, num_ctx=2048)\n // — causes the CRITICAL tool-calling rules to be truncated before the model\n // sees them, resulting in plain-text replies with no tool calls.\n // Extract only the preamble: everything before the first HoloScript directive.\n const systemPrompt = extractSystemPromptPreamble(raw);\n return {\n brainPath,\n systemPrompt,\n capabilityTags,\n domain,\n scopeTier,\n requires,\n prefers,\n avoids,\n reflect: extractReflect(raw),\n onTaskActions: extractOnTaskActions(raw),\n };\n}\n\n/**\n * Extract the brain's `reflect` cognitive verb (W.736) if it declares one, e.g.\n * reflect { of: \"the produced artifact\", criteria: \"valid HoloScript\", escalate_on_fail: true }\n * Returns the evaluation criteria + whether a failed self-evaluation escalates to\n * the fleet (the `local_first` directive). Absent → undefined (no reflect gate).\n * Uses sliceNamedBlock so both `reflect {` and `reflect: {` forms parse, mirroring\n * identity. This is the one cognitive verb the lightweight runner can execute with\n * just its LLM provider (no engine/trait runtime) — recall/rag_query/plan need\n * trait-backed stores and run in the core/engine path, not here.\n */\nfunction extractReflect(brain: string): { criteria: string; escalateOnFail: boolean } | undefined {\n const block = sliceNamedBlock(brain, 'reflect');\n if (block === undefined) return undefined;\n const criteria =\n scalarField(block, 'criteria') ??\n scalarField(block, 'scorer') ??\n scalarField(block, 'of') ??\n 'correctness, completeness, and valid HoloScript syntax';\n const escRaw =\n scalarField(block, 'escalate_on_fail') ??\n scalarField(block, 'escalateOnFail') ??\n scalarField(block, 'escalate');\n // escRaw may be `true` or `true, nextField...` (unquoted scalar runs to the\n // segment end) — take the first comma-delimited token before comparing.\n return { criteria, escalateOnFail: (escRaw ?? '').split(',')[0].trim().toLowerCase() === 'true' };\n}\n\n/**\n * Extract the free-text instruction preamble from a .hsplus brain file.\n * Stops at the first line that begins a HoloScript structured section:\n * `#version`, `#target`, `#mode`, or a block keyword (`identity {`,\n * `state {`, `computed {`, `traits [`, `capabilities {`, `directives {`,\n * `behavior `). Falls back to the full file content for plain-text brains\n * (no HoloScript sections detected).\n */\nfunction extractSystemPromptPreamble(src: string): string {\n const lines = src.split('\\n');\n const BLOCK_START = /^(#version|#target|#mode|identity\\s*\\{|state\\s*\\{|computed\\s*\\{|traits\\s*\\[|capabilities\\s*\\{|directives\\s*\\{|behavior\\s)/;\n let cutLine = -1;\n for (let i = 0; i < lines.length; i++) {\n if (BLOCK_START.test(lines[i].trim())) {\n cutLine = i;\n break;\n }\n }\n if (cutLine <= 0) return src; // no HoloScript sections — whole file is prompt\n return lines.slice(0, cutLine).join('\\n').trimEnd();\n}\n\nfunction extractIdentity(brain: string): {\n domain: string;\n capabilityTags: string[];\n requires: string[];\n prefers: string[];\n avoids: string[];\n} {\n const identityBlock = sliceNamedBlock(brain, 'identity');\n if (!identityBlock) {\n // No identity block — open routing (backward-compatible default).\n // Brains without explicit requires/prefers/avoids match any provider.\n return { domain: 'unknown', capabilityTags: [], requires: [], prefers: [], avoids: [] };\n }\n const domain = scalarField(identityBlock, 'domain') ?? 'unknown';\n const capabilityTags = listField(identityBlock, 'capability_tags') ?? [];\n // Universal+segregated routing fields (founder ruling 2026-05-06): brains\n // declare capability requirements as data; router matches against the\n // provider's `capabilities` manifest at session start. Empty (omitted) =\n // open routing — preserves today's behavior for unmigrated brains.\n const requires = listField(identityBlock, 'requires') ?? [];\n const prefers = listField(identityBlock, 'prefers') ?? [];\n const avoids = listField(identityBlock, 'avoids') ?? [];\n return { domain, capabilityTags, requires, prefers, avoids };\n}\n\n/**\n * Parse the `behavior on_task { … }` block into an ordered sequence of\n * cognitive verb calls (Phase 2.1). Each verb's config is extracted with a\n * lightweight regex KV parser — no full parser dependency. Only verbs whose\n * keys match known cognitive verbs are included; unknown keywords are skipped.\n *\n * Currently wired in AgentRunner: `llm_call` (prompt augmentation) and\n * `reflect` (extracted separately by extractReflect via sliceNamedBlock).\n * Future verbs (`recall`, `rag_query`, `plan`) are parsed so they appear in\n * the returned sequence but are logged-and-deferred by the runner until\n * Phase 2.2 (trait-backed stores, see idea-seeds.md).\n */\nfunction extractOnTaskActions(brain: string): OnTaskAction[] {\n // `sliceNamedBlock` with 'on_task' matches `on_task {` inside `behavior on_task {`\n const block = sliceNamedBlock(brain, 'on_task');\n if (!block) return [];\n\n const VERBS: OnTaskAction['verb'][] = ['recall', 'rag_query', 'llm_call', 'plan', 'reflect'];\n const entries: Array<OnTaskAction & { _pos: number }> = [];\n\n for (const verb of VERBS) {\n const re = new RegExp(`\\\\b${verb}\\\\s*\\\\{`, 'g');\n let m: RegExpExecArray | null;\n while ((m = re.exec(block)) !== null) {\n const start = m.index + m[0].length;\n let depth = 1;\n let end = -1;\n for (let i = start; i < block.length; i++) {\n if (block[i] === '{') depth++;\n else if (block[i] === '}') {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end < 0) continue;\n entries.push({ verb, config: parseKVBlock(block.slice(start, end)), _pos: m.index });\n }\n }\n\n // Sort by authored position so verbs execute in the order the brain declared them.\n return entries.sort((a, b) => a._pos - b._pos).map(({ _pos: _ignored, ...rest }) => rest);\n}\n\n/** Lightweight key-value extractor for cognitive verb config blocks. */\nfunction parseKVBlock(block: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n // String: key: \"value\"\n const strRe = /\\b(\\w+)\\s*:\\s*\"([^\"]*)\"/g;\n let m: RegExpExecArray | null;\n while ((m = strRe.exec(block)) !== null) out[m[1]] = m[2];\n // Array: key: [\"a\", \"b\"] — must run before bool/num to claim the array form of limit etc.\n const arrRe = /\\b(\\w+)\\s*:\\s*\\[([^\\]]*)\\]/g;\n while ((m = arrRe.exec(block)) !== null) {\n out[m[1]] = m[2]\n .split(',')\n .map((s) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter((s) => s.length > 0);\n }\n // Boolean: key: true | false (only when not already set by string/array)\n const boolRe = /\\b(\\w+)\\s*:\\s*(true|false)\\b/g;\n while ((m = boolRe.exec(block)) !== null) {\n if (!(m[1] in out)) out[m[1]] = m[2] === 'true';\n }\n // Number: key: 123 or key: -0.5 (only when not already set)\n const numRe = /\\b(\\w+)\\s*:\\s*(-?\\d+(?:\\.\\d+)?)\\b/g;\n while ((m = numRe.exec(block)) !== null) {\n if (!(m[1] in out)) out[m[1]] = parseFloat(m[2]);\n }\n return out;\n}\n\nfunction sliceNamedBlock(src: string, name: string): string | undefined {\n // Accept both `identity {` and `identity: {` — brain compositions in\n // .ai-ecosystem use both forms (lean-theorist + antigravity-hot use the\n // colon variant; security-auditor + others use the bare form). Without\n // both-form tolerance the colon-form brains parse to empty\n // capability_tags, breaking task scoring entirely (silent claim-blackhole\n // observed 2026-04-25 on W01 H200 lean-theorist).\n const re = new RegExp(`\\\\b${name}\\\\s*:?\\\\s*\\\\{`, 'g');\n const match = re.exec(src);\n if (!match) return undefined;\n const headerEnd = match.index + match[0].length; // position just past the `{`\n let depth = 1;\n for (let i = headerEnd; i < src.length; i++) {\n const ch = src[i];\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) return src.slice(headerEnd, i);\n }\n }\n return undefined;\n}\n\nfunction scalarField(block: string, key: string): string | undefined {\n const idx = block.indexOf(`${key}:`);\n if (idx < 0) return undefined;\n const after = block.slice(idx + key.length + 1).trimStart();\n if (after.startsWith('\"')) {\n const end = after.indexOf('\"', 1);\n if (end > 0) return after.slice(1, end);\n }\n const eol = after.indexOf('\\n');\n return after.slice(0, eol < 0 ? undefined : eol).trim();\n}\n\nfunction listField(block: string, key: string): string[] | undefined {\n const idx = block.indexOf(`${key}:`);\n if (idx < 0) return undefined;\n const after = block.slice(idx + key.length + 1).trimStart();\n if (!after.startsWith('[')) return undefined;\n let depth = 0;\n let end = -1;\n for (let i = 0; i < after.length; i++) {\n if (after[i] === '[') depth++;\n else if (after[i] === ']') {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end < 0) return undefined;\n const inner = after.slice(1, end);\n return inner\n .split(',')\n .map((s) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter((s) => s.length > 0);\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { TokenUsage } from '@holoscript/llm-provider';\nimport type { CostState, ModelPricer } from './types.js';\n\nexport const ANTHROPIC_PRICING_USD_PER_MTOK: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-8': { input: 10, output: 50 }, // 3× cheaper than 4.7 on total cost; A-020 2026-06-08\n 'claude-opus-4-7': { input: 5, output: 25 },\n 'claude-opus-4-6': { input: 5, output: 25 },\n 'claude-sonnet-4-6': { input: 3, output: 15 },\n 'claude-haiku-4-5-20251001': { input: 1, output: 5 },\n 'claude-haiku-4-5': { input: 1, output: 5 },\n};\n\nexport function defaultAnthropicPricer(model: string, usage: TokenUsage): number {\n const price = ANTHROPIC_PRICING_USD_PER_MTOK[model];\n if (!price) {\n throw new Error(\n `No pricing configured for model \"${model}\" — add to ANTHROPIC_PRICING_USD_PER_MTOK or pass a custom pricer`\n );\n }\n return (usage.promptTokens * price.input + usage.completionTokens * price.output) / 1_000_000;\n}\n\n/**\n * Pricer for local-llm providers (vLLM-on-GPU). The compute cost is the\n * Vast.ai (or other GPU) hourly rental, NOT per-token. From the agent's\n * perspective each LLM call has $0 marginal cost — the budget guard for\n * local-llm should track tick count or wall-clock time, not tokens.\n *\n * Returns 0 unconditionally. Token counts are still recorded in CostState\n * so usage analytics work, but cost-guard never trips on token spend.\n */\nexport function defaultLocalLlmPricer(_model: string, _usage: TokenUsage): number {\n return 0;\n}\n\n// xAI / Grok pricing — populated by /research task task_1778109552044_qed8.\n// Empty until verified pricing lands. defaultXAIPricer throws on missing\n// model with a helpful pointer (matches defaultAnthropicPricer behavior).\n// Never paste training-era pricing here — F.014 / W.GOLD.341.\nexport const XAI_PRICING_USD_PER_MTOK: Record<string, { input: number; output: number }> = {};\n\nexport function defaultXAIPricer(model: string, usage: TokenUsage): number {\n const price = XAI_PRICING_USD_PER_MTOK[model];\n if (!price) {\n throw new Error(\n `No xAI pricing configured for model \"${model}\" — populate XAI_PRICING_USD_PER_MTOK ` +\n `(see /research task_1778109552044_qed8 in docs/LLM_CAPABILITIES.md) or pass a custom pricer`\n );\n }\n return (usage.promptTokens * price.input + usage.completionTokens * price.output) / 1_000_000;\n}\n\n// OpenRouter pricing is per-model and varies by upstream — populated lazily.\n// Empty until verified pricing lands.\nexport const OPENROUTER_PRICING_USD_PER_MTOK: Record<string, { input: number; output: number }> =\n {};\n\nexport function defaultOpenRouterPricer(model: string, usage: TokenUsage): number {\n const price = OPENROUTER_PRICING_USD_PER_MTOK[model];\n if (!price) {\n throw new Error(\n `No OpenRouter pricing configured for model \"${model}\" — populate OPENROUTER_PRICING_USD_PER_MTOK ` +\n `or pass a custom pricer`\n );\n }\n return (usage.promptTokens * price.input + usage.completionTokens * price.output) / 1_000_000;\n}\n\n/**\n * Provider-aware default pricer dispatch. Picks the right pricer by\n * provider so the holoscript-agent runtime works for both Anthropic\n * (per-token billing) and local-llm (compute already paid via GPU\n * rental) without a custom pricer at every call site.\n *\n * Refs: 2026-04-26 mw02 boot loop — local-llm workers tick-erroring with\n * \"No pricing configured for model 'Qwen/Qwen2.5-0.5B-Instruct'\" because\n * defaultAnthropicPricer was wired in for ALL providers regardless of\n * which LLM the agent uses.\n *\n * Known gap (separate task): non-Anthropic non-local providers (openai,\n * gemini) still fall through to defaultAnthropicPricer here. xai +\n * openrouter were added 2026-05-06 with explicit dispatch + empty\n * pricing dicts (Lane A — see docs/LLM_CAPABILITIES.md).\n */\nexport function defaultPricerForProvider(\n provider: 'anthropic' | 'local-llm' | 'openai' | 'xai' | 'openrouter' | string\n): ModelPricer {\n if (provider === 'local-llm' || provider === 'mock') return defaultLocalLlmPricer;\n if (provider === 'xai') return defaultXAIPricer;\n if (provider === 'openrouter') return defaultOpenRouterPricer;\n return defaultAnthropicPricer;\n}\n\nexport class CostGuard {\n private state: CostState;\n private readonly statePath: string;\n private readonly dailyBudgetUsd: number;\n private readonly pricer: ModelPricer;\n\n constructor(opts: { statePath: string; dailyBudgetUsd: number; pricer?: ModelPricer }) {\n this.statePath = opts.statePath;\n this.dailyBudgetUsd = opts.dailyBudgetUsd;\n this.pricer = opts.pricer ?? defaultAnthropicPricer;\n this.state = this.loadOrInit();\n }\n\n recordUsage(\n model: string,\n usage: TokenUsage\n ): { costUsd: number; spentUsd: number; remainingUsd: number } {\n this.rolloverIfNewDay();\n const costUsd = this.pricer(model, usage);\n this.state.spentUsd += costUsd;\n this.state.promptTokens += usage.promptTokens;\n this.state.completionTokens += usage.completionTokens;\n this.state.callCount += 1;\n this.persist();\n return {\n costUsd,\n spentUsd: this.state.spentUsd,\n remainingUsd: Math.max(0, this.dailyBudgetUsd - this.state.spentUsd),\n };\n }\n\n isOverBudget(): boolean {\n if (this.dailyBudgetUsd === 0) return false;\n this.rolloverIfNewDay();\n return this.state.spentUsd >= this.dailyBudgetUsd;\n }\n\n getRemainingUsd(): number {\n if (this.dailyBudgetUsd === 0) return Number.POSITIVE_INFINITY;\n this.rolloverIfNewDay();\n return Math.max(0, this.dailyBudgetUsd - this.state.spentUsd);\n }\n\n getState(): Readonly<CostState> {\n this.rolloverIfNewDay();\n return { ...this.state };\n }\n\n private rolloverIfNewDay(): void {\n const today = todayUtc();\n if (this.state.date !== today) {\n this.state = { date: today, spentUsd: 0, promptTokens: 0, completionTokens: 0, callCount: 0 };\n this.persist();\n }\n }\n\n private loadOrInit(): CostState {\n if (existsSync(this.statePath)) {\n const raw = readFileSync(this.statePath, 'utf8');\n const parsed = JSON.parse(raw) as CostState;\n if (parsed.date === todayUtc()) return parsed;\n }\n return { date: todayUtc(), spentUsd: 0, promptTokens: 0, completionTokens: 0, callCount: 0 };\n }\n\n private persist(): void {\n mkdirSync(dirname(this.statePath), { recursive: true });\n writeFileSync(this.statePath, JSON.stringify(this.state, null, 2), 'utf8');\n }\n}\n\nfunction todayUtc(): string {\n return new Date().toISOString().slice(0, 10);\n}\n","/**\n * Capability-aware provider router (Lane 3 Phase 4b)\n *\n * Pure function `pickProvider({brain, envOverride, candidates})` that picks\n * an LLM provider for a brain at session start based on:\n * 1. The brain's `requires` / `prefers` / `avoids` capability arrays\n * (declared in the `.hsplus` identity block — Phase 2).\n * 2. Each registered provider's `Capabilities` manifest (declared as\n * `<NAME>_CAPABILITIES` exports per adapter — Phase 4a).\n * 3. The `HOLOSCRIPT_AGENT_PROVIDER` env override.\n *\n * Per founder ruling 2026-05-06 (universal+segregated foundation, path b\n * backward-compatible):\n * - Brains declare needs as data; router does set arithmetic.\n * - `HOLOSCRIPT_AGENT_PROVIDER` env becomes OVERRIDE, not source-of-truth.\n * - Brains without `requires` get implicit empty arrays = open routing\n * (matches today's behavior — backward-compat preserved).\n *\n * Override semantics: an env-set provider always wins among satisfying\n * candidates. If env is set but doesn't satisfy a `requires` entry, the\n * router still picks env (founder said \"override\") but reports the\n * mismatch via `reason: 'env-override-mismatch'` + `unsatisfiedRequires`.\n * Callers can decide to abort or proceed.\n *\n * Pure function — no I/O, no logging, no env reads. The caller injects\n * `envOverride` from `HOLOSCRIPT_AGENT_PROVIDER` (or `AgentSpec.provider`\n * in the supervisor path) and consumes the `RoutingDecision` to construct\n * the actual provider via the existing factory pattern.\n */\n\nimport type { Capabilities, LLMProviderName } from '@holoscript/llm-provider';\nimport {\n ANTHROPIC_CAPABILITIES,\n OPENAI_CAPABILITIES,\n GEMINI_CAPABILITIES,\n XAI_CAPABILITIES,\n OPENROUTER_CAPABILITIES,\n LOCAL_LLM_CAPABILITIES,\n BITNET_CAPABILITIES,\n MOCK_CAPABILITIES,\n} from '@holoscript/llm-provider';\n\nexport interface BrainRequirements {\n /** Capability keys the brain MUST have. Empty = open routing. */\n requires: string[];\n /** Capability keys the brain prefers. Used for tie-breaking. */\n prefers: string[];\n /** Capability keys the brain explicitly excludes. */\n avoids: string[];\n}\n\nexport interface RoutingCandidate {\n name: LLMProviderName;\n capabilities: Capabilities;\n}\n\nexport type RoutingReason =\n /** Brain has no requires; env was honored. Today's behavior. */\n | 'env-override-no-requirements'\n /** Brain has requires; env satisfies them. Env wins among satisfying candidates. */\n | 'env-override-satisfies'\n /** Brain has requires; env doesn't satisfy. Env still picked (founder ruling), mismatch flagged. */\n | 'env-override-mismatch'\n /** Env unset; picked by capability match (most prefers wins, tie-breaker order). */\n | 'capability-best-fit'\n /** Brain has no requires AND no env; picked first candidate by tie-breaker order. */\n | 'open-routing-default';\n\nexport interface RoutingDecision {\n picked: LLMProviderName;\n reason: RoutingReason;\n /** Empty unless `reason === 'env-override-mismatch'` — capability keys env doesn't satisfy. */\n unsatisfiedRequires: string[];\n /** Capability keys the picked provider satisfies from the brain's `prefers` list. */\n matchedPrefers: string[];\n /** Provider names excluded because their capabilities matched any `avoids` entry. */\n excludedByAvoids: LLMProviderName[];\n /** Other candidates that also satisfied `requires` (sorted by prefers descending). */\n alternatives: LLMProviderName[];\n}\n\nexport class NoEligibleProviderError extends Error {\n constructor(\n public readonly requires: readonly string[],\n public readonly avoids: readonly string[],\n public readonly considered: readonly LLMProviderName[],\n public readonly excludedByAvoids: readonly LLMProviderName[]\n ) {\n super(\n `No provider satisfies brain requires=[${requires.join(', ')}] avoids=[${avoids.join(', ')}]. ` +\n `Considered: [${considered.join(', ')}]. ` +\n `Excluded by avoids: [${excludedByAvoids.join(', ')}].`\n );\n this.name = 'NoEligibleProviderError';\n }\n}\n\n/**\n * Returns true if the capability key is declared truthy on the manifest.\n * Boolean fields: returns the boolean value. Numeric fields: returns true\n * if > 0 (used for `contextWindow` / `maxOutput` declarations). Undefined:\n * returns false (capability not declared). String/object fields are\n * meaningless for routing keys and return false.\n */\nfunction satisfies(capabilities: Capabilities, key: string): boolean {\n const value = (capabilities as unknown as Record<string, unknown>)[key];\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value > 0;\n return false;\n}\n\nfunction countMatches(capabilities: Capabilities, keys: readonly string[]): number {\n let count = 0;\n for (const key of keys) {\n if (satisfies(capabilities, key)) count++;\n }\n return count;\n}\n\nfunction unsatisfiedKeys(capabilities: Capabilities, keys: readonly string[]): string[] {\n return keys.filter((key) => !satisfies(capabilities, key));\n}\n\n/**\n * Pick a provider for a brain. Pure function — see module doc-comment for\n * the routing algorithm.\n */\nexport function pickProvider(opts: {\n brain: BrainRequirements;\n envOverride?: LLMProviderName;\n candidates: RoutingCandidate[];\n /**\n * Tie-breaker order when multiple candidates have equal `prefers` match\n * counts. Defaults to insertion order of `candidates`. Useful for the\n * supervisor to express \"prefer Anthropic over Gemini at equal capability.\"\n */\n tieBreakerOrder?: readonly LLMProviderName[];\n}): RoutingDecision {\n const { brain, envOverride, candidates } = opts;\n const tieBreaker = opts.tieBreakerOrder ?? candidates.map((c) => c.name);\n\n if (candidates.length === 0) {\n throw new Error('pickProvider: no candidates supplied');\n }\n\n // Identify avoids-excluded candidates first (used in error reporting + filtering)\n const excludedByAvoids: LLMProviderName[] = [];\n const notAvoided: RoutingCandidate[] = [];\n for (const candidate of candidates) {\n const matchesAvoid = brain.avoids.some((a) => satisfies(candidate.capabilities, a));\n if (matchesAvoid) {\n excludedByAvoids.push(candidate.name);\n } else {\n notAvoided.push(candidate);\n }\n }\n\n // ─── Open routing path (no requires) ────────────────────────────────\n if (brain.requires.length === 0) {\n if (envOverride !== undefined) {\n // Env honored. Note: avoids are advisory in open-routing mode\n // (today's behavior is \"env wins\"); we still record the mismatch.\n const envCandidate = candidates.find((c) => c.name === envOverride);\n const matchedPrefers = envCandidate\n ? brain.prefers.filter((p) => satisfies(envCandidate.capabilities, p))\n : [];\n return {\n picked: envOverride,\n reason: 'env-override-no-requirements',\n unsatisfiedRequires: [],\n matchedPrefers,\n excludedByAvoids,\n alternatives: candidates.filter((c) => c.name !== envOverride).map((c) => c.name),\n };\n }\n // No env, no requires — pick first candidate by tie-breaker order\n const ordered = orderCandidates(notAvoided, tieBreaker);\n if (ordered.length === 0) {\n // All candidates avoided — fall back to first overall (avoids are\n // advisory without requires; otherwise we'd starve the agent)\n return {\n picked: candidates[0]!.name,\n reason: 'open-routing-default',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(candidates[0]!.capabilities, p)),\n excludedByAvoids,\n alternatives: candidates.slice(1).map((c) => c.name),\n };\n }\n return {\n picked: ordered[0]!.name,\n reason: 'open-routing-default',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(ordered[0]!.capabilities, p)),\n excludedByAvoids,\n alternatives: ordered.slice(1).map((c) => c.name),\n };\n }\n\n // ─── Capability-aware path (has requires) ──────────────────────────\n // Filter to candidates that satisfy ALL requires (and aren't avoided)\n const eligible = notAvoided.filter(\n (c) => unsatisfiedKeys(c.capabilities, brain.requires).length === 0\n );\n\n if (eligible.length === 0) {\n // No candidate satisfies. If env is set, founder ruling says env\n // overrides — pick env, flag mismatch, list unsatisfied requires.\n if (envOverride !== undefined) {\n const envCandidate = candidates.find((c) => c.name === envOverride);\n const unsatisfied = envCandidate\n ? unsatisfiedKeys(envCandidate.capabilities, brain.requires)\n : brain.requires.slice();\n const matchedPrefers = envCandidate\n ? brain.prefers.filter((p) => satisfies(envCandidate.capabilities, p))\n : [];\n return {\n picked: envOverride,\n reason: 'env-override-mismatch',\n unsatisfiedRequires: unsatisfied,\n matchedPrefers,\n excludedByAvoids,\n alternatives: [],\n };\n }\n // No env, no eligible candidate — fail fast\n throw new NoEligibleProviderError(\n brain.requires,\n brain.avoids,\n candidates.map((c) => c.name),\n excludedByAvoids\n );\n }\n\n // Sort eligible by prefers count descending, tie-break by tieBreakerOrder\n const ranked = [...eligible].sort((a, b) => {\n const aMatches = countMatches(a.capabilities, brain.prefers);\n const bMatches = countMatches(b.capabilities, brain.prefers);\n if (aMatches !== bMatches) return bMatches - aMatches; // higher first\n const aIdx = tieBreaker.indexOf(a.name);\n const bIdx = tieBreaker.indexOf(b.name);\n // Names not in tie-breaker order go to the end\n const aRank = aIdx === -1 ? Number.MAX_SAFE_INTEGER : aIdx;\n const bRank = bIdx === -1 ? Number.MAX_SAFE_INTEGER : bIdx;\n return aRank - bRank;\n });\n\n // Env override wins among eligible candidates\n if (envOverride !== undefined) {\n const envEligible = ranked.find((c) => c.name === envOverride);\n if (envEligible) {\n return {\n picked: envOverride,\n reason: 'env-override-satisfies',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(envEligible.capabilities, p)),\n excludedByAvoids,\n alternatives: ranked.filter((c) => c.name !== envOverride).map((c) => c.name),\n };\n }\n // Env set but not eligible (e.g. excluded by avoids, or unknown name).\n // Founder ruling: env overrides — pick env, flag mismatch.\n const envCandidate = candidates.find((c) => c.name === envOverride);\n const unsatisfied = envCandidate\n ? unsatisfiedKeys(envCandidate.capabilities, brain.requires)\n : brain.requires.slice();\n return {\n picked: envOverride,\n reason: 'env-override-mismatch',\n unsatisfiedRequires: unsatisfied,\n matchedPrefers: envCandidate\n ? brain.prefers.filter((p) => satisfies(envCandidate.capabilities, p))\n : [],\n excludedByAvoids,\n alternatives: ranked.map((c) => c.name),\n };\n }\n\n // No env — pick the highest-ranked eligible\n const top = ranked[0]!;\n return {\n picked: top.name,\n reason: 'capability-best-fit',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(top.capabilities, p)),\n excludedByAvoids,\n alternatives: ranked.slice(1).map((c) => c.name),\n };\n}\n\n/**\n * Default candidate list — every adapter that ships with `@holoscript/llm-provider`.\n * Suppliers can pass their own subset to `pickProvider` (e.g. supervisor\n * limits to only the providers it has API keys for, or test code uses\n * a synthetic candidate list).\n */\nexport const BUILT_IN_CANDIDATES: RoutingCandidate[] = [\n { name: 'anthropic', capabilities: ANTHROPIC_CAPABILITIES },\n { name: 'openai', capabilities: OPENAI_CAPABILITIES },\n { name: 'gemini', capabilities: GEMINI_CAPABILITIES },\n { name: 'xai', capabilities: XAI_CAPABILITIES },\n { name: 'openrouter', capabilities: OPENROUTER_CAPABILITIES },\n { name: 'local-llm', capabilities: LOCAL_LLM_CAPABILITIES },\n { name: 'bitnet', capabilities: BITNET_CAPABILITIES },\n { name: 'mock', capabilities: MOCK_CAPABILITIES },\n];\n\nfunction orderCandidates(\n candidates: readonly RoutingCandidate[],\n tieBreaker: readonly LLMProviderName[]\n): RoutingCandidate[] {\n return [...candidates].sort((a, b) => {\n const aIdx = tieBreaker.indexOf(a.name);\n const bIdx = tieBreaker.indexOf(b.name);\n const aRank = aIdx === -1 ? Number.MAX_SAFE_INTEGER : aIdx;\n const bRank = bIdx === -1 ? Number.MAX_SAFE_INTEGER : bIdx;\n return aRank - bRank;\n });\n}\n","import { readFile, appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { BoardTask } from './types.js';\nimport type { CaelAuditRecord } from './cael-builder.js';\n\n/** Wraps a request body in a signed envelope for strict-mode endpoints (e.g. /team/:id/join). */\nexport type RequestSigner = (\n body: Record<string, unknown>\n) => Promise<Record<string, unknown>>;\n\nexport interface HolomeshClientOptions {\n apiBase: string;\n bearer: string;\n teamId: string;\n fetchImpl?: typeof fetch;\n /** EIP-191 signing function. When present, used on strict endpoints like joinTeam(). */\n signer?: RequestSigner;\n /**\n * Local JSONL path for private knowledge (sovereign edge store).\n * When set, writePrivateKnowledge appends to this file and queryPrivateKnowledge\n * reads from it instead of routing through the remote orchestrator.\n * Bypasses the mcp-orchestrator /knowledge/sync 401 gap for edge nodes.\n * Set via HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH env var (index.ts).\n */\n localKnowledgePath?: string;\n}\n\nexport interface TeamMessage {\n id: string;\n fromAgentId: string;\n fromAgentName: string;\n content: string;\n messageType: string;\n createdAt: string;\n}\n\n/** Minimal knowledge-entry shape returned by the mesh knowledge endpoints. */\nexport interface KnowledgeEntry {\n id: string;\n content: string;\n domain?: string;\n type?: string;\n createdAt?: string;\n}\n\nexport class HolomeshClient {\n private readonly apiBase: string;\n private readonly bearer: string;\n private readonly teamId: string;\n private readonly fetchImpl: typeof fetch;\n private readonly signer?: RequestSigner;\n private readonly localKnowledgePath?: string;\n\n constructor(opts: HolomeshClientOptions) {\n this.apiBase = opts.apiBase.replace(/\\/$/, '');\n this.bearer = opts.bearer;\n this.teamId = opts.teamId;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.signer = opts.signer;\n this.localKnowledgePath = opts.localKnowledgePath;\n }\n\n /** Wrap body in a signed envelope when a signer is available (strict-mode endpoints). */\n private async signBody(body: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.signer ? await this.signer(body) : body;\n }\n\n async heartbeat(payload: { agentName: string; surface: string; capabilityTags?: string[] }): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/presence`, await this.signBody(payload as Record<string, unknown>));\n }\n\n async getOpenTasks(): Promise<BoardTask[]> {\n const data = await this.req<{ tasks?: BoardTask[]; open?: BoardTask[] }>(\n 'GET',\n `/team/${this.teamId}/board`\n );\n return data.tasks ?? data.open ?? [];\n }\n\n async claim(taskId: string): Promise<BoardTask> {\n return this.req<BoardTask>('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'claim' }));\n }\n\n async joinTeam(): Promise<{ success: boolean; role?: string; members?: number }> {\n return this.req<{ success: boolean; role?: string; members?: number }>(\n 'POST',\n `/team/${this.teamId}/join`,\n await this.signBody({})\n );\n }\n\n async sendMessageOnTask(taskId: string, body: string): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/message`, await this.signBody({\n to: 'team',\n subject: `task:${taskId}`,\n content: body,\n }));\n }\n\n async markDone(taskId: string, summary: string, commitHash?: string): Promise<void> {\n await this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({\n action: 'done',\n summary,\n // verification_evidence required by server before task can be closed.\n verification_evidence: summary,\n // Exclude commitHash when undefined — JSON.stringify drops undefined but\n // canonicalizeSigning preserves it as the literal string \"undefined\",\n // causing a signature-mismatch vs what the server sees after JSON.parse.\n ...(commitHash !== undefined ? { commitHash } : {}),\n }));\n }\n\n // POST CAEL audit records for this agent. Server validator at\n // packages/mcp-server/src/holomesh/routes/core-routes.ts:472-533 requires\n // bearer == handle owner OR founder; the per-surface x402 bearer is the\n // handle owner so this resolves correctly. Records that fail shape\n // validation (layer_hashes != 7 elements, missing tick_iso/operation/\n // fnv1a_chain) are silently dropped server-side, not rejected as a batch.\n async postAuditRecords(\n handle: string,\n records: CaelAuditRecord[]\n ): Promise<{ appended: number; rejected: number }> {\n // Audit endpoint uses bearer-only auth — no signed envelope wrapper.\n return this.req<{ appended: number; rejected: number }>(\n 'POST',\n `/agent/${encodeURIComponent(handle)}/audit`,\n { records } as unknown as Record<string, unknown>\n );\n }\n\n async whoAmI(): Promise<{ agentId: string; surface: string; wallet?: string }> {\n // GET /api/holomesh/me returns { agentId, name, wallet, isFounder, teamId, teams, permissions }\n // (see packages/mcp-server/src/holomesh/routes/core-routes.ts §/me handler).\n // It does NOT return a `surface` field — derive it from the seat name on the\n // client side. Seat naming convention (set by the provisioning admin path):\n // claudecode-claude-x402 → claude-code\n // cursor-claude-x402 → claude-cursor\n // gemini-antigravity → gemini-antigravity\n // copilot-vscode → copilot-vscode\n // Founder → unknown (shared key, no surface attribution)\n const raw = await this.req<{\n agentId: string;\n name?: string;\n wallet?: string;\n }>('GET', '/me');\n return {\n agentId: raw.agentId,\n surface: deriveSurface(raw.name),\n wallet: raw.wallet,\n };\n }\n\n // ── Team Message Surface (E4 delegated-authority protocol) ───────────────────\n\n /** Read recent team messages. */\n async getTeamMessages(limit = 20): Promise<TeamMessage[]> {\n const data = await this.req<{ messages?: TeamMessage[]; success?: boolean }>(\n 'GET',\n `/team/${this.teamId}/messages?limit=${limit}`\n );\n return data.messages ?? [];\n }\n\n /** Post a message to the team feed. */\n async sendTeamMessage(content: string, messageType = 'text'): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/message`, await this.signBody({ content, type: messageType }));\n }\n\n // ── Owner-op API wrappers (E4) ─────────────────────────────────────────────\n\n /** Switch team mode. Requires owner or founder role. */\n async setTeamMode(mode: string, reason?: string): Promise<{ mode: string; unchanged?: boolean }> {\n return this.req('POST', `/team/${this.teamId}/mode`, await this.signBody({ mode, reason } as Record<string, unknown>));\n }\n\n /** Update room preferences. Requires config:write permission. */\n async patchRoomPrefs(prefs: { communicationStyle?: string; objective?: string }): Promise<{\n communicationStyle: string;\n objective: string;\n }> {\n return this.req('PATCH', `/team/${this.teamId}/room`, await this.signBody(prefs as Record<string, unknown>));\n }\n\n /** Update a board task. */\n async updateTask(\n taskId: string,\n updates: {\n title?: string;\n description?: string;\n priority?: number;\n tags?: string[];\n }\n ): Promise<unknown> {\n return this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'update', ...updates } as Record<string, unknown>));\n }\n\n /** Delete a board task. */\n async deleteTask(taskId: string): Promise<unknown> {\n return this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'delete' }));\n }\n\n /** Delegate a board task to another agent. */\n async delegateTask(taskId: string, toAgentId: string): Promise<unknown> {\n return this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'delegate', toAgentId }));\n }\n\n /** Add new tasks to the board (used by the delegate_task tool to spawn sub-work). */\n async addTasks(\n tasks: Array<{ title: string; description?: string; priority?: number; source?: string; role?: string; tags?: string[] }>\n ): Promise<{ added: number }> {\n const result = await this.req<{ added?: number }>('POST', `/team/${this.teamId}/board`, await this.signBody({ tasks } as Record<string, unknown>));\n return { added: result.added ?? tasks.length };\n }\n\n // ── Cognitive-verb knowledge surface (Phase 2.2 — recall / rag_query) ────────\n\n /**\n * Query the TEAM knowledge base (the `rag_query` cognitive verb). Bearer-only\n * GET; `q` is the server-side search filter. Returns [] on any failure so a\n * retrieval miss never breaks a tick.\n */\n async queryTeamKnowledge(query: string, limit = 5): Promise<KnowledgeEntry[]> {\n const qs = new URLSearchParams({ q: query, limit: String(limit) }).toString();\n try {\n const data = await this.req<{ entries?: KnowledgeEntry[] }>(\n 'GET',\n `/team/${this.teamId}/knowledge?${qs}`\n );\n return data.entries ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Query this agent's PRIVATE workspace knowledge (the `recall` cognitive verb).\n * The endpoint has no server-side search param, so the caller filters by query\n * client-side. Returns [] on any failure.\n */\n async queryPrivateKnowledge(): Promise<KnowledgeEntry[]> {\n if (this.localKnowledgePath) {\n try {\n const raw = await readFile(this.localKnowledgePath, 'utf8');\n return raw.trim().split('\\n').filter(Boolean).map(l => JSON.parse(l) as KnowledgeEntry);\n } catch {\n return [];\n }\n }\n try {\n const data = await this.req<{ entries?: KnowledgeEntry[] }>('GET', `/knowledge/private`);\n return data.entries ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Persist facts to this agent's PRIVATE workspace — the WRITE side of `recall`\n * (POST /knowledge/private). The server stamps id / workspaceId (`private:<wallet>`)\n * / author / timestamps; the caller supplies `content` (+ optional type/tags/title).\n * This is what gives `recall` something to recall: without it the private store\n * stays empty and every `recall` returns [] (the W.752 loop-gap). Best-effort —\n * returns false on any failure so a write miss never breaks a tick (the task is\n * already done by the time this runs).\n */\n /**\n * Query the server-side in-process codebase GraphRAG index via the mesh bearer-gated\n * route (POST /api/holomesh/codebase/search). Called by the `rag_query` cognitive verb\n * (Phase 2.3 W.753) so edge agents can reach HoloEmbed semantic search without a direct\n * Absorb-service dep. Returns [] (not an error) when the graph isn't loaded yet — the\n * caller falls back to team-knowledge search.\n *\n * @param query Natural-language search string.\n * @param topK Max results to return (1–20, server-capped).\n */\n async queryCodebase(query: string, topK = 8): Promise<Array<{ name: string; file: string; line?: number; type: string; score: number; signature?: string | null }>> {\n try {\n const data = await this.req<{\n success?: boolean;\n result?: {\n results?: Array<{ name: string; file: string; line?: number; type: string; score: number; signature?: string | null }>;\n error?: string;\n };\n error?: string;\n }>('POST', `/codebase/search`, { query, topK });\n if (data.error || data.result?.error) return [];\n return data.result?.results ?? [];\n } catch {\n return [];\n }\n }\n\n async writePrivateKnowledge(\n entries: Array<{ content: string; type?: string; tags?: string[]; title?: string }>\n ): Promise<boolean> {\n if (!entries.length) return false;\n if (this.localKnowledgePath) {\n try {\n await mkdir(dirname(this.localKnowledgePath), { recursive: true });\n const lines = entries.map(e => JSON.stringify({\n id: `local.${Date.now()}.${Math.random().toString(36).slice(2, 6)}`,\n content: e.content,\n type: e.type ?? 'task-outcome',\n tags: e.tags ?? [],\n title: e.title,\n createdAt: new Date().toISOString(),\n })).join('\\n') + '\\n';\n await appendFile(this.localKnowledgePath, lines, 'utf8');\n return true;\n } catch {\n return false;\n }\n }\n try {\n await this.req('POST', `/knowledge/private`, { entries });\n return true;\n } catch {\n return false;\n }\n }\n\n private async req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.apiBase}${path}`;\n // HoloMesh REST auth: server (packages/mcp-server/src/holomesh/auth-utils.ts\n // resolveRequestingAgent) accepts EITHER `Authorization: Bearer <token>`\n // (HTTP-standard, used here) OR `x-mcp-api-key: <token>` (orchestrator\n // convention). Both resolve through the same key-registry / agent-store /\n // env-fallback chain. Bearer is preferred for new code (W.087 vertex B,\n // task_1777073616424_klls).\n const res = await this.fetchImpl(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.bearer}`,\n 'content-type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) {\n const txt = await res.text().catch(() => '');\n throw new Error(`HoloMesh ${method} ${path} ${res.status}: ${txt.slice(0, 300)}`);\n }\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n }\n}\n\n/**\n * Derive a surface tag from a seat name returned by /me. Mirrors the surface\n * detection in scripts/probe-surface-bearers.mjs and hooks/lib/holomesh-env.mjs\n * so a single agent's surface attribution is consistent across read and write\n * paths. Returns 'unknown' when the seat name doesn't encode a surface\n * (e.g. shared-key resolution to \"Founder\").\n */\nexport function deriveSurface(seatName: string | undefined): string {\n if (!seatName) return 'unknown';\n const n = seatName.toLowerCase();\n if (n.startsWith('claudecode')) return 'claude-code';\n if (n.startsWith('cursor')) return 'claude-cursor';\n if (n.startsWith('claudedesktop')) return 'claude-desktop';\n if (n.startsWith('vscode-claude') || n.startsWith('claude-vscode')) return 'claude-vscode';\n if (n.startsWith('gemini')) return 'gemini-antigravity';\n if (n.startsWith('copilot')) return 'copilot-vscode';\n return 'unknown';\n}\n\nexport function pickClaimableTask(\n tasks: BoardTask[],\n brainCapabilityTags: string[]\n): BoardTask | undefined {\n const wanted = new Set(brainCapabilityTags.map((t) => t.toLowerCase()));\n const open = tasks.filter((t) => t.status === 'open' && !t.claimedBy);\n const scored = open\n .map((t) => ({ task: t, score: scoreTask(t, wanted) }))\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score || priority(a.task) - priority(b.task));\n return scored[0]?.task;\n}\n\nfunction scoreTask(task: BoardTask, wanted: Set<string>): number {\n const tags = (task.tags ?? []).map((t) => t.toLowerCase());\n const text = `${task.title} ${task.description ?? ''}`.toLowerCase();\n let score = 0;\n for (const tag of tags) if (wanted.has(tag)) score += 2;\n for (const w of wanted) if (text.includes(w)) score += 1;\n return score;\n}\n\nfunction priority(t: BoardTask): number {\n if (typeof t.priority === 'number') return t.priority;\n const map: Record<string, number> = { critical: 1, high: 2, medium: 4, low: 6 };\n return map[String(t.priority).toLowerCase()] ?? 5;\n}\n","/**\n * HoloKey bearer broker — resolve an agent's mesh bearer by proving wallet\n * ownership, instead of holding the bearer in plaintext `.env`.\n *\n * The edge agent holds only its WALLET (the durable root identity, F.119 —\n * deterministic + recoverable from the master seed). The mesh bearer is\n * rotatable/mintable, so it is FETCHED on demand from the broker rather than\n * stored: `POST /key/challenge` → sign EIP-712 `Recovery{nonce}` → `POST\n * /key/recover` returns the agent's current `api_key`. The private key never\n * leaves the process; only the signature + public address transit the wire.\n *\n * This generalizes the per-agent `HOLOMESH_API_KEY_<HANDLE>_X402` pattern into\n * the secrets-broker model (`@holoscript/secrets-broker`): one root credential\n * (the wallet), short-lived/fetched capability (the bearer).\n *\n * @module holoscript-agent/bearer-broker\n */\nimport { Wallet } from 'ethers';\n\nexport interface ResolveBearerViaBrokerOpts {\n /** Agent wallet private key (0x-hex). Root credential; NEVER logged. */\n privateKey: string;\n /** Mesh API base, e.g. https://mcp.holoscript.net/api/holomesh */\n meshApiBase: string;\n /** Injectable fetch for tests. Defaults to the global `fetch`. */\n fetchImpl?: typeof fetch;\n}\n\n/** Domain/types for the EIP-712 `Recovery` envelope the server verifies (core-routes.ts key/recover). */\nconst RECOVERY_DOMAIN: { name: string; version: string } = { name: 'HoloMesh', version: '1' };\nconst RECOVERY_TYPES: Record<string, { name: string; type: string }[]> = {\n Recovery: [{ name: 'nonce', type: 'string' }],\n};\n\n/**\n * Resolve the agent's mesh bearer via wallet-ownership proof against the broker.\n * Throws on any failure (challenge/recover non-200, missing nonce/api_key) so the\n * caller can fall back to an explicit env bearer or surface a clear boot error.\n */\nexport async function resolveBearerViaBroker(opts: ResolveBearerViaBrokerOpts): Promise<string> {\n const doFetch = opts.fetchImpl ?? fetch;\n const wallet = new Wallet(opts.privateKey);\n const address = wallet.address;\n const base = opts.meshApiBase.replace(/\\/+$/, '');\n\n const chalRes = await doFetch(`${base}/key/challenge`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ wallet_address: address }),\n });\n if (!chalRes.ok) {\n throw new Error(`bearer-broker: /key/challenge returned ${chalRes.status} for ${address}`);\n }\n const chal = (await chalRes.json()) as { nonce?: string };\n if (!chal.nonce) throw new Error('bearer-broker: /key/challenge returned no nonce');\n\n const signature = await wallet.signTypedData(RECOVERY_DOMAIN, RECOVERY_TYPES, {\n nonce: chal.nonce,\n });\n\n const recRes = await doFetch(`${base}/key/recover`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ wallet_address: address, nonce: chal.nonce, signature }),\n });\n if (!recRes.ok) {\n throw new Error(`bearer-broker: /key/recover returned ${recRes.status} for ${address}`);\n }\n const rec = (await recRes.json()) as { agent?: { api_key?: string } };\n const bearer = rec.agent?.api_key;\n if (!bearer) throw new Error('bearer-broker: /key/recover returned no api_key');\n return bearer;\n}\n","import type { ILLMProvider, LLMMessage, TokenUsage } from '@holoscript/llm-provider';\nimport { embedAcrossFleet, cosineSimilarity } from '@holoscript/llm-provider';\nimport type { CostGuard } from './cost-guard.js';\nimport type { HolomeshClient } from './holomesh-client.js';\nimport { pickClaimableTask } from './holomesh-client.js';\nimport type { AuditLog } from './audit-log.js';\nimport { buildCaelRecord } from './cael-builder.js';\nimport { resolveActiveTools, runTool, summarizeToolProductivity } from './tools.js';\nimport { augmentWithOnTaskCognition } from './cognitive-verbs.js';\nimport { DelegatedAuthorityHandler } from './delegated-authority.js';\nimport type {\n AgentIdentity,\n BoardTask,\n ExecutionResult,\n RuntimeBrainConfig,\n TickResult,\n} from './types.js';\n\n// Bumped when the CAEL record schema or layer-hash semantics change. Lives\n// in the version_vector_fingerprint of every emitted record so consumers\n// can partition the corpus by runtime version.\nconst RUNTIME_VERSION = '1.0.0';\n\nexport interface AgentRunnerOptions {\n identity: AgentIdentity;\n brain: RuntimeBrainConfig;\n provider: ILLMProvider;\n costGuard: CostGuard;\n mesh: HolomeshClient;\n logger?: (event: Record<string, unknown>) => void;\n onTaskExecuted?: (result: ExecutionResult, task: BoardTask) => Promise<void>;\n auditLog?: AuditLog;\n /** Optional delegated-authority handler for governance message processing (E4). */\n messageHandler?: DelegatedAuthorityHandler;\n /**\n * Optional hardware-receipt signer (index.ts wires the seat wallet). When\n * present, emit_hardware_receipt seals its content hash with a wallet signature\n * so the hardware-provenance artifact is verifiable, not plain JSON. Absent →\n * the receipt is content-hashed but self-reports `signed:false` (honest).\n */\n signReceipt?: (canonical: string) => Promise<{ alg: string; signer: string; signature: string }>;\n}\n\nexport class AgentRunner {\n private stopped = false;\n // CAEL audit hash chain — survives across ticks within a single runner\n // process. On process restart it resets to null; the first post-restart\n // record breaks the chain, which is honest (the runner has no memory of\n // its prior chain state and shouldn't fake continuity). prev_hash=null\n // is a valid value the audit-store accepts.\n private prevCaelChain: string | null = null;\n // Self-recovery flag for the auto-rejoin path (task_1777112258989_eeyp).\n // When the heartbeat returns 403 \"Not a member of this team\" — typical of\n // a fresh Vast.ai worker whose provisioning didn't atomically /join, or of\n // a worker whose membership was reaped — the runner calls mesh.joinTeam()\n // ONCE per process and retries the heartbeat. After a successful rejoin\n // we set this flag so subsequent 403s on the same process don't loop back\n // into joinTeam (avoiding a retry storm if the team-cap is full or the\n // join itself is permanently rejected). On process restart the flag\n // resets, which is the correct semantics: a fresh process gets one fresh\n // chance to self-rejoin. Discovered 2026-04-25 SSH-probing 5 fleet\n // workers stuck in indefinite 403→tick-error→sleep→retry loops; without\n // this, a fresh-deploy of an unjoined agent stays silent forever.\n private joinedThisProcess = false;\n\n constructor(private readonly opts: AgentRunnerOptions) {}\n\n async tick(): Promise<TickResult> {\n const { identity, brain, mesh, costGuard, provider, logger } = this.opts;\n const log = logger ?? (() => undefined);\n\n await this.heartbeatWithAutoRejoin();\n\n // ── Delegated-authority message processing (E4) ──────────────────────────\n // Run before budget/task claiming so governance requests are handled\n // even when the agent is over-budget or has no claimable tasks.\n if (this.opts.messageHandler) {\n try {\n const receipts = await this.opts.messageHandler.processMessages();\n if (receipts.length > 0) {\n log({\n ev: 'messages-processed',\n count: receipts.length,\n statuses: receipts.map((r) => r.status),\n });\n // If this agent has no board-task capability tags (Brittney is\n // governance-only), return early so the tick result reflects message\n // work rather than falling through to no-claimable-task.\n if (\n brain.capabilityTags.length === 0 ||\n brain.capabilityTags.every((t) => t.startsWith('delegated'))\n ) {\n return {\n action: 'messages-processed',\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n receipts: receipts.map((r) => ({\n status: r.status,\n action: r.action,\n reason: r.reason,\n })),\n };\n }\n }\n } catch (err) {\n log({\n ev: 'message-handler-error',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (costGuard.isOverBudget()) {\n const state = costGuard.getState();\n log({ ev: 'over-budget', spentUsd: state.spentUsd, budget: identity.budgetUsdPerDay });\n return {\n action: 'over-budget',\n spentUsd: state.spentUsd,\n remainingUsd: 0,\n message: `daily budget $${identity.budgetUsdPerDay} exhausted`,\n };\n }\n\n const tasks = await mesh.getOpenTasks();\n const target = pickClaimableTask(tasks, brain.capabilityTags);\n if (!target) {\n log({ ev: 'no-claimable-task', open: tasks.length });\n return {\n action: 'no-claimable-task',\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n };\n }\n\n log({ ev: 'claim', taskId: target.id, title: target.title });\n await mesh.claim(target.id);\n\n const start = Date.now();\n // Tool-use loop. The model gets MESH_TOOLS (read_file, list_dir,\n // write_file, bash) and can iterate read→reason→read→write until it\n // emits a final text response. Without this loop the model could only\n // reason from prompt+brain alone — no filesystem access, no kernel\n // checks, no inspection of inputs scp'd to the instance. With it,\n // lean-theorist can actually `cat MSC/Invariants.lean`, `lake build`,\n // and `write_file /root/agent-output/Invariants.lean` per its brain rules.\n // ── On-task cognition (Phase 2.2 — cognitive-verbs.ts) ───────────────────\n // Execute the brain's authored `behavior on_task` verbs (llm_call / rag_query\n // / recall / plan) and accumulate their outputs onto the system prompt before\n // the tool loop. Provider + mesh only (no engine/@holoscript/core dep) so the\n // edge package keeps its clean publish closure. `reflect` runs post-artifact.\n const systemContent = await augmentWithOnTaskCognition({\n systemPrompt: brain.systemPrompt,\n onTaskActions: brain.onTaskActions ?? [],\n task: { id: target.id, title: target.title },\n queryTeamKnowledge: (q, limit) => mesh.queryTeamKnowledge(q, limit),\n queryPrivateKnowledge: () => mesh.queryPrivateKnowledge(),\n // Phase 2.3 (W.753): codebase GraphRAG via the bearer-gated mesh route.\n // Best-effort: returns [] when the in-process graph isn't loaded → cognitive-verbs\n // falls back to team-knowledge search. No prod impact when graph is cold.\n queryCodebase: (q, topK) => mesh.queryCodebase(q, topK),\n plan: async (prompt) => {\n const resp = await provider.complete(\n { messages: [{ role: 'user', content: prompt }], maxTokens: 512, temperature: 0.3 },\n identity.llmModel\n );\n return resp.content;\n },\n // Semantic `recall` over the private workspace via the fleet nomic (W.753).\n // brainPath from HOLO_LLM_FLEET_BRAIN; if unset/unreachable embedAcrossFleet\n // returns null and cognitive-verbs falls back to the substring filter.\n embed: (text) => embedAcrossFleet(text, { brainPath: process.env.HOLO_LLM_FLEET_BRAIN }),\n similarity: cosineSimilarity,\n log,\n });\n\n const messages: LLMMessage[] = [\n { role: 'system', content: systemContent },\n { role: 'user', content: buildTaskPrompt(target) },\n ];\n let aggUsage: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n let finalText = '';\n let iters = 0;\n // 30-iter cap: lean-theorist on Paper 22 needed 13 iters to read MSC files\n // + run lake build + iterate kernel checks. 12 was too tight (cap fired\n // before write_file deliverable). 30 allows ~3x that depth — anything\n // hitting 30 iters is almost certainly stuck and should bail.\n const MAX_TOOL_ITERS = 30;\n let lastResponse;\n // Track which tool names were called during this run so the artifact-grounding\n // gate below can refuse to mark \"executed\" on pure-text or read-only responses.\n // Discovered 2026-04-26 mesh-worker-02 audit: workers were posting CAEL records\n // with tool_iters:1 (zero tools called) declaring \"100 scenes validated\" with\n // no commit / no /room done — fabricated deliverables polluting trust. The\n // gate below short-circuits this class of hallucination at the runner edge.\n const toolsCalled = new Set<string>();\n // Tightened-gate counter (W.107.b 2026-04-26): track *productive* tool calls\n // separately from any tool call. A productive call is one of:\n // - write_file with non-empty content\n // - bash matching a productive prefix (lake build / pnpm --filter / vitest\n // run / lean / pnpm vitest — see tools.ts BASH_PRODUCTIVE_PREFIXES)\n // Read-only bash (cat/grep/ls/echo/git status/etc.) does NOT count even\n // though it's whitelisted for execution. This catches the trivial-bash-bypass\n // class (e.g. `bash echo done`) that the original W.107 gate accepted.\n let productiveCallCount = 0;\n // Last git commit SHA emitted during the tool-loop; forwarded to markDone\n // so the board task records a verifiable commit reference.\n let lastCommitHash: string | undefined;\n // F.126 #1 — the model's tools come from the BRAIN'S DECLARATION (the on_task\n // `llm_call { tools: [...] }` array), not a hardcoded list. resolveActiveTools\n // resolves the declared names against MESH_TOOLS, falls back safely when a brain\n // declares none, and SLIM-trims an oversized set for small local models (W.710\n // num_ctx guard). \"Add a tool\" is now \"declare it in the brain,\" not edit this file.\n const { tools: activeTools, declared: declaredTools, dropped: droppedTools } = resolveActiveTools(brain);\n log({\n ev: 'active-tools',\n taskId: target.id,\n tools: activeTools.map((t) => t.name),\n declared: declaredTools,\n ...(droppedTools.length ? { droppedUnknown: droppedTools } : {}),\n });\n while (true) {\n iters++;\n if (iters > MAX_TOOL_ITERS) {\n log({ ev: 'tool-loop-cap', taskId: target.id, iters });\n finalText = finalText || `[tool-loop hit ${MAX_TOOL_ITERS}-iter cap before final text]`;\n break;\n }\n const resp = await provider.complete(\n {\n messages,\n // 8192 for local thinking models (qwen3:4b uses ~3800 tokens on thinking\n // before the tool-call JSON; 4096 cuts off mid-generation). Frontier\n // models ignore this ceiling and stop naturally earlier.\n maxTokens: 8192,\n temperature: 0.4,\n tools: activeTools,\n },\n identity.llmModel\n );\n lastResponse = resp;\n aggUsage = {\n promptTokens: aggUsage.promptTokens + resp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + resp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + resp.usage.totalTokens,\n };\n // If model called tools, execute them and feed results back.\n if (resp.finishReason === 'tool_use' && resp.toolUses && resp.toolUses.length > 0) {\n log({\n ev: 'tool-call',\n taskId: target.id,\n iter: iters,\n tools: resp.toolUses.map((t) => t.name),\n });\n // Artifact-grounding accounting (W.107.b) via the shared classifier in\n // tools.ts — the SAME function the ablation harness measures, so the gate\n // and its evaluation can never drift (single source of truth).\n const productivity = summarizeToolProductivity(resp.toolUses);\n for (const n of productivity.names) toolsCalled.add(n);\n productiveCallCount += productivity.productiveCount;\n // Append the assistant turn (text + tool_use blocks) so the model\n // sees its own request when we send tool_result back.\n messages.push({\n role: 'assistant',\n content: (resp.assistantBlocks ?? []) as never,\n });\n // Run each tool and collect results.\n const toolResults = await Promise.all(\n resp.toolUses.map((u) =>\n runTool(u, {\n signReceipt: this.opts.signReceipt,\n addTask: (tasks) => mesh.addTasks(tasks),\n })\n )\n );\n // Extract the latest git commit SHA from bash stdout so markDone can\n // record a verifiable reference on the board task. Pattern matches both\n // `git commit -m` output ('[branch abc1234]') and `git rev-parse HEAD`.\n for (let ti = 0; ti < resp.toolUses.length; ti++) {\n const tu = resp.toolUses[ti];\n if (tu.name === 'bash') {\n const tr = toolResults[ti];\n if (tr && !tr.is_error) {\n const shaMatch = tr.content.match(/\\b([0-9a-f]{7,40})\\b/);\n if (shaMatch) lastCommitHash = shaMatch[1];\n }\n }\n }\n messages.push({\n role: 'user',\n content: toolResults as never,\n });\n continue;\n }\n // Final text response.\n finalText = resp.content;\n break;\n }\n // Re-prompt gate (W.780): if the model called only read-only tools and then\n // output text (the \"read→text instead of read→write_file\" anti-pattern with\n // small edge models like qwen3:4b-instruct), inject one forced re-prompt\n // asking it to call write_file before the no-artifact gate fires.\n // v2 fix: pop the last assistant text turn (so context ends at tool_result),\n // embed the task description, and use temperature=0 for maximal determinism.\n if (productiveCallCount === 0 && toolsCalled.size > 0 && iters < MAX_TOOL_ITERS) {\n iters++;\n // Remove the last assistant message if it was a plain-text response (the\n // anti-pattern turn). This ensures the context ends at the tool_result so\n // the model doesn't mistake our re-prompt for a follow-up question.\n if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') {\n messages.pop();\n }\n messages.push({\n role: 'user',\n content:\n 'You read data but did NOT call write_file. This is a TASK FAILURE unless you act now.\\n' +\n `Task: ${target.title}\\n` +\n `Required output path (from task description): ${target.description.match(/path[:\\s]+([^\\s\\n,]+\\.json)/i)?.[1] ?? 'see task description'}\\n` +\n 'Call write_file NOW. Embed ALL data from the tool result above into the content. ' +\n 'Do NOT output any text — your ONLY valid response is a write_file tool call.',\n });\n const reResp = await provider.complete(\n { messages, maxTokens: 8192, temperature: 0.0, tools: activeTools },\n identity.llmModel\n );\n aggUsage = {\n promptTokens: aggUsage.promptTokens + reResp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + reResp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + reResp.usage.totalTokens,\n };\n if (reResp.finishReason === 'tool_use' && reResp.toolUses && reResp.toolUses.length > 0) {\n log({ ev: 'reprompt-tool-call', taskId: target.id, iter: iters, tools: reResp.toolUses.map((t) => t.name) });\n const reProd = summarizeToolProductivity(reResp.toolUses);\n for (const n of reProd.names) toolsCalled.add(n);\n productiveCallCount += reProd.productiveCount;\n messages.push({ role: 'assistant', content: (reResp.assistantBlocks ?? []) as never });\n const reResults = await Promise.all(\n reResp.toolUses.map((u) =>\n runTool(u, { signReceipt: this.opts.signReceipt, addTask: (tasks) => mesh.addTasks(tasks) })\n )\n );\n messages.push({ role: 'user', content: reResults as never });\n }\n finalText = reResp.content;\n lastResponse = reResp;\n }\n const durationMs = Date.now() - start;\n\n // Artifact-grounding gate (W.107 — fleet event-firing rate is not a productivity\n // metric; only side-effecting tool calls produce real artifacts; 2026-04-26\n // tightened to W.107.b which also closes the trivial-bash bypass: `bash echo\n // done` and `write_file /tmp/x \"\"` no longer pass the gate). The gate now\n // requires AT LEAST ONE productive call:\n // - write_file with non-empty content, OR\n // - bash matching a productive prefix (lake build / pnpm --filter /\n // vitest run / lean / pnpm vitest)\n // Read-only inspection tools (read_file, list_dir) and read-only bash\n // (cat/grep/ls/echo/git status/git log/...) don't satisfy the gate.\n if (productiveCallCount === 0) {\n log({\n ev: 'no-artifact',\n taskId: target.id,\n tool_iters: iters,\n toolsCalled: [...toolsCalled],\n productiveCallCount,\n message:\n 'task execution did not produce a real artifact — refusing to mark executed. ' +\n 'Required: write_file with non-empty content OR bash with a productive prefix ' +\n '(lake build / pnpm --filter / vitest run / lean / pnpm vitest). ' +\n 'Pure-text, read-only inspection, and trivial-bash-bypass (`echo`, `cat`, etc.) do not satisfy the gate.',\n });\n // Best-effort: leave the task in claimed state so the supervisor can either\n // re-tick or release it via heartbeat-rejoin. We deliberately do NOT post\n // a \"fake-done\" message on the board, do NOT post a CAEL record, and do NOT\n // call the cost guard's recordUsage — the run produced no artifact and\n // should not bill the budget for a hallucinated tick.\n return {\n action: 'no-artifact',\n taskId: target.id,\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n message: `no productive tool call observed (toolsCalled=[${[...toolsCalled].join(',')}], productiveCallCount=${productiveCallCount}, iters=${iters})`,\n };\n }\n\n // ── Reflect: cognitive self-evaluation gate (W.736) ──────────────────────\n // If the brain declares a `reflect` verb, run ONE self-evaluation pass over\n // the produced artifact before accepting it — the brain's local_first\n // confidence gate. Uses the same provider (no engine/trait dependency) and\n // mirrors the CognitiveActions reflect prompt shape. The verdict is acted on\n // at the markDone gate below; its tokens fold into aggUsage so cost is honest.\n let reflectVerdict: { pass: boolean; reason: string } | undefined;\n if (brain.reflect) {\n try {\n const reflectResp = await provider.complete(\n {\n messages: [\n {\n role: 'system',\n content:\n 'You are a strict reviewer. Evaluate the work against the criteria; do not rewrite it.',\n },\n {\n role: 'user',\n content:\n `Reflect on the artifact produced for this task. Evaluate it for: ${brain.reflect.criteria}.\\n\\n` +\n `--- artifact / final response ---\\n${finalText.slice(0, 4000)}\\n--- end ---\\n\\n` +\n `Give a one-line reason, then end with exactly \"VERDICT: PASS\" or \"VERDICT: FAIL\".`,\n },\n ],\n maxTokens: 512,\n temperature: 0.1,\n },\n identity.llmModel\n );\n aggUsage = {\n promptTokens: aggUsage.promptTokens + reflectResp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + reflectResp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + reflectResp.usage.totalTokens,\n };\n const verdictMatch = /VERDICT:\\s*(PASS|FAIL)/i.exec(reflectResp.content);\n // Unparseable verdict = PASS — reflect is a gate, not a tripwire; never\n // block a real artifact on a parser miss (small local models phrase loosely).\n const pass = verdictMatch ? verdictMatch[1].toUpperCase() === 'PASS' : true;\n reflectVerdict = {\n pass,\n reason: reflectResp.content.replace(/VERDICT:\\s*(PASS|FAIL)/i, '').trim().slice(0, 300),\n };\n log({\n ev: 'reflect',\n taskId: target.id,\n pass,\n escalateOnFail: brain.reflect.escalateOnFail,\n reason: reflectVerdict.reason.slice(0, 120),\n });\n } catch (err) {\n log({\n ev: 'reflect-error',\n taskId: target.id,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const cost = costGuard.recordUsage(identity.llmModel, aggUsage);\n log({\n ev: 'executed',\n taskId: target.id,\n costUsd: cost.costUsd.toFixed(4),\n spentUsd: cost.spentUsd.toFixed(4),\n tokens: aggUsage.totalTokens,\n tool_iters: iters,\n });\n const response = {\n ...(lastResponse ?? { content: finalText, usage: aggUsage }),\n content: finalText,\n usage: aggUsage,\n };\n\n const execResult: ExecutionResult = {\n taskId: target.id,\n responseText: response.content,\n usage: response.usage,\n costUsd: cost.costUsd,\n durationMs,\n };\n\n if (this.opts.auditLog) {\n try {\n this.opts.auditLog.recordTaskExecuted({\n identity,\n task: target,\n result: execResult,\n });\n } catch (err) {\n log({ ev: 'audit-log-error', message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n // Phase 1 CAEL audit: post to the HoloMesh audit store so the fleet\n // corpus collector at ai-ecosystem/scripts/fleet-corpus-collector.mjs\n // can read records via GET /api/holomesh/agent/{handle}/audit. Without\n // this POST, the local AuditLog above is the only durable record and\n // Paper 25's gate clock cannot start. See ai-ecosystem task\n // task_1777106535952_atug for the empty-audit investigation.\n try {\n const caelRecord = buildCaelRecord({\n identity,\n brain,\n task: target,\n messages,\n finalText,\n usage: aggUsage,\n costUsd: cost.costUsd,\n spentUsd: cost.spentUsd,\n prevChain: this.prevCaelChain,\n runtimeVersion: RUNTIME_VERSION,\n });\n const posted = await mesh.postAuditRecords(identity.handle, [caelRecord]);\n this.prevCaelChain = caelRecord.fnv1a_chain;\n log({\n ev: 'cael-posted',\n taskId: target.id,\n appended: posted.appended,\n rejected: posted.rejected,\n });\n } catch (err) {\n log({ ev: 'cael-post-error', message: err instanceof Error ? err.message : String(err) });\n }\n\n // Reflect escalation gate: a brain with `reflect { escalate_on_fail: true }`\n // does NOT mark done on a failed self-evaluation — it escalates to the fleet\n // (the local_first directive). Cost + CAEL are already recorded above (the work\n // happened and the self-eval is a verifiable trace); only acceptance/markDone is\n // withheld. Brains without reflect, or with an advisory reflect, fall through.\n if (reflectVerdict && !reflectVerdict.pass && brain.reflect?.escalateOnFail) {\n try {\n await mesh.sendMessageOnTask(\n target.id,\n `[${identity.handle}] reflect gate FAILED — escalating to the fleet instead of marking done. Reason: ${reflectVerdict.reason}`\n );\n } catch {\n /* best-effort escalation notice; the return value is the source of truth */\n }\n log({ ev: 'reflect-escalate', taskId: target.id, reason: reflectVerdict.reason.slice(0, 120) });\n return {\n action: 'reflect-escalate',\n taskId: target.id,\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n message: `reflect self-evaluation failed; escalated to fleet (reason: ${reflectVerdict.reason.slice(0, 120)})`,\n };\n }\n\n if (this.opts.onTaskExecuted) {\n await this.opts.onTaskExecuted(execResult, target);\n } else {\n await mesh.sendMessageOnTask(\n target.id,\n `[${identity.handle}] response (${response.usage.totalTokens} tok, $${cost.costUsd.toFixed(4)}):\\n\\n${response.content}`\n );\n }\n\n // Mark the task done so it doesn't linger in 'claimed' forever.\n // Wrapped in try/catch: a markDone failure (e.g. task already closed by\n // a supervisor, or transient network error) must not prevent the tick\n // return value from reaching the caller.\n try {\n await mesh.markDone(target.id, finalText.slice(0, 500), lastCommitHash);\n log({ ev: 'mark-done', taskId: target.id, commitHash: lastCommitHash });\n } catch (err) {\n log({\n ev: 'mark-done-error',\n taskId: target.id,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Continuity write-loop: persist this task's outcome to the agent's PRIVATE\n // knowledge so a future `recall` verb has real memory to draw on. This closes\n // the W.752 loop-gap — the edge `recall` verb read /knowledge/private but it\n // was always empty because nothing ever wrote to it. Now markDone feeds it.\n // Best-effort (writePrivateKnowledge swallows its own errors); the task is\n // already done, so a write miss is logged and ignored.\n if (finalText.trim()) {\n const fact =\n `Task \"${target.title}\" (${target.id}) completed. ` +\n `Outcome: ${finalText.trim().slice(0, 600)}` +\n (lastCommitHash ? ` [commit ${lastCommitHash}]` : '');\n const wrote = await mesh.writePrivateKnowledge([\n { content: fact, type: 'task-outcome', tags: ['task-outcome', identity.handle] },\n ]);\n log({ ev: wrote ? 'knowledge-write' : 'knowledge-write-skip', taskId: target.id });\n }\n\n return {\n action: 'executed',\n taskId: target.id,\n spentUsd: cost.spentUsd,\n remainingUsd: cost.remainingUsd,\n };\n }\n\n async runForever(opts: { tickIntervalMs?: number } = {}): Promise<void> {\n const interval = opts.tickIntervalMs ?? 60_000;\n while (!this.stopped) {\n try {\n await this.tick();\n } catch (err) {\n const log = this.opts.logger ?? (() => undefined);\n log({ ev: 'tick-error', message: err instanceof Error ? err.message : String(err) });\n }\n await sleep(interval + jitter(interval));\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n /**\n * Heartbeat with one-shot self-rejoin on 403 \"Not a member of this team\".\n *\n * Pairs with task_1777112258989_eeyp: fresh-deploy fleet workers whose\n * provisioning didn't atomically call /join (or whose membership was\n * reaped) hit 403 every tick and never recover. We detect the specific\n * server error string (see packages/mcp-server/src/holomesh/routes/\n * team-routes.ts:903 → `{ error: 'Not a member' }` for /presence), call\n * mesh.joinTeam() ONCE per runner process, and retry the heartbeat.\n *\n * Strict scope:\n * - Only retries on 403 + \"Not a member\" body. Any other 403 (insufficient\n * permissions, signing failure) re-throws unchanged.\n * - Only retries ONCE per process. If we already rejoined this process and\n * the heartbeat is *still* 403, the team is rejecting us for a reason\n * /join can't fix (e.g. capacity, ban) — surface the error.\n * - If joinTeam() itself throws, we DO mark joinedThisProcess=true before\n * re-throwing so we don't slam the join endpoint on every subsequent\n * tick. The next tick will surface the same heartbeat 403 and the\n * runner-level catch in runForever logs tick-error and sleeps. Operator\n * inspection (SSH/log) is the recovery path at that point.\n */\n private async heartbeatWithAutoRejoin(): Promise<void> {\n const { identity, brain, mesh, logger } = this.opts;\n const log = logger ?? (() => undefined);\n const capabilityTags = brain.capabilityTags.length > 0 ? brain.capabilityTags : undefined;\n try {\n await mesh.heartbeat({ agentName: identity.handle, surface: identity.surface, capabilityTags });\n } catch (err) {\n if (!this.isNotAMemberError(err) || this.joinedThisProcess) {\n throw err;\n }\n log({ ev: 'auto-rejoin-attempt', reason: 'heartbeat-403-not-a-member' });\n // Mark BEFORE the join call so a thrown joinTeam() can't loop us.\n this.joinedThisProcess = true;\n try {\n const joinResult = await mesh.joinTeam();\n log({ ev: 'auto-rejoin-success', role: joinResult.role, members: joinResult.members });\n } catch (joinErr) {\n log({\n ev: 'auto-rejoin-failed',\n message: joinErr instanceof Error ? joinErr.message : String(joinErr),\n });\n throw joinErr;\n }\n // Retry the heartbeat exactly once. If it still fails (including with\n // another 403), the new error propagates — joinedThisProcess is now\n // true so we won't retry-loop on the next tick.\n await mesh.heartbeat({ agentName: identity.handle, surface: identity.surface, capabilityTags });\n log({ ev: 'auto-rejoin-heartbeat-recovered' });\n }\n }\n\n /**\n * Detect the server's \"Not a member\" 403 error from HolomeshClient.req().\n * The error message format is: `HoloMesh POST /team/<id>/presence 403: <body>`\n * where body contains `{\"error\":\"Not a member\"}` (or \"Not a member of this team\").\n * Match conservatively: BOTH a \"403\" status marker AND the \"Not a member\"\n * substring must appear, so unrelated 403s (insufficient permissions,\n * signing failures) do NOT trigger a rejoin.\n */\n private isNotAMemberError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return / 403:/.test(msg) && /Not a member/i.test(msg);\n }\n}\n\nfunction buildTaskPrompt(task: BoardTask): string {\n return [\n `Board task to execute: ${task.id}`,\n `Title: ${task.title}`,\n `Priority: ${task.priority}`,\n `Tags: ${(task.tags ?? []).join(', ')}`,\n '',\n 'Description:',\n task.description ?? '(no description)',\n '',\n 'Produce the deliverable: call write_file (or bash with a build command) to create all required output files FIRST. Apply your brain composition rules — anti-patterns, decision loop, and scope tier all bind. After calling the tool(s), return a short plain-text summary of what you did for posting to /room.',\n ].join('\\n');\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction jitter(base: number): number {\n return Math.floor((Math.random() - 0.5) * base * 0.2);\n}\n","// CAEL audit record builder for the headless agent runtime.\n//\n// Phase 1: agent ticks emit a CaelAuditRecord shaped to satisfy the\n// HoloMesh audit endpoint validator at packages/mcp-server/src/holomesh/\n// routes/core-routes.ts:512-518 (7-element layer_hashes array, string\n// tick_iso/operation/fnv1a_chain). The 7 layers map to concrete tick\n// stages so a downstream consumer can verify any one layer in isolation:\n//\n// L0 brain_state — sha256(brain.systemPrompt)\n// L1 tick_input — sha256(taskId|title|description)\n// L2 messages — sha256(JSON of final message thread)\n// L3 response — sha256(finalText)\n// L4 usage — sha256(JSON of aggregated TokenUsage)\n// L5 cost — sha256(costUsd|spentUsd)\n// L6 composite — sha256(L0|L1|L2|L3|L4|L5)\n//\n// fnv1a_chain extends across records: chain_n = sha256(chain_{n-1} | L6_n).\n// First tick emits prev_hash=null; subsequent ticks chain from the\n// previous record's fnv1a_chain.\n\nimport { createHash } from 'node:crypto';\nimport type { LLMMessage, TokenUsage } from '@holoscript/llm-provider';\nimport type { AgentIdentity, BoardTask, ExecutionResult, RuntimeBrainConfig } from './types.js';\n\nexport interface CaelAuditRecord {\n tick_iso: string;\n layer_hashes: string[];\n operation: string;\n prev_hash: string | null;\n fnv1a_chain: string;\n version_vector_fingerprint: string;\n brain_class?: string;\n trial?: number;\n attack_class?: string;\n defense_state?: string;\n /**\n * Trust-epoch tag for downstream consumers (Paper 25 gate clock,\n * fleet-health drift detector, retroactive corpus filters). Set to\n * `'post-w107'` for any record built after the 2026-04-26 W.107\n * artifact-grounding gate landed (HoloScript commit 4aab897ad). Records\n * without this field — i.e. anything in the audit store before the gate\n * was deployed — are implicitly `'pre-w107-untrusted'`. The mesh-worker-02\n * 27.5h hallucination class (fabricated \"100 scenes validated\" CAEL\n * records with no actual artifact) all live in the implicit-untrusted\n * cohort. Consumers should filter by `trust_epoch === 'post-w107'`\n * before treating CAEL records as evidence of real work.\n */\n trust_epoch?: 'post-w107';\n}\n\nexport interface BuildCaelRecordInput {\n identity: AgentIdentity;\n brain: RuntimeBrainConfig;\n task: BoardTask;\n messages: LLMMessage[];\n finalText: string;\n usage: TokenUsage;\n costUsd: number;\n spentUsd: number;\n prevChain: string | null;\n runtimeVersion: string;\n}\n\nfunction sha(input: string): string {\n return createHash('sha256').update(input, 'utf8').digest('hex');\n}\n\n/**\n * Extract the brain class from a runtime brain config. Tries multiple sources\n * because brainPath shape varies across deployment environments:\n * 1. compositions/<class>-brain.hsplus (canonical layout — caught 2026-04-24)\n * 2. <anything>/<class>-brain.hsplus (loose match — Vast.ai box layout)\n * 3. <class>-brain.hsplus basename only\n * 4. brain.domain (loaded from .hsplus identity block by loadBrain())\n * 5. 'unknown' if all sources fail\n *\n * Live evidence (2026-04-25 mesh-worker-01 record): the strict regex returned\n * 'unknown' against the production worker box's brainPath, leaving every CAEL\n * fingerprint useless for fleet attribution. This loosened version recovers\n * brain class even when path layout drifts from the compositions/-rooted form.\n */\nfunction brainClassOf(brain: { brainPath?: string; domain?: string }): string {\n const p = String(brain.brainPath ?? '');\n // Tier 1: canonical compositions/-rooted layout.\n let m = p.match(/compositions[\\\\/]([\\w-]+)-brain\\.hsplus$/);\n if (m) return m[1];\n // Tier 2: any path with `<class>-brain.hsplus` basename.\n m = p.match(/([\\w-]+)-brain\\.hsplus$/);\n if (m) return m[1];\n // Tier 3: bare basename.\n m = p.match(/([\\w-]+)\\.hsplus$/);\n if (m) return m[1];\n // Tier 4: domain field from the loaded brain composition's identity block.\n const domain = String(brain.domain ?? '').trim();\n if (domain && domain !== 'unknown') return domain;\n return 'unknown';\n}\n\nexport function buildCaelRecord(input: BuildCaelRecordInput): CaelAuditRecord {\n const {\n identity,\n brain,\n task,\n messages,\n finalText,\n usage,\n costUsd,\n spentUsd,\n prevChain,\n runtimeVersion,\n } = input;\n\n const l0 = sha(brain.systemPrompt);\n const l1 = sha(`${task.id}|${task.title}|${task.description ?? ''}`);\n const l2 = sha(JSON.stringify(messages));\n const l3 = sha(finalText);\n const l4 = sha(JSON.stringify(usage));\n const l5 = sha(`${costUsd.toFixed(6)}|${spentUsd.toFixed(6)}`);\n const l6 = sha([l0, l1, l2, l3, l4, l5].join('|'));\n\n const fnv1a_chain = sha(`${prevChain ?? ''}|${l6}`);\n\n return {\n tick_iso: new Date().toISOString(),\n layer_hashes: [l0, l1, l2, l3, l4, l5, l6],\n operation: `task-executed:${task.id}`,\n prev_hash: prevChain,\n fnv1a_chain,\n version_vector_fingerprint: `agent@${runtimeVersion}|brain@${brainClassOf(brain)}|provider@${identity.llmProvider}|model@${identity.llmModel}`,\n brain_class: brainClassOf(brain),\n trust_epoch: 'post-w107',\n };\n}\n","/**\n * Tool runner for headless mesh agents.\n *\n * Provides a small, sandboxed set of tools that LLM agents can call during\n * task execution. Anthropic tool-use shape — these specs are passed to\n * `messages.stream({ tools: [...] })`, the model returns `tool_use` blocks,\n * the runner executes them via `runTool()` and feeds results back as\n * `tool_result` blocks until the model emits its final text response.\n *\n * Sandbox model:\n * - read_file / list_dir: restricted to ALLOWED_READ_ROOTS (task inputs +\n * read-only views of the cloned repo). No /etc, no /home, no /root/.ssh.\n * - write_file: restricted to ALLOWED_WRITE_ROOTS (just /root/agent-output/).\n * Creates dir if needed, refuses paths that escape via .. or symlinks.\n * - bash: ONLY whitelisted command prefixes (lake build, lean ..., ls, cat,\n * grep, find, wc, head, tail, git status/log/diff/show, pnpm --filter,\n * vitest run --no-coverage). Hard 60s wall timeout, 1MB stdout cap. Refuses\n * anything else (rm, curl, ssh, sudo, eval, etc.).\n * - http_request: HTTPS GET only, 30s timeout, 200KB cap. Private IP ranges\n * (RFC-1918/loopback/link-local) are blocked to prevent SSRF against the\n * host network. Read-only — does not count as a productive tool call.\n *\n * The sandbox is best-effort host isolation — these instances are dedicated\n * to a single mesh-worker identity, so we trade some flexibility for a clear\n * \"what the LLM can do\" contract that audits cleanly.\n */\n\nimport { readFile, writeFile, readdir, mkdir, stat } from 'node:fs/promises';\nimport { resolve, dirname, delimiter, isAbsolute, sep } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport type { ToolSpec, ToolUseBlock, ToolResultBlock } from '@holoscript/llm-provider';\n\n// ---------------------------------------------------------------------------\n// Sandbox roots — keep narrow. Add only when a task needs more.\n//\n// Env-overridable so the SAME runner serves both deployments:\n// - Vast fleet instance: the /root/* defaults below (clone + scp layout).\n// - Local node (laptop / Jetson): point at the local checkout + a local\n// output dir via HOLOSCRIPT_AGENT_READ_ROOTS / _WRITE_ROOTS.\n// Format: OS-path-separator-delimited list (':' on POSIX, ';' on Windows) —\n// e.g. HOLOSCRIPT_AGENT_READ_ROOTS=\"/home/user/HoloScript:/home/user/agent-output\".\n// Unset → fleet defaults (no behavior change on the existing workers).\n// ---------------------------------------------------------------------------\nconst FLEET_READ_ROOTS = [\n '/root/msc-paper-22', // Paper 22 mechanization inputs (scp'd by deploy)\n '/root/holoscript-mesh', // Read-only repo view (clone path on instance)\n '/root/agent-output', // Read back what we wrote\n];\n\nconst FLEET_WRITE_ROOTS = [\n '/root/agent-output', // Single write sink — keeps deliverables in one place\n];\n\nfunction parseRootsEnv(raw: string | undefined, fallback: string[]): string[] {\n if (!raw) return fallback;\n const roots = raw\n .split(delimiter)\n .map((r) => r.trim())\n .filter((r) => r.length > 0 && isAbsolute(r));\n return roots.length > 0 ? roots : fallback;\n}\n\nconst ALLOWED_READ_ROOTS = parseRootsEnv(\n process.env.HOLOSCRIPT_AGENT_READ_ROOTS,\n FLEET_READ_ROOTS,\n);\n\nconst ALLOWED_WRITE_ROOTS = parseRootsEnv(\n process.env.HOLOSCRIPT_AGENT_WRITE_ROOTS,\n FLEET_WRITE_ROOTS,\n);\n\n// Command-prefix whitelist. Prefix-match is intentional — `lake build MSC`\n// matches `lake build`, `pnpm --filter @holoscript/core build` matches\n// `pnpm --filter`, etc. Refuses anything else (no sudo, rm, curl, ssh, eval).\n//\n// Two-tier classification (W.107 tightening 2026-04-26):\n// READ_ONLY — observation-only commands. Pass execution policy, but do\n// NOT count as artifact-producing for the W.107 gate.\n// PRODUCTIVE — commands that build, test, or otherwise produce a real\n// artifact (compile output, test result, etc.). DO count as\n// artifact-producing for the W.107 gate.\n//\n// Pre-tightening, the gate accepted ANY bash call as side-effecting — so\n// `bash echo done` would falsely pass the gate. Now `echo` is read-only and\n// the worker must call something productive (lake build / pnpm --filter\n// build / vitest run / lean compile / etc.) to claim `executed`.\nconst BASH_READ_ONLY_PREFIXES = [\n 'ls ',\n 'ls\\n',\n 'ls$',\n 'cat ',\n 'grep ',\n 'rg ',\n 'find ',\n 'wc ',\n 'head ',\n 'tail ',\n 'git status',\n 'git log',\n 'git diff',\n 'git show',\n 'pwd',\n 'echo ',\n 'lake env',\n];\n\nconst BASH_PRODUCTIVE_PREFIXES = [\n 'lake build',\n 'lake clean',\n 'lean ',\n 'pnpm --filter',\n 'pnpm vitest',\n 'vitest run',\n // Robotics / edge-node (Jetson) productive commands — without these, every\n // ros2/colcon/tegrastats task fails the W.107 artifact gate and is abandoned\n // as no-artifact. (jetson-orin-01 lane.)\n 'ros2 launch',\n 'ros2 topic pub',\n 'ros2 service call',\n 'colcon build',\n 'tegrastats',\n];\n\nconst BASH_WHITELIST = [...BASH_READ_ONLY_PREFIXES, ...BASH_PRODUCTIVE_PREFIXES];\n\n/**\n * Returns true iff `cmd` matches a productive prefix — i.e. would produce a\n * real artifact (compile/test/build output) rather than just observing state.\n * Used by the W.107 artifact-grounding gate in runner.ts.\n */\nexport function isProductiveBashCommand(cmd: string): boolean {\n const trimmed = String(cmd ?? '').trim();\n if (!trimmed) return false;\n return BASH_PRODUCTIVE_PREFIXES.some((prefix) => trimmed.startsWith(prefix.trim()));\n}\n\n/**\n * True iff a single tool_use is a *productive* (artifact-producing) call for the\n * W.107.b artifact-grounding gate:\n * - write_file with non-empty content,\n * - bash with a productive prefix (isProductiveBashCommand),\n * - emit_hardware_receipt (always writes a receipt file).\n * read_file / list_dir and read-only / trivial bash are NOT productive.\n *\n * This is the SINGLE SOURCE OF TRUTH the runner's gate (runner.ts) and the\n * artifact-gate ablation harness both consume — so the measured gate can never\n * drift from the shipped gate (the ablation measures the real thing, not a copy).\n */\nexport function isProductiveToolUse(use: ToolUseBlock): boolean {\n const input = (use.input ?? {}) as Record<string, unknown>;\n switch (use.name) {\n case 'write_file':\n return String(input.content ?? '').length > 0;\n case 'bash':\n return isProductiveBashCommand(String(input.cmd ?? ''));\n case 'emit_hardware_receipt':\n return true;\n case 'str_replace':\n return true;\n case 'vision_analyze':\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Accumulate the productive-call count + the tool names seen across one model\n * turn's tool_use blocks. The runner adds `names` to its toolsCalled set and\n * `productiveCount` to its gate counter.\n */\nexport function summarizeToolProductivity(uses: readonly ToolUseBlock[]): {\n productiveCount: number;\n names: string[];\n} {\n let productiveCount = 0;\n const names: string[] = [];\n for (const u of uses) {\n names.push(u.name);\n if (isProductiveToolUse(u)) productiveCount++;\n }\n return { productiveCount, names };\n}\n\n// ---------------------------------------------------------------------------\n// Tool specs surfaced to the LLM\n// ---------------------------------------------------------------------------\nexport const MESH_TOOLS: ToolSpec[] = [\n {\n name: 'read_file',\n description:\n `Read a file from the agent sandbox. Allowed roots: ${ALLOWED_READ_ROOTS.join(', ')}. ` +\n 'Returns the file content as text. Use this to inspect task inputs and the ' +\n 'read-only repo view.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Absolute path under an allowed read root' },\n },\n required: ['path'],\n },\n },\n {\n name: 'list_dir',\n description:\n 'List entries in a directory under the agent sandbox. Same root restrictions ' +\n 'as read_file. Returns a newline-separated list of entries.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Absolute path under an allowed read root' },\n },\n required: ['path'],\n },\n },\n {\n name: 'write_file',\n description:\n `Write a file to the deliverable sink (write roots: ${ALLOWED_WRITE_ROOTS.join(', ')}). ` +\n 'Anything you want to emit as task output (a Lean proof, a markdown report, a JSON ' +\n 'dataset, a .holo scene) goes here. Creates parent directories. Will refuse paths ' +\n 'outside the write root(s).',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: `Absolute path under a write root: ${ALLOWED_WRITE_ROOTS.join(', ')}` },\n content: { type: 'string', description: 'File content to write (UTF-8)' },\n },\n required: ['path', 'content'],\n },\n },\n {\n name: 'bash',\n description:\n 'Run a shell command. Whitelisted prefixes only: lake build, lean, ls, cat, ' +\n 'grep, find, wc, head, tail, git status/log/diff/show, pnpm --filter, vitest run, ' +\n 'pwd, echo, ros2 launch/topic/service, colcon build, tegrastats. ' +\n 'Hard 60s wall timeout, 1MB stdout cap. Use for builds, tests, hardware probes. ' +\n 'Refuses rm, curl, ssh, sudo, eval.',\n input_schema: {\n type: 'object',\n properties: {\n cmd: { type: 'string', description: 'Whitelisted shell command' },\n cwd: { type: 'string', description: 'Optional working directory (defaults to /root)' },\n },\n required: ['cmd'],\n },\n },\n {\n name: 'http_request',\n description:\n 'HTTPS GET a public URL and return the response body as text. ' +\n 'HTTPS only — http:// and private IPs (RFC-1918, loopback, link-local) are blocked. ' +\n '200KB cap, 30s timeout. Read-only: does not satisfy the write_file artifact gate.',\n input_schema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'https:// URL to fetch' },\n headers: {\n type: 'object',\n description: 'Optional request headers (e.g. {\"Accept\": \"application/json\"})',\n },\n },\n required: ['url'],\n },\n },\n {\n name: 'emit_hardware_receipt',\n description:\n 'Emit a portable hardware receipt (PortableHardwareReceiptMetadata v1) capturing ' +\n 'device identity, runtime, and measured performance. Writes a JSON receipt to the ' +\n 'agent output dir. Use after running tegrastats or colcon build to record hardware ' +\n 'evidence for the CAEL audit chain. Accepts either pre-parsed measurements or raw ' +\n 'tegrastats output (the tool parses it automatically).',\n input_schema: {\n type: 'object',\n properties: {\n device_kind: {\n type: 'string',\n description: 'Device identifier, e.g. \"jetson-orin-nano-super\", \"raspberry-pi-5\"',\n },\n accelerator: {\n description: 'Accelerator string, e.g. \"NVIDIA CUDA 8.7\", or null for CPU-only',\n },\n runtime_name: { type: 'string', description: 'Inference runtime, e.g. \"Ollama\", \"llama.cpp\"' },\n runtime_version: { type: 'string', description: 'Runtime version, e.g. \"0.30.8\"' },\n host_os: { type: 'string', description: 'OS + firmware, e.g. \"JetPack 6.2.1 / Ubuntu 22.04\"' },\n composition_id: { type: 'string', description: 'Brain composition reference, e.g. \"jetson-orin-brain\"' },\n measurements: {\n type: 'array',\n description: 'Pre-parsed measurements. Each item: {metric: string, value: number, unit: string}',\n items: { type: 'object' },\n },\n tegrastats_output: {\n type: 'string',\n description: 'Raw tegrastats output line(s) — tool auto-parses GPU%, RAM, temp, power',\n },\n },\n required: ['device_kind', 'runtime_name', 'runtime_version', 'host_os'],\n },\n },\n {\n name: 'str_replace',\n description:\n 'Surgical in-place edit of a file: find an exact string and replace it. ' +\n 'The old string must appear exactly once in the file — if it appears zero or more than once ' +\n 'the tool returns an error with the actual count, letting you refine the search string. ' +\n 'Only files under the write root(s) can be edited. ' +\n 'Counts as a productive tool call (equivalent to write_file).',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: `Absolute path under a write root: ${ALLOWED_WRITE_ROOTS.join(', ')}` },\n old: { type: 'string', description: 'Exact string to find (must occur exactly once)' },\n new: { type: 'string', description: 'Replacement string' },\n },\n required: ['path', 'old', 'new'],\n },\n },\n {\n name: 'delegate_task',\n description:\n 'Post a new task to the team board so another agent can claim and execute it. ' +\n 'Use this to spawn sub-work the current agent cannot or should not do itself ' +\n '(e.g. a vision task for jetson-orin-fara, a cloud compute task for the fleet). ' +\n 'The task appears on the shared board and is claimed by the first agent with matching capability tags.',\n input_schema: {\n type: 'object',\n properties: {\n title: { type: 'string', description: 'Task title (max 200 chars)' },\n description: { type: 'string', description: 'Detailed task description (max 2000 chars)' },\n priority: { type: 'number', description: 'Priority 1-10 (1 = critical, default 5)' },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Capability tags for routing to the right agent, e.g. [\"vision\",\"edge\"]',\n },\n source: { type: 'string', description: 'Where this subtask came from (e.g. parent task id)' },\n },\n required: ['title'],\n },\n },\n {\n name: 'vision_analyze',\n description:\n 'Analyze an image using the local Fara-7B vision model (Ollama on loopback). ' +\n 'Reads the image file at `image_path`, sends it to fara:7b via the local Ollama API, ' +\n 'and returns the model\\'s text analysis. ' +\n 'Counts as a productive tool call — use for GUI-grounding, visual QA, image captioning, ' +\n 'or any task that requires perceiving image content. ' +\n 'Only available on surfaces with a local Ollama instance running fara:7b.',\n input_schema: {\n type: 'object',\n properties: {\n image_path: {\n type: 'string',\n description: 'Absolute path to the image file (png, jpg, webp, gif)',\n },\n prompt: {\n type: 'string',\n description: 'Instruction for the vision model (default: \"Describe this image in detail.\")',\n },\n model: {\n type: 'string',\n description: 'Ollama model tag to use (default: \"fara:7b\")',\n },\n },\n required: ['image_path'],\n },\n },\n];\n\n// ---------------------------------------------------------------------------\n// Active-tool resolution (F.126 #1 — author behavior as DATA the runtime consumes)\n// ---------------------------------------------------------------------------\n/**\n * Assemble the tool set the model sees from the brain's OWN DECLARATION — the\n * `behavior on_task { llm_call { tools: [...] } }` array — instead of a hardcoded\n * list. This is principle #1 of the native doctrine (F.126): the runtime consumes\n * the brain's authored capability set, so \"add a tool\" becomes \"declare it in the\n * brain,\" not \"edit this TypeScript.\" Fixes the dead-data bug where every brain's\n * declared tools were ignored and local-llm brains were amputated to write_file-only.\n *\n * - Declared names are resolved against the available specs; an unknown name is\n * dropped (the runner logs it) so a typo can't crash the loop.\n * - A brain that declares NO tools falls back to the prior safe default\n * (write_file-only for small local-llm models — the artifact-grounding floor;\n * full menu otherwise) so this is backward-compatible.\n * - W.710 progressive disclosure: a small local model can overflow its num_ctx\n * output budget reasoning over a big menu before it emits a tool call, so a\n * declared set larger than the budget is SLIM-trimmed (write_file kept first)\n * for local-llm brains. Budget via HOLOSCRIPT_AGENT_TOOL_BUDGET (default 6).\n */\nexport function resolveActiveTools(\n brain: { requires: string[]; onTaskActions?: Array<{ verb: string; config?: Record<string, unknown> }> },\n opts: { all?: ToolSpec[]; isLocal?: boolean; budget?: number } = {}\n): { tools: ToolSpec[]; declared: string[]; dropped: string[] } {\n const all = opts.all ?? MESH_TOOLS;\n const isLocal = opts.isLocal ?? brain.requires.includes('local-llm');\n const budget = opts.budget ?? (Number(process.env.HOLOSCRIPT_AGENT_TOOL_BUDGET) || 6);\n\n const declaredRaw = brain.onTaskActions?.find((a) => a.verb === 'llm_call')?.config?.tools;\n const declared = Array.isArray(declaredRaw)\n ? declaredRaw.filter((n): n is string => typeof n === 'string')\n : [];\n\n if (declared.length === 0) {\n // No declaration → prior safe default (backward-compatible).\n const fallback = isLocal ? all.filter((t) => t.name === 'write_file') : all;\n return { tools: fallback, declared: [], dropped: [] };\n }\n\n const dropped = declared.filter((n) => !all.some((t) => t.name === n));\n let resolved = declared\n .map((n) => all.find((t) => t.name === n))\n .filter((t): t is ToolSpec => Boolean(t));\n if (resolved.length === 0) resolved = all.filter((t) => t.name === 'write_file'); // never hand the model an empty toolset\n\n // num_ctx guard for small models: trim a large declared set, keeping write_file (grounding) first.\n if (isLocal && resolved.length > budget) {\n const wf = resolved.filter((t) => t.name === 'write_file');\n const rest = resolved.filter((t) => t.name !== 'write_file');\n resolved = [...wf, ...rest].slice(0, budget);\n }\n return { tools: resolved, declared, dropped };\n}\n\n// ---------------------------------------------------------------------------\n// SSRF guard — block private/loopback/link-local hosts (RFC-1918 + RFC-5735)\n// ---------------------------------------------------------------------------\nconst PRIVATE_IP_RE =\n /^(127\\.|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.|169\\.254\\.|0\\.|::1$|fc[0-9a-f]{2}:|fd[0-9a-f]{2}:)/i;\n\nfunction checkHttpAllowed(rawUrl: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `invalid URL: \"${rawUrl}\"`;\n }\n if (parsed.protocol !== 'https:') {\n return `only https:// is allowed, got \"${parsed.protocol}\"`;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === 'localhost' || PRIVATE_IP_RE.test(host)) {\n return `host \"${host}\" is a private/loopback address — blocked to prevent SSRF`;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Path-sandbox helpers\n// ---------------------------------------------------------------------------\nfunction isUnderRoot(absPath: string, root: string): boolean {\n const resolved = resolve(absPath);\n const rootResolved = resolve(root);\n return resolved === rootResolved || resolved.startsWith(rootResolved + sep);\n}\n\nfunction checkReadAllowed(path: string): string | null {\n if (!isAbsolute(path)) return `path must be absolute, got \"${path}\"`;\n for (const root of ALLOWED_READ_ROOTS) {\n if (isUnderRoot(path, root)) return null;\n }\n return `read denied — path \"${path}\" not under allowed roots: ${ALLOWED_READ_ROOTS.join(', ')}`;\n}\n\nfunction checkWriteAllowed(path: string): string | null {\n if (!isAbsolute(path)) return `path must be absolute, got \"${path}\"`;\n for (const root of ALLOWED_WRITE_ROOTS) {\n if (isUnderRoot(path, root)) return null;\n }\n return `write denied — path \"${path}\" not under allowed roots: ${ALLOWED_WRITE_ROOTS.join(', ')}`;\n}\n\nfunction checkBashAllowed(cmd: string): string | null {\n const trimmed = cmd.trim();\n if (trimmed.length === 0) return 'empty command';\n // Reject obvious shell-injection attempts. Whitelist below still applies.\n if (/[;&|`$<>]|>>|\\|\\||&&/.test(trimmed)) {\n return `command contains shell metachars (; & | \\` $ < > >> || &&) — not allowed for safety`;\n }\n for (const prefix of BASH_WHITELIST) {\n if (trimmed.startsWith(prefix.trim())) return null;\n }\n return `command not on whitelist. Allowed prefixes: ${BASH_WHITELIST.join(' / ')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Tool implementations\n// ---------------------------------------------------------------------------\n/** Optional capabilities the caller (runner) can inject into a tool run. */\nexport interface RunToolOptions {\n /**\n * Sign a hardware receipt's canonical body. Injected by index.ts from the seat\n * wallet (ethers EIP-191). Absent → the receipt is content-hashed but unsigned\n * and self-reports `signed:false`, so it can never overclaim.\n */\n signReceipt?: (canonical: string) => Promise<{ alg: string; signer: string; signature: string }>;\n /**\n * Post new tasks to the team board. Injected by runner.ts from mesh.addTasks().\n * Absent → delegate_task returns an error explaining the capability is unavailable.\n */\n addTask?: (tasks: Array<{ title: string; description?: string; priority?: number; source?: string; tags?: string[] }>) => Promise<{ added: number }>;\n}\n\nexport async function runTool(use: ToolUseBlock, opts: RunToolOptions = {}): Promise<ToolResultBlock> {\n try {\n if (use.name === 'read_file') {\n const path = use.input.path as string;\n const denied = checkReadAllowed(path);\n if (denied) return errResult(use.id, denied);\n const text = await readFile(path, 'utf8');\n // Cap at 200KB to avoid context blowups\n const truncated =\n text.length > 200_000\n ? text.slice(0, 200_000) + `\\n…[truncated, full file is ${text.length} bytes]`\n : text;\n return okResult(use.id, truncated);\n }\n\n if (use.name === 'list_dir') {\n const path = use.input.path as string;\n const denied = checkReadAllowed(path);\n if (denied) return errResult(use.id, denied);\n const entries = await readdir(path, { withFileTypes: true });\n const lines = entries.map((e) => `${e.isDirectory() ? 'd' : '-'} ${e.name}`);\n return okResult(use.id, lines.join('\\n'));\n }\n\n if (use.name === 'write_file') {\n const path = use.input.path as string;\n const content = use.input.content as string;\n const denied = checkWriteAllowed(path);\n if (denied) return errResult(use.id, denied);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, 'utf8');\n const s = await stat(path);\n return okResult(use.id, `wrote ${s.size} bytes to ${path}`);\n }\n\n if (use.name === 'bash') {\n const cmd = use.input.cmd as string;\n const cwd = (use.input.cwd as string | undefined) ?? '/root';\n const denied = checkBashAllowed(cmd);\n if (denied) return errResult(use.id, denied);\n const result = await runBash(cmd, cwd);\n return result.code === 0\n ? okResult(use.id, result.stdout)\n : errResult(use.id, `exit=${result.code}\\n${result.stderr || result.stdout}`);\n }\n\n if (use.name === 'http_request') {\n const rawUrl = String(use.input.url ?? '');\n const denied = checkHttpAllowed(rawUrl);\n if (denied) return errResult(use.id, denied);\n const userHeaders = (use.input.headers ?? {}) as Record<string, string>;\n const RESPONSE_CAP = 200_000;\n const TIMEOUT_MS = 30_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(rawUrl, {\n method: 'GET',\n headers: { 'user-agent': 'holoscript-agent/1.0', ...userHeaders },\n signal: controller.signal,\n });\n clearTimeout(timer);\n const buf = await res.arrayBuffer();\n const text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n const truncated =\n text.length > RESPONSE_CAP\n ? text.slice(0, RESPONSE_CAP) + `\\n…[truncated, full body is ${text.length} chars]`\n : text;\n if (!res.ok) return errResult(use.id, `HTTP ${res.status} ${res.statusText}\\n${truncated}`);\n return okResult(use.id, truncated);\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n return errResult(use.id, msg.includes('abort') ? `request timed out after ${TIMEOUT_MS}ms` : msg);\n }\n }\n\n if (use.name === 'emit_hardware_receipt') {\n const deviceKind = String(use.input.device_kind ?? 'unknown-device');\n const accelerator =\n use.input.accelerator === null || use.input.accelerator === 'null'\n ? null\n : String(use.input.accelerator ?? '').trim() || null;\n const runtimeName = String(use.input.runtime_name ?? 'Ollama');\n const runtimeVersion = String(use.input.runtime_version ?? 'unknown');\n const hostOs = String(use.input.host_os ?? 'unknown');\n const compositionId = String(use.input.composition_id ?? 'unknown');\n\n // Collect measurements — from pre-parsed array and/or raw tegrastats output.\n let measurements: Array<{ metric: string; value: number; unit: string; method: string }> = [];\n if (Array.isArray(use.input.measurements)) {\n for (const m of use.input.measurements as Array<Record<string, unknown>>) {\n const metric = String(m.metric ?? '');\n const value = Number(m.value ?? 0);\n const unit = String(m.unit ?? '');\n if (metric && Number.isFinite(value)) {\n measurements.push({ metric, value, unit, method: 'measured' });\n }\n }\n }\n if (typeof use.input.tegrastats_output === 'string' && use.input.tegrastats_output.length > 0) {\n measurements = [...measurements, ...parseTegrastats(use.input.tegrastats_output as string)];\n }\n // Minimum 1 measurement so the schema validator doesn't reject the receipt.\n if (measurements.length === 0) {\n measurements.push({ metric: 'agent-tick', value: 1, unit: 'count', method: 'presence' });\n }\n\n const capturedAt = new Date().toISOString();\n const receipt = {\n schemaVersion: 'holoscript.hardware-receipt-metadata.v1',\n target: {\n id: `${deviceKind}-${Date.now()}`,\n kind: deviceKind,\n architecture: /jetson|orin|nano|agx|xavier/i.test(deviceKind) ? 'arm64' : 'unknown',\n artifactKind: 'measurement-trace',\n },\n device: {\n vendor: /jetson|orin|nvidia/i.test(deviceKind) ? 'nvidia' : 'unknown',\n model: deviceKind,\n accelerator,\n },\n runtime: { name: runtimeName, version: runtimeVersion, hostOS: hostOs },\n compilerVersion: 'holoscript-agent-1.0.0',\n constraints: [],\n measuredResults: measurements,\n replayInputs: [\n { kind: 'composition-ref', uri: `compositions/${compositionId}`, sha256: 'unknown' },\n ],\n provenance: {\n capturedAt,\n sourceCompositionHash: compositionId,\n },\n owner: {\n agent: process.env.HOLOSCRIPT_AGENT_HANDLE ?? 'unknown',\n ...(process.env.HOLOMESH_TEAM_ID ? { team: process.env.HOLOMESH_TEAM_ID } : {}),\n },\n };\n\n // Integrity seal (F.123 — a tamper-evident, not plain-JSON, receipt):\n // a deterministic SHA-256 content hash over the canonical body (keyless\n // content-addressing) plus an OPTIONAL wallet signature when a signer is\n // injected (index.ts wires the seat wallet). `signed` self-reports honestly\n // so an unsigned receipt can never masquerade as signed.\n const canonical = JSON.stringify(receipt);\n const contentHash = createHash('sha256').update(canonical).digest('hex');\n let signature: { alg: string; signer: string; signature: string } | null = null;\n if (opts.signReceipt) {\n try {\n signature = await opts.signReceipt(canonical);\n } catch {\n signature = null; // best-effort: an unsigned receipt is honest, not fatal\n }\n }\n const sealed = {\n ...receipt,\n integrity: { alg: 'sha256', contentHash, signed: Boolean(signature), signature },\n };\n\n // Slug timestamp: \"2026-06-16T07-35-01-000Z\"\n const ts = capturedAt.replace(/[:.]/g, '-');\n const outPath = resolve(ALLOWED_WRITE_ROOTS[0], `hardware-receipt-${ts}.json`);\n const denied = checkWriteAllowed(outPath);\n if (denied) return errResult(use.id, `Cannot write receipt: ${denied}`);\n await mkdir(dirname(outPath), { recursive: true });\n await writeFile(outPath, JSON.stringify(sealed, null, 2), 'utf8');\n return okResult(\n use.id,\n `Hardware receipt written to ${outPath} — ${measurements.length} measurements, ` +\n `contentHash=${contentHash.slice(0, 12)}…, signed=${Boolean(signature)}, accelerator=${accelerator ?? 'none'}`\n );\n }\n\n if (use.name === 'str_replace') {\n const path = use.input.path as string;\n const oldStr = use.input.old as string;\n const newStr = use.input.new as string;\n const denied = checkWriteAllowed(path);\n if (denied) return errResult(use.id, denied);\n const text = await readFile(path, 'utf8');\n // Count occurrences to guarantee exactly-one semantics.\n const count = text.split(oldStr).length - 1;\n if (count === 0) return errResult(use.id, `str_replace: \"old\" string not found in ${path} — 0 occurrences`);\n if (count > 1) return errResult(use.id, `str_replace: \"old\" string is ambiguous in ${path} — ${count} occurrences; add more surrounding context`);\n const updated = text.replace(oldStr, newStr);\n await writeFile(path, updated, 'utf8');\n const s = await stat(path);\n return okResult(use.id, `str_replace: replaced 1 occurrence in ${path} (${s.size} bytes)`);\n }\n\n if (use.name === 'delegate_task') {\n if (!opts.addTask) {\n return errResult(use.id, 'delegate_task: capability not available (no addTask callback injected — board posting requires a mesh connection)');\n }\n const title = String(use.input.title ?? '').trim();\n if (!title) return errResult(use.id, 'delegate_task: title is required');\n const description = use.input.description != null ? String(use.input.description) : undefined;\n const priority = use.input.priority != null ? Number(use.input.priority) : undefined;\n const source = use.input.source != null ? String(use.input.source) : undefined;\n const tags = Array.isArray(use.input.tags) ? (use.input.tags as unknown[]).map(String) : undefined;\n const result = await opts.addTask([{ title, description, priority, source, tags }]);\n return okResult(use.id, `delegate_task: posted \"${title}\" to board — ${result.added} task(s) added`);\n }\n\n if (use.name === 'vision_analyze') {\n const imagePath = String(use.input.image_path ?? '').trim();\n if (!imagePath) return errResult(use.id, 'vision_analyze: image_path is required');\n const denied = checkReadAllowed(imagePath);\n if (denied) return errResult(use.id, `vision_analyze: ${denied}`);\n const prompt = String(use.input.prompt ?? 'Describe this image in detail.');\n const model = String(use.input.model ?? 'fara:7b');\n // Dedicated local-inference tool — /founder ruled 2026-06-18: NOT a bandaid.\n // SSRF guard in http_request is correct and stays; this tool is a different\n // trust boundary (fixed local model endpoint, path-sandboxed input, env-driven\n // URL — no user-controlled URL). D.098 + vision pillar #6.\n const ollamaBase = process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL;\n if (!ollamaBase) {\n return errResult(\n use.id,\n 'vision_analyze: HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL is not set — configure it to point to your local Ollama instance (e.g. http://holojetson.local:11434)'\n );\n }\n const TIMEOUT_MS = 120_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const imageBytes = await readFile(imagePath);\n const imageB64 = imageBytes.toString('base64');\n const res = await fetch(`${ollamaBase}/api/generate`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ model, prompt, images: [imageB64], stream: false }),\n signal: controller.signal,\n });\n clearTimeout(timer);\n if (!res.ok) {\n const text = await res.text();\n return errResult(use.id, `vision_analyze: Ollama HTTP ${res.status}: ${text.slice(0, 500)}`);\n }\n const json = (await res.json()) as { response?: string; error?: string };\n if (json.error) return errResult(use.id, `vision_analyze: model error — ${json.error}`);\n return okResult(use.id, json.response ?? '');\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n return errResult(\n use.id,\n msg.includes('abort') ? `vision_analyze: timed out after ${TIMEOUT_MS}ms` : `vision_analyze: ${msg}`\n );\n }\n }\n\n return errResult(use.id, `unknown tool: ${use.name}`);\n } catch (err) {\n return errResult(use.id, err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Parse a single tegrastats output line into structured measurements.\n * Handles the Jetson Orin / Nano / AGX format emitted by `tegrastats --interval 1000`.\n *\n * Example line:\n * 06-16-2026 07:35:01 RAM 2819/7618MB (lfb 73x4MB) SWAP 0/3809MB CPU [37%@1510,off,off]\n * EMC_FREQ 0% GR3D_FREQ 42% cpu@40.2C tj@41.25C VDD_CPU_CV 570mW VDD_SOC 1380mW\n */\nfunction parseTegrastats(raw: string): Array<{ metric: string; value: number; unit: string; method: string }> {\n const results: Array<{ metric: string; value: number; unit: string; method: string }> = [];\n const m = (pattern: RegExp, metric: string, unit: string, transform?: (v: string) => number) => {\n const match = raw.match(pattern);\n if (match?.[1]) {\n const value = transform ? transform(match[1]) : Number(match[1]);\n if (Number.isFinite(value)) results.push({ metric, value, unit, method: 'tegrastats' });\n }\n };\n\n // RAM: \"RAM 2819/7618MB\"\n const ram = raw.match(/RAM\\s+(\\d+)\\/(\\d+)MB/);\n if (ram) {\n const used = Number(ram[1]);\n const total = Number(ram[2]);\n results.push({ metric: 'ram-used', value: used, unit: 'MB', method: 'tegrastats' });\n results.push({ metric: 'ram-total', value: total, unit: 'MB', method: 'tegrastats' });\n if (total > 0)\n results.push({ metric: 'ram-pct', value: Math.round((used / total) * 100), unit: '%', method: 'tegrastats' });\n }\n\n m(/GR3D_FREQ\\s+(\\d+)%/, 'gpu-util', '%');\n m(/EMC_FREQ\\s+(\\d+)%/, 'emc-freq-pct', '%');\n m(/tj@([\\d.]+)C/, 'temp-tj', 'C', parseFloat);\n m(/cpu@([\\d.]+)C/, 'temp-cpu', 'C', parseFloat);\n m(/gpu@([\\d.]+)C/, 'temp-gpu', 'C', parseFloat);\n m(/VDD_SOC\\s+(\\d+)mW/, 'power-soc', 'mW');\n m(/VDD_CPU_CV\\s+(\\d+)mW/, 'power-cpu-cv', 'mW');\n m(/VDD_IN\\s+(\\d+)mW/, 'power-total', 'mW');\n\n // CPU first-core utilisation: \"CPU [37%@1510,...\"\n m(/CPU\\s+\\[(\\d+)%/, 'cpu-util-core0', '%');\n\n return results;\n}\n\ninterface BashResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nfunction runBash(cmd: string, cwd: string): Promise<BashResult> {\n // Test short-circuit (task_1778113854009_x6p3): under vitest, return a\n // fast synthetic exit instead of spawning bash. Without this, mocks that\n // emit a \"vitest run\" tool_use cause runner.test.ts to recursively spawn\n // vitest startup per tick (~1.7s each), pushing 3-tick tests over the\n // 5000ms timeout. Production paths (NODE_ENV != 'test', VITEST unset)\n // are unchanged and still spawn the real shell.\n if (process.env.VITEST === 'true' || process.env.NODE_ENV === 'test') {\n return Promise.resolve({\n code: 0,\n stdout: `[mock-bash under vitest] cmd=\"${cmd}\" cwd=\"${cwd}\"`,\n stderr: '',\n });\n }\n return new Promise((resolveProm) => {\n const child = spawn('bash', ['-c', cmd], { cwd, env: process.env });\n let stdout = '';\n let stderr = '';\n let killed = false;\n const STDOUT_CAP = 1_000_000;\n const TIMEOUT_MS = 60_000;\n const killer = setTimeout(() => {\n killed = true;\n child.kill('SIGKILL');\n }, TIMEOUT_MS);\n child.stdout.on('data', (d: Buffer) => {\n if (stdout.length < STDOUT_CAP) stdout += d.toString('utf8');\n });\n child.stderr.on('data', (d: Buffer) => {\n if (stderr.length < STDOUT_CAP) stderr += d.toString('utf8');\n });\n child.on('error', (err) => {\n clearTimeout(killer);\n resolveProm({ code: 1, stdout, stderr: stderr + '\\nspawn-error: ' + err.message });\n });\n child.on('exit', (code) => {\n clearTimeout(killer);\n const finalStdout =\n stdout.length >= STDOUT_CAP\n ? stdout + `\\n…[stdout truncated at ${STDOUT_CAP} bytes]`\n : stdout;\n const note = killed ? `\\n[bash killed after ${TIMEOUT_MS}ms timeout]` : '';\n resolveProm({ code: code ?? 1, stdout: finalStdout + note, stderr });\n });\n });\n}\n\nfunction okResult(id: string, content: string): ToolResultBlock {\n return { type: 'tool_result', tool_use_id: id, content };\n}\n\nfunction errResult(id: string, message: string): ToolResultBlock {\n return { type: 'tool_result', tool_use_id: id, content: message, is_error: true };\n}\n","/**\n * On-task cognitive verbs — the edge executor (Phase 2.2).\n *\n * A brain's `behavior on_task { … }` block parses into an ordered sequence of\n * cognitive verbs (brain.ts extractOnTaskActions). The lightweight AgentRunner\n * executes them WITHOUT a @holoscript/core / engine dependency — provider + mesh\n * only — so the edge package keeps its clean publish dep-closure:\n *\n * - `llm_call { prompt }` → append the prompt as a domain directive (was the\n * only wired verb before this; W.736).\n * - `rag_query { query }` → retrieve from TEAM knowledge → inject as context.\n * - `recall { query }` → retrieve from the agent's PRIVATE workspace →\n * filter by query client-side → inject.\n * - `plan { goal|prompt }` → one provider call producing a short plan → inject.\n *\n * Each verb is best-effort: a retrieval/plan failure is logged and skipped, never\n * breaking the tick. The verbs run in authored order and their outputs accumulate\n * onto the system prompt the tool-loop sees. `reflect` is handled separately\n * (post-artifact gate in runner.ts), not here.\n *\n * @module holoscript-agent/cognitive-verbs\n */\nimport type { KnowledgeEntry } from './holomesh-client.js';\nimport type { OnTaskAction } from './types.js';\n\nexport interface CognitiveVerbDeps {\n /** The brain's base system prompt to augment. */\n systemPrompt: string;\n /** Parsed `behavior on_task` verbs, in authored order. */\n onTaskActions: OnTaskAction[];\n /** Task being executed (for `plan` goal fallback + logging). */\n task: { id: string; title: string };\n /** TEAM knowledge retrieval (rag_query, keyword/semantic). */\n queryTeamKnowledge: (query: string, limit: number) => Promise<KnowledgeEntry[]>;\n /**\n * Codebase GraphRAG semantic search (rag_query Phase 2.3, W.753).\n * Optional — when absent OR it returns [] (graph not loaded), rag_query falls\n * back to team-knowledge search. Wires the in-process HoloEmbed index via the\n * bearer-gated mesh route POST /api/holomesh/codebase/search.\n */\n queryCodebase?: (query: string, topK: number) => Promise<Array<{ name: string; file: string; line?: number; type: string; score: number; signature?: string | null }>>;\n /** PRIVATE workspace retrieval (recall). */\n queryPrivateKnowledge: () => Promise<KnowledgeEntry[]>;\n /** One-shot provider planner (plan). Optional — when absent, `plan` is skipped. */\n plan?: (prompt: string) => Promise<string>;\n /**\n * Embed text for SEMANTIC `recall` (the fleet nomic model). Optional — when absent\n * OR it returns null (no fleet/registry reachable), `recall` falls back to the\n * substring filter. Pairs with `similarity`. (W.753: recall should rank via the\n * semantic stack, not keyword-match the private workspace.)\n */\n embed?: (text: string) => Promise<number[] | null>;\n /** Cosine similarity for ranking recalled entries (required alongside `embed`). */\n similarity?: (a: number[], b: number[]) => number;\n /** Structured logger. */\n log: (ev: Record<string, unknown>) => void;\n}\n\nconst DEFAULT_LIMIT = 5;\n/** Cap injected context so the edge model's num_ctx isn't blown (qwen3:4b). */\nconst MAX_ENTRY_CHARS = 320;\nconst MAX_INJECTED_CHARS = 2400;\n/** Cap entries embedded per recall so a large private store can't stall a tick. */\nconst MAX_RECALL_EMBED = 40;\n\nfunction strField(config: Record<string, unknown>, ...keys: string[]): string {\n for (const k of keys) {\n const v = config[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n }\n return '';\n}\n\nfunction numField(config: Record<string, unknown>, key: string, fallback: number): number {\n const v = config[key];\n return typeof v === 'number' && Number.isFinite(v) ? v : fallback;\n}\n\nfunction formatEntries(entries: KnowledgeEntry[]): string {\n let out = '';\n for (const e of entries) {\n const line = `- ${(e.content ?? '').replace(/\\s+/g, ' ').trim().slice(0, MAX_ENTRY_CHARS)}`;\n if (out.length + line.length > MAX_INJECTED_CHARS) break;\n out += (out ? '\\n' : '') + line;\n }\n return out;\n}\n\n/**\n * Execute a brain's on_task cognitive verbs and return the augmented system\n * prompt the tool-loop should use. Pure-ish: all I/O is injected via deps.\n */\nexport async function augmentWithOnTaskCognition(deps: CognitiveVerbDeps): Promise<string> {\n let content = deps.systemPrompt;\n if (!deps.onTaskActions || deps.onTaskActions.length === 0) return content;\n\n for (const action of deps.onTaskActions) {\n try {\n switch (action.verb) {\n case 'llm_call': {\n const prompt = strField(action.config, 'prompt');\n if (prompt) {\n content += `\\n\\n[Brain on_task directive]\\n${prompt}`;\n deps.log({ ev: 'on-task-llm-call', taskId: deps.task.id, promptLen: prompt.length });\n }\n break;\n }\n case 'rag_query': {\n const query = strField(action.config, 'query', 'q') || deps.task.title;\n const limit = numField(action.config, 'limit', DEFAULT_LIMIT);\n // Phase 2.3 (W.753): try codebase GraphRAG (in-process HoloEmbed via the mesh bearer\n // route) first — returns ranked symbols (name/file/score). Falls back to team-knowledge\n // search when the graph isn't loaded or the dep isn't wired.\n let mode = 'team-knowledge';\n let injected = '';\n if (deps.queryCodebase) {\n const symbols = await deps.queryCodebase(query, limit);\n if (symbols.length > 0) {\n mode = 'codebase-graphrag';\n const lines = symbols\n .slice(0, limit)\n .map(\n (s) =>\n `- ${s.name} (${s.type}) ${s.file}${s.line != null ? `:${s.line}` : ''}` +\n (s.signature ? ` — ${s.signature.slice(0, 80)}` : '') +\n ` [score:${s.score.toFixed(2)}]`\n )\n .join('\\n');\n injected = `\\n\\n[Codebase search for \"${query}\"]\\n${lines}`;\n }\n }\n if (!injected) {\n // Fallback: team knowledge store (already semantic via HoloEmbed ranking, bb28ecc25).\n const entries = await deps.queryTeamKnowledge(query, limit);\n if (entries.length > 0) {\n injected = `\\n\\n[Retrieved knowledge for \"${query}\"]\\n${formatEntries(entries)}`;\n }\n }\n if (injected) content += injected;\n deps.log({ ev: 'on-task-rag-query', taskId: deps.task.id, query, mode, retrieved: injected ? limit : 0 });\n break;\n }\n case 'recall': {\n const query = strField(action.config, 'query', 'q');\n const limit = numField(action.config, 'limit', DEFAULT_LIMIT);\n const all = await deps.queryPrivateKnowledge();\n let matched: KnowledgeEntry[] | null = null;\n let mode = 'substring';\n // SEMANTIC recall (W.753): rank the private workspace by embedding-cosine\n // when an embed route resolves. Best-effort — any miss (no embed dep, fleet\n // unreachable, null vectors) drops to the substring filter below; never breaks the tick.\n if (deps.embed && deps.similarity && query && all.length > 0) {\n const qv = await deps.embed(query);\n if (qv) {\n const scored: Array<{ e: KnowledgeEntry; score: number }> = [];\n for (const e of all.slice(0, MAX_RECALL_EMBED)) {\n const ev = await deps.embed(e.content ?? '');\n if (ev) scored.push({ e, score: deps.similarity(qv, ev) });\n }\n if (scored.length > 0) {\n scored.sort((a, b) => b.score - a.score);\n matched = scored.slice(0, limit).map((s) => s.e);\n mode = 'semantic';\n }\n }\n }\n if (!matched) {\n const needle = query.toLowerCase();\n matched = (\n needle\n ? all.filter((e) => `${e.id ?? ''} ${e.content ?? ''}`.toLowerCase().includes(needle))\n : all\n ).slice(0, limit);\n }\n if (matched.length > 0) {\n content += `\\n\\n[Recalled memory${query ? ` for \"${query}\"` : ''}]\\n${formatEntries(matched)}`;\n }\n deps.log({ ev: 'on-task-recall', taskId: deps.task.id, query, recalled: matched.length, mode });\n break;\n }\n case 'plan': {\n if (!deps.plan) break;\n const goal = strField(action.config, 'goal', 'prompt', 'of') || deps.task.title;\n const planText = await deps.plan(\n `Produce a short numbered plan (max 6 steps) to accomplish this task. Be concrete and specific to the goal; do not execute it.\\n\\nGoal: ${goal}`\n );\n const trimmed = planText.trim().slice(0, MAX_INJECTED_CHARS);\n if (trimmed) {\n content += `\\n\\n[Plan]\\n${trimmed}`;\n deps.log({ ev: 'on-task-plan', taskId: deps.task.id, planLen: trimmed.length });\n }\n break;\n }\n // `reflect` is handled post-artifact in runner.ts, not here.\n default:\n break;\n }\n } catch (err) {\n deps.log({\n ev: 'on-task-verb-error',\n taskId: deps.task.id,\n verb: action.verb,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n return content;\n}\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport type { AgentIdentity, BoardTask, ExecutionResult } from './types.js';\n\nexport interface CommitHookOptions {\n outputDir: string;\n workingDir?: string;\n authorName?: string;\n authorEmail?: string;\n scope?: string;\n spawn?: typeof spawnSync;\n now?: () => Date;\n}\n\nexport interface CommitHookResult {\n filePath: string;\n commitHash?: string;\n staged: string[];\n message: string;\n}\n\nconst SAFE_HANDLE = /^[a-z0-9_-]{1,64}$/i;\n\nexport function makeCommitHook(opts: CommitHookOptions) {\n if (!opts.outputDir || opts.outputDir.trim().length === 0) {\n throw new Error('CommitHookOptions.outputDir is required');\n }\n const spawn = opts.spawn ?? spawnSync;\n const cwd = opts.workingDir ?? process.cwd();\n const outputDir = resolve(cwd, opts.outputDir);\n const now = opts.now ?? (() => new Date());\n const scope = opts.scope ?? 'agent';\n\n return async (\n result: ExecutionResult,\n task: BoardTask,\n identity: AgentIdentity\n ): Promise<CommitHookResult> => {\n if (!SAFE_HANDLE.test(identity.handle)) {\n throw new Error(`Refusing to commit: handle \"${identity.handle}\" must match ${SAFE_HANDLE}`);\n }\n const date = now().toISOString().slice(0, 10);\n const safeTaskId = task.id.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 80);\n const fileName = `${date}_${safeTaskId}_${identity.handle}.md`;\n const filePath = join(outputDir, fileName);\n\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, renderMemo(result, task, identity, date), 'utf8');\n\n const relPath = relativeTo(cwd, filePath);\n const addRes = spawn('git', ['add', relPath], { cwd, encoding: 'utf8' });\n if (addRes.status !== 0) {\n throw new Error(\n `git add failed: ${addRes.stderr || addRes.stdout || `exit ${addRes.status}`}`\n );\n }\n\n const message = renderCommitMessage({ scope, task, identity, result });\n const commitArgs = ['commit', '-m', message];\n if (opts.authorName && opts.authorEmail) {\n commitArgs.push('--author', `${opts.authorName} <${opts.authorEmail}>`);\n }\n const commitRes = spawn('git', commitArgs, { cwd, encoding: 'utf8' });\n if (commitRes.status !== 0) {\n throw new Error(\n `git commit failed: ${commitRes.stderr || commitRes.stdout || `exit ${commitRes.status}`}`\n );\n }\n\n const hashRes = spawn('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' });\n const commitHash = hashRes.status === 0 ? hashRes.stdout.trim() : undefined;\n\n return { filePath, commitHash, staged: [relPath], message };\n };\n}\n\nfunction renderMemo(\n result: ExecutionResult,\n task: BoardTask,\n identity: AgentIdentity,\n date: string\n): string {\n return [\n '---',\n `title: \"${task.title.replace(/\"/g, \"'\")}\"`,\n `task_id: ${task.id}`,\n `agent: ${identity.handle}`,\n `surface: ${identity.surface}`,\n `provider: ${identity.llmProvider}`,\n `model: ${identity.llmModel}`,\n `wallet: ${identity.wallet}`,\n `date: ${date}`,\n `tokens: ${result.usage.totalTokens}`,\n `cost_usd: ${result.costUsd.toFixed(4)}`,\n `duration_ms: ${result.durationMs}`,\n `tags: [${(task.tags ?? []).map((t) => JSON.stringify(t)).join(', ')}]`,\n '---',\n '',\n `# ${task.title}`,\n '',\n '## Task description',\n '',\n task.description ?? '(no description)',\n '',\n '## Agent response',\n '',\n result.responseText.trim(),\n '',\n ].join('\\n');\n}\n\nconst SUBJECT_MAX = 72;\n\nfunction renderCommitMessage(opts: {\n scope: string;\n task: BoardTask;\n identity: AgentIdentity;\n result: ExecutionResult;\n}): string {\n const suffix = ` [agent:${opts.identity.handle}]`;\n const prefix = `${opts.scope}: `;\n const titleBudget = Math.max(8, SUBJECT_MAX - prefix.length - suffix.length);\n const subject = `${prefix}${truncate(opts.task.title, titleBudget)}${suffix}`;\n const body = [\n '',\n `task: ${opts.task.id}`,\n `agent: ${opts.identity.handle} (${opts.identity.llmProvider}/${opts.identity.llmModel})`,\n `wallet: ${opts.identity.wallet}`,\n `cost: $${opts.result.costUsd.toFixed(4)} / ${opts.result.usage.totalTokens} tok / ${opts.result.durationMs}ms`,\n ].join('\\n');\n return `${subject}\\n${body}\\n`;\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction relativeTo(base: string, target: string): string {\n const b = base.replace(/\\\\/g, '/');\n const t = target.replace(/\\\\/g, '/');\n if (t.startsWith(b + '/')) return t.slice(b.length + 1);\n if (t === b) return '.';\n return t;\n}\n","import { createHash } from 'node:crypto';\nimport type {\n ILLMProvider,\n LLMCompletionRequest,\n LLMProviderName,\n TokenUsage,\n} from '@holoscript/llm-provider';\nimport type { CostGuard } from './cost-guard.js';\nimport type { AuditLog } from './audit-log.js';\nimport type { AgentIdentity } from './types.js';\n\nexport interface AblationProviderSpec {\n label: string;\n provider: LLMProviderName;\n model: string;\n build: () => Promise<ILLMProvider> | ILLMProvider;\n pricer?: (usage: TokenUsage) => number;\n}\n\nexport interface AblationTaskSpec {\n taskId: string;\n taskTitle: string;\n systemPrompt: string;\n userPrompt: string;\n brainPath?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface AblationCell {\n label: string;\n provider: LLMProviderName;\n model: string;\n responseText: string;\n usage: TokenUsage;\n costUsd: number;\n durationMs: number;\n finishReason: string;\n errorMessage?: string;\n}\n\nexport interface AblationMatrix {\n taskId: string;\n taskTitle: string;\n brainPath?: string;\n promptHash: string;\n cells: AblationCell[];\n totalCostUsd: number;\n startedAt: string;\n completedAt: string;\n budgetExhausted: boolean;\n}\n\nexport interface RunAblationOptions {\n task: AblationTaskSpec;\n providers: AblationProviderSpec[];\n costGuard?: CostGuard;\n timeoutPerCellMs?: number;\n auditLog?: AuditLog;\n matrixId?: string;\n identityFor?: (spec: AblationProviderSpec) => AgentIdentity;\n}\n\nexport async function runAblation(opts: RunAblationOptions): Promise<AblationMatrix> {\n const { task, providers, costGuard } = opts;\n const startedAt = new Date().toISOString();\n const promptHash = hashPrompt(task.systemPrompt, task.userPrompt);\n\n const request: LLMCompletionRequest = {\n messages: [\n { role: 'system', content: task.systemPrompt },\n { role: 'user', content: task.userPrompt },\n ],\n maxTokens: task.maxTokens ?? 2048,\n temperature: task.temperature ?? 0.4,\n };\n\n const cells: AblationCell[] = [];\n let budgetExhausted = false;\n const matrixId = opts.matrixId ?? `mx_${promptHash}_${Date.now()}`;\n\n for (const spec of providers) {\n if (costGuard?.isOverBudget()) {\n budgetExhausted = true;\n cells.push({\n label: spec.label,\n provider: spec.provider,\n model: spec.model,\n responseText: '',\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n costUsd: 0,\n durationMs: 0,\n finishReason: 'error',\n errorMessage: 'budget-exhausted-before-cell',\n });\n continue;\n }\n\n const t0 = Date.now();\n try {\n const provider = await spec.build();\n const cellPromise = provider.complete(request, spec.model);\n const response = opts.timeoutPerCellMs\n ? await withTimeout(cellPromise, opts.timeoutPerCellMs, spec.label)\n : await cellPromise;\n const durationMs = Date.now() - t0;\n\n const costUsd = spec.pricer\n ? spec.pricer(response.usage)\n : (costGuard?.recordUsage(spec.model, response.usage).costUsd ?? 0);\n if (spec.pricer && costGuard) {\n costGuard.recordUsage(spec.model, response.usage);\n }\n\n cells.push({\n label: spec.label,\n provider: spec.provider,\n model: spec.model,\n responseText: response.content,\n usage: response.usage,\n costUsd,\n durationMs,\n finishReason: response.finishReason,\n });\n recordAblationCellIfWired(opts, spec, {\n matrixId,\n promptHash,\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n costUsd,\n durationMs,\n finishReason: response.finishReason,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n cells.push({\n label: spec.label,\n provider: spec.provider,\n model: spec.model,\n responseText: '',\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n costUsd: 0,\n durationMs: Date.now() - t0,\n finishReason: 'error',\n errorMessage,\n });\n recordAblationCellIfWired(opts, spec, {\n matrixId,\n promptHash,\n promptTokens: 0,\n completionTokens: 0,\n costUsd: 0,\n durationMs: Date.now() - t0,\n finishReason: 'error',\n errorMessage,\n });\n }\n }\n\n return {\n taskId: task.taskId,\n taskTitle: task.taskTitle,\n brainPath: task.brainPath,\n promptHash,\n cells,\n totalCostUsd: cells.reduce((sum, c) => sum + c.costUsd, 0),\n startedAt,\n completedAt: new Date().toISOString(),\n budgetExhausted,\n };\n}\n\nexport function renderAblationMarkdown(matrix: AblationMatrix): string {\n const header = [\n `# Ablation: ${matrix.taskTitle}`,\n '',\n `- task_id: \\`${matrix.taskId}\\``,\n `- prompt_hash: \\`${matrix.promptHash}\\``,\n matrix.brainPath ? `- brain: \\`${matrix.brainPath}\\`` : '- brain: _(none)_',\n `- started: ${matrix.startedAt}`,\n `- completed: ${matrix.completedAt}`,\n `- total_cost_usd: $${matrix.totalCostUsd.toFixed(4)}`,\n matrix.budgetExhausted ? `- **budget_exhausted: true** (some cells skipped)` : '',\n '',\n '| Label | Provider | Model | Tokens (in/out) | Cost (USD) | Duration (ms) | Finish | Excerpt |',\n '|---|---|---|---|---|---|---|---|',\n ].filter((line) => line !== '');\n\n const rows = matrix.cells.map((c) => {\n const tokens = `${c.usage.promptTokens}/${c.usage.completionTokens}`;\n const excerpt = c.errorMessage\n ? `_error: ${truncate(c.errorMessage, 80)}_`\n : truncate(escapeMd(c.responseText.replace(/\\n/g, ' ')), 80);\n return `| ${c.label} | ${c.provider} | ${c.model} | ${tokens} | $${c.costUsd.toFixed(4)} | ${c.durationMs} | ${c.finishReason} | ${excerpt} |`;\n });\n\n return [...header, ...rows, ''].join('\\n');\n}\n\nfunction recordAblationCellIfWired(\n opts: RunAblationOptions,\n spec: AblationProviderSpec,\n cell: {\n matrixId: string;\n promptHash: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n durationMs: number;\n finishReason: string;\n errorMessage?: string;\n }\n): void {\n if (!opts.auditLog) return;\n const identity = opts.identityFor?.(spec) ?? {\n handle: `ablation:${spec.label}`,\n surface: `ablation:${spec.label}`,\n wallet: '0x0000000000000000000000000000000000000000',\n x402Bearer: '',\n llmProvider: spec.provider,\n llmModel: spec.model,\n brainPath: opts.task.brainPath ?? '(none)',\n budgetUsdPerDay: 0,\n teamId: '(ablation)',\n meshApiBase: '(ablation)',\n };\n try {\n opts.auditLog.recordAblationCell({\n identity,\n matrixId: cell.matrixId,\n label: spec.label,\n taskId: opts.task.taskId,\n taskTitle: opts.task.taskTitle,\n promptHash: cell.promptHash,\n promptTokens: cell.promptTokens,\n completionTokens: cell.completionTokens,\n costUsd: cell.costUsd,\n durationMs: cell.durationMs,\n finishReason: cell.finishReason,\n errorMessage: cell.errorMessage,\n });\n } catch {\n // Audit log write must never break the ablation matrix output.\n }\n}\n\nfunction hashPrompt(system: string, user: string): string {\n return createHash('sha256').update(`SYS:${system}\\nUSR:${user}`).digest('hex').slice(0, 16);\n}\n\nfunction withTimeout<T>(p: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`ablation cell \"${label}\" timed out after ${ms}ms`)),\n ms\n );\n p.then(\n (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n (e) => {\n clearTimeout(timer);\n reject(e);\n }\n );\n });\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction escapeMd(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { ILLMProvider } from '@holoscript/llm-provider';\nimport { AgentRunner } from './runner.js';\nimport { CostGuard } from './cost-guard.js';\nimport { HolomeshClient } from './holomesh-client.js';\nimport { loadBrain } from './brain.js';\nimport { makeCommitHook } from './commit-hook.js';\nimport { AuditLog } from './audit-log.js';\nimport { pickProvider, BUILT_IN_CANDIDATES } from './capability-router.js';\nimport type { AgentSpec, SupervisorConfig } from './supervisor-config.js';\nimport type { AgentIdentity, BoardTask, ExecutionResult, RuntimeBrainConfig } from './types.js';\n\nexport interface ProviderFactory {\n (spec: AgentSpec, identity: AgentIdentity): Promise<ILLMProvider> | ILLMProvider;\n}\n\nexport interface SupervisorAgentStatus {\n handle: string;\n state: 'starting' | 'running' | 'crashed' | 'over-budget' | 'stopped';\n spentUsd: number;\n remainingUsd: number;\n lastTickAt?: string;\n lastError?: string;\n restarts: number;\n}\n\nexport interface SupervisorStatus {\n globalSpentUsd: number;\n globalRemainingUsd: number;\n globalBudgetExhausted: boolean;\n agents: SupervisorAgentStatus[];\n}\n\nexport interface SupervisorOptions {\n config: SupervisorConfig;\n providerFactory: ProviderFactory;\n meshApiBase?: string;\n teamId: string;\n stateDir?: string;\n auditLogPath?: string;\n logger?: (event: Record<string, unknown>) => void;\n fetchImpl?: typeof fetch;\n now?: () => Date;\n}\n\nexport class Supervisor {\n private readonly opts: SupervisorOptions;\n private readonly agents = new Map<string, ManagedAgent>();\n private stopped = false;\n private globalBudgetUsdPerDay?: number;\n private readonly auditLog?: AuditLog;\n\n constructor(opts: SupervisorOptions) {\n this.opts = opts;\n this.globalBudgetUsdPerDay = opts.config.globalBudgetUsdPerDay;\n this.auditLog = opts.auditLogPath ? new AuditLog({ logPath: opts.auditLogPath }) : undefined;\n }\n\n async start(): Promise<void> {\n const enabledAgents = this.opts.config.agents.filter((a) => a.enabled !== false);\n for (const spec of enabledAgents) {\n const managed = await this.bootAgent(spec);\n this.agents.set(spec.handle, managed);\n }\n this.log({ ev: 'supervisor-started', count: enabledAgents.length });\n for (const managed of this.agents.values()) {\n this.spawnLoop(managed);\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const managed of this.agents.values()) {\n managed.runner.stop();\n managed.status.state = 'stopped';\n }\n this.log({ ev: 'supervisor-stopped', count: this.agents.size });\n }\n\n status(): SupervisorStatus {\n const agents = [...this.agents.values()].map((m) => ({ ...m.status }));\n const globalSpentUsd = agents.reduce((s, a) => s + a.spentUsd, 0);\n const globalBudgetExhausted =\n this.globalBudgetUsdPerDay != null ? globalSpentUsd >= this.globalBudgetUsdPerDay : false;\n const globalRemainingUsd =\n this.globalBudgetUsdPerDay != null\n ? Math.max(0, this.globalBudgetUsdPerDay - globalSpentUsd)\n : Infinity;\n return { globalSpentUsd, globalRemainingUsd, globalBudgetExhausted, agents };\n }\n\n async tickOnce(handle: string): Promise<SupervisorAgentStatus> {\n const managed = this.agents.get(handle);\n if (!managed) throw new Error(`No agent: ${handle}`);\n await this.runOneTick(managed);\n return { ...managed.status };\n }\n\n private async bootAgent(spec: AgentSpec): Promise<ManagedAgent> {\n const brain = await loadBrain(spec.brainPath, spec.scopeTier ?? 'warm');\n\n // Capability-aware routing (Lane 3 Phase 4 — founder ruling 2026-05-06):\n // brain.requires/prefers/avoids drives provider selection at session start;\n // spec.provider becomes OVERRIDE, not source-of-truth. When brain has empty\n // requires (today's default), the routing is open and spec.provider wins\n // (backward-compatible — no behavior change for unmigrated brains).\n const decision = pickProvider({\n brain,\n envOverride: spec.provider,\n candidates: BUILT_IN_CANDIDATES,\n });\n const effectiveSpec: AgentSpec =\n decision.picked === spec.provider ? spec : { ...spec, provider: decision.picked };\n const identity = this.identityFromSpec(effectiveSpec);\n if (decision.reason === 'env-override-mismatch' && this.opts.logger) {\n this.opts.logger({\n ts: new Date().toISOString(),\n ev: 'capability-router-mismatch',\n handle: spec.handle,\n envOverride: spec.provider,\n unsatisfiedRequires: decision.unsatisfiedRequires,\n excludedByAvoids: decision.excludedByAvoids,\n });\n }\n\n const provider = await this.opts.providerFactory(effectiveSpec, identity);\n const stateDir = this.opts.stateDir ?? join(homedir(), '.holoscript-agent', 'cost-state');\n const isFree =\n effectiveSpec.provider === 'mock' ||\n effectiveSpec.provider === 'local-llm' ||\n effectiveSpec.provider === 'bitnet';\n const costGuard = new CostGuard({\n statePath: join(stateDir, `${effectiveSpec.handle}.json`),\n dailyBudgetUsd: identity.budgetUsdPerDay,\n pricer: isFree ? () => 0 : undefined,\n });\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer: identity.x402Bearer,\n teamId: identity.teamId,\n fetchImpl: this.opts.fetchImpl,\n });\n const onTaskExecuted = effectiveSpec.enableCommitHook\n ? this.buildCommitHook(effectiveSpec, identity, mesh)\n : undefined;\n const runner = new AgentRunner({\n identity,\n brain,\n provider,\n costGuard,\n mesh,\n onTaskExecuted,\n auditLog: this.auditLog,\n logger: (ev) => this.log({ agent: effectiveSpec.handle, ...ev }),\n });\n const status: SupervisorAgentStatus = {\n handle: effectiveSpec.handle,\n state: 'starting',\n spentUsd: 0,\n remainingUsd: identity.budgetUsdPerDay,\n restarts: 0,\n };\n return { spec: effectiveSpec, identity, brain, runner, costGuard, status };\n }\n\n private buildCommitHook(\n spec: AgentSpec,\n identity: AgentIdentity,\n mesh: HolomeshClient\n ): (result: ExecutionResult, task: BoardTask) => Promise<void> {\n const writer = makeCommitHook({\n outputDir: spec.outputDir ?? 'agent-out',\n workingDir: spec.workingDir,\n scope: `agent(${spec.handle})`,\n });\n return async (result, task) => {\n const out = await writer(result, task, identity);\n if (out.commitHash) {\n await mesh.markDone(task.id, `auto: ${task.title}`, out.commitHash);\n }\n };\n }\n\n private identityFromSpec(spec: AgentSpec): AgentIdentity {\n const bearer = process.env[spec.bearerEnvKey];\n if (!bearer || bearer.trim().length === 0) {\n throw new Error(`Missing bearer env var \"${spec.bearerEnvKey}\" for agent \"${spec.handle}\"`);\n }\n const wallet = process.env[spec.walletEnvKey];\n if (!wallet || !/^0x[0-9a-fA-F]{40}$/.test(wallet)) {\n throw new Error(\n `Missing or malformed wallet env var \"${spec.walletEnvKey}\" for agent \"${spec.handle}\"`\n );\n }\n return {\n handle: spec.handle,\n surface: spec.handle,\n wallet,\n x402Bearer: bearer,\n llmProvider: spec.provider,\n llmModel: spec.model,\n brainPath: spec.brainPath,\n budgetUsdPerDay: spec.budgetUsdPerDay ?? 5,\n teamId: this.opts.teamId,\n meshApiBase: this.opts.meshApiBase ?? 'https://mcp.holoscript.net/api/holomesh',\n };\n }\n\n private async spawnLoop(managed: ManagedAgent): Promise<void> {\n const interval =\n managed.spec.tickIntervalMs ?? this.opts.config.defaultTickIntervalMs ?? 60_000;\n while (!this.stopped) {\n try {\n await this.runOneTick(managed);\n } catch (err) {\n managed.status.state = 'crashed';\n managed.status.lastError = err instanceof Error ? err.message : String(err);\n managed.status.restarts += 1;\n const backoffMs = Math.min(60_000, 2 ** Math.min(managed.status.restarts, 6) * 1000);\n this.log({\n ev: 'agent-crashed-restarting',\n agent: managed.spec.handle,\n backoffMs,\n restarts: managed.status.restarts,\n message: managed.status.lastError,\n });\n await sleep(backoffMs);\n continue;\n }\n await sleep(interval + jitter(interval));\n }\n }\n\n private async runOneTick(managed: ManagedAgent): Promise<void> {\n if (this.globalBudgetUsdPerDay != null) {\n const totalSpent = [...this.agents.values()].reduce((s, a) => s + a.status.spentUsd, 0);\n if (totalSpent >= this.globalBudgetUsdPerDay) {\n managed.status.state = 'over-budget';\n this.log({ ev: 'global-budget-exhausted', agent: managed.spec.handle, totalSpent });\n return;\n }\n }\n const result = await managed.runner.tick();\n const cs = managed.costGuard.getState();\n managed.status.spentUsd = cs.spentUsd;\n managed.status.remainingUsd = managed.costGuard.getRemainingUsd();\n managed.status.lastTickAt = (this.opts.now ?? (() => new Date()))().toISOString();\n managed.status.state = result.action === 'over-budget' ? 'over-budget' : 'running';\n if (result.action === 'errored') {\n managed.status.lastError = result.message;\n }\n }\n\n private log(event: Record<string, unknown>): void {\n if (this.opts.logger) {\n this.opts.logger({ ts: new Date().toISOString(), ...event });\n }\n }\n}\n\ninterface ManagedAgent {\n spec: AgentSpec;\n identity: AgentIdentity;\n brain: RuntimeBrainConfig;\n runner: AgentRunner;\n costGuard: CostGuard;\n status: SupervisorAgentStatus;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction jitter(base: number): number {\n return Math.floor((Math.random() - 0.5) * base * 0.2);\n}\n","import { mkdirSync, appendFileSync, readFileSync, existsSync, statSync, renameSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { LLMProviderName } from '@holoscript/llm-provider';\nimport type { AgentIdentity, BoardTask, ExecutionResult } from './types.js';\n\nexport type AuditEventKind = 'task-executed' | 'ablation-cell' | 'budget-exhausted' | 'agent-crash';\n\nexport interface AuditEvent {\n ts: string;\n kind: AuditEventKind;\n agent: {\n handle: string;\n surface: string;\n wallet: string;\n walletShort: string;\n provider: LLMProviderName;\n model: string;\n brainPath: string;\n };\n task?: {\n id: string;\n title: string;\n tags: string[];\n };\n execution?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n costUsd: number;\n durationMs: number;\n finishReason?: string;\n promptHash?: string;\n };\n result?: {\n commitHash?: string;\n filePath?: string;\n errorMessage?: string;\n };\n ablation?: {\n label: string;\n matrixId: string;\n };\n}\n\nexport interface AuditQuery {\n agent?: string;\n task?: string;\n provider?: LLMProviderName;\n kind?: AuditEventKind;\n since?: string;\n until?: string;\n limit?: number;\n}\n\nexport interface AuditLogOptions {\n logPath: string;\n maxBytes?: number;\n}\n\nexport class AuditLog {\n private readonly logPath: string;\n private readonly maxBytes: number;\n\n constructor(opts: AuditLogOptions) {\n this.logPath = opts.logPath;\n this.maxBytes = opts.maxBytes ?? 50 * 1024 * 1024;\n mkdirSync(dirname(this.logPath), { recursive: true });\n }\n\n record(event: AuditEvent): void {\n this.rotateIfFull();\n appendFileSync(this.logPath, `${JSON.stringify(event)}\\n`, 'utf8');\n }\n\n recordTaskExecuted(opts: {\n identity: AgentIdentity;\n task: BoardTask;\n result: ExecutionResult;\n commitHash?: string;\n filePath?: string;\n }): void {\n this.record({\n ts: new Date().toISOString(),\n kind: 'task-executed',\n agent: agentFromIdentity(opts.identity),\n task: { id: opts.task.id, title: opts.task.title, tags: opts.task.tags ?? [] },\n execution: {\n promptTokens: opts.result.usage.promptTokens,\n completionTokens: opts.result.usage.completionTokens,\n totalTokens: opts.result.usage.totalTokens,\n costUsd: opts.result.costUsd,\n durationMs: opts.result.durationMs,\n },\n result: {\n commitHash: opts.commitHash,\n filePath: opts.filePath,\n },\n });\n }\n\n recordAblationCell(opts: {\n identity: AgentIdentity;\n matrixId: string;\n label: string;\n taskId: string;\n taskTitle: string;\n promptHash: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n durationMs: number;\n finishReason: string;\n errorMessage?: string;\n }): void {\n this.record({\n ts: new Date().toISOString(),\n kind: 'ablation-cell',\n agent: agentFromIdentity(opts.identity),\n task: { id: opts.taskId, title: opts.taskTitle, tags: ['ablation'] },\n execution: {\n promptTokens: opts.promptTokens,\n completionTokens: opts.completionTokens,\n totalTokens: opts.promptTokens + opts.completionTokens,\n costUsd: opts.costUsd,\n durationMs: opts.durationMs,\n finishReason: opts.finishReason,\n promptHash: opts.promptHash,\n },\n result: { errorMessage: opts.errorMessage },\n ablation: { label: opts.label, matrixId: opts.matrixId },\n });\n }\n\n query(filter: AuditQuery = {}): AuditEvent[] {\n if (!existsSync(this.logPath)) return [];\n const raw = readFileSync(this.logPath, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.length > 0);\n const events: AuditEvent[] = [];\n for (const line of lines) {\n try {\n events.push(JSON.parse(line) as AuditEvent);\n } catch {\n // Corrupt line — skip rather than fail the whole query.\n // Agents must keep flying even if one line got partially flushed.\n }\n }\n return applyFilter(events, filter);\n }\n\n rollup(filter: AuditQuery = {}): {\n totalEvents: number;\n byAgent: Record<string, { events: number; costUsd: number; tokens: number }>;\n byProvider: Record<string, { events: number; costUsd: number; tokens: number }>;\n totalCostUsd: number;\n totalTokens: number;\n } {\n const events = this.query(filter);\n const byAgent: Record<string, { events: number; costUsd: number; tokens: number }> = {};\n const byProvider: Record<string, { events: number; costUsd: number; tokens: number }> = {};\n let totalCostUsd = 0;\n let totalTokens = 0;\n for (const e of events) {\n const agent = e.agent.handle;\n const provider = e.agent.provider;\n const cost = e.execution?.costUsd ?? 0;\n const tokens = e.execution?.totalTokens ?? 0;\n byAgent[agent] = byAgent[agent] ?? { events: 0, costUsd: 0, tokens: 0 };\n byAgent[agent].events += 1;\n byAgent[agent].costUsd += cost;\n byAgent[agent].tokens += tokens;\n byProvider[provider] = byProvider[provider] ?? { events: 0, costUsd: 0, tokens: 0 };\n byProvider[provider].events += 1;\n byProvider[provider].costUsd += cost;\n byProvider[provider].tokens += tokens;\n totalCostUsd += cost;\n totalTokens += tokens;\n }\n return { totalEvents: events.length, byAgent, byProvider, totalCostUsd, totalTokens };\n }\n\n private rotateIfFull(): void {\n if (!existsSync(this.logPath)) return;\n const size = statSync(this.logPath).size;\n if (size < this.maxBytes) return;\n const archived = `${this.logPath}.${new Date().toISOString().replace(/[:.]/g, '-')}.jsonl`;\n renameSync(this.logPath, archived);\n }\n}\n\nfunction agentFromIdentity(identity: AgentIdentity): AuditEvent['agent'] {\n return {\n handle: identity.handle,\n surface: identity.surface,\n wallet: identity.wallet,\n walletShort: `${identity.wallet.slice(0, 6)}…${identity.wallet.slice(-4)}`,\n provider: identity.llmProvider,\n model: identity.llmModel,\n brainPath: identity.brainPath,\n };\n}\n\nfunction applyFilter(events: AuditEvent[], filter: AuditQuery): AuditEvent[] {\n let result = events;\n if (filter.agent) result = result.filter((e) => e.agent.handle === filter.agent);\n if (filter.provider) result = result.filter((e) => e.agent.provider === filter.provider);\n if (filter.task) result = result.filter((e) => e.task?.id === filter.task);\n if (filter.kind) result = result.filter((e) => e.kind === filter.kind);\n if (filter.since) result = result.filter((e) => e.ts >= filter.since!);\n if (filter.until) result = result.filter((e) => e.ts <= filter.until!);\n if (filter.limit != null) result = result.slice(-filter.limit);\n return result;\n}\n","import { readFileSync } from 'node:fs';\nimport type { LLMProviderName } from '@holoscript/llm-provider';\n\nexport interface AgentSpec {\n handle: string;\n brainPath: string;\n provider: LLMProviderName;\n model: string;\n walletEnvKey: string;\n bearerEnvKey: string;\n budgetUsdPerDay?: number;\n scopeTier?: 'cold' | 'warm' | 'hot';\n enabled?: boolean;\n tickIntervalMs?: number;\n enableCommitHook?: boolean;\n outputDir?: string;\n workingDir?: string;\n}\n\nexport interface SupervisorConfig {\n agents: AgentSpec[];\n globalBudgetUsdPerDay?: number;\n defaultTickIntervalMs?: number;\n}\n\n// Mirror of VALID_PROVIDERS in identity.ts. Deduplication is a separate\n// task — both Sets must stay in sync until then. Single-source-of-truth\n// via LLMProviderName-derived runtime Set is the clean fix (W.GOLD.006).\nconst VALID_PROVIDERS: ReadonlySet<LLMProviderName> = new Set([\n 'anthropic',\n 'openai',\n 'gemini',\n 'xai',\n 'openrouter',\n 'mock',\n 'bitnet',\n 'local-llm',\n]);\n\nconst VALID_TIERS: ReadonlySet<string> = new Set(['cold', 'warm', 'hot']);\nconst HANDLE_PATTERN = /^[a-z0-9_-]{1,64}$/i;\n\nexport function loadSupervisorConfig(path: string): SupervisorConfig {\n return parseSupervisorConfig(readFileSync(path, 'utf8'));\n}\n\nexport function parseSupervisorConfig(raw: string): SupervisorConfig {\n const data = JSON.parse(raw) as unknown;\n if (!isObject(data)) throw new Error('Supervisor config must be a JSON object');\n if (!Array.isArray(data.agents)) throw new Error('Supervisor config.agents must be an array');\n if (data.agents.length === 0)\n throw new Error('Supervisor config.agents must have at least one entry');\n\n const seenHandles = new Set<string>();\n const agents: AgentSpec[] = data.agents.map((entry, idx) =>\n validateAgent(entry, idx, seenHandles)\n );\n\n const globalBudgetUsdPerDay = optionalNumber(data, 'globalBudgetUsdPerDay');\n const defaultTickIntervalMs = optionalNumber(data, 'defaultTickIntervalMs');\n if (globalBudgetUsdPerDay != null && globalBudgetUsdPerDay <= 0) {\n throw new Error(`globalBudgetUsdPerDay must be positive, got ${globalBudgetUsdPerDay}`);\n }\n if (defaultTickIntervalMs != null && defaultTickIntervalMs < 5000) {\n throw new Error(\n `defaultTickIntervalMs must be >= 5000ms (mesh-friendly), got ${defaultTickIntervalMs}`\n );\n }\n\n return { agents, globalBudgetUsdPerDay, defaultTickIntervalMs };\n}\n\nfunction validateAgent(entry: unknown, idx: number, seen: Set<string>): AgentSpec {\n if (!isObject(entry)) throw new Error(`agents[${idx}] must be an object`);\n const handle = requiredString(entry, 'handle', `agents[${idx}].handle`);\n if (!HANDLE_PATTERN.test(handle)) {\n throw new Error(`agents[${idx}].handle \"${handle}\" must match ${HANDLE_PATTERN}`);\n }\n if (seen.has(handle)) throw new Error(`Duplicate agent handle: \"${handle}\"`);\n seen.add(handle);\n\n const provider = requiredString(entry, 'provider', `agents[${idx}].provider`);\n if (!VALID_PROVIDERS.has(provider as LLMProviderName)) {\n throw new Error(\n `agents[${idx}].provider \"${provider}\" not in [${[...VALID_PROVIDERS].join(', ')}]`\n );\n }\n\n const scopeTier = optionalString(entry, 'scopeTier');\n if (scopeTier && !VALID_TIERS.has(scopeTier)) {\n throw new Error(`agents[${idx}].scopeTier \"${scopeTier}\" must be cold | warm | hot`);\n }\n\n const budgetUsdPerDay = optionalNumber(entry, 'budgetUsdPerDay');\n if (budgetUsdPerDay != null && budgetUsdPerDay < 0) {\n throw new Error(\n `agents[${idx}].budgetUsdPerDay must be >= 0 (0 = unlimited), got ${budgetUsdPerDay}`\n );\n }\n const tickIntervalMs = optionalNumber(entry, 'tickIntervalMs');\n if (tickIntervalMs != null && tickIntervalMs < 5000) {\n throw new Error(`agents[${idx}].tickIntervalMs must be >= 5000ms, got ${tickIntervalMs}`);\n }\n\n return {\n handle,\n brainPath: requiredString(entry, 'brainPath', `agents[${idx}].brainPath`),\n provider: provider as LLMProviderName,\n model: requiredString(entry, 'model', `agents[${idx}].model`),\n walletEnvKey: requiredString(entry, 'walletEnvKey', `agents[${idx}].walletEnvKey`),\n bearerEnvKey: requiredString(entry, 'bearerEnvKey', `agents[${idx}].bearerEnvKey`),\n budgetUsdPerDay,\n scopeTier: scopeTier as 'cold' | 'warm' | 'hot' | undefined,\n enabled: optionalBoolean(entry, 'enabled'),\n tickIntervalMs,\n enableCommitHook: optionalBoolean(entry, 'enableCommitHook'),\n outputDir: optionalString(entry, 'outputDir'),\n workingDir: optionalString(entry, 'workingDir'),\n };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction requiredString(obj: Record<string, unknown>, key: string, label: string): string {\n const v = obj[key];\n if (typeof v !== 'string' || v.trim().length === 0) {\n throw new Error(`${label} is required and must be a non-empty string`);\n }\n return v.trim();\n}\n\nfunction optionalString(obj: Record<string, unknown>, key: string): string | undefined {\n const v = obj[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'string') throw new Error(`${key} must be a string when present`);\n return v.trim();\n}\n\nfunction optionalNumber(obj: Record<string, unknown>, key: string): number | undefined {\n const v = obj[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`${key} must be a finite number when present`);\n }\n return v;\n}\n\nfunction optionalBoolean(obj: Record<string, unknown>, key: string): boolean | undefined {\n const v = obj[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'boolean') throw new Error(`${key} must be a boolean when present`);\n return v;\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir, hostname } from 'node:os';\nimport { randomBytes, createCipheriv, createHash } from 'node:crypto';\nimport { Wallet } from 'ethers';\n\nconst HANDLE_PATTERN = /^[a-z0-9_-]{1,64}$/i;\n\nexport interface ProvisionRequest {\n handle: string;\n meshApiBase?: string;\n founderBearer: string;\n seatsRoot?: string;\n fetchImpl?: typeof fetch;\n autoJoinTeamId?: string;\n}\n\nexport interface ProvisionDryRun {\n status: 'dry-run';\n handle: string;\n surface: string;\n seatId: string;\n seatDir: string;\n willGenerateWallet: boolean;\n willCallEndpoints: string[];\n}\n\nexport interface ProvisionExecuted {\n status: 'executed' | 'reused';\n handle: string;\n surface: string;\n seatId: string;\n seatDir: string;\n walletAddress: string;\n bearer?: string;\n agentId?: string;\n envVarLines: string[];\n joinedTeam?:\n | { teamId: string; role: string; members: number }\n | { teamId: string; error: string };\n}\n\nexport type ProvisionResult = ProvisionDryRun | ProvisionExecuted;\n\nconst EIP712_DOMAIN = { name: 'HoloMesh', version: '1' };\nconst EIP712_TYPES: Record<string, Array<{ name: string; type: string }>> = {\n Registration: [{ name: 'nonce', type: 'string' }],\n};\n\nexport async function provisionAgent(\n req: ProvisionRequest,\n opts: { execute: boolean; force?: boolean } = { execute: false }\n): Promise<ProvisionResult> {\n if (!HANDLE_PATTERN.test(req.handle)) {\n throw new Error(`handle \"${req.handle}\" must match ${HANDLE_PATTERN}`);\n }\n if (!req.founderBearer || req.founderBearer.trim().length === 0) {\n throw new Error(\n 'founderBearer is required (HOLOMESH_API_KEY of an agent that can call /register)'\n );\n }\n\n const meshApiBase = (req.meshApiBase ?? 'https://mcp.holoscript.net/api/holomesh').replace(\n /\\/$/,\n ''\n );\n const seatsRoot = req.seatsRoot ?? defaultSeatsRoot();\n const surface = req.handle;\n const seatId = makeSeatId(surface);\n const seatDir = join(seatsRoot, seatId);\n const walletPath = join(seatDir, 'wallet.enc');\n const regPath = join(seatDir, 'registration.json');\n\n if (!opts.execute) {\n return {\n status: 'dry-run',\n handle: req.handle,\n surface,\n seatId,\n seatDir,\n willGenerateWallet: !existsSync(walletPath),\n willCallEndpoints: [`POST ${meshApiBase}/register/challenge`, `POST ${meshApiBase}/register`],\n };\n }\n\n if (existsSync(walletPath) && !opts.force) {\n const blob = JSON.parse(readFileSync(walletPath, 'utf8')) as { address: string };\n const reused: ProvisionExecuted = {\n status: 'reused',\n handle: req.handle,\n surface,\n seatId,\n seatDir,\n walletAddress: blob.address,\n envVarLines: envVarLinesFor(req.handle, blob.address, undefined),\n };\n return reused;\n }\n\n const wallet = Wallet.createRandom();\n mkdirSync(seatDir, { recursive: true });\n\n const masterKey = ensureMasterKey(seatsRoot);\n const encryptedBlob = {\n seat_id: seatId,\n surface,\n handle: req.handle,\n address: wallet.address,\n encrypted_privkey: encryptPrivateKey(wallet.privateKey, masterKey),\n created_at: new Date().toISOString(),\n source: 'holoscript-agent.provision',\n };\n writeFileSync(walletPath, JSON.stringify(encryptedBlob, null, 2), 'utf8');\n try {\n chmodSync(walletPath, 0o600);\n } catch {}\n\n const fetchImpl = req.fetchImpl ?? fetch;\n\n const challenge = await postJson<{ nonce: string }>(\n fetchImpl,\n `${meshApiBase}/register/challenge`,\n req.founderBearer,\n { wallet_address: wallet.address }\n );\n if (!challenge.nonce) {\n throw new Error(`/register/challenge returned no nonce: ${JSON.stringify(challenge)}`);\n }\n\n const signature = await wallet.signTypedData(EIP712_DOMAIN, EIP712_TYPES, {\n nonce: challenge.nonce,\n });\n\n const registration = await postJson<{\n agent?: { id: string; api_key: string };\n wallet?: { private_key?: string };\n }>(fetchImpl, `${meshApiBase}/register`, req.founderBearer, {\n name: req.handle,\n wallet_address: wallet.address,\n nonce: challenge.nonce,\n signature,\n });\n writeFileSync(\n regPath,\n JSON.stringify(\n {\n status: 201,\n response: registration,\n registered_at: new Date().toISOString(),\n flow: 'x402',\n },\n null,\n 2\n ),\n 'utf8'\n );\n\n const agentId = registration.agent?.id;\n const bearer = registration.agent?.api_key;\n if (!agentId || !bearer) {\n throw new Error(\n `/register did not return agent.id + agent.api_key: ${JSON.stringify(registration).slice(0, 400)}`\n );\n }\n if (registration.wallet?.private_key) {\n console.warn(\n '[provision] WARN — server returned private_key despite x402 flow; ignoring (using local key).'\n );\n }\n\n let joinedTeam: ProvisionExecuted['joinedTeam'];\n if (req.autoJoinTeamId) {\n try {\n const joinRes = await postJson<{ success?: boolean; role?: string; members?: number }>(\n fetchImpl,\n `${meshApiBase}/team/${req.autoJoinTeamId}/join`,\n bearer,\n {}\n );\n joinedTeam = {\n teamId: req.autoJoinTeamId,\n role: joinRes.role ?? 'member',\n members: joinRes.members ?? 0,\n };\n } catch (err) {\n joinedTeam = {\n teamId: req.autoJoinTeamId,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return {\n status: 'executed',\n handle: req.handle,\n surface,\n seatId,\n seatDir,\n walletAddress: wallet.address,\n bearer,\n agentId,\n envVarLines: envVarLinesFor(req.handle, wallet.address, bearer),\n joinedTeam,\n };\n}\n\nfunction defaultSeatsRoot(): string {\n return process.env.HOLOSCRIPT_AGENT_SEATS_ROOT ?? join(homedir(), '.holoscript-agent', 'seats');\n}\n\nfunction makeSeatId(surface: string): string {\n const fp = createHash('sha256')\n .update(hostname() + homedir())\n .digest('hex')\n .slice(0, 8);\n return `holoscript-${surface}-${fp}-x402`;\n}\n\nfunction ensureMasterKey(seatsRoot: string): Buffer {\n const keyPath = join(seatsRoot, '.master-key');\n if (!existsSync(seatsRoot)) mkdirSync(seatsRoot, { recursive: true });\n if (!existsSync(keyPath)) {\n const k = randomBytes(32);\n writeFileSync(keyPath, k);\n try {\n chmodSync(keyPath, 0o600);\n } catch {}\n }\n return readFileSync(keyPath);\n}\n\nfunction encryptPrivateKey(\n privKey: string,\n masterKey: Buffer\n): { iv: string; ct: string; tag: string; alg: 'aes-256-gcm' } {\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', masterKey, iv);\n const ct = Buffer.concat([cipher.update(privKey, 'utf8'), cipher.final()]);\n return {\n iv: iv.toString('base64'),\n ct: ct.toString('base64'),\n tag: cipher.getAuthTag().toString('base64'),\n alg: 'aes-256-gcm',\n };\n}\n\nasync function postJson<T>(\n fetchImpl: typeof fetch,\n url: string,\n bearer: string,\n body: unknown\n): Promise<T> {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${bearer}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`POST ${url} ${res.status}: ${text.slice(0, 400)}`);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error(`POST ${url} returned non-JSON: ${text.slice(0, 200)}`);\n }\n}\n\nfunction envVarLinesFor(handle: string, walletAddress: string, bearer?: string): string[] {\n const suffix = handle.toUpperCase().replace(/-/g, '_');\n const lines = [`HOLOSCRIPT_AGENT_WALLET_${suffix}=${walletAddress}`];\n if (bearer) {\n lines.push(`HOLOMESH_API_KEY_${suffix}_X402=${bearer}`);\n }\n return lines;\n}\n"],"mappings":"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","names":["homedir","hostname","join","createHash","randomBytes","Wallet","readFile","dirname","readFile","mkdir","dirname","createHash","priority","tasks","mkdirSync","writeFileSync","dirname","resolve","spawn","createHash","truncate","resolve","join","mkdirSync","readFileSync","existsSync","dirname","join","sleep","jitter","readFileSync","VALID_PROVIDERS","mkdirSync","readFileSync","writeFileSync","existsSync","join","homedir","createHash","Wallet","HANDLE_PATTERN","writeFileSync","readFileSync","existsSync","mkdirSync","dirname","resolve","Wallet","join","homedir","createHash","hostname","randomBytes"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/identity.ts","../src/brain.ts","../src/cost-guard.ts","../src/capability-router.ts","../src/holomesh-client.ts","../src/bearer-broker.ts","../src/runner.ts","../src/cael-builder.ts","../src/tools.ts","../src/cognitive-verbs.ts","../src/commit-hook.ts","../src/ablation.ts","../src/supervisor.ts","../src/audit-log.ts","../src/supervisor-config.ts","../src/provision.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { homedir, hostname } from 'node:os';\nimport { join } from 'node:path';\nimport { createHash, createDecipheriv, randomBytes, type DecipherGCM } from 'node:crypto';\nimport { Wallet } from 'ethers';\nimport {\n createAnthropicProvider,\n createOpenAIProvider,\n createGeminiProvider,\n createMockProvider,\n createLocalLLMProvider,\n createXAIProvider,\n createOpenRouterProvider,\n resolveSovereignProviderAsync,\n} from '@holoscript/llm-provider';\nimport type { ILLMProvider, LLMProviderName } from '@holoscript/llm-provider';\nimport { loadIdentity, identityForLog } from './identity.js';\nimport { loadBrain } from './brain.js';\nimport { CostGuard, defaultPricerForProvider } from './cost-guard.js';\nimport { pickProvider, BUILT_IN_CANDIDATES } from './capability-router.js';\nimport { HolomeshClient } from './holomesh-client.js';\nimport { resolveBearerViaBroker } from './bearer-broker.js';\nimport { AgentRunner } from './runner.js';\nimport { makeCommitHook } from './commit-hook.js';\nimport { runAblation, renderAblationMarkdown } from './ablation.js';\nimport type { AblationProviderSpec, AblationTaskSpec } from './ablation.js';\nimport { Supervisor } from './supervisor.js';\nimport type { ProviderFactory } from './supervisor.js';\nimport { loadSupervisorConfig } from './supervisor-config.js';\nimport type { AgentSpec } from './supervisor-config.js';\nimport { provisionAgent } from './provision.js';\nimport { AuditLog } from './audit-log.js';\nimport { writeFileSync, readFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { AgentIdentity, BoardTask, ExecutionResult } from './types.js';\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const cmd = args[0] ?? 'help';\n\n switch (cmd) {\n case 'run':\n await cmdRun({ once: false });\n return;\n case 'tick':\n await cmdRun({ once: true });\n return;\n case 'whoami':\n await cmdWhoami();\n return;\n case 'ablate':\n await cmdAblate(args.slice(1));\n return;\n case 'supervise':\n await cmdSupervise(args.slice(1));\n return;\n case 'status':\n await cmdStatus(args.slice(1));\n return;\n case 'provision':\n await cmdProvision(args.slice(1));\n return;\n case 'audit':\n await cmdAudit(args.slice(1));\n return;\n case 'help':\n case '--help':\n case '-h':\n printHelp();\n return;\n default:\n console.error(`Unknown command: ${cmd}`);\n printHelp();\n process.exit(2);\n }\n}\n\nasync function cmdRun(opts: { once: boolean }): Promise<void> {\n const identity = loadIdentity();\n const brain = await loadBrain(identity.brainPath, scopeTierFromEnv());\n\n // Capability-aware routing (Lane 3 Phase 4 — founder ruling 2026-05-06):\n // brain.requires/prefers/avoids drives provider selection at session start;\n // HOLOSCRIPT_AGENT_PROVIDER env becomes OVERRIDE, not source-of-truth.\n // Brains with empty requires (today's default) preserve current behavior.\n const decision = pickProvider({\n brain,\n envOverride: identity.llmProvider,\n candidates: BUILT_IN_CANDIDATES,\n });\n const effectiveIdentity =\n decision.picked === identity.llmProvider\n ? identity\n : { ...identity, llmProvider: decision.picked };\n if (decision.reason === 'env-override-mismatch') {\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'capability-router-mismatch',\n envOverride: identity.llmProvider,\n unsatisfiedRequires: decision.unsatisfiedRequires,\n excludedByAvoids: decision.excludedByAvoids,\n })\n );\n }\n\n const provider = await buildProvider(effectiveIdentity);\n const costGuard = new CostGuard({\n statePath: stateFilePath(identity),\n dailyBudgetUsd: identity.budgetUsdPerDay,\n pricer: defaultPricerForProvider(effectiveIdentity.llmProvider),\n });\n // Load the seat wallet ONCE: it both signs strict-mode requests AND (when no\n // explicit bearer is set) proves ownership to the HoloKey broker to fetch the\n // mesh bearer — so the edge holds only its wallet, not a plaintext bearer.\n const seat = loadSeatWallet(identity.handle);\n let bearer = identity.x402Bearer;\n if (!bearer) {\n if (!seat) {\n throw new Error(\n 'No HOLOSCRIPT_AGENT_X402_BEARER set and no seat wallet found to resolve it from the ' +\n 'HoloKey broker. Provide a bearer, or point at the seat wallet via ' +\n 'HOLOSCRIPT_AGENT_SEATS_ROOT + HOLOSCRIPT_AGENT_SEAT_ID (+ HOLOSCRIPT_AGENT_SEAT_MASTER_KEY).'\n );\n }\n bearer = await resolveBearerViaBroker({\n privateKey: seat.wallet.privateKey,\n meshApiBase: identity.meshApiBase,\n });\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'bearer-resolved-via-broker',\n wallet: `${seat.address.slice(0, 6)}…${seat.address.slice(-4)}`,\n })\n );\n }\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer,\n teamId: identity.teamId,\n signer: buildRequestSigner(seat),\n localKnowledgePath: process.env.HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH,\n });\n\n const commitHook = buildCommitHook(identity, mesh);\n const auditLog = buildAuditLog();\n\n // Wallet-signed hardware receipts (F.123 — make the provenance artifact\n // verifiable, not plain JSON). With a seat wallet present, sign the receipt's\n // canonical body (EIP-191 personal_sign); otherwise receipts are content-hashed\n // but self-report `signed:false`.\n const signReceipt = seat\n ? async (canonical: string) => {\n const wallet = new Wallet(seat.wallet.privateKey);\n return {\n alg: 'eip191-personal-sign',\n signer: wallet.address,\n signature: await wallet.signMessage(canonical),\n };\n }\n : undefined;\n\n const runner = new AgentRunner({\n identity,\n brain,\n provider,\n costGuard,\n mesh,\n logger: (ev) => console.log(JSON.stringify({ ts: new Date().toISOString(), ...ev })),\n onTaskExecuted: commitHook,\n auditLog,\n signReceipt,\n });\n\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'boot',\n identity: identityForLog(identity),\n brain: { domain: brain.domain, tags: brain.capabilityTags, tier: brain.scopeTier },\n })\n );\n\n if (opts.once) {\n const result = await runner.tick();\n console.log(JSON.stringify({ ts: new Date().toISOString(), ev: 'tick-result', ...result }));\n return;\n }\n\n const interval = Number(process.env.HOLOSCRIPT_AGENT_TICK_MS ?? '60000');\n const onSig = () => {\n console.log(JSON.stringify({ ts: new Date().toISOString(), ev: 'shutdown' }));\n runner.stop();\n setTimeout(() => process.exit(0), 250);\n };\n process.on('SIGINT', onSig);\n process.on('SIGTERM', onSig);\n await runner.runForever({ tickIntervalMs: interval });\n}\n\nfunction supervisorProviderFactory(): ProviderFactory {\n return (spec: AgentSpec) => {\n switch (spec.provider) {\n case 'anthropic':\n return createAnthropicProvider({ defaultModel: spec.model });\n case 'openai':\n return createOpenAIProvider({ defaultModel: spec.model });\n case 'gemini':\n return createGeminiProvider({ defaultModel: spec.model });\n case 'xai':\n return createXAIProvider({ defaultModel: spec.model });\n case 'openrouter':\n return createOpenRouterProvider({ defaultModel: spec.model });\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: spec.model,\n timeoutMs: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS\n ? Number(process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS)\n : 300000,\n });\n case 'sovereign':\n // Universal sovereign-first resolution (founder 2026-06-10): serving\n // fleet → cloud → local Ollama → BYOK frontier keys — the same policy\n // HoloClaw's daemon and Brittney use. spec.model (when set) overrides.\n return resolveSovereignProviderAsync(spec.model ? { model: spec.model } : {}).then(\n (r) => r.provider\n );\n case 'mock':\n return createMockProvider();\n default:\n throw new Error(\n `Provider \"${spec.provider}\" not yet wired in supervisor — add a case here.`\n );\n }\n };\n}\n\nasync function cmdSupervise(rest: string[]): Promise<void> {\n const cfgPath = rest.find((a) => a.startsWith('--config='))?.split('=')[1];\n if (!cfgPath) {\n throw new Error('Usage: holoscript-agent supervise --config=<path-to-agents.json>');\n }\n const teamId = process.env.HOLOMESH_TEAM_ID;\n if (!teamId) throw new Error('HOLOMESH_TEAM_ID env var required for supervise command');\n\n const config = loadSupervisorConfig(cfgPath);\n const sup = new Supervisor({\n config,\n providerFactory: supervisorProviderFactory(),\n teamId,\n meshApiBase: process.env.HOLOMESH_API_BASE,\n auditLogPath: auditLogPath(),\n logger: (ev) => console.log(JSON.stringify(ev)),\n });\n\n const onSig = async () => {\n await sup.stop();\n setTimeout(() => process.exit(0), 250);\n };\n process.on('SIGINT', onSig);\n process.on('SIGTERM', onSig);\n\n await sup.start();\n console.log(\n JSON.stringify({ ts: new Date().toISOString(), ev: 'supervise-running', config: cfgPath })\n );\n\n const reportEvery = Number(process.env.HOLOSCRIPT_AGENT_STATUS_REPORT_MS ?? '300000');\n if (reportEvery > 0) {\n setInterval(() => {\n console.log(\n JSON.stringify({ ts: new Date().toISOString(), ev: 'supervisor-status', ...sup.status() })\n );\n }, reportEvery);\n }\n}\n\nasync function cmdAudit(rest: string[]): Promise<void> {\n const logPath =\n rest.find((a) => a.startsWith('--log='))?.split('=')[1] ??\n process.env.HOLOSCRIPT_AGENT_AUDIT_LOG ??\n join(homedir(), '.holoscript-agent', 'audit', 'audit.jsonl');\n const sub = rest.find((a) => !a.startsWith('--')) ?? 'rollup';\n const filter: {\n agent?: string;\n provider?: string;\n task?: string;\n kind?: string;\n limit?: number;\n } = {};\n for (const arg of rest) {\n if (arg.startsWith('--agent=')) filter.agent = arg.split('=')[1];\n if (arg.startsWith('--provider=')) filter.provider = arg.split('=')[1];\n if (arg.startsWith('--task=')) filter.task = arg.split('=')[1];\n if (arg.startsWith('--kind=')) filter.kind = arg.split('=')[1];\n if (arg.startsWith('--limit=')) filter.limit = Number(arg.split('=')[1]);\n }\n const log = new AuditLog({ logPath });\n if (sub === 'rollup') {\n console.log(JSON.stringify(log.rollup(filter as never), null, 2));\n } else if (sub === 'tail' || sub === 'query') {\n const events = log.query(filter as never);\n for (const e of events) console.log(JSON.stringify(e));\n } else {\n throw new Error(\n 'Usage: holoscript-agent audit [rollup|query|tail] [--agent=<h>] [--provider=<p>] [--task=<id>] [--kind=<k>] [--limit=<n>] [--log=<path>]'\n );\n }\n}\n\nasync function cmdProvision(rest: string[]): Promise<void> {\n const handle = rest.find((a) => a.startsWith('--handle='))?.split('=')[1];\n if (!handle) {\n throw new Error('Usage: holoscript-agent provision --handle=<name> [--execute] [--force]');\n }\n const execute = rest.includes('--execute');\n const force = rest.includes('--force');\n const founderBearer = process.env.HOLOMESH_API_KEY;\n if (!founderBearer) {\n throw new Error(\n 'HOLOMESH_API_KEY env var required for provisioning (founder-tier bearer for /register endpoints)'\n );\n }\n const result = await provisionAgent(\n {\n handle,\n founderBearer,\n meshApiBase: process.env.HOLOMESH_API_BASE,\n seatsRoot: process.env.HOLOSCRIPT_AGENT_SEATS_ROOT,\n autoJoinTeamId: rest.includes('--no-join') ? undefined : process.env.HOLOMESH_TEAM_ID,\n },\n { execute, force }\n );\n console.log(\n JSON.stringify({ ts: new Date().toISOString(), ev: 'provision-result', ...result }, null, 2)\n );\n if (result.status === 'executed' || result.status === 'reused') {\n console.log('\\n# Add these lines to your .env to use this seat:');\n for (const line of result.envVarLines) console.log(line);\n }\n}\n\nasync function cmdStatus(rest: string[]): Promise<void> {\n const cfgPath = rest.find((a) => a.startsWith('--config='))?.split('=')[1];\n if (!cfgPath) {\n throw new Error('Usage: holoscript-agent status --config=<path-to-agents.json>');\n }\n const config = loadSupervisorConfig(cfgPath);\n console.log(\n JSON.stringify(\n {\n config: cfgPath,\n agentCount: config.agents.length,\n enabled: config.agents.filter((a) => a.enabled !== false).map((a) => a.handle),\n disabled: config.agents.filter((a) => a.enabled === false).map((a) => a.handle),\n globalBudgetUsdPerDay: config.globalBudgetUsdPerDay ?? null,\n defaultTickIntervalMs: config.defaultTickIntervalMs ?? null,\n },\n null,\n 2\n )\n );\n}\n\nasync function cmdAblate(rest: string[]): Promise<void> {\n const specPath = rest.find((a) => a.startsWith('--spec='))?.split('=')[1];\n if (!specPath) {\n throw new Error(\n 'Usage: holoscript-agent ablate --spec=<path-to-ablation.json> [--out-md=<path>] [--out-json=<path>]'\n );\n }\n const outMd = rest.find((a) => a.startsWith('--out-md='))?.split('=')[1];\n const outJson = rest.find((a) => a.startsWith('--out-json='))?.split('=')[1];\n if (!existsSync(specPath)) throw new Error(`Spec file not found: ${specPath}`);\n\n const spec = JSON.parse(readFileSync(specPath, 'utf8')) as {\n task: AblationTaskSpec;\n providers: Array<{\n label: string;\n provider: 'anthropic' | 'openai' | 'gemini' | 'local-llm' | 'mock';\n model: string;\n pricePerMtokInput?: number;\n pricePerMtokOutput?: number;\n pricePerCallUsd?: number;\n }>;\n timeoutPerCellMs?: number;\n };\n\n const providers: AblationProviderSpec[] = spec.providers.map((p) => ({\n label: p.label,\n provider: p.provider,\n model: p.model,\n build: () => {\n switch (p.provider) {\n case 'anthropic':\n return createAnthropicProvider({ defaultModel: p.model });\n case 'openai':\n return createOpenAIProvider({ defaultModel: p.model });\n case 'gemini':\n return createGeminiProvider({ defaultModel: p.model });\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: p.model,\n });\n case 'mock':\n return createMockProvider();\n }\n },\n pricer:\n p.pricePerCallUsd != null\n ? () => p.pricePerCallUsd!\n : p.pricePerMtokInput != null && p.pricePerMtokOutput != null\n ? (u) =>\n (u.promptTokens * p.pricePerMtokInput! + u.completionTokens * p.pricePerMtokOutput!) /\n 1_000_000\n : undefined,\n }));\n\n const startMsg = JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'ablation-start',\n task: spec.task.taskId,\n cells: providers.length,\n });\n console.log(startMsg);\n\n const matrix = await runAblation({\n task: spec.task,\n providers,\n timeoutPerCellMs: spec.timeoutPerCellMs,\n });\n\n if (outJson) {\n mkdirSync(dirname(resolve(outJson)), { recursive: true });\n writeFileSync(outJson, JSON.stringify(matrix, null, 2), 'utf8');\n }\n if (outMd) {\n mkdirSync(dirname(resolve(outMd)), { recursive: true });\n writeFileSync(outMd, renderAblationMarkdown(matrix), 'utf8');\n }\n if (!outMd && !outJson) {\n console.log(renderAblationMarkdown(matrix));\n }\n\n console.log(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'ablation-done',\n task: matrix.taskId,\n cells: matrix.cells.length,\n errors: matrix.cells.filter((c) => c.errorMessage).length,\n totalCostUsd: matrix.totalCostUsd,\n promptHash: matrix.promptHash,\n outMd: outMd ?? null,\n outJson: outJson ?? null,\n })\n );\n}\n\nasync function cmdWhoami(): Promise<void> {\n const identity = loadIdentity();\n const seat = loadSeatWallet(identity.handle);\n let bearer = identity.x402Bearer;\n if (!bearer && seat) {\n bearer = await resolveBearerViaBroker({\n privateKey: seat.wallet.privateKey,\n meshApiBase: identity.meshApiBase,\n });\n }\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer,\n teamId: identity.teamId,\n signer: buildRequestSigner(seat),\n localKnowledgePath: process.env.HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH,\n });\n const me = await mesh.whoAmI();\n console.log(JSON.stringify({ identity: identityForLog(identity), me }, null, 2));\n}\n\nasync function buildProvider(identity: AgentIdentity): Promise<ILLMProvider> {\n const p: LLMProviderName = identity.llmProvider;\n switch (p) {\n case 'anthropic':\n return createAnthropicProvider({ defaultModel: identity.llmModel });\n case 'openai':\n return createOpenAIProvider({ defaultModel: identity.llmModel });\n case 'gemini':\n return createGeminiProvider({ defaultModel: identity.llmModel });\n case 'xai':\n return createXAIProvider({ defaultModel: identity.llmModel });\n case 'openrouter':\n return createOpenRouterProvider({ defaultModel: identity.llmModel });\n case 'mock':\n return createMockProvider();\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_MODEL ?? identity.llmModel,\n // Edge devices (Jetson ~15 tok/s) need more than the 120s default.\n // HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS overrides; default 300s.\n timeoutMs: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS\n ? Number(process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS)\n : 300000,\n });\n case 'sovereign':\n // Match the supervisor (D.089 sovereign-first): serving fleet → cloud →\n // local Ollama → BYOK frontier keys. identity.llmModel (when set) overrides.\n return (\n await resolveSovereignProviderAsync(identity.llmModel ? { model: identity.llmModel } : {})\n ).provider;\n default:\n throw new Error(`Provider \"${p}\" not yet wired in CLI — add a case in buildProvider.`);\n }\n}\n\nfunction buildCommitHook(\n identity: AgentIdentity,\n mesh: HolomeshClient\n): ((result: ExecutionResult, task: BoardTask) => Promise<void>) | undefined {\n const enabled = (process.env.HOLOSCRIPT_AGENT_COMMIT_RESPONSES ?? '').toLowerCase();\n if (enabled !== '1' && enabled !== 'true') return undefined;\n\n const outputDir = process.env.HOLOSCRIPT_AGENT_OUTPUT_DIR ?? 'agent-out';\n const workingDir = process.env.HOLOSCRIPT_AGENT_WORKING_DIR ?? process.cwd();\n const scope = process.env.HOLOSCRIPT_AGENT_COMMIT_SCOPE ?? `agent(${identity.handle})`;\n const writer = makeCommitHook({ outputDir, workingDir, scope });\n\n return async (result, task) => {\n const out = await writer(result, task, identity);\n await mesh.sendMessageOnTask(\n task.id,\n `[${identity.handle}] response committed at ${out.commitHash?.slice(0, 12) ?? '(no-hash)'} -> ${out.filePath}`\n );\n if (out.commitHash) {\n await mesh.markDone(task.id, `auto: ${task.title}`, out.commitHash);\n }\n };\n}\n\n// ── Request signing (EIP-191) for strict-mode endpoints like /team/:id/join ──────────────────\n\nfunction canonicalizeSigning(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value))\n return `[${(value as unknown[]).map(canonicalizeSigning).join(',')}]`;\n const obj = value as Record<string, unknown>;\n return `{${Object.keys(obj)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${canonicalizeSigning(obj[k])}`)\n .join(',')}}`;\n}\n\ninterface SeatWallet {\n wallet: Wallet;\n address: string;\n}\n\n/**\n * Load + decrypt the seat wallet for the given handle. This is the agent's ROOT\n * credential (F.119): it both signs strict-mode requests (/join etc.) AND proves\n * ownership to the HoloKey broker to fetch the mesh bearer (bearer-broker.ts), so\n * the bearer never has to live in plaintext .env.\n *\n * `HOLOSCRIPT_AGENT_SEAT_ID` overrides the computed seat-dir name — needed when a\n * seat was provisioned under a non-default layout (e.g. the sovereign x402 seats at\n * `~/.ai-ecosystem/seats/sovereign-<surface>-<fp>-default-x402`). `HOLOSCRIPT_AGENT_SEAT_MASTER_KEY`\n * overrides the master-key path. Returns undefined when the files are absent.\n */\nfunction loadSeatWallet(handle: string): SeatWallet | undefined {\n // Fast path: raw private key in env (edge/sovereign devices that provision via\n // wallet key directly rather than encrypted seat files, e.g. Jetson).\n const rawKey = process.env.HOLOSCRIPT_AGENT_WALLET_PRIVATE_KEY;\n if (rawKey) {\n try {\n const wallet = new Wallet(rawKey);\n return { wallet, address: wallet.address };\n } catch {\n // Fall through to seat-file path if key is malformed.\n }\n }\n const seatsRoot =\n process.env.HOLOSCRIPT_AGENT_SEATS_ROOT ?? join(homedir(), '.holoscript-agent', 'seats');\n const fp = createHash('sha256').update(hostname() + homedir()).digest('hex').slice(0, 8);\n const seatId = process.env.HOLOSCRIPT_AGENT_SEAT_ID ?? `holoscript-${handle}-${fp}-x402`;\n const walletPath = join(seatsRoot, seatId, 'wallet.enc');\n const masterKeyPath =\n process.env.HOLOSCRIPT_AGENT_SEAT_MASTER_KEY ?? join(seatsRoot, '.master-key');\n if (!existsSync(walletPath) || !existsSync(masterKeyPath)) return undefined;\n try {\n const blob = JSON.parse(readFileSync(walletPath, 'utf8')) as {\n address: string;\n encrypted_privkey: { iv: string; ct: string; tag: string; alg?: string };\n };\n const masterKey = readFileSync(masterKeyPath);\n const iv = Buffer.from(blob.encrypted_privkey.iv, 'base64');\n const ct = Buffer.from(blob.encrypted_privkey.ct, 'base64');\n const tag = Buffer.from(blob.encrypted_privkey.tag, 'base64');\n const decipher = createDecipheriv(\n blob.encrypted_privkey.alg ?? 'aes-256-gcm',\n masterKey,\n iv\n ) as DecipherGCM;\n decipher.setAuthTag(tag);\n const privateKey = Buffer.concat([decipher.update(ct), decipher.final()]).toString('utf8');\n return { wallet: new Wallet(privateKey), address: blob.address };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Build an EIP-191 RequestSigner from an already-loaded seat wallet (signs\n * strict-mode endpoints like /team/:id/join). Returns undefined when no seat.\n */\nfunction buildRequestSigner(\n seat: SeatWallet | undefined\n): ((body: Record<string, unknown>) => Promise<Record<string, unknown>>) | undefined {\n if (!seat) return undefined;\n return async (body: Record<string, unknown>) => {\n const nonce = randomBytes(16).toString('hex');\n const timestamp = new Date().toISOString();\n const payload = canonicalizeSigning({ body, nonce, timestamp });\n const signature = await seat.wallet.signMessage(payload);\n return { body, signature, signer_address: seat.address, nonce, timestamp };\n };\n}\n\nfunction scopeTierFromEnv(): 'cold' | 'warm' | 'hot' {\n const t = (process.env.HOLOSCRIPT_AGENT_SCOPE_TIER ?? 'warm').toLowerCase();\n if (t === 'cold' || t === 'warm' || t === 'hot') return t;\n throw new Error(`HOLOSCRIPT_AGENT_SCOPE_TIER must be cold|warm|hot, got: ${t}`);\n}\n\nfunction stateFilePath(identity: AgentIdentity): string {\n const dir =\n process.env.HOLOSCRIPT_AGENT_STATE_DIR ?? join(homedir(), '.holoscript-agent', 'cost-state');\n return join(dir, `${identity.handle}.json`);\n}\n\nfunction auditLogPath(): string {\n return (\n process.env.HOLOSCRIPT_AGENT_AUDIT_LOG ??\n join(homedir(), '.holoscript-agent', 'audit', 'audit.jsonl')\n );\n}\n\nfunction buildAuditLog(): AuditLog | undefined {\n const enabled = (process.env.HOLOSCRIPT_AGENT_AUDIT_ENABLED ?? '1').toLowerCase();\n if (enabled === '0' || enabled === 'false') return undefined;\n return new AuditLog({ logPath: auditLogPath() });\n}\n\nfunction printHelp(): void {\n console.log(`holoscript-agent — headless agent runtime\n\nUSAGE\n holoscript-agent run start the daemon (heartbeat + claim + execute loop)\n holoscript-agent tick single tick, then exit (useful in CI / cron / smoke tests)\n holoscript-agent whoami verify identity tuple resolves end-to-end (/me + env)\n holoscript-agent ablate --spec=<path> run a cross-LLM ablation; spec = JSON with task + providers\n [--out-md=<path>] optional: write markdown ablation table\n [--out-json=<path>] optional: write structured JSON matrix\n holoscript-agent supervise --config=<path> run N agents from agents.json (multi-agent daemon)\n holoscript-agent status --config=<path> print parsed config summary (validates schema)\n holoscript-agent provision --handle=<name> provision a fresh x402 seat for a brain (dry-run by default)\n [--execute] actually generate wallet + register against production\n [--force] re-register a handle whose seat already exists (dangerous)\n holoscript-agent audit [rollup|query|tail] query the per-agent audit log (default sub: rollup)\n [--agent=<h>] filter by agent handle\n [--provider=<p>] filter by LLM provider\n [--task=<id>] filter by task id\n [--kind=<k>] filter by kind (task-executed | ablation-cell | ...)\n [--limit=<n>] keep last N events\n [--log=<path>] override log path (default ~/.holoscript-agent/audit/audit.jsonl)\n holoscript-agent help print this\n\nREQUIRED ENV\n HOLOSCRIPT_AGENT_HANDLE agent handle (e.g. \"security-auditor\")\n HOLOSCRIPT_AGENT_PROVIDER anthropic | openai | gemini | xai | openrouter | local-llm | sovereign | mock\n HOLOSCRIPT_AGENT_MODEL model id (e.g. \"claude-opus-4-8\")\n HOLOSCRIPT_AGENT_BRAIN path to .hsplus brain composition\n HOLOSCRIPT_AGENT_WALLET 0x… wallet address\n HOLOMESH_TEAM_ID target team id\n ANTHROPIC_API_KEY | OPENAI_API_KEY | GEMINI_API_KEY per provider\n\nOPTIONAL ENV\n HOLOSCRIPT_AGENT_X402_BEARER per-surface mesh bearer. OPTIONAL: when absent, the runner\n resolves it from the HoloKey broker by proving wallet\n ownership (POST /key/challenge → sign → /key/recover), so the\n bearer is never stored in plaintext .env. Requires a seat wallet.\n HOLOSCRIPT_AGENT_WALLET_PRIVATE_KEY raw 0x… private key (edge/sovereign devices without encrypted seat\n files — skips seat-wallet discovery entirely; bearer still required)\n HOLOSCRIPT_AGENT_SEAT_ID override the computed seat-dir name (e.g. a sovereign x402 seat\n \"sovereign-<surface>-<fp>-default-x402\"); pairs with SEATS_ROOT\n HOLOSCRIPT_AGENT_SEAT_MASTER_KEY override the master-key path used to decrypt the seat wallet.enc\n HOLOSCRIPT_AGENT_BUDGET_USD_DAY default 5\n HOLOSCRIPT_AGENT_SCOPE_TIER cold | warm | hot (default warm)\n HOLOSCRIPT_AGENT_TICK_MS daemon tick interval, default 60000\n HOLOSCRIPT_AGENT_STATE_DIR where to persist cost state (default ~/.holoscript-agent/cost-state)\n HOLOSCRIPT_AGENT_SURFACE label for handoffs / presence (default = handle)\n HOLOMESH_API_BASE default https://mcp.holoscript.net/api/holomesh\n HOLOSCRIPT_AGENT_COMMIT_RESPONSES \"1\" or \"true\" → write responses as memos and git-commit them\n HOLOSCRIPT_AGENT_OUTPUT_DIR memo output dir (rel to working dir, default \"agent-out\")\n HOLOSCRIPT_AGENT_WORKING_DIR git repo to commit into (default process.cwd())\n HOLOSCRIPT_AGENT_COMMIT_SCOPE commit subject scope (default \"agent(<handle>)\")\n HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL local-llm provider base URL (default http://localhost:8080)\n HOLOSCRIPT_AGENT_LOCAL_LLM_MODEL local-llm model id (e.g. \"qwen3:4b-instruct\"); overrides HOLOSCRIPT_AGENT_MODEL for the local provider\n HOLOSCRIPT_AGENT_LOCAL_LLM_TIMEOUT_MS local-llm request timeout in ms (default 300000 — edge devices like Jetson need >120s)\n HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH local JSONL path for sovereign private knowledge store (bypasses mcp-orchestrator /knowledge/sync)\n`);\n}\n\nmain().catch((err) => {\n console.error(\n JSON.stringify({\n ts: new Date().toISOString(),\n ev: 'fatal',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n process.exit(1);\n});\n","import type { LLMProviderName } from '@holoscript/llm-provider';\nimport type { AgentIdentity } from './types.js';\n\nconst VALID_PROVIDERS: ReadonlySet<LLMProviderName> = new Set([\n 'anthropic',\n 'openai',\n 'gemini',\n 'xai',\n 'openrouter',\n 'mock',\n 'bitnet',\n 'local-llm',\n]);\n\nexport function loadIdentity(env: NodeJS.ProcessEnv = process.env): AgentIdentity {\n const handle = required(env, 'HOLOSCRIPT_AGENT_HANDLE');\n const provider = required(env, 'HOLOSCRIPT_AGENT_PROVIDER');\n if (!VALID_PROVIDERS.has(provider as LLMProviderName)) {\n throw new Error(\n `HOLOSCRIPT_AGENT_PROVIDER=${provider} not in [${[...VALID_PROVIDERS].join(', ')}]`\n );\n }\n // Bearer is OPTIONAL: when absent, the runner resolves it from the HoloKey\n // broker by proving wallet ownership (bearer-broker.ts) — the edge holds only\n // its wallet, not a plaintext bearer in .env. cmdRun fails clearly if neither\n // an env bearer nor a resolvable seat wallet is available.\n const x402Bearer = (env.HOLOSCRIPT_AGENT_X402_BEARER ?? '').trim();\n const wallet = required(env, 'HOLOSCRIPT_AGENT_WALLET');\n if (!/^0x[0-9a-fA-F]{40}$/.test(wallet)) {\n throw new Error(`HOLOSCRIPT_AGENT_WALLET is not a 0x-prefixed 40-hex address: ${wallet}`);\n }\n const budgetRaw = env.HOLOSCRIPT_AGENT_BUDGET_USD_DAY ?? '5';\n const budget = Number(budgetRaw);\n if (!Number.isFinite(budget) || budget < 0) {\n throw new Error(\n `HOLOSCRIPT_AGENT_BUDGET_USD_DAY must be >= 0 (0 = unlimited), got ${budgetRaw}`\n );\n }\n\n return {\n handle,\n surface: env.HOLOSCRIPT_AGENT_SURFACE ?? handle,\n wallet,\n x402Bearer,\n llmProvider: provider as LLMProviderName,\n llmModel: required(env, 'HOLOSCRIPT_AGENT_MODEL'),\n brainPath: required(env, 'HOLOSCRIPT_AGENT_BRAIN'),\n budgetUsdPerDay: budget,\n teamId: required(env, 'HOLOMESH_TEAM_ID'),\n meshApiBase: env.HOLOMESH_API_BASE ?? 'https://mcp.holoscript.net/api/holomesh',\n };\n}\n\nfunction required(env: NodeJS.ProcessEnv, key: string): string {\n const v = env[key];\n if (!v || v.trim().length === 0) {\n throw new Error(`Missing required env var: ${key}`);\n }\n return v.trim();\n}\n\nexport function identityForLog(id: AgentIdentity): Record<string, string | number> {\n return {\n handle: id.handle,\n surface: id.surface,\n wallet: `${id.wallet.slice(0, 6)}…${id.wallet.slice(-4)}`,\n bearer: id.x402Bearer ? `${id.x402Bearer.slice(0, 6)}…` : '(broker-resolved)',\n provider: id.llmProvider,\n model: id.llmModel,\n brain: id.brainPath,\n budgetUsdPerDay: id.budgetUsdPerDay,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport type { OnTaskAction, RuntimeBrainConfig } from './types.js';\n\nexport async function loadBrain(\n brainPath: string,\n scopeTier: 'cold' | 'warm' | 'hot' = 'warm'\n): Promise<RuntimeBrainConfig> {\n const raw = await readFile(brainPath, 'utf8');\n const { domain, capabilityTags, requires, prefers, avoids } = extractIdentity(raw);\n // For .hsplus brains: the file begins with a free-text instruction block\n // (the actual system prompt for the LLM) followed by HoloScript structured\n // sections (#version, #target, identity {}, state {}, etc.). Sending the\n // full file bloats the context by ~1500+ tokens of metadata the LLM does\n // not need and — on constrained-context local models (qwen3:4b, num_ctx=2048)\n // — causes the CRITICAL tool-calling rules to be truncated before the model\n // sees them, resulting in plain-text replies with no tool calls.\n // Extract only the preamble: everything before the first HoloScript directive.\n const systemPrompt = extractSystemPromptPreamble(raw);\n return {\n brainPath,\n systemPrompt,\n capabilityTags,\n domain,\n scopeTier,\n requires,\n prefers,\n avoids,\n reflect: extractReflect(raw),\n onTaskActions: extractOnTaskActions(raw),\n };\n}\n\n/**\n * Extract the brain's `reflect` cognitive verb (W.736) if it declares one, e.g.\n * reflect { of: \"the produced artifact\", criteria: \"valid HoloScript\", escalate_on_fail: true }\n * Returns the evaluation criteria + whether a failed self-evaluation escalates to\n * the fleet (the `local_first` directive). Absent → undefined (no reflect gate).\n * Uses sliceNamedBlock so both `reflect {` and `reflect: {` forms parse, mirroring\n * identity. This is the one cognitive verb the lightweight runner can execute with\n * just its LLM provider (no engine/trait runtime) — recall/rag_query/plan need\n * trait-backed stores and run in the core/engine path, not here.\n */\nfunction extractReflect(brain: string): { criteria: string; escalateOnFail: boolean } | undefined {\n const block = sliceNamedBlock(brain, 'reflect');\n if (block === undefined) return undefined;\n const criteria =\n scalarField(block, 'criteria') ??\n scalarField(block, 'scorer') ??\n scalarField(block, 'of') ??\n 'correctness, completeness, and valid HoloScript syntax';\n const escRaw =\n scalarField(block, 'escalate_on_fail') ??\n scalarField(block, 'escalateOnFail') ??\n scalarField(block, 'escalate');\n // escRaw may be `true` or `true, nextField...` (unquoted scalar runs to the\n // segment end) — take the first comma-delimited token before comparing.\n return { criteria, escalateOnFail: (escRaw ?? '').split(',')[0].trim().toLowerCase() === 'true' };\n}\n\n/**\n * Extract the free-text instruction preamble from a .hsplus brain file.\n * Stops at the first line that begins a HoloScript structured section:\n * `#version`, `#target`, `#mode`, or a block keyword (`identity {`,\n * `state {`, `computed {`, `traits [`, `capabilities {`, `directives {`,\n * `behavior `). Falls back to the full file content for plain-text brains\n * (no HoloScript sections detected).\n */\nfunction extractSystemPromptPreamble(src: string): string {\n const lines = src.split('\\n');\n const BLOCK_START = /^(#version|#target|#mode|identity\\s*\\{|state\\s*\\{|computed\\s*\\{|traits\\s*\\[|capabilities\\s*\\{|directives\\s*\\{|behavior\\s)/;\n let cutLine = -1;\n for (let i = 0; i < lines.length; i++) {\n if (BLOCK_START.test(lines[i].trim())) {\n cutLine = i;\n break;\n }\n }\n if (cutLine <= 0) return src; // no HoloScript sections — whole file is prompt\n return lines.slice(0, cutLine).join('\\n').trimEnd();\n}\n\nfunction extractIdentity(brain: string): {\n domain: string;\n capabilityTags: string[];\n requires: string[];\n prefers: string[];\n avoids: string[];\n} {\n const identityBlock = sliceNamedBlock(brain, 'identity');\n if (!identityBlock) {\n // No identity block — open routing (backward-compatible default).\n // Brains without explicit requires/prefers/avoids match any provider.\n return { domain: 'unknown', capabilityTags: [], requires: [], prefers: [], avoids: [] };\n }\n const domain = scalarField(identityBlock, 'domain') ?? 'unknown';\n const capabilityTags = listField(identityBlock, 'capability_tags') ?? [];\n // Universal+segregated routing fields (founder ruling 2026-05-06): brains\n // declare capability requirements as data; router matches against the\n // provider's `capabilities` manifest at session start. Empty (omitted) =\n // open routing — preserves today's behavior for unmigrated brains.\n const requires = listField(identityBlock, 'requires') ?? [];\n const prefers = listField(identityBlock, 'prefers') ?? [];\n const avoids = listField(identityBlock, 'avoids') ?? [];\n return { domain, capabilityTags, requires, prefers, avoids };\n}\n\n/**\n * Parse the `behavior on_task { … }` block into an ordered sequence of\n * cognitive verb calls (Phase 2.1). Each verb's config is extracted with a\n * lightweight regex KV parser — no full parser dependency. Only verbs whose\n * keys match known cognitive verbs are included; unknown keywords are skipped.\n *\n * Currently wired in AgentRunner: `llm_call` (prompt augmentation) and\n * `reflect` (extracted separately by extractReflect via sliceNamedBlock).\n * Future verbs (`recall`, `rag_query`, `plan`) are parsed so they appear in\n * the returned sequence but are logged-and-deferred by the runner until\n * Phase 2.2 (trait-backed stores, see idea-seeds.md).\n */\nfunction extractOnTaskActions(brain: string): OnTaskAction[] {\n // `sliceNamedBlock` with 'on_task' matches `on_task {` inside `behavior on_task {`\n const block = sliceNamedBlock(brain, 'on_task');\n if (!block) return [];\n\n const VERBS: OnTaskAction['verb'][] = ['recall', 'rag_query', 'llm_call', 'plan', 'reflect'];\n const entries: Array<OnTaskAction & { _pos: number }> = [];\n\n for (const verb of VERBS) {\n const re = new RegExp(`\\\\b${verb}\\\\s*\\\\{`, 'g');\n let m: RegExpExecArray | null;\n while ((m = re.exec(block)) !== null) {\n const start = m.index + m[0].length;\n let depth = 1;\n let end = -1;\n for (let i = start; i < block.length; i++) {\n if (block[i] === '{') depth++;\n else if (block[i] === '}') {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end < 0) continue;\n entries.push({ verb, config: parseKVBlock(block.slice(start, end)), _pos: m.index });\n }\n }\n\n // Sort by authored position so verbs execute in the order the brain declared them.\n return entries.sort((a, b) => a._pos - b._pos).map(({ _pos: _ignored, ...rest }) => rest);\n}\n\n/** Lightweight key-value extractor for cognitive verb config blocks. */\nfunction parseKVBlock(block: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n // String: key: \"value\"\n const strRe = /\\b(\\w+)\\s*:\\s*\"([^\"]*)\"/g;\n let m: RegExpExecArray | null;\n while ((m = strRe.exec(block)) !== null) out[m[1]] = m[2];\n // Array: key: [\"a\", \"b\"] — must run before bool/num to claim the array form of limit etc.\n const arrRe = /\\b(\\w+)\\s*:\\s*\\[([^\\]]*)\\]/g;\n while ((m = arrRe.exec(block)) !== null) {\n out[m[1]] = m[2]\n .split(',')\n .map((s) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter((s) => s.length > 0);\n }\n // Boolean: key: true | false (only when not already set by string/array)\n const boolRe = /\\b(\\w+)\\s*:\\s*(true|false)\\b/g;\n while ((m = boolRe.exec(block)) !== null) {\n if (!(m[1] in out)) out[m[1]] = m[2] === 'true';\n }\n // Number: key: 123 or key: -0.5 (only when not already set)\n const numRe = /\\b(\\w+)\\s*:\\s*(-?\\d+(?:\\.\\d+)?)\\b/g;\n while ((m = numRe.exec(block)) !== null) {\n if (!(m[1] in out)) out[m[1]] = parseFloat(m[2]);\n }\n return out;\n}\n\nfunction sliceNamedBlock(src: string, name: string): string | undefined {\n // Accept both `identity {` and `identity: {` — brain compositions in\n // .ai-ecosystem use both forms (lean-theorist + antigravity-hot use the\n // colon variant; security-auditor + others use the bare form). Without\n // both-form tolerance the colon-form brains parse to empty\n // capability_tags, breaking task scoring entirely (silent claim-blackhole\n // observed 2026-04-25 on W01 H200 lean-theorist).\n const re = new RegExp(`\\\\b${name}\\\\s*:?\\\\s*\\\\{`, 'g');\n const match = re.exec(src);\n if (!match) return undefined;\n const headerEnd = match.index + match[0].length; // position just past the `{`\n let depth = 1;\n for (let i = headerEnd; i < src.length; i++) {\n const ch = src[i];\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) return src.slice(headerEnd, i);\n }\n }\n return undefined;\n}\n\nfunction scalarField(block: string, key: string): string | undefined {\n const idx = block.indexOf(`${key}:`);\n if (idx < 0) return undefined;\n const after = block.slice(idx + key.length + 1).trimStart();\n if (after.startsWith('\"')) {\n const end = after.indexOf('\"', 1);\n if (end > 0) return after.slice(1, end);\n }\n const eol = after.indexOf('\\n');\n return after.slice(0, eol < 0 ? undefined : eol).trim();\n}\n\nfunction listField(block: string, key: string): string[] | undefined {\n const idx = block.indexOf(`${key}:`);\n if (idx < 0) return undefined;\n const after = block.slice(idx + key.length + 1).trimStart();\n if (!after.startsWith('[')) return undefined;\n let depth = 0;\n let end = -1;\n for (let i = 0; i < after.length; i++) {\n if (after[i] === '[') depth++;\n else if (after[i] === ']') {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end < 0) return undefined;\n const inner = after.slice(1, end);\n return inner\n .split(',')\n .map((s) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter((s) => s.length > 0);\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { TokenUsage } from '@holoscript/llm-provider';\nimport type { CostState, ModelPricer } from './types.js';\n\nexport const ANTHROPIC_PRICING_USD_PER_MTOK: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-8': { input: 10, output: 50 }, // 3× cheaper than 4.7 on total cost; A-020 2026-06-08\n 'claude-opus-4-7': { input: 5, output: 25 },\n 'claude-opus-4-6': { input: 5, output: 25 },\n 'claude-sonnet-4-6': { input: 3, output: 15 },\n 'claude-haiku-4-5-20251001': { input: 1, output: 5 },\n 'claude-haiku-4-5': { input: 1, output: 5 },\n};\n\nexport function defaultAnthropicPricer(model: string, usage: TokenUsage): number {\n const price = ANTHROPIC_PRICING_USD_PER_MTOK[model];\n if (!price) {\n throw new Error(\n `No pricing configured for model \"${model}\" — add to ANTHROPIC_PRICING_USD_PER_MTOK or pass a custom pricer`\n );\n }\n return (usage.promptTokens * price.input + usage.completionTokens * price.output) / 1_000_000;\n}\n\n/**\n * Pricer for local-llm providers (vLLM-on-GPU). The compute cost is the\n * Vast.ai (or other GPU) hourly rental, NOT per-token. From the agent's\n * perspective each LLM call has $0 marginal cost — the budget guard for\n * local-llm should track tick count or wall-clock time, not tokens.\n *\n * Returns 0 unconditionally. Token counts are still recorded in CostState\n * so usage analytics work, but cost-guard never trips on token spend.\n */\nexport function defaultLocalLlmPricer(_model: string, _usage: TokenUsage): number {\n return 0;\n}\n\n// xAI / Grok pricing — populated by /research task task_1778109552044_qed8.\n// Empty until verified pricing lands. defaultXAIPricer throws on missing\n// model with a helpful pointer (matches defaultAnthropicPricer behavior).\n// Never paste training-era pricing here — F.014 / W.GOLD.341.\nexport const XAI_PRICING_USD_PER_MTOK: Record<string, { input: number; output: number }> = {};\n\nexport function defaultXAIPricer(model: string, usage: TokenUsage): number {\n const price = XAI_PRICING_USD_PER_MTOK[model];\n if (!price) {\n throw new Error(\n `No xAI pricing configured for model \"${model}\" — populate XAI_PRICING_USD_PER_MTOK ` +\n `(see /research task_1778109552044_qed8 in docs/LLM_CAPABILITIES.md) or pass a custom pricer`\n );\n }\n return (usage.promptTokens * price.input + usage.completionTokens * price.output) / 1_000_000;\n}\n\n// OpenRouter pricing is per-model and varies by upstream — populated lazily.\n// Empty until verified pricing lands.\nexport const OPENROUTER_PRICING_USD_PER_MTOK: Record<string, { input: number; output: number }> =\n {};\n\nexport function defaultOpenRouterPricer(model: string, usage: TokenUsage): number {\n const price = OPENROUTER_PRICING_USD_PER_MTOK[model];\n if (!price) {\n throw new Error(\n `No OpenRouter pricing configured for model \"${model}\" — populate OPENROUTER_PRICING_USD_PER_MTOK ` +\n `or pass a custom pricer`\n );\n }\n return (usage.promptTokens * price.input + usage.completionTokens * price.output) / 1_000_000;\n}\n\n/**\n * Provider-aware default pricer dispatch. Picks the right pricer by\n * provider so the holoscript-agent runtime works for both Anthropic\n * (per-token billing) and local-llm (compute already paid via GPU\n * rental) without a custom pricer at every call site.\n *\n * Refs: 2026-04-26 mw02 boot loop — local-llm workers tick-erroring with\n * \"No pricing configured for model 'Qwen/Qwen2.5-0.5B-Instruct'\" because\n * defaultAnthropicPricer was wired in for ALL providers regardless of\n * which LLM the agent uses.\n *\n * Known gap (separate task): non-Anthropic non-local providers (openai,\n * gemini) still fall through to defaultAnthropicPricer here. xai +\n * openrouter were added 2026-05-06 with explicit dispatch + empty\n * pricing dicts (Lane A — see docs/LLM_CAPABILITIES.md).\n */\nexport function defaultPricerForProvider(\n provider: 'anthropic' | 'local-llm' | 'openai' | 'xai' | 'openrouter' | string\n): ModelPricer {\n if (provider === 'local-llm' || provider === 'mock') return defaultLocalLlmPricer;\n if (provider === 'xai') return defaultXAIPricer;\n if (provider === 'openrouter') return defaultOpenRouterPricer;\n return defaultAnthropicPricer;\n}\n\nexport class CostGuard {\n private state: CostState;\n private readonly statePath: string;\n private readonly dailyBudgetUsd: number;\n private readonly pricer: ModelPricer;\n\n constructor(opts: { statePath: string; dailyBudgetUsd: number; pricer?: ModelPricer }) {\n this.statePath = opts.statePath;\n this.dailyBudgetUsd = opts.dailyBudgetUsd;\n this.pricer = opts.pricer ?? defaultAnthropicPricer;\n this.state = this.loadOrInit();\n }\n\n recordUsage(\n model: string,\n usage: TokenUsage\n ): { costUsd: number; spentUsd: number; remainingUsd: number } {\n this.rolloverIfNewDay();\n const costUsd = this.pricer(model, usage);\n this.state.spentUsd += costUsd;\n this.state.promptTokens += usage.promptTokens;\n this.state.completionTokens += usage.completionTokens;\n this.state.callCount += 1;\n this.persist();\n return {\n costUsd,\n spentUsd: this.state.spentUsd,\n remainingUsd: Math.max(0, this.dailyBudgetUsd - this.state.spentUsd),\n };\n }\n\n isOverBudget(): boolean {\n if (this.dailyBudgetUsd === 0) return false;\n this.rolloverIfNewDay();\n return this.state.spentUsd >= this.dailyBudgetUsd;\n }\n\n getRemainingUsd(): number {\n if (this.dailyBudgetUsd === 0) return Number.POSITIVE_INFINITY;\n this.rolloverIfNewDay();\n return Math.max(0, this.dailyBudgetUsd - this.state.spentUsd);\n }\n\n getState(): Readonly<CostState> {\n this.rolloverIfNewDay();\n return { ...this.state };\n }\n\n private rolloverIfNewDay(): void {\n const today = todayUtc();\n if (this.state.date !== today) {\n this.state = { date: today, spentUsd: 0, promptTokens: 0, completionTokens: 0, callCount: 0 };\n this.persist();\n }\n }\n\n private loadOrInit(): CostState {\n if (existsSync(this.statePath)) {\n const raw = readFileSync(this.statePath, 'utf8');\n const parsed = JSON.parse(raw) as CostState;\n if (parsed.date === todayUtc()) return parsed;\n }\n return { date: todayUtc(), spentUsd: 0, promptTokens: 0, completionTokens: 0, callCount: 0 };\n }\n\n private persist(): void {\n mkdirSync(dirname(this.statePath), { recursive: true });\n writeFileSync(this.statePath, JSON.stringify(this.state, null, 2), 'utf8');\n }\n}\n\nfunction todayUtc(): string {\n return new Date().toISOString().slice(0, 10);\n}\n","/**\n * Capability-aware provider router (Lane 3 Phase 4b)\n *\n * Pure function `pickProvider({brain, envOverride, candidates})` that picks\n * an LLM provider for a brain at session start based on:\n * 1. The brain's `requires` / `prefers` / `avoids` capability arrays\n * (declared in the `.hsplus` identity block — Phase 2).\n * 2. Each registered provider's `Capabilities` manifest (declared as\n * `<NAME>_CAPABILITIES` exports per adapter — Phase 4a).\n * 3. The `HOLOSCRIPT_AGENT_PROVIDER` env override.\n *\n * Per founder ruling 2026-05-06 (universal+segregated foundation, path b\n * backward-compatible):\n * - Brains declare needs as data; router does set arithmetic.\n * - `HOLOSCRIPT_AGENT_PROVIDER` env becomes OVERRIDE, not source-of-truth.\n * - Brains without `requires` get implicit empty arrays = open routing\n * (matches today's behavior — backward-compat preserved).\n *\n * Override semantics: an env-set provider always wins among satisfying\n * candidates. If env is set but doesn't satisfy a `requires` entry, the\n * router still picks env (founder said \"override\") but reports the\n * mismatch via `reason: 'env-override-mismatch'` + `unsatisfiedRequires`.\n * Callers can decide to abort or proceed.\n *\n * Pure function — no I/O, no logging, no env reads. The caller injects\n * `envOverride` from `HOLOSCRIPT_AGENT_PROVIDER` (or `AgentSpec.provider`\n * in the supervisor path) and consumes the `RoutingDecision` to construct\n * the actual provider via the existing factory pattern.\n */\n\nimport type { Capabilities, LLMProviderName } from '@holoscript/llm-provider';\nimport {\n ANTHROPIC_CAPABILITIES,\n OPENAI_CAPABILITIES,\n GEMINI_CAPABILITIES,\n XAI_CAPABILITIES,\n OPENROUTER_CAPABILITIES,\n LOCAL_LLM_CAPABILITIES,\n BITNET_CAPABILITIES,\n MOCK_CAPABILITIES,\n} from '@holoscript/llm-provider';\n\nexport interface BrainRequirements {\n /** Capability keys the brain MUST have. Empty = open routing. */\n requires: string[];\n /** Capability keys the brain prefers. Used for tie-breaking. */\n prefers: string[];\n /** Capability keys the brain explicitly excludes. */\n avoids: string[];\n}\n\nexport interface RoutingCandidate {\n name: LLMProviderName;\n capabilities: Capabilities;\n}\n\nexport type RoutingReason =\n /** Brain has no requires; env was honored. Today's behavior. */\n | 'env-override-no-requirements'\n /** Brain has requires; env satisfies them. Env wins among satisfying candidates. */\n | 'env-override-satisfies'\n /** Brain has requires; env doesn't satisfy. Env still picked (founder ruling), mismatch flagged. */\n | 'env-override-mismatch'\n /** Env unset; picked by capability match (most prefers wins, tie-breaker order). */\n | 'capability-best-fit'\n /** Brain has no requires AND no env; picked first candidate by tie-breaker order. */\n | 'open-routing-default';\n\nexport interface RoutingDecision {\n picked: LLMProviderName;\n reason: RoutingReason;\n /** Empty unless `reason === 'env-override-mismatch'` — capability keys env doesn't satisfy. */\n unsatisfiedRequires: string[];\n /** Capability keys the picked provider satisfies from the brain's `prefers` list. */\n matchedPrefers: string[];\n /** Provider names excluded because their capabilities matched any `avoids` entry. */\n excludedByAvoids: LLMProviderName[];\n /** Other candidates that also satisfied `requires` (sorted by prefers descending). */\n alternatives: LLMProviderName[];\n}\n\nexport class NoEligibleProviderError extends Error {\n constructor(\n public readonly requires: readonly string[],\n public readonly avoids: readonly string[],\n public readonly considered: readonly LLMProviderName[],\n public readonly excludedByAvoids: readonly LLMProviderName[]\n ) {\n super(\n `No provider satisfies brain requires=[${requires.join(', ')}] avoids=[${avoids.join(', ')}]. ` +\n `Considered: [${considered.join(', ')}]. ` +\n `Excluded by avoids: [${excludedByAvoids.join(', ')}].`\n );\n this.name = 'NoEligibleProviderError';\n }\n}\n\n/**\n * Returns true if the capability key is declared truthy on the manifest.\n * Boolean fields: returns the boolean value. Numeric fields: returns true\n * if > 0 (used for `contextWindow` / `maxOutput` declarations). Undefined:\n * returns false (capability not declared). String/object fields are\n * meaningless for routing keys and return false.\n */\nfunction satisfies(capabilities: Capabilities, key: string): boolean {\n const value = (capabilities as unknown as Record<string, unknown>)[key];\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value > 0;\n return false;\n}\n\nfunction countMatches(capabilities: Capabilities, keys: readonly string[]): number {\n let count = 0;\n for (const key of keys) {\n if (satisfies(capabilities, key)) count++;\n }\n return count;\n}\n\nfunction unsatisfiedKeys(capabilities: Capabilities, keys: readonly string[]): string[] {\n return keys.filter((key) => !satisfies(capabilities, key));\n}\n\n/**\n * Pick a provider for a brain. Pure function — see module doc-comment for\n * the routing algorithm.\n */\nexport function pickProvider(opts: {\n brain: BrainRequirements;\n envOverride?: LLMProviderName;\n candidates: RoutingCandidate[];\n /**\n * Tie-breaker order when multiple candidates have equal `prefers` match\n * counts. Defaults to insertion order of `candidates`. Useful for the\n * supervisor to express \"prefer Anthropic over Gemini at equal capability.\"\n */\n tieBreakerOrder?: readonly LLMProviderName[];\n}): RoutingDecision {\n const { brain, envOverride, candidates } = opts;\n const tieBreaker = opts.tieBreakerOrder ?? candidates.map((c) => c.name);\n\n if (candidates.length === 0) {\n throw new Error('pickProvider: no candidates supplied');\n }\n\n // Identify avoids-excluded candidates first (used in error reporting + filtering)\n const excludedByAvoids: LLMProviderName[] = [];\n const notAvoided: RoutingCandidate[] = [];\n for (const candidate of candidates) {\n const matchesAvoid = brain.avoids.some((a) => satisfies(candidate.capabilities, a));\n if (matchesAvoid) {\n excludedByAvoids.push(candidate.name);\n } else {\n notAvoided.push(candidate);\n }\n }\n\n // ─── Open routing path (no requires) ────────────────────────────────\n if (brain.requires.length === 0) {\n if (envOverride !== undefined) {\n // Env honored. Note: avoids are advisory in open-routing mode\n // (today's behavior is \"env wins\"); we still record the mismatch.\n const envCandidate = candidates.find((c) => c.name === envOverride);\n const matchedPrefers = envCandidate\n ? brain.prefers.filter((p) => satisfies(envCandidate.capabilities, p))\n : [];\n return {\n picked: envOverride,\n reason: 'env-override-no-requirements',\n unsatisfiedRequires: [],\n matchedPrefers,\n excludedByAvoids,\n alternatives: candidates.filter((c) => c.name !== envOverride).map((c) => c.name),\n };\n }\n // No env, no requires — pick first candidate by tie-breaker order\n const ordered = orderCandidates(notAvoided, tieBreaker);\n if (ordered.length === 0) {\n // All candidates avoided — fall back to first overall (avoids are\n // advisory without requires; otherwise we'd starve the agent)\n return {\n picked: candidates[0]!.name,\n reason: 'open-routing-default',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(candidates[0]!.capabilities, p)),\n excludedByAvoids,\n alternatives: candidates.slice(1).map((c) => c.name),\n };\n }\n return {\n picked: ordered[0]!.name,\n reason: 'open-routing-default',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(ordered[0]!.capabilities, p)),\n excludedByAvoids,\n alternatives: ordered.slice(1).map((c) => c.name),\n };\n }\n\n // ─── Capability-aware path (has requires) ──────────────────────────\n // Filter to candidates that satisfy ALL requires (and aren't avoided)\n const eligible = notAvoided.filter(\n (c) => unsatisfiedKeys(c.capabilities, brain.requires).length === 0\n );\n\n if (eligible.length === 0) {\n // No candidate satisfies. If env is set, founder ruling says env\n // overrides — pick env, flag mismatch, list unsatisfied requires.\n if (envOverride !== undefined) {\n const envCandidate = candidates.find((c) => c.name === envOverride);\n const unsatisfied = envCandidate\n ? unsatisfiedKeys(envCandidate.capabilities, brain.requires)\n : brain.requires.slice();\n const matchedPrefers = envCandidate\n ? brain.prefers.filter((p) => satisfies(envCandidate.capabilities, p))\n : [];\n return {\n picked: envOverride,\n reason: 'env-override-mismatch',\n unsatisfiedRequires: unsatisfied,\n matchedPrefers,\n excludedByAvoids,\n alternatives: [],\n };\n }\n // No env, no eligible candidate — fail fast\n throw new NoEligibleProviderError(\n brain.requires,\n brain.avoids,\n candidates.map((c) => c.name),\n excludedByAvoids\n );\n }\n\n // Sort eligible by prefers count descending, tie-break by tieBreakerOrder\n const ranked = [...eligible].sort((a, b) => {\n const aMatches = countMatches(a.capabilities, brain.prefers);\n const bMatches = countMatches(b.capabilities, brain.prefers);\n if (aMatches !== bMatches) return bMatches - aMatches; // higher first\n const aIdx = tieBreaker.indexOf(a.name);\n const bIdx = tieBreaker.indexOf(b.name);\n // Names not in tie-breaker order go to the end\n const aRank = aIdx === -1 ? Number.MAX_SAFE_INTEGER : aIdx;\n const bRank = bIdx === -1 ? Number.MAX_SAFE_INTEGER : bIdx;\n return aRank - bRank;\n });\n\n // Env override wins among eligible candidates\n if (envOverride !== undefined) {\n const envEligible = ranked.find((c) => c.name === envOverride);\n if (envEligible) {\n return {\n picked: envOverride,\n reason: 'env-override-satisfies',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(envEligible.capabilities, p)),\n excludedByAvoids,\n alternatives: ranked.filter((c) => c.name !== envOverride).map((c) => c.name),\n };\n }\n // Env set but not eligible (e.g. excluded by avoids, or unknown name).\n // Founder ruling: env overrides — pick env, flag mismatch.\n const envCandidate = candidates.find((c) => c.name === envOverride);\n const unsatisfied = envCandidate\n ? unsatisfiedKeys(envCandidate.capabilities, brain.requires)\n : brain.requires.slice();\n return {\n picked: envOverride,\n reason: 'env-override-mismatch',\n unsatisfiedRequires: unsatisfied,\n matchedPrefers: envCandidate\n ? brain.prefers.filter((p) => satisfies(envCandidate.capabilities, p))\n : [],\n excludedByAvoids,\n alternatives: ranked.map((c) => c.name),\n };\n }\n\n // No env — pick the highest-ranked eligible\n const top = ranked[0]!;\n return {\n picked: top.name,\n reason: 'capability-best-fit',\n unsatisfiedRequires: [],\n matchedPrefers: brain.prefers.filter((p) => satisfies(top.capabilities, p)),\n excludedByAvoids,\n alternatives: ranked.slice(1).map((c) => c.name),\n };\n}\n\n/**\n * Default candidate list — every adapter that ships with `@holoscript/llm-provider`.\n * Suppliers can pass their own subset to `pickProvider` (e.g. supervisor\n * limits to only the providers it has API keys for, or test code uses\n * a synthetic candidate list).\n */\nexport const BUILT_IN_CANDIDATES: RoutingCandidate[] = [\n { name: 'anthropic', capabilities: ANTHROPIC_CAPABILITIES },\n { name: 'openai', capabilities: OPENAI_CAPABILITIES },\n { name: 'gemini', capabilities: GEMINI_CAPABILITIES },\n { name: 'xai', capabilities: XAI_CAPABILITIES },\n { name: 'openrouter', capabilities: OPENROUTER_CAPABILITIES },\n { name: 'local-llm', capabilities: LOCAL_LLM_CAPABILITIES },\n { name: 'bitnet', capabilities: BITNET_CAPABILITIES },\n { name: 'mock', capabilities: MOCK_CAPABILITIES },\n];\n\nfunction orderCandidates(\n candidates: readonly RoutingCandidate[],\n tieBreaker: readonly LLMProviderName[]\n): RoutingCandidate[] {\n return [...candidates].sort((a, b) => {\n const aIdx = tieBreaker.indexOf(a.name);\n const bIdx = tieBreaker.indexOf(b.name);\n const aRank = aIdx === -1 ? Number.MAX_SAFE_INTEGER : aIdx;\n const bRank = bIdx === -1 ? Number.MAX_SAFE_INTEGER : bIdx;\n return aRank - bRank;\n });\n}\n","import { readFile, appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { BoardTask } from './types.js';\nimport type { CaelAuditRecord } from './cael-builder.js';\n\n/** Wraps a request body in a signed envelope for strict-mode endpoints (e.g. /team/:id/join). */\nexport type RequestSigner = (\n body: Record<string, unknown>\n) => Promise<Record<string, unknown>>;\n\nexport interface HolomeshClientOptions {\n apiBase: string;\n bearer: string;\n teamId: string;\n fetchImpl?: typeof fetch;\n /** EIP-191 signing function. When present, used on strict endpoints like joinTeam(). */\n signer?: RequestSigner;\n /**\n * Local JSONL path for private knowledge (sovereign edge store).\n * When set, writePrivateKnowledge appends to this file and queryPrivateKnowledge\n * reads from it instead of routing through the remote orchestrator.\n * Bypasses the mcp-orchestrator /knowledge/sync 401 gap for edge nodes.\n * Set via HOLOSCRIPT_AGENT_LOCAL_KNOWLEDGE_PATH env var (index.ts).\n */\n localKnowledgePath?: string;\n}\n\nexport interface TeamMessage {\n id: string;\n fromAgentId: string;\n fromAgentName: string;\n content: string;\n messageType: string;\n createdAt: string;\n}\n\n/** Minimal knowledge-entry shape returned by the mesh knowledge endpoints. */\nexport interface KnowledgeEntry {\n id: string;\n content: string;\n domain?: string;\n type?: string;\n createdAt?: string;\n}\n\nexport class HolomeshClient {\n private readonly apiBase: string;\n private readonly bearer: string;\n private readonly teamId: string;\n private readonly fetchImpl: typeof fetch;\n private readonly signer?: RequestSigner;\n private readonly localKnowledgePath?: string;\n\n constructor(opts: HolomeshClientOptions) {\n this.apiBase = opts.apiBase.replace(/\\/$/, '');\n this.bearer = opts.bearer;\n this.teamId = opts.teamId;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.signer = opts.signer;\n this.localKnowledgePath = opts.localKnowledgePath;\n }\n\n /** Wrap body in a signed envelope when a signer is available (strict-mode endpoints). */\n private async signBody(body: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.signer ? await this.signer(body) : body;\n }\n\n async heartbeat(payload: { agentName: string; surface: string; capabilityTags?: string[] }): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/presence`, await this.signBody(payload as Record<string, unknown>));\n }\n\n async getOpenTasks(): Promise<BoardTask[]> {\n const data = await this.req<{ tasks?: BoardTask[]; open?: BoardTask[] }>(\n 'GET',\n `/team/${this.teamId}/board`\n );\n return data.tasks ?? data.open ?? [];\n }\n\n async claim(taskId: string): Promise<BoardTask> {\n return this.req<BoardTask>('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'claim' }));\n }\n\n async joinTeam(): Promise<{ success: boolean; role?: string; members?: number }> {\n return this.req<{ success: boolean; role?: string; members?: number }>(\n 'POST',\n `/team/${this.teamId}/join`,\n await this.signBody({})\n );\n }\n\n async sendMessageOnTask(taskId: string, body: string): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/message`, await this.signBody({\n to: 'team',\n subject: `task:${taskId}`,\n content: body,\n }));\n }\n\n async markDone(taskId: string, summary: string, commitHash?: string): Promise<void> {\n await this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({\n action: 'done',\n summary,\n // verification_evidence required by server before task can be closed.\n verification_evidence: summary,\n // Exclude commitHash when undefined — JSON.stringify drops undefined but\n // canonicalizeSigning preserves it as the literal string \"undefined\",\n // causing a signature-mismatch vs what the server sees after JSON.parse.\n ...(commitHash !== undefined ? { commitHash } : {}),\n }));\n }\n\n // POST CAEL audit records for this agent. Server validator at\n // packages/mcp-server/src/holomesh/routes/core-routes.ts:472-533 requires\n // bearer == handle owner OR founder; the per-surface x402 bearer is the\n // handle owner so this resolves correctly. Records that fail shape\n // validation (layer_hashes != 7 elements, missing tick_iso/operation/\n // fnv1a_chain) are silently dropped server-side, not rejected as a batch.\n async postAuditRecords(\n handle: string,\n records: CaelAuditRecord[]\n ): Promise<{ appended: number; rejected: number }> {\n // Audit endpoint uses bearer-only auth — no signed envelope wrapper.\n return this.req<{ appended: number; rejected: number }>(\n 'POST',\n `/agent/${encodeURIComponent(handle)}/audit`,\n { records } as unknown as Record<string, unknown>\n );\n }\n\n async whoAmI(): Promise<{ agentId: string; surface: string; wallet?: string }> {\n // GET /api/holomesh/me returns { agentId, name, wallet, isFounder, teamId, teams, permissions }\n // (see packages/mcp-server/src/holomesh/routes/core-routes.ts §/me handler).\n // It does NOT return a `surface` field — derive it from the seat name on the\n // client side. Seat naming convention (set by the provisioning admin path):\n // claudecode-claude-x402 → claude-code\n // cursor-claude-x402 → claude-cursor\n // gemini-antigravity → gemini-antigravity\n // copilot-vscode → copilot-vscode\n // Founder → unknown (shared key, no surface attribution)\n const raw = await this.req<{\n agentId: string;\n name?: string;\n wallet?: string;\n }>('GET', '/me');\n return {\n agentId: raw.agentId,\n surface: deriveSurface(raw.name),\n wallet: raw.wallet,\n };\n }\n\n // ── Team Message Surface (E4 delegated-authority protocol) ───────────────────\n\n /** Read recent team messages. */\n async getTeamMessages(limit = 20): Promise<TeamMessage[]> {\n const data = await this.req<{ messages?: TeamMessage[]; success?: boolean }>(\n 'GET',\n `/team/${this.teamId}/messages?limit=${limit}`\n );\n return data.messages ?? [];\n }\n\n /** Post a message to the team feed. */\n async sendTeamMessage(content: string, messageType = 'text'): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/message`, await this.signBody({ content, type: messageType }));\n }\n\n // ── Owner-op API wrappers (E4) ─────────────────────────────────────────────\n\n /** Switch team mode. Requires owner or founder role. */\n async setTeamMode(mode: string, reason?: string): Promise<{ mode: string; unchanged?: boolean }> {\n return this.req('POST', `/team/${this.teamId}/mode`, await this.signBody({ mode, reason } as Record<string, unknown>));\n }\n\n /** Update room preferences. Requires config:write permission. */\n async patchRoomPrefs(prefs: { communicationStyle?: string; objective?: string }): Promise<{\n communicationStyle: string;\n objective: string;\n }> {\n return this.req('PATCH', `/team/${this.teamId}/room`, await this.signBody(prefs as Record<string, unknown>));\n }\n\n /** Update a board task. */\n async updateTask(\n taskId: string,\n updates: {\n title?: string;\n description?: string;\n priority?: number;\n tags?: string[];\n }\n ): Promise<unknown> {\n return this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'update', ...updates } as Record<string, unknown>));\n }\n\n /** Delete a board task. */\n async deleteTask(taskId: string): Promise<unknown> {\n return this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'delete' }));\n }\n\n /** Delegate a board task to another agent. */\n async delegateTask(taskId: string, toAgentId: string): Promise<unknown> {\n return this.req('PATCH', `/team/${this.teamId}/board/${taskId}`, await this.signBody({ action: 'delegate', toAgentId }));\n }\n\n /** Add new tasks to the board (used by the delegate_task tool to spawn sub-work). */\n async addTasks(\n tasks: Array<{ title: string; description?: string; priority?: number; source?: string; role?: string; tags?: string[] }>\n ): Promise<{ added: number }> {\n const result = await this.req<{ added?: number }>('POST', `/team/${this.teamId}/board`, await this.signBody({ tasks } as Record<string, unknown>));\n return { added: result.added ?? tasks.length };\n }\n\n // ── Cognitive-verb knowledge surface (Phase 2.2 — recall / rag_query) ────────\n\n /**\n * Query the TEAM knowledge base (the `rag_query` cognitive verb). Bearer-only\n * GET; `q` is the server-side search filter. Returns [] on any failure so a\n * retrieval miss never breaks a tick.\n */\n async queryTeamKnowledge(query: string, limit = 5): Promise<KnowledgeEntry[]> {\n const qs = new URLSearchParams({ q: query, limit: String(limit) }).toString();\n try {\n const data = await this.req<{ entries?: KnowledgeEntry[] }>(\n 'GET',\n `/team/${this.teamId}/knowledge?${qs}`\n );\n return data.entries ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Query this agent's PRIVATE workspace knowledge (the `recall` cognitive verb).\n * The endpoint has no server-side search param, so the caller filters by query\n * client-side. Returns [] on any failure.\n */\n async queryPrivateKnowledge(): Promise<KnowledgeEntry[]> {\n if (this.localKnowledgePath) {\n try {\n const raw = await readFile(this.localKnowledgePath, 'utf8');\n return raw.trim().split('\\n').filter(Boolean).map(l => JSON.parse(l) as KnowledgeEntry);\n } catch {\n return [];\n }\n }\n try {\n const data = await this.req<{ entries?: KnowledgeEntry[] }>('GET', `/knowledge/private`);\n return data.entries ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * Persist facts to this agent's PRIVATE workspace — the WRITE side of `recall`\n * (POST /knowledge/private). The server stamps id / workspaceId (`private:<wallet>`)\n * / author / timestamps; the caller supplies `content` (+ optional type/tags/title).\n * This is what gives `recall` something to recall: without it the private store\n * stays empty and every `recall` returns [] (the W.752 loop-gap). Best-effort —\n * returns false on any failure so a write miss never breaks a tick (the task is\n * already done by the time this runs).\n */\n /**\n * Query the server-side in-process codebase GraphRAG index via the mesh bearer-gated\n * route (POST /api/holomesh/codebase/search). Called by the `rag_query` cognitive verb\n * (Phase 2.3 W.753) so edge agents can reach HoloEmbed semantic search without a direct\n * Absorb-service dep. Returns [] (not an error) when the graph isn't loaded yet — the\n * caller falls back to team-knowledge search.\n *\n * @param query Natural-language search string.\n * @param topK Max results to return (1–20, server-capped).\n */\n async queryCodebase(query: string, topK = 8): Promise<Array<{ name: string; file: string; line?: number; type: string; score: number; signature?: string | null }>> {\n try {\n const data = await this.req<{\n success?: boolean;\n result?: {\n results?: Array<{ name: string; file: string; line?: number; type: string; score: number; signature?: string | null }>;\n error?: string;\n };\n error?: string;\n }>('POST', `/codebase/search`, { query, topK });\n if (data.error || data.result?.error) return [];\n return data.result?.results ?? [];\n } catch {\n return [];\n }\n }\n\n async writePrivateKnowledge(\n entries: Array<{ content: string; type?: string; tags?: string[]; title?: string }>\n ): Promise<boolean> {\n if (!entries.length) return false;\n if (this.localKnowledgePath) {\n try {\n await mkdir(dirname(this.localKnowledgePath), { recursive: true });\n const lines = entries.map(e => JSON.stringify({\n id: `local.${Date.now()}.${Math.random().toString(36).slice(2, 6)}`,\n content: e.content,\n type: e.type ?? 'task-outcome',\n tags: e.tags ?? [],\n title: e.title,\n createdAt: new Date().toISOString(),\n })).join('\\n') + '\\n';\n await appendFile(this.localKnowledgePath, lines, 'utf8');\n return true;\n } catch {\n return false;\n }\n }\n try {\n await this.req('POST', `/knowledge/private`, { entries });\n return true;\n } catch {\n return false;\n }\n }\n\n private async req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.apiBase}${path}`;\n // HoloMesh REST auth: server (packages/mcp-server/src/holomesh/auth-utils.ts\n // resolveRequestingAgent) accepts EITHER `Authorization: Bearer <token>`\n // (HTTP-standard, used here) OR `x-mcp-api-key: <token>` (orchestrator\n // convention). Both resolve through the same key-registry / agent-store /\n // env-fallback chain. Bearer is preferred for new code (W.087 vertex B,\n // task_1777073616424_klls).\n const res = await this.fetchImpl(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.bearer}`,\n 'content-type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) {\n const txt = await res.text().catch(() => '');\n throw new Error(`HoloMesh ${method} ${path} ${res.status}: ${txt.slice(0, 300)}`);\n }\n if (res.status === 204) return undefined as T;\n return (await res.json()) as T;\n }\n}\n\n/**\n * Derive a surface tag from a seat name returned by /me. Mirrors the surface\n * detection in scripts/probe-surface-bearers.mjs and hooks/lib/holomesh-env.mjs\n * so a single agent's surface attribution is consistent across read and write\n * paths. Returns 'unknown' when the seat name doesn't encode a surface\n * (e.g. shared-key resolution to \"Founder\").\n */\nexport function deriveSurface(seatName: string | undefined): string {\n if (!seatName) return 'unknown';\n const n = seatName.toLowerCase();\n if (n.startsWith('claudecode')) return 'claude-code';\n if (n.startsWith('cursor')) return 'claude-cursor';\n if (n.startsWith('claudedesktop')) return 'claude-desktop';\n if (n.startsWith('vscode-claude') || n.startsWith('claude-vscode')) return 'claude-vscode';\n if (n.startsWith('gemini')) return 'gemini-antigravity';\n if (n.startsWith('copilot')) return 'copilot-vscode';\n return 'unknown';\n}\n\nexport function pickClaimableTask(\n tasks: BoardTask[],\n brainCapabilityTags: string[]\n): BoardTask | undefined {\n const wanted = new Set(brainCapabilityTags.map((t) => t.toLowerCase()));\n const open = tasks.filter((t) => t.status === 'open' && !t.claimedBy);\n const scored = open\n .map((t) => ({ task: t, score: scoreTask(t, wanted) }))\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score || priority(a.task) - priority(b.task));\n return scored[0]?.task;\n}\n\nfunction scoreTask(task: BoardTask, wanted: Set<string>): number {\n const tags = (task.tags ?? []).map((t) => t.toLowerCase());\n const text = `${task.title} ${task.description ?? ''}`.toLowerCase();\n let score = 0;\n for (const tag of tags) if (wanted.has(tag)) score += 2;\n for (const w of wanted) if (text.includes(w)) score += 1;\n return score;\n}\n\nfunction priority(t: BoardTask): number {\n if (typeof t.priority === 'number') return t.priority;\n const map: Record<string, number> = { critical: 1, high: 2, medium: 4, low: 6 };\n return map[String(t.priority).toLowerCase()] ?? 5;\n}\n","/**\n * HoloKey bearer broker — resolve an agent's mesh bearer by proving wallet\n * ownership, instead of holding the bearer in plaintext `.env`.\n *\n * The edge agent holds only its WALLET (the durable root identity, F.119 —\n * deterministic + recoverable from the master seed). The mesh bearer is\n * rotatable/mintable, so it is FETCHED on demand from the broker rather than\n * stored: `POST /key/challenge` → sign EIP-712 `Recovery{nonce}` → `POST\n * /key/recover` returns the agent's current `api_key`. The private key never\n * leaves the process; only the signature + public address transit the wire.\n *\n * This generalizes the per-agent `HOLOMESH_API_KEY_<HANDLE>_X402` pattern into\n * the secrets-broker model (`@holoscript/secrets-broker`): one root credential\n * (the wallet), short-lived/fetched capability (the bearer).\n *\n * @module holoscript-agent/bearer-broker\n */\nimport { Wallet } from 'ethers';\n\nexport interface ResolveBearerViaBrokerOpts {\n /** Agent wallet private key (0x-hex). Root credential; NEVER logged. */\n privateKey: string;\n /** Mesh API base, e.g. https://mcp.holoscript.net/api/holomesh */\n meshApiBase: string;\n /** Injectable fetch for tests. Defaults to the global `fetch`. */\n fetchImpl?: typeof fetch;\n}\n\n/** Domain/types for the EIP-712 `Recovery` envelope the server verifies (core-routes.ts key/recover). */\nconst RECOVERY_DOMAIN: { name: string; version: string } = { name: 'HoloMesh', version: '1' };\nconst RECOVERY_TYPES: Record<string, { name: string; type: string }[]> = {\n Recovery: [{ name: 'nonce', type: 'string' }],\n};\n\n/**\n * Resolve the agent's mesh bearer via wallet-ownership proof against the broker.\n * Throws on any failure (challenge/recover non-200, missing nonce/api_key) so the\n * caller can fall back to an explicit env bearer or surface a clear boot error.\n */\nexport async function resolveBearerViaBroker(opts: ResolveBearerViaBrokerOpts): Promise<string> {\n const doFetch = opts.fetchImpl ?? fetch;\n const wallet = new Wallet(opts.privateKey);\n const address = wallet.address;\n const base = opts.meshApiBase.replace(/\\/+$/, '');\n\n const chalRes = await doFetch(`${base}/key/challenge`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ wallet_address: address }),\n });\n if (!chalRes.ok) {\n throw new Error(`bearer-broker: /key/challenge returned ${chalRes.status} for ${address}`);\n }\n const chal = (await chalRes.json()) as { nonce?: string };\n if (!chal.nonce) throw new Error('bearer-broker: /key/challenge returned no nonce');\n\n const signature = await wallet.signTypedData(RECOVERY_DOMAIN, RECOVERY_TYPES, {\n nonce: chal.nonce,\n });\n\n const recRes = await doFetch(`${base}/key/recover`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ wallet_address: address, nonce: chal.nonce, signature }),\n });\n if (!recRes.ok) {\n throw new Error(`bearer-broker: /key/recover returned ${recRes.status} for ${address}`);\n }\n const rec = (await recRes.json()) as { agent?: { api_key?: string } };\n const bearer = rec.agent?.api_key;\n if (!bearer) throw new Error('bearer-broker: /key/recover returned no api_key');\n return bearer;\n}\n","import type { ILLMProvider, LLMMessage, TokenUsage } from '@holoscript/llm-provider';\nimport { embedAcrossFleet, cosineSimilarity } from '@holoscript/llm-provider';\nimport type { CostGuard } from './cost-guard.js';\nimport type { HolomeshClient } from './holomesh-client.js';\nimport { pickClaimableTask } from './holomesh-client.js';\nimport type { AuditLog } from './audit-log.js';\nimport { buildCaelRecord } from './cael-builder.js';\nimport { resolveActiveTools, runTool, summarizeToolProductivity } from './tools.js';\nimport { augmentWithOnTaskCognition } from './cognitive-verbs.js';\nimport { DelegatedAuthorityHandler } from './delegated-authority.js';\nimport type {\n AgentIdentity,\n BoardTask,\n ExecutionResult,\n RuntimeBrainConfig,\n TickResult,\n} from './types.js';\n\n// Bumped when the CAEL record schema or layer-hash semantics change. Lives\n// in the version_vector_fingerprint of every emitted record so consumers\n// can partition the corpus by runtime version.\nconst RUNTIME_VERSION = '1.0.0';\n\nexport interface AgentRunnerOptions {\n identity: AgentIdentity;\n brain: RuntimeBrainConfig;\n provider: ILLMProvider;\n costGuard: CostGuard;\n mesh: HolomeshClient;\n logger?: (event: Record<string, unknown>) => void;\n onTaskExecuted?: (result: ExecutionResult, task: BoardTask) => Promise<void>;\n auditLog?: AuditLog;\n /** Optional delegated-authority handler for governance message processing (E4). */\n messageHandler?: DelegatedAuthorityHandler;\n /**\n * Optional hardware-receipt signer (index.ts wires the seat wallet). When\n * present, emit_hardware_receipt seals its content hash with a wallet signature\n * so the hardware-provenance artifact is verifiable, not plain JSON. Absent →\n * the receipt is content-hashed but self-reports `signed:false` (honest).\n */\n signReceipt?: (canonical: string) => Promise<{ alg: string; signer: string; signature: string }>;\n}\n\nexport class AgentRunner {\n private stopped = false;\n // CAEL audit hash chain — survives across ticks within a single runner\n // process. On process restart it resets to null; the first post-restart\n // record breaks the chain, which is honest (the runner has no memory of\n // its prior chain state and shouldn't fake continuity). prev_hash=null\n // is a valid value the audit-store accepts.\n private prevCaelChain: string | null = null;\n // Self-recovery flag for the auto-rejoin path (task_1777112258989_eeyp).\n // When the heartbeat returns 403 \"Not a member of this team\" — typical of\n // a fresh Vast.ai worker whose provisioning didn't atomically /join, or of\n // a worker whose membership was reaped — the runner calls mesh.joinTeam()\n // ONCE per process and retries the heartbeat. After a successful rejoin\n // we set this flag so subsequent 403s on the same process don't loop back\n // into joinTeam (avoiding a retry storm if the team-cap is full or the\n // join itself is permanently rejected). On process restart the flag\n // resets, which is the correct semantics: a fresh process gets one fresh\n // chance to self-rejoin. Discovered 2026-04-25 SSH-probing 5 fleet\n // workers stuck in indefinite 403→tick-error→sleep→retry loops; without\n // this, a fresh-deploy of an unjoined agent stays silent forever.\n private joinedThisProcess = false;\n\n constructor(private readonly opts: AgentRunnerOptions) {}\n\n async tick(): Promise<TickResult> {\n const { identity, brain, mesh, costGuard, provider, logger } = this.opts;\n const log = logger ?? (() => undefined);\n\n await this.heartbeatWithAutoRejoin();\n\n // ── Delegated-authority message processing (E4) ──────────────────────────\n // Run before budget/task claiming so governance requests are handled\n // even when the agent is over-budget or has no claimable tasks.\n if (this.opts.messageHandler) {\n try {\n const receipts = await this.opts.messageHandler.processMessages();\n if (receipts.length > 0) {\n log({\n ev: 'messages-processed',\n count: receipts.length,\n statuses: receipts.map((r) => r.status),\n });\n // If this agent has no board-task capability tags (Brittney is\n // governance-only), return early so the tick result reflects message\n // work rather than falling through to no-claimable-task.\n if (\n brain.capabilityTags.length === 0 ||\n brain.capabilityTags.every((t) => t.startsWith('delegated'))\n ) {\n return {\n action: 'messages-processed',\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n receipts: receipts.map((r) => ({\n status: r.status,\n action: r.action,\n reason: r.reason,\n })),\n };\n }\n }\n } catch (err) {\n log({\n ev: 'message-handler-error',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (costGuard.isOverBudget()) {\n const state = costGuard.getState();\n log({ ev: 'over-budget', spentUsd: state.spentUsd, budget: identity.budgetUsdPerDay });\n return {\n action: 'over-budget',\n spentUsd: state.spentUsd,\n remainingUsd: 0,\n message: `daily budget $${identity.budgetUsdPerDay} exhausted`,\n };\n }\n\n const tasks = await mesh.getOpenTasks();\n const target = pickClaimableTask(tasks, brain.capabilityTags);\n if (!target) {\n log({ ev: 'no-claimable-task', open: tasks.length });\n return {\n action: 'no-claimable-task',\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n };\n }\n\n log({ ev: 'claim', taskId: target.id, title: target.title });\n await mesh.claim(target.id);\n\n const start = Date.now();\n // Tool-use loop. The model gets MESH_TOOLS (read_file, list_dir,\n // write_file, bash) and can iterate read→reason→read→write until it\n // emits a final text response. Without this loop the model could only\n // reason from prompt+brain alone — no filesystem access, no kernel\n // checks, no inspection of inputs scp'd to the instance. With it,\n // lean-theorist can actually `cat MSC/Invariants.lean`, `lake build`,\n // and `write_file /root/agent-output/Invariants.lean` per its brain rules.\n // ── On-task cognition (Phase 2.2 — cognitive-verbs.ts) ───────────────────\n // Execute the brain's authored `behavior on_task` verbs (llm_call / rag_query\n // / recall / plan) and accumulate their outputs onto the system prompt before\n // the tool loop. Provider + mesh only (no engine/@holoscript/core dep) so the\n // edge package keeps its clean publish closure. `reflect` runs post-artifact.\n const systemContent = await augmentWithOnTaskCognition({\n systemPrompt: brain.systemPrompt,\n onTaskActions: brain.onTaskActions ?? [],\n task: { id: target.id, title: target.title },\n queryTeamKnowledge: (q, limit) => mesh.queryTeamKnowledge(q, limit),\n queryPrivateKnowledge: () => mesh.queryPrivateKnowledge(),\n // Phase 2.3 (W.753): codebase GraphRAG via the bearer-gated mesh route.\n // Best-effort: returns [] when the in-process graph isn't loaded → cognitive-verbs\n // falls back to team-knowledge search. No prod impact when graph is cold.\n queryCodebase: (q, topK) => mesh.queryCodebase(q, topK),\n plan: async (prompt) => {\n const resp = await provider.complete(\n { messages: [{ role: 'user', content: prompt }], maxTokens: 512, temperature: 0.3 },\n identity.llmModel\n );\n return resp.content;\n },\n // Semantic `recall` over the private workspace via the fleet nomic (W.753).\n // brainPath from HOLO_LLM_FLEET_BRAIN; if unset/unreachable embedAcrossFleet\n // returns null and cognitive-verbs falls back to the substring filter.\n embed: (text) => embedAcrossFleet(text, { brainPath: process.env.HOLO_LLM_FLEET_BRAIN }),\n similarity: cosineSimilarity,\n log,\n });\n\n const messages: LLMMessage[] = [\n { role: 'system', content: systemContent },\n { role: 'user', content: buildTaskPrompt(target) },\n ];\n let aggUsage: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n let finalText = '';\n let iters = 0;\n // 30-iter cap: lean-theorist on Paper 22 needed 13 iters to read MSC files\n // + run lake build + iterate kernel checks. 12 was too tight (cap fired\n // before write_file deliverable). 30 allows ~3x that depth — anything\n // hitting 30 iters is almost certainly stuck and should bail.\n const MAX_TOOL_ITERS = 30;\n let lastResponse;\n // Track which tool names were called during this run so the artifact-grounding\n // gate below can refuse to mark \"executed\" on pure-text or read-only responses.\n // Discovered 2026-04-26 mesh-worker-02 audit: workers were posting CAEL records\n // with tool_iters:1 (zero tools called) declaring \"100 scenes validated\" with\n // no commit / no /room done — fabricated deliverables polluting trust. The\n // gate below short-circuits this class of hallucination at the runner edge.\n const toolsCalled = new Set<string>();\n // Tightened-gate counter (W.107.b 2026-04-26): track *productive* tool calls\n // separately from any tool call. A productive call is one of:\n // - write_file with non-empty content\n // - bash matching a productive prefix (lake build / pnpm --filter / vitest\n // run / lean / pnpm vitest — see tools.ts BASH_PRODUCTIVE_PREFIXES)\n // Read-only bash (cat/grep/ls/echo/git status/etc.) does NOT count even\n // though it's whitelisted for execution. This catches the trivial-bash-bypass\n // class (e.g. `bash echo done`) that the original W.107 gate accepted.\n let productiveCallCount = 0;\n // Last git commit SHA emitted during the tool-loop; forwarded to markDone\n // so the board task records a verifiable commit reference.\n let lastCommitHash: string | undefined;\n // F.126 #1 — the model's tools come from the BRAIN'S DECLARATION (the on_task\n // `llm_call { tools: [...] }` array), not a hardcoded list. resolveActiveTools\n // resolves the declared names against MESH_TOOLS, falls back safely when a brain\n // declares none, and SLIM-trims an oversized set for small local models (W.710\n // num_ctx guard). \"Add a tool\" is now \"declare it in the brain,\" not edit this file.\n const { tools: activeTools, declared: declaredTools, dropped: droppedTools } = resolveActiveTools(brain);\n log({\n ev: 'active-tools',\n taskId: target.id,\n tools: activeTools.map((t) => t.name),\n declared: declaredTools,\n ...(droppedTools.length ? { droppedUnknown: droppedTools } : {}),\n });\n while (true) {\n iters++;\n if (iters > MAX_TOOL_ITERS) {\n log({ ev: 'tool-loop-cap', taskId: target.id, iters });\n finalText = finalText || `[tool-loop hit ${MAX_TOOL_ITERS}-iter cap before final text]`;\n break;\n }\n const resp = await provider.complete(\n {\n messages,\n // 8192 for local thinking models (qwen3:4b uses ~3800 tokens on thinking\n // before the tool-call JSON; 4096 cuts off mid-generation). Frontier\n // models ignore this ceiling and stop naturally earlier.\n maxTokens: 8192,\n temperature: 0.4,\n tools: activeTools,\n },\n identity.llmModel\n );\n lastResponse = resp;\n aggUsage = {\n promptTokens: aggUsage.promptTokens + resp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + resp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + resp.usage.totalTokens,\n };\n // If model called tools, execute them and feed results back.\n if (resp.finishReason === 'tool_use' && resp.toolUses && resp.toolUses.length > 0) {\n log({\n ev: 'tool-call',\n taskId: target.id,\n iter: iters,\n tools: resp.toolUses.map((t) => t.name),\n });\n // Artifact-grounding accounting (W.107.b) via the shared classifier in\n // tools.ts — the SAME function the ablation harness measures, so the gate\n // and its evaluation can never drift (single source of truth).\n const productivity = summarizeToolProductivity(resp.toolUses);\n for (const n of productivity.names) toolsCalled.add(n);\n productiveCallCount += productivity.productiveCount;\n // Append the assistant turn (text + tool_use blocks) so the model\n // sees its own request when we send tool_result back.\n messages.push({\n role: 'assistant',\n content: (resp.assistantBlocks ?? []) as never,\n });\n // Run each tool and collect results.\n const toolResults = await Promise.all(\n resp.toolUses.map((u) =>\n runTool(u, {\n signReceipt: this.opts.signReceipt,\n addTask: (tasks) => mesh.addTasks(tasks),\n })\n )\n );\n // Extract the latest git commit SHA from bash stdout so markDone can\n // record a verifiable reference on the board task. Pattern matches both\n // `git commit -m` output ('[branch abc1234]') and `git rev-parse HEAD`.\n for (let ti = 0; ti < resp.toolUses.length; ti++) {\n const tu = resp.toolUses[ti];\n if (tu.name === 'bash') {\n const tr = toolResults[ti];\n if (tr && !tr.is_error) {\n const shaMatch = tr.content.match(/\\b([0-9a-f]{7,40})\\b/);\n if (shaMatch) lastCommitHash = shaMatch[1];\n }\n }\n }\n messages.push({\n role: 'user',\n content: toolResults as never,\n });\n continue;\n }\n // Final text response.\n finalText = resp.content;\n break;\n }\n // Re-prompt gate (W.780): if the model called only read-only tools and then\n // output text (the \"read→text instead of read→write_file\" anti-pattern with\n // small edge models like qwen3:4b-instruct), inject one forced re-prompt\n // asking it to call write_file before the no-artifact gate fires.\n // v2 fix: pop the last assistant text turn (so context ends at tool_result),\n // embed the task description, and use temperature=0 for maximal determinism.\n if (productiveCallCount === 0 && toolsCalled.size > 0 && iters < MAX_TOOL_ITERS) {\n iters++;\n // Remove the last assistant message if it was a plain-text response (the\n // anti-pattern turn). This ensures the context ends at the tool_result so\n // the model doesn't mistake our re-prompt for a follow-up question.\n if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') {\n messages.pop();\n }\n messages.push({\n role: 'user',\n content:\n 'You read data but did NOT call write_file. This is a TASK FAILURE unless you act now.\\n' +\n `Task: ${target.title}\\n` +\n `Required output path (from task description): ${target.description.match(/path[:\\s]+([^\\s\\n,]+\\.json)/i)?.[1] ?? 'see task description'}\\n` +\n 'Call write_file NOW. Embed ALL data from the tool result above into the content. ' +\n 'Do NOT output any text — your ONLY valid response is a write_file tool call.',\n });\n const reResp = await provider.complete(\n { messages, maxTokens: 8192, temperature: 0.0, tools: activeTools },\n identity.llmModel\n );\n aggUsage = {\n promptTokens: aggUsage.promptTokens + reResp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + reResp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + reResp.usage.totalTokens,\n };\n if (reResp.finishReason === 'tool_use' && reResp.toolUses && reResp.toolUses.length > 0) {\n log({ ev: 'reprompt-tool-call', taskId: target.id, iter: iters, tools: reResp.toolUses.map((t) => t.name) });\n const reProd = summarizeToolProductivity(reResp.toolUses);\n for (const n of reProd.names) toolsCalled.add(n);\n productiveCallCount += reProd.productiveCount;\n messages.push({ role: 'assistant', content: (reResp.assistantBlocks ?? []) as never });\n const reResults = await Promise.all(\n reResp.toolUses.map((u) =>\n runTool(u, { signReceipt: this.opts.signReceipt, addTask: (tasks) => mesh.addTasks(tasks) })\n )\n );\n messages.push({ role: 'user', content: reResults as never });\n }\n finalText = reResp.content;\n lastResponse = reResp;\n }\n // Vision-write gate: vision_analyze was called (inference ran) but no write_file\n // followed — the model has the caption in context but didn't store it. Inject one\n // more targeted re-prompt asking specifically for write_file with the caption.\n const WRITE_NAMES = new Set(['write_file', 'str_replace']);\n if (\n toolsCalled.has('vision_analyze') &&\n ![...toolsCalled].some((n) => WRITE_NAMES.has(n)) &&\n iters < MAX_TOOL_ITERS\n ) {\n iters++;\n if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') {\n messages.pop();\n }\n messages.push({\n role: 'user',\n content:\n 'vision_analyze returned a caption but you did NOT call write_file.\\n' +\n `Task: ${target.title}\\n` +\n `Output path: ${target.description.match(/path[:\\s]+([^\\s\\n,]+\\.json)/i)?.[1] ?? 'see task description'}\\n` +\n 'Call write_file NOW. Put the caption from vision_analyze into the JSON content field. ' +\n 'Do NOT output text — your ONLY valid response is a write_file tool call.',\n });\n const vwResp = await provider.complete(\n { messages, maxTokens: 8192, temperature: 0.0, tools: activeTools },\n identity.llmModel\n );\n aggUsage = {\n promptTokens: aggUsage.promptTokens + vwResp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + vwResp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + vwResp.usage.totalTokens,\n };\n if (vwResp.finishReason === 'tool_use' && vwResp.toolUses && vwResp.toolUses.length > 0) {\n log({ ev: 'vision-write-call', taskId: target.id, iter: iters, tools: vwResp.toolUses.map((t) => t.name) });\n const vwProd = summarizeToolProductivity(vwResp.toolUses);\n for (const n of vwProd.names) toolsCalled.add(n);\n productiveCallCount += vwProd.productiveCount;\n messages.push({ role: 'assistant', content: (vwResp.assistantBlocks ?? []) as never });\n const vwResults = await Promise.all(\n vwResp.toolUses.map((u) =>\n runTool(u, { signReceipt: this.opts.signReceipt, addTask: (tasks) => mesh.addTasks(tasks) })\n )\n );\n messages.push({ role: 'user', content: vwResults as never });\n }\n finalText = vwResp.content;\n lastResponse = vwResp;\n }\n const durationMs = Date.now() - start;\n\n // Artifact-grounding gate (W.107 — fleet event-firing rate is not a productivity\n // metric; only side-effecting tool calls produce real artifacts; 2026-04-26\n // tightened to W.107.b which also closes the trivial-bash bypass: `bash echo\n // done` and `write_file /tmp/x \"\"` no longer pass the gate). The gate now\n // requires AT LEAST ONE productive call:\n // - write_file with non-empty content, OR\n // - bash matching a productive prefix (lake build / pnpm --filter /\n // vitest run / lean / pnpm vitest)\n // Read-only inspection tools (read_file, list_dir) and read-only bash\n // (cat/grep/ls/echo/git status/git log/...) don't satisfy the gate.\n if (productiveCallCount === 0) {\n log({\n ev: 'no-artifact',\n taskId: target.id,\n tool_iters: iters,\n toolsCalled: [...toolsCalled],\n productiveCallCount,\n message:\n 'task execution did not produce a real artifact — refusing to mark executed. ' +\n 'Required: write_file with non-empty content OR bash with a productive prefix ' +\n '(lake build / pnpm --filter / vitest run / lean / pnpm vitest). ' +\n 'Pure-text, read-only inspection, and trivial-bash-bypass (`echo`, `cat`, etc.) do not satisfy the gate.',\n });\n // Best-effort: leave the task in claimed state so the supervisor can either\n // re-tick or release it via heartbeat-rejoin. We deliberately do NOT post\n // a \"fake-done\" message on the board, do NOT post a CAEL record, and do NOT\n // call the cost guard's recordUsage — the run produced no artifact and\n // should not bill the budget for a hallucinated tick.\n return {\n action: 'no-artifact',\n taskId: target.id,\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n message: `no productive tool call observed (toolsCalled=[${[...toolsCalled].join(',')}], productiveCallCount=${productiveCallCount}, iters=${iters})`,\n };\n }\n\n // ── Reflect: cognitive self-evaluation gate (W.736) ──────────────────────\n // If the brain declares a `reflect` verb, run ONE self-evaluation pass over\n // the produced artifact before accepting it — the brain's local_first\n // confidence gate. Uses the same provider (no engine/trait dependency) and\n // mirrors the CognitiveActions reflect prompt shape. The verdict is acted on\n // at the markDone gate below; its tokens fold into aggUsage so cost is honest.\n let reflectVerdict: { pass: boolean; reason: string } | undefined;\n if (brain.reflect) {\n try {\n const reflectResp = await provider.complete(\n {\n messages: [\n {\n role: 'system',\n content:\n 'You are a strict reviewer. Evaluate the work against the criteria; do not rewrite it.',\n },\n {\n role: 'user',\n content:\n `Reflect on the artifact produced for this task. Evaluate it for: ${brain.reflect.criteria}.\\n\\n` +\n `--- artifact / final response ---\\n${finalText.slice(0, 4000)}\\n--- end ---\\n\\n` +\n `Give a one-line reason, then end with exactly \"VERDICT: PASS\" or \"VERDICT: FAIL\".`,\n },\n ],\n maxTokens: 512,\n temperature: 0.1,\n },\n identity.llmModel\n );\n aggUsage = {\n promptTokens: aggUsage.promptTokens + reflectResp.usage.promptTokens,\n completionTokens: aggUsage.completionTokens + reflectResp.usage.completionTokens,\n totalTokens: aggUsage.totalTokens + reflectResp.usage.totalTokens,\n };\n const verdictMatch = /VERDICT:\\s*(PASS|FAIL)/i.exec(reflectResp.content);\n // Unparseable verdict = PASS — reflect is a gate, not a tripwire; never\n // block a real artifact on a parser miss (small local models phrase loosely).\n const pass = verdictMatch ? verdictMatch[1].toUpperCase() === 'PASS' : true;\n reflectVerdict = {\n pass,\n reason: reflectResp.content.replace(/VERDICT:\\s*(PASS|FAIL)/i, '').trim().slice(0, 300),\n };\n log({\n ev: 'reflect',\n taskId: target.id,\n pass,\n escalateOnFail: brain.reflect.escalateOnFail,\n reason: reflectVerdict.reason.slice(0, 120),\n });\n } catch (err) {\n log({\n ev: 'reflect-error',\n taskId: target.id,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const cost = costGuard.recordUsage(identity.llmModel, aggUsage);\n log({\n ev: 'executed',\n taskId: target.id,\n costUsd: cost.costUsd.toFixed(4),\n spentUsd: cost.spentUsd.toFixed(4),\n tokens: aggUsage.totalTokens,\n tool_iters: iters,\n });\n const response = {\n ...(lastResponse ?? { content: finalText, usage: aggUsage }),\n content: finalText,\n usage: aggUsage,\n };\n\n const execResult: ExecutionResult = {\n taskId: target.id,\n responseText: response.content,\n usage: response.usage,\n costUsd: cost.costUsd,\n durationMs,\n };\n\n if (this.opts.auditLog) {\n try {\n this.opts.auditLog.recordTaskExecuted({\n identity,\n task: target,\n result: execResult,\n });\n } catch (err) {\n log({ ev: 'audit-log-error', message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n // Phase 1 CAEL audit: post to the HoloMesh audit store so the fleet\n // corpus collector at ai-ecosystem/scripts/fleet-corpus-collector.mjs\n // can read records via GET /api/holomesh/agent/{handle}/audit. Without\n // this POST, the local AuditLog above is the only durable record and\n // Paper 25's gate clock cannot start. See ai-ecosystem task\n // task_1777106535952_atug for the empty-audit investigation.\n try {\n const caelRecord = buildCaelRecord({\n identity,\n brain,\n task: target,\n messages,\n finalText,\n usage: aggUsage,\n costUsd: cost.costUsd,\n spentUsd: cost.spentUsd,\n prevChain: this.prevCaelChain,\n runtimeVersion: RUNTIME_VERSION,\n });\n const posted = await mesh.postAuditRecords(identity.handle, [caelRecord]);\n this.prevCaelChain = caelRecord.fnv1a_chain;\n log({\n ev: 'cael-posted',\n taskId: target.id,\n appended: posted.appended,\n rejected: posted.rejected,\n });\n } catch (err) {\n log({ ev: 'cael-post-error', message: err instanceof Error ? err.message : String(err) });\n }\n\n // Reflect escalation gate: a brain with `reflect { escalate_on_fail: true }`\n // does NOT mark done on a failed self-evaluation — it escalates to the fleet\n // (the local_first directive). Cost + CAEL are already recorded above (the work\n // happened and the self-eval is a verifiable trace); only acceptance/markDone is\n // withheld. Brains without reflect, or with an advisory reflect, fall through.\n if (reflectVerdict && !reflectVerdict.pass && brain.reflect?.escalateOnFail) {\n try {\n await mesh.sendMessageOnTask(\n target.id,\n `[${identity.handle}] reflect gate FAILED — escalating to the fleet instead of marking done. Reason: ${reflectVerdict.reason}`\n );\n } catch {\n /* best-effort escalation notice; the return value is the source of truth */\n }\n log({ ev: 'reflect-escalate', taskId: target.id, reason: reflectVerdict.reason.slice(0, 120) });\n return {\n action: 'reflect-escalate',\n taskId: target.id,\n spentUsd: costGuard.getState().spentUsd,\n remainingUsd: costGuard.getRemainingUsd(),\n message: `reflect self-evaluation failed; escalated to fleet (reason: ${reflectVerdict.reason.slice(0, 120)})`,\n };\n }\n\n if (this.opts.onTaskExecuted) {\n await this.opts.onTaskExecuted(execResult, target);\n } else {\n await mesh.sendMessageOnTask(\n target.id,\n `[${identity.handle}] response (${response.usage.totalTokens} tok, $${cost.costUsd.toFixed(4)}):\\n\\n${response.content}`\n );\n }\n\n // Mark the task done so it doesn't linger in 'claimed' forever.\n // Wrapped in try/catch: a markDone failure (e.g. task already closed by\n // a supervisor, or transient network error) must not prevent the tick\n // return value from reaching the caller.\n try {\n await mesh.markDone(target.id, finalText.slice(0, 500), lastCommitHash);\n log({ ev: 'mark-done', taskId: target.id, commitHash: lastCommitHash });\n } catch (err) {\n log({\n ev: 'mark-done-error',\n taskId: target.id,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n\n // Continuity write-loop: persist this task's outcome to the agent's PRIVATE\n // knowledge so a future `recall` verb has real memory to draw on. This closes\n // the W.752 loop-gap — the edge `recall` verb read /knowledge/private but it\n // was always empty because nothing ever wrote to it. Now markDone feeds it.\n // Best-effort (writePrivateKnowledge swallows its own errors); the task is\n // already done, so a write miss is logged and ignored.\n if (finalText.trim()) {\n const fact =\n `Task \"${target.title}\" (${target.id}) completed. ` +\n `Outcome: ${finalText.trim().slice(0, 600)}` +\n (lastCommitHash ? ` [commit ${lastCommitHash}]` : '');\n const wrote = await mesh.writePrivateKnowledge([\n { content: fact, type: 'task-outcome', tags: ['task-outcome', identity.handle] },\n ]);\n log({ ev: wrote ? 'knowledge-write' : 'knowledge-write-skip', taskId: target.id });\n }\n\n return {\n action: 'executed',\n taskId: target.id,\n spentUsd: cost.spentUsd,\n remainingUsd: cost.remainingUsd,\n };\n }\n\n async runForever(opts: { tickIntervalMs?: number } = {}): Promise<void> {\n const interval = opts.tickIntervalMs ?? 60_000;\n while (!this.stopped) {\n try {\n await this.tick();\n } catch (err) {\n const log = this.opts.logger ?? (() => undefined);\n log({ ev: 'tick-error', message: err instanceof Error ? err.message : String(err) });\n }\n await sleep(interval + jitter(interval));\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n /**\n * Heartbeat with one-shot self-rejoin on 403 \"Not a member of this team\".\n *\n * Pairs with task_1777112258989_eeyp: fresh-deploy fleet workers whose\n * provisioning didn't atomically call /join (or whose membership was\n * reaped) hit 403 every tick and never recover. We detect the specific\n * server error string (see packages/mcp-server/src/holomesh/routes/\n * team-routes.ts:903 → `{ error: 'Not a member' }` for /presence), call\n * mesh.joinTeam() ONCE per runner process, and retry the heartbeat.\n *\n * Strict scope:\n * - Only retries on 403 + \"Not a member\" body. Any other 403 (insufficient\n * permissions, signing failure) re-throws unchanged.\n * - Only retries ONCE per process. If we already rejoined this process and\n * the heartbeat is *still* 403, the team is rejecting us for a reason\n * /join can't fix (e.g. capacity, ban) — surface the error.\n * - If joinTeam() itself throws, we DO mark joinedThisProcess=true before\n * re-throwing so we don't slam the join endpoint on every subsequent\n * tick. The next tick will surface the same heartbeat 403 and the\n * runner-level catch in runForever logs tick-error and sleeps. Operator\n * inspection (SSH/log) is the recovery path at that point.\n */\n private async heartbeatWithAutoRejoin(): Promise<void> {\n const { identity, brain, mesh, logger } = this.opts;\n const log = logger ?? (() => undefined);\n const capabilityTags = brain.capabilityTags.length > 0 ? brain.capabilityTags : undefined;\n try {\n await mesh.heartbeat({ agentName: identity.handle, surface: identity.surface, capabilityTags });\n } catch (err) {\n if (!this.isNotAMemberError(err) || this.joinedThisProcess) {\n throw err;\n }\n log({ ev: 'auto-rejoin-attempt', reason: 'heartbeat-403-not-a-member' });\n // Mark BEFORE the join call so a thrown joinTeam() can't loop us.\n this.joinedThisProcess = true;\n try {\n const joinResult = await mesh.joinTeam();\n log({ ev: 'auto-rejoin-success', role: joinResult.role, members: joinResult.members });\n } catch (joinErr) {\n log({\n ev: 'auto-rejoin-failed',\n message: joinErr instanceof Error ? joinErr.message : String(joinErr),\n });\n throw joinErr;\n }\n // Retry the heartbeat exactly once. If it still fails (including with\n // another 403), the new error propagates — joinedThisProcess is now\n // true so we won't retry-loop on the next tick.\n await mesh.heartbeat({ agentName: identity.handle, surface: identity.surface, capabilityTags });\n log({ ev: 'auto-rejoin-heartbeat-recovered' });\n }\n }\n\n /**\n * Detect the server's \"Not a member\" 403 error from HolomeshClient.req().\n * The error message format is: `HoloMesh POST /team/<id>/presence 403: <body>`\n * where body contains `{\"error\":\"Not a member\"}` (or \"Not a member of this team\").\n * Match conservatively: BOTH a \"403\" status marker AND the \"Not a member\"\n * substring must appear, so unrelated 403s (insufficient permissions,\n * signing failures) do NOT trigger a rejoin.\n */\n private isNotAMemberError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return / 403:/.test(msg) && /Not a member/i.test(msg);\n }\n}\n\nfunction buildTaskPrompt(task: BoardTask): string {\n return [\n `Board task to execute: ${task.id}`,\n `Title: ${task.title}`,\n `Priority: ${task.priority}`,\n `Tags: ${(task.tags ?? []).join(', ')}`,\n '',\n 'Description:',\n task.description ?? '(no description)',\n '',\n 'Produce the deliverable: call write_file (or bash with a build command) to create all required output files FIRST. Apply your brain composition rules — anti-patterns, decision loop, and scope tier all bind. After calling the tool(s), return a short plain-text summary of what you did for posting to /room.',\n ].join('\\n');\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction jitter(base: number): number {\n return Math.floor((Math.random() - 0.5) * base * 0.2);\n}\n","// CAEL audit record builder for the headless agent runtime.\n//\n// Phase 1: agent ticks emit a CaelAuditRecord shaped to satisfy the\n// HoloMesh audit endpoint validator at packages/mcp-server/src/holomesh/\n// routes/core-routes.ts:512-518 (7-element layer_hashes array, string\n// tick_iso/operation/fnv1a_chain). The 7 layers map to concrete tick\n// stages so a downstream consumer can verify any one layer in isolation:\n//\n// L0 brain_state — sha256(brain.systemPrompt)\n// L1 tick_input — sha256(taskId|title|description)\n// L2 messages — sha256(JSON of final message thread)\n// L3 response — sha256(finalText)\n// L4 usage — sha256(JSON of aggregated TokenUsage)\n// L5 cost — sha256(costUsd|spentUsd)\n// L6 composite — sha256(L0|L1|L2|L3|L4|L5)\n//\n// fnv1a_chain extends across records: chain_n = sha256(chain_{n-1} | L6_n).\n// First tick emits prev_hash=null; subsequent ticks chain from the\n// previous record's fnv1a_chain.\n\nimport { createHash } from 'node:crypto';\nimport type { LLMMessage, TokenUsage } from '@holoscript/llm-provider';\nimport type { AgentIdentity, BoardTask, ExecutionResult, RuntimeBrainConfig } from './types.js';\n\nexport interface CaelAuditRecord {\n tick_iso: string;\n layer_hashes: string[];\n operation: string;\n prev_hash: string | null;\n fnv1a_chain: string;\n version_vector_fingerprint: string;\n brain_class?: string;\n trial?: number;\n attack_class?: string;\n defense_state?: string;\n /**\n * Trust-epoch tag for downstream consumers (Paper 25 gate clock,\n * fleet-health drift detector, retroactive corpus filters). Set to\n * `'post-w107'` for any record built after the 2026-04-26 W.107\n * artifact-grounding gate landed (HoloScript commit 4aab897ad). Records\n * without this field — i.e. anything in the audit store before the gate\n * was deployed — are implicitly `'pre-w107-untrusted'`. The mesh-worker-02\n * 27.5h hallucination class (fabricated \"100 scenes validated\" CAEL\n * records with no actual artifact) all live in the implicit-untrusted\n * cohort. Consumers should filter by `trust_epoch === 'post-w107'`\n * before treating CAEL records as evidence of real work.\n */\n trust_epoch?: 'post-w107';\n}\n\nexport interface BuildCaelRecordInput {\n identity: AgentIdentity;\n brain: RuntimeBrainConfig;\n task: BoardTask;\n messages: LLMMessage[];\n finalText: string;\n usage: TokenUsage;\n costUsd: number;\n spentUsd: number;\n prevChain: string | null;\n runtimeVersion: string;\n}\n\nfunction sha(input: string): string {\n return createHash('sha256').update(input, 'utf8').digest('hex');\n}\n\n/**\n * Extract the brain class from a runtime brain config. Tries multiple sources\n * because brainPath shape varies across deployment environments:\n * 1. compositions/<class>-brain.hsplus (canonical layout — caught 2026-04-24)\n * 2. <anything>/<class>-brain.hsplus (loose match — Vast.ai box layout)\n * 3. <class>-brain.hsplus basename only\n * 4. brain.domain (loaded from .hsplus identity block by loadBrain())\n * 5. 'unknown' if all sources fail\n *\n * Live evidence (2026-04-25 mesh-worker-01 record): the strict regex returned\n * 'unknown' against the production worker box's brainPath, leaving every CAEL\n * fingerprint useless for fleet attribution. This loosened version recovers\n * brain class even when path layout drifts from the compositions/-rooted form.\n */\nfunction brainClassOf(brain: { brainPath?: string; domain?: string }): string {\n const p = String(brain.brainPath ?? '');\n // Tier 1: canonical compositions/-rooted layout.\n let m = p.match(/compositions[\\\\/]([\\w-]+)-brain\\.hsplus$/);\n if (m) return m[1];\n // Tier 2: any path with `<class>-brain.hsplus` basename.\n m = p.match(/([\\w-]+)-brain\\.hsplus$/);\n if (m) return m[1];\n // Tier 3: bare basename.\n m = p.match(/([\\w-]+)\\.hsplus$/);\n if (m) return m[1];\n // Tier 4: domain field from the loaded brain composition's identity block.\n const domain = String(brain.domain ?? '').trim();\n if (domain && domain !== 'unknown') return domain;\n return 'unknown';\n}\n\nexport function buildCaelRecord(input: BuildCaelRecordInput): CaelAuditRecord {\n const {\n identity,\n brain,\n task,\n messages,\n finalText,\n usage,\n costUsd,\n spentUsd,\n prevChain,\n runtimeVersion,\n } = input;\n\n const l0 = sha(brain.systemPrompt);\n const l1 = sha(`${task.id}|${task.title}|${task.description ?? ''}`);\n const l2 = sha(JSON.stringify(messages));\n const l3 = sha(finalText);\n const l4 = sha(JSON.stringify(usage));\n const l5 = sha(`${costUsd.toFixed(6)}|${spentUsd.toFixed(6)}`);\n const l6 = sha([l0, l1, l2, l3, l4, l5].join('|'));\n\n const fnv1a_chain = sha(`${prevChain ?? ''}|${l6}`);\n\n return {\n tick_iso: new Date().toISOString(),\n layer_hashes: [l0, l1, l2, l3, l4, l5, l6],\n operation: `task-executed:${task.id}`,\n prev_hash: prevChain,\n fnv1a_chain,\n version_vector_fingerprint: `agent@${runtimeVersion}|brain@${brainClassOf(brain)}|provider@${identity.llmProvider}|model@${identity.llmModel}`,\n brain_class: brainClassOf(brain),\n trust_epoch: 'post-w107',\n };\n}\n","/**\n * Tool runner for headless mesh agents.\n *\n * Provides a small, sandboxed set of tools that LLM agents can call during\n * task execution. Anthropic tool-use shape — these specs are passed to\n * `messages.stream({ tools: [...] })`, the model returns `tool_use` blocks,\n * the runner executes them via `runTool()` and feeds results back as\n * `tool_result` blocks until the model emits its final text response.\n *\n * Sandbox model:\n * - read_file / list_dir: restricted to ALLOWED_READ_ROOTS (task inputs +\n * read-only views of the cloned repo). No /etc, no /home, no /root/.ssh.\n * - write_file: restricted to ALLOWED_WRITE_ROOTS (just /root/agent-output/).\n * Creates dir if needed, refuses paths that escape via .. or symlinks.\n * - bash: ONLY whitelisted command prefixes (lake build, lean ..., ls, cat,\n * grep, find, wc, head, tail, git status/log/diff/show, pnpm --filter,\n * vitest run --no-coverage). Hard 60s wall timeout, 1MB stdout cap. Refuses\n * anything else (rm, curl, ssh, sudo, eval, etc.).\n * - http_request: HTTPS GET only, 30s timeout, 200KB cap. Private IP ranges\n * (RFC-1918/loopback/link-local) are blocked to prevent SSRF against the\n * host network. Read-only — does not count as a productive tool call.\n *\n * The sandbox is best-effort host isolation — these instances are dedicated\n * to a single mesh-worker identity, so we trade some flexibility for a clear\n * \"what the LLM can do\" contract that audits cleanly.\n */\n\nimport { readFile, writeFile, readdir, mkdir, stat } from 'node:fs/promises';\nimport { resolve, dirname, delimiter, isAbsolute, sep } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport type { ToolSpec, ToolUseBlock, ToolResultBlock } from '@holoscript/llm-provider';\n\n// ---------------------------------------------------------------------------\n// Sandbox roots — keep narrow. Add only when a task needs more.\n//\n// Env-overridable so the SAME runner serves both deployments:\n// - Vast fleet instance: the /root/* defaults below (clone + scp layout).\n// - Local node (laptop / Jetson): point at the local checkout + a local\n// output dir via HOLOSCRIPT_AGENT_READ_ROOTS / _WRITE_ROOTS.\n// Format: OS-path-separator-delimited list (':' on POSIX, ';' on Windows) —\n// e.g. HOLOSCRIPT_AGENT_READ_ROOTS=\"/home/user/HoloScript:/home/user/agent-output\".\n// Unset → fleet defaults (no behavior change on the existing workers).\n// ---------------------------------------------------------------------------\nconst FLEET_READ_ROOTS = [\n '/root/msc-paper-22', // Paper 22 mechanization inputs (scp'd by deploy)\n '/root/holoscript-mesh', // Read-only repo view (clone path on instance)\n '/root/agent-output', // Read back what we wrote\n];\n\nconst FLEET_WRITE_ROOTS = [\n '/root/agent-output', // Single write sink — keeps deliverables in one place\n];\n\nfunction parseRootsEnv(raw: string | undefined, fallback: string[]): string[] {\n if (!raw) return fallback;\n const roots = raw\n .split(delimiter)\n .map((r) => r.trim())\n .filter((r) => r.length > 0 && isAbsolute(r));\n return roots.length > 0 ? roots : fallback;\n}\n\nconst ALLOWED_READ_ROOTS = parseRootsEnv(\n process.env.HOLOSCRIPT_AGENT_READ_ROOTS,\n FLEET_READ_ROOTS,\n);\n\nconst ALLOWED_WRITE_ROOTS = parseRootsEnv(\n process.env.HOLOSCRIPT_AGENT_WRITE_ROOTS,\n FLEET_WRITE_ROOTS,\n);\n\n// Command-prefix whitelist. Prefix-match is intentional — `lake build MSC`\n// matches `lake build`, `pnpm --filter @holoscript/core build` matches\n// `pnpm --filter`, etc. Refuses anything else (no sudo, rm, curl, ssh, eval).\n//\n// Two-tier classification (W.107 tightening 2026-04-26):\n// READ_ONLY — observation-only commands. Pass execution policy, but do\n// NOT count as artifact-producing for the W.107 gate.\n// PRODUCTIVE — commands that build, test, or otherwise produce a real\n// artifact (compile output, test result, etc.). DO count as\n// artifact-producing for the W.107 gate.\n//\n// Pre-tightening, the gate accepted ANY bash call as side-effecting — so\n// `bash echo done` would falsely pass the gate. Now `echo` is read-only and\n// the worker must call something productive (lake build / pnpm --filter\n// build / vitest run / lean compile / etc.) to claim `executed`.\nconst BASH_READ_ONLY_PREFIXES = [\n 'ls ',\n 'ls\\n',\n 'ls$',\n 'cat ',\n 'grep ',\n 'rg ',\n 'find ',\n 'wc ',\n 'head ',\n 'tail ',\n 'git status',\n 'git log',\n 'git diff',\n 'git show',\n 'pwd',\n 'echo ',\n 'lake env',\n];\n\nconst BASH_PRODUCTIVE_PREFIXES = [\n 'lake build',\n 'lake clean',\n 'lean ',\n 'pnpm --filter',\n 'pnpm vitest',\n 'vitest run',\n // Robotics / edge-node (Jetson) productive commands — without these, every\n // ros2/colcon/tegrastats task fails the W.107 artifact gate and is abandoned\n // as no-artifact. (jetson-orin-01 lane.)\n 'ros2 launch',\n 'ros2 topic pub',\n 'ros2 service call',\n 'colcon build',\n 'tegrastats',\n];\n\nconst BASH_WHITELIST = [...BASH_READ_ONLY_PREFIXES, ...BASH_PRODUCTIVE_PREFIXES];\n\n/**\n * Returns true iff `cmd` matches a productive prefix — i.e. would produce a\n * real artifact (compile/test/build output) rather than just observing state.\n * Used by the W.107 artifact-grounding gate in runner.ts.\n */\nexport function isProductiveBashCommand(cmd: string): boolean {\n const trimmed = String(cmd ?? '').trim();\n if (!trimmed) return false;\n return BASH_PRODUCTIVE_PREFIXES.some((prefix) => trimmed.startsWith(prefix.trim()));\n}\n\n/**\n * True iff a single tool_use is a *productive* (artifact-producing) call for the\n * W.107.b artifact-grounding gate:\n * - write_file with non-empty content,\n * - bash with a productive prefix (isProductiveBashCommand),\n * - emit_hardware_receipt (always writes a receipt file).\n * read_file / list_dir and read-only / trivial bash are NOT productive.\n *\n * This is the SINGLE SOURCE OF TRUTH the runner's gate (runner.ts) and the\n * artifact-gate ablation harness both consume — so the measured gate can never\n * drift from the shipped gate (the ablation measures the real thing, not a copy).\n */\nexport function isProductiveToolUse(use: ToolUseBlock): boolean {\n const input = (use.input ?? {}) as Record<string, unknown>;\n switch (use.name) {\n case 'write_file':\n return String(input.content ?? '').length > 0;\n case 'bash':\n return isProductiveBashCommand(String(input.cmd ?? ''));\n case 'emit_hardware_receipt':\n return true;\n case 'str_replace':\n return true;\n case 'vision_analyze':\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Accumulate the productive-call count + the tool names seen across one model\n * turn's tool_use blocks. The runner adds `names` to its toolsCalled set and\n * `productiveCount` to its gate counter.\n */\nexport function summarizeToolProductivity(uses: readonly ToolUseBlock[]): {\n productiveCount: number;\n names: string[];\n} {\n let productiveCount = 0;\n const names: string[] = [];\n for (const u of uses) {\n names.push(u.name);\n if (isProductiveToolUse(u)) productiveCount++;\n }\n return { productiveCount, names };\n}\n\n// ---------------------------------------------------------------------------\n// Tool specs surfaced to the LLM\n// ---------------------------------------------------------------------------\nexport const MESH_TOOLS: ToolSpec[] = [\n {\n name: 'read_file',\n description:\n `Read a file from the agent sandbox. Allowed roots: ${ALLOWED_READ_ROOTS.join(', ')}. ` +\n 'Returns the file content as text. Use this to inspect task inputs and the ' +\n 'read-only repo view.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Absolute path under an allowed read root' },\n },\n required: ['path'],\n },\n },\n {\n name: 'list_dir',\n description:\n 'List entries in a directory under the agent sandbox. Same root restrictions ' +\n 'as read_file. Returns a newline-separated list of entries.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Absolute path under an allowed read root' },\n },\n required: ['path'],\n },\n },\n {\n name: 'write_file',\n description:\n `Write a file to the deliverable sink (write roots: ${ALLOWED_WRITE_ROOTS.join(', ')}). ` +\n 'Anything you want to emit as task output (a Lean proof, a markdown report, a JSON ' +\n 'dataset, a .holo scene) goes here. Creates parent directories. Will refuse paths ' +\n 'outside the write root(s).',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: `Absolute path under a write root: ${ALLOWED_WRITE_ROOTS.join(', ')}` },\n content: { type: 'string', description: 'File content to write (UTF-8)' },\n },\n required: ['path', 'content'],\n },\n },\n {\n name: 'bash',\n description:\n 'Run a shell command. Whitelisted prefixes only: lake build, lean, ls, cat, ' +\n 'grep, find, wc, head, tail, git status/log/diff/show, pnpm --filter, vitest run, ' +\n 'pwd, echo, ros2 launch/topic/service, colcon build, tegrastats. ' +\n 'Hard 60s wall timeout, 1MB stdout cap. Use for builds, tests, hardware probes. ' +\n 'Refuses rm, curl, ssh, sudo, eval.',\n input_schema: {\n type: 'object',\n properties: {\n cmd: { type: 'string', description: 'Whitelisted shell command' },\n cwd: { type: 'string', description: 'Optional working directory (defaults to /root)' },\n },\n required: ['cmd'],\n },\n },\n {\n name: 'http_request',\n description:\n 'HTTPS GET a public URL and return the response body as text. ' +\n 'HTTPS only — http:// and private IPs (RFC-1918, loopback, link-local) are blocked. ' +\n '200KB cap, 30s timeout. Read-only: does not satisfy the write_file artifact gate.',\n input_schema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'https:// URL to fetch' },\n headers: {\n type: 'object',\n description: 'Optional request headers (e.g. {\"Accept\": \"application/json\"})',\n },\n },\n required: ['url'],\n },\n },\n {\n name: 'emit_hardware_receipt',\n description:\n 'Emit a portable hardware receipt (PortableHardwareReceiptMetadata v1) capturing ' +\n 'device identity, runtime, and measured performance. Writes a JSON receipt to the ' +\n 'agent output dir. Use after running tegrastats or colcon build to record hardware ' +\n 'evidence for the CAEL audit chain. Accepts either pre-parsed measurements or raw ' +\n 'tegrastats output (the tool parses it automatically).',\n input_schema: {\n type: 'object',\n properties: {\n device_kind: {\n type: 'string',\n description: 'Device identifier, e.g. \"jetson-orin-nano-super\", \"raspberry-pi-5\"',\n },\n accelerator: {\n description: 'Accelerator string, e.g. \"NVIDIA CUDA 8.7\", or null for CPU-only',\n },\n runtime_name: { type: 'string', description: 'Inference runtime, e.g. \"Ollama\", \"llama.cpp\"' },\n runtime_version: { type: 'string', description: 'Runtime version, e.g. \"0.30.8\"' },\n host_os: { type: 'string', description: 'OS + firmware, e.g. \"JetPack 6.2.1 / Ubuntu 22.04\"' },\n composition_id: { type: 'string', description: 'Brain composition reference, e.g. \"jetson-orin-brain\"' },\n measurements: {\n type: 'array',\n description: 'Pre-parsed measurements. Each item: {metric: string, value: number, unit: string}',\n items: { type: 'object' },\n },\n tegrastats_output: {\n type: 'string',\n description: 'Raw tegrastats output line(s) — tool auto-parses GPU%, RAM, temp, power',\n },\n },\n required: ['device_kind', 'runtime_name', 'runtime_version', 'host_os'],\n },\n },\n {\n name: 'str_replace',\n description:\n 'Surgical in-place edit of a file: find an exact string and replace it. ' +\n 'The old string must appear exactly once in the file — if it appears zero or more than once ' +\n 'the tool returns an error with the actual count, letting you refine the search string. ' +\n 'Only files under the write root(s) can be edited. ' +\n 'Counts as a productive tool call (equivalent to write_file).',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: `Absolute path under a write root: ${ALLOWED_WRITE_ROOTS.join(', ')}` },\n old: { type: 'string', description: 'Exact string to find (must occur exactly once)' },\n new: { type: 'string', description: 'Replacement string' },\n },\n required: ['path', 'old', 'new'],\n },\n },\n {\n name: 'delegate_task',\n description:\n 'Post a new task to the team board so another agent can claim and execute it. ' +\n 'Use this to spawn sub-work the current agent cannot or should not do itself ' +\n '(e.g. a vision task for jetson-orin-fara, a cloud compute task for the fleet). ' +\n 'The task appears on the shared board and is claimed by the first agent with matching capability tags.',\n input_schema: {\n type: 'object',\n properties: {\n title: { type: 'string', description: 'Task title (max 200 chars)' },\n description: { type: 'string', description: 'Detailed task description (max 2000 chars)' },\n priority: { type: 'number', description: 'Priority 1-10 (1 = critical, default 5)' },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Capability tags for routing to the right agent, e.g. [\"vision\",\"edge\"]',\n },\n source: { type: 'string', description: 'Where this subtask came from (e.g. parent task id)' },\n },\n required: ['title'],\n },\n },\n {\n name: 'vision_analyze',\n description:\n 'Analyze an image using the local Fara-7B vision model (Ollama on loopback). ' +\n 'Reads the image file at `image_path` (max 512KB — downscale larger images first), ' +\n 'sends it to the vision model via the local Ollama API (env: HOLOSCRIPT_AGENT_VISION_MODEL), ' +\n 'and returns the model\\'s text analysis. ' +\n 'Counts as a productive tool call — use for GUI-grounding, visual QA, image captioning, ' +\n 'or any task that requires perceiving image content. ' +\n 'Only available on surfaces with a local Ollama instance and HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL set.',\n input_schema: {\n type: 'object',\n properties: {\n image_path: {\n type: 'string',\n description: 'Absolute path to the image file (png, jpg, webp) — must be under 512KB',\n },\n prompt: {\n type: 'string',\n description: 'Instruction for the vision model (default: \"Describe this image in detail.\")',\n },\n model: {\n type: 'string',\n description: 'Ollama model tag override (default: HOLOSCRIPT_AGENT_VISION_MODEL env var)',\n },\n },\n required: ['image_path'],\n },\n },\n];\n\n// ---------------------------------------------------------------------------\n// Active-tool resolution (F.126 #1 — author behavior as DATA the runtime consumes)\n// ---------------------------------------------------------------------------\n/**\n * Assemble the tool set the model sees from the brain's OWN DECLARATION — the\n * `behavior on_task { llm_call { tools: [...] } }` array — instead of a hardcoded\n * list. This is principle #1 of the native doctrine (F.126): the runtime consumes\n * the brain's authored capability set, so \"add a tool\" becomes \"declare it in the\n * brain,\" not \"edit this TypeScript.\" Fixes the dead-data bug where every brain's\n * declared tools were ignored and local-llm brains were amputated to write_file-only.\n *\n * - Declared names are resolved against the available specs; an unknown name is\n * dropped (the runner logs it) so a typo can't crash the loop.\n * - A brain that declares NO tools falls back to the prior safe default\n * (write_file-only for small local-llm models — the artifact-grounding floor;\n * full menu otherwise) so this is backward-compatible.\n * - W.710 progressive disclosure: a small local model can overflow its num_ctx\n * output budget reasoning over a big menu before it emits a tool call, so a\n * declared set larger than the budget is SLIM-trimmed (write_file kept first)\n * for local-llm brains. Budget via HOLOSCRIPT_AGENT_TOOL_BUDGET (default 6).\n */\nexport function resolveActiveTools(\n brain: { requires: string[]; onTaskActions?: Array<{ verb: string; config?: Record<string, unknown> }> },\n opts: { all?: ToolSpec[]; isLocal?: boolean; budget?: number } = {}\n): { tools: ToolSpec[]; declared: string[]; dropped: string[] } {\n const all = opts.all ?? MESH_TOOLS;\n const isLocal = opts.isLocal ?? brain.requires.includes('local-llm');\n const budget = opts.budget ?? (Number(process.env.HOLOSCRIPT_AGENT_TOOL_BUDGET) || 6);\n\n const declaredRaw = brain.onTaskActions?.find((a) => a.verb === 'llm_call')?.config?.tools;\n const declared = Array.isArray(declaredRaw)\n ? declaredRaw.filter((n): n is string => typeof n === 'string')\n : [];\n\n if (declared.length === 0) {\n // No declaration → prior safe default (backward-compatible).\n const fallback = isLocal ? all.filter((t) => t.name === 'write_file') : all;\n return { tools: fallback, declared: [], dropped: [] };\n }\n\n const dropped = declared.filter((n) => !all.some((t) => t.name === n));\n let resolved = declared\n .map((n) => all.find((t) => t.name === n))\n .filter((t): t is ToolSpec => Boolean(t));\n if (resolved.length === 0) resolved = all.filter((t) => t.name === 'write_file'); // never hand the model an empty toolset\n\n // num_ctx guard for small models: trim a large declared set, keeping write_file (grounding) first.\n if (isLocal && resolved.length > budget) {\n const wf = resolved.filter((t) => t.name === 'write_file');\n const rest = resolved.filter((t) => t.name !== 'write_file');\n resolved = [...wf, ...rest].slice(0, budget);\n }\n return { tools: resolved, declared, dropped };\n}\n\n// ---------------------------------------------------------------------------\n// SSRF guard — block private/loopback/link-local hosts (RFC-1918 + RFC-5735)\n// ---------------------------------------------------------------------------\nconst PRIVATE_IP_RE =\n /^(127\\.|10\\.|192\\.168\\.|172\\.(1[6-9]|2\\d|3[01])\\.|169\\.254\\.|0\\.|::1$|fc[0-9a-f]{2}:|fd[0-9a-f]{2}:)/i;\n\nfunction checkHttpAllowed(rawUrl: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return `invalid URL: \"${rawUrl}\"`;\n }\n if (parsed.protocol !== 'https:') {\n return `only https:// is allowed, got \"${parsed.protocol}\"`;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === 'localhost' || PRIVATE_IP_RE.test(host)) {\n return `host \"${host}\" is a private/loopback address — blocked to prevent SSRF`;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Path-sandbox helpers\n// ---------------------------------------------------------------------------\nfunction isUnderRoot(absPath: string, root: string): boolean {\n const resolved = resolve(absPath);\n const rootResolved = resolve(root);\n return resolved === rootResolved || resolved.startsWith(rootResolved + sep);\n}\n\nfunction checkReadAllowed(path: string): string | null {\n if (!isAbsolute(path)) return `path must be absolute, got \"${path}\"`;\n for (const root of ALLOWED_READ_ROOTS) {\n if (isUnderRoot(path, root)) return null;\n }\n return `read denied — path \"${path}\" not under allowed roots: ${ALLOWED_READ_ROOTS.join(', ')}`;\n}\n\nfunction checkWriteAllowed(path: string): string | null {\n if (!isAbsolute(path)) return `path must be absolute, got \"${path}\"`;\n for (const root of ALLOWED_WRITE_ROOTS) {\n if (isUnderRoot(path, root)) return null;\n }\n return `write denied — path \"${path}\" not under allowed roots: ${ALLOWED_WRITE_ROOTS.join(', ')}`;\n}\n\nfunction checkBashAllowed(cmd: string): string | null {\n const trimmed = cmd.trim();\n if (trimmed.length === 0) return 'empty command';\n // Reject obvious shell-injection attempts. Whitelist below still applies.\n if (/[;&|`$<>]|>>|\\|\\||&&/.test(trimmed)) {\n return `command contains shell metachars (; & | \\` $ < > >> || &&) — not allowed for safety`;\n }\n for (const prefix of BASH_WHITELIST) {\n if (trimmed.startsWith(prefix.trim())) return null;\n }\n return `command not on whitelist. Allowed prefixes: ${BASH_WHITELIST.join(' / ')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Tool implementations\n// ---------------------------------------------------------------------------\n/** Optional capabilities the caller (runner) can inject into a tool run. */\nexport interface RunToolOptions {\n /**\n * Sign a hardware receipt's canonical body. Injected by index.ts from the seat\n * wallet (ethers EIP-191). Absent → the receipt is content-hashed but unsigned\n * and self-reports `signed:false`, so it can never overclaim.\n */\n signReceipt?: (canonical: string) => Promise<{ alg: string; signer: string; signature: string }>;\n /**\n * Post new tasks to the team board. Injected by runner.ts from mesh.addTasks().\n * Absent → delegate_task returns an error explaining the capability is unavailable.\n */\n addTask?: (tasks: Array<{ title: string; description?: string; priority?: number; source?: string; tags?: string[] }>) => Promise<{ added: number }>;\n}\n\nexport async function runTool(use: ToolUseBlock, opts: RunToolOptions = {}): Promise<ToolResultBlock> {\n try {\n if (use.name === 'read_file') {\n const path = use.input.path as string;\n const denied = checkReadAllowed(path);\n if (denied) return errResult(use.id, denied);\n const text = await readFile(path, 'utf8');\n // Cap at 200KB to avoid context blowups\n const truncated =\n text.length > 200_000\n ? text.slice(0, 200_000) + `\\n…[truncated, full file is ${text.length} bytes]`\n : text;\n return okResult(use.id, truncated);\n }\n\n if (use.name === 'list_dir') {\n const path = use.input.path as string;\n const denied = checkReadAllowed(path);\n if (denied) return errResult(use.id, denied);\n const entries = await readdir(path, { withFileTypes: true });\n const lines = entries.map((e) => `${e.isDirectory() ? 'd' : '-'} ${e.name}`);\n return okResult(use.id, lines.join('\\n'));\n }\n\n if (use.name === 'write_file') {\n const path = use.input.path as string;\n const content = use.input.content as string;\n const denied = checkWriteAllowed(path);\n if (denied) return errResult(use.id, denied);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, 'utf8');\n const s = await stat(path);\n return okResult(use.id, `wrote ${s.size} bytes to ${path}`);\n }\n\n if (use.name === 'bash') {\n const cmd = use.input.cmd as string;\n const cwd = (use.input.cwd as string | undefined) ?? '/root';\n const denied = checkBashAllowed(cmd);\n if (denied) return errResult(use.id, denied);\n const result = await runBash(cmd, cwd);\n return result.code === 0\n ? okResult(use.id, result.stdout)\n : errResult(use.id, `exit=${result.code}\\n${result.stderr || result.stdout}`);\n }\n\n if (use.name === 'http_request') {\n const rawUrl = String(use.input.url ?? '');\n const denied = checkHttpAllowed(rawUrl);\n if (denied) return errResult(use.id, denied);\n const userHeaders = (use.input.headers ?? {}) as Record<string, string>;\n const RESPONSE_CAP = 200_000;\n const TIMEOUT_MS = 30_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const res = await fetch(rawUrl, {\n method: 'GET',\n headers: { 'user-agent': 'holoscript-agent/1.0', ...userHeaders },\n signal: controller.signal,\n });\n clearTimeout(timer);\n const buf = await res.arrayBuffer();\n const text = new TextDecoder('utf-8', { fatal: false }).decode(buf);\n const truncated =\n text.length > RESPONSE_CAP\n ? text.slice(0, RESPONSE_CAP) + `\\n…[truncated, full body is ${text.length} chars]`\n : text;\n if (!res.ok) return errResult(use.id, `HTTP ${res.status} ${res.statusText}\\n${truncated}`);\n return okResult(use.id, truncated);\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n return errResult(use.id, msg.includes('abort') ? `request timed out after ${TIMEOUT_MS}ms` : msg);\n }\n }\n\n if (use.name === 'emit_hardware_receipt') {\n const deviceKind = String(use.input.device_kind ?? 'unknown-device');\n const accelerator =\n use.input.accelerator === null || use.input.accelerator === 'null'\n ? null\n : String(use.input.accelerator ?? '').trim() || null;\n const runtimeName = String(use.input.runtime_name ?? 'Ollama');\n const runtimeVersion = String(use.input.runtime_version ?? 'unknown');\n const hostOs = String(use.input.host_os ?? 'unknown');\n const compositionId = String(use.input.composition_id ?? 'unknown');\n\n // Collect measurements — from pre-parsed array and/or raw tegrastats output.\n let measurements: Array<{ metric: string; value: number; unit: string; method: string }> = [];\n if (Array.isArray(use.input.measurements)) {\n for (const m of use.input.measurements as Array<Record<string, unknown>>) {\n const metric = String(m.metric ?? '');\n const value = Number(m.value ?? 0);\n const unit = String(m.unit ?? '');\n if (metric && Number.isFinite(value)) {\n measurements.push({ metric, value, unit, method: 'measured' });\n }\n }\n }\n if (typeof use.input.tegrastats_output === 'string' && use.input.tegrastats_output.length > 0) {\n measurements = [...measurements, ...parseTegrastats(use.input.tegrastats_output as string)];\n }\n // Minimum 1 measurement so the schema validator doesn't reject the receipt.\n if (measurements.length === 0) {\n measurements.push({ metric: 'agent-tick', value: 1, unit: 'count', method: 'presence' });\n }\n\n const capturedAt = new Date().toISOString();\n const receipt = {\n schemaVersion: 'holoscript.hardware-receipt-metadata.v1',\n target: {\n id: `${deviceKind}-${Date.now()}`,\n kind: deviceKind,\n architecture: /jetson|orin|nano|agx|xavier/i.test(deviceKind) ? 'arm64' : 'unknown',\n artifactKind: 'measurement-trace',\n },\n device: {\n vendor: /jetson|orin|nvidia/i.test(deviceKind) ? 'nvidia' : 'unknown',\n model: deviceKind,\n accelerator,\n },\n runtime: { name: runtimeName, version: runtimeVersion, hostOS: hostOs },\n compilerVersion: 'holoscript-agent-1.0.0',\n constraints: [],\n measuredResults: measurements,\n replayInputs: [\n { kind: 'composition-ref', uri: `compositions/${compositionId}`, sha256: 'unknown' },\n ],\n provenance: {\n capturedAt,\n sourceCompositionHash: compositionId,\n },\n owner: {\n agent: process.env.HOLOSCRIPT_AGENT_HANDLE ?? 'unknown',\n ...(process.env.HOLOMESH_TEAM_ID ? { team: process.env.HOLOMESH_TEAM_ID } : {}),\n },\n };\n\n // Integrity seal (F.123 — a tamper-evident, not plain-JSON, receipt):\n // a deterministic SHA-256 content hash over the canonical body (keyless\n // content-addressing) plus an OPTIONAL wallet signature when a signer is\n // injected (index.ts wires the seat wallet). `signed` self-reports honestly\n // so an unsigned receipt can never masquerade as signed.\n const canonical = JSON.stringify(receipt);\n const contentHash = createHash('sha256').update(canonical).digest('hex');\n let signature: { alg: string; signer: string; signature: string } | null = null;\n if (opts.signReceipt) {\n try {\n signature = await opts.signReceipt(canonical);\n } catch {\n signature = null; // best-effort: an unsigned receipt is honest, not fatal\n }\n }\n const sealed = {\n ...receipt,\n integrity: { alg: 'sha256', contentHash, signed: Boolean(signature), signature },\n };\n\n // Slug timestamp: \"2026-06-16T07-35-01-000Z\"\n const ts = capturedAt.replace(/[:.]/g, '-');\n const outPath = resolve(ALLOWED_WRITE_ROOTS[0], `hardware-receipt-${ts}.json`);\n const denied = checkWriteAllowed(outPath);\n if (denied) return errResult(use.id, `Cannot write receipt: ${denied}`);\n await mkdir(dirname(outPath), { recursive: true });\n await writeFile(outPath, JSON.stringify(sealed, null, 2), 'utf8');\n return okResult(\n use.id,\n `Hardware receipt written to ${outPath} — ${measurements.length} measurements, ` +\n `contentHash=${contentHash.slice(0, 12)}…, signed=${Boolean(signature)}, accelerator=${accelerator ?? 'none'}`\n );\n }\n\n if (use.name === 'str_replace') {\n const path = use.input.path as string;\n const oldStr = use.input.old as string;\n const newStr = use.input.new as string;\n const denied = checkWriteAllowed(path);\n if (denied) return errResult(use.id, denied);\n const text = await readFile(path, 'utf8');\n // Count occurrences to guarantee exactly-one semantics.\n const count = text.split(oldStr).length - 1;\n if (count === 0) return errResult(use.id, `str_replace: \"old\" string not found in ${path} — 0 occurrences`);\n if (count > 1) return errResult(use.id, `str_replace: \"old\" string is ambiguous in ${path} — ${count} occurrences; add more surrounding context`);\n const updated = text.replace(oldStr, newStr);\n await writeFile(path, updated, 'utf8');\n const s = await stat(path);\n return okResult(use.id, `str_replace: replaced 1 occurrence in ${path} (${s.size} bytes)`);\n }\n\n if (use.name === 'delegate_task') {\n if (!opts.addTask) {\n return errResult(use.id, 'delegate_task: capability not available (no addTask callback injected — board posting requires a mesh connection)');\n }\n const title = String(use.input.title ?? '').trim();\n if (!title) return errResult(use.id, 'delegate_task: title is required');\n const description = use.input.description != null ? String(use.input.description) : undefined;\n const priority = use.input.priority != null ? Number(use.input.priority) : undefined;\n const source = use.input.source != null ? String(use.input.source) : undefined;\n const tags = Array.isArray(use.input.tags) ? (use.input.tags as unknown[]).map(String) : undefined;\n const result = await opts.addTask([{ title, description, priority, source, tags }]);\n return okResult(use.id, `delegate_task: posted \"${title}\" to board — ${result.added} task(s) added`);\n }\n\n if (use.name === 'vision_analyze') {\n const imagePath = String(use.input.image_path ?? '').trim();\n if (!imagePath) return errResult(use.id, 'vision_analyze: image_path is required');\n const denied = checkReadAllowed(imagePath);\n if (denied) return errResult(use.id, `vision_analyze: ${denied}`);\n const prompt = String(use.input.prompt ?? 'Describe this image in detail.');\n // Model: task can override via `model` param; env HOLOSCRIPT_AGENT_VISION_MODEL\n // is the surface default (set to the full Ollama tag on the device).\n const model = String(\n use.input.model ?? process.env.HOLOSCRIPT_AGENT_VISION_MODEL ?? 'fara:7b'\n );\n // Dedicated local-inference tool — /founder ruled 2026-06-18: NOT a bandaid.\n // SSRF guard in http_request is correct and stays; this tool is a different\n // trust boundary (fixed local model endpoint, path-sandboxed input, env-driven\n // URL — no user-controlled URL). D.098 + vision pillar #6.\n const ollamaBase = process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL;\n if (!ollamaBase) {\n return errResult(\n use.id,\n 'vision_analyze: HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL is not set — configure it to point to your local Ollama instance'\n );\n }\n const MAX_IMAGE_BYTES = 512_000; // ~512KB — larger images must be downscaled before passing to vision_analyze\n const TIMEOUT_MS = 120_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n const imageBytes = await readFile(imagePath);\n if (imageBytes.length > MAX_IMAGE_BYTES) {\n clearTimeout(timer);\n return errResult(\n use.id,\n `vision_analyze: image is ${Math.round(imageBytes.length / 1024)}KB — exceeds ${MAX_IMAGE_BYTES / 1024}KB limit. ` +\n 'Downscale the image first (e.g. to 256×256 or smaller) then retry vision_analyze.'\n );\n }\n const imageB64 = imageBytes.toString('base64');\n const res = await fetch(`${ollamaBase}/api/generate`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ model, prompt, images: [imageB64], stream: false }),\n signal: controller.signal,\n });\n clearTimeout(timer);\n if (!res.ok) {\n const text = await res.text();\n return errResult(use.id, `vision_analyze: Ollama HTTP ${res.status}: ${text.slice(0, 500)}`);\n }\n const json = (await res.json()) as { response?: string; error?: string };\n if (json.error) return errResult(use.id, `vision_analyze: model error — ${json.error}`);\n return okResult(use.id, json.response ?? '');\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n return errResult(\n use.id,\n msg.includes('abort') ? `vision_analyze: timed out after ${TIMEOUT_MS}ms` : `vision_analyze: ${msg}`\n );\n }\n }\n\n return errResult(use.id, `unknown tool: ${use.name}`);\n } catch (err) {\n return errResult(use.id, err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Parse a single tegrastats output line into structured measurements.\n * Handles the Jetson Orin / Nano / AGX format emitted by `tegrastats --interval 1000`.\n *\n * Example line:\n * 06-16-2026 07:35:01 RAM 2819/7618MB (lfb 73x4MB) SWAP 0/3809MB CPU [37%@1510,off,off]\n * EMC_FREQ 0% GR3D_FREQ 42% cpu@40.2C tj@41.25C VDD_CPU_CV 570mW VDD_SOC 1380mW\n */\nfunction parseTegrastats(raw: string): Array<{ metric: string; value: number; unit: string; method: string }> {\n const results: Array<{ metric: string; value: number; unit: string; method: string }> = [];\n const m = (pattern: RegExp, metric: string, unit: string, transform?: (v: string) => number) => {\n const match = raw.match(pattern);\n if (match?.[1]) {\n const value = transform ? transform(match[1]) : Number(match[1]);\n if (Number.isFinite(value)) results.push({ metric, value, unit, method: 'tegrastats' });\n }\n };\n\n // RAM: \"RAM 2819/7618MB\"\n const ram = raw.match(/RAM\\s+(\\d+)\\/(\\d+)MB/);\n if (ram) {\n const used = Number(ram[1]);\n const total = Number(ram[2]);\n results.push({ metric: 'ram-used', value: used, unit: 'MB', method: 'tegrastats' });\n results.push({ metric: 'ram-total', value: total, unit: 'MB', method: 'tegrastats' });\n if (total > 0)\n results.push({ metric: 'ram-pct', value: Math.round((used / total) * 100), unit: '%', method: 'tegrastats' });\n }\n\n m(/GR3D_FREQ\\s+(\\d+)%/, 'gpu-util', '%');\n m(/EMC_FREQ\\s+(\\d+)%/, 'emc-freq-pct', '%');\n m(/tj@([\\d.]+)C/, 'temp-tj', 'C', parseFloat);\n m(/cpu@([\\d.]+)C/, 'temp-cpu', 'C', parseFloat);\n m(/gpu@([\\d.]+)C/, 'temp-gpu', 'C', parseFloat);\n m(/VDD_SOC\\s+(\\d+)mW/, 'power-soc', 'mW');\n m(/VDD_CPU_CV\\s+(\\d+)mW/, 'power-cpu-cv', 'mW');\n m(/VDD_IN\\s+(\\d+)mW/, 'power-total', 'mW');\n\n // CPU first-core utilisation: \"CPU [37%@1510,...\"\n m(/CPU\\s+\\[(\\d+)%/, 'cpu-util-core0', '%');\n\n return results;\n}\n\ninterface BashResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nfunction runBash(cmd: string, cwd: string): Promise<BashResult> {\n // Test short-circuit (task_1778113854009_x6p3): under vitest, return a\n // fast synthetic exit instead of spawning bash. Without this, mocks that\n // emit a \"vitest run\" tool_use cause runner.test.ts to recursively spawn\n // vitest startup per tick (~1.7s each), pushing 3-tick tests over the\n // 5000ms timeout. Production paths (NODE_ENV != 'test', VITEST unset)\n // are unchanged and still spawn the real shell.\n if (process.env.VITEST === 'true' || process.env.NODE_ENV === 'test') {\n return Promise.resolve({\n code: 0,\n stdout: `[mock-bash under vitest] cmd=\"${cmd}\" cwd=\"${cwd}\"`,\n stderr: '',\n });\n }\n return new Promise((resolveProm) => {\n const child = spawn('bash', ['-c', cmd], { cwd, env: process.env });\n let stdout = '';\n let stderr = '';\n let killed = false;\n const STDOUT_CAP = 1_000_000;\n const TIMEOUT_MS = 60_000;\n const killer = setTimeout(() => {\n killed = true;\n child.kill('SIGKILL');\n }, TIMEOUT_MS);\n child.stdout.on('data', (d: Buffer) => {\n if (stdout.length < STDOUT_CAP) stdout += d.toString('utf8');\n });\n child.stderr.on('data', (d: Buffer) => {\n if (stderr.length < STDOUT_CAP) stderr += d.toString('utf8');\n });\n child.on('error', (err) => {\n clearTimeout(killer);\n resolveProm({ code: 1, stdout, stderr: stderr + '\\nspawn-error: ' + err.message });\n });\n child.on('exit', (code) => {\n clearTimeout(killer);\n const finalStdout =\n stdout.length >= STDOUT_CAP\n ? stdout + `\\n…[stdout truncated at ${STDOUT_CAP} bytes]`\n : stdout;\n const note = killed ? `\\n[bash killed after ${TIMEOUT_MS}ms timeout]` : '';\n resolveProm({ code: code ?? 1, stdout: finalStdout + note, stderr });\n });\n });\n}\n\nfunction okResult(id: string, content: string): ToolResultBlock {\n return { type: 'tool_result', tool_use_id: id, content };\n}\n\nfunction errResult(id: string, message: string): ToolResultBlock {\n return { type: 'tool_result', tool_use_id: id, content: message, is_error: true };\n}\n","/**\n * On-task cognitive verbs — the edge executor (Phase 2.2).\n *\n * A brain's `behavior on_task { … }` block parses into an ordered sequence of\n * cognitive verbs (brain.ts extractOnTaskActions). The lightweight AgentRunner\n * executes them WITHOUT a @holoscript/core / engine dependency — provider + mesh\n * only — so the edge package keeps its clean publish dep-closure:\n *\n * - `llm_call { prompt }` → append the prompt as a domain directive (was the\n * only wired verb before this; W.736).\n * - `rag_query { query }` → retrieve from TEAM knowledge → inject as context.\n * - `recall { query }` → retrieve from the agent's PRIVATE workspace →\n * filter by query client-side → inject.\n * - `plan { goal|prompt }` → one provider call producing a short plan → inject.\n *\n * Each verb is best-effort: a retrieval/plan failure is logged and skipped, never\n * breaking the tick. The verbs run in authored order and their outputs accumulate\n * onto the system prompt the tool-loop sees. `reflect` is handled separately\n * (post-artifact gate in runner.ts), not here.\n *\n * @module holoscript-agent/cognitive-verbs\n */\nimport type { KnowledgeEntry } from './holomesh-client.js';\nimport type { OnTaskAction } from './types.js';\n\nexport interface CognitiveVerbDeps {\n /** The brain's base system prompt to augment. */\n systemPrompt: string;\n /** Parsed `behavior on_task` verbs, in authored order. */\n onTaskActions: OnTaskAction[];\n /** Task being executed (for `plan` goal fallback + logging). */\n task: { id: string; title: string };\n /** TEAM knowledge retrieval (rag_query, keyword/semantic). */\n queryTeamKnowledge: (query: string, limit: number) => Promise<KnowledgeEntry[]>;\n /**\n * Codebase GraphRAG semantic search (rag_query Phase 2.3, W.753).\n * Optional — when absent OR it returns [] (graph not loaded), rag_query falls\n * back to team-knowledge search. Wires the in-process HoloEmbed index via the\n * bearer-gated mesh route POST /api/holomesh/codebase/search.\n */\n queryCodebase?: (query: string, topK: number) => Promise<Array<{ name: string; file: string; line?: number; type: string; score: number; signature?: string | null }>>;\n /** PRIVATE workspace retrieval (recall). */\n queryPrivateKnowledge: () => Promise<KnowledgeEntry[]>;\n /** One-shot provider planner (plan). Optional — when absent, `plan` is skipped. */\n plan?: (prompt: string) => Promise<string>;\n /**\n * Embed text for SEMANTIC `recall` (the fleet nomic model). Optional — when absent\n * OR it returns null (no fleet/registry reachable), `recall` falls back to the\n * substring filter. Pairs with `similarity`. (W.753: recall should rank via the\n * semantic stack, not keyword-match the private workspace.)\n */\n embed?: (text: string) => Promise<number[] | null>;\n /** Cosine similarity for ranking recalled entries (required alongside `embed`). */\n similarity?: (a: number[], b: number[]) => number;\n /** Structured logger. */\n log: (ev: Record<string, unknown>) => void;\n}\n\nconst DEFAULT_LIMIT = 5;\n/** Cap injected context so the edge model's num_ctx isn't blown (qwen3:4b). */\nconst MAX_ENTRY_CHARS = 320;\nconst MAX_INJECTED_CHARS = 2400;\n/** Cap entries embedded per recall so a large private store can't stall a tick. */\nconst MAX_RECALL_EMBED = 40;\n\nfunction strField(config: Record<string, unknown>, ...keys: string[]): string {\n for (const k of keys) {\n const v = config[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n }\n return '';\n}\n\nfunction numField(config: Record<string, unknown>, key: string, fallback: number): number {\n const v = config[key];\n return typeof v === 'number' && Number.isFinite(v) ? v : fallback;\n}\n\nfunction formatEntries(entries: KnowledgeEntry[]): string {\n let out = '';\n for (const e of entries) {\n const line = `- ${(e.content ?? '').replace(/\\s+/g, ' ').trim().slice(0, MAX_ENTRY_CHARS)}`;\n if (out.length + line.length > MAX_INJECTED_CHARS) break;\n out += (out ? '\\n' : '') + line;\n }\n return out;\n}\n\n/**\n * Execute a brain's on_task cognitive verbs and return the augmented system\n * prompt the tool-loop should use. Pure-ish: all I/O is injected via deps.\n */\nexport async function augmentWithOnTaskCognition(deps: CognitiveVerbDeps): Promise<string> {\n let content = deps.systemPrompt;\n if (!deps.onTaskActions || deps.onTaskActions.length === 0) return content;\n\n for (const action of deps.onTaskActions) {\n try {\n switch (action.verb) {\n case 'llm_call': {\n const prompt = strField(action.config, 'prompt');\n if (prompt) {\n content += `\\n\\n[Brain on_task directive]\\n${prompt}`;\n deps.log({ ev: 'on-task-llm-call', taskId: deps.task.id, promptLen: prompt.length });\n }\n break;\n }\n case 'rag_query': {\n const query = strField(action.config, 'query', 'q') || deps.task.title;\n const limit = numField(action.config, 'limit', DEFAULT_LIMIT);\n // Phase 2.3 (W.753): try codebase GraphRAG (in-process HoloEmbed via the mesh bearer\n // route) first — returns ranked symbols (name/file/score). Falls back to team-knowledge\n // search when the graph isn't loaded or the dep isn't wired.\n let mode = 'team-knowledge';\n let injected = '';\n if (deps.queryCodebase) {\n const symbols = await deps.queryCodebase(query, limit);\n if (symbols.length > 0) {\n mode = 'codebase-graphrag';\n const lines = symbols\n .slice(0, limit)\n .map(\n (s) =>\n `- ${s.name} (${s.type}) ${s.file}${s.line != null ? `:${s.line}` : ''}` +\n (s.signature ? ` — ${s.signature.slice(0, 80)}` : '') +\n ` [score:${s.score.toFixed(2)}]`\n )\n .join('\\n');\n injected = `\\n\\n[Codebase search for \"${query}\"]\\n${lines}`;\n }\n }\n if (!injected) {\n // Fallback: team knowledge store (already semantic via HoloEmbed ranking, bb28ecc25).\n const entries = await deps.queryTeamKnowledge(query, limit);\n if (entries.length > 0) {\n injected = `\\n\\n[Retrieved knowledge for \"${query}\"]\\n${formatEntries(entries)}`;\n }\n }\n if (injected) content += injected;\n deps.log({ ev: 'on-task-rag-query', taskId: deps.task.id, query, mode, retrieved: injected ? limit : 0 });\n break;\n }\n case 'recall': {\n const query = strField(action.config, 'query', 'q');\n const limit = numField(action.config, 'limit', DEFAULT_LIMIT);\n const all = await deps.queryPrivateKnowledge();\n let matched: KnowledgeEntry[] | null = null;\n let mode = 'substring';\n // SEMANTIC recall (W.753): rank the private workspace by embedding-cosine\n // when an embed route resolves. Best-effort — any miss (no embed dep, fleet\n // unreachable, null vectors) drops to the substring filter below; never breaks the tick.\n if (deps.embed && deps.similarity && query && all.length > 0) {\n const qv = await deps.embed(query);\n if (qv) {\n const scored: Array<{ e: KnowledgeEntry; score: number }> = [];\n for (const e of all.slice(0, MAX_RECALL_EMBED)) {\n const ev = await deps.embed(e.content ?? '');\n if (ev) scored.push({ e, score: deps.similarity(qv, ev) });\n }\n if (scored.length > 0) {\n scored.sort((a, b) => b.score - a.score);\n matched = scored.slice(0, limit).map((s) => s.e);\n mode = 'semantic';\n }\n }\n }\n if (!matched) {\n const needle = query.toLowerCase();\n matched = (\n needle\n ? all.filter((e) => `${e.id ?? ''} ${e.content ?? ''}`.toLowerCase().includes(needle))\n : all\n ).slice(0, limit);\n }\n if (matched.length > 0) {\n content += `\\n\\n[Recalled memory${query ? ` for \"${query}\"` : ''}]\\n${formatEntries(matched)}`;\n }\n deps.log({ ev: 'on-task-recall', taskId: deps.task.id, query, recalled: matched.length, mode });\n break;\n }\n case 'plan': {\n if (!deps.plan) break;\n const goal = strField(action.config, 'goal', 'prompt', 'of') || deps.task.title;\n const planText = await deps.plan(\n `Produce a short numbered plan (max 6 steps) to accomplish this task. Be concrete and specific to the goal; do not execute it.\\n\\nGoal: ${goal}`\n );\n const trimmed = planText.trim().slice(0, MAX_INJECTED_CHARS);\n if (trimmed) {\n content += `\\n\\n[Plan]\\n${trimmed}`;\n deps.log({ ev: 'on-task-plan', taskId: deps.task.id, planLen: trimmed.length });\n }\n break;\n }\n // `reflect` is handled post-artifact in runner.ts, not here.\n default:\n break;\n }\n } catch (err) {\n deps.log({\n ev: 'on-task-verb-error',\n taskId: deps.task.id,\n verb: action.verb,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n return content;\n}\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport type { AgentIdentity, BoardTask, ExecutionResult } from './types.js';\n\nexport interface CommitHookOptions {\n outputDir: string;\n workingDir?: string;\n authorName?: string;\n authorEmail?: string;\n scope?: string;\n spawn?: typeof spawnSync;\n now?: () => Date;\n}\n\nexport interface CommitHookResult {\n filePath: string;\n commitHash?: string;\n staged: string[];\n message: string;\n}\n\nconst SAFE_HANDLE = /^[a-z0-9_-]{1,64}$/i;\n\nexport function makeCommitHook(opts: CommitHookOptions) {\n if (!opts.outputDir || opts.outputDir.trim().length === 0) {\n throw new Error('CommitHookOptions.outputDir is required');\n }\n const spawn = opts.spawn ?? spawnSync;\n const cwd = opts.workingDir ?? process.cwd();\n const outputDir = resolve(cwd, opts.outputDir);\n const now = opts.now ?? (() => new Date());\n const scope = opts.scope ?? 'agent';\n\n return async (\n result: ExecutionResult,\n task: BoardTask,\n identity: AgentIdentity\n ): Promise<CommitHookResult> => {\n if (!SAFE_HANDLE.test(identity.handle)) {\n throw new Error(`Refusing to commit: handle \"${identity.handle}\" must match ${SAFE_HANDLE}`);\n }\n const date = now().toISOString().slice(0, 10);\n const safeTaskId = task.id.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 80);\n const fileName = `${date}_${safeTaskId}_${identity.handle}.md`;\n const filePath = join(outputDir, fileName);\n\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, renderMemo(result, task, identity, date), 'utf8');\n\n const relPath = relativeTo(cwd, filePath);\n const addRes = spawn('git', ['add', relPath], { cwd, encoding: 'utf8' });\n if (addRes.status !== 0) {\n throw new Error(\n `git add failed: ${addRes.stderr || addRes.stdout || `exit ${addRes.status}`}`\n );\n }\n\n const message = renderCommitMessage({ scope, task, identity, result });\n const commitArgs = ['commit', '-m', message];\n if (opts.authorName && opts.authorEmail) {\n commitArgs.push('--author', `${opts.authorName} <${opts.authorEmail}>`);\n }\n const commitRes = spawn('git', commitArgs, { cwd, encoding: 'utf8' });\n if (commitRes.status !== 0) {\n throw new Error(\n `git commit failed: ${commitRes.stderr || commitRes.stdout || `exit ${commitRes.status}`}`\n );\n }\n\n const hashRes = spawn('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' });\n const commitHash = hashRes.status === 0 ? hashRes.stdout.trim() : undefined;\n\n return { filePath, commitHash, staged: [relPath], message };\n };\n}\n\nfunction renderMemo(\n result: ExecutionResult,\n task: BoardTask,\n identity: AgentIdentity,\n date: string\n): string {\n return [\n '---',\n `title: \"${task.title.replace(/\"/g, \"'\")}\"`,\n `task_id: ${task.id}`,\n `agent: ${identity.handle}`,\n `surface: ${identity.surface}`,\n `provider: ${identity.llmProvider}`,\n `model: ${identity.llmModel}`,\n `wallet: ${identity.wallet}`,\n `date: ${date}`,\n `tokens: ${result.usage.totalTokens}`,\n `cost_usd: ${result.costUsd.toFixed(4)}`,\n `duration_ms: ${result.durationMs}`,\n `tags: [${(task.tags ?? []).map((t) => JSON.stringify(t)).join(', ')}]`,\n '---',\n '',\n `# ${task.title}`,\n '',\n '## Task description',\n '',\n task.description ?? '(no description)',\n '',\n '## Agent response',\n '',\n result.responseText.trim(),\n '',\n ].join('\\n');\n}\n\nconst SUBJECT_MAX = 72;\n\nfunction renderCommitMessage(opts: {\n scope: string;\n task: BoardTask;\n identity: AgentIdentity;\n result: ExecutionResult;\n}): string {\n const suffix = ` [agent:${opts.identity.handle}]`;\n const prefix = `${opts.scope}: `;\n const titleBudget = Math.max(8, SUBJECT_MAX - prefix.length - suffix.length);\n const subject = `${prefix}${truncate(opts.task.title, titleBudget)}${suffix}`;\n const body = [\n '',\n `task: ${opts.task.id}`,\n `agent: ${opts.identity.handle} (${opts.identity.llmProvider}/${opts.identity.llmModel})`,\n `wallet: ${opts.identity.wallet}`,\n `cost: $${opts.result.costUsd.toFixed(4)} / ${opts.result.usage.totalTokens} tok / ${opts.result.durationMs}ms`,\n ].join('\\n');\n return `${subject}\\n${body}\\n`;\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction relativeTo(base: string, target: string): string {\n const b = base.replace(/\\\\/g, '/');\n const t = target.replace(/\\\\/g, '/');\n if (t.startsWith(b + '/')) return t.slice(b.length + 1);\n if (t === b) return '.';\n return t;\n}\n","import { createHash } from 'node:crypto';\nimport type {\n ILLMProvider,\n LLMCompletionRequest,\n LLMProviderName,\n TokenUsage,\n} from '@holoscript/llm-provider';\nimport type { CostGuard } from './cost-guard.js';\nimport type { AuditLog } from './audit-log.js';\nimport type { AgentIdentity } from './types.js';\n\nexport interface AblationProviderSpec {\n label: string;\n provider: LLMProviderName;\n model: string;\n build: () => Promise<ILLMProvider> | ILLMProvider;\n pricer?: (usage: TokenUsage) => number;\n}\n\nexport interface AblationTaskSpec {\n taskId: string;\n taskTitle: string;\n systemPrompt: string;\n userPrompt: string;\n brainPath?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface AblationCell {\n label: string;\n provider: LLMProviderName;\n model: string;\n responseText: string;\n usage: TokenUsage;\n costUsd: number;\n durationMs: number;\n finishReason: string;\n errorMessage?: string;\n}\n\nexport interface AblationMatrix {\n taskId: string;\n taskTitle: string;\n brainPath?: string;\n promptHash: string;\n cells: AblationCell[];\n totalCostUsd: number;\n startedAt: string;\n completedAt: string;\n budgetExhausted: boolean;\n}\n\nexport interface RunAblationOptions {\n task: AblationTaskSpec;\n providers: AblationProviderSpec[];\n costGuard?: CostGuard;\n timeoutPerCellMs?: number;\n auditLog?: AuditLog;\n matrixId?: string;\n identityFor?: (spec: AblationProviderSpec) => AgentIdentity;\n}\n\nexport async function runAblation(opts: RunAblationOptions): Promise<AblationMatrix> {\n const { task, providers, costGuard } = opts;\n const startedAt = new Date().toISOString();\n const promptHash = hashPrompt(task.systemPrompt, task.userPrompt);\n\n const request: LLMCompletionRequest = {\n messages: [\n { role: 'system', content: task.systemPrompt },\n { role: 'user', content: task.userPrompt },\n ],\n maxTokens: task.maxTokens ?? 2048,\n temperature: task.temperature ?? 0.4,\n };\n\n const cells: AblationCell[] = [];\n let budgetExhausted = false;\n const matrixId = opts.matrixId ?? `mx_${promptHash}_${Date.now()}`;\n\n for (const spec of providers) {\n if (costGuard?.isOverBudget()) {\n budgetExhausted = true;\n cells.push({\n label: spec.label,\n provider: spec.provider,\n model: spec.model,\n responseText: '',\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n costUsd: 0,\n durationMs: 0,\n finishReason: 'error',\n errorMessage: 'budget-exhausted-before-cell',\n });\n continue;\n }\n\n const t0 = Date.now();\n try {\n const provider = await spec.build();\n const cellPromise = provider.complete(request, spec.model);\n const response = opts.timeoutPerCellMs\n ? await withTimeout(cellPromise, opts.timeoutPerCellMs, spec.label)\n : await cellPromise;\n const durationMs = Date.now() - t0;\n\n const costUsd = spec.pricer\n ? spec.pricer(response.usage)\n : (costGuard?.recordUsage(spec.model, response.usage).costUsd ?? 0);\n if (spec.pricer && costGuard) {\n costGuard.recordUsage(spec.model, response.usage);\n }\n\n cells.push({\n label: spec.label,\n provider: spec.provider,\n model: spec.model,\n responseText: response.content,\n usage: response.usage,\n costUsd,\n durationMs,\n finishReason: response.finishReason,\n });\n recordAblationCellIfWired(opts, spec, {\n matrixId,\n promptHash,\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n costUsd,\n durationMs,\n finishReason: response.finishReason,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n cells.push({\n label: spec.label,\n provider: spec.provider,\n model: spec.model,\n responseText: '',\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n costUsd: 0,\n durationMs: Date.now() - t0,\n finishReason: 'error',\n errorMessage,\n });\n recordAblationCellIfWired(opts, spec, {\n matrixId,\n promptHash,\n promptTokens: 0,\n completionTokens: 0,\n costUsd: 0,\n durationMs: Date.now() - t0,\n finishReason: 'error',\n errorMessage,\n });\n }\n }\n\n return {\n taskId: task.taskId,\n taskTitle: task.taskTitle,\n brainPath: task.brainPath,\n promptHash,\n cells,\n totalCostUsd: cells.reduce((sum, c) => sum + c.costUsd, 0),\n startedAt,\n completedAt: new Date().toISOString(),\n budgetExhausted,\n };\n}\n\nexport function renderAblationMarkdown(matrix: AblationMatrix): string {\n const header = [\n `# Ablation: ${matrix.taskTitle}`,\n '',\n `- task_id: \\`${matrix.taskId}\\``,\n `- prompt_hash: \\`${matrix.promptHash}\\``,\n matrix.brainPath ? `- brain: \\`${matrix.brainPath}\\`` : '- brain: _(none)_',\n `- started: ${matrix.startedAt}`,\n `- completed: ${matrix.completedAt}`,\n `- total_cost_usd: $${matrix.totalCostUsd.toFixed(4)}`,\n matrix.budgetExhausted ? `- **budget_exhausted: true** (some cells skipped)` : '',\n '',\n '| Label | Provider | Model | Tokens (in/out) | Cost (USD) | Duration (ms) | Finish | Excerpt |',\n '|---|---|---|---|---|---|---|---|',\n ].filter((line) => line !== '');\n\n const rows = matrix.cells.map((c) => {\n const tokens = `${c.usage.promptTokens}/${c.usage.completionTokens}`;\n const excerpt = c.errorMessage\n ? `_error: ${truncate(c.errorMessage, 80)}_`\n : truncate(escapeMd(c.responseText.replace(/\\n/g, ' ')), 80);\n return `| ${c.label} | ${c.provider} | ${c.model} | ${tokens} | $${c.costUsd.toFixed(4)} | ${c.durationMs} | ${c.finishReason} | ${excerpt} |`;\n });\n\n return [...header, ...rows, ''].join('\\n');\n}\n\nfunction recordAblationCellIfWired(\n opts: RunAblationOptions,\n spec: AblationProviderSpec,\n cell: {\n matrixId: string;\n promptHash: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n durationMs: number;\n finishReason: string;\n errorMessage?: string;\n }\n): void {\n if (!opts.auditLog) return;\n const identity = opts.identityFor?.(spec) ?? {\n handle: `ablation:${spec.label}`,\n surface: `ablation:${spec.label}`,\n wallet: '0x0000000000000000000000000000000000000000',\n x402Bearer: '',\n llmProvider: spec.provider,\n llmModel: spec.model,\n brainPath: opts.task.brainPath ?? '(none)',\n budgetUsdPerDay: 0,\n teamId: '(ablation)',\n meshApiBase: '(ablation)',\n };\n try {\n opts.auditLog.recordAblationCell({\n identity,\n matrixId: cell.matrixId,\n label: spec.label,\n taskId: opts.task.taskId,\n taskTitle: opts.task.taskTitle,\n promptHash: cell.promptHash,\n promptTokens: cell.promptTokens,\n completionTokens: cell.completionTokens,\n costUsd: cell.costUsd,\n durationMs: cell.durationMs,\n finishReason: cell.finishReason,\n errorMessage: cell.errorMessage,\n });\n } catch {\n // Audit log write must never break the ablation matrix output.\n }\n}\n\nfunction hashPrompt(system: string, user: string): string {\n return createHash('sha256').update(`SYS:${system}\\nUSR:${user}`).digest('hex').slice(0, 16);\n}\n\nfunction withTimeout<T>(p: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`ablation cell \"${label}\" timed out after ${ms}ms`)),\n ms\n );\n p.then(\n (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n (e) => {\n clearTimeout(timer);\n reject(e);\n }\n );\n });\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction escapeMd(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { ILLMProvider } from '@holoscript/llm-provider';\nimport { AgentRunner } from './runner.js';\nimport { CostGuard } from './cost-guard.js';\nimport { HolomeshClient } from './holomesh-client.js';\nimport { loadBrain } from './brain.js';\nimport { makeCommitHook } from './commit-hook.js';\nimport { AuditLog } from './audit-log.js';\nimport { pickProvider, BUILT_IN_CANDIDATES } from './capability-router.js';\nimport type { AgentSpec, SupervisorConfig } from './supervisor-config.js';\nimport type { AgentIdentity, BoardTask, ExecutionResult, RuntimeBrainConfig } from './types.js';\n\nexport interface ProviderFactory {\n (spec: AgentSpec, identity: AgentIdentity): Promise<ILLMProvider> | ILLMProvider;\n}\n\nexport interface SupervisorAgentStatus {\n handle: string;\n state: 'starting' | 'running' | 'crashed' | 'over-budget' | 'stopped';\n spentUsd: number;\n remainingUsd: number;\n lastTickAt?: string;\n lastError?: string;\n restarts: number;\n}\n\nexport interface SupervisorStatus {\n globalSpentUsd: number;\n globalRemainingUsd: number;\n globalBudgetExhausted: boolean;\n agents: SupervisorAgentStatus[];\n}\n\nexport interface SupervisorOptions {\n config: SupervisorConfig;\n providerFactory: ProviderFactory;\n meshApiBase?: string;\n teamId: string;\n stateDir?: string;\n auditLogPath?: string;\n logger?: (event: Record<string, unknown>) => void;\n fetchImpl?: typeof fetch;\n now?: () => Date;\n}\n\nexport class Supervisor {\n private readonly opts: SupervisorOptions;\n private readonly agents = new Map<string, ManagedAgent>();\n private stopped = false;\n private globalBudgetUsdPerDay?: number;\n private readonly auditLog?: AuditLog;\n\n constructor(opts: SupervisorOptions) {\n this.opts = opts;\n this.globalBudgetUsdPerDay = opts.config.globalBudgetUsdPerDay;\n this.auditLog = opts.auditLogPath ? new AuditLog({ logPath: opts.auditLogPath }) : undefined;\n }\n\n async start(): Promise<void> {\n const enabledAgents = this.opts.config.agents.filter((a) => a.enabled !== false);\n for (const spec of enabledAgents) {\n const managed = await this.bootAgent(spec);\n this.agents.set(spec.handle, managed);\n }\n this.log({ ev: 'supervisor-started', count: enabledAgents.length });\n for (const managed of this.agents.values()) {\n this.spawnLoop(managed);\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const managed of this.agents.values()) {\n managed.runner.stop();\n managed.status.state = 'stopped';\n }\n this.log({ ev: 'supervisor-stopped', count: this.agents.size });\n }\n\n status(): SupervisorStatus {\n const agents = [...this.agents.values()].map((m) => ({ ...m.status }));\n const globalSpentUsd = agents.reduce((s, a) => s + a.spentUsd, 0);\n const globalBudgetExhausted =\n this.globalBudgetUsdPerDay != null ? globalSpentUsd >= this.globalBudgetUsdPerDay : false;\n const globalRemainingUsd =\n this.globalBudgetUsdPerDay != null\n ? Math.max(0, this.globalBudgetUsdPerDay - globalSpentUsd)\n : Infinity;\n return { globalSpentUsd, globalRemainingUsd, globalBudgetExhausted, agents };\n }\n\n async tickOnce(handle: string): Promise<SupervisorAgentStatus> {\n const managed = this.agents.get(handle);\n if (!managed) throw new Error(`No agent: ${handle}`);\n await this.runOneTick(managed);\n return { ...managed.status };\n }\n\n private async bootAgent(spec: AgentSpec): Promise<ManagedAgent> {\n const brain = await loadBrain(spec.brainPath, spec.scopeTier ?? 'warm');\n\n // Capability-aware routing (Lane 3 Phase 4 — founder ruling 2026-05-06):\n // brain.requires/prefers/avoids drives provider selection at session start;\n // spec.provider becomes OVERRIDE, not source-of-truth. When brain has empty\n // requires (today's default), the routing is open and spec.provider wins\n // (backward-compatible — no behavior change for unmigrated brains).\n const decision = pickProvider({\n brain,\n envOverride: spec.provider,\n candidates: BUILT_IN_CANDIDATES,\n });\n const effectiveSpec: AgentSpec =\n decision.picked === spec.provider ? spec : { ...spec, provider: decision.picked };\n const identity = this.identityFromSpec(effectiveSpec);\n if (decision.reason === 'env-override-mismatch' && this.opts.logger) {\n this.opts.logger({\n ts: new Date().toISOString(),\n ev: 'capability-router-mismatch',\n handle: spec.handle,\n envOverride: spec.provider,\n unsatisfiedRequires: decision.unsatisfiedRequires,\n excludedByAvoids: decision.excludedByAvoids,\n });\n }\n\n const provider = await this.opts.providerFactory(effectiveSpec, identity);\n const stateDir = this.opts.stateDir ?? join(homedir(), '.holoscript-agent', 'cost-state');\n const isFree =\n effectiveSpec.provider === 'mock' ||\n effectiveSpec.provider === 'local-llm' ||\n effectiveSpec.provider === 'bitnet';\n const costGuard = new CostGuard({\n statePath: join(stateDir, `${effectiveSpec.handle}.json`),\n dailyBudgetUsd: identity.budgetUsdPerDay,\n pricer: isFree ? () => 0 : undefined,\n });\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer: identity.x402Bearer,\n teamId: identity.teamId,\n fetchImpl: this.opts.fetchImpl,\n });\n const onTaskExecuted = effectiveSpec.enableCommitHook\n ? this.buildCommitHook(effectiveSpec, identity, mesh)\n : undefined;\n const runner = new AgentRunner({\n identity,\n brain,\n provider,\n costGuard,\n mesh,\n onTaskExecuted,\n auditLog: this.auditLog,\n logger: (ev) => this.log({ agent: effectiveSpec.handle, ...ev }),\n });\n const status: SupervisorAgentStatus = {\n handle: effectiveSpec.handle,\n state: 'starting',\n spentUsd: 0,\n remainingUsd: identity.budgetUsdPerDay,\n restarts: 0,\n };\n return { spec: effectiveSpec, identity, brain, runner, costGuard, status };\n }\n\n private buildCommitHook(\n spec: AgentSpec,\n identity: AgentIdentity,\n mesh: HolomeshClient\n ): (result: ExecutionResult, task: BoardTask) => Promise<void> {\n const writer = makeCommitHook({\n outputDir: spec.outputDir ?? 'agent-out',\n workingDir: spec.workingDir,\n scope: `agent(${spec.handle})`,\n });\n return async (result, task) => {\n const out = await writer(result, task, identity);\n if (out.commitHash) {\n await mesh.markDone(task.id, `auto: ${task.title}`, out.commitHash);\n }\n };\n }\n\n private identityFromSpec(spec: AgentSpec): AgentIdentity {\n const bearer = process.env[spec.bearerEnvKey];\n if (!bearer || bearer.trim().length === 0) {\n throw new Error(`Missing bearer env var \"${spec.bearerEnvKey}\" for agent \"${spec.handle}\"`);\n }\n const wallet = process.env[spec.walletEnvKey];\n if (!wallet || !/^0x[0-9a-fA-F]{40}$/.test(wallet)) {\n throw new Error(\n `Missing or malformed wallet env var \"${spec.walletEnvKey}\" for agent \"${spec.handle}\"`\n );\n }\n return {\n handle: spec.handle,\n surface: spec.handle,\n wallet,\n x402Bearer: bearer,\n llmProvider: spec.provider,\n llmModel: spec.model,\n brainPath: spec.brainPath,\n budgetUsdPerDay: spec.budgetUsdPerDay ?? 5,\n teamId: this.opts.teamId,\n meshApiBase: this.opts.meshApiBase ?? 'https://mcp.holoscript.net/api/holomesh',\n };\n }\n\n private async spawnLoop(managed: ManagedAgent): Promise<void> {\n const interval =\n managed.spec.tickIntervalMs ?? this.opts.config.defaultTickIntervalMs ?? 60_000;\n while (!this.stopped) {\n try {\n await this.runOneTick(managed);\n } catch (err) {\n managed.status.state = 'crashed';\n managed.status.lastError = err instanceof Error ? err.message : String(err);\n managed.status.restarts += 1;\n const backoffMs = Math.min(60_000, 2 ** Math.min(managed.status.restarts, 6) * 1000);\n this.log({\n ev: 'agent-crashed-restarting',\n agent: managed.spec.handle,\n backoffMs,\n restarts: managed.status.restarts,\n message: managed.status.lastError,\n });\n await sleep(backoffMs);\n continue;\n }\n await sleep(interval + jitter(interval));\n }\n }\n\n private async runOneTick(managed: ManagedAgent): Promise<void> {\n if (this.globalBudgetUsdPerDay != null) {\n const totalSpent = [...this.agents.values()].reduce((s, a) => s + a.status.spentUsd, 0);\n if (totalSpent >= this.globalBudgetUsdPerDay) {\n managed.status.state = 'over-budget';\n this.log({ ev: 'global-budget-exhausted', agent: managed.spec.handle, totalSpent });\n return;\n }\n }\n const result = await managed.runner.tick();\n const cs = managed.costGuard.getState();\n managed.status.spentUsd = cs.spentUsd;\n managed.status.remainingUsd = managed.costGuard.getRemainingUsd();\n managed.status.lastTickAt = (this.opts.now ?? (() => new Date()))().toISOString();\n managed.status.state = result.action === 'over-budget' ? 'over-budget' : 'running';\n if (result.action === 'errored') {\n managed.status.lastError = result.message;\n }\n }\n\n private log(event: Record<string, unknown>): void {\n if (this.opts.logger) {\n this.opts.logger({ ts: new Date().toISOString(), ...event });\n }\n }\n}\n\ninterface ManagedAgent {\n spec: AgentSpec;\n identity: AgentIdentity;\n brain: RuntimeBrainConfig;\n runner: AgentRunner;\n costGuard: CostGuard;\n status: SupervisorAgentStatus;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction jitter(base: number): number {\n return Math.floor((Math.random() - 0.5) * base * 0.2);\n}\n","import { mkdirSync, appendFileSync, readFileSync, existsSync, statSync, renameSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { LLMProviderName } from '@holoscript/llm-provider';\nimport type { AgentIdentity, BoardTask, ExecutionResult } from './types.js';\n\nexport type AuditEventKind = 'task-executed' | 'ablation-cell' | 'budget-exhausted' | 'agent-crash';\n\nexport interface AuditEvent {\n ts: string;\n kind: AuditEventKind;\n agent: {\n handle: string;\n surface: string;\n wallet: string;\n walletShort: string;\n provider: LLMProviderName;\n model: string;\n brainPath: string;\n };\n task?: {\n id: string;\n title: string;\n tags: string[];\n };\n execution?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n costUsd: number;\n durationMs: number;\n finishReason?: string;\n promptHash?: string;\n };\n result?: {\n commitHash?: string;\n filePath?: string;\n errorMessage?: string;\n };\n ablation?: {\n label: string;\n matrixId: string;\n };\n}\n\nexport interface AuditQuery {\n agent?: string;\n task?: string;\n provider?: LLMProviderName;\n kind?: AuditEventKind;\n since?: string;\n until?: string;\n limit?: number;\n}\n\nexport interface AuditLogOptions {\n logPath: string;\n maxBytes?: number;\n}\n\nexport class AuditLog {\n private readonly logPath: string;\n private readonly maxBytes: number;\n\n constructor(opts: AuditLogOptions) {\n this.logPath = opts.logPath;\n this.maxBytes = opts.maxBytes ?? 50 * 1024 * 1024;\n mkdirSync(dirname(this.logPath), { recursive: true });\n }\n\n record(event: AuditEvent): void {\n this.rotateIfFull();\n appendFileSync(this.logPath, `${JSON.stringify(event)}\\n`, 'utf8');\n }\n\n recordTaskExecuted(opts: {\n identity: AgentIdentity;\n task: BoardTask;\n result: ExecutionResult;\n commitHash?: string;\n filePath?: string;\n }): void {\n this.record({\n ts: new Date().toISOString(),\n kind: 'task-executed',\n agent: agentFromIdentity(opts.identity),\n task: { id: opts.task.id, title: opts.task.title, tags: opts.task.tags ?? [] },\n execution: {\n promptTokens: opts.result.usage.promptTokens,\n completionTokens: opts.result.usage.completionTokens,\n totalTokens: opts.result.usage.totalTokens,\n costUsd: opts.result.costUsd,\n durationMs: opts.result.durationMs,\n },\n result: {\n commitHash: opts.commitHash,\n filePath: opts.filePath,\n },\n });\n }\n\n recordAblationCell(opts: {\n identity: AgentIdentity;\n matrixId: string;\n label: string;\n taskId: string;\n taskTitle: string;\n promptHash: string;\n promptTokens: number;\n completionTokens: number;\n costUsd: number;\n durationMs: number;\n finishReason: string;\n errorMessage?: string;\n }): void {\n this.record({\n ts: new Date().toISOString(),\n kind: 'ablation-cell',\n agent: agentFromIdentity(opts.identity),\n task: { id: opts.taskId, title: opts.taskTitle, tags: ['ablation'] },\n execution: {\n promptTokens: opts.promptTokens,\n completionTokens: opts.completionTokens,\n totalTokens: opts.promptTokens + opts.completionTokens,\n costUsd: opts.costUsd,\n durationMs: opts.durationMs,\n finishReason: opts.finishReason,\n promptHash: opts.promptHash,\n },\n result: { errorMessage: opts.errorMessage },\n ablation: { label: opts.label, matrixId: opts.matrixId },\n });\n }\n\n query(filter: AuditQuery = {}): AuditEvent[] {\n if (!existsSync(this.logPath)) return [];\n const raw = readFileSync(this.logPath, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.length > 0);\n const events: AuditEvent[] = [];\n for (const line of lines) {\n try {\n events.push(JSON.parse(line) as AuditEvent);\n } catch {\n // Corrupt line — skip rather than fail the whole query.\n // Agents must keep flying even if one line got partially flushed.\n }\n }\n return applyFilter(events, filter);\n }\n\n rollup(filter: AuditQuery = {}): {\n totalEvents: number;\n byAgent: Record<string, { events: number; costUsd: number; tokens: number }>;\n byProvider: Record<string, { events: number; costUsd: number; tokens: number }>;\n totalCostUsd: number;\n totalTokens: number;\n } {\n const events = this.query(filter);\n const byAgent: Record<string, { events: number; costUsd: number; tokens: number }> = {};\n const byProvider: Record<string, { events: number; costUsd: number; tokens: number }> = {};\n let totalCostUsd = 0;\n let totalTokens = 0;\n for (const e of events) {\n const agent = e.agent.handle;\n const provider = e.agent.provider;\n const cost = e.execution?.costUsd ?? 0;\n const tokens = e.execution?.totalTokens ?? 0;\n byAgent[agent] = byAgent[agent] ?? { events: 0, costUsd: 0, tokens: 0 };\n byAgent[agent].events += 1;\n byAgent[agent].costUsd += cost;\n byAgent[agent].tokens += tokens;\n byProvider[provider] = byProvider[provider] ?? { events: 0, costUsd: 0, tokens: 0 };\n byProvider[provider].events += 1;\n byProvider[provider].costUsd += cost;\n byProvider[provider].tokens += tokens;\n totalCostUsd += cost;\n totalTokens += tokens;\n }\n return { totalEvents: events.length, byAgent, byProvider, totalCostUsd, totalTokens };\n }\n\n private rotateIfFull(): void {\n if (!existsSync(this.logPath)) return;\n const size = statSync(this.logPath).size;\n if (size < this.maxBytes) return;\n const archived = `${this.logPath}.${new Date().toISOString().replace(/[:.]/g, '-')}.jsonl`;\n renameSync(this.logPath, archived);\n }\n}\n\nfunction agentFromIdentity(identity: AgentIdentity): AuditEvent['agent'] {\n return {\n handle: identity.handle,\n surface: identity.surface,\n wallet: identity.wallet,\n walletShort: `${identity.wallet.slice(0, 6)}…${identity.wallet.slice(-4)}`,\n provider: identity.llmProvider,\n model: identity.llmModel,\n brainPath: identity.brainPath,\n };\n}\n\nfunction applyFilter(events: AuditEvent[], filter: AuditQuery): AuditEvent[] {\n let result = events;\n if (filter.agent) result = result.filter((e) => e.agent.handle === filter.agent);\n if (filter.provider) result = result.filter((e) => e.agent.provider === filter.provider);\n if (filter.task) result = result.filter((e) => e.task?.id === filter.task);\n if (filter.kind) result = result.filter((e) => e.kind === filter.kind);\n if (filter.since) result = result.filter((e) => e.ts >= filter.since!);\n if (filter.until) result = result.filter((e) => e.ts <= filter.until!);\n if (filter.limit != null) result = result.slice(-filter.limit);\n return result;\n}\n","import { readFileSync } from 'node:fs';\nimport type { LLMProviderName } from '@holoscript/llm-provider';\n\nexport interface AgentSpec {\n handle: string;\n brainPath: string;\n provider: LLMProviderName;\n model: string;\n walletEnvKey: string;\n bearerEnvKey: string;\n budgetUsdPerDay?: number;\n scopeTier?: 'cold' | 'warm' | 'hot';\n enabled?: boolean;\n tickIntervalMs?: number;\n enableCommitHook?: boolean;\n outputDir?: string;\n workingDir?: string;\n}\n\nexport interface SupervisorConfig {\n agents: AgentSpec[];\n globalBudgetUsdPerDay?: number;\n defaultTickIntervalMs?: number;\n}\n\n// Mirror of VALID_PROVIDERS in identity.ts. Deduplication is a separate\n// task — both Sets must stay in sync until then. Single-source-of-truth\n// via LLMProviderName-derived runtime Set is the clean fix (W.GOLD.006).\nconst VALID_PROVIDERS: ReadonlySet<LLMProviderName> = new Set([\n 'anthropic',\n 'openai',\n 'gemini',\n 'xai',\n 'openrouter',\n 'mock',\n 'bitnet',\n 'local-llm',\n]);\n\nconst VALID_TIERS: ReadonlySet<string> = new Set(['cold', 'warm', 'hot']);\nconst HANDLE_PATTERN = /^[a-z0-9_-]{1,64}$/i;\n\nexport function loadSupervisorConfig(path: string): SupervisorConfig {\n return parseSupervisorConfig(readFileSync(path, 'utf8'));\n}\n\nexport function parseSupervisorConfig(raw: string): SupervisorConfig {\n const data = JSON.parse(raw) as unknown;\n if (!isObject(data)) throw new Error('Supervisor config must be a JSON object');\n if (!Array.isArray(data.agents)) throw new Error('Supervisor config.agents must be an array');\n if (data.agents.length === 0)\n throw new Error('Supervisor config.agents must have at least one entry');\n\n const seenHandles = new Set<string>();\n const agents: AgentSpec[] = data.agents.map((entry, idx) =>\n validateAgent(entry, idx, seenHandles)\n );\n\n const globalBudgetUsdPerDay = optionalNumber(data, 'globalBudgetUsdPerDay');\n const defaultTickIntervalMs = optionalNumber(data, 'defaultTickIntervalMs');\n if (globalBudgetUsdPerDay != null && globalBudgetUsdPerDay <= 0) {\n throw new Error(`globalBudgetUsdPerDay must be positive, got ${globalBudgetUsdPerDay}`);\n }\n if (defaultTickIntervalMs != null && defaultTickIntervalMs < 5000) {\n throw new Error(\n `defaultTickIntervalMs must be >= 5000ms (mesh-friendly), got ${defaultTickIntervalMs}`\n );\n }\n\n return { agents, globalBudgetUsdPerDay, defaultTickIntervalMs };\n}\n\nfunction validateAgent(entry: unknown, idx: number, seen: Set<string>): AgentSpec {\n if (!isObject(entry)) throw new Error(`agents[${idx}] must be an object`);\n const handle = requiredString(entry, 'handle', `agents[${idx}].handle`);\n if (!HANDLE_PATTERN.test(handle)) {\n throw new Error(`agents[${idx}].handle \"${handle}\" must match ${HANDLE_PATTERN}`);\n }\n if (seen.has(handle)) throw new Error(`Duplicate agent handle: \"${handle}\"`);\n seen.add(handle);\n\n const provider = requiredString(entry, 'provider', `agents[${idx}].provider`);\n if (!VALID_PROVIDERS.has(provider as LLMProviderName)) {\n throw new Error(\n `agents[${idx}].provider \"${provider}\" not in [${[...VALID_PROVIDERS].join(', ')}]`\n );\n }\n\n const scopeTier = optionalString(entry, 'scopeTier');\n if (scopeTier && !VALID_TIERS.has(scopeTier)) {\n throw new Error(`agents[${idx}].scopeTier \"${scopeTier}\" must be cold | warm | hot`);\n }\n\n const budgetUsdPerDay = optionalNumber(entry, 'budgetUsdPerDay');\n if (budgetUsdPerDay != null && budgetUsdPerDay < 0) {\n throw new Error(\n `agents[${idx}].budgetUsdPerDay must be >= 0 (0 = unlimited), got ${budgetUsdPerDay}`\n );\n }\n const tickIntervalMs = optionalNumber(entry, 'tickIntervalMs');\n if (tickIntervalMs != null && tickIntervalMs < 5000) {\n throw new Error(`agents[${idx}].tickIntervalMs must be >= 5000ms, got ${tickIntervalMs}`);\n }\n\n return {\n handle,\n brainPath: requiredString(entry, 'brainPath', `agents[${idx}].brainPath`),\n provider: provider as LLMProviderName,\n model: requiredString(entry, 'model', `agents[${idx}].model`),\n walletEnvKey: requiredString(entry, 'walletEnvKey', `agents[${idx}].walletEnvKey`),\n bearerEnvKey: requiredString(entry, 'bearerEnvKey', `agents[${idx}].bearerEnvKey`),\n budgetUsdPerDay,\n scopeTier: scopeTier as 'cold' | 'warm' | 'hot' | undefined,\n enabled: optionalBoolean(entry, 'enabled'),\n tickIntervalMs,\n enableCommitHook: optionalBoolean(entry, 'enableCommitHook'),\n outputDir: optionalString(entry, 'outputDir'),\n workingDir: optionalString(entry, 'workingDir'),\n };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction requiredString(obj: Record<string, unknown>, key: string, label: string): string {\n const v = obj[key];\n if (typeof v !== 'string' || v.trim().length === 0) {\n throw new Error(`${label} is required and must be a non-empty string`);\n }\n return v.trim();\n}\n\nfunction optionalString(obj: Record<string, unknown>, key: string): string | undefined {\n const v = obj[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'string') throw new Error(`${key} must be a string when present`);\n return v.trim();\n}\n\nfunction optionalNumber(obj: Record<string, unknown>, key: string): number | undefined {\n const v = obj[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`${key} must be a finite number when present`);\n }\n return v;\n}\n\nfunction optionalBoolean(obj: Record<string, unknown>, key: string): boolean | undefined {\n const v = obj[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'boolean') throw new Error(`${key} must be a boolean when present`);\n return v;\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir, hostname } from 'node:os';\nimport { randomBytes, createCipheriv, createHash } from 'node:crypto';\nimport { Wallet } from 'ethers';\n\nconst HANDLE_PATTERN = /^[a-z0-9_-]{1,64}$/i;\n\nexport interface ProvisionRequest {\n handle: string;\n meshApiBase?: string;\n founderBearer: string;\n seatsRoot?: string;\n fetchImpl?: typeof fetch;\n autoJoinTeamId?: string;\n}\n\nexport interface ProvisionDryRun {\n status: 'dry-run';\n handle: string;\n surface: string;\n seatId: string;\n seatDir: string;\n willGenerateWallet: boolean;\n willCallEndpoints: string[];\n}\n\nexport interface ProvisionExecuted {\n status: 'executed' | 'reused';\n handle: string;\n surface: string;\n seatId: string;\n seatDir: string;\n walletAddress: string;\n bearer?: string;\n agentId?: string;\n envVarLines: string[];\n joinedTeam?:\n | { teamId: string; role: string; members: number }\n | { teamId: string; error: string };\n}\n\nexport type ProvisionResult = ProvisionDryRun | ProvisionExecuted;\n\nconst EIP712_DOMAIN = { name: 'HoloMesh', version: '1' };\nconst EIP712_TYPES: Record<string, Array<{ name: string; type: string }>> = {\n Registration: [{ name: 'nonce', type: 'string' }],\n};\n\nexport async function provisionAgent(\n req: ProvisionRequest,\n opts: { execute: boolean; force?: boolean } = { execute: false }\n): Promise<ProvisionResult> {\n if (!HANDLE_PATTERN.test(req.handle)) {\n throw new Error(`handle \"${req.handle}\" must match ${HANDLE_PATTERN}`);\n }\n if (!req.founderBearer || req.founderBearer.trim().length === 0) {\n throw new Error(\n 'founderBearer is required (HOLOMESH_API_KEY of an agent that can call /register)'\n );\n }\n\n const meshApiBase = (req.meshApiBase ?? 'https://mcp.holoscript.net/api/holomesh').replace(\n /\\/$/,\n ''\n );\n const seatsRoot = req.seatsRoot ?? defaultSeatsRoot();\n const surface = req.handle;\n const seatId = makeSeatId(surface);\n const seatDir = join(seatsRoot, seatId);\n const walletPath = join(seatDir, 'wallet.enc');\n const regPath = join(seatDir, 'registration.json');\n\n if (!opts.execute) {\n return {\n status: 'dry-run',\n handle: req.handle,\n surface,\n seatId,\n seatDir,\n willGenerateWallet: !existsSync(walletPath),\n willCallEndpoints: [`POST ${meshApiBase}/register/challenge`, `POST ${meshApiBase}/register`],\n };\n }\n\n if (existsSync(walletPath) && !opts.force) {\n const blob = JSON.parse(readFileSync(walletPath, 'utf8')) as { address: string };\n const reused: ProvisionExecuted = {\n status: 'reused',\n handle: req.handle,\n surface,\n seatId,\n seatDir,\n walletAddress: blob.address,\n envVarLines: envVarLinesFor(req.handle, blob.address, undefined),\n };\n return reused;\n }\n\n const wallet = Wallet.createRandom();\n mkdirSync(seatDir, { recursive: true });\n\n const masterKey = ensureMasterKey(seatsRoot);\n const encryptedBlob = {\n seat_id: seatId,\n surface,\n handle: req.handle,\n address: wallet.address,\n encrypted_privkey: encryptPrivateKey(wallet.privateKey, masterKey),\n created_at: new Date().toISOString(),\n source: 'holoscript-agent.provision',\n };\n writeFileSync(walletPath, JSON.stringify(encryptedBlob, null, 2), 'utf8');\n try {\n chmodSync(walletPath, 0o600);\n } catch {}\n\n const fetchImpl = req.fetchImpl ?? fetch;\n\n const challenge = await postJson<{ nonce: string }>(\n fetchImpl,\n `${meshApiBase}/register/challenge`,\n req.founderBearer,\n { wallet_address: wallet.address }\n );\n if (!challenge.nonce) {\n throw new Error(`/register/challenge returned no nonce: ${JSON.stringify(challenge)}`);\n }\n\n const signature = await wallet.signTypedData(EIP712_DOMAIN, EIP712_TYPES, {\n nonce: challenge.nonce,\n });\n\n const registration = await postJson<{\n agent?: { id: string; api_key: string };\n wallet?: { private_key?: string };\n }>(fetchImpl, `${meshApiBase}/register`, req.founderBearer, {\n name: req.handle,\n wallet_address: wallet.address,\n nonce: challenge.nonce,\n signature,\n });\n writeFileSync(\n regPath,\n JSON.stringify(\n {\n status: 201,\n response: registration,\n registered_at: new Date().toISOString(),\n flow: 'x402',\n },\n null,\n 2\n ),\n 'utf8'\n );\n\n const agentId = registration.agent?.id;\n const bearer = registration.agent?.api_key;\n if (!agentId || !bearer) {\n throw new Error(\n `/register did not return agent.id + agent.api_key: ${JSON.stringify(registration).slice(0, 400)}`\n );\n }\n if (registration.wallet?.private_key) {\n console.warn(\n '[provision] WARN — server returned private_key despite x402 flow; ignoring (using local key).'\n );\n }\n\n let joinedTeam: ProvisionExecuted['joinedTeam'];\n if (req.autoJoinTeamId) {\n try {\n const joinRes = await postJson<{ success?: boolean; role?: string; members?: number }>(\n fetchImpl,\n `${meshApiBase}/team/${req.autoJoinTeamId}/join`,\n bearer,\n {}\n );\n joinedTeam = {\n teamId: req.autoJoinTeamId,\n role: joinRes.role ?? 'member',\n members: joinRes.members ?? 0,\n };\n } catch (err) {\n joinedTeam = {\n teamId: req.autoJoinTeamId,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return {\n status: 'executed',\n handle: req.handle,\n surface,\n seatId,\n seatDir,\n walletAddress: wallet.address,\n bearer,\n agentId,\n envVarLines: envVarLinesFor(req.handle, wallet.address, bearer),\n joinedTeam,\n };\n}\n\nfunction defaultSeatsRoot(): string {\n return process.env.HOLOSCRIPT_AGENT_SEATS_ROOT ?? join(homedir(), '.holoscript-agent', 'seats');\n}\n\nfunction makeSeatId(surface: string): string {\n const fp = createHash('sha256')\n .update(hostname() + homedir())\n .digest('hex')\n .slice(0, 8);\n return `holoscript-${surface}-${fp}-x402`;\n}\n\nfunction ensureMasterKey(seatsRoot: string): Buffer {\n const keyPath = join(seatsRoot, '.master-key');\n if (!existsSync(seatsRoot)) mkdirSync(seatsRoot, { recursive: true });\n if (!existsSync(keyPath)) {\n const k = randomBytes(32);\n writeFileSync(keyPath, k);\n try {\n chmodSync(keyPath, 0o600);\n } catch {}\n }\n return readFileSync(keyPath);\n}\n\nfunction encryptPrivateKey(\n privKey: string,\n masterKey: Buffer\n): { iv: string; ct: string; tag: string; alg: 'aes-256-gcm' } {\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', masterKey, iv);\n const ct = Buffer.concat([cipher.update(privKey, 'utf8'), cipher.final()]);\n return {\n iv: iv.toString('base64'),\n ct: ct.toString('base64'),\n tag: cipher.getAuthTag().toString('base64'),\n alg: 'aes-256-gcm',\n };\n}\n\nasync function postJson<T>(\n fetchImpl: typeof fetch,\n url: string,\n bearer: string,\n body: unknown\n): Promise<T> {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${bearer}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`POST ${url} ${res.status}: ${text.slice(0, 400)}`);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error(`POST ${url} returned non-JSON: ${text.slice(0, 200)}`);\n }\n}\n\nfunction envVarLinesFor(handle: string, walletAddress: string, bearer?: string): string[] {\n const suffix = handle.toUpperCase().replace(/-/g, '_');\n const lines = [`HOLOSCRIPT_AGENT_WALLET_${suffix}=${walletAddress}`];\n if (bearer) {\n lines.push(`HOLOMESH_API_KEY_${suffix}_X402=${bearer}`);\n }\n return lines;\n}\n"],"mappings":"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","names":["homedir","hostname","join","createHash","randomBytes","Wallet","readFile","dirname","readFile","mkdir","dirname","createHash","priority","tasks","mkdirSync","writeFileSync","dirname","resolve","spawn","createHash","truncate","resolve","join","mkdirSync","readFileSync","existsSync","dirname","join","sleep","jitter","readFileSync","VALID_PROVIDERS","mkdirSync","readFileSync","writeFileSync","existsSync","join","homedir","createHash","Wallet","HANDLE_PATTERN","writeFileSync","readFileSync","existsSync","mkdirSync","dirname","resolve","Wallet","join","homedir","createHash","hostname","randomBytes"]}
|