@holoscript/holoscript-agent 2.0.0
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/LICENSE +21 -0
- package/dist/ablation.d.ts +56 -0
- package/dist/ablation.js +183 -0
- package/dist/ablation.js.map +1 -0
- package/dist/audit-log.d.ts +99 -0
- package/dist/audit-log.js +123 -0
- package/dist/audit-log.js.map +1 -0
- package/dist/brain.d.ts +6 -0
- package/dist/brain.js +66 -0
- package/dist/brain.js.map +1 -0
- package/dist/commit-hook.d.ts +22 -0
- package/dist/commit-hook.js +103 -0
- package/dist/commit-hook.js.map +1 -0
- package/dist/cost-guard.d.ts +54 -0
- package/dist/cost-guard.js +92 -0
- package/dist/cost-guard.js.map +1 -0
- package/dist/holomesh-client.d.ts +63 -0
- package/dist/holomesh-client.js +117 -0
- package/dist/holomesh-client.js.map +1 -0
- package/dist/identity.d.ts +7 -0
- package/dist/identity.js +64 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2101 -0
- package/dist/index.js.map +1 -0
- package/dist/provision.d.ts +43 -0
- package/dist/provision.js +195 -0
- package/dist/provision.js.map +1 -0
- package/dist/runner.d.ts +62 -0
- package/dist/runner.js +543 -0
- package/dist/runner.js.map +1 -0
- package/dist/supervisor-config.d.ts +26 -0
- package/dist/supervisor-config.js +109 -0
- package/dist/supervisor-config.js.map +1 -0
- package/dist/supervisor.d.ts +53 -0
- package/dist/supervisor.js +1167 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/identity.ts","../src/brain.ts","../src/cost-guard.ts","../src/holomesh-client.ts","../src/cael-builder.ts","../src/tools.ts","../src/runner.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 } from 'node:os';\nimport { join } from 'node:path';\nimport {\n createAnthropicProvider,\n createOpenAIProvider,\n createGeminiProvider,\n createMockProvider,\n createLocalLLMProvider,\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 { HolomeshClient } from './holomesh-client.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 const provider = await buildProvider(identity);\n const costGuard = new CostGuard({\n statePath: stateFilePath(identity),\n dailyBudgetUsd: identity.budgetUsdPerDay,\n pricer: defaultPricerForProvider(identity.llmProvider),\n });\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer: identity.x402Bearer,\n teamId: identity.teamId,\n });\n\n const commitHook = buildCommitHook(identity, mesh);\n const auditLog = buildAuditLog();\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 });\n\n console.log(JSON.stringify({ ts: new Date().toISOString(), ev: 'boot', identity: identityForLog(identity), brain: { domain: brain.domain, tags: brain.capabilityTags, tier: brain.scopeTier } }));\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 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: spec.model,\n });\n case 'mock':\n return createMockProvider();\n default:\n throw new Error(`Provider \"${spec.provider}\" not yet wired in supervisor — Phase 2.5 deliverable.`);\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(JSON.stringify({ ts: new Date().toISOString(), ev: 'supervise-running', config: cfgPath }));\n\n const reportEvery = Number(process.env.HOLOSCRIPT_AGENT_STATUS_REPORT_MS ?? '300000');\n if (reportEvery > 0) {\n setInterval(() => {\n console.log(JSON.stringify({ ts: new Date().toISOString(), ev: 'supervisor-status', ...sup.status() }));\n }, reportEvery);\n }\n}\n\nasync function cmdAudit(rest: string[]): Promise<void> {\n const logPath = 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: { agent?: string; provider?: string; task?: string; kind?: string; limit?: number } = {};\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('Usage: holoscript-agent audit [rollup|query|tail] [--agent=<h>] [--provider=<p>] [--task=<id>] [--kind=<k>] [--limit=<n>] [--log=<path>]');\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('HOLOMESH_API_KEY env var required for provisioning (founder-tier bearer for /register endpoints)');\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(JSON.stringify({ ts: new Date().toISOString(), ev: 'provision-result', ...result }, null, 2));\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(JSON.stringify({\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 }, null, 2));\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('Usage: holoscript-agent ablate --spec=<path-to-ablation.json> [--out-md=<path>] [--out-json=<path>]');\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: p.pricePerCallUsd != null\n ? () => p.pricePerCallUsd!\n : p.pricePerMtokInput != null && p.pricePerMtokOutput != null\n ? (u) => (u.promptTokens * p.pricePerMtokInput! + u.completionTokens * p.pricePerMtokOutput!) / 1_000_000\n : undefined,\n }));\n\n const startMsg = JSON.stringify({ ts: new Date().toISOString(), ev: 'ablation-start', task: spec.task.taskId, cells: providers.length });\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(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\nasync function cmdWhoami(): Promise<void> {\n const identity = loadIdentity();\n const mesh = new HolomeshClient({\n apiBase: identity.meshApiBase,\n bearer: identity.x402Bearer,\n teamId: identity.teamId,\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 'mock':\n return createMockProvider();\n case 'local-llm':\n return createLocalLLMProvider({\n baseURL: process.env.HOLOSCRIPT_AGENT_LOCAL_LLM_BASE_URL,\n model: identity.llmModel,\n });\n default:\n throw new Error(\n `Provider \"${p}\" not yet wired in CLI — Phase 2 deliverable. Use anthropic | openai | gemini | local-llm | mock for now.`\n );\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\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 = process.env.HOLOSCRIPT_AGENT_STATE_DIR\n ?? join(homedir(), '.holoscript-agent', 'cost-state');\n return join(dir, `${identity.handle}.json`);\n}\n\nfunction auditLogPath(): string {\n return process.env.HOLOSCRIPT_AGENT_AUDIT_LOG\n ?? join(homedir(), '.holoscript-agent', 'audit', 'audit.jsonl');\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 | local-llm | mock\n HOLOSCRIPT_AGENT_MODEL model id (e.g. \"claude-opus-4-7\")\n HOLOSCRIPT_AGENT_BRAIN path to .hsplus brain composition\n HOLOSCRIPT_AGENT_WALLET 0x… wallet address\n HOLOSCRIPT_AGENT_X402_BEARER per-surface mesh bearer (W.087 vertex B)\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_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`);\n}\n\nmain().catch((err) => {\n console.error(JSON.stringify({ ts: new Date().toISOString(), ev: 'fatal', message: err instanceof Error ? err.message : String(err) }));\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 '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 const x402Bearer = required(env, 'HOLOSCRIPT_AGENT_X402_BEARER');\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(`HOLOSCRIPT_AGENT_BUDGET_USD_DAY must be >= 0 (0 = unlimited), got ${budgetRaw}`);\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.slice(0, 6)}…`,\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 { RuntimeBrainConfig } from './types.js';\n\nexport async function loadBrain(\n brainPath: string,\n scopeTier: 'cold' | 'warm' | 'hot' = 'warm'\n): Promise<RuntimeBrainConfig> {\n const systemPrompt = await readFile(brainPath, 'utf8');\n const { domain, capabilityTags } = extractIdentity(systemPrompt);\n return { brainPath, systemPrompt, capabilityTags, domain, scopeTier };\n}\n\nfunction extractIdentity(brain: string): { domain: string; capabilityTags: string[] } {\n const identityBlock = sliceNamedBlock(brain, 'identity');\n if (!identityBlock) return { domain: 'unknown', capabilityTags: [] };\n const domain = scalarField(identityBlock, 'domain') ?? 'unknown';\n const capabilityTags = listField(identityBlock, 'capability_tags') ?? [];\n return { domain, capabilityTags };\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-7': { input: 15, output: 75 },\n 'claude-opus-4-6': { input: 15, output: 75 },\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/**\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 */\nexport function defaultPricerForProvider(\n provider: 'anthropic' | 'local-llm' | 'openai' | string\n): ModelPricer {\n if (provider === 'local-llm' || provider === 'mock') return defaultLocalLlmPricer;\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(model: string, usage: TokenUsage): { 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","import type { BoardTask } from './types.js';\nimport type { CaelAuditRecord } from './cael-builder.js';\n\nexport interface HolomeshClientOptions {\n apiBase: string;\n bearer: string;\n teamId: string;\n fetchImpl?: typeof fetch;\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\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 }\n\n async heartbeat(payload: { agentName: string; surface: string }): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/presence`, payload);\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}`, { 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 {}\n );\n }\n\n async sendMessageOnTask(taskId: string, body: string): Promise<void> {\n await this.req('POST', `/team/${this.teamId}/message`, {\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}`, {\n action: 'done',\n summary,\n 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(handle: string, records: CaelAuditRecord[]): Promise<{ appended: number; rejected: number }> {\n return this.req<{ appended: number; rejected: number }>(\n 'POST',\n `/agent/${encodeURIComponent(handle)}/audit`,\n { records }\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 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","// 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\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 { identity, brain, task, messages, finalText, usage, costUsd, spentUsd, prevChain, runtimeVersion } = 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 };\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 *\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 } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { ToolSpec, ToolUseBlock, ToolResultBlock } from '@holoscript/llm-provider';\n\n// ---------------------------------------------------------------------------\n// Sandbox roots — keep narrow. Add only when a task needs more.\n// ---------------------------------------------------------------------------\nconst ALLOWED_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 ALLOWED_WRITE_ROOTS = [\n '/root/agent-output', // Single write sink — keeps deliverables in one place\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).\nconst BASH_WHITELIST = [\n 'lake build', 'lake env', 'lake clean',\n 'lean ',\n 'ls ', 'ls\\n', 'ls$',\n 'cat ',\n 'grep ', 'rg ',\n 'find ',\n 'wc ',\n 'head ', 'tail ',\n 'git status', 'git log', 'git diff', 'git show',\n 'pnpm --filter',\n 'pnpm vitest', 'vitest run',\n 'pwd',\n 'echo ',\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: /root/msc-paper-22, ' +\n '/root/holoscript-mesh, /root/agent-output. Returns the file content as text. ' +\n 'Use this to inspect inputs scp\\'d to the instance (e.g. MSC/Invariants.lean).',\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 /root/agent-output/. This is the deliverable sink — anything ' +\n 'you want to emit as task output (a Lean proof, a markdown report, a JSON dataset) ' +\n 'goes here. Creates parent directories. Will refuse paths outside the write root.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Absolute path under /root/agent-output/' },\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. Hard 60s wall timeout, 1MB stdout cap. Use for lake build / lean ' +\n 'kernel-checks, git inspection, repo greps. 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\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 + '/');\n}\n\nfunction checkReadAllowed(path: string): string | null {\n if (!path.startsWith('/')) 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 (!path.startsWith('/')) 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// ---------------------------------------------------------------------------\nexport async function runTool(use: ToolUseBlock): 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 = text.length > 200_000 ? text.slice(0, 200_000) + `\\n…[truncated, full file is ${text.length} bytes]` : 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 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\ninterface BashResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nfunction runBash(cmd: string, cwd: string): Promise<BashResult> {\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 = stdout.length >= STDOUT_CAP ? stdout + `\\n…[stdout truncated at ${STDOUT_CAP} bytes]` : 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","import type { ILLMProvider, LLMMessage, TokenUsage } 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 { MESH_TOOLS, runTool } from './tools.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}\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 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 const messages: LLMMessage[] = [\n { role: 'system', content: brain.systemPrompt },\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 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 maxTokens: 4096,\n temperature: 0.4,\n tools: MESH_TOOLS,\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({ ev: 'tool-call', taskId: target.id, iter: iters, tools: resp.toolUses.map((t) => t.name) });\n // Track tool names for the artifact-grounding gate.\n for (const u of resp.toolUses) toolsCalled.add(u.name);\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(resp.toolUses.map((u) => runTool(u)));\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 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). MESH_TOOLS\n // exposes 4 tools: read_file + list_dir (read-only inspection) and write_file +\n // bash (state-mutating). A task whose execution did NOT call write_file or\n // bash at least once produced no artifact and should NOT be marked executed.\n // We log a 'no-artifact' tick-error instead, skip CAEL/message posts, and\n // return so the task remains open for a real attempt.\n const SIDE_EFFECTING_TOOLS: ReadonlySet<string> = new Set(['write_file', 'bash']);\n const sideEffectingCalled = [...toolsCalled].some((t) => SIDE_EFFECTING_TOOLS.has(t));\n if (!sideEffectingCalled) {\n log({\n ev: 'no-artifact',\n taskId: target.id,\n tool_iters: iters,\n toolsCalled: [...toolsCalled],\n message:\n 'task execution called no side-effecting tool (write_file/bash) — refusing to mark executed. ' +\n 'Likely a pure-text or read-only-inspection response. Task remains open for a grounded attempt.',\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 side-effecting tool called (toolsCalled=[${[...toolsCalled].join(',')}], iters=${iters})`,\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 = { ...(lastResponse ?? { content: finalText, usage: aggUsage }), content: finalText, usage: aggUsage };\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({ ev: 'cael-posted', taskId: target.id, appended: posted.appended, rejected: posted.rejected });\n } catch (err) {\n log({ ev: 'cael-post-error', message: err instanceof Error ? err.message : String(err) });\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 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, mesh, logger } = this.opts;\n const log = logger ?? (() => undefined);\n try {\n await mesh.heartbeat({ agentName: identity.handle, surface: identity.surface });\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 });\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 described in the task. Apply your brain composition rules — anti-patterns, decision loop, and scope tier all bind. Return the response as plain text suitable for posting to /room as a message on this task.',\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","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 (result: ExecutionResult, task: BoardTask, identity: AgentIdentity): 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(`git add failed: ${addRes.stderr || addRes.stdout || `exit ${addRes.status}`}`);\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(`git commit failed: ${commitRes.stderr || commitRes.stdout || `exit ${commitRes.status}`}`);\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(result: ExecutionResult, task: BoardTask, identity: AgentIdentity, date: string): 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(() => reject(new Error(`ablation cell \"${label}\" timed out after ${ms}ms`)), ms);\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 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 = this.globalBudgetUsdPerDay != null\n ? globalSpentUsd >= this.globalBudgetUsdPerDay\n : false;\n const globalRemainingUsd = 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 identity = this.identityFromSpec(spec);\n const brain = await loadBrain(spec.brainPath, spec.scopeTier ?? 'warm');\n const provider = await this.opts.providerFactory(spec, identity);\n const stateDir = this.opts.stateDir ?? join(homedir(), '.holoscript-agent', 'cost-state');\n const isFree = spec.provider === 'mock' || spec.provider === 'local-llm' || spec.provider === 'bitnet';\n const costGuard = new CostGuard({\n statePath: join(stateDir, `${spec.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 = spec.enableCommitHook ? this.buildCommitHook(spec, identity, mesh) : 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: spec.handle, ...ev }),\n });\n const status: SupervisorAgentStatus = {\n handle: spec.handle,\n state: 'starting',\n spentUsd: 0,\n remainingUsd: identity.budgetUsdPerDay,\n restarts: 0,\n };\n return { spec, 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(`Missing or malformed wallet env var \"${spec.walletEnvKey}\" for agent \"${spec.handle}\"`);\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 = managed.spec.tickIntervalMs\n ?? this.opts.config.defaultTickIntervalMs\n ?? 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\nconst VALID_PROVIDERS: ReadonlySet<LLMProviderName> = new Set([\n 'anthropic',\n 'openai',\n 'gemini',\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) 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) => validateAgent(entry, idx, seenHandles));\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(`defaultTickIntervalMs must be >= 5000ms (mesh-friendly), got ${defaultTickIntervalMs}`);\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(`agents[${idx}].budgetUsdPerDay must be positive, got ${budgetUsdPerDay}`);\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?: { teamId: string; role: string; members: number } | { 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('founderBearer is required (HOLOMESH_API_KEY of an agent that can call /register)');\n }\n\n const meshApiBase = (req.meshApiBase ?? 'https://mcp.holoscript.net/api/holomesh').replace(/\\/$/, '');\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: [\n `POST ${meshApiBase}/register/challenge`,\n `POST ${meshApiBase}/register`,\n ],\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 { chmodSync(walletPath, 0o600); } 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, { nonce: challenge.nonce });\n\n const registration = await postJson<{\n agent?: { id: string; api_key: string };\n wallet?: { private_key?: string };\n }>(\n fetchImpl,\n `${meshApiBase}/register`,\n req.founderBearer,\n {\n name: req.handle,\n wallet_address: wallet.address,\n nonce: challenge.nonce,\n signature,\n }\n );\n writeFileSync(\n regPath,\n JSON.stringify({ status: 201, response: registration, registered_at: new Date().toISOString(), flow: 'x402' }, null, 2),\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(`/register did not return agent.id + agent.api_key: ${JSON.stringify(registration).slice(0, 400)}`);\n }\n if (registration.wallet?.private_key) {\n console.warn('[provision] WARN — server returned private_key despite x402 flow; ignoring (using local key).');\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\n ?? join(homedir(), '.holoscript-agent', 'seats');\n}\n\nfunction makeSeatId(surface: string): string {\n const fp = createHash('sha256').update(hostname() + homedir()).digest('hex').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 { chmodSync(keyPath, 0o600); } 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 { iv: iv.toString('base64'), ct: ct.toString('base64'), tag: cipher.getAuthTag().toString('base64'), alg: 'aes-256-gcm' };\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","join","readFile","dirname","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","HANDLE_PATTERN","writeFileSync","readFileSync","existsSync","mkdirSync","dirname","resolve","join","homedir"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
interface ProvisionRequest {
|
|
2
|
+
handle: string;
|
|
3
|
+
meshApiBase?: string;
|
|
4
|
+
founderBearer: string;
|
|
5
|
+
seatsRoot?: string;
|
|
6
|
+
fetchImpl?: typeof fetch;
|
|
7
|
+
autoJoinTeamId?: string;
|
|
8
|
+
}
|
|
9
|
+
interface ProvisionDryRun {
|
|
10
|
+
status: 'dry-run';
|
|
11
|
+
handle: string;
|
|
12
|
+
surface: string;
|
|
13
|
+
seatId: string;
|
|
14
|
+
seatDir: string;
|
|
15
|
+
willGenerateWallet: boolean;
|
|
16
|
+
willCallEndpoints: string[];
|
|
17
|
+
}
|
|
18
|
+
interface ProvisionExecuted {
|
|
19
|
+
status: 'executed' | 'reused';
|
|
20
|
+
handle: string;
|
|
21
|
+
surface: string;
|
|
22
|
+
seatId: string;
|
|
23
|
+
seatDir: string;
|
|
24
|
+
walletAddress: string;
|
|
25
|
+
bearer?: string;
|
|
26
|
+
agentId?: string;
|
|
27
|
+
envVarLines: string[];
|
|
28
|
+
joinedTeam?: {
|
|
29
|
+
teamId: string;
|
|
30
|
+
role: string;
|
|
31
|
+
members: number;
|
|
32
|
+
} | {
|
|
33
|
+
teamId: string;
|
|
34
|
+
error: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
type ProvisionResult = ProvisionDryRun | ProvisionExecuted;
|
|
38
|
+
declare function provisionAgent(req: ProvisionRequest, opts?: {
|
|
39
|
+
execute: boolean;
|
|
40
|
+
force?: boolean;
|
|
41
|
+
}): Promise<ProvisionResult>;
|
|
42
|
+
|
|
43
|
+
export { type ProvisionDryRun, type ProvisionExecuted, type ProvisionRequest, type ProvisionResult, provisionAgent };
|