From 9354b10bc4b888b770d81c2959f6526424c3a668 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Mon, 18 May 2026 16:29:57 +1000 Subject: [PATCH 01/37] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ae9415ba..eb5f9df5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "villani-code" version = "0.1.0rc1" description = "Disciplined small-model-first coding agent" readme = "README.md" -requires-python = ">=3.11" +requires-python = ">=3.9" dependencies = [ "typer>=0.12", "httpx>=0.27", From 4a7542383f44afc28c00c2621a57561dfe276bfb Mon Sep 17 00:00:00 2001 From: mmprotest Date: Mon, 18 May 2026 16:44:58 +1000 Subject: [PATCH 02/37] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index eb5f9df5..ae9415ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "villani-code" version = "0.1.0rc1" description = "Disciplined small-model-first coding agent" readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.11" dependencies = [ "typer>=0.12", "httpx>=0.27", From 2723ae6bd7bfe2068d1d630a7ad18ba45e64831a Mon Sep 17 00:00:00 2001 From: mmprotest Date: Fri, 29 May 2026 14:26:28 +1000 Subject: [PATCH 03/37] Add Pi bridge integration --- integrations/pi-villani/README.md | 94 +++++ .../pi-villani/docs/pi-model-bridge.md | 26 ++ integrations/pi-villani/package-lock.json | 50 +++ integrations/pi-villani/package.json | 19 + integrations/pi-villani/src/index.ts | 84 +++++ integrations/pi-villani/src/process.ts | 110 ++++++ integrations/pi-villani/src/protocol.ts | 57 +++ integrations/pi-villani/src/render.ts | 67 ++++ integrations/pi-villani/tsconfig.json | 14 + tests/integrations/test_pi_bridge.py | 158 ++++++++ villani_code/cli.py | 11 + villani_code/integrations/__init__.py | 1 + villani_code/integrations/pi_bridge.py | 348 ++++++++++++++++++ .../integrations/pi_bridge_protocol.py | 95 +++++ 14 files changed, 1134 insertions(+) create mode 100644 integrations/pi-villani/README.md create mode 100644 integrations/pi-villani/docs/pi-model-bridge.md create mode 100644 integrations/pi-villani/package-lock.json create mode 100644 integrations/pi-villani/package.json create mode 100644 integrations/pi-villani/src/index.ts create mode 100644 integrations/pi-villani/src/process.ts create mode 100644 integrations/pi-villani/src/protocol.ts create mode 100644 integrations/pi-villani/src/render.ts create mode 100644 integrations/pi-villani/tsconfig.json create mode 100644 tests/integrations/test_pi_bridge.py create mode 100644 villani_code/integrations/__init__.py create mode 100644 villani_code/integrations/pi_bridge.py create mode 100644 villani_code/integrations/pi_bridge_protocol.py diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md new file mode 100644 index 00000000..47c86183 --- /dev/null +++ b/integrations/pi-villani/README.md @@ -0,0 +1,94 @@ +# Pi Villani Integration + +This package is a thin Pi extension that lets Pi remain the chat UI/shell while Villani Code remains the autonomous coding runner. + +Pi command flow: + +```text +/villani Fix the failing tests and verify the repair + -> Pi extension + -> villani bridge --stdio subprocess in the current workspace + -> JSONL run command + -> existing Villani Runner + -> normalized JSONL progress/final events back to Pi +``` + +The extension does **not** reimplement Villani's runner logic and does not require Pi to understand Villani internals. + +## Local installation from this checkout + +```bash +cd integrations/pi-villani +npm install +npm run build +``` + +Then load/register the built extension with your Pi extension development workflow. The exact Pi SDK packaging API is still isolated behind `src/index.ts`; if your installed Pi SDK exposes a different command registration method, adapt only that file. + +## Required Villani installation + +The extension launches: + +```bash +villani bridge --stdio +``` + +Set `VILLANI_COMMAND` if your executable name is different, for example this repository currently exposes the console script as `villani-code` and module execution works as `python -m villani_code.cli`: + +```bash +export VILLANI_COMMAND="villani-code" +# or +export VILLANI_COMMAND="python -m villani_code.cli" +``` + +## Configuration + +The first milestone uses explicit Villani model configuration. Pi-backed model reuse is not implemented yet. + +Supported environment variables: + +```bash +export VILLANI_COMMAND="villani" +export VILLANI_MODE="runner" # runner or villani +export VILLANI_PROVIDER="openai" # openai or anthropic +export VILLANI_MODEL="your-model" +export VILLANI_BASE_URL="http://127.0.0.1:1234" +export VILLANI_API_KEY="dummy" +``` + +`VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, and `VILLANI_API_KEY` are sent to the bridge only when set. Villani's own defaults and validation remain the source of truth. + +## Usage + +Inside Pi, from a workspace/repository: + +```text +/villani Fix the failing auth tests and verify the repair +``` + +The final Pi summary includes: + +- success, failure, or aborted status +- Villani's summary +- changed files reported from the repository working tree +- verification status when Villani exposes it +- transcript/run path when Villani writes one + +## Safety notes + +- The extension does not bypass Villani permissions or sandboxing. +- The extension launches a subprocess with `shell: false` for Windows-friendly argument handling. +- The bridge emits operational telemetry only; it does not stream hidden reasoning, model prompts, or transcript contents. + +## Limitations + +- Cancellation is best-effort. The bridge sends `abort` and marks the run as aborted only after the current Villani runner call stops; the core runner does not yet expose a universal cooperative cancellation token. +- Pi SDK typings are not vendored in this repository. The extension uses a small `PiLikeContext` shim so the bridge/process/rendering code stays compile-safe and the real Pi API adapter can remain small. +- Pi model/auth reuse is deferred. See `docs/pi-model-bridge.md` for the intended design. + +## Troubleshooting + +- **No ready event / timeout:** confirm `VILLANI_COMMAND` is on `PATH` and supports `bridge --stdio`. +- **Missing model/base URL:** set `VILLANI_MODEL` and `VILLANI_BASE_URL`, or configure Villani defaults if supported by your installation. +- **Unexpected text on stdout:** stdout must be JSONL protocol only. Send debug logs to stderr. +- **Windows paths:** pass normal workspace paths; the bridge normalizes changed-file paths to forward slashes in events. diff --git a/integrations/pi-villani/docs/pi-model-bridge.md b/integrations/pi-villani/docs/pi-model-bridge.md new file mode 100644 index 00000000..fc858ac9 --- /dev/null +++ b/integrations/pi-villani/docs/pi-model-bridge.md @@ -0,0 +1,26 @@ +# Future Pi-backed model bridge + +Current milestone: the Pi extension launches Villani Code and passes explicit Villani model configuration from environment variables (`VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, `VILLANI_API_KEY`). Pi remains the UI/shell, but Villani still talks directly to its configured model provider. + +Future milestone: add a temporary local OpenAI- or Anthropic-compatible proxy owned by the Pi extension: + +```text +Villani Runner + -> local temporary OpenAI/Anthropic-compatible endpoint + -> Pi AI provider/model APIs + -> user's existing Pi authentication +``` + +Benefits: + +- Pi users do not configure credentials twice. +- Villani can keep using its existing provider/client abstractions. +- The integration remains a bridge rather than a port of Villani's runner. + +Implementation notes for that future work: + +- Start the proxy only for the lifetime of one `/villani` run. +- Bind to localhost on an ephemeral port. +- Translate only stable chat/message API fields needed by Villani. +- Preserve the same bridge JSONL protocol so cancellation, progress rendering, and final summaries do not change. +- Do not implement a partial proxy until the Pi AI package API is available and testable. diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json new file mode 100644 index 00000000..528a44e9 --- /dev/null +++ b/integrations/pi-villani/package-lock.json @@ -0,0 +1,50 @@ +{ + "name": "pi-villani", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pi-villani", + "version": "0.1.0", + "devDependencies": { + "@types/node": "^20.11.30", + "typescript": "^5.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "20.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", + "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json new file mode 100644 index 00000000..04d9059a --- /dev/null +++ b/integrations/pi-villani/package.json @@ -0,0 +1,19 @@ +{ + "name": "pi-villani", + "version": "0.1.0", + "private": true, + "description": "Pi extension bridge for running Villani Code as a delegated coding runner.", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, + "devDependencies": { + "@types/node": "^20.11.30", + "typescript": "^5.4.0" + }, + "engines": { + "node": ">=18" + } +} diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts new file mode 100644 index 00000000..459a9155 --- /dev/null +++ b/integrations/pi-villani/src/index.ts @@ -0,0 +1,84 @@ +import { randomUUID } from "node:crypto"; +import { BridgeEvent, RunCommand, VillaniMode } from "./protocol"; +import { VillaniBridgeProcess } from "./process"; +import { PiLikeOutput, renderEvent } from "./render"; + +interface PiLikeContext { + commands?: { registerCommand?: (name: string, handler: (args?: unknown) => unknown) => { dispose?: () => void } | void }; + workspace?: { cwd?: string; rootPath?: string; folders?: Array<{ path?: string; uri?: { fsPath?: string } }> }; + output?: PiLikeOutput; + subscriptions?: Array<{ dispose?: () => void }>; +} + +export function activate(context: PiLikeContext): void { + const registrar = context.commands?.registerCommand; + if (!registrar) { + throw new Error("Pi command registration API was not found; update src/index.ts for the installed Pi SDK."); + } + const disposable = registrar("villani", async (args?: unknown) => runVillaniCommand(context, args)); + if (disposable && context.subscriptions) context.subscriptions.push(disposable); +} + +export function deactivate(): void { + // Nothing persistent to clean up; per-run bridge processes are killed in finally blocks. +} + +export async function runVillaniCommand(context: PiLikeContext, args?: unknown): Promise { + const task = extractTask(args); + const output = context.output ?? console; + if (!task) throw new Error("Usage: /villani "); + const repo = resolveWorkspace(context); + const runId = randomUUID(); + const bridge = new VillaniBridgeProcess({ command: process.env.VILLANI_COMMAND || "villani", cwd: repo }); + let finished = false; + let resolveFinal!: () => void; + const finalEvent = new Promise((resolve) => { resolveFinal = resolve; }); + try { + bridge.onEvent((event: BridgeEvent) => { + renderEvent(event, output); + if (event.type === "run_completed" || event.type === "run_failed" || event.type === "run_aborted") { + finished = true; + resolveFinal(); + } + }); + await bridge.waitUntilReady(); + const command: RunCommand = { + type: "run", + id: runId, + task, + repo, + mode: (process.env.VILLANI_MODE as VillaniMode | undefined) || "runner", + config: { + provider: process.env.VILLANI_PROVIDER, + model: process.env.VILLANI_MODEL, + base_url: process.env.VILLANI_BASE_URL, + api_key: process.env.VILLANI_API_KEY, + }, + }; + bridge.send(command); + await Promise.race([ + finalEvent, + bridge.waitForExit().then((code) => { + if (!finished) throw new Error(`Villani bridge exited before final event with code ${code}. stderr: ${bridge.stderr()}`); + }), + ]); + } finally { + if (!finished) { + try { bridge.abort(runId); } catch { /* ignore cleanup send errors */ } + } + bridge.kill(); + } +} + +function extractTask(args: unknown): string { + if (typeof args === "string") return args.trim(); + if (args && typeof args === "object" && "text" in args) return String((args as { text?: unknown }).text ?? "").trim(); + if (Array.isArray(args)) return args.join(" ").trim(); + return ""; +} + +function resolveWorkspace(context: PiLikeContext): string { + const workspace = context.workspace; + return workspace?.cwd || workspace?.rootPath || workspace?.folders?.[0]?.path || workspace?.folders?.[0]?.uri?.fsPath || process.cwd(); +} + diff --git a/integrations/pi-villani/src/process.ts b/integrations/pi-villani/src/process.ts new file mode 100644 index 00000000..a0eb52d4 --- /dev/null +++ b/integrations/pi-villani/src/process.ts @@ -0,0 +1,110 @@ +import { ChildProcessWithoutNullStreams, spawn } from "node:child_process"; +import { createInterface } from "node:readline"; +import { AbortCommand, BridgeCommand, BridgeEvent, commandToLine } from "./protocol"; + +export interface BridgeProcessOptions { + command: string; + cwd: string; + readyTimeoutMs?: number; + env?: NodeJS.ProcessEnv; +} + +export class VillaniBridgeProcess { + private child: ChildProcessWithoutNullStreams; + private stderrChunks: string[] = []; + private listeners: Array<(event: BridgeEvent) => void> = []; + private readyPromise: Promise; + private exitPromise: Promise; + private closed = false; + + constructor(options: BridgeProcessOptions) { + const { executable, args } = splitCommand(options.command); + this.child = spawn(executable, [...args, "bridge", "--stdio"], { + cwd: options.cwd, + env: { ...process.env, ...options.env }, + shell: false, + windowsHide: true, + }); + + this.child.stderr.on("data", (chunk: Buffer) => { + this.stderrChunks.push(chunk.toString("utf8")); + if (this.stderrChunks.length > 20) this.stderrChunks.shift(); + }); + + const stdout = createInterface({ input: this.child.stdout, crlfDelay: Infinity }); + let markReady: (() => void) | undefined; + const readySeen = new Promise((resolve) => { + markReady = resolve; + }); + stdout.on("line", (line: string) => { + const trimmed = line.trim(); + if (!trimmed) return; + let event: BridgeEvent; + try { + event = JSON.parse(trimmed) as BridgeEvent; + } catch { + event = { type: "error", error: `Malformed bridge output: ${trimmed.slice(0, 200)}` }; + } + if (event.type === "ready") markReady?.(); + this.listeners.forEach((listener) => listener(event)); + }); + + this.exitPromise = new Promise((resolve) => { + this.child.on("exit", (code) => { + this.closed = true; + resolve(code); + }); + }); + + const timeoutMs = options.readyTimeoutMs ?? 15_000; + this.readyPromise = Promise.race([ + readySeen, + new Promise((_, reject) => + setTimeout(() => reject(new Error(`Timed out waiting for Villani bridge ready. stderr: ${this.stderr()}`)), timeoutMs), + ), + ]); + } + + onEvent(listener: (event: BridgeEvent) => void): void { + this.listeners.push(listener); + } + + waitUntilReady(): Promise { + return this.readyPromise; + } + + waitForExit(): Promise { + return this.exitPromise; + } + + send(command: BridgeCommand): void { + if (this.closed || !this.child.stdin.writable) { + throw new Error(`Villani bridge is not writable. stderr: ${this.stderr()}`); + } + this.child.stdin.write(commandToLine(command)); + } + + abort(runId: string): void { + const command: AbortCommand = { type: "abort", id: runId }; + this.send(command); + } + + kill(): void { + if (!this.closed) this.child.kill(); + } + + stderr(): string { + return this.stderrChunks.join("").slice(-4000); + } +} + +function splitCommand(command: string): { executable: string; args: string[] } { + const trimmed = command.trim(); + if (!trimmed) return { executable: "villani", args: [] }; + if (trimmed.startsWith("python -m ")) { + const [, , moduleName, ...rest] = trimmed.split(/\s+/); + return { executable: "python", args: ["-m", moduleName, ...rest] }; + } + const parts = trimmed.split(/\s+/); + return { executable: parts[0], args: parts.slice(1) }; +} diff --git a/integrations/pi-villani/src/protocol.ts b/integrations/pi-villani/src/protocol.ts new file mode 100644 index 00000000..1267791f --- /dev/null +++ b/integrations/pi-villani/src/protocol.ts @@ -0,0 +1,57 @@ +export const PROTOCOL_VERSION = 1; + +export type VillaniMode = "runner" | "villani"; + +export interface BridgeConfig { + provider?: string; + model?: string; + base_url?: string; + api_key?: string; +} + +export interface BridgeLimits { + max_turns?: number; +} + +export interface PingCommand { + type: "ping"; + id: string; +} + +export interface RunCommand { + type: "run"; + id: string; + task: string; + repo: string; + mode: VillaniMode; + config?: BridgeConfig; + limits?: BridgeLimits; +} + +export interface AbortCommand { + type: "abort"; + id: string; +} + +export type BridgeCommand = PingCommand | RunCommand | AbortCommand; + +export type BridgeEvent = + | { type: "ready"; protocol_version: number } + | { type: "pong"; id: string } + | { type: "run_started"; id: string; run_id: string; task: string; repo: string; mode: VillaniMode } + | { type: "phase"; id: string; phase: string; message: string } + | { type: "tool_started"; id: string; tool: string; path?: string | null; command?: string | null } + | { type: "tool_finished"; id: string; tool: string; ok: boolean; summary: string } + | { type: "workspace_changed"; id: string; files: string[] } + | { type: "verification_started"; id: string; command: string } + | { type: "verification_finished"; id: string; command: string; passed: boolean; summary: string } + | { type: "governor_redirect"; id: string; message: string } + | { type: "abort_requested"; id: string } + | { type: "run_completed"; id: string; success: true; changed_files: string[]; verification_passed: boolean | null; summary: string; transcript_path?: string | null } + | { type: "run_failed"; id: string; success: false; error: string; summary: string; transcript_path?: string | null } + | { type: "run_aborted"; id: string; success: false; summary: string; transcript_path?: string | null } + | { type: "error"; id?: string; error: string }; + +export function commandToLine(command: BridgeCommand): string { + return `${JSON.stringify(command)}\n`; +} diff --git a/integrations/pi-villani/src/render.ts b/integrations/pi-villani/src/render.ts new file mode 100644 index 00000000..25ddc528 --- /dev/null +++ b/integrations/pi-villani/src/render.ts @@ -0,0 +1,67 @@ +import { BridgeEvent } from "./protocol"; + +export interface PiLikeOutput { + info?: (message: string) => void; + warn?: (message: string) => void; + error?: (message: string) => void; + markdown?: (message: string) => void; + log?: (message: string) => void; +} + +export function renderEvent(event: BridgeEvent, output: PiLikeOutput = console): void { + const write = output.info ?? output.log ?? console.log; + const warn = output.warn ?? write; + const error = output.error ?? warn; + switch (event.type) { + case "run_started": + write(`Villani started: ${event.task}`); + break; + case "phase": + write(`Villani: ${event.message}`); + break; + case "tool_started": + write(`Tool started: ${event.tool}${event.path ? ` ${event.path}` : ""}${event.command ? ` ${event.command}` : ""}`); + break; + case "tool_finished": + write(`Tool ${event.ok ? "finished" : "failed"}: ${event.summary}`); + break; + case "workspace_changed": + write(`Workspace changed: ${event.files.join(", ")}`); + break; + case "verification_started": + write(`Verification started: ${event.command}`); + break; + case "verification_finished": + write(`Verification ${event.passed ? "passed" : "failed"}: ${event.command}`); + break; + case "governor_redirect": + warn(`Villani governor: ${event.message}`); + break; + case "run_completed": + case "run_failed": + case "run_aborted": + renderFinalSummary(event, output); + break; + case "error": + error(`Villani bridge error: ${event.error}`); + break; + } +} + +export function renderFinalSummary(event: Extract, output: PiLikeOutput = console): void { + const markdown = output.markdown ?? output.info ?? output.log ?? console.log; + const changedFiles = "changed_files" in event && event.changed_files.length ? event.changed_files.map((file) => `- ${file}`).join("\n") : "None reported"; + const verification = "verification_passed" in event ? String(event.verification_passed) : "not reported"; + const status = event.type === "run_completed" ? "completed" : event.type === "run_aborted" ? "aborted" : "failed"; + markdown([ + `### Villani ${status}`, + "", + event.summary || "No summary reported.", + "", + `**Changed files**\n${changedFiles}`, + "", + `**Verification passed:** ${verification}`, + `**Transcript:** ${event.transcript_path ?? "not reported"}`, + "error" in event && event.error ? `**Error:** ${event.error}` : "", + ].filter(Boolean).join("\n")); +} diff --git a/integrations/pi-villani/tsconfig.json b/integrations/pi-villani/tsconfig.json new file mode 100644 index 00000000..a31f3be2 --- /dev/null +++ b/integrations/pi-villani/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "Node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*.ts"] +} diff --git a/tests/integrations/test_pi_bridge.py b/tests/integrations/test_pi_bridge.py new file mode 100644 index 00000000..5ede0c43 --- /dev/null +++ b/tests/integrations/test_pi_bridge.py @@ -0,0 +1,158 @@ +from __future__ import annotations + +import io +import json +import threading +import time +from pathlib import Path +from typing import Any + +from villani_code.integrations.pi_bridge import PiBridge, map_runner_event + + +class DummyRunner: + def __init__(self, events: list[dict[str, Any]] | None = None, result: dict[str, Any] | None = None, error: Exception | None = None) -> None: + self.event_callback = lambda _event: None + self.events = events or [] + self.result = result or { + "response": {"content": [{"type": "text", "text": "Fixed failing test."}]}, + "transcript_path": ".villani_code/runs/run/transcript.json", + "execution": {"final_text": "Fixed failing test."}, + } + self.error = error + + def run(self, instruction: str, **_kwargs: Any) -> dict[str, Any]: + if self.error: + raise self.error + for event in self.events: + self.event_callback(event) + return self.result + + +def collect_json_lines(output: io.StringIO) -> list[dict[str, Any]]: + return [json.loads(line) for line in output.getvalue().splitlines() if line.strip()] + + +def test_stdio_ping_emits_ready_and_pong() -> None: + stdin = io.StringIO('{"type":"ping","id":"abc"}\n') + stdout = io.StringIO() + PiBridge(stdin=stdin, stdout=stdout).run_stdio() + assert collect_json_lines(stdout) == [ + {"type": "ready", "protocol_version": 1}, + {"type": "pong", "id": "abc"}, + ] + + +def test_malformed_json_emits_error_and_processes_next_command() -> None: + stdin = io.StringIO('{bad json}\n{"type":"ping","id":"still-alive"}\n') + stdout = io.StringIO() + PiBridge(stdin=stdin, stdout=stdout).run_stdio() + events = collect_json_lines(stdout) + assert events[0]["type"] == "ready" + assert events[1]["type"] == "error" + assert events[2] == {"type": "pong", "id": "still-alive"} + + +def test_unknown_command_emits_error() -> None: + stdin = io.StringIO('{"type":"wat"}\n') + stdout = io.StringIO() + PiBridge(stdin=stdin, stdout=stdout).run_stdio() + events = collect_json_lines(stdout) + assert events[1]["type"] == "error" + assert "Unknown bridge command type" in events[1]["error"] + + +def test_run_command_constructs_runner_and_completes(tmp_path: Path) -> None: + seen: dict[str, Any] = {} + + def factory(command: Any, event_callback: Any) -> DummyRunner: + seen["command"] = command + runner = DummyRunner( + events=[ + {"type": "diagnosis_attempted"}, + {"type": "tool_started", "name": "Read", "input": {"path": "src/foo.py"}}, + {"type": "tool_finished", "name": "Read", "input": {"path": "src/foo.py"}, "is_error": False}, + {"type": "validation_step_started", "name": "pytest", "command": "pytest tests/test_foo.py"}, + {"type": "validation_step_finished", "name": "pytest", "command": "pytest tests/test_foo.py", "exit_code": 0}, + ] + ) + runner.event_callback = event_callback + return runner + + stdout = io.StringIO() + bridge = PiBridge(stdout=stdout, runner_factory=factory) + bridge._handle_command( + { + "type": "run", + "id": "run-123", + "task": "Fix tests", + "repo": str(tmp_path), + "mode": "runner", + "config": {"provider": "openai", "model": "m", "base_url": "http://localhost", "api_key": "dummy"}, + "limits": {"max_turns": 3}, + } + ) + deadline = time.time() + 2 + while bridge._active and time.time() < deadline: + time.sleep(0.01) + bridge._drain_events() + + events = collect_json_lines(stdout) + assert seen["command"].limits.max_turns == 3 + assert [event["type"] for event in events][:2] == ["run_started", "phase"] + assert any(event["type"] == "verification_finished" and event["passed"] for event in events) + assert events[-1]["type"] == "run_completed" + assert events[-1]["transcript_path"] == ".villani_code/runs/run/transcript.json" + + +def test_failing_runner_emits_run_failed(tmp_path: Path) -> None: + def factory(_command: Any, event_callback: Any) -> DummyRunner: + runner = DummyRunner(error=RuntimeError("boom")) + runner.event_callback = event_callback + return runner + + stdout = io.StringIO() + bridge = PiBridge(stdout=stdout, stderr=io.StringIO(), runner_factory=factory) + bridge._handle_command({"type": "run", "id": "run-fail", "task": "Fix", "repo": str(tmp_path)}) + deadline = time.time() + 2 + while bridge._active and time.time() < deadline: + time.sleep(0.01) + bridge._drain_events() + events = collect_json_lines(stdout) + assert events[0]["type"] == "run_started" + assert events[-1]["type"] == "run_failed" + assert events[-1]["error"] == "boom" + + +def test_abort_is_reported_after_cooperative_runner_stops(tmp_path: Path) -> None: + started = threading.Event() + + class BlockingRunner(DummyRunner): + def run(self, instruction: str, **_kwargs: Any) -> dict[str, Any]: + started.set() + while not bridge._active["run-abort"].abort_requested.is_set(): + time.sleep(0.01) + return self.result + + def factory(_command: Any, event_callback: Any) -> BlockingRunner: + runner = BlockingRunner() + runner.event_callback = event_callback + return runner + + stdout = io.StringIO() + bridge = PiBridge(stdout=stdout, runner_factory=factory) + bridge._handle_command({"type": "run", "id": "run-abort", "task": "Fix", "repo": str(tmp_path)}) + assert started.wait(timeout=2) + bridge._handle_command({"type": "abort", "id": "run-abort"}) + active = next(iter(bridge._active.values())) + assert active.thread is not None + active.thread.join(timeout=2) + bridge._drain_events() + events = collect_json_lines(stdout) + assert any(event["type"] == "abort_requested" for event in events) + assert events[-1]["type"] == "run_aborted" + + +def test_runner_event_mapping_does_not_expose_prompts() -> None: + mapped = map_runner_event("run-1", {"type": "stream_text", "text": "hidden prompt-ish text"}) + assert mapped == [] diff --git a/villani_code/cli.py b/villani_code/cli.py index b5634b3e..4257eca3 100644 --- a/villani_code/cli.py +++ b/villani_code/cli.py @@ -328,6 +328,17 @@ def context_cmd( console.print(f"- {item.source_id} excluded={item.excluded_reason.value if item.excluded_reason else '-'} why={item.why}") +@app.command() +def bridge( + stdio: bool = typer.Option(False, "--stdio", help="Run the JSONL stdio bridge for external integrations."), +) -> None: + if not stdio: + raise typer.BadParameter("Only --stdio is supported for the bridge command") + from villani_code.integrations.pi_bridge import main_stdio + + main_stdio() + + @app.command("checkpoint") def checkpoint_cmd( task_summary: str = typer.Argument("manual checkpoint"), diff --git a/villani_code/integrations/__init__.py b/villani_code/integrations/__init__.py new file mode 100644 index 00000000..512503fc --- /dev/null +++ b/villani_code/integrations/__init__.py @@ -0,0 +1 @@ +"""Integration adapters for Villani Code.""" diff --git a/villani_code/integrations/pi_bridge.py b/villani_code/integrations/pi_bridge.py new file mode 100644 index 00000000..40fa3202 --- /dev/null +++ b/villani_code/integrations/pi_bridge.py @@ -0,0 +1,348 @@ +from __future__ import annotations + +import os +import queue +import subprocess +import sys +import threading +import traceback +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Callable, TextIO + +from villani_code.execution import ExecutionBudget, VILLANI_TASK_BUDGET +from villani_code.integrations.pi_bridge_protocol import ( + RunCommand, + parse_json_line, + parse_run_command, + ready_event, + to_json_line, +) + +RunnerFactory = Callable[[RunCommand, Callable[[dict[str, Any]], None]], Any] + + +@dataclass(slots=True) +class ActiveRun: + command: RunCommand + abort_requested: threading.Event = field(default_factory=threading.Event) + thread: threading.Thread | None = None + + +class PiBridge: + def __init__( + self, + *, + stdin: TextIO | None = None, + stdout: TextIO | None = None, + stderr: TextIO | None = None, + runner_factory: RunnerFactory | None = None, + ) -> None: + self.stdin = stdin or sys.stdin + self.stdout = stdout or sys.stdout + self.stderr = stderr or sys.stderr + self.runner_factory = runner_factory or build_default_runner + self._events: queue.Queue[dict[str, Any] | None] = queue.Queue() + self._active: dict[str, ActiveRun] = {} + self._lock = threading.Lock() + + def emit(self, event: dict[str, Any]) -> None: + self.stdout.write(to_json_line(event)) + self.stdout.flush() + + def run_stdio(self) -> None: + self.emit(ready_event()) + commands: queue.Queue[str | None] = queue.Queue() + + def read_stdin() -> None: + try: + for raw_line in self.stdin: + commands.put(raw_line) + finally: + commands.put(None) + + reader = threading.Thread(target=read_stdin, daemon=True) + reader.start() + stdin_closed = False + while True: + self._drain_events() + try: + raw_line = commands.get(timeout=0.05) + except queue.Empty: + if stdin_closed and not self._active: + break + continue + if raw_line is None: + stdin_closed = True + if not self._active: + break + continue + line = raw_line.strip() + if not line: + continue + try: + command = parse_json_line(line) + self._handle_command(command) + except Exception as exc: # noqa: BLE001 + self.emit({"type": "error", "error": str(exc)}) + self._drain_events() + + def _drain_events(self) -> None: + while True: + try: + event = self._events.get_nowait() + except queue.Empty: + return + if event is not None: + self.emit(event) + + def _handle_command(self, command: dict[str, Any]) -> None: + command_type = str(command.get("type") or "") + if command_type == "ping": + self.emit({"type": "pong", "id": command.get("id")}) + return + if command_type == "run": + self._start_run(parse_run_command(command)) + return + if command_type == "abort": + run_id = str(command.get("id") or "") + self._abort_run(run_id) + return + raise ValueError(f"Unknown bridge command type: {command_type or ''}") + + def _start_run(self, command: RunCommand) -> None: + with self._lock: + if command.id in self._active: + raise ValueError(f"Run already active: {command.id}") + active = ActiveRun(command=command) + self._active[command.id] = active + thread = threading.Thread(target=self._run_worker, args=(active,), daemon=True) + active.thread = thread + thread.start() + + def _abort_run(self, run_id: str) -> None: + with self._lock: + active = self._active.get(run_id) + if active is None: + self.emit({"type": "error", "id": run_id, "error": "No active run with that id"}) + return + active.abort_requested.set() + # Best-effort only: the existing Runner has no general cooperative cancellation hook yet. + self.emit({"type": "abort_requested", "id": run_id}) + + def _run_worker(self, active: ActiveRun) -> None: + command = active.command + repo = str(Path(command.repo).resolve()) + before = git_changed_files(Path(repo)) + transcript_path: str | None = None + verification_passed: bool | None = None + latest_summary = "" + try: + self._events.put( + { + "type": "run_started", + "id": command.id, + "run_id": command.id, + "task": command.task, + "repo": repo, + "mode": command.mode, + } + ) + + def on_runner_event(event: dict[str, Any]) -> None: + nonlocal verification_passed, latest_summary + for mapped in map_runner_event(command.id, event): + if mapped.get("type") == "verification_finished": + verification_passed = bool(mapped.get("passed")) + self._events.put(mapped) + if event.get("type") == "validation_completed": + verification_passed = bool(event.get("passed")) + if event.get("type") in {"tool_result", "tool_finished"}: + latest_summary = summarize_tool_event(event) or latest_summary + + runner = self.runner_factory(command, on_runner_event) + if active.abort_requested.is_set(): + self._events.put({"type": "run_aborted", "id": command.id, "success": False, "summary": "Aborted by caller"}) + return + result = run_existing_runner(runner, command) + transcript_path = normalize_transcript_path(result) + changed = git_changed_files(Path(repo)) + changed_files = sorted(changed or before) + if active.abort_requested.is_set(): + self._events.put( + { + "type": "run_aborted", + "id": command.id, + "success": False, + "summary": "Aborted by caller after runner stopped", + "transcript_path": transcript_path, + } + ) + return + summary = extract_summary(result) or latest_summary or "Villani run completed." + self._events.put( + { + "type": "run_completed", + "id": command.id, + "success": True, + "changed_files": changed_files, + "verification_passed": verification_passed, + "summary": summary, + "transcript_path": transcript_path, + } + ) + except Exception as exc: # noqa: BLE001 + self._events.put( + { + "type": "run_failed", + "id": command.id, + "success": False, + "error": str(exc), + "summary": "Villani bridge run failed.", + "transcript_path": transcript_path, + } + ) + self.stderr.write(traceback.format_exc()) + self.stderr.flush() + finally: + with self._lock: + self._active.pop(command.id, None) + + +def build_default_runner(command: RunCommand, event_callback: Callable[[dict[str, Any]], None]) -> Any: + from villani_code.cli import _build_runner + + provider = command.config.provider or os.environ.get("VILLANI_PROVIDER") or "anthropic" + if provider not in {"anthropic", "openai"}: + raise ValueError("provider must be 'anthropic' or 'openai'") + model = command.config.model or os.environ.get("VILLANI_MODEL") + base_url = command.config.base_url or os.environ.get("VILLANI_BASE_URL") + if not model or not base_url: + raise ValueError("run config requires model and base_url, or VILLANI_MODEL and VILLANI_BASE_URL") + runner = _build_runner( + base_url=base_url, + model=model, + repo=Path(command.repo), + max_tokens=4096, + stream=True, + thinking=None, + unsafe=False, + verbose=False, + extra_json=None, + redact=False, + dangerously_skip_permissions=False, + auto_accept_edits=False, + auto_approve=False, + plan_mode="auto", + max_repair_attempts=2, + small_model=False, + provider=provider, # type: ignore[arg-type] + api_key=command.config.api_key or os.environ.get("VILLANI_API_KEY"), + villani_mode=command.mode == "villani", + ) + runner.event_callback = event_callback + return runner + + +def run_existing_runner(runner: Any, command: RunCommand) -> dict[str, Any]: + budget = None + if command.limits.max_turns is not None: + budget = ExecutionBudget( + max_turns=command.limits.max_turns, + max_tool_calls=VILLANI_TASK_BUDGET.max_tool_calls, + max_seconds=VILLANI_TASK_BUDGET.max_seconds, + max_no_edit_turns=VILLANI_TASK_BUDGET.max_no_edit_turns, + max_reconsecutive_recon_turns=VILLANI_TASK_BUDGET.max_reconsecutive_recon_turns, + ) + result = runner.run(command.task, execution_budget=budget) if budget is not None else runner.run(command.task) + return result if isinstance(result, dict) else {"response": result} + + +def git_changed_files(repo: Path) -> list[str]: + try: + proc = subprocess.run( + ["git", "status", "--porcelain=v1", "--untracked-files=all"], + cwd=repo, + text=True, + capture_output=True, + timeout=10, + check=False, + ) + except Exception: + return [] + if proc.returncode != 0: + return [] + paths: list[str] = [] + for line in proc.stdout.splitlines(): + if len(line) < 4: + continue + path = line[3:] + if " -> " in path: + path = path.split(" -> ", 1)[1] + paths.append(path.replace("\\", "/")) + return sorted(set(paths)) + + +def map_runner_event(run_id: str, event: dict[str, Any]) -> list[dict[str, Any]]: + etype = str(event.get("type") or "") + if etype in {"diagnosis_attempted", "diagnosis_generated", "planning_started", "model_request_started", "repair_attempt_started"}: + return [{"type": "phase", "id": run_id, "phase": etype, "message": humanize_event_type(etype)}] + if etype == "tool_started": + tool = str(event.get("name") or "tool") + tool_input = event.get("input") if isinstance(event.get("input"), dict) else {} + return [{"type": "tool_started", "id": run_id, "tool": tool, "path": tool_input.get("path"), "command": tool_input.get("command")}] + if etype == "tool_finished": + tool = str(event.get("name") or "tool") + ok = not bool(event.get("is_error")) + events = [{"type": "tool_finished", "id": run_id, "tool": tool, "ok": ok, "summary": summarize_tool_event(event)}] + if tool in {"Write", "Patch"}: + tool_input = event.get("input") if isinstance(event.get("input"), dict) else {} + path = tool_input.get("path") or tool_input.get("file_path") + if path: + events.append({"type": "workspace_changed", "id": run_id, "files": [str(path).replace("\\", "/")]}) + return events + if etype == "validation_step_started": + return [{"type": "verification_started", "id": run_id, "command": event.get("command") or event.get("name") or ""}] + if etype == "validation_step_finished": + passed = int(event.get("exit_code") or 0) == 0 + return [{"type": "verification_finished", "id": run_id, "command": event.get("command") or event.get("name") or "", "passed": passed, "summary": "passed" if passed else "failed"}] + if etype == "validation_completed": + passed = bool(event.get("passed")) + return [{"type": "verification_finished", "id": run_id, "command": "validation", "passed": passed, "summary": "passed" if passed else "failed"}] + if etype in {"command_wandering_detected", "progress_governor_redirected", "governor_redirect"}: + return [{"type": "governor_redirect", "id": run_id, "message": str(event.get("message") or humanize_event_type(etype))}] + return [] + + +def humanize_event_type(etype: str) -> str: + return etype.replace("_", " ").capitalize() + + +def summarize_tool_event(event: dict[str, Any]) -> str: + tool = str(event.get("name") or "tool") + tool_input = event.get("input") if isinstance(event.get("input"), dict) else {} + if tool == "Bash" and tool_input.get("command"): + return f"Ran {tool_input['command']}" + path = tool_input.get("path") or tool_input.get("file_path") + if path: + return f"{tool} {path}" + return f"{tool} finished" + + +def normalize_transcript_path(result: dict[str, Any]) -> str | None: + path = result.get("transcript_path") + return str(path) if path else None + + +def extract_summary(result: dict[str, Any]) -> str: + execution = result.get("execution") if isinstance(result.get("execution"), dict) else {} + if execution.get("final_text"): + return str(execution["final_text"]) + response = result.get("response") if isinstance(result.get("response"), dict) else {} + content = response.get("content") if isinstance(response.get("content"), list) else [] + text = "\n".join(str(block.get("text", "")) for block in content if isinstance(block, dict) and block.get("type") == "text").strip() + return text[:2000] + + +def main_stdio() -> None: + PiBridge().run_stdio() diff --git a/villani_code/integrations/pi_bridge_protocol.py b/villani_code/integrations/pi_bridge_protocol.py new file mode 100644 index 00000000..c4537a74 --- /dev/null +++ b/villani_code/integrations/pi_bridge_protocol.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import json +from dataclasses import asdict, dataclass, field +from typing import Any, Literal + +PROTOCOL_VERSION = 1 +BridgeMode = Literal["runner", "villani"] + + +@dataclass(slots=True) +class BridgeConfig: + provider: str | None = None + model: str | None = None + base_url: str | None = None + api_key: str | None = None + + +@dataclass(slots=True) +class BridgeLimits: + max_turns: int | None = None + + +@dataclass(slots=True) +class RunCommand: + id: str + task: str + repo: str + mode: BridgeMode = "runner" + config: BridgeConfig = field(default_factory=BridgeConfig) + limits: BridgeLimits = field(default_factory=BridgeLimits) + + +@dataclass(slots=True) +class PingCommand: + id: str + + +@dataclass(slots=True) +class AbortCommand: + id: str + + +def to_json_line(event: dict[str, Any]) -> str: + return json.dumps(event, ensure_ascii=False, separators=(",", ":")) + "\n" + + +def parse_json_line(line: str) -> dict[str, Any]: + payload = json.loads(line) + if not isinstance(payload, dict): + raise ValueError("Bridge command must be a JSON object") + return payload + + +def _optional_dict(value: Any) -> dict[str, Any]: + return value if isinstance(value, dict) else {} + + +def parse_run_command(payload: dict[str, Any]) -> RunCommand: + run_id = str(payload.get("id") or "").strip() + task = str(payload.get("task") or "").strip() + repo = str(payload.get("repo") or "").strip() + mode = str(payload.get("mode") or "runner").strip().lower() + if not run_id: + raise ValueError("run command requires id") + if not task: + raise ValueError("run command requires task") + if not repo: + raise ValueError("run command requires repo") + if mode not in {"runner", "villani"}: + raise ValueError("run mode must be 'runner' or 'villani'") + config_payload = _optional_dict(payload.get("config")) + limits_payload = _optional_dict(payload.get("limits")) + max_turns = limits_payload.get("max_turns") + return RunCommand( + id=run_id, + task=task, + repo=repo, + mode=mode, # type: ignore[arg-type] + config=BridgeConfig( + provider=str(config_payload["provider"]) if config_payload.get("provider") else None, + model=str(config_payload["model"]) if config_payload.get("model") else None, + base_url=str(config_payload["base_url"]) if config_payload.get("base_url") else None, + api_key=str(config_payload["api_key"]) if config_payload.get("api_key") else None, + ), + limits=BridgeLimits(max_turns=int(max_turns) if max_turns is not None else None), + ) + + +def ready_event() -> dict[str, Any]: + return {"type": "ready", "protocol_version": PROTOCOL_VERSION} + + +def dataclass_to_dict(value: Any) -> dict[str, Any]: + return asdict(value) From cb00210875cc3b28bcddd3eb6530277a0e14f484 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Fri, 29 May 2026 14:35:35 +1000 Subject: [PATCH 04/37] Add Pi-backed model proxy --- integrations/pi-villani/README.md | 15 +- .../pi-villani/docs/pi-model-bridge.md | 44 +- integrations/pi-villani/package-lock.json | 1282 ++++++++++++++++- integrations/pi-villani/package.json | 11 +- integrations/pi-villani/src/index.ts | 104 +- .../pi-villani/src/modelProxy.test.ts | 97 ++ integrations/pi-villani/src/modelProxy.ts | 251 ++++ integrations/pi-villani/src/process.ts | 2 +- integrations/pi-villani/src/render.ts | 2 +- integrations/pi-villani/tsconfig.json | 8 +- 10 files changed, 1762 insertions(+), 54 deletions(-) create mode 100644 integrations/pi-villani/src/modelProxy.test.ts create mode 100644 integrations/pi-villani/src/modelProxy.ts diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index 47c86183..059163cd 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -17,6 +17,8 @@ The extension does **not** reimplement Villani's runner logic and does not requi ## Local installation from this checkout +Requires Node.js 22.19 or newer, matching the current `@earendil-works/pi-ai` runtime. + ```bash cd integrations/pi-villani npm install @@ -43,9 +45,9 @@ export VILLANI_COMMAND="python -m villani_code.cli" ## Configuration -The first milestone uses explicit Villani model configuration. Pi-backed model reuse is not implemented yet. +By default, the extension reuses Pi's currently configured model through a temporary local proxy. You do not need to set `VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, or `VILLANI_API_KEY` for the normal Pi-backed path. -Supported environment variables: +Optional fallback environment variables: ```bash export VILLANI_COMMAND="villani" @@ -56,7 +58,9 @@ export VILLANI_BASE_URL="http://127.0.0.1:1234" export VILLANI_API_KEY="dummy" ``` -`VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, and `VILLANI_API_KEY` are sent to the bridge only when set. Villani's own defaults and validation remain the source of truth. +If any of `VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, or `VILLANI_API_KEY` is set, the extension skips the Pi model proxy and sends the explicit config to Villani. This preserves local server/custom provider workflows. + +When no explicit model config is set, the extension starts a temporary `127.0.0.1:` OpenAI-compatible proxy for one `/villani` run, passes that `base_url` to Villani, and forwards requests to Pi's configured model via `@earendil-works/pi-ai`. No user provider credentials are exposed to the Villani subprocess in this mode. ## Usage @@ -78,17 +82,18 @@ The final Pi summary includes: - The extension does not bypass Villani permissions or sandboxing. - The extension launches a subprocess with `shell: false` for Windows-friendly argument handling. +- The Pi model proxy binds only to `127.0.0.1` and lives only for the current `/villani` run. - The bridge emits operational telemetry only; it does not stream hidden reasoning, model prompts, or transcript contents. ## Limitations - Cancellation is best-effort. The bridge sends `abort` and marks the run as aborted only after the current Villani runner call stops; the core runner does not yet expose a universal cooperative cancellation token. - Pi SDK typings are not vendored in this repository. The extension uses a small `PiLikeContext` shim so the bridge/process/rendering code stays compile-safe and the real Pi API adapter can remain small. -- Pi model/auth reuse is deferred. See `docs/pi-model-bridge.md` for the intended design. +- Pi model/auth reuse currently supports Villani's OpenAI-compatible `/v1/chat/completions` path. Streaming is represented as one final SSE chunk rather than token-by-token streaming. See `docs/pi-model-bridge.md`. ## Troubleshooting - **No ready event / timeout:** confirm `VILLANI_COMMAND` is on `PATH` and supports `bridge --stdio`. -- **Missing model/base URL:** set `VILLANI_MODEL` and `VILLANI_BASE_URL`, or configure Villani defaults if supported by your installation. +- **Missing model/base URL:** normally Pi's active model supplies this through the proxy. If your Pi command context does not expose `ctx.model`, set `VILLANI_MODEL` and `VILLANI_BASE_URL` to use the explicit fallback. - **Unexpected text on stdout:** stdout must be JSONL protocol only. Send debug logs to stderr. - **Windows paths:** pass normal workspace paths; the bridge normalizes changed-file paths to forward slashes in events. diff --git a/integrations/pi-villani/docs/pi-model-bridge.md b/integrations/pi-villani/docs/pi-model-bridge.md index fc858ac9..1bae80ab 100644 --- a/integrations/pi-villani/docs/pi-model-bridge.md +++ b/integrations/pi-villani/docs/pi-model-bridge.md @@ -1,26 +1,36 @@ -# Future Pi-backed model bridge +# Pi-backed model bridge -Current milestone: the Pi extension launches Villani Code and passes explicit Villani model configuration from environment variables (`VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, `VILLANI_API_KEY`). Pi remains the UI/shell, but Villani still talks directly to its configured model provider. - -Future milestone: add a temporary local OpenAI- or Anthropic-compatible proxy owned by the Pi extension: +Milestone 2 adds a temporary localhost proxy owned by the Pi extension so Villani can reuse Pi's currently configured model without receiving user provider credentials. ```text Villani Runner - -> local temporary OpenAI/Anthropic-compatible endpoint - -> Pi AI provider/model APIs - -> user's existing Pi authentication + -> http://127.0.0.1:/v1/chat/completions + -> pi-villani local proxy + -> @earendil-works/pi-ai complete() + -> user's configured Pi provider/model/auth ``` -Benefits: +## Current implementation + +- The proxy starts only for one `/villani` command and is stopped in the command cleanup path. +- It binds to `127.0.0.1` on a random available port. +- The extension passes `provider: "openai"`, the temporary `base_url`, and the active Pi model id to Villani. +- No `VILLANI_API_KEY` is passed when the proxy path is used. +- The proxy implements the minimal `/v1/chat/completions` surface Villani uses through `OpenAIClient`: + - `messages` + - `tools` / function tool definitions + - `max_tokens` + - `temperature` + - `stream` +- The proxy translates OpenAI chat messages/tool calls/tool results into Pi `Context`/`Tool` shapes, calls `complete()`, and translates the Pi assistant message back into an OpenAI-compatible response. +- Streaming is compatibility streaming: Pi is called via `complete()` first, then the final assistant message is emitted as a single SSE chunk. This preserves Villani's streaming client path without claiming token-by-token streaming. + +## Fallback behavior -- Pi users do not configure credentials twice. -- Villani can keep using its existing provider/client abstractions. -- The integration remains a bridge rather than a port of Villani's runner. +If any explicit Villani model environment variable is set (`VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, or `VILLANI_API_KEY`), the extension skips the Pi proxy and uses the explicit configuration exactly as before. This keeps local OpenAI-compatible servers and other custom Villani provider setups working. -Implementation notes for that future work: +## Future improvements -- Start the proxy only for the lifetime of one `/villani` run. -- Bind to localhost on an ephemeral port. -- Translate only stable chat/message API fields needed by Villani. -- Preserve the same bridge JSONL protocol so cancellation, progress rendering, and final summaries do not change. -- Do not implement a partial proxy until the Pi AI package API is available and testable. +- Switch from `complete()` to true Pi token/event streaming if the active Pi provider exposes a stable stream suitable for OpenAI SSE translation. +- Add broader compatibility for `/v1/messages` only if Villani needs Anthropic-compatible direct proxying in a future client path. +- Surface proxy diagnostics in Pi's UI without logging request bodies or credentials. diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json index 528a44e9..71c12c66 100644 --- a/integrations/pi-villani/package-lock.json +++ b/integrations/pi-villani/package-lock.json @@ -7,24 +7,1238 @@ "": { "name": "pi-villani", "version": "0.1.0", + "dependencies": { + "@earendil-works/pi-ai": "^0.77.0" + }, "devDependencies": { "@types/node": "^20.11.30", "typescript": "^5.4.0" }, "engines": { - "node": ">=18" + "node": ">=22.19.0" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.91.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", + "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==", + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "^3.1.1" + }, + "bin": { + "anthropic-ai-sdk": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-bedrock-runtime": { + "version": "3.1048.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1048.0.tgz", + "integrity": "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/credential-provider-node": "^3.972.42", + "@aws-sdk/eventstream-handler-node": "^3.972.16", + "@aws-sdk/middleware-eventstream": "^3.972.12", + "@aws-sdk/middleware-websocket": "^3.972.19", + "@aws-sdk/token-providers": "3.1048.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/fetch-http-handler": "^5.4.2", + "@smithy/node-http-handler": "^4.7.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.974.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.15.tgz", + "integrity": "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@aws-sdk/xml-builder": "^3.972.26", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/core": "^3.24.5", + "@smithy/signature-v4": "^5.4.5", + "@smithy/types": "^4.14.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.41.tgz", + "integrity": "sha512-n1EbJ98yvPWWdHZZv8bRBMqqDQJrtgtxyJ4xLy2Uqrh25BCOZQ7nnS1CsFXvuH8r0b0KVHDZEGEH5FxmEMP8jg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.43.tgz", + "integrity": "sha512-TT76RN1NkI9WoyZqCNxOw6/WBMF7pYOTJcXbMokNFU+euSG40Kaf/t/FhDACVZWP+43wEM6ZynIPIkzS1wR1iA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/fetch-http-handler": "^5.4.5", + "@smithy/node-http-handler": "^4.7.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.5.tgz", + "integrity": "sha512-3dA9TQ+ybRSZ/m0wnbZhiBy4Dezjgq1Ib/ZZrYTpJDBgpoLLU/SDzZc/g0x0MNAdOJe1wPcM+x2PBRmoOur+Sw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.45.tgz", + "integrity": "sha512-sJe5ZWibO4s7RWjFQ8Zol76KxoJcIYyEZH1/wxQSBMSIAAxzaJ8cS/ITAaIHWUQvDKQdt18+cJAHKWB7n1Jmrg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/credential-provider-env": "^3.972.41", + "@aws-sdk/credential-provider-http": "^3.972.43", + "@aws-sdk/credential-provider-login": "^3.972.45", + "@aws-sdk/credential-provider-process": "^3.972.41", + "@aws-sdk/credential-provider-sso": "^3.972.45", + "@aws-sdk/credential-provider-web-identity": "^3.972.45", + "@aws-sdk/nested-clients": "^3.997.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/credential-provider-imds": "^4.3.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.45.tgz", + "integrity": "sha512-MZQv4SNjByk1iOKmrqmzcUF/uCB05wjvEHyXKxmGQTUANTIVayX6HPUF0bzkWLvtnkH7sAn9kUCfkXbSpj9sDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/nested-clients": "^3.997.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.46", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.46.tgz", + "integrity": "sha512-cS4w0jzDRb1jOlkiJS3y80OxddHzkky/MN9k3NYs5jganNKVLjF0lpvjlwS118oGMr3cdAfOlVdo8gLurTSE7w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.41", + "@aws-sdk/credential-provider-http": "^3.972.43", + "@aws-sdk/credential-provider-ini": "^3.972.45", + "@aws-sdk/credential-provider-process": "^3.972.41", + "@aws-sdk/credential-provider-sso": "^3.972.45", + "@aws-sdk/credential-provider-web-identity": "^3.972.45", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/credential-provider-imds": "^4.3.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.41.tgz", + "integrity": "sha512-7I/n1zkysouLOWvkEhjNEP4vMnD2v4kzzr3/3QBdrripEpn7ap1/I5DF3Hou1SUqkKWo1f3oPGMyFAA1FAMvsQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.45.tgz", + "integrity": "sha512-oHgbz/eFD8IKiksqDsz9ZMU4A59BpQq4QwJedBnGD80ZqYcHPPHZBwjBnxLVkB7iRVVHWpDclR8yWdD2PkQIUA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/nested-clients": "^3.997.13", + "@aws-sdk/token-providers": "3.1056.0", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.1056.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1056.0.tgz", + "integrity": "sha512-81duvlltQlsfn5K+o8zILcystBRdbT1G2JJYVCML5NZHBz4CL/zf+sAemCtBh/uh6RQUMyInGeZLQ7/8igZhbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/nested-clients": "^3.997.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.45.tgz", + "integrity": "sha512-CDhzKdb2onv5bpnjn/acgdNmJOQthPDLsPizU7rZflsEcgMMp8Mlri+U5hdxf8ldvZJpvM3vLU6D56vfJm5AMQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/nested-clients": "^3.997.13", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-handler-node": { + "version": "3.972.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.18.tgz", + "integrity": "sha512-QPQhwY/fstR8fMZFWrsJRNoTP6D1RjRPHGRX7u9/VkF3opCsvD0oXPz6qzkX94SchzvuS5vyFZbJbPcMEs2Jeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-eventstream": { + "version": "3.972.14", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.14.tgz", + "integrity": "sha512-DoZ4djVj/74XQ6M/IwxuKh543tTvLCL7u1Dx+VDHMgW9yGNrFSJJ1l0LrUQRaekic5CB12wUiiOoHL0VI6H0gg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-websocket": { + "version": "3.972.23", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.23.tgz", + "integrity": "sha512-F0d4A9pJFiwljyKgSwU1Z5n+CXSv8bp+V5SthbS2rftB8wBN9z1K2Yyv3xbeK0AM2T0g4q6Ptf0shFF+oQZyiA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/fetch-http-handler": "^5.4.5", + "@smithy/signature-v4": "^5.4.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.13.tgz", + "integrity": "sha512-2pA6eyb5nSo/ZD2cayhOTEMoGQYgspq0RI05GDLkzQ3ajZ6isS6waV6E92Am/hz4LIlLUTrbwPLurJ/fuiHvkg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.15", + "@aws-sdk/signature-v4-multi-region": "^3.996.30", + "@aws-sdk/types": "^3.973.9", + "@smithy/core": "^3.24.5", + "@smithy/fetch-http-handler": "^5.4.5", + "@smithy/node-http-handler": "^4.7.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.5.tgz", + "integrity": "sha512-3dA9TQ+ybRSZ/m0wnbZhiBy4Dezjgq1Ib/ZZrYTpJDBgpoLLU/SDzZc/g0x0MNAdOJe1wPcM+x2PBRmoOur+Sw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.30", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.30.tgz", + "integrity": "sha512-HULDLMVzkmTSEv6//7kx2kRevp/VYUpm8hJNNFbmhxDn0fUiGTxVcM9yg31TukvTq8nyOBDUN2gH0o5IRbKjdw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@smithy/signature-v4": "^5.4.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1048.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1048.0.tgz", + "integrity": "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.9.tgz", + "integrity": "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", + "integrity": "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.2", + "fast-xml-parser": "5.7.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@earendil-works/pi-ai": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.77.0.tgz", + "integrity": "sha512-H21BrQDPf3ydaeBmS5maNDHxUGFMiKBF/n3WnE+OTWloIZSayeL+/NVEgG3aKQw8fZL6HAMYAGpUIVJgFuKtnw==", + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "0.91.1", + "@aws-sdk/client-bedrock-runtime": "3.1048.0", + "@google/genai": "1.52.0", + "@mistralai/mistralai": "2.2.1", + "@smithy/node-http-handler": "4.7.3", + "http-proxy-agent": "7.0.2", + "https-proxy-agent": "7.0.6", + "openai": "6.26.0", + "partial-json": "0.1.7", + "typebox": "1.1.38" + }, + "bin": { + "pi-ai": "dist/cli.js" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@google/genai": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", + "integrity": "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.3.0", + "p-retry": "^4.6.2", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@mistralai/mistralai": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", + "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==", + "license": "Apache-2.0", + "dependencies": { + "ws": "^8.18.0", + "zod": "^3.25.0 || ^4.0.0", + "zod-to-json-schema": "^3.25.0" + } + }, + "node_modules/@nodable/entities": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", + "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, + "node_modules/@smithy/core": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.5.tgz", + "integrity": "sha512-Kt8phUg45M15EjhYAbZ+fFikYneijLu9Liugz8ZsYz2i8j0hzGv27LWKpEHYRfvj+LyCOSijpcR/2i8RouV+cA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.5.tgz", + "integrity": "sha512-yiF8xHpdkaTfzLVqFzsP6WvNghEK+qZzLYWFD13L2SsFhbXwBGlxdocKF95qjr7s5lE5NRage+EJFK4mAsx88Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.5.tgz", + "integrity": "sha512-SK3VMeH0fibgdTg2QeB+O4p7Yy/2E5HBOHJeC58FshkDdeuX8lOgO7PfjYfLyPLP1ch55j91cQqKBzDS0mRjSQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.3.tgz", + "integrity": "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.5.tgz", + "integrity": "sha512-QBJKWGqIknH0dc9LWpfH1mkdokAx6iXYN3UcQ3eY6uIEyScuoQAhfl94ge7ozUy9WgFUdE8xsvwBjaYBbWmPNA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.2.tgz", + "integrity": "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/@types/node": { "version": "20.19.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-auth-library": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", + "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/openai": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.26.0.tgz", + "integrity": "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/partial-json": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", + "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", + "license": "MIT" + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz", + "integrity": "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typebox": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.38.tgz", + "integrity": "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -43,8 +1257,70 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } } } } diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json index 04d9059a..14c485d2 100644 --- a/integrations/pi-villani/package.json +++ b/integrations/pi-villani/package.json @@ -7,13 +7,18 @@ "types": "dist/index.d.ts", "scripts": { "build": "tsc -p tsconfig.json", - "typecheck": "tsc -p tsconfig.json --noEmit" + "typecheck": "tsc -p tsconfig.json --noEmit", + "test": "npm run build && node --test dist/modelProxy.test.js" }, "devDependencies": { "@types/node": "^20.11.30", "typescript": "^5.4.0" }, "engines": { - "node": ">=18" - } + "node": ">=22.19.0" + }, + "dependencies": { + "@earendil-works/pi-ai": "^0.77.0" + }, + "type": "module" } diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index 459a9155..08349839 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -1,34 +1,66 @@ import { randomUUID } from "node:crypto"; -import { BridgeEvent, RunCommand, VillaniMode } from "./protocol"; -import { VillaniBridgeProcess } from "./process"; -import { PiLikeOutput, renderEvent } from "./render"; +import type { Model } from "@earendil-works/pi-ai"; +import { BridgeEvent, RunCommand, VillaniMode } from "./protocol.js"; +import { VillaniBridgeProcess } from "./process.js"; +import { PiModelProxy } from "./modelProxy.js"; +import { PiLikeOutput, renderEvent } from "./render.js"; -interface PiLikeContext { - commands?: { registerCommand?: (name: string, handler: (args?: unknown) => unknown) => { dispose?: () => void } | void }; +interface PiUI { + notify?: (message: string, level?: "info" | "warn" | "error") => void; + setStatus?: (key: string, message: string) => void; + setWidget?: (key: string, lines: string[]) => void; +} + +interface PiLikeCommandContext { + cwd?: string; + model?: Model; + signal?: AbortSignal; + ui?: PiUI; workspace?: { cwd?: string; rootPath?: string; folders?: Array<{ path?: string; uri?: { fsPath?: string } }> }; +} + +interface PiLikeAPI { + registerCommand?: ( + name: string, + options: { description: string; handler: (args?: string, ctx?: PiLikeCommandContext) => unknown } | ((args?: unknown, ctx?: PiLikeCommandContext) => unknown), + ) => { dispose?: () => void } | void; +} + +interface LegacyPiLikeContext extends PiLikeCommandContext { + commands?: { registerCommand?: PiLikeAPI["registerCommand"] }; output?: PiLikeOutput; subscriptions?: Array<{ dispose?: () => void }>; } -export function activate(context: PiLikeContext): void { - const registrar = context.commands?.registerCommand; +export default function villaniPiExtension(pi: PiLikeAPI): void { + activate(pi as LegacyPiLikeContext); +} + +export function activate(context: LegacyPiLikeContext | PiLikeAPI): void { + const registrar = ("commands" in context ? context.commands?.registerCommand : undefined) ?? (context as PiLikeAPI).registerCommand; if (!registrar) { throw new Error("Pi command registration API was not found; update src/index.ts for the installed Pi SDK."); } - const disposable = registrar("villani", async (args?: unknown) => runVillaniCommand(context, args)); - if (disposable && context.subscriptions) context.subscriptions.push(disposable); + const disposable = registrar("villani", { + description: "Delegate a coding task to Villani Code", + handler: async (args?: string, commandContext?: PiLikeCommandContext) => runVillaniCommand({ ...(context as LegacyPiLikeContext), ...commandContext }, args), + }); + if (disposable && "subscriptions" in context && context.subscriptions) context.subscriptions.push(disposable); } export function deactivate(): void { - // Nothing persistent to clean up; per-run bridge processes are killed in finally blocks. + // Nothing persistent to clean up; per-run bridge/proxy processes are stopped in finally blocks. } -export async function runVillaniCommand(context: PiLikeContext, args?: unknown): Promise { +export async function runVillaniCommand(context: LegacyPiLikeContext, args?: unknown): Promise { const task = extractTask(args); - const output = context.output ?? console; + const output = context.output ?? uiOutput(context.ui) ?? console; if (!task) throw new Error("Usage: /villani "); const repo = resolveWorkspace(context); const runId = randomUUID(); + const explicitConfig = hasExplicitVillaniModelConfig(); + const proxy = !explicitConfig && context.model ? new PiModelProxy({ model: context.model, signal: context.signal }) : undefined; + const proxyUrl = proxy ? await proxy.start() : undefined; const bridge = new VillaniBridgeProcess({ command: process.env.VILLANI_COMMAND || "villani", cwd: repo }); let finished = false; let resolveFinal!: () => void; @@ -41,6 +73,11 @@ export async function runVillaniCommand(context: PiLikeContext, args?: unknown): resolveFinal(); } }); + if (context.signal) { + context.signal.addEventListener("abort", () => { + try { bridge.abort(runId); } catch { /* ignore cancellation races */ } + }, { once: true }); + } await bridge.waitUntilReady(); const command: RunCommand = { type: "run", @@ -48,12 +85,7 @@ export async function runVillaniCommand(context: PiLikeContext, args?: unknown): task, repo, mode: (process.env.VILLANI_MODE as VillaniMode | undefined) || "runner", - config: { - provider: process.env.VILLANI_PROVIDER, - model: process.env.VILLANI_MODEL, - base_url: process.env.VILLANI_BASE_URL, - api_key: process.env.VILLANI_API_KEY, - }, + config: buildRunConfig(proxyUrl, context.model), }; bridge.send(command); await Promise.race([ @@ -67,9 +99,40 @@ export async function runVillaniCommand(context: PiLikeContext, args?: unknown): try { bridge.abort(runId); } catch { /* ignore cleanup send errors */ } } bridge.kill(); + await proxy?.stop(); } } +function buildRunConfig(proxyUrl: string | undefined, model: Model | undefined): RunCommand["config"] { + if (proxyUrl) { + return { + provider: "openai", + model: model?.id ?? "pi-current-model", + base_url: proxyUrl, + }; + } + return { + provider: process.env.VILLANI_PROVIDER, + model: process.env.VILLANI_MODEL, + base_url: process.env.VILLANI_BASE_URL, + api_key: process.env.VILLANI_API_KEY, + }; +} + +function hasExplicitVillaniModelConfig(): boolean { + return Boolean(process.env.VILLANI_PROVIDER || process.env.VILLANI_MODEL || process.env.VILLANI_BASE_URL || process.env.VILLANI_API_KEY); +} + +function uiOutput(ui: PiUI | undefined): PiLikeOutput | undefined { + if (!ui) return undefined; + return { + info: (message: string) => ui.notify?.(message, "info") ?? ui.setStatus?.("villani", message), + warn: (message: string) => ui.notify?.(message, "warn") ?? ui.setStatus?.("villani", message), + error: (message: string) => ui.notify?.(message, "error") ?? ui.setStatus?.("villani", message), + markdown: (message: string) => ui.setWidget?.("villani", message.split("\n")) ?? ui.notify?.(message, "info"), + }; +} + function extractTask(args: unknown): string { if (typeof args === "string") return args.trim(); if (args && typeof args === "object" && "text" in args) return String((args as { text?: unknown }).text ?? "").trim(); @@ -77,8 +140,7 @@ function extractTask(args: unknown): string { return ""; } -function resolveWorkspace(context: PiLikeContext): string { +function resolveWorkspace(context: LegacyPiLikeContext): string { const workspace = context.workspace; - return workspace?.cwd || workspace?.rootPath || workspace?.folders?.[0]?.path || workspace?.folders?.[0]?.uri?.fsPath || process.cwd(); + return context.cwd || workspace?.cwd || workspace?.rootPath || workspace?.folders?.[0]?.path || workspace?.folders?.[0]?.uri?.fsPath || process.cwd(); } - diff --git a/integrations/pi-villani/src/modelProxy.test.ts b/integrations/pi-villani/src/modelProxy.test.ts new file mode 100644 index 00000000..05aa8155 --- /dev/null +++ b/integrations/pi-villani/src/modelProxy.test.ts @@ -0,0 +1,97 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import type { AssistantMessage } from "@earendil-works/pi-ai"; +import { openAIChatToPiContext, piAssistantToOpenAIResponse } from "./modelProxy.js"; + +test("translates OpenAI chat payloads to Pi context", () => { + const context = openAIChatToPiContext({ + model: "villani-proxy", + messages: [ + { role: "system", content: "system one" }, + { role: "user", content: "hello" }, + { + role: "assistant", + content: "using tool", + tool_calls: [{ id: "call-1", type: "function", function: { name: "Read", arguments: "{\"path\":\"src/foo.py\"}" } }], + }, + { role: "tool", tool_call_id: "call-1", name: "Read", content: "file contents" }, + ], + tools: [{ type: "function", function: { name: "Read", description: "Read file", parameters: { type: "object" } } }], + }); + + assert.equal(context.systemPrompt, "system one"); + assert.equal(context.messages.length, 3); + assert.equal(context.messages[0].role, "user"); + assert.equal(context.messages[1].role, "assistant"); + assert.equal(context.messages[2].role, "toolResult"); + assert.equal(context.tools?.[0].name, "Read"); +}); + +test("translates Pi assistant tool calls to OpenAI response", () => { + const message: AssistantMessage = { + role: "assistant", + api: "openai-completions", + provider: "pi", + model: "m", + content: [ + { type: "text", text: "I'll inspect it." }, + { type: "toolCall", id: "call-2", name: "Read", arguments: { path: "src/foo.py" } }, + ], + usage: { input: 3, output: 4, cacheRead: 0, cacheWrite: 0, totalTokens: 7, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "toolUse", + timestamp: 1700000000000, + }; + + const response = piAssistantToOpenAIResponse(message); + const choice = (response.choices as Array)[0]; + assert.equal(choice.finish_reason, "tool_calls"); + assert.equal(choice.message.content, "I'll inspect it."); + assert.equal(choice.message.tool_calls[0].function.name, "Read"); + assert.equal(choice.message.tool_calls[0].function.arguments, '{"path":"src/foo.py"}'); + assert.deepEqual(response.usage, { prompt_tokens: 3, completion_tokens: 4, total_tokens: 7 }); +}); + +import type { Model } from "@earendil-works/pi-ai"; +import { PiModelProxy } from "./modelProxy.js"; + +test("proxy serves minimal OpenAI chat completions without credentials", async () => { + const model = { + id: "pi-test", + name: "Pi Test", + api: "openai-completions", + provider: "pi", + baseUrl: "pi://current", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 4096, + } as Model; + const proxy = new PiModelProxy({ + model, + completeFn: async (_model, context) => ({ + role: "assistant", + api: "openai-completions", + provider: "pi", + model: "pi-test", + content: [{ type: "text", text: `saw ${context.messages.length} message` }], + usage: { input: 1, output: 2, cacheRead: 0, cacheWrite: 0, totalTokens: 3, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "stop", + timestamp: 1700000000000, + }), + }); + const url = await proxy.start(); + try { + assert.match(url, /^http:\/\/127\.0\.0\.1:\d+$/); + const response = await fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", messages: [{ role: "user", content: "hello" }] }), + }); + assert.equal(response.status, 200); + const body = await response.json() as any; + assert.equal(body.choices[0].message.content, "saw 1 message"); + } finally { + await proxy.stop(); + } +}); diff --git a/integrations/pi-villani/src/modelProxy.ts b/integrations/pi-villani/src/modelProxy.ts new file mode 100644 index 00000000..c26f3920 --- /dev/null +++ b/integrations/pi-villani/src/modelProxy.ts @@ -0,0 +1,251 @@ +import { createServer, IncomingMessage, Server, ServerResponse } from "node:http"; +import { AddressInfo } from "node:net"; +import { complete } from "@earendil-works/pi-ai"; +import type { AssistantMessage, Context, Message, Model, ProviderStreamOptions, Tool, Usage } from "@earendil-works/pi-ai"; + +export interface OpenAIMessage { + role: "system" | "user" | "assistant" | "tool"; + content?: string | null; + tool_call_id?: string; + name?: string; + tool_calls?: Array<{ + id?: string; + type?: "function"; + function?: { name?: string; arguments?: string }; + }>; +} + +export interface OpenAIChatCompletionRequest { + model?: string; + messages?: OpenAIMessage[]; + tools?: Array<{ + type?: "function"; + function?: { name?: string; description?: string; parameters?: Record }; + }>; + max_tokens?: number; + temperature?: number; + stream?: boolean; +} + +export type PiCompleteFunction = (model: Model, context: Context, options?: ProviderStreamOptions) => Promise; + +export interface PiModelProxyOptions { + model: Model; + signal?: AbortSignal; + timeoutMs?: number; + completeFn?: PiCompleteFunction; +} + +export class PiModelProxy { + private server?: Server; + private url?: string; + + constructor(private readonly options: PiModelProxyOptions) {} + + async start(): Promise { + if (this.url) return this.url; + this.server = createServer((req, res) => { + void this.handle(req, res); + }); + await new Promise((resolve, reject) => { + this.server?.once("error", reject); + this.server?.listen(0, "127.0.0.1", () => resolve()); + }); + const address = this.server.address() as AddressInfo; + this.url = `http://127.0.0.1:${address.port}`; + return this.url; + } + + async stop(): Promise { + const server = this.server; + this.server = undefined; + this.url = undefined; + if (!server) return; + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); + } + + private async handle(req: IncomingMessage, res: ServerResponse): Promise { + try { + if (req.method !== "POST" || !req.url?.startsWith("/v1/chat/completions")) { + writeJson(res, 404, { error: { message: "Pi Villani proxy only supports POST /v1/chat/completions" } }); + return; + } + const payload = JSON.parse(await readBody(req)) as OpenAIChatCompletionRequest; + const context = openAIChatToPiContext(payload); + const completeFn = this.options.completeFn ?? complete; + const assistant = await completeFn(this.options.model, context, { + maxTokens: payload.max_tokens, + temperature: payload.temperature, + signal: this.options.signal, + timeoutMs: this.options.timeoutMs, + }); + if (payload.stream) { + writeOpenAIStream(res, assistant); + } else { + writeJson(res, 200, piAssistantToOpenAIResponse(assistant)); + } + } catch (error) { + writeJson(res, 500, { error: { message: error instanceof Error ? error.message : String(error) } }); + } + } +} + +export function openAIChatToPiContext(request: OpenAIChatCompletionRequest): Context { + const messages = request.messages ?? []; + const systemPrompt = messages + .filter((message) => message.role === "system" && message.content) + .map((message) => String(message.content)) + .join("\n\n") || undefined; + const converted: Message[] = []; + for (const message of messages) { + if (message.role === "system") continue; + const timestamp = Date.now(); + if (message.role === "user") { + converted.push({ role: "user", content: String(message.content ?? ""), timestamp }); + continue; + } + if (message.role === "tool") { + converted.push({ + role: "toolResult", + toolCallId: String(message.tool_call_id ?? ""), + toolName: String(message.name ?? ""), + content: [{ type: "text", text: String(message.content ?? "") }], + isError: false, + timestamp, + }); + continue; + } + if (message.role === "assistant") { + const content: AssistantMessage["content"] = []; + if (message.content) content.push({ type: "text", text: String(message.content) }); + for (const toolCall of message.tool_calls ?? []) { + const fn = toolCall.function ?? {}; + content.push({ + type: "toolCall", + id: String(toolCall.id ?? `tool-${content.length}`), + name: String(fn.name ?? ""), + arguments: parseArguments(fn.arguments), + }); + } + converted.push({ + role: "assistant", + content, + api: "openai-completions", + provider: "pi", + model: String(request.model ?? "pi"), + usage: zeroUsage(), + stopReason: content.some((block) => block.type === "toolCall") ? "toolUse" : "stop", + timestamp, + }); + } + } + const tools: Tool[] = (request.tools ?? []) + .filter((tool) => tool.type === "function" && tool.function?.name) + .map((tool) => ({ + name: String(tool.function?.name ?? ""), + description: String(tool.function?.description ?? ""), + parameters: (tool.function?.parameters ?? { type: "object", properties: {} }) as Tool["parameters"], + })); + return { systemPrompt, messages: converted, ...(tools.length ? { tools } : {}) }; +} + +export function piAssistantToOpenAIResponse(message: AssistantMessage): Record { + const text = message.content + .filter((block) => block.type === "text") + .map((block) => block.text) + .join("\n\n"); + const toolCalls = message.content + .filter((block) => block.type === "toolCall") + .map((block, index) => ({ + id: block.id || `call_${index}`, + type: "function", + function: { name: block.name, arguments: JSON.stringify(block.arguments ?? {}) }, + })); + return { + id: message.responseId ?? `pi-villani-${message.timestamp}`, + object: "chat.completion", + created: Math.floor(message.timestamp / 1000), + model: message.responseModel ?? message.model, + choices: [ + { + index: 0, + message: { + role: "assistant", + content: text || null, + ...(toolCalls.length ? { tool_calls: toolCalls } : {}), + }, + finish_reason: toOpenAIFinishReason(message.stopReason), + }, + ], + usage: toOpenAIUsage(message.usage), + }; +} + +function writeOpenAIStream(res: ServerResponse, message: AssistantMessage): void { + const response = piAssistantToOpenAIResponse(message); + const choice = (response.choices as Array>)[0]; + const fullMessage = choice.message as Record; + res.writeHead(200, { + "content-type": "text/event-stream; charset=utf-8", + "cache-control": "no-cache", + connection: "keep-alive", + }); + res.write(`data: ${JSON.stringify({ + id: response.id, + object: "chat.completion.chunk", + created: response.created, + model: response.model, + choices: [{ index: 0, delta: fullMessage, finish_reason: choice.finish_reason }], + usage: response.usage, + })}\n\n`); + res.write("data: [DONE]\n\n"); + res.end(); +} + +function toOpenAIFinishReason(reason: AssistantMessage["stopReason"]): string { + if (reason === "toolUse") return "tool_calls"; + if (reason === "length") return "length"; + return "stop"; +} + +function toOpenAIUsage(usage: Usage): Record { + return { + prompt_tokens: usage.input, + completion_tokens: usage.output, + total_tokens: usage.totalTokens || usage.input + usage.output, + }; +} + +function zeroUsage(): Usage { + return { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 0, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, + }; +} + +function parseArguments(value: unknown): Record { + if (typeof value !== "string") return {}; + try { + const parsed = JSON.parse(value) as unknown; + return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed as Record : {}; + } catch { + return {}; + } +} + +async function readBody(req: IncomingMessage): Promise { + const chunks: Buffer[] = []; + for await (const chunk of req) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); + return Buffer.concat(chunks).toString("utf8"); +} + +function writeJson(res: ServerResponse, status: number, body: unknown): void { + res.writeHead(status, { "content-type": "application/json; charset=utf-8" }); + res.end(JSON.stringify(body)); +} diff --git a/integrations/pi-villani/src/process.ts b/integrations/pi-villani/src/process.ts index a0eb52d4..14e1885c 100644 --- a/integrations/pi-villani/src/process.ts +++ b/integrations/pi-villani/src/process.ts @@ -1,6 +1,6 @@ import { ChildProcessWithoutNullStreams, spawn } from "node:child_process"; import { createInterface } from "node:readline"; -import { AbortCommand, BridgeCommand, BridgeEvent, commandToLine } from "./protocol"; +import { AbortCommand, BridgeCommand, BridgeEvent, commandToLine } from "./protocol.js"; export interface BridgeProcessOptions { command: string; diff --git a/integrations/pi-villani/src/render.ts b/integrations/pi-villani/src/render.ts index 25ddc528..2b750236 100644 --- a/integrations/pi-villani/src/render.ts +++ b/integrations/pi-villani/src/render.ts @@ -1,4 +1,4 @@ -import { BridgeEvent } from "./protocol"; +import { BridgeEvent } from "./protocol.js"; export interface PiLikeOutput { info?: (message: string) => void; diff --git a/integrations/pi-villani/tsconfig.json b/integrations/pi-villani/tsconfig.json index a31f3be2..789063c8 100644 --- a/integrations/pi-villani/tsconfig.json +++ b/integrations/pi-villani/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "target": "ES2022", - "module": "CommonJS", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "strict": true, "esModuleInterop": true, "skipLibCheck": true, @@ -10,5 +10,7 @@ "outDir": "dist", "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": [ + "src/**/*.ts" + ] } From 12b77796e01e4b4cc371934c870cfe2cf063b50f Mon Sep 17 00:00:00 2001 From: mmprotest Date: Fri, 29 May 2026 15:01:34 +1000 Subject: [PATCH 05/37] Harden Pi integration for real use --- integrations/pi-villani/README.md | 151 +- .../pi-villani/docs/pi-model-bridge.md | 54 +- integrations/pi-villani/package-lock.json | 2195 ++++++++++++++++- integrations/pi-villani/package.json | 30 +- integrations/pi-villani/src/extension.test.ts | 104 + integrations/pi-villani/src/index.ts | 174 +- .../pi-villani/src/modelProxy.test.ts | 44 + integrations/pi-villani/src/process.test.ts | 44 + integrations/pi-villani/src/process.ts | 169 +- integrations/pi-villani/src/protocol.ts | 6 +- integrations/pi-villani/src/render.ts | 9 +- tests/integrations/test_pi_bridge.py | 123 + villani_code/integrations/pi_bridge.py | 71 +- 13 files changed, 2889 insertions(+), 285 deletions(-) create mode 100644 integrations/pi-villani/src/extension.test.ts create mode 100644 integrations/pi-villani/src/process.test.ts diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index 059163cd..a44c4402 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -1,99 +1,142 @@ # Pi Villani Integration -This package is a thin Pi extension that lets Pi remain the chat UI/shell while Villani Code remains the autonomous coding runner. - -Pi command flow: +`pi-villani` adds Pi slash commands that delegate repository repair tasks to Villani Code. Pi remains the UI and model/auth host; Villani remains the runner that edits files and runs verification. ```text -/villani Fix the failing tests and verify the repair +/villani Fix the failing authentication tests and run the relevant verification -> Pi extension - -> villani bridge --stdio subprocess in the current workspace - -> JSONL run command + -> temporary 127.0.0.1 OpenAI-compatible proxy backed by Pi's active model + -> villani-code bridge --stdio -> existing Villani Runner - -> normalized JSONL progress/final events back to Pi + -> normalized progress/final events rendered in Pi ``` -The extension does **not** reimplement Villani's runner logic and does not require Pi to understand Villani internals. +The extension does **not** port or duplicate Villani's runner logic in TypeScript. + +## Requirements + +- Node.js 22.19 or newer, matching the current Pi runtime packages. +- Villani Code installed in the Python environment visible to Pi. A standard install of this repository provides the `villani-code` executable. +- Pi with an active configured model, unless you opt into explicit Villani model configuration. -## Local installation from this checkout +## Installation + +Published package, once released: + +```bash +pi install npm:pi-villani +``` -Requires Node.js 22.19 or newer, matching the current `@earendil-works/pi-ai` runtime. +Development/local checkout: ```bash cd integrations/pi-villani npm install npm run build +pi install ./ ``` -Then load/register the built extension with your Pi extension development workflow. The exact Pi SDK packaging API is still isolated behind `src/index.ts`; if your installed Pi SDK exposes a different command registration method, adapt only that file. - -## Required Villani installation - -The extension launches: +For one-off testing without installing permanently, Pi supports loading a local package/extension for the current run: ```bash -villani bridge --stdio +pi -e ./integrations/pi-villani/dist/index.js ``` -Set `VILLANI_COMMAND` if your executable name is different, for example this repository currently exposes the console script as `villani-code` and module execution works as `python -m villani_code.cli`: +## Usage -```bash -export VILLANI_COMMAND="villani-code" -# or -export VILLANI_COMMAND="python -m villani_code.cli" +```text +/villani Fix the failing authentication tests and run the relevant verification +/villani-abort ``` -## Configuration +Only one Villani run is allowed per Pi extension instance at a time. If a run is active, a second `/villani` command is rejected with a message telling you to wait or run `/villani-abort`. -By default, the extension reuses Pi's currently configured model through a temporary local proxy. You do not need to set `VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, or `VILLANI_API_KEY` for the normal Pi-backed path. +## Defaults and configuration -Optional fallback environment variables: +Default behavior: + +- `VILLANI_COMMAND` defaults to `villani-code`. +- `VILLANI_MODE` defaults to `runner`, which maps to normal `Runner.run(task)` execution. +- `VILLANI_MODE=villani` maps to the repository's autonomous `Runner.run_villani_mode()` path. +- Pi model reuse is enabled by default. The extension starts a temporary local proxy and passes that proxy URL to Villani as an OpenAI-compatible `base_url`. +- No Pi provider credentials or API keys are passed to the Villani subprocess in the Pi-model path. + +Optional environment variables: + +| Variable | Meaning | +| --- | --- | +| `VILLANI_COMMAND` | Override the Villani executable. Defaults to `villani-code`. | +| `VILLANI_MODE` | `runner` or `villani`. Defaults to `runner`. | +| `VILLANI_USE_PI_MODEL` | Set to `false` to disable Pi-backed model reuse and use explicit Villani provider config. | +| `VILLANI_PROVIDER` | Explicit fallback provider (`openai` or `anthropic`) when `VILLANI_USE_PI_MODEL=false`. | +| `VILLANI_MODEL` | Explicit fallback model. | +| `VILLANI_BASE_URL` | Explicit fallback model endpoint. | +| `VILLANI_API_KEY` | Explicit fallback API key, if needed. | + +macOS/Linux example for explicit fallback: ```bash -export VILLANI_COMMAND="villani" -export VILLANI_MODE="runner" # runner or villani -export VILLANI_PROVIDER="openai" # openai or anthropic -export VILLANI_MODEL="your-model" -export VILLANI_BASE_URL="http://127.0.0.1:1234" -export VILLANI_API_KEY="dummy" +export VILLANI_USE_PI_MODEL=false +export VILLANI_COMMAND=villani-code +export VILLANI_PROVIDER=openai +export VILLANI_MODEL=your-model +export VILLANI_BASE_URL=http://127.0.0.1:1234 +export VILLANI_API_KEY=dummy ``` -If any of `VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, or `VILLANI_API_KEY` is set, the extension skips the Pi model proxy and sends the explicit config to Villani. This preserves local server/custom provider workflows. +Windows PowerShell example: -When no explicit model config is set, the extension starts a temporary `127.0.0.1:` OpenAI-compatible proxy for one `/villani` run, passes that `base_url` to Villani, and forwards requests to Pi's configured model via `@earendil-works/pi-ai`. No user provider credentials are exposed to the Villani subprocess in this mode. +```powershell +$env:VILLANI_USE_PI_MODEL = "false" +$env:VILLANI_COMMAND = "villani-code" +$env:VILLANI_PROVIDER = "openai" +$env:VILLANI_MODEL = "your-model" +$env:VILLANI_BASE_URL = "http://127.0.0.1:1234" +$env:VILLANI_API_KEY = "dummy" +``` -## Usage +## Final output -Inside Pi, from a workspace/repository: +Pi renders operational progress only: start, phases, tool/file activity, verification, governor redirects, failure and abort status. It does not render Villani prompts, hidden reasoning, raw JSON or full transcripts. + +Final output separates attribution: ```text -/villani Fix the failing auth tests and verify the repair -``` +Villani completed + +Summary: +Fixed failing auth tests. -The final Pi summary includes: +Changed by Villani: +- src/auth.py -- success, failure, or aborted status -- Villani's summary -- changed files reported from the repository working tree -- verification status when Villani exposes it -- transcript/run path when Villani writes one +Pre-existing workspace changes excluded from attribution: +- notes.txt + +Verification passed: true +Transcript: .villani_code/runs/... +``` -## Safety notes +## Safety -- The extension does not bypass Villani permissions or sandboxing. -- The extension launches a subprocess with `shell: false` for Windows-friendly argument handling. -- The Pi model proxy binds only to `127.0.0.1` and lives only for the current `/villani` run. -- The bridge emits operational telemetry only; it does not stream hidden reasoning, model prompts, or transcript contents. +- Villani operates in the current repository and may edit files and run verification commands through its normal permission/sandbox path. +- Pre-existing dirty files are reported separately from files changed by Villani. +- The Pi model proxy binds only to `127.0.0.1`, uses a random available port, and exists only for the active `/villani` run. +- Pi credentials stay in Pi; the Python child receives only a localhost proxy URL in the default path. +- Pi packages execute with normal user permissions. Review source before installing third-party packages. ## Limitations -- Cancellation is best-effort. The bridge sends `abort` and marks the run as aborted only after the current Villani runner call stops; the core runner does not yet expose a universal cooperative cancellation token. -- Pi SDK typings are not vendored in this repository. The extension uses a small `PiLikeContext` shim so the bridge/process/rendering code stays compile-safe and the real Pi API adapter can remain small. -- Pi model/auth reuse currently supports Villani's OpenAI-compatible `/v1/chat/completions` path. Streaming is represented as one final SSE chunk rather than token-by-token streaming. See `docs/pi-model-bridge.md`. +- `/villani-abort` sends a bridge abort request and then force-kills the subprocess after a short timeout if the runner does not stop. In-flight model/tool calls may not be interruptible until the current Villani operation returns. +- The Pi proxy implements Villani's current OpenAI-compatible `/v1/chat/completions` path. It does not implement `/v1/messages` because the bridge points Villani at the proxy with `provider=openai`. +- Streaming is compatibility streaming: the proxy calls Pi via `complete()` and emits the final response as one OpenAI SSE chunk plus `[DONE]`, not token-by-token streaming. +- Non-git repositories use lower-confidence changed-file reporting based on Villani mutation events only. ## Troubleshooting -- **No ready event / timeout:** confirm `VILLANI_COMMAND` is on `PATH` and supports `bridge --stdio`. -- **Missing model/base URL:** normally Pi's active model supplies this through the proxy. If your Pi command context does not expose `ctx.model`, set `VILLANI_MODEL` and `VILLANI_BASE_URL` to use the explicit fallback. -- **Unexpected text on stdout:** stdout must be JSONL protocol only. Send debug logs to stderr. -- **Windows paths:** pass normal workspace paths; the bridge normalizes changed-file paths to forward slashes in events. +- **`villani-code` not found:** install Villani Code in the environment Pi uses, or set `VILLANI_COMMAND` to the full executable path. +- **Python environment mismatch:** run `villani-code bridge --stdio` in the same shell environment used to start Pi. +- **No Pi model available:** select/configure a Pi model, or set `VILLANI_USE_PI_MODEL=false` and provide explicit Villani provider variables. +- **Bridge readiness timeout:** run `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio` and confirm it prints `ready` then `pong`. +- **Proxy startup failure:** ensure no local security tool blocks binding to `127.0.0.1` on random ports. +- **Smoke test:** from this checkout, run `cd integrations/pi-villani && npm install && npm test`, then `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio`. diff --git a/integrations/pi-villani/docs/pi-model-bridge.md b/integrations/pi-villani/docs/pi-model-bridge.md index 1bae80ab..d7ce9b0b 100644 --- a/integrations/pi-villani/docs/pi-model-bridge.md +++ b/integrations/pi-villani/docs/pi-model-bridge.md @@ -1,36 +1,48 @@ # Pi-backed model bridge -Milestone 2 adds a temporary localhost proxy owned by the Pi extension so Villani can reuse Pi's currently configured model without receiving user provider credentials. +The Pi extension reuses Pi's active model by default through a temporary localhost OpenAI-compatible proxy. This avoids asking users to configure provider/model/base URL/API key twice. ```text -Villani Runner +Villani Runner OpenAIClient -> http://127.0.0.1:/v1/chat/completions -> pi-villani local proxy -> @earendil-works/pi-ai complete() -> user's configured Pi provider/model/auth ``` -## Current implementation +## Villani API surface implemented -- The proxy starts only for one `/villani` command and is stopped in the command cleanup path. -- It binds to `127.0.0.1` on a random available port. -- The extension passes `provider: "openai"`, the temporary `base_url`, and the active Pi model id to Villani. -- No `VILLANI_API_KEY` is passed when the proxy path is used. -- The proxy implements the minimal `/v1/chat/completions` surface Villani uses through `OpenAIClient`: - - `messages` - - `tools` / function tool definitions - - `max_tokens` - - `temperature` - - `stream` -- The proxy translates OpenAI chat messages/tool calls/tool results into Pi `Context`/`Tool` shapes, calls `complete()`, and translates the Pi assistant message back into an OpenAI-compatible response. -- Streaming is compatibility streaming: Pi is called via `complete()` first, then the final assistant message is emitted as a single SSE chunk. This preserves Villani's streaming client path without claiming token-by-token streaming. +Villani's `OpenAIClient` calls: -## Fallback behavior +- `POST /v1/chat/completions` +- payload fields: `model`, `messages`, `max_tokens`, `stream`, optional `tools`, optional `stream_options` +- OpenAI function tool calls and tool-result messages +- non-streaming JSON responses +- SSE streaming responses using `data: ...` lines followed by `data: [DONE]` -If any explicit Villani model environment variable is set (`VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL`, or `VILLANI_API_KEY`), the extension skips the Pi proxy and uses the explicit configuration exactly as before. This keeps local OpenAI-compatible servers and other custom Villani provider setups working. +The proxy implements exactly that path. It translates: -## Future improvements +- OpenAI `system` messages into Pi `systemPrompt` +- OpenAI user messages into Pi user messages +- OpenAI assistant tool calls into Pi `toolCall` content +- OpenAI tool messages into Pi `toolResult` messages +- OpenAI function tool definitions into Pi `Tool` definitions +- Pi text/tool-call assistant content back into OpenAI `message.content` and `message.tool_calls` -- Switch from `complete()` to true Pi token/event streaming if the active Pi provider exposes a stable stream suitable for OpenAI SSE translation. -- Add broader compatibility for `/v1/messages` only if Villani needs Anthropic-compatible direct proxying in a future client path. -- Surface proxy diagnostics in Pi's UI without logging request bodies or credentials. +## Runtime behavior + +- One proxy is started per active `/villani` run. +- The proxy binds to `127.0.0.1` only. +- The OS chooses a random available port. +- The proxy is stopped on success, failure, abort and subprocess startup failure. +- The Python child receives no Pi provider credentials. + +## Configuration precedence + +1. Default: use Pi's active model through the local proxy. +2. If `VILLANI_USE_PI_MODEL=false`, skip the proxy and use explicit `VILLANI_PROVIDER`, `VILLANI_MODEL`, `VILLANI_BASE_URL` and optional `VILLANI_API_KEY`. +3. If Pi has no active model and explicit fallback is not enabled, `/villani` fails with a configuration message rather than guessing. + +## Streaming limitation + +The current proxy uses `@earendil-works/pi-ai` `complete()` and emits the completed assistant response as a single OpenAI-compatible SSE chunk when Villani asks for streaming. This exercises Villani's streaming client path but does not provide token-by-token streaming. True token streaming can be added later by translating Pi `stream()` events to OpenAI SSE chunks. diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json index 71c12c66..36d715ed 100644 --- a/integrations/pi-villani/package-lock.json +++ b/integrations/pi-villani/package-lock.json @@ -7,21 +7,26 @@ "": { "name": "pi-villani", "version": "0.1.0", - "dependencies": { - "@earendil-works/pi-ai": "^0.77.0" - }, + "license": "MIT", "devDependencies": { + "@earendil-works/pi-ai": "^0.77.0", + "@earendil-works/pi-coding-agent": "^0.77.0", "@types/node": "^20.11.30", "typescript": "^5.4.0" }, "engines": { "node": ">=22.19.0" + }, + "peerDependencies": { + "@earendil-works/pi-ai": "*", + "@earendil-works/pi-coding-agent": "*" } }, "node_modules/@anthropic-ai/sdk": { "version": "0.91.1", "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==", + "dev": true, "license": "MIT", "dependencies": { "json-schema-to-ts": "^3.1.1" @@ -42,6 +47,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -56,6 +62,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", @@ -71,6 +78,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -85,6 +93,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -94,6 +103,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", @@ -105,6 +115,7 @@ "version": "3.1048.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1048.0.tgz", "integrity": "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -130,6 +141,7 @@ "version": "3.974.15", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.15.tgz", "integrity": "sha512-UpA0rTGW/tHGITcCqHisbuuEPraYg9GG+mWmXjY5+RxZBMLGe6aL9oe0ix50LztwAcPIkGZLH0yWdMIkCM10hw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.9", @@ -149,6 +161,7 @@ "version": "3.972.41", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.41.tgz", "integrity": "sha512-n1EbJ98yvPWWdHZZv8bRBMqqDQJrtgtxyJ4xLy2Uqrh25BCOZQ7nnS1CsFXvuH8r0b0KVHDZEGEH5FxmEMP8jg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -165,6 +178,7 @@ "version": "3.972.43", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.43.tgz", "integrity": "sha512-TT76RN1NkI9WoyZqCNxOw6/WBMF7pYOTJcXbMokNFU+euSG40Kaf/t/FhDACVZWP+43wEM6ZynIPIkzS1wR1iA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -183,6 +197,7 @@ "version": "4.7.5", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.5.tgz", "integrity": "sha512-3dA9TQ+ybRSZ/m0wnbZhiBy4Dezjgq1Ib/ZZrYTpJDBgpoLLU/SDzZc/g0x0MNAdOJe1wPcM+x2PBRmoOur+Sw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.24.5", @@ -197,6 +212,7 @@ "version": "3.972.45", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.45.tgz", "integrity": "sha512-sJe5ZWibO4s7RWjFQ8Zol76KxoJcIYyEZH1/wxQSBMSIAAxzaJ8cS/ITAaIHWUQvDKQdt18+cJAHKWB7n1Jmrg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -221,6 +237,7 @@ "version": "3.972.45", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.45.tgz", "integrity": "sha512-MZQv4SNjByk1iOKmrqmzcUF/uCB05wjvEHyXKxmGQTUANTIVayX6HPUF0bzkWLvtnkH7sAn9kUCfkXbSpj9sDA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -238,6 +255,7 @@ "version": "3.972.46", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.46.tgz", "integrity": "sha512-cS4w0jzDRb1jOlkiJS3y80OxddHzkky/MN9k3NYs5jganNKVLjF0lpvjlwS118oGMr3cdAfOlVdo8gLurTSE7w==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.41", @@ -260,6 +278,7 @@ "version": "3.972.41", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.41.tgz", "integrity": "sha512-7I/n1zkysouLOWvkEhjNEP4vMnD2v4kzzr3/3QBdrripEpn7ap1/I5DF3Hou1SUqkKWo1f3oPGMyFAA1FAMvsQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -276,6 +295,7 @@ "version": "3.972.45", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.45.tgz", "integrity": "sha512-oHgbz/eFD8IKiksqDsz9ZMU4A59BpQq4QwJedBnGD80ZqYcHPPHZBwjBnxLVkB7iRVVHWpDclR8yWdD2PkQIUA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -294,6 +314,7 @@ "version": "3.1056.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1056.0.tgz", "integrity": "sha512-81duvlltQlsfn5K+o8zILcystBRdbT1G2JJYVCML5NZHBz4CL/zf+sAemCtBh/uh6RQUMyInGeZLQ7/8igZhbA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -311,6 +332,7 @@ "version": "3.972.45", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.45.tgz", "integrity": "sha512-CDhzKdb2onv5bpnjn/acgdNmJOQthPDLsPizU7rZflsEcgMMp8Mlri+U5hdxf8ldvZJpvM3vLU6D56vfJm5AMQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -328,6 +350,7 @@ "version": "3.972.18", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.18.tgz", "integrity": "sha512-QPQhwY/fstR8fMZFWrsJRNoTP6D1RjRPHGRX7u9/VkF3opCsvD0oXPz6qzkX94SchzvuS5vyFZbJbPcMEs2Jeg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.9", @@ -343,6 +366,7 @@ "version": "3.972.14", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.14.tgz", "integrity": "sha512-DoZ4djVj/74XQ6M/IwxuKh543tTvLCL7u1Dx+VDHMgW9yGNrFSJJ1l0LrUQRaekic5CB12wUiiOoHL0VI6H0gg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.9", @@ -358,6 +382,7 @@ "version": "3.972.23", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.23.tgz", "integrity": "sha512-F0d4A9pJFiwljyKgSwU1Z5n+CXSv8bp+V5SthbS2rftB8wBN9z1K2Yyv3xbeK0AM2T0g4q6Ptf0shFF+oQZyiA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.15", @@ -376,6 +401,7 @@ "version": "3.997.13", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.13.tgz", "integrity": "sha512-2pA6eyb5nSo/ZD2cayhOTEMoGQYgspq0RI05GDLkzQ3ajZ6isS6waV6E92Am/hz4LIlLUTrbwPLurJ/fuiHvkg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -397,6 +423,7 @@ "version": "4.7.5", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.5.tgz", "integrity": "sha512-3dA9TQ+ybRSZ/m0wnbZhiBy4Dezjgq1Ib/ZZrYTpJDBgpoLLU/SDzZc/g0x0MNAdOJe1wPcM+x2PBRmoOur+Sw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.24.5", @@ -407,123 +434,2054 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.30", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.30.tgz", - "integrity": "sha512-HULDLMVzkmTSEv6//7kx2kRevp/VYUpm8hJNNFbmhxDn0fUiGTxVcM9yg31TukvTq8nyOBDUN2gH0o5IRbKjdw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.30", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.30.tgz", + "integrity": "sha512-HULDLMVzkmTSEv6//7kx2kRevp/VYUpm8hJNNFbmhxDn0fUiGTxVcM9yg31TukvTq8nyOBDUN2gH0o5IRbKjdw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.9", + "@smithy/signature-v4": "^5.4.5", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1048.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1048.0.tgz", + "integrity": "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.9.tgz", + "integrity": "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", + "integrity": "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.2", + "fast-xml-parser": "5.7.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@earendil-works/pi-ai": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.77.0.tgz", + "integrity": "sha512-H21BrQDPf3ydaeBmS5maNDHxUGFMiKBF/n3WnE+OTWloIZSayeL+/NVEgG3aKQw8fZL6HAMYAGpUIVJgFuKtnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "0.91.1", + "@aws-sdk/client-bedrock-runtime": "3.1048.0", + "@google/genai": "1.52.0", + "@mistralai/mistralai": "2.2.1", + "@smithy/node-http-handler": "4.7.3", + "http-proxy-agent": "7.0.2", + "https-proxy-agent": "7.0.6", + "openai": "6.26.0", + "partial-json": "0.1.7", + "typebox": "1.1.38" + }, + "bin": { + "pi-ai": "dist/cli.js" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-coding-agent/-/pi-coding-agent-0.77.0.tgz", + "integrity": "sha512-huS+k+dhQRR9PlTK7crLfeSRUw3a96V6JYfP0ZH3Zkko/m10gsYk8dKQmwScSy5Dll516pXorz19BURfD6S2qQ==", + "dev": true, + "hasShrinkwrap": true, + "license": "MIT", + "dependencies": { + "@earendil-works/pi-agent-core": "^0.77.0", + "@earendil-works/pi-ai": "^0.77.0", + "@earendil-works/pi-tui": "^0.77.0", + "@silvia-odwyer/photon-node": "0.3.4", + "chalk": "5.6.2", + "cross-spawn": "7.0.6", + "diff": "8.0.4", + "glob": "13.0.6", + "highlight.js": "10.7.3", + "hosted-git-info": "9.0.3", + "ignore": "7.0.5", + "jiti": "2.7.0", + "minimatch": "10.2.5", + "proper-lockfile": "4.1.2", + "typebox": "1.1.38", + "undici": "8.3.0", + "yaml": "2.9.0" + }, + "bin": { + "pi": "dist/cli.js" + }, + "engines": { + "node": ">=22.19.0" + }, + "optionalDependencies": { + "@mariozechner/clipboard": "0.3.9" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@anthropic-ai/sdk": { + "version": "0.91.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", + "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "^3.1.1" + }, + "bin": { + "anthropic-ai-sdk": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/client-bedrock-runtime": { + "version": "3.1048.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1048.0.tgz", + "integrity": "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/credential-provider-node": "^3.972.42", + "@aws-sdk/eventstream-handler-node": "^3.972.16", + "@aws-sdk/middleware-eventstream": "^3.972.12", + "@aws-sdk/middleware-websocket": "^3.972.19", + "@aws-sdk/token-providers": "3.1048.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/fetch-http-handler": "^5.4.2", + "@smithy/node-http-handler": "^4.7.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/core": { + "version": "3.974.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.11.tgz", + "integrity": "sha512-QpnINq5FZH6EOaDEkmHdT7eUunbvD27pDNQypaWjFyYz7Zl1q3UCMQErBZxpmfGfI7MvI2TlK8KTkgNpv8b1ug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/xml-builder": "^3.972.24", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/core": "^3.24.2", + "@smithy/signature-v4": "^5.4.2", + "@smithy/types": "^4.14.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.37.tgz", + "integrity": "sha512-/jpPvEh6f7ntmIzf7dNxoNX6Q8vt8UpesCjbW6mFfk4V1NW6bIy9qxcQ6WbA8As5yQhsZOe+xeNd4xHX8kdY2Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.39.tgz", + "integrity": "sha512-pIgTpisWyWg7X1bUbzSjuUYosYTD0Ghz2M0hkSTmb3a6i3qV3uU+NYJPI/E2XSC0HcsZh5rsLPzeXrkb2DS0Cg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/fetch-http-handler": "^5.4.2", + "@smithy/node-http-handler": "^4.7.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.41.tgz", + "integrity": "sha512-u2tyjaxJJzW8UtW4SM1ZcPMDwO6y+kV+llvou+Adts0FAKyzes5jG4izQN+KX3yE8ZROpS5y1LJ//xL2iSf76w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/credential-provider-env": "^3.972.37", + "@aws-sdk/credential-provider-http": "^3.972.39", + "@aws-sdk/credential-provider-login": "^3.972.41", + "@aws-sdk/credential-provider-process": "^3.972.37", + "@aws-sdk/credential-provider-sso": "^3.972.41", + "@aws-sdk/credential-provider-web-identity": "^3.972.41", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/credential-provider-imds": "^4.3.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.41.tgz", + "integrity": "sha512-0LBitxXiAiaE5nlFPfpNIww/8FRY/I7WIndWsc9GmNFOM7cE1wNpVNQEGEk9Outg5l8xl+3vybxFyUy4l9q/LQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.42", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.42.tgz", + "integrity": "sha512-D4oon2zbqqsWOJUM99Gm3/ZyJ0IJvTXVN3PyloGb3kQEyI36fjCZheZj422lAgTWWd6TSHgiImLt3RIaLdv3dQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.37", + "@aws-sdk/credential-provider-http": "^3.972.39", + "@aws-sdk/credential-provider-ini": "^3.972.41", + "@aws-sdk/credential-provider-process": "^3.972.37", + "@aws-sdk/credential-provider-sso": "^3.972.41", + "@aws-sdk/credential-provider-web-identity": "^3.972.41", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/credential-provider-imds": "^4.3.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.37.tgz", + "integrity": "sha512-7nVaHBUaWIddASYfVaA9O4D5ZVjewU3sCol9WqZPGfW0nR+0WqE0xHZnD/U2L33PlOB8KNXGKZ6wOES/QijKzg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.41.tgz", + "integrity": "sha512-IOWAWEHe5LkjSKkkUUX9ciV6Y1scHTsnfEkdt5yyC4Slrc7AGbkLPrpntjqh18ksJAMOaVhoBsO8p2WyTcY2wQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/token-providers": "3.1048.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.41.tgz", + "integrity": "sha512-mbACk9Yypa8nm4iGZLs0PofOXEcTDOUw6wDnsPXNDNSd2WNXs1tSo+6nc/fh0jLYdfVZThhBL98PHW4aXFsG5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/eventstream-handler-node": { + "version": "3.972.16", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.16.tgz", + "integrity": "sha512-yedpPgKftqjU5SlPFHfqWpOw6xSCRieWRG1euWOlXn4WJxt2VX92VprCa2PpSOXjVCAeK6dTjW9eJRXVig9yGA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/middleware-eventstream": { + "version": "3.972.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.12.tgz", + "integrity": "sha512-tHTHHCHNrq6XklQvlzHBDJG4Iuhh7NVPRdtmvP+nHFA+5sxPlIDzlAHHgfoYHGvT3NXP1yVP/L5c3opUn6T3Qg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/middleware-websocket": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.972.19.tgz", + "integrity": "sha512-mkEhOGYozqKQkbFaVrjwr0faiwwZza1v5/jSY6Tucm3bD+uKTazIUH/4Yo6aMnQD2ua2W9cMP6s8mvwTcjtqHw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/fetch-http-handler": "^5.4.2", + "@smithy/signature-v4": "^5.4.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/nested-clients": { + "version": "3.997.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.9.tgz", + "integrity": "sha512-jPR3rnmRI4hWYyzfmTGBr7NblMp8QYYeflHXba1H6+7CGrWVqWKQzaXFQ4qbExqPRsXN3T3L3JxFhr6aouXUGQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/signature-v4-multi-region": "^3.996.27", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/fetch-http-handler": "^5.4.2", + "@smithy/node-http-handler": "^4.7.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.27.tgz", + "integrity": "sha512-0Phbz4t6HI3D3skxvG2uI+VWU034/nSIw1T8d+FPzzQG9EQTrw94o9mOKO2Gv3n3Oc8P7JD7RAUxkoneLWv5Eg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/signature-v4": "^5.4.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/token-providers": { + "version": "3.1048.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1048.0.tgz", + "integrity": "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.11", + "@aws-sdk/nested-clients": "^3.997.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.24", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.24.tgz", + "integrity": "sha512-V8z5YcDPfsvzrBlj0xR1vhRtocblhYbqdreCJB/voGd4Sr5zjNAeWxexbnqVtskTJe0vFb5KMqbSL++ePl+zRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@nodable/entities": "2.1.0", + "@smithy/types": "^4.14.1", + "fast-xml-parser": "5.7.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@earendil-works/pi-agent-core": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.77.0.tgz", + "dev": true, + "license": "MIT", + "dependencies": { + "@earendil-works/pi-ai": "^0.77.0", + "ignore": "7.0.5", + "typebox": "1.1.38", + "yaml": "2.9.0" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@earendil-works/pi-ai": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.77.0.tgz", + "dev": true, + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "0.91.1", + "@aws-sdk/client-bedrock-runtime": "3.1048.0", + "@google/genai": "1.52.0", + "@mistralai/mistralai": "2.2.1", + "@smithy/node-http-handler": "4.7.3", + "http-proxy-agent": "7.0.2", + "https-proxy-agent": "7.0.6", + "openai": "6.26.0", + "partial-json": "0.1.7", + "typebox": "1.1.38" + }, + "bin": { + "pi-ai": "dist/cli.js" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@earendil-works/pi-tui": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.77.0.tgz", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "1.6.0", + "marked": "15.0.12" + }, + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@google/genai": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", + "integrity": "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.3.0", + "p-retry": "^4.6.2", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard/-/clipboard-0.3.9.tgz", + "integrity": "sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@mariozechner/clipboard-darwin-arm64": "0.3.9", + "@mariozechner/clipboard-darwin-universal": "0.3.9", + "@mariozechner/clipboard-darwin-x64": "0.3.9", + "@mariozechner/clipboard-linux-arm64-gnu": "0.3.9", + "@mariozechner/clipboard-linux-arm64-musl": "0.3.9", + "@mariozechner/clipboard-linux-riscv64-gnu": "0.3.9", + "@mariozechner/clipboard-linux-x64-gnu": "0.3.9", + "@mariozechner/clipboard-linux-x64-musl": "0.3.9", + "@mariozechner/clipboard-win32-arm64-msvc": "0.3.9", + "@mariozechner/clipboard-win32-x64-msvc": "0.3.9" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-darwin-arm64": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-arm64/-/clipboard-darwin-arm64-0.3.9.tgz", + "integrity": "sha512-BfgV7vCEWZwJwZJw03r6bP5+tf0iI/ANuQYCxi9RNn7FrWB3yzGuMKCrNLRl6V761vXRdL8+OqZ0wd4TqlsNOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-darwin-universal": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-universal/-/clipboard-darwin-universal-0.3.9.tgz", + "integrity": "sha512-BGGR4iA9Z2shAjI65eI5xtyb3LYNlDW9X3gxKxDbqtbnREohsrqznov6zpKoIrsRWpzlYVEdKphS7ksJ0/ndSQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-darwin-x64": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-darwin-x64/-/clipboard-darwin-x64-0.3.9.tgz", + "integrity": "sha512-4kURmCbS6nt8uYhtmWpUcJWyPHfmAr5dTpXD1nO3pIfa+TSQ9DbrGOYCKH+aEFW47XhQ4Vp8ZTszie+wfFvDKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-linux-arm64-gnu": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-arm64-gnu/-/clipboard-linux-arm64-gnu-0.3.9.tgz", + "integrity": "sha512-g59OkUGP2DDfCOIKypHeYgv2M55u/cKvXa5dSxFbEJ34XvIQMdcVmpKCkGUro3ZgefXiGVdwguvTMQGpHWzIXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-linux-arm64-musl": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-arm64-musl/-/clipboard-linux-arm64-musl-0.3.9.tgz", + "integrity": "sha512-AGuJdgKsmJdm4Pych7kv3sqe591ERRaAHW3xjLooiFzn8J+PxUyof++7YZrB5Y5tpnTO+K18Og3taj2NpluCRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-linux-riscv64-gnu": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-riscv64-gnu/-/clipboard-linux-riscv64-gnu-0.3.9.tgz", + "integrity": "sha512-DXBEAiuMpk7dhS1a9NzNxVAFi1vaKoPu7rQNgY8LIDLGrK3lnIp3nT10DUum+PKVJoJppIP+NAA8IZe4DMNDPw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-linux-x64-gnu": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-x64-gnu/-/clipboard-linux-x64-gnu-0.3.9.tgz", + "integrity": "sha512-WORrMLd6EpElEME7JRKfSaY34nW1P5LbdgK5YNCS1ncG2LqmITsSMEJ8nh2mpvxb3TxqbOOKgY7k9eMJYlW9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-linux-x64-musl": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-linux-x64-musl/-/clipboard-linux-x64-musl-0.3.9.tgz", + "integrity": "sha512-/DHn+1DrfL6oRaPPWXaOKvonFFrni666fxd+zFqiQEfvBH0tsHVWjq9iqBk0oDp0qaPA72lIMy5BptxISBEhZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-win32-arm64-msvc": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-win32-arm64-msvc/-/clipboard-win32-arm64-msvc-0.3.9.tgz", + "integrity": "sha512-O5FHD3ErkMwMhNzAfu3ggy0ug4z7btZuoQgwwxlzPrwV2bxlD6WDpqBY4NCgICAgZdDKdp+loUEKVAVt8aYnhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mariozechner/clipboard-win32-x64-msvc": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@mariozechner/clipboard-win32-x64-msvc/-/clipboard-win32-x64-msvc-0.3.9.tgz", + "integrity": "sha512-ihQC3EufqEY81vhXBgVBtK4prL+wc62zJsSvxrgz7K1hsdt6OObz6v9p3Rn1OG3GJksTTKMJF0u/guMISHPhSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@mistralai/mistralai": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", + "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ws": "^8.18.0", + "zod": "^3.25.0 || ^4.0.0", + "zod-to-json-schema": "^3.25.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@silvia-odwyer/photon-node/-/photon-node-0.3.4.tgz", + "integrity": "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.3.tgz", + "integrity": "sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/credential-provider-imds": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.3.tgz", + "integrity": "sha512-I2Bti0DKFo2IJyN28ijCsx51BAumEYR4/1yZ1FXyBygy9MqbnMqCev4JPth/MbpRfBSRAX35hITSnAdJRo1u5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/fetch-http-handler": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.3.tgz", + "integrity": "sha512-F+DRf8IJazRJgYog2A/yJK7eYVc0rqTlRzO+5ZxjJd4WkZoKz0IJRncf7G6t1pdVT3kryJcwuTFhN1c5m6N47A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/node-http-handler": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.3.tgz", + "integrity": "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/signature-v4": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.3.tgz", + "integrity": "sha512-53+75QuPl6DL+ct6vVEB51FDO5oulXr20TPV46VvJZg76lIlXNWfxi8j+G2V/t0I2qxCBOa3vX/8bmjrpFVo9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.24.3", + "@smithy/types": "^4.14.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/types": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.2.tgz", + "integrity": "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/@types/node": { + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/google-auth-library": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", + "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/lru-cache": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.4.0.tgz", + "integrity": "sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/openai": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.26.0.tgz", + "integrity": "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/p-retry/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/partial-json": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", + "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/protobufjs": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.9.tgz", + "integrity": "sha512-Od4muIm3HW1AouyHF5lONOf1FWo3hY1NbFDoy191X9GzhpgW1clCoaFjfVs2rKJNFYpTNJbje4cbAIDBZJ63ZA==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "^3.973.9", - "@smithy/signature-v4": "^5.4.5", - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=8" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.1048.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1048.0.tgz", - "integrity": "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.974.11", - "@aws-sdk/nested-clients": "^3.997.9", - "@aws-sdk/types": "^3.973.8", - "@smithy/core": "^3.24.2", - "@smithy/types": "^4.14.1", - "tslib": "^2.6.2" - }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=8" } }, - "node_modules/@aws-sdk/types": { - "version": "3.973.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.9.tgz", - "integrity": "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.14.2", - "tslib": "^2.6.2" - }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/typebox": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.38.tgz", + "integrity": "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/undici": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.3.0.tgz", + "integrity": "sha512-TkUDgb6tl7KOGZ+7e8E3d2FYgUQgF6z5YypqjWmixVQSQERFcVrVg0ySADm2LVLRh5ljAaHTCR5Fmz3Q34rB7Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=22.19.0" } }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", - "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">= 8" } }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.26", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz", - "integrity": "sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g==", - "license": "Apache-2.0", + "node_modules/@earendil-works/pi-coding-agent/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", "dependencies": { - "@smithy/types": "^4.14.2", - "fast-xml-parser": "5.7.3", - "tslib": "^2.6.2" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=20.0.0" + "node": ">= 8" } }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", - "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", - "license": "Apache-2.0", + "node_modules/@earendil-works/pi-coding-agent/node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "node_modules/@earendil-works/pi-coding-agent/node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@earendil-works/pi-ai": { - "version": "0.77.0", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.77.0.tgz", - "integrity": "sha512-H21BrQDPf3ydaeBmS5maNDHxUGFMiKBF/n3WnE+OTWloIZSayeL+/NVEgG3aKQw8fZL6HAMYAGpUIVJgFuKtnw==", - "license": "MIT", - "dependencies": { - "@anthropic-ai/sdk": "0.91.1", - "@aws-sdk/client-bedrock-runtime": "3.1048.0", - "@google/genai": "1.52.0", - "@mistralai/mistralai": "2.2.1", - "@smithy/node-http-handler": "4.7.3", - "http-proxy-agent": "7.0.2", - "https-proxy-agent": "7.0.6", - "openai": "6.26.0", - "partial-json": "0.1.7", - "typebox": "1.1.38" - }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", "bin": { - "pi-ai": "dist/cli.js" + "yaml": "bin.mjs" }, "engines": { - "node": ">=22.19.0" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@earendil-works/pi-coding-agent/node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" } }, "node_modules/@google/genai": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", "integrity": "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==", + "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -548,6 +2506,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", "integrity": "sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "ws": "^8.18.0", @@ -559,6 +2518,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", + "dev": true, "funding": [ { "type": "github", @@ -571,30 +2531,35 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1" @@ -604,36 +2569,42 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@smithy/core": { "version": "3.24.5", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.5.tgz", "integrity": "sha512-Kt8phUg45M15EjhYAbZ+fFikYneijLu9Liugz8ZsYz2i8j0hzGv27LWKpEHYRfvj+LyCOSijpcR/2i8RouV+cA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", @@ -648,6 +2619,7 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.5.tgz", "integrity": "sha512-yiF8xHpdkaTfzLVqFzsP6WvNghEK+qZzLYWFD13L2SsFhbXwBGlxdocKF95qjr7s5lE5NRage+EJFK4mAsx88Q==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.24.5", @@ -662,6 +2634,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.5.tgz", "integrity": "sha512-SK3VMeH0fibgdTg2QeB+O4p7Yy/2E5HBOHJeC58FshkDdeuX8lOgO7PfjYfLyPLP1ch55j91cQqKBzDS0mRjSQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.24.5", @@ -676,6 +2649,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -688,6 +2662,7 @@ "version": "4.7.3", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.3.tgz", "integrity": "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.24.3", @@ -702,6 +2677,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.5.tgz", "integrity": "sha512-QBJKWGqIknH0dc9LWpfH1mkdokAx6iXYN3UcQ3eY6uIEyScuoQAhfl94ge7ozUy9WgFUdE8xsvwBjaYBbWmPNA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.24.5", @@ -716,6 +2692,7 @@ "version": "4.14.2", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.2.tgz", "integrity": "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -728,6 +2705,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -741,6 +2719,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -754,6 +2733,7 @@ "version": "20.19.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -763,12 +2743,14 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, "license": "MIT" }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14" @@ -778,6 +2760,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -798,6 +2781,7 @@ "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -807,18 +2791,21 @@ "version": "2.14.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "dev": true, "license": "MIT" }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -828,6 +2815,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -845,6 +2833,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -854,12 +2843,14 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, "license": "MIT" }, "node_modules/fast-xml-builder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "dev": true, "funding": [ { "type": "github", @@ -876,6 +2867,7 @@ "version": "5.7.3", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "dev": true, "funding": [ { "type": "github", @@ -897,6 +2889,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, "funding": [ { "type": "github", @@ -920,6 +2913,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" @@ -932,6 +2926,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -946,6 +2941,7 @@ "version": "8.1.2", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -960,6 +2956,7 @@ "version": "10.6.2", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -977,6 +2974,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=14" @@ -986,6 +2984,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -999,6 +2998,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -1012,6 +3012,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" @@ -1021,6 +3022,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -1034,6 +3036,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -1045,6 +3048,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, "license": "MIT", "dependencies": { "jwa": "^2.0.1", @@ -1055,12 +3059,14 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "dev": true, "license": "Apache-2.0" }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/node-domexception": { @@ -1068,6 +3074,7 @@ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", "deprecated": "Use your platform's native DOMException instead", + "dev": true, "funding": [ { "type": "github", @@ -1087,6 +3094,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -1105,6 +3113,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/openai/-/openai-6.26.0.tgz", "integrity": "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==", + "dev": true, "license": "Apache-2.0", "bin": { "openai": "bin/cli" @@ -1126,6 +3135,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/retry": "0.12.0", @@ -1139,12 +3149,14 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", + "dev": true, "license": "MIT" }, "node_modules/path-expression-matcher": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "dev": true, "funding": [ { "type": "github", @@ -1160,6 +3172,7 @@ "version": "7.6.1", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz", "integrity": "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==", + "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -1184,6 +3197,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -1193,6 +3207,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -1213,6 +3228,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "dev": true, "funding": [ { "type": "github", @@ -1225,18 +3241,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "dev": true, "license": "MIT" }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/typebox": { "version": "1.1.38", "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.38.tgz", "integrity": "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==", + "dev": true, "license": "MIT" }, "node_modules/typescript": { @@ -1257,12 +3276,14 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -1272,6 +3293,7 @@ "version": "8.21.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -1293,6 +3315,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "dev": true, "funding": [ { "type": "github", @@ -1308,6 +3331,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -1317,6 +3341,7 @@ "version": "3.25.2", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, "license": "ISC", "peerDependencies": { "zod": "^3.25.28 || ^4" diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json index 14c485d2..5e42a112 100644 --- a/integrations/pi-villani/package.json +++ b/integrations/pi-villani/package.json @@ -1,24 +1,44 @@ { "name": "pi-villani", "version": "0.1.0", - "private": true, "description": "Pi extension bridge for running Villani Code as a delegated coding runner.", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "build": "tsc -p tsconfig.json", "typecheck": "tsc -p tsconfig.json --noEmit", - "test": "npm run build && node --test dist/modelProxy.test.js" + "test": "npm run build && node --test dist/*.test.js" }, "devDependencies": { + "@earendil-works/pi-ai": "^0.77.0", + "@earendil-works/pi-coding-agent": "^0.77.0", "@types/node": "^20.11.30", "typescript": "^5.4.0" }, "engines": { "node": ">=22.19.0" }, - "dependencies": { - "@earendil-works/pi-ai": "^0.77.0" + "type": "module", + "keywords": [ + "pi-package", + "pi-extension", + "villani-code" + ], + "license": "MIT", + "files": [ + "dist", + "!dist/*.test.js", + "!dist/*.test.d.ts", + "README.md", + "docs" + ], + "pi": { + "extensions": [ + "./dist/index.js" + ] }, - "type": "module" + "peerDependencies": { + "@earendil-works/pi-ai": "*", + "@earendil-works/pi-coding-agent": "*" + } } diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts new file mode 100644 index 00000000..97099649 --- /dev/null +++ b/integrations/pi-villani/src/extension.test.ts @@ -0,0 +1,104 @@ +import assert from "node:assert/strict"; +import { mkdtemp, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test from "node:test"; +import villaniPiExtension from "./index.js"; +import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent"; + +async function mockAbortableBridge(): Promise { + const dir = await mkdtemp(join(tmpdir(), "villani-extension-")); + const path = join(dir, "bridge.mjs"); + await writeFile(path, ` + process.stdout.write('{"type":"ready","protocol_version":1}\\n'); + process.stdin.setEncoding('utf8'); + let buffer = ''; + process.stdin.on('data', chunk => { + buffer += chunk; + for (;;) { + const idx = buffer.indexOf('\\n'); + if (idx < 0) break; + const line = buffer.slice(0, idx); buffer = buffer.slice(idx + 1); + if (!line.trim()) continue; + const msg = JSON.parse(line); + if (msg.type === 'run') process.stdout.write(JSON.stringify({type:'run_started', id:msg.id, run_id:msg.id, task:msg.task, repo:msg.repo, mode:msg.mode}) + '\\n'); + if (msg.type === 'abort') { process.stdout.write(JSON.stringify({type:'run_aborted', id:msg.id, success:false, summary:'Aborted by test', changed_files:[], preexisting_dirty_files:[]}) + '\\n'); setTimeout(() => process.exit(0), 10); } + } + }); + `, "utf8"); + return `${process.execPath} ${path}`; +} + +function createHost() { + const commands = new Map Promise>(); + const api = { + registerCommand(name: string, options: { handler: (args: string, ctx: ExtensionCommandContext) => Promise }) { + commands.set(name, options.handler); + }, + } as ExtensionAPI; + return { api, commands }; +} + +function createContext(messages: string[]): ExtensionCommandContext { + return { + cwd: process.cwd(), + model: undefined, + signal: undefined, + ui: { + notify: (message: string) => messages.push(message), + setStatus: (_key: string, text: string | undefined) => { if (text) messages.push(text); }, + }, + } as unknown as ExtensionCommandContext; +} + +test("extension registers /villani and /villani-abort", () => { + const host = createHost(); + villaniPiExtension(host.api); + assert.equal(host.commands.has("villani"), true); + assert.equal(host.commands.has("villani-abort"), true); +}); + +test("/villani-abort reports no active run", async () => { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani-abort")!("", createContext(messages)); + assert.match(messages.join("\n"), /No active Villani run/); +}); + +test("prevents overlapping runs and aborts active run", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + process.env.VILLANI_COMMAND = await mockAbortableBridge(); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + const ctx = createContext(messages); + const runPromise = host.commands.get("villani")!("fix it", ctx); + await new Promise((resolve) => setTimeout(resolve, 250)); + await host.commands.get("villani")!("second", ctx); + assert.match(messages.join("\n"), /already running/); + await host.commands.get("villani-abort")!("", ctx); + await runPromise; + assert.match(messages.join("\n"), /Villani aborted/); + } finally { + setOrDelete("VILLANI_COMMAND", oldCommand); + setOrDelete("VILLANI_USE_PI_MODEL", oldUsePi); + setOrDelete("VILLANI_PROVIDER", oldProvider); + setOrDelete("VILLANI_MODEL", oldModel); + setOrDelete("VILLANI_BASE_URL", oldBase); + } +}); + +function setOrDelete(name: string, value: string | undefined): void { + if (value === undefined) delete process.env[name]; + else process.env[name] = value; +} diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index 08349839..e9346e90 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -1,106 +1,130 @@ import { randomUUID } from "node:crypto"; +import type { ExtensionAPI, ExtensionCommandContext, ExtensionUIContext } from "@earendil-works/pi-coding-agent"; import type { Model } from "@earendil-works/pi-ai"; import { BridgeEvent, RunCommand, VillaniMode } from "./protocol.js"; -import { VillaniBridgeProcess } from "./process.js"; +import { startVillaniBridgeProcess, VillaniBridgeProcess } from "./process.js"; import { PiModelProxy } from "./modelProxy.js"; import { PiLikeOutput, renderEvent } from "./render.js"; -interface PiUI { - notify?: (message: string, level?: "info" | "warn" | "error") => void; - setStatus?: (key: string, message: string) => void; - setWidget?: (key: string, lines: string[]) => void; +interface ActiveVillaniRun { + id: string; + repo: string; + bridge: VillaniBridgeProcess; + proxy?: PiModelProxy; + done: Promise; + resolveDone: () => void; } -interface PiLikeCommandContext { - cwd?: string; - model?: Model; - signal?: AbortSignal; - ui?: PiUI; - workspace?: { cwd?: string; rootPath?: string; folders?: Array<{ path?: string; uri?: { fsPath?: string } }> }; -} - -interface PiLikeAPI { - registerCommand?: ( - name: string, - options: { description: string; handler: (args?: string, ctx?: PiLikeCommandContext) => unknown } | ((args?: unknown, ctx?: PiLikeCommandContext) => unknown), - ) => { dispose?: () => void } | void; -} - -interface LegacyPiLikeContext extends PiLikeCommandContext { - commands?: { registerCommand?: PiLikeAPI["registerCommand"] }; - output?: PiLikeOutput; - subscriptions?: Array<{ dispose?: () => void }>; -} - -export default function villaniPiExtension(pi: PiLikeAPI): void { - activate(pi as LegacyPiLikeContext); -} +let activeRun: ActiveVillaniRun | undefined; -export function activate(context: LegacyPiLikeContext | PiLikeAPI): void { - const registrar = ("commands" in context ? context.commands?.registerCommand : undefined) ?? (context as PiLikeAPI).registerCommand; - if (!registrar) { - throw new Error("Pi command registration API was not found; update src/index.ts for the installed Pi SDK."); - } - const disposable = registrar("villani", { - description: "Delegate a coding task to Villani Code", - handler: async (args?: string, commandContext?: PiLikeCommandContext) => runVillaniCommand({ ...(context as LegacyPiLikeContext), ...commandContext }, args), +export default function villaniPiExtension(pi: ExtensionAPI): void { + pi.registerCommand("villani", { + description: "Delegate a repository coding task to Villani Code", + handler: async (args: string, ctx: ExtensionCommandContext) => runVillaniCommand(args, ctx), + }); + pi.registerCommand("villani-abort", { + description: "Abort the active Villani Code run", + handler: async (_args: string, ctx: ExtensionCommandContext) => abortVillaniRun(ctx), }); - if (disposable && "subscriptions" in context && context.subscriptions) context.subscriptions.push(disposable); } -export function deactivate(): void { - // Nothing persistent to clean up; per-run bridge/proxy processes are stopped in finally blocks. -} +export async function runVillaniCommand(args: string, ctx: ExtensionCommandContext): Promise { + const task = args.trim(); + const output = uiOutput(ctx.ui); + if (!task) { + output.warn?.("Usage: /villani "); + return; + } + if (activeRun) { + output.warn?.(`Villani is already running in ${activeRun.repo}. Use /villani-abort to stop it before starting another run.`); + return; + } -export async function runVillaniCommand(context: LegacyPiLikeContext, args?: unknown): Promise { - const task = extractTask(args); - const output = context.output ?? uiOutput(context.ui) ?? console; - if (!task) throw new Error("Usage: /villani "); - const repo = resolveWorkspace(context); + const repo = ctx.cwd || process.cwd(); const runId = randomUUID(); - const explicitConfig = hasExplicitVillaniModelConfig(); - const proxy = !explicitConfig && context.model ? new PiModelProxy({ model: context.model, signal: context.signal }) : undefined; - const proxyUrl = proxy ? await proxy.start() : undefined; - const bridge = new VillaniBridgeProcess({ command: process.env.VILLANI_COMMAND || "villani", cwd: repo }); + const explicitConfig = useExplicitVillaniConfig(); + const model = ctx.model as Model | undefined; + if (!explicitConfig && !model) { + output.error?.("No active Pi model is available for Villani. Select/configure a Pi model, or set VILLANI_USE_PI_MODEL=false with VILLANI_PROVIDER, VILLANI_MODEL, and VILLANI_BASE_URL."); + return; + } + + const proxy = !explicitConfig && model ? new PiModelProxy({ model, signal: ctx.signal }) : undefined; + let bridge: VillaniBridgeProcess | undefined; let finished = false; let resolveFinal!: () => void; const finalEvent = new Promise((resolve) => { resolveFinal = resolve; }); + let resolveDone!: () => void; + const done = new Promise((resolve) => { resolveDone = resolve; }); + try { + const proxyUrl = proxy ? await proxy.start() : undefined; + bridge = await startVillaniBridgeProcess({ command: process.env.VILLANI_COMMAND, cwd: repo }); + activeRun = { id: runId, repo, bridge, proxy, done, resolveDone }; bridge.onEvent((event: BridgeEvent) => { renderEvent(event, output); if (event.type === "run_completed" || event.type === "run_failed" || event.type === "run_aborted") { finished = true; resolveFinal(); } + if (event.type === "error") { + output.error?.(`Villani bridge error: ${event.error}`); + } }); - if (context.signal) { - context.signal.addEventListener("abort", () => { - try { bridge.abort(runId); } catch { /* ignore cancellation races */ } - }, { once: true }); - } - await bridge.waitUntilReady(); + ctx.signal?.addEventListener("abort", () => { + void abortActiveRun("Pi command cancellation requested"); + }, { once: true }); + const command: RunCommand = { type: "run", id: runId, task, repo, mode: (process.env.VILLANI_MODE as VillaniMode | undefined) || "runner", - config: buildRunConfig(proxyUrl, context.model), + config: buildRunConfig(proxyUrl, model), }; bridge.send(command); await Promise.race([ finalEvent, bridge.waitForExit().then((code) => { - if (!finished) throw new Error(`Villani bridge exited before final event with code ${code}. stderr: ${bridge.stderr()}`); + if (!finished) throw new Error(`Villani bridge exited before a final event with code ${code}. ${bridge?.stderr() ?? ""}`.trim()); }), ]); + } catch (error) { + output.error?.(error instanceof Error ? error.message : String(error)); } finally { - if (!finished) { - try { bridge.abort(runId); } catch { /* ignore cleanup send errors */ } + if (!finished && bridge) { + try { bridge.abort(runId); } catch { /* ignore cleanup races */ } } - bridge.kill(); + bridge?.kill(); await proxy?.stop(); + if (activeRun?.id === runId) activeRun = undefined; + resolveDone(); + } +} + +export async function abortVillaniRun(ctx: ExtensionCommandContext): Promise { + const output = uiOutput(ctx.ui); + if (!activeRun) { + output.info?.("No active Villani run to abort."); + return; } + output.warn?.("Aborting active Villani run…"); + await abortActiveRun("Aborted by /villani-abort"); +} + +async function abortActiveRun(_reason: string): Promise { + const run = activeRun; + if (!run) return; + try { + run.bridge.abort(run.id); + } catch { + run.bridge.kill(); + } + await Promise.race([ + run.done, + new Promise((resolve) => setTimeout(resolve, 5_000)).then(() => run.bridge.kill()), + ]); } function buildRunConfig(proxyUrl: string | undefined, model: Model | undefined): RunCommand["config"] { @@ -119,28 +143,20 @@ function buildRunConfig(proxyUrl: string | undefined, model: Model | und }; } -function hasExplicitVillaniModelConfig(): boolean { - return Boolean(process.env.VILLANI_PROVIDER || process.env.VILLANI_MODEL || process.env.VILLANI_BASE_URL || process.env.VILLANI_API_KEY); +function useExplicitVillaniConfig(): boolean { + if (String(process.env.VILLANI_USE_PI_MODEL ?? "").toLowerCase() === "false") return true; + return false; } -function uiOutput(ui: PiUI | undefined): PiLikeOutput | undefined { - if (!ui) return undefined; +function uiOutput(ui: ExtensionUIContext): PiLikeOutput { return { - info: (message: string) => ui.notify?.(message, "info") ?? ui.setStatus?.("villani", message), - warn: (message: string) => ui.notify?.(message, "warn") ?? ui.setStatus?.("villani", message), - error: (message: string) => ui.notify?.(message, "error") ?? ui.setStatus?.("villani", message), - markdown: (message: string) => ui.setWidget?.("villani", message.split("\n")) ?? ui.notify?.(message, "info"), + info: (message: string) => ui.notify(message, "info"), + warn: (message: string) => ui.notify(message, "warning"), + error: (message: string) => ui.notify(message, "error"), + markdown: (message: string) => ui.notify(message, "info"), }; } -function extractTask(args: unknown): string { - if (typeof args === "string") return args.trim(); - if (args && typeof args === "object" && "text" in args) return String((args as { text?: unknown }).text ?? "").trim(); - if (Array.isArray(args)) return args.join(" ").trim(); - return ""; -} - -function resolveWorkspace(context: LegacyPiLikeContext): string { - const workspace = context.workspace; - return context.cwd || workspace?.cwd || workspace?.rootPath || workspace?.folders?.[0]?.path || workspace?.folders?.[0]?.uri?.fsPath || process.cwd(); +export function __getActiveRunForTests(): ActiveVillaniRun | undefined { + return activeRun; } diff --git a/integrations/pi-villani/src/modelProxy.test.ts b/integrations/pi-villani/src/modelProxy.test.ts index 05aa8155..e969715d 100644 --- a/integrations/pi-villani/src/modelProxy.test.ts +++ b/integrations/pi-villani/src/modelProxy.test.ts @@ -95,3 +95,47 @@ test("proxy serves minimal OpenAI chat completions without credentials", async ( await proxy.stop(); } }); + + +test("proxy serves Villani-compatible streaming chat completions", async () => { + const model = { + id: "pi-test", + name: "Pi Test", + api: "openai-completions", + provider: "pi", + baseUrl: "pi://current", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 4096, + } as Model; + const proxy = new PiModelProxy({ + model, + completeFn: async () => ({ + role: "assistant", + api: "openai-completions", + provider: "pi", + model: "pi-test", + content: [{ type: "text", text: "streamed final" }], + usage: { input: 1, output: 2, cacheRead: 0, cacheWrite: 0, totalTokens: 3, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "stop", + timestamp: 1700000000000, + }), + }); + const url = await proxy.start(); + try { + const response = await fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", stream: true, messages: [{ role: "user", content: "hello" }] }), + }); + assert.equal(response.headers.get("content-type")?.startsWith("text/event-stream"), true); + const body = await response.text(); + assert.match(body, /data: /); + assert.match(body, /streamed final/); + assert.match(body, /\[DONE\]/); + } finally { + await proxy.stop(); + } +}); diff --git a/integrations/pi-villani/src/process.test.ts b/integrations/pi-villani/src/process.test.ts new file mode 100644 index 00000000..86003f09 --- /dev/null +++ b/integrations/pi-villani/src/process.test.ts @@ -0,0 +1,44 @@ +import assert from "node:assert/strict"; +import { mkdtemp, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test from "node:test"; +import { VillaniBridgeProcess } from "./process.js"; + +async function mockBridge(script: string): Promise { + const dir = await mkdtemp(join(tmpdir(), "villani-bridge-")); + const path = join(dir, "bridge.mjs"); + await writeFile(path, script, "utf8"); + return `${process.execPath} ${path}`; +} + +test("reports missing executable without unhandled process error", async () => { + const bridge = new VillaniBridgeProcess({ command: "definitely-not-real-villani-command", cwd: process.cwd(), readyTimeoutMs: 500 }); + await assert.rejects(bridge.waitUntilReady(), /executable was not found/); +}); + +test("rejects when bridge exits before ready", async () => { + const command = await mockBridge("process.stderr.write('bad startup'); process.exit(7);\n"); + const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + await assert.rejects(bridge.waitUntilReady(), /exited before ready.*bad startup/); +}); + +test("rejects malformed bridge output", async () => { + const command = await mockBridge("process.stdout.write('not json\\n'); setTimeout(() => {}, 1000);\n"); + const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + await assert.rejects(bridge.waitUntilReady(), /Malformed bridge JSONL output/); +}); + +test("processes successful ready handshake", async () => { + const command = await mockBridge("process.stdout.write('{\"type\":\"ready\",\"protocol_version\":1}\\n'); setTimeout(() => process.exit(0), 50);\n"); + const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + await bridge.waitUntilReady(); + assert.equal(await bridge.waitForExit(), 0); +}); + +test("exit during active run is observable", async () => { + const command = await mockBridge("process.stdout.write('{\"type\":\"ready\",\"protocol_version\":1}\\n'); setTimeout(() => process.exit(3), 50);\n"); + const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + await bridge.waitUntilReady(); + assert.equal(await bridge.waitForExit(), 3); +}); diff --git a/integrations/pi-villani/src/process.ts b/integrations/pi-villani/src/process.ts index 14e1885c..86034b80 100644 --- a/integrations/pi-villani/src/process.ts +++ b/integrations/pi-villani/src/process.ts @@ -1,14 +1,23 @@ import { ChildProcessWithoutNullStreams, spawn } from "node:child_process"; -import { createInterface } from "node:readline"; +import { StringDecoder } from "node:string_decoder"; import { AbortCommand, BridgeCommand, BridgeEvent, commandToLine } from "./protocol.js"; +export const DEFAULT_VILLANI_COMMAND = "villani-code"; + export interface BridgeProcessOptions { - command: string; + command?: string; cwd: string; readyTimeoutMs?: number; env?: NodeJS.ProcessEnv; } +interface CommandSpec { + executable: string; + args: string[]; + display: string; + isFallback?: boolean; +} + export class VillaniBridgeProcess { private child: ChildProcessWithoutNullStreams; private stderrChunks: string[] = []; @@ -16,53 +25,69 @@ export class VillaniBridgeProcess { private readyPromise: Promise; private exitPromise: Promise; private closed = false; + private stdoutBuffer = ""; + private stdoutDecoder = new StringDecoder("utf8"); + private startupSettled = false; + private startupReject?: (error: Error) => void; + private startupResolve?: () => void; - constructor(options: BridgeProcessOptions) { - const { executable, args } = splitCommand(options.command); - this.child = spawn(executable, [...args, "bridge", "--stdio"], { + constructor(options: BridgeProcessOptions & { spec?: CommandSpec }) { + const spec = options.spec ?? commandToSpec(options.command ?? DEFAULT_VILLANI_COMMAND); + this.child = spawn(spec.executable, [...spec.args, "bridge", "--stdio"], { cwd: options.cwd, env: { ...process.env, ...options.env }, shell: false, windowsHide: true, }); + this.readyPromise = new Promise((resolve, reject) => { + this.startupResolve = () => { + this.startupSettled = true; + resolve(); + }; + this.startupReject = (error: Error) => { + this.startupSettled = true; + reject(error); + }; + }); + + this.child.on("error", (error: NodeJS.ErrnoException) => { + this.closed = true; + this.rejectStartup(formatSpawnError(error, spec.display)); + }); + this.child.stderr.on("data", (chunk: Buffer) => { this.stderrChunks.push(chunk.toString("utf8")); if (this.stderrChunks.length > 20) this.stderrChunks.shift(); }); - const stdout = createInterface({ input: this.child.stdout, crlfDelay: Infinity }); - let markReady: (() => void) | undefined; - const readySeen = new Promise((resolve) => { - markReady = resolve; + this.child.stdout.on("data", (chunk: Buffer) => { + this.consumeStdout(this.stdoutDecoder.write(chunk)); }); - stdout.on("line", (line: string) => { - const trimmed = line.trim(); - if (!trimmed) return; - let event: BridgeEvent; - try { - event = JSON.parse(trimmed) as BridgeEvent; - } catch { - event = { type: "error", error: `Malformed bridge output: ${trimmed.slice(0, 200)}` }; - } - if (event.type === "ready") markReady?.(); - this.listeners.forEach((listener) => listener(event)); + this.child.stdout.on("end", () => { + const tail = this.stdoutDecoder.end(); + if (tail) this.consumeStdout(tail); + if (this.stdoutBuffer.trim()) this.failProtocol(`Incomplete bridge JSONL line before stdout closed: ${this.stdoutBuffer.slice(0, 200)}`); }); this.exitPromise = new Promise((resolve) => { - this.child.on("exit", (code) => { + this.child.on("exit", (code, signal) => { this.closed = true; + if (!this.startupSettled) { + this.rejectStartup(new Error(`Villani bridge exited before ready (code ${code ?? "null"}, signal ${signal ?? "null"}).${this.stderrSuffix()}`)); + } resolve(code); }); }); const timeoutMs = options.readyTimeoutMs ?? 15_000; - this.readyPromise = Promise.race([ - readySeen, - new Promise((_, reject) => - setTimeout(() => reject(new Error(`Timed out waiting for Villani bridge ready. stderr: ${this.stderr()}`)), timeoutMs), - ), - ]); + const timer = setTimeout(() => { + if (!this.startupSettled) { + this.rejectStartup(new Error(`Timed out waiting for Villani bridge ready after ${timeoutMs}ms.${this.stderrSuffix()}`)); + this.kill(); + } + }, timeoutMs); + this.readyPromise.finally(() => clearTimeout(timer)).catch(() => clearTimeout(timer)); } onEvent(listener: (event: BridgeEvent) => void): void { @@ -79,7 +104,7 @@ export class VillaniBridgeProcess { send(command: BridgeCommand): void { if (this.closed || !this.child.stdin.writable) { - throw new Error(`Villani bridge is not writable. stderr: ${this.stderr()}`); + throw new Error(`Villani bridge is not writable.${this.stderrSuffix()}`); } this.child.stdin.write(commandToLine(command)); } @@ -96,15 +121,95 @@ export class VillaniBridgeProcess { stderr(): string { return this.stderrChunks.join("").slice(-4000); } + + private consumeStdout(text: string): void { + this.stdoutBuffer += text; + while (true) { + const newline = this.stdoutBuffer.indexOf("\n"); + if (newline < 0) return; + const line = this.stdoutBuffer.slice(0, newline).trim(); + this.stdoutBuffer = this.stdoutBuffer.slice(newline + 1); + if (!line) continue; + let event: BridgeEvent; + try { + event = JSON.parse(line) as BridgeEvent; + } catch { + this.failProtocol(`Malformed bridge JSONL output: ${line.slice(0, 200)}`); + return; + } + if (event.type === "ready") this.resolveStartup(); + this.listeners.forEach((listener) => listener(event)); + } + } + + private failProtocol(message: string): void { + const event: BridgeEvent = { type: "error", error: message }; + this.listeners.forEach((listener) => listener(event)); + this.rejectStartup(new Error(`${message}${this.stderrSuffix()}`)); + this.kill(); + } + + private resolveStartup(): void { + if (!this.startupSettled) this.startupResolve?.(); + } + + private rejectStartup(error: Error): void { + if (!this.startupSettled) this.startupReject?.(error); + } + + private stderrSuffix(): string { + const stderr = this.stderr().trim(); + return stderr ? ` stderr: ${stderr}` : ""; + } +} + +export async function startVillaniBridgeProcess(options: BridgeProcessOptions): Promise { + if (options.command) { + const bridgeProcess = new VillaniBridgeProcess(options); + await bridgeProcess.waitUntilReady(); + return bridgeProcess; + } + + const primarySpec = commandToSpec(DEFAULT_VILLANI_COMMAND); + try { + const bridgeProcess = new VillaniBridgeProcess({ ...options, spec: primarySpec }); + await bridgeProcess.waitUntilReady(); + return bridgeProcess; + } catch (error) { + if (!isExecutableMissingError(error)) throw error; + } + + const fallbackSpec: CommandSpec = { + executable: process.platform === "win32" ? "python" : "python3", + args: ["-m", "villani_code.cli"], + display: `${process.platform === "win32" ? "python" : "python3"} -m villani_code.cli`, + isFallback: true, + }; + const fallback = new VillaniBridgeProcess({ ...options, spec: fallbackSpec }); + await fallback.waitUntilReady(); + return fallback; } -function splitCommand(command: string): { executable: string; args: string[] } { +export function commandToSpec(command: string): CommandSpec { const trimmed = command.trim(); - if (!trimmed) return { executable: "villani", args: [] }; + if (!trimmed) return { executable: DEFAULT_VILLANI_COMMAND, args: [], display: DEFAULT_VILLANI_COMMAND }; if (trimmed.startsWith("python -m ")) { const [, , moduleName, ...rest] = trimmed.split(/\s+/); - return { executable: "python", args: ["-m", moduleName, ...rest] }; + return { executable: "python", args: ["-m", moduleName, ...rest], display: trimmed }; } const parts = trimmed.split(/\s+/); - return { executable: parts[0], args: parts.slice(1) }; + return { executable: parts[0], args: parts.slice(1), display: trimmed }; +} + +function formatSpawnError(error: NodeJS.ErrnoException, display: string): Error { + if (error.code === "ENOENT") { + return new Error( + `Unable to start Villani. The \`${display}\` executable was not found. Install Villani Code in the active environment or set VILLANI_COMMAND to the executable path.`, + ); + } + return new Error(`Unable to start Villani with \`${display}\`: ${error.message}`); +} + +function isExecutableMissingError(error: unknown): boolean { + return error instanceof Error && error.message.includes("executable was not found"); } diff --git a/integrations/pi-villani/src/protocol.ts b/integrations/pi-villani/src/protocol.ts index 1267791f..d03ac847 100644 --- a/integrations/pi-villani/src/protocol.ts +++ b/integrations/pi-villani/src/protocol.ts @@ -47,9 +47,9 @@ export type BridgeEvent = | { type: "verification_finished"; id: string; command: string; passed: boolean; summary: string } | { type: "governor_redirect"; id: string; message: string } | { type: "abort_requested"; id: string } - | { type: "run_completed"; id: string; success: true; changed_files: string[]; verification_passed: boolean | null; summary: string; transcript_path?: string | null } - | { type: "run_failed"; id: string; success: false; error: string; summary: string; transcript_path?: string | null } - | { type: "run_aborted"; id: string; success: false; summary: string; transcript_path?: string | null } + | { type: "run_completed"; id: string; success: true; changed_files: string[]; preexisting_dirty_files?: string[]; verification_passed: boolean | null; summary: string; transcript_path?: string | null } + | { type: "run_failed"; id: string; success: false; error: string; summary: string; changed_files?: string[]; preexisting_dirty_files?: string[]; transcript_path?: string | null } + | { type: "run_aborted"; id: string; success: false; summary: string; changed_files?: string[]; preexisting_dirty_files?: string[]; transcript_path?: string | null } | { type: "error"; id?: string; error: string }; export function commandToLine(command: BridgeCommand): string { diff --git a/integrations/pi-villani/src/render.ts b/integrations/pi-villani/src/render.ts index 2b750236..2e37a728 100644 --- a/integrations/pi-villani/src/render.ts +++ b/integrations/pi-villani/src/render.ts @@ -50,15 +50,20 @@ export function renderEvent(event: BridgeEvent, output: PiLikeOutput = console): export function renderFinalSummary(event: Extract, output: PiLikeOutput = console): void { const markdown = output.markdown ?? output.info ?? output.log ?? console.log; - const changedFiles = "changed_files" in event && event.changed_files.length ? event.changed_files.map((file) => `- ${file}`).join("\n") : "None reported"; + const changed = "changed_files" in event && event.changed_files?.length ? event.changed_files : []; + const preexisting = "preexisting_dirty_files" in event && event.preexisting_dirty_files?.length ? event.preexisting_dirty_files : []; + const changedFiles = changed.length ? changed.map((file) => `- ${file}`).join("\n") : "None reported"; + const preexistingFiles = preexisting.length ? preexisting.map((file) => `- ${file}`).join("\n") : ""; const verification = "verification_passed" in event ? String(event.verification_passed) : "not reported"; const status = event.type === "run_completed" ? "completed" : event.type === "run_aborted" ? "aborted" : "failed"; markdown([ `### Villani ${status}`, "", + "**Summary:**", event.summary || "No summary reported.", "", - `**Changed files**\n${changedFiles}`, + `**Changed by Villani**\n${changedFiles}`, + preexistingFiles ? `\n**Pre-existing workspace changes excluded from attribution**\n${preexistingFiles}` : "", "", `**Verification passed:** ${verification}`, `**Transcript:** ${event.transcript_path ?? "not reported"}`, diff --git a/tests/integrations/test_pi_bridge.py b/tests/integrations/test_pi_bridge.py index 5ede0c43..825976ff 100644 --- a/tests/integrations/test_pi_bridge.py +++ b/tests/integrations/test_pi_bridge.py @@ -156,3 +156,126 @@ def factory(_command: Any, event_callback: Any) -> BlockingRunner: def test_runner_event_mapping_does_not_expose_prompts() -> None: mapped = map_runner_event("run-1", {"type": "stream_text", "text": "hidden prompt-ish text"}) assert mapped == [] + +class EditingRunner(DummyRunner): + def __init__(self, repo: Path, edits: dict[str, str], events: list[dict[str, Any]] | None = None) -> None: + super().__init__(events=events) + self.repo = repo + self.edits = edits + self.run_calls = 0 + self.villani_calls = 0 + + def run(self, instruction: str, **_kwargs: Any) -> dict[str, Any]: + self.run_calls += 1 + for rel, content in self.edits.items(): + target = self.repo / rel + target.parent.mkdir(parents=True, exist_ok=True) + target.write_text(content, encoding="utf-8") + self.event_callback({"type": "tool_finished", "name": "Write", "input": {"path": rel}, "is_error": False}) + return self.result + + def run_villani_mode(self) -> dict[str, Any]: + self.villani_calls += 1 + return self.run("villani") + + +def init_git_repo(repo: Path) -> None: + import subprocess + + subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=repo, check=True) + subprocess.run(["git", "config", "user.name", "Test"], cwd=repo, check=True) + + +def commit_all(repo: Path) -> None: + import subprocess + + subprocess.run(["git", "add", "."], cwd=repo, check=True) + subprocess.run(["git", "commit", "-m", "init"], cwd=repo, check=True, capture_output=True) + + +def run_bridge_command(repo: Path, runner: DummyRunner, mode: str = "runner") -> dict[str, Any]: + stdout = io.StringIO() + + def factory(_command: Any, event_callback: Any) -> DummyRunner: + runner.event_callback = event_callback + return runner + + bridge = PiBridge(stdout=stdout, runner_factory=factory) + bridge._handle_command({"type": "run", "id": "run-change", "task": "Fix", "repo": str(repo), "mode": mode}) + deadline = time.time() + 2 + while bridge._active and time.time() < deadline: + time.sleep(0.01) + bridge._drain_events() + return collect_json_lines(stdout)[-1] + + +def test_changed_files_clean_repo_new_change(tmp_path: Path) -> None: + init_git_repo(tmp_path) + (tmp_path / "src.py").write_text("old\n", encoding="utf-8") + commit_all(tmp_path) + + event = run_bridge_command(tmp_path, EditingRunner(tmp_path, {"src.py": "new\n"})) + + assert event["type"] == "run_completed" + assert event["changed_files"] == ["src.py"] + assert event["preexisting_dirty_files"] == [] + + +def test_changed_files_preexisting_dirty_unchanged_not_attributed(tmp_path: Path) -> None: + init_git_repo(tmp_path) + (tmp_path / "notes.txt").write_text("clean\n", encoding="utf-8") + commit_all(tmp_path) + (tmp_path / "notes.txt").write_text("dirty before\n", encoding="utf-8") + + event = run_bridge_command(tmp_path, EditingRunner(tmp_path, {})) + + assert event["changed_files"] == [] + assert event["preexisting_dirty_files"] == ["notes.txt"] + + +def test_changed_files_dirty_repo_new_clean_file_modified(tmp_path: Path) -> None: + init_git_repo(tmp_path) + (tmp_path / "notes.txt").write_text("clean\n", encoding="utf-8") + (tmp_path / "src.py").write_text("old\n", encoding="utf-8") + commit_all(tmp_path) + (tmp_path / "notes.txt").write_text("dirty before\n", encoding="utf-8") + + event = run_bridge_command(tmp_path, EditingRunner(tmp_path, {"src.py": "new\n"})) + + assert event["changed_files"] == ["src.py"] + assert event["preexisting_dirty_files"] == ["notes.txt"] + + +def test_changed_files_preexisting_dirty_modified_further(tmp_path: Path) -> None: + init_git_repo(tmp_path) + (tmp_path / "notes.txt").write_text("clean\n", encoding="utf-8") + commit_all(tmp_path) + (tmp_path / "notes.txt").write_text("dirty before\n", encoding="utf-8") + + event = run_bridge_command(tmp_path, EditingRunner(tmp_path, {"notes.txt": "dirty after villani\n"})) + + assert event["changed_files"] == ["notes.txt"] + assert event["preexisting_dirty_files"] == ["notes.txt"] + + +def test_changed_files_change_then_revert_not_attributed(tmp_path: Path) -> None: + init_git_repo(tmp_path) + (tmp_path / "src.py").write_text("old\n", encoding="utf-8") + commit_all(tmp_path) + + event = run_bridge_command(tmp_path, EditingRunner(tmp_path, {"src.py": "old\n"})) + + assert event["changed_files"] == [] + assert event["preexisting_dirty_files"] == [] + + +def test_mode_runner_calls_run_and_villani_calls_run_villani(tmp_path: Path) -> None: + runner = EditingRunner(tmp_path, {}) + run_bridge_command(tmp_path, runner, mode="runner") + assert runner.run_calls == 1 + assert runner.villani_calls == 0 + + villani_runner = EditingRunner(tmp_path, {}) + run_bridge_command(tmp_path, villani_runner, mode="villani") + assert villani_runner.villani_calls == 1 diff --git a/villani_code/integrations/pi_bridge.py b/villani_code/integrations/pi_bridge.py index 40fa3202..b82a19e7 100644 --- a/villani_code/integrations/pi_bridge.py +++ b/villani_code/integrations/pi_bridge.py @@ -6,6 +6,7 @@ import sys import threading import traceback +import hashlib from dataclasses import dataclass, field from pathlib import Path from typing import Any, Callable, TextIO @@ -133,7 +134,10 @@ def _abort_run(self, run_id: str) -> None: def _run_worker(self, active: ActiveRun) -> None: command = active.command repo = str(Path(command.repo).resolve()) - before = git_changed_files(Path(repo)) + repo_path = Path(repo) + before_dirty = git_changed_files(repo_path) + before_dirty_hashes = hash_files(repo_path, before_dirty) + touched_files: set[str] = set() transcript_path: str | None = None verification_passed: bool | None = None latest_summary = "" @@ -154,6 +158,9 @@ def on_runner_event(event: dict[str, Any]) -> None: for mapped in map_runner_event(command.id, event): if mapped.get("type") == "verification_finished": verification_passed = bool(mapped.get("passed")) + if mapped.get("type") == "workspace_changed": + for changed_path in mapped.get("files", []): + touched_files.add(str(changed_path).replace("\\", "/")) self._events.put(mapped) if event.get("type") == "validation_completed": verification_passed = bool(event.get("passed")) @@ -166,8 +173,7 @@ def on_runner_event(event: dict[str, Any]) -> None: return result = run_existing_runner(runner, command) transcript_path = normalize_transcript_path(result) - changed = git_changed_files(Path(repo)) - changed_files = sorted(changed or before) + changed_files, preexisting_dirty_files = attributed_changed_files(repo_path, before_dirty, before_dirty_hashes, touched_files) if active.abort_requested.is_set(): self._events.put( { @@ -175,6 +181,8 @@ def on_runner_event(event: dict[str, Any]) -> None: "id": command.id, "success": False, "summary": "Aborted by caller after runner stopped", + "changed_files": changed_files, + "preexisting_dirty_files": preexisting_dirty_files, "transcript_path": transcript_path, } ) @@ -186,6 +194,7 @@ def on_runner_event(event: dict[str, Any]) -> None: "id": command.id, "success": True, "changed_files": changed_files, + "preexisting_dirty_files": preexisting_dirty_files, "verification_passed": verification_passed, "summary": summary, "transcript_path": transcript_path, @@ -199,6 +208,8 @@ def on_runner_event(event: dict[str, Any]) -> None: "success": False, "error": str(exc), "summary": "Villani bridge run failed.", + "changed_files": attributed_changed_files(Path(repo), before_dirty, before_dirty_hashes, touched_files)[0], + "preexisting_dirty_files": before_dirty, "transcript_path": transcript_path, } ) @@ -239,6 +250,7 @@ def build_default_runner(command: RunCommand, event_callback: Callable[[dict[str provider=provider, # type: ignore[arg-type] api_key=command.config.api_key or os.environ.get("VILLANI_API_KEY"), villani_mode=command.mode == "villani", + villani_objective=command.task if command.mode == "villani" else None, ) runner.event_callback = event_callback return runner @@ -254,10 +266,61 @@ def run_existing_runner(runner: Any, command: RunCommand) -> dict[str, Any]: max_no_edit_turns=VILLANI_TASK_BUDGET.max_no_edit_turns, max_reconsecutive_recon_turns=VILLANI_TASK_BUDGET.max_reconsecutive_recon_turns, ) - result = runner.run(command.task, execution_budget=budget) if budget is not None else runner.run(command.task) + if command.mode == "villani": + result = runner.run_villani_mode() + else: + result = runner.run(command.task, execution_budget=budget) if budget is not None else runner.run(command.task) return result if isinstance(result, dict) else {"response": result} +def hash_files(repo: Path, files: list[str]) -> dict[str, str | None]: + return {path: hash_file(repo / path) for path in files} + + +def hash_file(path: Path) -> str | None: + try: + if not path.exists() or not path.is_file(): + return None + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + except OSError: + return None + + +def attributed_changed_files( + repo: Path, + before_dirty: list[str], + before_dirty_hashes: dict[str, str | None], + touched_files: set[str], +) -> tuple[list[str], list[str]]: + if not is_git_repo(repo): + return sorted(path for path in touched_files if (repo / path).exists()), sorted(before_dirty) + after_dirty = set(git_changed_files(repo)) + before_dirty_set = set(before_dirty) + changed = set(after_dirty - before_dirty_set) + for path in before_dirty_set & after_dirty: + if hash_file(repo / path) != before_dirty_hashes.get(path): + changed.add(path) + for path in touched_files: + normalized = path.replace("\\", "/").lstrip("./") + if normalized in after_dirty: + previous_hash = before_dirty_hashes.get(normalized) + if normalized not in before_dirty_set or hash_file(repo / normalized) != previous_hash: + changed.add(normalized) + return sorted(changed), sorted(before_dirty_set) + + +def is_git_repo(repo: Path) -> bool: + try: + proc = subprocess.run(["git", "rev-parse", "--is-inside-work-tree"], cwd=repo, text=True, capture_output=True, timeout=10, check=False) + except Exception: + return False + return proc.returncode == 0 and proc.stdout.strip() == "true" + + def git_changed_files(repo: Path) -> list[str]: try: proc = subprocess.run( From 56dc06bca02c56a517292a08d57026a3da020425 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Fri, 29 May 2026 15:30:19 +1000 Subject: [PATCH 06/37] Fix Pi model proxy auth and cancellation --- integrations/pi-villani/README.md | 12 +- .../pi-villani/docs/pi-model-bridge.md | 6 +- integrations/pi-villani/src/extension.test.ts | 115 ++++++++-- integrations/pi-villani/src/index.ts | 99 +++++---- .../pi-villani/src/modelProxy.test.ts | 204 +++++++++++++----- integrations/pi-villani/src/modelProxy.ts | 81 ++++++- integrations/pi-villani/src/process.test.ts | 20 +- integrations/pi-villani/src/process.ts | 30 ++- 8 files changed, 437 insertions(+), 130 deletions(-) diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index a44c4402..ba1453b2 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -58,14 +58,14 @@ Default behavior: - `VILLANI_COMMAND` defaults to `villani-code`. - `VILLANI_MODE` defaults to `runner`, which maps to normal `Runner.run(task)` execution. - `VILLANI_MODE=villani` maps to the repository's autonomous `Runner.run_villani_mode()` path. -- Pi model reuse is enabled by default. The extension starts a temporary local proxy and passes that proxy URL to Villani as an OpenAI-compatible `base_url`. -- No Pi provider credentials or API keys are passed to the Villani subprocess in the Pi-model path. +- Pi model reuse is enabled by default. The extension resolves Pi-managed credentials and provider headers with `ctx.modelRegistry.getApiKeyAndHeaders(model)`, starts a temporary local proxy, and passes that proxy URL to Villani as an OpenAI-compatible `base_url`. +- Upstream Pi API keys/OAuth/provider headers remain inside the Node extension/proxy and are passed only to Pi AI requests, never to the Villani subprocess. Optional environment variables: | Variable | Meaning | | --- | --- | -| `VILLANI_COMMAND` | Override the Villani executable. Defaults to `villani-code`. | +| `VILLANI_COMMAND` | Override the Villani executable path/name. Defaults to `villani-code`. This is a single executable path, not a shell command. | | `VILLANI_MODE` | `runner` or `villani`. Defaults to `runner`. | | `VILLANI_USE_PI_MODEL` | Set to `false` to disable Pi-backed model reuse and use explicit Villani provider config. | | `VILLANI_PROVIDER` | Explicit fallback provider (`openai` or `anthropic`) when `VILLANI_USE_PI_MODEL=false`. | @@ -88,7 +88,7 @@ Windows PowerShell example: ```powershell $env:VILLANI_USE_PI_MODEL = "false" -$env:VILLANI_COMMAND = "villani-code" +$env:VILLANI_COMMAND = "C:\Program Files\Python\Scripts\villani-code.exe" $env:VILLANI_PROVIDER = "openai" $env:VILLANI_MODEL = "your-model" $env:VILLANI_BASE_URL = "http://127.0.0.1:1234" @@ -127,7 +127,7 @@ Transcript: .villani_code/runs/... ## Limitations -- `/villani-abort` sends a bridge abort request and then force-kills the subprocess after a short timeout if the runner does not stop. In-flight model/tool calls may not be interruptible until the current Villani operation returns. +- `/villani-abort` cancels startup and in-flight Pi model requests immediately via a per-run `AbortController`, sends a bridge abort request if the bridge exists, and force-kills the subprocess after a short timeout if the Python runner does not stop. Already-running Python child commands may not be interruptible until the current Villani operation returns. - The Pi proxy implements Villani's current OpenAI-compatible `/v1/chat/completions` path. It does not implement `/v1/messages` because the bridge points Villani at the proxy with `provider=openai`. - Streaming is compatibility streaming: the proxy calls Pi via `complete()` and emits the final response as one OpenAI SSE chunk plus `[DONE]`, not token-by-token streaming. - Non-git repositories use lower-confidence changed-file reporting based on Villani mutation events only. @@ -137,6 +137,8 @@ Transcript: .villani_code/runs/... - **`villani-code` not found:** install Villani Code in the environment Pi uses, or set `VILLANI_COMMAND` to the full executable path. - **Python environment mismatch:** run `villani-code bridge --stdio` in the same shell environment used to start Pi. - **No Pi model available:** select/configure a Pi model, or set `VILLANI_USE_PI_MODEL=false` and provide explicit Villani provider variables. +- **Pi auth resolution fails:** confirm the selected Pi model is logged in/configured; auth errors are sanitized before display. - **Bridge readiness timeout:** run `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio` and confirm it prints `ready` then `pong`. - **Proxy startup failure:** ensure no local security tool blocks binding to `127.0.0.1` on random ports. +- **Proxy upstream error:** the proxy returns a sanitized HTTP error to Villani instead of a fake empty completion; check Pi model/auth configuration. - **Smoke test:** from this checkout, run `cd integrations/pi-villani && npm install && npm test`, then `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio`. diff --git a/integrations/pi-villani/docs/pi-model-bridge.md b/integrations/pi-villani/docs/pi-model-bridge.md index d7ce9b0b..3bf96dc7 100644 --- a/integrations/pi-villani/docs/pi-model-bridge.md +++ b/integrations/pi-villani/docs/pi-model-bridge.md @@ -1,6 +1,6 @@ # Pi-backed model bridge -The Pi extension reuses Pi's active model by default through a temporary localhost OpenAI-compatible proxy. This avoids asking users to configure provider/model/base URL/API key twice. +The Pi extension reuses Pi's active model by default through a temporary localhost OpenAI-compatible proxy. It resolves Pi-managed API keys and provider headers with `ctx.modelRegistry.getApiKeyAndHeaders(model)` and passes them only into Pi AI calls inside the Node process. This avoids asking users to configure provider/model/base URL/API key twice and avoids exposing upstream credentials to the Python child. ```text Villani Runner OpenAIClient @@ -35,7 +35,7 @@ The proxy implements exactly that path. It translates: - The proxy binds to `127.0.0.1` only. - The OS chooses a random available port. - The proxy is stopped on success, failure, abort and subprocess startup failure. -- The Python child receives no Pi provider credentials. +- The Python child receives no Pi provider credentials: only the localhost proxy URL and neutral model id are sent through the bridge. ## Configuration precedence @@ -45,4 +45,4 @@ The proxy implements exactly that path. It translates: ## Streaming limitation -The current proxy uses `@earendil-works/pi-ai` `complete()` and emits the completed assistant response as a single OpenAI-compatible SSE chunk when Villani asks for streaming. This exercises Villani's streaming client path but does not provide token-by-token streaming. True token streaming can be added later by translating Pi `stream()` events to OpenAI SSE chunks. +The current proxy uses `@earendil-works/pi-ai` `complete()` and emits the completed assistant response as a single OpenAI-compatible SSE chunk when Villani asks for streaming. This exercises Villani's streaming client path but does not provide token-by-token streaming. If Pi returns `stopReason: "error"`, throws a provider/auth failure, or the per-run abort signal fires, the proxy returns an HTTP error instead of `[DONE]` or an empty successful completion. True token streaming can be added later by translating Pi `stream()` events to OpenAI SSE chunks. diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index 97099649..b8897a63 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -3,13 +3,15 @@ import { mkdtemp, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; +import type { Model } from "@earendil-works/pi-ai"; import villaniPiExtension from "./index.js"; import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent"; -async function mockAbortableBridge(): Promise { +async function mockNodeBridgeExecutable(exitAfterRun = false): Promise { const dir = await mkdtemp(join(tmpdir(), "villani-extension-")); - const path = join(dir, "bridge.mjs"); - await writeFile(path, ` + const executable = join(dir, process.platform === "win32" ? "villani-mock.cmd" : "villani-mock"); + const modulePath = join(dir, "bridge.mjs"); + await writeFile(modulePath, ` process.stdout.write('{"type":"ready","protocol_version":1}\\n'); process.stdin.setEncoding('utf8'); let buffer = ''; @@ -21,12 +23,20 @@ async function mockAbortableBridge(): Promise { const line = buffer.slice(0, idx); buffer = buffer.slice(idx + 1); if (!line.trim()) continue; const msg = JSON.parse(line); - if (msg.type === 'run') process.stdout.write(JSON.stringify({type:'run_started', id:msg.id, run_id:msg.id, task:msg.task, repo:msg.repo, mode:msg.mode}) + '\\n'); + if (msg.type === 'run') { + process.stdout.write(JSON.stringify({type:'run_started', id:msg.id, run_id:msg.id, task:msg.task, repo:msg.repo, mode:msg.mode}) + '\\n'); + if (${JSON.stringify(exitAfterRun)}) { process.stdout.write(JSON.stringify({type:'run_completed', id:msg.id, success:true, changed_files:[], preexisting_dirty_files:[], verification_passed:null, summary:'done', transcript_path:null}) + '\\n'); setTimeout(() => process.exit(0), 10); } + } if (msg.type === 'abort') { process.stdout.write(JSON.stringify({type:'run_aborted', id:msg.id, success:false, summary:'Aborted by test', changed_files:[], preexisting_dirty_files:[]}) + '\\n'); setTimeout(() => process.exit(0), 10); } } }); `, "utf8"); - return `${process.execPath} ${path}`; + if (process.platform === "win32") { + await writeFile(executable, `@echo off\n"${process.execPath}" "${modulePath}" %*\n`, "utf8"); + } else { + await writeFile(executable, `#!/usr/bin/env sh\nexec "${process.execPath}" "${modulePath}" "$@"\n`, { encoding: "utf8", mode: 0o755 }); + } + return executable; } function createHost() { @@ -39,11 +49,33 @@ function createHost() { return { api, commands }; } -function createContext(messages: string[]): ExtensionCommandContext { +function fakeModel(): Model { + return { + id: "pi-test", + name: "Pi Test", + api: "openai-completions", + provider: "pi", + baseUrl: "pi://current", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 4096, + } as Model; +} + +function createContext(messages: string[], options: { model?: Model; authDelayMs?: number; signal?: AbortSignal } = {}): ExtensionCommandContext { return { cwd: process.cwd(), - model: undefined, - signal: undefined, + model: options.model, + signal: options.signal, + modelRegistry: { + getApiKeyAndHeaders: async (model: Model) => { + if (options.authDelayMs) await new Promise((resolve) => setTimeout(resolve, options.authDelayMs)); + messages.push(`auth:${model.id}`); + return { ok: true, apiKey: "pi-secret", headers: { Authorization: "Bearer pi-token" } }; + }, + }, ui: { notify: (message: string) => messages.push(message), setStatus: (_key: string, text: string | undefined) => { if (text) messages.push(text); }, @@ -66,13 +98,13 @@ test("/villani-abort reports no active run", async () => { assert.match(messages.join("\n"), /No active Villani run/); }); -test("prevents overlapping runs and aborts active run", async () => { +test("prevents overlapping runs and aborts active bridge run", async () => { const oldCommand = process.env.VILLANI_COMMAND; const oldUsePi = process.env.VILLANI_USE_PI_MODEL; const oldProvider = process.env.VILLANI_PROVIDER; const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; - process.env.VILLANI_COMMAND = await mockAbortableBridge(); + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -89,15 +121,72 @@ test("prevents overlapping runs and aborts active run", async () => { await host.commands.get("villani-abort")!("", ctx); await runPromise; assert.match(messages.join("\n"), /Villani aborted/); + } finally { + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + } +}); + +test("Pi model path resolves model auth", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(true); + delete process.env.VILLANI_USE_PI_MODEL; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages, { model: fakeModel() })); + assert.equal(messages.includes("auth:pi-test"), true); + assert.match(messages.join("\n"), /Villani completed/); } finally { setOrDelete("VILLANI_COMMAND", oldCommand); setOrDelete("VILLANI_USE_PI_MODEL", oldUsePi); - setOrDelete("VILLANI_PROVIDER", oldProvider); - setOrDelete("VILLANI_MODEL", oldModel); - setOrDelete("VILLANI_BASE_URL", oldBase); } }); +test("explicit Villani config does not resolve Pi credentials", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(true); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages, { model: fakeModel() })); + assert.equal(messages.some((line) => line.startsWith("auth:")), false); + } finally { + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + } +}); + +test("abort during startup is recognized before bridge exists", async () => { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + const ctx = createContext(messages, { model: fakeModel(), authDelayMs: 500 }); + const runPromise = host.commands.get("villani")!("fix it", ctx); + await new Promise((resolve) => setTimeout(resolve, 50)); + await host.commands.get("villani-abort")!("", ctx); + await runPromise; + assert.doesNotMatch(messages.join("\n"), /No active Villani run/); + assert.match(messages.join("\n"), /cancelled/); +}); + +function restoreEnv(values: { oldCommand?: string; oldUsePi?: string; oldProvider?: string; oldModel?: string; oldBase?: string }): void { + setOrDelete("VILLANI_COMMAND", values.oldCommand); + setOrDelete("VILLANI_USE_PI_MODEL", values.oldUsePi); + setOrDelete("VILLANI_PROVIDER", values.oldProvider); + setOrDelete("VILLANI_MODEL", values.oldModel); + setOrDelete("VILLANI_BASE_URL", values.oldBase); +} + function setOrDelete(name: string, value: string | undefined): void { if (value === undefined) delete process.env[name]; else process.env[name] = value; diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index e9346e90..0b5fc5f6 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -6,10 +6,14 @@ import { startVillaniBridgeProcess, VillaniBridgeProcess } from "./process.js"; import { PiModelProxy } from "./modelProxy.js"; import { PiLikeOutput, renderEvent } from "./render.js"; +type ActiveRunPhase = "starting" | "running" | "aborting" | "completed"; + interface ActiveVillaniRun { id: string; repo: string; - bridge: VillaniBridgeProcess; + phase: ActiveRunPhase; + abortController: AbortController; + bridge?: VillaniBridgeProcess; proxy?: PiModelProxy; done: Promise; resolveDone: () => void; @@ -42,38 +46,45 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte const repo = ctx.cwd || process.cwd(); const runId = randomUUID(); - const explicitConfig = useExplicitVillaniConfig(); - const model = ctx.model as Model | undefined; - if (!explicitConfig && !model) { - output.error?.("No active Pi model is available for Villani. Select/configure a Pi model, or set VILLANI_USE_PI_MODEL=false with VILLANI_PROVIDER, VILLANI_MODEL, and VILLANI_BASE_URL."); - return; - } + const abortController = new AbortController(); + let resolveDone!: () => void; + const done = new Promise((resolve) => { resolveDone = resolve; }); + const run: ActiveVillaniRun = { id: runId, repo, phase: "starting", abortController, done, resolveDone }; + activeRun = run; - const proxy = !explicitConfig && model ? new PiModelProxy({ model, signal: ctx.signal }) : undefined; - let bridge: VillaniBridgeProcess | undefined; let finished = false; let resolveFinal!: () => void; const finalEvent = new Promise((resolve) => { resolveFinal = resolve; }); - let resolveDone!: () => void; - const done = new Promise((resolve) => { resolveDone = resolve; }); + ctx.signal?.addEventListener("abort", () => { + void abortActiveRun("Pi command cancellation requested"); + }, { once: true }); try { - const proxyUrl = proxy ? await proxy.start() : undefined; - bridge = await startVillaniBridgeProcess({ command: process.env.VILLANI_COMMAND, cwd: repo }); - activeRun = { id: runId, repo, bridge, proxy, done, resolveDone }; - bridge.onEvent((event: BridgeEvent) => { + const explicitConfig = useExplicitVillaniConfig(); + const model = ctx.model as Model | undefined; + if (!explicitConfig && !model) { + throw new Error("Villani could not start: no active Pi model is selected. Select a model in Pi, or set VILLANI_USE_PI_MODEL=false and configure Villani explicitly."); + } + if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); + + const auth = !explicitConfig && model ? await resolveModelAuth(ctx, model) : undefined; + if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); + + run.proxy = !explicitConfig && model ? new PiModelProxy({ model, apiKey: auth?.apiKey, headers: auth?.headers, signal: abortController.signal }) : undefined; + const proxyUrl = run.proxy ? await run.proxy.start() : undefined; + if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); + + run.bridge = await startVillaniBridgeProcess({ command: process.env.VILLANI_COMMAND, cwd: repo, signal: abortController.signal }); + run.phase = "running"; + run.bridge.onEvent((event: BridgeEvent) => { + if (abortController.signal.aborted && event.type === "run_completed") return; renderEvent(event, output); if (event.type === "run_completed" || event.type === "run_failed" || event.type === "run_aborted") { - finished = true; + finished = event.type === "run_completed"; resolveFinal(); } - if (event.type === "error") { - output.error?.(`Villani bridge error: ${event.error}`); - } + if (event.type === "error") output.error?.(`Villani bridge error: ${event.error}`); }); - ctx.signal?.addEventListener("abort", () => { - void abortActiveRun("Pi command cancellation requested"); - }, { once: true }); const command: RunCommand = { type: "run", @@ -83,21 +94,23 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte mode: (process.env.VILLANI_MODE as VillaniMode | undefined) || "runner", config: buildRunConfig(proxyUrl, model), }; - bridge.send(command); + run.bridge.send(command); await Promise.race([ finalEvent, - bridge.waitForExit().then((code) => { - if (!finished) throw new Error(`Villani bridge exited before a final event with code ${code}. ${bridge?.stderr() ?? ""}`.trim()); + run.bridge.waitForExit().then((code) => { + if (!finished && !abortController.signal.aborted) throw new Error(`Villani bridge exited before a final event with code ${code}. ${run.bridge?.stderr() ?? ""}`.trim()); }), ]); } catch (error) { - output.error?.(error instanceof Error ? error.message : String(error)); + if (abortController.signal.aborted) output.warn?.(!run.bridge ? "Villani run cancelled during startup." : "Villani run cancelled."); + else output.error?.(error instanceof Error ? error.message : String(error)); } finally { - if (!finished && bridge) { - try { bridge.abort(runId); } catch { /* ignore cleanup races */ } + run.phase = "completed"; + if (!finished && run.bridge && !abortController.signal.aborted) { + try { run.bridge.abort(runId); } catch { /* ignore cleanup races */ } } - bridge?.kill(); - await proxy?.stop(); + run.bridge?.kill(); + await run.proxy?.stop(); if (activeRun?.id === runId) activeRun = undefined; resolveDone(); } @@ -109,24 +122,32 @@ export async function abortVillaniRun(ctx: ExtensionCommandContext): Promise { const run = activeRun; if (!run) return; + run.phase = "aborting"; + run.abortController.abort(); try { - run.bridge.abort(run.id); + run.bridge?.abort(run.id); } catch { - run.bridge.kill(); + run.bridge?.kill(); } await Promise.race([ run.done, - new Promise((resolve) => setTimeout(resolve, 5_000)).then(() => run.bridge.kill()), + new Promise((resolve) => setTimeout(resolve, 5_000)).then(() => run.bridge?.kill()), ]); } +async function resolveModelAuth(ctx: ExtensionCommandContext, model: Model): Promise<{ apiKey?: string; headers?: Record }> { + const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model); + if (!auth.ok) throw new Error(`Villani could not resolve Pi model authentication: ${sanitizeErrorMessage(auth.error)}`); + return { apiKey: auth.apiKey, headers: auth.headers }; +} + function buildRunConfig(proxyUrl: string | undefined, model: Model | undefined): RunCommand["config"] { if (proxyUrl) { return { @@ -144,8 +165,7 @@ function buildRunConfig(proxyUrl: string | undefined, model: Model | und } function useExplicitVillaniConfig(): boolean { - if (String(process.env.VILLANI_USE_PI_MODEL ?? "").toLowerCase() === "false") return true; - return false; + return String(process.env.VILLANI_USE_PI_MODEL ?? "").toLowerCase() === "false"; } function uiOutput(ui: ExtensionUIContext): PiLikeOutput { @@ -157,6 +177,13 @@ function uiOutput(ui: ExtensionUIContext): PiLikeOutput { }; } +function sanitizeErrorMessage(message: string): string { + return message + .replace(/Bearer\s+[A-Za-z0-9._~+/=-]+/gi, "Bearer [redacted]") + .replace(/api[_-]?key[=:]\s*[^\s,;]+/gi, "api_key=[redacted]") + .slice(0, 500); +} + export function __getActiveRunForTests(): ActiveVillaniRun | undefined { return activeRun; } diff --git a/integrations/pi-villani/src/modelProxy.test.ts b/integrations/pi-villani/src/modelProxy.test.ts index e969715d..60bd4e1d 100644 --- a/integrations/pi-villani/src/modelProxy.test.ts +++ b/integrations/pi-villani/src/modelProxy.test.ts @@ -1,7 +1,35 @@ import assert from "node:assert/strict"; import test from "node:test"; -import type { AssistantMessage } from "@earendil-works/pi-ai"; -import { openAIChatToPiContext, piAssistantToOpenAIResponse } from "./modelProxy.js"; +import type { AssistantMessage, Model } from "@earendil-works/pi-ai"; +import { openAIChatToPiContext, PiModelProxy, piAssistantToOpenAIResponse } from "./modelProxy.js"; + +function fakeModel(): Model { + return { + id: "pi-test", + name: "Pi Test", + api: "openai-completions", + provider: "pi", + baseUrl: "pi://current", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 4096, + } as Model; +} + +function successMessage(text = "ok"): AssistantMessage { + return { + role: "assistant", + api: "openai-completions", + provider: "pi", + model: "pi-test", + content: [{ type: "text", text }], + usage: { input: 1, output: 2, cacheRead: 0, cacheWrite: 0, totalTokens: 3, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "stop", + timestamp: 1700000000000, + }; +} test("translates OpenAI chat payloads to Pi context", () => { const context = openAIChatToPiContext({ @@ -51,34 +79,36 @@ test("translates Pi assistant tool calls to OpenAI response", () => { assert.deepEqual(response.usage, { prompt_tokens: 3, completion_tokens: 4, total_tokens: 7 }); }); -import type { Model } from "@earendil-works/pi-ai"; -import { PiModelProxy } from "./modelProxy.js"; +test("proxy passes Pi auth options into completion call", async () => { + let seenOptions: any; + const proxy = new PiModelProxy({ + model: fakeModel(), + apiKey: "secret-api-key", + headers: { Authorization: "Bearer secret-token", "x-provider": "pi" }, + completeFn: async (_model, _context, options) => { + seenOptions = options; + return successMessage("auth ok"); + }, + }); + const url = await proxy.start(); + try { + const response = await fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", messages: [{ role: "user", content: "hello" }] }), + }); + assert.equal(response.status, 200); + assert.equal(seenOptions.apiKey, "secret-api-key"); + assert.deepEqual(seenOptions.headers, { Authorization: "Bearer secret-token", "x-provider": "pi" }); + } finally { + await proxy.stop(); + } +}); -test("proxy serves minimal OpenAI chat completions without credentials", async () => { - const model = { - id: "pi-test", - name: "Pi Test", - api: "openai-completions", - provider: "pi", - baseUrl: "pi://current", - reasoning: false, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 128000, - maxTokens: 4096, - } as Model; +test("proxy serves minimal OpenAI chat completions", async () => { const proxy = new PiModelProxy({ - model, - completeFn: async (_model, context) => ({ - role: "assistant", - api: "openai-completions", - provider: "pi", - model: "pi-test", - content: [{ type: "text", text: `saw ${context.messages.length} message` }], - usage: { input: 1, output: 2, cacheRead: 0, cacheWrite: 0, totalTokens: 3, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, - stopReason: "stop", - timestamp: 1700000000000, - }), + model: fakeModel(), + completeFn: async (_model, context) => successMessage(`saw ${context.messages.length} message`), }); const url = await proxy.start(); try { @@ -96,32 +126,104 @@ test("proxy serves minimal OpenAI chat completions without credentials", async ( } }); +test("proxy returns HTTP error for Pi assistant stopReason error", async () => { + const proxy = new PiModelProxy({ + model: fakeModel(), + completeFn: async () => ({ ...successMessage(""), content: [], stopReason: "error", errorMessage: "OpenAI API key is required. Bearer secret-token" }), + }); + const url = await proxy.start(); + try { + const response = await fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", messages: [{ role: "user", content: "hello" }] }), + }); + assert.equal(response.status, 502); + const body = await response.json() as any; + assert.match(body.error.message, /OpenAI API key is required/); + assert.doesNotMatch(body.error.message, /secret-token/); + assert.equal(body.error.type, "upstream_error"); + assert.equal(body.choices, undefined); + } finally { + await proxy.stop(); + } +}); + +test("proxy returns sanitized HTTP error for thrown provider failure", async () => { + const proxy = new PiModelProxy({ + model: fakeModel(), + completeFn: async () => { throw new Error("provider failed api_key=super-secret"); }, + }); + const url = await proxy.start(); + try { + const response = await fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", messages: [{ role: "user", content: "hello" }] }), + }); + assert.equal(response.status, 502); + const body = await response.json() as any; + assert.match(body.error.message, /provider failed/); + assert.doesNotMatch(body.error.message, /super-secret/); + } finally { + await proxy.stop(); + } +}); + +test("streaming failure does not emit normal completion", async () => { + const proxy = new PiModelProxy({ + model: fakeModel(), + completeFn: async () => ({ ...successMessage(""), content: [], stopReason: "error", errorMessage: "upstream down" }), + }); + const url = await proxy.start(); + try { + const response = await fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", stream: true, messages: [{ role: "user", content: "hello" }] }), + }); + assert.equal(response.status, 502); + const body = await response.text(); + assert.doesNotMatch(body, /\[DONE\]/); + assert.match(body, /upstream down/); + } finally { + await proxy.stop(); + } +}); + +test("proxy aborts in-flight Pi completion via signal", async () => { + const controller = new AbortController(); + let completeSignal: AbortSignal | undefined; + const proxy = new PiModelProxy({ + model: fakeModel(), + signal: controller.signal, + completeFn: async (_model, _context, options) => { + completeSignal = options?.signal; + await new Promise((resolve) => options?.signal?.addEventListener("abort", () => resolve(), { once: true })); + return { ...successMessage(""), content: [], stopReason: "aborted" }; + }, + }); + const url = await proxy.start(); + try { + const pending = fetch(`${url}/v1/chat/completions`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "pi-test", messages: [{ role: "user", content: "hello" }] }), + }); + await new Promise((resolve) => setTimeout(resolve, 50)); + controller.abort(); + const response = await pending; + assert.equal(completeSignal?.aborted, true); + assert.equal(response.status, 499); + } finally { + await proxy.stop(); + } +}); test("proxy serves Villani-compatible streaming chat completions", async () => { - const model = { - id: "pi-test", - name: "Pi Test", - api: "openai-completions", - provider: "pi", - baseUrl: "pi://current", - reasoning: false, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 128000, - maxTokens: 4096, - } as Model; const proxy = new PiModelProxy({ - model, - completeFn: async () => ({ - role: "assistant", - api: "openai-completions", - provider: "pi", - model: "pi-test", - content: [{ type: "text", text: "streamed final" }], - usage: { input: 1, output: 2, cacheRead: 0, cacheWrite: 0, totalTokens: 3, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, - stopReason: "stop", - timestamp: 1700000000000, - }), + model: fakeModel(), + completeFn: async () => successMessage("streamed final"), }); const url = await proxy.start(); try { diff --git a/integrations/pi-villani/src/modelProxy.ts b/integrations/pi-villani/src/modelProxy.ts index c26f3920..5172b1b3 100644 --- a/integrations/pi-villani/src/modelProxy.ts +++ b/integrations/pi-villani/src/modelProxy.ts @@ -31,6 +31,8 @@ export type PiCompleteFunction = (model: Model, context: Context, option export interface PiModelProxyOptions { model: Model; + apiKey?: string; + headers?: Record; signal?: AbortSignal; timeoutMs?: number; completeFn?: PiCompleteFunction; @@ -44,12 +46,21 @@ export class PiModelProxy { async start(): Promise { if (this.url) return this.url; + if (this.options.signal?.aborted) throw new Error("Pi model proxy startup aborted"); this.server = createServer((req, res) => { void this.handle(req, res); }); await new Promise((resolve, reject) => { + const abort = () => { + this.server?.close(); + reject(abortError()); + }; + this.options.signal?.addEventListener("abort", abort, { once: true }); this.server?.once("error", reject); - this.server?.listen(0, "127.0.0.1", () => resolve()); + this.server?.listen(0, "127.0.0.1", () => { + this.options.signal?.removeEventListener("abort", abort); + resolve(); + }); }); const address = this.server.address() as AddressInfo; this.url = `http://127.0.0.1:${address.port}`; @@ -69,27 +80,48 @@ export class PiModelProxy { private async handle(req: IncomingMessage, res: ServerResponse): Promise { try { if (req.method !== "POST" || !req.url?.startsWith("/v1/chat/completions")) { - writeJson(res, 404, { error: { message: "Pi Villani proxy only supports POST /v1/chat/completions" } }); + writeJson(res, 404, { error: { message: "Pi Villani proxy only supports POST /v1/chat/completions", type: "not_found" } }); return; } + if (this.options.signal?.aborted) throw abortError(); const payload = JSON.parse(await readBody(req)) as OpenAIChatCompletionRequest; const context = openAIChatToPiContext(payload); - const completeFn = this.options.completeFn ?? complete; - const assistant = await completeFn(this.options.model, context, { - maxTokens: payload.max_tokens, - temperature: payload.temperature, - signal: this.options.signal, - timeoutMs: this.options.timeoutMs, - }); + const assistant = await this.complete(context, payload); + if (this.options.signal?.aborted || assistant.stopReason === "aborted") throw abortError(); + if (assistant.stopReason === "error") { + throw new UpstreamModelError(assistant.errorMessage ?? "Pi model request failed"); + } if (payload.stream) { writeOpenAIStream(res, assistant); } else { writeJson(res, 200, piAssistantToOpenAIResponse(assistant)); } } catch (error) { - writeJson(res, 500, { error: { message: error instanceof Error ? error.message : String(error) } }); + writeProxyError(res, error); } } + + private complete(context: Context, payload: OpenAIChatCompletionRequest): Promise { + const completeFn = this.options.completeFn ?? complete; + return completeFn(this.options.model, context, { + apiKey: this.options.apiKey, + headers: this.options.headers, + maxTokens: payload.max_tokens, + temperature: payload.temperature, + signal: this.options.signal, + timeoutMs: this.options.timeoutMs, + }); + } +} + +class UpstreamModelError extends Error { + readonly status = 502; + readonly type = "upstream_error"; +} + +class AbortRequestError extends Error { + readonly status = 499; + readonly type = "aborted"; } export function openAIChatToPiContext(request: OpenAIChatCompletionRequest): Context { @@ -152,6 +184,10 @@ export function openAIChatToPiContext(request: OpenAIChatCompletionRequest): Con } export function piAssistantToOpenAIResponse(message: AssistantMessage): Record { + if (message.stopReason === "error") { + throw new UpstreamModelError(message.errorMessage ?? "Pi model request failed"); + } + if (message.stopReason === "aborted") throw abortError(); const text = message.content .filter((block) => block.type === "text") .map((block) => block.text) @@ -249,3 +285,28 @@ function writeJson(res: ServerResponse, status: number, body: unknown): void { res.writeHead(status, { "content-type": "application/json; charset=utf-8" }); res.end(JSON.stringify(body)); } + +function writeProxyError(res: ServerResponse, error: unknown): void { + const err = error as { status?: number; type?: string; message?: string; name?: string }; + const aborted = err.type === "aborted" || err.name === "AbortError"; + const status = aborted ? 499 : err.status ?? 502; + const type = aborted ? "aborted" : err.type ?? "upstream_error"; + const prefix = aborted ? "Pi model request was aborted" : "Villani model request failed through Pi"; + writeJson(res, status, { + error: { + message: `${prefix}: ${sanitizeErrorMessage(err.message ?? String(error))}`, + type, + }, + }); +} + +function abortError(): AbortRequestError { + return new AbortRequestError("request aborted"); +} + +function sanitizeErrorMessage(message: string): string { + return message + .replace(/Bearer\s+[A-Za-z0-9._~+/=-]+/gi, "Bearer [redacted]") + .replace(/api[_-]?key[=:]\s*[^\s,;]+/gi, "api_key=[redacted]") + .slice(0, 500); +} diff --git a/integrations/pi-villani/src/process.test.ts b/integrations/pi-villani/src/process.test.ts index 86003f09..6e7d14a6 100644 --- a/integrations/pi-villani/src/process.test.ts +++ b/integrations/pi-villani/src/process.test.ts @@ -3,15 +3,31 @@ import { mkdtemp, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; -import { VillaniBridgeProcess } from "./process.js"; +import { commandToSpec, DEFAULT_VILLANI_COMMAND, VillaniBridgeProcess } from "./process.js"; async function mockBridge(script: string): Promise { const dir = await mkdtemp(join(tmpdir(), "villani-bridge-")); + const executable = join(dir, process.platform === "win32" ? "bridge.cmd" : "bridge"); const path = join(dir, "bridge.mjs"); await writeFile(path, script, "utf8"); - return `${process.execPath} ${path}`; + if (process.platform === "win32") { + await writeFile(executable, `@echo off\n"${process.execPath}" "${path}" %*\n`, "utf8"); + } else { + await writeFile(executable, `#!/usr/bin/env sh\nexec "${process.execPath}" "${path}" "$@"\n`, { encoding: "utf8", mode: 0o755 }); + } + return executable; } +test("default command is villani-code", () => { + assert.equal(DEFAULT_VILLANI_COMMAND, "villani-code"); + assert.deepEqual(commandToSpec(""), { executable: "villani-code", args: [], display: "villani-code" }); +}); + +test("VILLANI_COMMAND path with spaces is treated as one executable", () => { + const command = "C:\\Program Files\\Python\\Scripts\\villani-code.exe"; + assert.deepEqual(commandToSpec(command), { executable: command, args: [], display: command }); +}); + test("reports missing executable without unhandled process error", async () => { const bridge = new VillaniBridgeProcess({ command: "definitely-not-real-villani-command", cwd: process.cwd(), readyTimeoutMs: 500 }); await assert.rejects(bridge.waitUntilReady(), /executable was not found/); diff --git a/integrations/pi-villani/src/process.ts b/integrations/pi-villani/src/process.ts index 86034b80..fa72f1a5 100644 --- a/integrations/pi-villani/src/process.ts +++ b/integrations/pi-villani/src/process.ts @@ -9,9 +9,10 @@ export interface BridgeProcessOptions { cwd: string; readyTimeoutMs?: number; env?: NodeJS.ProcessEnv; + signal?: AbortSignal; } -interface CommandSpec { +export interface CommandSpec { executable: string; args: string[]; display: string; @@ -33,7 +34,8 @@ export class VillaniBridgeProcess { constructor(options: BridgeProcessOptions & { spec?: CommandSpec }) { const spec = options.spec ?? commandToSpec(options.command ?? DEFAULT_VILLANI_COMMAND); - this.child = spawn(spec.executable, [...spec.args, "bridge", "--stdio"], { + const args = [...spec.args, "bridge", "--stdio"]; + this.child = spawn(spec.executable, args, { cwd: options.cwd, env: { ...process.env, ...options.env }, shell: false, @@ -80,6 +82,13 @@ export class VillaniBridgeProcess { }); }); + const onAbort = () => { + this.rejectStartup(new Error("Villani bridge startup aborted.")); + this.kill(); + }; + if (options.signal?.aborted) onAbort(); + else options.signal?.addEventListener("abort", onAbort, { once: true }); + const timeoutMs = options.readyTimeoutMs ?? 15_000; const timer = setTimeout(() => { if (!this.startupSettled) { @@ -87,7 +96,13 @@ export class VillaniBridgeProcess { this.kill(); } }, timeoutMs); - this.readyPromise.finally(() => clearTimeout(timer)).catch(() => clearTimeout(timer)); + this.readyPromise.finally(() => { + clearTimeout(timer); + options.signal?.removeEventListener("abort", onAbort); + }).catch(() => { + clearTimeout(timer); + options.signal?.removeEventListener("abort", onAbort); + }); } onEvent(listener: (event: BridgeEvent) => void): void { @@ -192,13 +207,8 @@ export async function startVillaniBridgeProcess(options: BridgeProcessOptions): export function commandToSpec(command: string): CommandSpec { const trimmed = command.trim(); - if (!trimmed) return { executable: DEFAULT_VILLANI_COMMAND, args: [], display: DEFAULT_VILLANI_COMMAND }; - if (trimmed.startsWith("python -m ")) { - const [, , moduleName, ...rest] = trimmed.split(/\s+/); - return { executable: "python", args: ["-m", moduleName, ...rest], display: trimmed }; - } - const parts = trimmed.split(/\s+/); - return { executable: parts[0], args: parts.slice(1), display: trimmed }; + const executable = trimmed || DEFAULT_VILLANI_COMMAND; + return { executable, args: [], display: executable }; } function formatSpawnError(error: NodeJS.ErrnoException, display: string): Error { From 2dafced7d9d988596da019ca3f041909e72e8da5 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Fri, 29 May 2026 21:25:48 +1000 Subject: [PATCH 07/37] Add Pi approval round trip --- integrations/pi-villani/README.md | 15 +- .../pi-villani/docs/pi-model-bridge.md | 5 + integrations/pi-villani/src/extension.test.ts | 189 +++++++++++++++++- integrations/pi-villani/src/index.ts | 68 ++++++- integrations/pi-villani/src/process.ts | 7 +- integrations/pi-villani/src/protocol.ts | 11 +- tests/integrations/test_pi_bridge.py | 170 +++++++++++++++- villani_code/integrations/pi_bridge.py | 147 +++++++++++++- .../integrations/pi_bridge_protocol.py | 19 ++ villani_code/state_tooling.py | 2 +- 10 files changed, 621 insertions(+), 12 deletions(-) diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index ba1453b2..52ccec50 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -51,6 +51,8 @@ pi -e ./integrations/pi-villani/dist/index.js Only one Villani run is allowed per Pi extension instance at a time. If a run is active, a second `/villani` command is rejected with a message telling you to wait or run `/villani-abort`. +When Villani's existing permission policy classifies an operation as requiring approval, Pi asks before the operation executes. Approvals are per operation and are not remembered across runs. + ## Defaults and configuration Default behavior: @@ -117,17 +119,23 @@ Verification passed: true Transcript: .villani_code/runs/... ``` -## Safety +## Safety and approvals - Villani operates in the current repository and may edit files and run verification commands through its normal permission/sandbox path. +- The Pi bridge honours Villani's existing permission classifier: `ALLOW` operations run automatically, `ASK` operations prompt through Pi before execution, and `DENY` operations do not execute. +- The default Pi integration does not silently approve file writes, patches, or shell commands that Villani classifies as requiring approval. +- Approval prompts show concise operation context: write/patch requests show the affected path, and Bash requests show the command being requested. Large file contents and patches are not dumped into the prompt. +- Rejecting an approval returns a normal denied-tool result to Villani; Villani may continue or fail according to its existing runner behavior. +- `/villani-abort` cancels a run even while an approval decision is pending; pending approvals are resolved as denied. - Pre-existing dirty files are reported separately from files changed by Villani. - The Pi model proxy binds only to `127.0.0.1`, uses a random available port, and exists only for the active `/villani` run. -- Pi credentials stay in Pi; the Python child receives only a localhost proxy URL in the default path. +- Pi credentials stay in Pi; the Python child receives only a localhost proxy URL in the default path. Model credentials are unrelated to tool approvals and are never shown in approval prompts. - Pi packages execute with normal user permissions. Review source before installing third-party packages. ## Limitations -- `/villani-abort` cancels startup and in-flight Pi model requests immediately via a per-run `AbortController`, sends a bridge abort request if the bridge exists, and force-kills the subprocess after a short timeout if the Python runner does not stop. Already-running Python child commands may not be interruptible until the current Villani operation returns. +- `/villani-abort` cancels startup, pending approval prompts, and in-flight Pi model requests immediately via a per-run `AbortController`, sends a bridge abort request if the bridge exists, and force-kills the subprocess after a short timeout if the Python runner does not stop. Already-running Python child commands may not be interruptible until the current Villani operation returns. +- Non-interactive Pi contexts without a usable confirmation UI deny approval-required operations by default rather than auto-approving them. - The Pi proxy implements Villani's current OpenAI-compatible `/v1/chat/completions` path. It does not implement `/v1/messages` because the bridge points Villani at the proxy with `provider=openai`. - Streaming is compatibility streaming: the proxy calls Pi via `complete()` and emits the final response as one OpenAI SSE chunk plus `[DONE]`, not token-by-token streaming. - Non-git repositories use lower-confidence changed-file reporting based on Villani mutation events only. @@ -141,4 +149,5 @@ Transcript: .villani_code/runs/... - **Bridge readiness timeout:** run `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio` and confirm it prints `ready` then `pong`. - **Proxy startup failure:** ensure no local security tool blocks binding to `127.0.0.1` on random ports. - **Proxy upstream error:** the proxy returns a sanitized HTTP error to Villani instead of a fake empty completion; check Pi model/auth configuration. +- **Approval prompt unavailable:** in headless/non-interactive contexts, approval-required operations are denied for safety. Run Pi interactively or provide an explicit test approval handler. - **Smoke test:** from this checkout, run `cd integrations/pi-villani && npm install && npm test`, then `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio`. diff --git a/integrations/pi-villani/docs/pi-model-bridge.md b/integrations/pi-villani/docs/pi-model-bridge.md index 3bf96dc7..9d2e4fac 100644 --- a/integrations/pi-villani/docs/pi-model-bridge.md +++ b/integrations/pi-villani/docs/pi-model-bridge.md @@ -46,3 +46,8 @@ The proxy implements exactly that path. It translates: ## Streaming limitation The current proxy uses `@earendil-works/pi-ai` `complete()` and emits the completed assistant response as a single OpenAI-compatible SSE chunk when Villani asks for streaming. This exercises Villani's streaming client path but does not provide token-by-token streaming. If Pi returns `stopReason: "error"`, throws a provider/auth failure, or the per-run abort signal fires, the proxy returns an HTTP error instead of `[DONE]` or an empty successful completion. True token streaming can be added later by translating Pi `stream()` events to OpenAI SSE chunks. + + +## Permission boundary + +The model proxy is separate from tool approval. Pi-managed model credentials stay inside the proxy, while tool permissions are enforced by Villani's Python runner and bridged back to Pi with `approval_required` / `approval_response` JSONL messages. The proxy never grants file or shell permissions, and approval prompts never include provider API keys or OAuth headers. diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index b8897a63..78c8700b 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -4,7 +4,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; import type { Model } from "@earendil-works/pi-ai"; -import villaniPiExtension from "./index.js"; +import villaniPiExtension, { __setApprovalPrompterForTests } from "./index.js"; import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent"; async function mockNodeBridgeExecutable(exitAfterRun = false): Promise { @@ -25,8 +25,30 @@ async function mockNodeBridgeExecutable(exitAfterRun = false): Promise { const msg = JSON.parse(line); if (msg.type === 'run') { process.stdout.write(JSON.stringify({type:'run_started', id:msg.id, run_id:msg.id, task:msg.task, repo:msg.repo, mode:msg.mode}) + '\\n'); + if (process.env.MOCK_APPROVAL === '1') { + process.stdout.write(JSON.stringify({type:'approval_required', id:msg.id, request_id:'approval-1', tool:'Write', summary:'Write file: safe-test.txt', input:{path:'safe-test.txt'}}) + '\\n'); + continue; + } + if (process.env.MOCK_APPROVAL === '2') { + process.stdout.write(JSON.stringify({type:'approval_required', id:msg.id, request_id:'approval-1', tool:'Write', summary:'Write file: one.txt', input:{path:'one.txt'}}) + '\\n'); + continue; + } + if (process.env.MOCK_APPROVAL === 'BASH') { + process.stdout.write(JSON.stringify({type:'approval_required', id:msg.id, request_id:'approval-bash', tool:'Bash', summary:'Run command: pip install package-name', input:{command:'pip install package-name'}}) + '\\n'); + continue; + } if (${JSON.stringify(exitAfterRun)}) { process.stdout.write(JSON.stringify({type:'run_completed', id:msg.id, success:true, changed_files:[], preexisting_dirty_files:[], verification_passed:null, summary:'done', transcript_path:null}) + '\\n'); setTimeout(() => process.exit(0), 10); } } + if (msg.type === 'approval_response') { + process.stdout.write(JSON.stringify({type:'approval_resolved', id:msg.id, request_id:msg.request_id, tool: msg.request_id === 'approval-2' ? 'Patch' : 'Write', approved:msg.approved}) + '\\n'); + if (process.env.MOCK_APPROVAL === '2' && msg.request_id === 'approval-1') { + process.stdout.write(JSON.stringify({type:'approval_required', id:msg.id, request_id:'approval-2', tool:'Patch', summary:'Apply patch to: two.txt', input:{path:'two.txt'}}) + '\\n'); + process.env.MOCK_APPROVAL = 'DONE'; + continue; + } + process.stdout.write(JSON.stringify({type:'run_completed', id:msg.id, success:true, changed_files:[], preexisting_dirty_files:[], verification_passed:null, summary:'done', transcript_path:null}) + '\\n'); + setTimeout(() => process.exit(0), 10); + } if (msg.type === 'abort') { process.stdout.write(JSON.stringify({type:'run_aborted', id:msg.id, success:false, summary:'Aborted by test', changed_files:[], preexisting_dirty_files:[]}) + '\\n'); setTimeout(() => process.exit(0), 10); } } }); @@ -76,8 +98,10 @@ function createContext(messages: string[], options: { model?: Model; aut return { ok: true, apiKey: "pi-secret", headers: { Authorization: "Bearer pi-token" } }; }, }, + hasUI: true, ui: { notify: (message: string) => messages.push(message), + confirm: async (title: string, message: string) => { messages.push(`confirm:${title}:${message}`); return false; }, setStatus: (_key: string, text: string | undefined) => { if (text) messages.push(text); }, }, } as unknown as ExtensionCommandContext; @@ -191,3 +215,166 @@ function setOrDelete(name: string, value: string | undefined): void { if (value === undefined) delete process.env[name]; else process.env[name] = value; } + + +test("approval event is confirmed and answered", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + const restorePrompt = __setApprovalPrompterForTests(async (request) => { + assert.equal(request.request_id, "approval-1"); + assert.equal(request.input.path, "safe-test.txt"); + return true; + }); + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "1"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages)); + assert.match(messages.join("\n"), /Approved Villani Write request/); + assert.match(messages.join("\n"), /approval_resolved|Villani completed/); + } finally { + restorePrompt(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); + +test("rejected approval and UI failure default to denial", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "1"; + try { + let restorePrompt = __setApprovalPrompterForTests(async () => false); + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages)); + restorePrompt(); + assert.match(messages.join("\n"), /Denied Villani Write request/); + + restorePrompt = __setApprovalPrompterForTests(async () => { throw new Error("dialog missing"); }); + const host2 = createHost(); + const messages2: string[] = []; + villaniPiExtension(host2.api); + await host2.commands.get("villani")!("fix it", createContext(messages2)); + restorePrompt(); + assert.match(messages2.join("\n"), /Approval UI unavailable/); + assert.match(messages2.join("\n"), /Denied Villani Write request/); + } finally { + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); + +test("approval prompt content includes path or command", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "BASH"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages)); + assert.match(messages.join("\n"), /confirm:Villani wants to run a shell command/); + assert.match(messages.join("\n"), /pip install package-name/); + assert.doesNotMatch(messages.join("\n"), /pi-secret|pi-token/); + } finally { + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); + +test("abort during pending approval sends denial and abort", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + let unblock!: (value: boolean) => void; + const restorePrompt = __setApprovalPrompterForTests(async () => new Promise((resolve) => { unblock = resolve; })); + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "1"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + const ctx = createContext(messages); + const runPromise = host.commands.get("villani")!("fix it", ctx); + await new Promise((resolve) => setTimeout(resolve, 250)); + await host.commands.get("villani-abort")!("", ctx); + unblock(true); + await runPromise; + assert.match(messages.join("\n"), /Villani aborted|cancelled/); + assert.doesNotMatch(messages.join("\n"), /Approved Villani Write request/); + } finally { + restorePrompt(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); + +test("multiple sequential approvals keep request ids distinct", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + const seen: string[] = []; + const restorePrompt = __setApprovalPrompterForTests(async (request) => { + seen.push(request.request_id); + return request.request_id === "approval-1"; + }); + process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "2"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages)); + assert.deepEqual(seen, ["approval-1", "approval-2"]); + assert.match(messages.join("\n"), /Approved Villani Write request/); + assert.match(messages.join("\n"), /Denied Villani Patch request/); + } finally { + restorePrompt(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index 0b5fc5f6..0bdf5d5d 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -15,10 +15,15 @@ interface ActiveVillaniRun { abortController: AbortController; bridge?: VillaniBridgeProcess; proxy?: PiModelProxy; + pendingApprovals: Set; done: Promise; resolveDone: () => void; } +export type ApprovalPrompter = (request: Extract, ctx: ExtensionCommandContext, signal: AbortSignal) => Promise; + +let approvalPrompter: ApprovalPrompter = askUserForApproval; + let activeRun: ActiveVillaniRun | undefined; export default function villaniPiExtension(pi: ExtensionAPI): void { @@ -49,7 +54,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte const abortController = new AbortController(); let resolveDone!: () => void; const done = new Promise((resolve) => { resolveDone = resolve; }); - const run: ActiveVillaniRun = { id: runId, repo, phase: "starting", abortController, done, resolveDone }; + const run: ActiveVillaniRun = { id: runId, repo, phase: "starting", abortController, pendingApprovals: new Set(), done, resolveDone }; activeRun = run; let finished = false; @@ -78,6 +83,10 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte run.phase = "running"; run.bridge.onEvent((event: BridgeEvent) => { if (abortController.signal.aborted && event.type === "run_completed") return; + if (event.type === "approval_required") { + void handleApprovalRequired(run, event, ctx, output); + return; + } renderEvent(event, output); if (event.type === "run_completed" || event.type === "run_failed" || event.type === "run_aborted") { finished = event.type === "run_completed"; @@ -131,6 +140,10 @@ async function abortActiveRun(_reason: string): Promise { if (!run) return; run.phase = "aborting"; run.abortController.abort(); + for (const requestId of Array.from(run.pendingApprovals)) { + try { run.bridge?.respondToApproval(run.id, requestId, false); } catch { /* bridge may already be closed */ } + run.pendingApprovals.delete(requestId); + } try { run.bridge?.abort(run.id); } catch { @@ -142,6 +155,59 @@ async function abortActiveRun(_reason: string): Promise { ]); } +async function handleApprovalRequired( + run: ActiveVillaniRun, + event: Extract, + ctx: ExtensionCommandContext, + output: PiLikeOutput, +): Promise { + run.pendingApprovals.add(event.request_id); + let approved = false; + try { + approved = !run.abortController.signal.aborted && await approvalPrompter(event, ctx, run.abortController.signal); + } catch { + approved = false; + output.warn?.(`Approval UI unavailable; denied ${event.tool} request.`); + } + const stillPending = run.pendingApprovals.delete(event.request_id); + if (!stillPending) return; + if (run.abortController.signal.aborted || activeRun?.id !== run.id) approved = false; + try { + run.bridge?.respondToApproval(run.id, event.request_id, approved); + output.warn?.(`${approved ? "Approved" : "Denied"} Villani ${event.tool} request: ${event.summary}`); + } catch { + if (!run.abortController.signal.aborted) output.warn?.(`Could not send approval response for ${event.tool}; bridge is no longer available.`); + } +} + +async function askUserForApproval(request: Extract, ctx: ExtensionCommandContext, signal: AbortSignal): Promise { + if (!ctx.hasUI || typeof ctx.ui.confirm !== "function") return false; + return ctx.ui.confirm(approvalTitle(request), approvalMessage(request), { signal }); +} + +function approvalTitle(request: Extract): string { + if (request.tool === "Write") return "Villani wants to write a file"; + if (request.tool === "Patch") return "Villani wants to apply a patch"; + if (request.tool === "Bash") return "Villani wants to run a shell command"; + return `Villani wants approval for ${request.tool}`; +} + +function approvalMessage(request: Extract): string { + const path = typeof request.input.path === "string" ? request.input.path : undefined; + const command = typeof request.input.command === "string" ? request.input.command : undefined; + const lines = [request.summary, ""]; + if (path) lines.push(`File: ${path}`, ""); + if (command) lines.push("Command:", command, ""); + lines.push("Allow this operation?"); + return lines.join("\n"); +} + +export function __setApprovalPrompterForTests(prompter: ApprovalPrompter): () => void { + const previous = approvalPrompter; + approvalPrompter = prompter; + return () => { approvalPrompter = previous; }; +} + async function resolveModelAuth(ctx: ExtensionCommandContext, model: Model): Promise<{ apiKey?: string; headers?: Record }> { const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model); if (!auth.ok) throw new Error(`Villani could not resolve Pi model authentication: ${sanitizeErrorMessage(auth.error)}`); diff --git a/integrations/pi-villani/src/process.ts b/integrations/pi-villani/src/process.ts index fa72f1a5..57987c44 100644 --- a/integrations/pi-villani/src/process.ts +++ b/integrations/pi-villani/src/process.ts @@ -1,6 +1,6 @@ import { ChildProcessWithoutNullStreams, spawn } from "node:child_process"; import { StringDecoder } from "node:string_decoder"; -import { AbortCommand, BridgeCommand, BridgeEvent, commandToLine } from "./protocol.js"; +import { AbortCommand, ApprovalResponseCommand, BridgeCommand, BridgeEvent, commandToLine } from "./protocol.js"; export const DEFAULT_VILLANI_COMMAND = "villani-code"; @@ -129,6 +129,11 @@ export class VillaniBridgeProcess { this.send(command); } + respondToApproval(runId: string, requestId: string, approved: boolean): void { + const command: ApprovalResponseCommand = { type: "approval_response", id: runId, request_id: requestId, approved }; + this.send(command); + } + kill(): void { if (!this.closed) this.child.kill(); } diff --git a/integrations/pi-villani/src/protocol.ts b/integrations/pi-villani/src/protocol.ts index d03ac847..b89a8a6d 100644 --- a/integrations/pi-villani/src/protocol.ts +++ b/integrations/pi-villani/src/protocol.ts @@ -33,7 +33,14 @@ export interface AbortCommand { id: string; } -export type BridgeCommand = PingCommand | RunCommand | AbortCommand; +export interface ApprovalResponseCommand { + type: "approval_response"; + id: string; + request_id: string; + approved: boolean; +} + +export type BridgeCommand = PingCommand | RunCommand | AbortCommand | ApprovalResponseCommand; export type BridgeEvent = | { type: "ready"; protocol_version: number } @@ -47,6 +54,8 @@ export type BridgeEvent = | { type: "verification_finished"; id: string; command: string; passed: boolean; summary: string } | { type: "governor_redirect"; id: string; message: string } | { type: "abort_requested"; id: string } + | { type: "approval_required"; id: string; request_id: string; tool: string; summary: string; input: Record } + | { type: "approval_resolved"; id: string; request_id: string; tool: string; approved: boolean } | { type: "run_completed"; id: string; success: true; changed_files: string[]; preexisting_dirty_files?: string[]; verification_passed: boolean | null; summary: string; transcript_path?: string | null } | { type: "run_failed"; id: string; success: false; error: string; summary: string; changed_files?: string[]; preexisting_dirty_files?: string[]; transcript_path?: string | null } | { type: "run_aborted"; id: string; success: false; summary: string; changed_files?: string[]; preexisting_dirty_files?: string[]; transcript_path?: string | null } diff --git a/tests/integrations/test_pi_bridge.py b/tests/integrations/test_pi_bridge.py index 825976ff..4aa39c5a 100644 --- a/tests/integrations/test_pi_bridge.py +++ b/tests/integrations/test_pi_bridge.py @@ -7,7 +7,7 @@ from pathlib import Path from typing import Any -from villani_code.integrations.pi_bridge import PiBridge, map_runner_event +from villani_code.integrations.pi_bridge import PiBridge, map_runner_event, summarize_approval_request class DummyRunner: @@ -279,3 +279,171 @@ def test_mode_runner_calls_run_and_villani_calls_run_villani(tmp_path: Path) -> villani_runner = EditingRunner(tmp_path, {}) run_bridge_command(tmp_path, villani_runner, mode="villani") assert villani_runner.villani_calls == 1 + + +class ApprovalRunner(DummyRunner): + def __init__(self, repo: Path, tool: str, payload: dict[str, Any]) -> None: + super().__init__() + self.repo = repo + self.tool = tool + self.payload = payload + self.approval_callback = lambda _name, _input: False + self.executed = threading.Event() + self.denied = threading.Event() + + def run(self, instruction: str, **_kwargs: Any) -> dict[str, Any]: + approved = self.approval_callback(self.tool, self.payload) + self.event_callback({"type": "approval_resolved", "name": self.tool, "input": self.payload, "approved": approved}) + if not approved: + self.denied.set() + return {"response": {"content": [{"type": "text", "text": "Denied."}]}, "execution": {"final_text": "Denied."}} + if self.tool == "Bash": + marker = self.repo / "bash-ran.txt" + marker.write_text(str(self.payload.get("command", "")), encoding="utf-8") + else: + path = self.payload.get("path") or self.payload.get("file_path") + if path: + target = self.repo / str(path) + target.parent.mkdir(parents=True, exist_ok=True) + target.write_text(str(self.payload.get("content", "approved")), encoding="utf-8") + self.event_callback({"type": "tool_finished", "name": self.tool, "input": self.payload, "is_error": False}) + self.executed.set() + return self.result + + +def start_approval_bridge(repo: Path, runner: ApprovalRunner) -> tuple[PiBridge, io.StringIO]: + stdout = io.StringIO() + + def factory(_command: Any, event_callback: Any) -> ApprovalRunner: + runner.event_callback = event_callback + return runner + + bridge = PiBridge(stdout=stdout, runner_factory=factory) + bridge._handle_command({"type": "run", "id": "run-approval", "task": "Fix", "repo": str(repo), "mode": "runner"}) + return bridge, stdout + + +def wait_for_event(bridge: PiBridge, output: io.StringIO, event_type: str, timeout: float = 2) -> dict[str, Any]: + deadline = time.time() + timeout + while time.time() < deadline: + bridge._drain_events() + events = collect_json_lines(output) + for event in events: + if event.get("type") == event_type: + return event + time.sleep(0.01) + raise AssertionError(f"timed out waiting for {event_type}; saw {collect_json_lines(output)}") + + +def finish_bridge(bridge: PiBridge, timeout: float = 2) -> None: + deadline = time.time() + timeout + while bridge._active and time.time() < deadline: + time.sleep(0.01) + bridge._drain_events() + + +def test_approval_required_write_blocks_until_approved(tmp_path: Path) -> None: + runner = ApprovalRunner(tmp_path, "Write", {"path": "src/foo.py", "content": "approved"}) + bridge, stdout = start_approval_bridge(tmp_path, runner) + + approval = wait_for_event(bridge, stdout, "approval_required") + assert approval["id"] == "run-approval" + assert approval["tool"] == "Write" + assert approval["input"] == {"path": "src/foo.py", "content_chars": 8} + assert "src/foo.py" in approval["summary"] + assert not (tmp_path / "src/foo.py").exists() + + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": approval["request_id"], "approved": True}) + finish_bridge(bridge) + + assert runner.executed.is_set() + assert (tmp_path / "src/foo.py").read_text(encoding="utf-8") == "approved" + events = collect_json_lines(stdout) + assert any(event["type"] == "approval_resolved" and event["approved"] is True for event in events) + assert events[-1]["type"] == "run_completed" + assert events[-1]["changed_files"] == ["src/foo.py"] + + +def test_rejected_write_is_blocked(tmp_path: Path) -> None: + runner = ApprovalRunner(tmp_path, "Write", {"path": "blocked.txt", "content": "nope"}) + bridge, stdout = start_approval_bridge(tmp_path, runner) + + approval = wait_for_event(bridge, stdout, "approval_required") + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": approval["request_id"], "approved": False}) + finish_bridge(bridge) + + assert runner.denied.is_set() + assert not runner.executed.is_set() + assert not (tmp_path / "blocked.txt").exists() + events = collect_json_lines(stdout) + assert any(event["type"] == "approval_resolved" and event["approved"] is False for event in events) + assert events[-1]["changed_files"] == [] + + +def test_bash_approval_shows_command_and_blocks_execution(tmp_path: Path) -> None: + command = "pip install package-name" + runner = ApprovalRunner(tmp_path, "Bash", {"command": command}) + bridge, stdout = start_approval_bridge(tmp_path, runner) + + approval = wait_for_event(bridge, stdout, "approval_required") + assert approval["tool"] == "Bash" + assert approval["input"] == {"command": command} + assert command in approval["summary"] + assert not (tmp_path / "bash-ran.txt").exists() + + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": approval["request_id"], "approved": True}) + finish_bridge(bridge) + + assert runner.executed.is_set() + assert (tmp_path / "bash-ran.txt").read_text(encoding="utf-8") == command + + +def test_abort_while_approval_pending_denies_and_aborts(tmp_path: Path) -> None: + runner = ApprovalRunner(tmp_path, "Write", {"path": "abort.txt", "content": "no"}) + bridge, stdout = start_approval_bridge(tmp_path, runner) + + wait_for_event(bridge, stdout, "approval_required") + bridge._handle_command({"type": "abort", "id": "run-approval"}) + finish_bridge(bridge) + + assert runner.denied.is_set() + assert not runner.executed.is_set() + assert not (tmp_path / "abort.txt").exists() + events = collect_json_lines(stdout) + assert any(event["type"] == "abort_requested" for event in events) + assert events[-1]["type"] == "run_aborted" + + +def test_unknown_duplicate_and_malformed_approval_responses_are_safe(tmp_path: Path) -> None: + runner = ApprovalRunner(tmp_path, "Write", {"path": "once.txt", "content": "once"}) + bridge, stdout = start_approval_bridge(tmp_path, runner) + approval = wait_for_event(bridge, stdout, "approval_required") + + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": "missing", "approved": True}) + assert collect_json_lines(stdout)[-1]["type"] == "error" + + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": approval["request_id"], "approved": True}) + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": approval["request_id"], "approved": False}) + finish_bridge(bridge) + + assert (tmp_path / "once.txt").read_text(encoding="utf-8") == "once" + events = collect_json_lines(stdout) + assert sum(1 for event in events if event.get("type") == "approval_resolved" and event.get("request_id") == approval["request_id"]) == 1 + assert any(event["type"] == "error" and "Unknown approval request" in event["error"] for event in events) + + try: + bridge._handle_command({"type": "approval_response", "id": "run-approval", "request_id": "x", "approved": "yes"}) + except ValueError as exc: + bridge.emit({"type": "error", "error": str(exc)}) + assert "requires boolean approved" in collect_json_lines(stdout)[-1]["error"] + + +def test_approval_request_summary_is_bounded() -> None: + summary, safe_input = summarize_approval_request("Write", {"path": "a.py", "content": "x" * 5000}) + assert summary == "Write file: a.py" + assert safe_input == {"path": "a.py", "content_chars": 5000} + + bash_summary, bash_input = summarize_approval_request("Bash", {"command": "x" * 3000}) + assert len(bash_input["command"]) == 2000 + assert bash_input["command"].endswith("…") + assert bash_summary.startswith("Run command: ") diff --git a/villani_code/integrations/pi_bridge.py b/villani_code/integrations/pi_bridge.py index b82a19e7..e84fc4f7 100644 --- a/villani_code/integrations/pi_bridge.py +++ b/villani_code/integrations/pi_bridge.py @@ -7,6 +7,8 @@ import threading import traceback import hashlib +import inspect +import uuid from dataclasses import dataclass, field from pathlib import Path from typing import Any, Callable, TextIO @@ -14,13 +16,23 @@ from villani_code.execution import ExecutionBudget, VILLANI_TASK_BUDGET from villani_code.integrations.pi_bridge_protocol import ( RunCommand, + parse_approval_response_command, parse_json_line, parse_run_command, ready_event, to_json_line, ) -RunnerFactory = Callable[[RunCommand, Callable[[dict[str, Any]], None]], Any] +RunnerFactory = Callable[..., Any] + + +@dataclass(slots=True) +class PendingApproval: + run_id: str + request_id: str + tool: str + ready: threading.Event = field(default_factory=threading.Event) + approved: bool | None = None @dataclass(slots=True) @@ -28,6 +40,7 @@ class ActiveRun: command: RunCommand abort_requested: threading.Event = field(default_factory=threading.Event) thread: threading.Thread | None = None + pending_approvals: dict[str, PendingApproval] = field(default_factory=dict) class PiBridge: @@ -45,6 +58,7 @@ def __init__( self.runner_factory = runner_factory or build_default_runner self._events: queue.Queue[dict[str, Any] | None] = queue.Queue() self._active: dict[str, ActiveRun] = {} + self._pending_approvals: dict[str, PendingApproval] = {} self._lock = threading.Lock() def emit(self, event: dict[str, Any]) -> None: @@ -109,6 +123,10 @@ def _handle_command(self, command: dict[str, Any]) -> None: run_id = str(command.get("id") or "") self._abort_run(run_id) return + if command_type == "approval_response": + self._handle_approval_response(parse_approval_response_command(command)) + self._drain_events() + return raise ValueError(f"Unknown bridge command type: {command_type or ''}") def _start_run(self, command: RunCommand) -> None: @@ -128,9 +146,41 @@ def _abort_run(self, run_id: str) -> None: self.emit({"type": "error", "id": run_id, "error": "No active run with that id"}) return active.abort_requested.set() + self._deny_pending_approvals(active) # Best-effort only: the existing Runner has no general cooperative cancellation hook yet. self.emit({"type": "abort_requested", "id": run_id}) + def _handle_approval_response(self, response: Any) -> None: + with self._lock: + pending = self._pending_approvals.get(response.request_id) + active = self._active.get(response.id) + if pending is None or active is None or pending.run_id != response.id: + self.emit({"type": "error", "id": response.id, "error": f"Unknown approval request: {response.request_id}"}) + return + # Remove first so duplicate responses cannot change the decision. + self._pending_approvals.pop(response.request_id, None) + active.pending_approvals.pop(response.request_id, None) + pending.approved = bool(response.approved) + pending.ready.set() + self._events.put( + { + "type": "approval_resolved", + "id": response.id, + "request_id": response.request_id, + "tool": pending.tool, + "approved": bool(response.approved), + } + ) + + def _deny_pending_approvals(self, active: ActiveRun) -> None: + with self._lock: + pending_items = list(active.pending_approvals.values()) + for pending in pending_items: + self._pending_approvals.pop(pending.request_id, None) + active.pending_approvals.pop(pending.request_id, None) + pending.approved = False + pending.ready.set() + def _run_worker(self, active: ActiveRun) -> None: command = active.command repo = str(Path(command.repo).resolve()) @@ -167,7 +217,8 @@ def on_runner_event(event: dict[str, Any]) -> None: if event.get("type") in {"tool_result", "tool_finished"}: latest_summary = summarize_tool_event(event) or latest_summary - runner = self.runner_factory(command, on_runner_event) + approval_callback = self._approval_callback(active) + runner = self._create_runner(command, on_runner_event, approval_callback) if active.abort_requested.is_set(): self._events.put({"type": "run_aborted", "id": command.id, "success": False, "summary": "Aborted by caller"}) return @@ -216,11 +267,97 @@ def on_runner_event(event: dict[str, Any]) -> None: self.stderr.write(traceback.format_exc()) self.stderr.flush() finally: + self._deny_pending_approvals(active) with self._lock: self._active.pop(command.id, None) + def _create_runner( + self, + command: RunCommand, + event_callback: Callable[[dict[str, Any]], None], + approval_callback: Callable[[str, dict[str, Any]], bool], + ) -> Any: + try: + signature = inspect.signature(self.runner_factory) + parameters = list(signature.parameters.values()) + accepts_varargs = any(parameter.kind == inspect.Parameter.VAR_POSITIONAL for parameter in parameters) + positional = [ + parameter + for parameter in parameters + if parameter.kind in {inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.POSITIONAL_OR_KEYWORD} + ] + if accepts_varargs or len(positional) >= 3: + return self.runner_factory(command, event_callback, approval_callback) + except (TypeError, ValueError): + # Some callables do not expose an inspectable signature; fall back to the legacy two-argument shape. + pass + runner = self.runner_factory(command, event_callback) + runner.approval_callback = approval_callback + return runner + + def _approval_callback(self, active: ActiveRun) -> Callable[[str, dict[str, Any]], bool]: + def approve(tool_name: str, tool_input: dict[str, Any]) -> bool: + if active.abort_requested.is_set(): + return False + request_id = uuid.uuid4().hex + summary, safe_input = summarize_approval_request(tool_name, tool_input) + pending = PendingApproval(run_id=active.command.id, request_id=request_id, tool=str(tool_name)) + with self._lock: + if active.abort_requested.is_set() or active.command.id not in self._active: + return False + active.pending_approvals[request_id] = pending + self._pending_approvals[request_id] = pending + self._events.put( + { + "type": "approval_required", + "id": active.command.id, + "request_id": request_id, + "tool": str(tool_name), + "summary": summary, + "input": safe_input, + } + ) + while not pending.ready.wait(timeout=0.05): + if active.abort_requested.is_set(): + with self._lock: + self._pending_approvals.pop(request_id, None) + active.pending_approvals.pop(request_id, None) + return False + return pending.approved is True and not active.abort_requested.is_set() + + return approve -def build_default_runner(command: RunCommand, event_callback: Callable[[dict[str, Any]], None]) -> Any: + +def summarize_approval_request(tool_name: str, tool_input: dict[str, Any]) -> tuple[str, dict[str, Any]]: + tool = str(tool_name or "tool") + safe_input: dict[str, Any] = {} + path = tool_input.get("path") or tool_input.get("file_path") + command = tool_input.get("command") + if tool in {"Write", "Patch"}: + if path is not None: + safe_input["path"] = cap_text(str(path).replace("\\", "/"), 500) + content = tool_input.get("content") + if isinstance(content, str): + safe_input["content_chars"] = len(content) + action = "Write file" if tool == "Write" else "Apply patch to" + target = safe_input.get("path") or "unknown path" + return f"{action}: {target}", safe_input + if tool == "Bash": + safe_input["command"] = cap_text(str(command or ""), 2000) + return f"Run command: {safe_input['command']}", safe_input + for key in ("path", "file_path", "command"): + if key in tool_input and tool_input[key] is not None: + safe_input[key if key != "file_path" else "path"] = cap_text(str(tool_input[key]), 1000) + return f"Approve {tool} operation", safe_input + + +def cap_text(value: str, limit: int) -> str: + if len(value) <= limit: + return value + return value[: limit - 1] + "…" + + +def build_default_runner(command: RunCommand, event_callback: Callable[[dict[str, Any]], None], approval_callback: Callable[[str, dict[str, Any]], bool]) -> Any: from villani_code.cli import _build_runner provider = command.config.provider or os.environ.get("VILLANI_PROVIDER") or "anthropic" @@ -253,6 +390,10 @@ def build_default_runner(command: RunCommand, event_callback: Callable[[dict[str villani_objective=command.task if command.mode == "villani" else None, ) runner.event_callback = event_callback + runner.approval_callback = approval_callback + # Villani mode normally auto-approves ASK decisions. The Pi bridge must preserve the + # permission boundary and ask Pi instead of silently approving. + runner.force_interactive_approvals = True return runner diff --git a/villani_code/integrations/pi_bridge_protocol.py b/villani_code/integrations/pi_bridge_protocol.py index c4537a74..8b93ec63 100644 --- a/villani_code/integrations/pi_bridge_protocol.py +++ b/villani_code/integrations/pi_bridge_protocol.py @@ -41,6 +41,13 @@ class AbortCommand: id: str +@dataclass(slots=True) +class ApprovalResponseCommand: + id: str + request_id: str + approved: bool + + def to_json_line(event: dict[str, Any]) -> str: return json.dumps(event, ensure_ascii=False, separators=(",", ":")) + "\n" @@ -56,6 +63,18 @@ def _optional_dict(value: Any) -> dict[str, Any]: return value if isinstance(value, dict) else {} +def parse_approval_response_command(payload: dict[str, Any]) -> ApprovalResponseCommand: + run_id = str(payload.get("id") or "").strip() + request_id = str(payload.get("request_id") or "").strip() + if not run_id: + raise ValueError("approval_response command requires id") + if not request_id: + raise ValueError("approval_response command requires request_id") + if not isinstance(payload.get("approved"), bool): + raise ValueError("approval_response command requires boolean approved") + return ApprovalResponseCommand(id=run_id, request_id=request_id, approved=bool(payload["approved"])) + + def parse_run_command(payload: dict[str, Any]) -> RunCommand: run_id = str(payload.get("id") or "").strip() task = str(payload.get("task") or "").strip() diff --git a/villani_code/state_tooling.py b/villani_code/state_tooling.py index c84c64ca..201ca60c 100644 --- a/villani_code/state_tooling.py +++ b/villani_code/state_tooling.py @@ -515,7 +515,7 @@ def execute_tool_with_policy( "decision_source": "auto_approve_flag", } ) - elif runner.villani_mode: + elif runner.villani_mode and not getattr(runner, "force_interactive_approvals", False): runner.event_callback( { "type": "approval_auto_resolved", From 6c3d657eb32452fc223dd3face911fbfe25210bb Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sat, 30 May 2026 08:28:11 +1000 Subject: [PATCH 08/37] Add self-contained Pi runtime downloader --- .../build-pi-villani-runtime-release.yml | 92 ++++++++++ integrations/pi-villani/README.md | 100 ++++------- integrations/pi-villani/docs/releasing.md | 18 ++ integrations/pi-villani/package-lock.json | 91 ++++++++++ integrations/pi-villani/package.json | 7 +- integrations/pi-villani/src/extension.test.ts | 42 ++++- integrations/pi-villani/src/index.ts | 10 +- integrations/pi-villani/src/runtime.test.ts | 126 +++++++++++++ integrations/pi-villani/src/runtime.ts | 169 ++++++++++++++++++ integrations/pi-villani/src/runtimeConfig.ts | 37 ++++ packaging/smoke_test_runtime.py | 36 ++++ packaging/villani_runtime.spec | 54 ++++++ packaging/villani_runtime_entry.py | 15 ++ pyproject.toml | 1 + 14 files changed, 734 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/build-pi-villani-runtime-release.yml create mode 100644 integrations/pi-villani/docs/releasing.md create mode 100644 integrations/pi-villani/src/runtime.test.ts create mode 100644 integrations/pi-villani/src/runtime.ts create mode 100644 integrations/pi-villani/src/runtimeConfig.ts create mode 100644 packaging/smoke_test_runtime.py create mode 100644 packaging/villani_runtime.spec create mode 100644 packaging/villani_runtime_entry.py diff --git a/.github/workflows/build-pi-villani-runtime-release.yml b/.github/workflows/build-pi-villani-runtime-release.yml new file mode 100644 index 00000000..88f6d565 --- /dev/null +++ b/.github/workflows/build-pi-villani-runtime-release.yml @@ -0,0 +1,92 @@ +name: Build pi-villani runtime release + +on: + workflow_dispatch: + push: + tags: + - "pi-villani-runtime-v*" + +permissions: + contents: write + +env: + RUNTIME_VERSION: "0.1.0" + +jobs: + runtime: + name: ${{ matrix.platform }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - platform: win32-x64 + os: windows-latest + extension: zip + executable: dist/runtime/villani-code/villani-code.exe + - platform: darwin-arm64 + os: macos-14 + extension: tar.gz + executable: dist/runtime/villani-code/villani-code + - platform: darwin-x64 + os: macos-13 + extension: tar.gz + executable: dist/runtime/villani-code/villani-code + - platform: linux-x64 + os: ubuntu-latest + extension: tar.gz + executable: dist/runtime/villani-code/villani-code + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -e . pyinstaller + - name: Build runtime + run: pyinstaller --distpath dist/runtime --workpath build/runtime packaging/villani_runtime.spec + - name: Smoke test runtime + run: python packaging/smoke_test_runtime.py "${{ matrix.executable }}" + - name: Compute asset name + shell: bash + run: | + ASSET="villani-runtime-v${RUNTIME_VERSION}-${{ matrix.platform }}.${{ matrix.extension }}" + echo "ASSET=${ASSET}" >> "$GITHUB_ENV" + - name: Archive runtime (Windows) + if: matrix.extension == 'zip' + shell: pwsh + run: Compress-Archive -Path dist/runtime/villani-code -DestinationPath "$env:ASSET" + - name: Archive runtime (macOS/Linux) + if: matrix.extension == 'tar.gz' + run: tar -czf "$ASSET" -C dist/runtime villani-code + - name: Generate checksum + shell: bash + run: sha256sum "$ASSET" > "$ASSET.sha256" + - uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.platform }}-runtime + path: | + ${{ env.ASSET }} + ${{ env.ASSET }}.sha256 + + publish: + needs: runtime + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/pi-villani-runtime-v') + steps: + - uses: actions/download-artifact@v4 + with: + path: artifacts + - name: Flatten artifacts and checksums + run: | + find artifacts -type f -name 'villani-runtime-*' -exec cp {} . \; + cat *.sha256 > checksums.txt + - uses: softprops/action-gh-release@v2 + with: + files: | + villani-runtime-v*.zip + villani-runtime-v*.tar.gz + checksums.txt diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index 52ccec50..f39a036f 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -1,63 +1,60 @@ -# Pi Villani Integration +# Villani for Pi -`pi-villani` adds Pi slash commands that delegate repository repair tasks to Villani Code. Pi remains the UI and model/auth host; Villani remains the runner that edits files and runs verification. +Villani is a high-reliability coding runner for Pi. Pi stays the UI and model/auth host; Villani performs repository repair, edits, verification, and approval-bound operations through its existing runner. + +Install: + +```bash +pi install npm:pi-villani +``` + +Use inside any repository: ```text -/villani Fix the failing authentication tests and run the relevant verification - -> Pi extension - -> temporary 127.0.0.1 OpenAI-compatible proxy backed by Pi's active model - -> villani-code bridge --stdio - -> existing Villani Runner - -> normalized progress/final events rendered in Pi +/villani Fix the failing tests and verify the result +/villani-abort ``` -The extension does **not** port or duplicate Villani's runner logic in TypeScript. +On first use, the extension automatically downloads a platform-specific standalone Villani runtime from GitHub Releases, verifies its SHA-256 checksum, extracts it into a private user cache, and launches the bundled `bridge --stdio` runtime. No separate Python, pip, virtual environment, or `villani-code` installation is required for normal use. -## Requirements +Villani uses your active Pi model through the local Pi-backed proxy and asks for approval before protected file or shell operations. -- Node.js 22.19 or newer, matching the current Pi runtime packages. -- Villani Code installed in the Python environment visible to Pi. A standard install of this repository provides the `villani-code` executable. -- Pi with an active configured model, unless you opt into explicit Villani model configuration. +## Supported platforms -## Installation +Runtime downloads are prepared for: -Published package, once released: +- Windows x64 (`win32-x64`) +- macOS Apple Silicon (`darwin-arm64`) +- macOS Intel (`darwin-x64`) +- Linux x64 (`linux-x64`) -```bash -pi install npm:pi-villani -``` +Other platforms can still use a local Villani installation through `VILLANI_COMMAND`. -Development/local checkout: +## Runtime cache -```bash -cd integrations/pi-villani -npm install -npm run build -pi install ./ -``` +The runtime cache is outside the repository being edited: -For one-off testing without installing permanently, Pi supports loading a local package/extension for the current run: +- Windows: `%LOCALAPPDATA%\pi-villani\runtime\\\` +- macOS/Linux: `~/.cache/pi-villani/runtime///` -```bash -pi -e ./integrations/pi-villani/dist/index.js -``` +The extension verifies `checksums.txt` from the matching GitHub Release before extraction and writes a `.verified.json` marker before reusing a cached runtime. -## Usage +## Developer override -```text -/villani Fix the failing authentication tests and run the relevant verification -/villani-abort -``` +For development or troubleshooting, set `VILLANI_COMMAND` to a single executable path/name. This skips runtime download and preserves Windows paths with spaces. -Only one Villani run is allowed per Pi extension instance at a time. If a run is active, a second `/villani` command is rejected with a message telling you to wait or run `/villani-abort`. +PowerShell example: -When Villani's existing permission policy classifies an operation as requiring approval, Pi asks before the operation executes. Approvals are per operation and are not remembered across runs. +```powershell +$env:VILLANI_COMMAND = "C:\path\to\villani-code\.venv\Scripts\villani-code.exe" +pi +``` ## Defaults and configuration Default behavior: -- `VILLANI_COMMAND` defaults to `villani-code`. +- `VILLANI_COMMAND` unset means the extension downloads/reuses the verified standalone Villani runtime. Set it only for development/troubleshooting overrides. - `VILLANI_MODE` defaults to `runner`, which maps to normal `Runner.run(task)` execution. - `VILLANI_MODE=villani` maps to the repository's autonomous `Runner.run_villani_mode()` path. - Pi model reuse is enabled by default. The extension resolves Pi-managed credentials and provider headers with `ctx.modelRegistry.getApiKeyAndHeaders(model)`, starts a temporary local proxy, and passes that proxy URL to Villani as an OpenAI-compatible `base_url`. @@ -67,7 +64,7 @@ Optional environment variables: | Variable | Meaning | | --- | --- | -| `VILLANI_COMMAND` | Override the Villani executable path/name. Defaults to `villani-code`. This is a single executable path, not a shell command. | +| `VILLANI_COMMAND` | Developer/troubleshooting override for the Villani executable path/name. When set, runtime download is skipped. This is a single executable path, not a shell command. | | `VILLANI_MODE` | `runner` or `villani`. Defaults to `runner`. | | `VILLANI_USE_PI_MODEL` | Set to `false` to disable Pi-backed model reuse and use explicit Villani provider config. | | `VILLANI_PROVIDER` | Explicit fallback provider (`openai` or `anthropic`) when `VILLANI_USE_PI_MODEL=false`. | @@ -75,27 +72,7 @@ Optional environment variables: | `VILLANI_BASE_URL` | Explicit fallback model endpoint. | | `VILLANI_API_KEY` | Explicit fallback API key, if needed. | -macOS/Linux example for explicit fallback: - -```bash -export VILLANI_USE_PI_MODEL=false -export VILLANI_COMMAND=villani-code -export VILLANI_PROVIDER=openai -export VILLANI_MODEL=your-model -export VILLANI_BASE_URL=http://127.0.0.1:1234 -export VILLANI_API_KEY=dummy -``` - -Windows PowerShell example: - -```powershell -$env:VILLANI_USE_PI_MODEL = "false" -$env:VILLANI_COMMAND = "C:\Program Files\Python\Scripts\villani-code.exe" -$env:VILLANI_PROVIDER = "openai" -$env:VILLANI_MODEL = "your-model" -$env:VILLANI_BASE_URL = "http://127.0.0.1:1234" -$env:VILLANI_API_KEY = "dummy" -``` +Explicit Villani provider variables are advanced fallback settings. Normal Pi users should leave them unset so Villani reuses the active Pi model. ## Final output @@ -142,8 +119,9 @@ Transcript: .villani_code/runs/... ## Troubleshooting -- **`villani-code` not found:** install Villani Code in the environment Pi uses, or set `VILLANI_COMMAND` to the full executable path. -- **Python environment mismatch:** run `villani-code bridge --stdio` in the same shell environment used to start Pi. +- **Runtime download failed:** check network access to GitHub Releases, then retry. You can set `VILLANI_COMMAND` to a local executable while troubleshooting. +- **Runtime checksum failed:** the archive was not executed. Clear the runtime cache and retry, or report the release asset mismatch. +- **Local override not found:** if `VILLANI_COMMAND` is set, ensure it points to the executable path in the same environment used to start Pi. - **No Pi model available:** select/configure a Pi model, or set `VILLANI_USE_PI_MODEL=false` and provide explicit Villani provider variables. - **Pi auth resolution fails:** confirm the selected Pi model is logged in/configured; auth errors are sanitized before display. - **Bridge readiness timeout:** run `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio` and confirm it prints `ready` then `pong`. diff --git a/integrations/pi-villani/docs/releasing.md b/integrations/pi-villani/docs/releasing.md new file mode 100644 index 00000000..8cfb9bb1 --- /dev/null +++ b/integrations/pi-villani/docs/releasing.md @@ -0,0 +1,18 @@ +# Releasing pi-villani + +The Pi extension and the standalone Villani runtime currently share version `0.1.0`. + +1. Update `integrations/pi-villani/package.json` and `integrations/pi-villani/src/runtimeConfig.ts` to the new version. +2. Push a tag named `pi-villani-runtime-vX.Y.Z`. +3. Confirm GitHub Actions workflow `Build pi-villani runtime release` builds and smoke-tests every supported runtime archive. +4. Confirm the GitHub Release contains: + - `villani-runtime-vX.Y.Z-win32-x64.zip` + - `villani-runtime-vX.Y.Z-darwin-arm64.tar.gz` + - `villani-runtime-vX.Y.Z-darwin-x64.tar.gz` + - `villani-runtime-vX.Y.Z-linux-x64.tar.gz` + - `checksums.txt` +5. Run `cd integrations/pi-villani && npm ci && npm run build && npm test && npm pack --dry-run`. +6. Publish the npm package only after the runtime assets exist for the version referenced by `VILLANI_RUNTIME_VERSION`. +7. In a clean Pi environment, run `pi install npm:pi-villani`, open Pi in a repository, and smoke-test `/villani` plus `/villani-abort`. + +Do not publish an npm package that references runtime assets that have not been uploaded yet. diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json index 36d715ed..9113521f 100644 --- a/integrations/pi-villani/package-lock.json +++ b/integrations/pi-villani/package-lock.json @@ -8,9 +8,14 @@ "name": "pi-villani", "version": "0.1.0", "license": "MIT", + "dependencies": { + "adm-zip": "^0.5.16", + "tar": "^7.4.3" + }, "devDependencies": { "@earendil-works/pi-ai": "^0.77.0", "@earendil-works/pi-coding-agent": "^0.77.0", + "@types/adm-zip": "^0.5.7", "@types/node": "^20.11.30", "typescript": "^5.4.0" }, @@ -2502,6 +2507,18 @@ } } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@mistralai/mistralai": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-2.2.1.tgz", @@ -2729,6 +2746,16 @@ "node": ">=14.0.0" } }, + "node_modules/@types/adm-zip": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.8.tgz", + "integrity": "sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.19.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", @@ -2746,6 +2773,15 @@ "dev": true, "license": "MIT" }, + "node_modules/adm-zip": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -2801,6 +2837,15 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -3062,6 +3107,27 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3237,6 +3303,22 @@ ], "license": "MIT" }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ts-algebra": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", @@ -3327,6 +3409,15 @@ "node": ">=16.0.0" } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json index 5e42a112..bcde9661 100644 --- a/integrations/pi-villani/package.json +++ b/integrations/pi-villani/package.json @@ -13,7 +13,8 @@ "@earendil-works/pi-ai": "^0.77.0", "@earendil-works/pi-coding-agent": "^0.77.0", "@types/node": "^20.11.30", - "typescript": "^5.4.0" + "typescript": "^5.4.0", + "@types/adm-zip": "^0.5.7" }, "engines": { "node": ">=22.19.0" @@ -40,5 +41,9 @@ "peerDependencies": { "@earendil-works/pi-ai": "*", "@earendil-works/pi-coding-agent": "*" + }, + "dependencies": { + "adm-zip": "^0.5.16", + "tar": "^7.4.3" } } diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index 78c8700b..73271932 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -1,5 +1,5 @@ import assert from "node:assert/strict"; -import { mkdtemp, writeFile } from "node:fs/promises"; +import { mkdir, mkdtemp, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; @@ -61,6 +61,19 @@ async function mockNodeBridgeExecutable(exitAfterRun = false): Promise { return executable; } +async function installCachedRuntimeBridge(commandExecutable: string): Promise { + const cacheRoot = await mkdtemp(join(tmpdir(), "villani-runtime-cache-")); + const platformKey = `${process.platform}-${process.arch}`; + const runtimeDir = join(cacheRoot, "0.1.0", platformKey, "villani-code"); + const runtimeExecutable = join(runtimeDir, process.platform === "win32" ? "villani-code.exe" : "villani-code"); + await mkdir(runtimeDir, { recursive: true }); + await writeFile(runtimeExecutable, process.platform === "win32" + ? `@echo off\n"${commandExecutable}" %*\n` + : `#!/usr/bin/env sh\nexec "${commandExecutable}" "$@"\n`, { encoding: "utf8", mode: 0o755 }); + await writeFile(join(cacheRoot, "0.1.0", platformKey, ".verified.json"), JSON.stringify({ runtimeVersion: "0.1.0", assetName: platformKey.startsWith("win32") ? "villani-runtime-v0.1.0-win32-x64.zip" : `villani-runtime-v0.1.0-${platformKey}.tar.gz`, checksum: "a".repeat(64) }), "utf8"); + return cacheRoot; +} + function createHost() { const commands = new Map Promise>(); const api = { @@ -203,6 +216,33 @@ test("abort during startup is recognized before bridge exists", async () => { assert.match(messages.join("\n"), /cancelled/); }); + +test("default path uses cached downloaded runtime before launching bridge", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldCache = process.env.VILLANI_RUNTIME_CACHE_DIR; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const bridgeExecutable = await mockNodeBridgeExecutable(true); + process.env.VILLANI_RUNTIME_CACHE_DIR = await installCachedRuntimeBridge(bridgeExecutable); + delete process.env.VILLANI_COMMAND; + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages)); + assert.match(messages.join("\n"), /Villani completed/); + } finally { + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("VILLANI_RUNTIME_CACHE_DIR", oldCache); + } +}); + function restoreEnv(values: { oldCommand?: string; oldUsePi?: string; oldProvider?: string; oldModel?: string; oldBase?: string }): void { setOrDelete("VILLANI_COMMAND", values.oldCommand); setOrDelete("VILLANI_USE_PI_MODEL", values.oldUsePi); diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index 0bdf5d5d..c3ebefb6 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -3,6 +3,7 @@ import type { ExtensionAPI, ExtensionCommandContext, ExtensionUIContext } from " import type { Model } from "@earendil-works/pi-ai"; import { BridgeEvent, RunCommand, VillaniMode } from "./protocol.js"; import { startVillaniBridgeProcess, VillaniBridgeProcess } from "./process.js"; +import { resolveVillaniExecutable } from "./runtime.js"; import { PiModelProxy } from "./modelProxy.js"; import { PiLikeOutput, renderEvent } from "./render.js"; @@ -79,7 +80,14 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte const proxyUrl = run.proxy ? await run.proxy.start() : undefined; if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); - run.bridge = await startVillaniBridgeProcess({ command: process.env.VILLANI_COMMAND, cwd: repo, signal: abortController.signal }); + const executable = await resolveVillaniExecutable({ + overrideCommand: process.env.VILLANI_COMMAND, + signal: abortController.signal, + onProgress: (message) => output.info?.(message), + }); + if (abortController.signal.aborted) throw new Error("Villani run cancelled during runtime setup."); + + run.bridge = await startVillaniBridgeProcess({ command: executable.executable, cwd: repo, signal: abortController.signal }); run.phase = "running"; run.bridge.onEvent((event: BridgeEvent) => { if (abortController.signal.aborted && event.type === "run_completed") return; diff --git a/integrations/pi-villani/src/runtime.test.ts b/integrations/pi-villani/src/runtime.test.ts new file mode 100644 index 00000000..a8cb8211 --- /dev/null +++ b/integrations/pi-villani/src/runtime.test.ts @@ -0,0 +1,126 @@ +import assert from "node:assert/strict"; +import { mkdtemp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test from "node:test"; +import { resolveRuntimeAsset, VILLANI_RUNTIME_VERSION } from "./runtimeConfig.js"; +import { parseChecksum, resolveVillaniExecutable, runtimeInstallDir, sha256 } from "./runtime.js"; + +function response(body: string | Buffer, status = 200): Response { + const payload: BodyInit = typeof body === "string" ? body : new Uint8Array(body); + return new Response(payload, { status }); +} + +async function tempRoot(): Promise { + return mkdtemp(join(tmpdir(), "pi-villani-runtime-test-")); +} + +test("runtime platform mapping covers supported platforms", () => { + assert.equal(resolveRuntimeAsset("win32", "x64").assetName, `villani-runtime-v${VILLANI_RUNTIME_VERSION}-win32-x64.zip`); + assert.equal(resolveRuntimeAsset("win32", "x64").executableRelativePath, "villani-code/villani-code.exe"); + assert.equal(resolveRuntimeAsset("darwin", "arm64").platformKey, "darwin-arm64"); + assert.equal(resolveRuntimeAsset("darwin", "x64").platformKey, "darwin-x64"); + assert.equal(resolveRuntimeAsset("linux", "x64").platformKey, "linux-x64"); + assert.throws(() => resolveRuntimeAsset("linux", "arm64"), /not yet available/); +}); + +test("override returns exact command and skips downloads", async () => { + const command = "C:\\Program Files\\Python\\Scripts\\villani-code.exe"; + const resolved = await resolveVillaniExecutable({ + overrideCommand: command, + fetchImpl: async () => { throw new Error("should not fetch"); }, + }); + assert.deepEqual(resolved, { executable: command, source: "override" }); +}); + +test("verified cached runtime is reused without downloading", async () => { + const cacheRoot = await tempRoot(); + try { + const asset = resolveRuntimeAsset("linux", "x64"); + const dir = runtimeInstallDir(cacheRoot, asset.platformKey); + const executable = join(dir, asset.executableRelativePath); + await mkdir(join(dir, "villani-code"), { recursive: true }); + await writeFile(executable, "#!/bin/sh\n", { mode: 0o755 }); + await writeFile(join(dir, ".verified.json"), JSON.stringify({ runtimeVersion: VILLANI_RUNTIME_VERSION, assetName: asset.assetName, checksum: "a".repeat(64) }), "utf8"); + const resolved = await resolveVillaniExecutable({ platform: "linux", arch: "x64", cacheRoot, fetchImpl: async () => { throw new Error("should not fetch"); } }); + assert.equal(resolved.source, "cached-runtime"); + assert.equal(resolved.executable, executable); + } finally { + await rm(cacheRoot, { recursive: true, force: true }); + } +}); + +test("unverified cache is not executed and correct checksum installs runtime", async () => { + const cacheRoot = await tempRoot(); + try { + const asset = resolveRuntimeAsset("linux", "x64"); + const archive = Buffer.from("fake archive"); + const checksum = sha256(archive); + let fetches = 0; + const resolved = await resolveVillaniExecutable({ + platform: "linux", + arch: "x64", + cacheRoot, + fetchImpl: async (url) => { + fetches += 1; + return String(url).endsWith("checksums.txt") ? response(`${checksum} ${asset.assetName}\n`) : response(archive); + }, + extractArchive: async (_archivePath, destination) => { + await mkdir(join(destination, "villani-code"), { recursive: true }); + await writeFile(join(destination, asset.executableRelativePath), "#!/bin/sh\n", { mode: 0o755 }); + }, + }); + assert.equal(resolved.source, "downloaded-runtime"); + assert.equal(fetches, 2); + const marker = JSON.parse(await readFile(join(runtimeInstallDir(cacheRoot, asset.platformKey), ".verified.json"), "utf8")); + assert.equal(marker.checksum, checksum); + + const cached = await resolveVillaniExecutable({ platform: "linux", arch: "x64", cacheRoot, fetchImpl: async () => { throw new Error("should not refetch"); } }); + assert.equal(cached.source, "cached-runtime"); + } finally { + await rm(cacheRoot, { recursive: true, force: true }); + } +}); + +test("checksum mismatch, non-200, missing executable, and abort fail safely", async () => { + const cacheRoot = await tempRoot(); + try { + const asset = resolveRuntimeAsset("linux", "x64"); + await assert.rejects(resolveVillaniExecutable({ + platform: "linux", + arch: "x64", + cacheRoot, + fetchImpl: async (url) => String(url).endsWith("checksums.txt") ? response(`${"0".repeat(64)} ${asset.assetName}\n`) : response(Buffer.from("bad")), + extractArchive: async () => undefined, + }), /integrity verification/); + + await assert.rejects(resolveVillaniExecutable({ + platform: "linux", + arch: "x64", + cacheRoot, + fetchImpl: async () => response("nope", 404), + }), /HTTP 404/); + + const archive = Buffer.from("archive"); + const checksum = sha256(archive); + await assert.rejects(resolveVillaniExecutable({ + platform: "linux", + arch: "x64", + cacheRoot, + fetchImpl: async (url) => String(url).endsWith("checksums.txt") ? response(`${checksum} ${asset.assetName}\n`) : response(archive), + extractArchive: async (_archivePath, destination) => { await mkdir(destination, { recursive: true }); }, + }), /expected executable was not found/); + + const controller = new AbortController(); + controller.abort(); + await assert.rejects(resolveVillaniExecutable({ platform: "linux", arch: "x64", cacheRoot, signal: controller.signal }), /cancelled during runtime setup/); + await assert.rejects(stat(runtimeInstallDir(cacheRoot, asset.platformKey)), /ENOENT/); + } finally { + await rm(cacheRoot, { recursive: true, force: true }); + } +}); + +test("parseChecksum requires matching asset", () => { + assert.equal(parseChecksum(`${"a".repeat(64)} asset.zip\n`, "asset.zip"), "a".repeat(64)); + assert.throws(() => parseChecksum("", "asset.zip"), /Missing SHA-256/); +}); diff --git a/integrations/pi-villani/src/runtime.ts b/integrations/pi-villani/src/runtime.ts new file mode 100644 index 00000000..2313625e --- /dev/null +++ b/integrations/pi-villani/src/runtime.ts @@ -0,0 +1,169 @@ +import { createHash } from "node:crypto"; +import { constants as fsConstants } from "node:fs"; +import { access, chmod, mkdir, mkdtemp, readFile, rename, rm, stat, writeFile } from "node:fs/promises"; +import { homedir } from "node:os"; +import { dirname, join } from "node:path"; +import AdmZip from "adm-zip"; +import * as tar from "tar"; +import { RuntimeAsset, resolveRuntimeAsset, VILLANI_RUNTIME_VERSION } from "./runtimeConfig.js"; + +export interface ResolvedVillaniExecutable { + executable: string; + source: "override" | "cached-runtime" | "downloaded-runtime"; + version?: string; +} + +export interface RuntimeResolverOptions { + overrideCommand?: string; + onProgress?: (message: string) => void; + signal?: AbortSignal; + platform?: NodeJS.Platform; + arch?: string; + cacheRoot?: string; + fetchImpl?: typeof fetch; + extractArchive?: (archivePath: string, destination: string, asset: RuntimeAsset) => Promise; +} + +interface VerificationMarker { + runtimeVersion: string; + assetName: string; + checksum: string; + installedAt: string; +} + +export async function resolveVillaniExecutable(options: RuntimeResolverOptions = {}): Promise { + const override = options.overrideCommand?.trim(); + if (override) return { executable: override, source: "override" }; + + const asset = resolveRuntimeAsset(options.platform, options.arch ?? process.arch); + const cacheRoot = options.cacheRoot ?? defaultRuntimeCacheRoot(); + const finalDir = runtimeInstallDir(cacheRoot, asset.platformKey); + const markerPath = join(finalDir, ".verified.json"); + const executable = join(finalDir, asset.executableRelativePath); + if (await isVerifiedRuntime(markerPath, executable, asset)) { + return { executable, source: "cached-runtime", version: VILLANI_RUNTIME_VERSION }; + } + + throwIfAborted(options.signal); + options.onProgress?.(`Downloading Villani runtime for ${asset.platformKey}...`); + await mkdir(dirname(finalDir), { recursive: true }); + const tempDir = await mkdtemp(join(dirname(finalDir), `.install-${asset.platformKey}-`)); + try { + const fetchImpl = options.fetchImpl ?? fetch; + const checksums = await fetchText(fetchImpl, asset.checksumsUrl, options.signal, "checksums.txt"); + throwIfAborted(options.signal); + const expectedChecksum = parseChecksum(checksums, asset.assetName); + const archiveBytes = await fetchBytes(fetchImpl, asset.downloadUrl, options.signal, asset.assetName); + throwIfAborted(options.signal); + const actualChecksum = sha256(archiveBytes); + if (actualChecksum !== expectedChecksum) { + throw new Error("Villani runtime download failed integrity verification and was not executed."); + } + + const archivePath = join(tempDir, asset.assetName); + const extractDir = join(tempDir, "extract"); + await mkdir(extractDir, { recursive: true }); + await writeFile(archivePath, archiveBytes); + await (options.extractArchive ?? extractRuntimeArchive)(archivePath, extractDir, asset); + const extractedExecutable = join(extractDir, asset.executableRelativePath); + await assertExecutableExists(extractedExecutable, asset); + if (asset.archiveType !== "zip") await chmod(extractedExecutable, 0o755); + + const marker: VerificationMarker = { + runtimeVersion: VILLANI_RUNTIME_VERSION, + assetName: asset.assetName, + checksum: actualChecksum, + installedAt: new Date().toISOString(), + }; + await writeFile(join(extractDir, ".verified.json"), JSON.stringify(marker, null, 2), "utf8"); + await rm(finalDir, { recursive: true, force: true }); + try { + await rename(extractDir, finalDir); + } catch (error) { + if (await isVerifiedRuntime(markerPath, executable, asset)) { + return { executable, source: "cached-runtime", version: VILLANI_RUNTIME_VERSION }; + } + throw error; + } + options.onProgress?.("Villani runtime installed."); + return { executable, source: "downloaded-runtime", version: VILLANI_RUNTIME_VERSION }; + } catch (error) { + if (isAbortError(error) || options.signal?.aborted) { + throw new Error("Villani run cancelled during runtime setup."); + } + throw error; + } finally { + await rm(tempDir, { recursive: true, force: true }); + } +} + +export function defaultRuntimeCacheRoot(): string { + if (process.env.VILLANI_RUNTIME_CACHE_DIR) return process.env.VILLANI_RUNTIME_CACHE_DIR; + if (process.platform === "win32" && process.env.LOCALAPPDATA) return join(process.env.LOCALAPPDATA, "pi-villani", "runtime"); + return join(homedir(), ".cache", "pi-villani", "runtime"); +} + +export function runtimeInstallDir(cacheRoot: string, platformKey: string): string { + return join(cacheRoot, VILLANI_RUNTIME_VERSION, platformKey); +} + +export function parseChecksum(checksumsText: string, assetName: string): string { + for (const rawLine of checksumsText.split(/\r?\n/)) { + const line = rawLine.trim(); + if (!line) continue; + const match = line.match(/^([a-fA-F0-9]{64})\s+\*?(.+)$/); + if (match && match[2].trim() === assetName) return match[1].toLowerCase(); + } + throw new Error(`Missing SHA-256 checksum for ${assetName}.`); +} + +export function sha256(bytes: Buffer): string { + return createHash("sha256").update(bytes).digest("hex"); +} + +async function isVerifiedRuntime(markerPath: string, executable: string, asset: RuntimeAsset): Promise { + try { + await access(executable, fsConstants.X_OK); + const marker = JSON.parse(await readFile(markerPath, "utf8")) as Partial; + return marker.runtimeVersion === VILLANI_RUNTIME_VERSION && marker.assetName === asset.assetName && typeof marker.checksum === "string"; + } catch { + return false; + } +} + +async function assertExecutableExists(path: string, asset: RuntimeAsset): Promise { + try { + const info = await stat(path); + if (!info.isFile()) throw new Error("not a file"); + } catch (error) { + throw new Error(`Villani runtime archive is invalid: expected executable was not found at ${asset.executableRelativePath}.`, { cause: error }); + } +} + +async function extractRuntimeArchive(archivePath: string, destination: string, asset: RuntimeAsset): Promise { + if (asset.archiveType === "zip") { + new AdmZip(archivePath).extractAllTo(destination, true); + return; + } + await tar.x({ file: archivePath, cwd: destination }); +} + +async function fetchText(fetchImpl: typeof fetch, url: string, signal: AbortSignal | undefined, label: string): Promise { + const response = await fetchImpl(url, { signal }); + if (!response.ok) throw new Error(`Villani could not download ${label} from GitHub Releases (HTTP ${response.status}).`); + return response.text(); +} + +async function fetchBytes(fetchImpl: typeof fetch, url: string, signal: AbortSignal | undefined, label: string): Promise { + const response = await fetchImpl(url, { signal }); + if (!response.ok) throw new Error(`Villani could not download ${label} from GitHub Releases (HTTP ${response.status}).`); + return Buffer.from(await response.arrayBuffer()); +} + +function throwIfAborted(signal: AbortSignal | undefined): void { + if (signal?.aborted) throw new Error("Villani run cancelled during runtime setup."); +} + +function isAbortError(error: unknown): boolean { + return error instanceof Error && (error.name === "AbortError" || error.message.includes("aborted")); +} diff --git a/integrations/pi-villani/src/runtimeConfig.ts b/integrations/pi-villani/src/runtimeConfig.ts new file mode 100644 index 00000000..0068a484 --- /dev/null +++ b/integrations/pi-villani/src/runtimeConfig.ts @@ -0,0 +1,37 @@ +export const VILLANI_RUNTIME_VERSION = "0.1.0"; +export const VILLANI_RUNTIME_REPOSITORY = "mmprotest/villani-code"; +export const VILLANI_RUNTIME_TAG = `pi-villani-runtime-v${VILLANI_RUNTIME_VERSION}`; + +export type RuntimePlatformKey = "win32-x64" | "darwin-arm64" | "darwin-x64" | "linux-x64"; + +export interface RuntimeAsset { + platformKey: RuntimePlatformKey; + assetName: string; + archiveType: "zip" | "tar.gz"; + executableRelativePath: string; + downloadUrl: string; + checksumsUrl: string; +} + +export function resolveRuntimeAsset(platform: NodeJS.Platform = process.platform, arch: string = process.arch): RuntimeAsset { + const key = `${platform}-${arch}`; + if (!isSupportedRuntimePlatform(key)) { + throw new Error(`Villani runtime is not yet available for platform ${key}. Set VILLANI_COMMAND to a locally installed Villani executable to continue.`); + } + const archiveType = platform === "win32" ? "zip" : "tar.gz"; + const suffix = archiveType === "zip" ? ".zip" : ".tar.gz"; + const assetName = `villani-runtime-v${VILLANI_RUNTIME_VERSION}-${key}${suffix}`; + const base = `https://github.com/${VILLANI_RUNTIME_REPOSITORY}/releases/download/${VILLANI_RUNTIME_TAG}`; + return { + platformKey: key, + assetName, + archiveType, + executableRelativePath: platform === "win32" ? "villani-code/villani-code.exe" : "villani-code/villani-code", + downloadUrl: `${base}/${assetName}`, + checksumsUrl: `${base}/checksums.txt`, + }; +} + +function isSupportedRuntimePlatform(key: string): key is RuntimePlatformKey { + return key === "win32-x64" || key === "darwin-arm64" || key === "darwin-x64" || key === "linux-x64"; +} diff --git a/packaging/smoke_test_runtime.py b/packaging/smoke_test_runtime.py new file mode 100644 index 00000000..a938730a --- /dev/null +++ b/packaging/smoke_test_runtime.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + + +def main() -> int: + if len(sys.argv) != 2: + print("usage: smoke_test_runtime.py ", file=sys.stderr) + return 2 + executable = Path(sys.argv[1]) + proc = subprocess.Popen( + [str(executable), "bridge", "--stdio"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + assert proc.stdin is not None + assert proc.stdout is not None + proc.stdin.write('{"type":"ping","id":"release-smoke"}\n') + proc.stdin.close() + lines = [proc.stdout.readline().strip(), proc.stdout.readline().strip()] + stderr = proc.stderr.read() if proc.stderr is not None else "" + proc.wait(timeout=15) + events = [json.loads(line) for line in lines if line] + if events[:2] != [{"type": "ready", "protocol_version": 1}, {"type": "pong", "id": "release-smoke"}]: + print(f"unexpected events: {events}; stderr={stderr}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/packaging/villani_runtime.spec b/packaging/villani_runtime.spec new file mode 100644 index 00000000..8fe3926c --- /dev/null +++ b/packaging/villani_runtime.spec @@ -0,0 +1,54 @@ +# -*- mode: python ; coding: utf-8 -*- + +from pathlib import Path +from PyInstaller.utils.hooks import collect_data_files, collect_submodules + +block_cipher = None +ROOT = Path.cwd() + +hiddenimports = collect_submodules("villani_code") +datas = collect_data_files("villani_code") + +a = Analysis( + ["villani_runtime_entry.py"], + pathex=[str(ROOT), str(ROOT / "packaging")], + binaries=[], + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=["tests", "pytest"], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name="villani-code", + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name="villani-code", +) diff --git a/packaging/villani_runtime_entry.py b/packaging/villani_runtime_entry.py new file mode 100644 index 00000000..ae46e003 --- /dev/null +++ b/packaging/villani_runtime_entry.py @@ -0,0 +1,15 @@ +"""Frozen Villani runtime entrypoint for PyInstaller builds.""" + +from __future__ import annotations + +import sys +from pathlib import Path + +if __package__ is None and not getattr(sys, "frozen", False): + sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from villani_code.cli import app + + +if __name__ == "__main__": + app() diff --git a/pyproject.toml b/pyproject.toml index ae9415ba..8ed7bb55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dev = [ "pytest-asyncio>=0.23", "ruff>=0.6.0", "mypy>=1.10", + "pyinstaller>=6.0", ] [project.scripts] From cd3cbafcb69ae98b9979dd3dd1bbb23c68cf7eac Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sat, 30 May 2026 08:49:17 +1000 Subject: [PATCH 09/37] Fix Pi verification summary rendering --- integrations/pi-villani/src/render.test.ts | 49 ++++++++++++++++++++++ integrations/pi-villani/src/render.ts | 10 ++++- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 integrations/pi-villani/src/render.test.ts diff --git a/integrations/pi-villani/src/render.test.ts b/integrations/pi-villani/src/render.test.ts new file mode 100644 index 00000000..6ecc62fa --- /dev/null +++ b/integrations/pi-villani/src/render.test.ts @@ -0,0 +1,49 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { BridgeEvent } from "./protocol.js"; +import { renderFinalSummary } from "./render.js"; + +function render(event: Extract): string { + const messages: string[] = []; + renderFinalSummary(event, { markdown: (message) => messages.push(message) }); + return messages.join("\n"); +} + +function completed(verification_passed?: boolean | null): Extract { + return { + type: "run_completed", + id: "run-1", + success: true, + changed_files: [], + preexisting_dirty_files: [], + verification_passed: verification_passed as boolean | null, + summary: "done", + transcript_path: null, + }; +} + +test("final summary renders passed verification", () => { + const output = render(completed(true)); + assert.match(output, /\*\*Verification:\*\* passed/); + assert.doesNotMatch(output, /Verification passed:/); +}); + +test("final summary renders failed verification", () => { + const output = render(completed(false)); + assert.match(output, /\*\*Verification:\*\* failed/); + assert.doesNotMatch(output, /Verification passed:/); +}); + +test("final summary renders null verification as not reported", () => { + const output = render(completed(null)); + assert.match(output, /\*\*Verification:\*\* not reported/); + assert.doesNotMatch(output, /Verification passed: null/); +}); + +test("final summary renders missing verification as not reported", () => { + const event = completed(true) as Partial> as Extract; + delete (event as { verification_passed?: boolean | null }).verification_passed; + const output = render(event); + assert.match(output, /\*\*Verification:\*\* not reported/); + assert.doesNotMatch(output, /Verification passed: undefined/); +}); diff --git a/integrations/pi-villani/src/render.ts b/integrations/pi-villani/src/render.ts index 2e37a728..dae3cd44 100644 --- a/integrations/pi-villani/src/render.ts +++ b/integrations/pi-villani/src/render.ts @@ -54,7 +54,7 @@ export function renderFinalSummary(event: Extract `- ${file}`).join("\n") : "None reported"; const preexistingFiles = preexisting.length ? preexisting.map((file) => `- ${file}`).join("\n") : ""; - const verification = "verification_passed" in event ? String(event.verification_passed) : "not reported"; + const verification = formatVerificationStatus("verification_passed" in event ? event.verification_passed : undefined); const status = event.type === "run_completed" ? "completed" : event.type === "run_aborted" ? "aborted" : "failed"; markdown([ `### Villani ${status}`, @@ -65,8 +65,14 @@ export function renderFinalSummary(event: Extract Date: Sat, 30 May 2026 09:03:42 +1000 Subject: [PATCH 10/37] Fix pi-villani Windows test bridge fixtures --- integrations/pi-villani/src/extension.test.ts | 109 ++++++++++++------ integrations/pi-villani/src/index.ts | 11 +- integrations/pi-villani/src/process.test.ts | 34 +++--- 3 files changed, 102 insertions(+), 52 deletions(-) diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index 73271932..c84d490e 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -1,15 +1,16 @@ import assert from "node:assert/strict"; -import { mkdir, mkdtemp, writeFile } from "node:fs/promises"; +import { chmod, mkdir, mkdtemp, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; import type { Model } from "@earendil-works/pi-ai"; -import villaniPiExtension, { __setApprovalPrompterForTests } from "./index.js"; +import villaniPiExtension, { __setApprovalPrompterForTests, __setBridgeStarterForTests } from "./index.js"; import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent"; +import { VillaniBridgeProcess, type BridgeProcessOptions } from "./process.js"; +import { resolveRuntimeAsset, VILLANI_RUNTIME_VERSION } from "./runtimeConfig.js"; -async function mockNodeBridgeExecutable(exitAfterRun = false): Promise { +async function mockNodeBridgeModule(exitAfterRun = false): Promise { const dir = await mkdtemp(join(tmpdir(), "villani-extension-")); - const executable = join(dir, process.platform === "win32" ? "villani-mock.cmd" : "villani-mock"); const modulePath = join(dir, "bridge.mjs"); await writeFile(modulePath, ` process.stdout.write('{"type":"ready","protocol_version":1}\\n'); @@ -53,25 +54,47 @@ async function mockNodeBridgeExecutable(exitAfterRun = false): Promise { } }); `, "utf8"); - if (process.platform === "win32") { - await writeFile(executable, `@echo off\n"${process.execPath}" "${modulePath}" %*\n`, "utf8"); - } else { - await writeFile(executable, `#!/usr/bin/env sh\nexec "${process.execPath}" "${modulePath}" "$@"\n`, { encoding: "utf8", mode: 0o755 }); - } - return executable; + return modulePath; +} + +function installMockBridgeStarter(modulePath: string, calls: BridgeProcessOptions[] = []): () => void { + return __setBridgeStarterForTests(async (options) => { + calls.push(options); + const bridge = new VillaniBridgeProcess({ + spec: { + executable: process.execPath, + args: [modulePath], + display: process.execPath, + }, + cwd: options.cwd, + env: options.env, + signal: options.signal, + readyTimeoutMs: options.readyTimeoutMs ?? 1000, + }); + await bridge.waitUntilReady(); + return bridge; + }); } -async function installCachedRuntimeBridge(commandExecutable: string): Promise { +async function installCachedRuntimeBridge(): Promise<{ cacheRoot: string; executable: string }> { const cacheRoot = await mkdtemp(join(tmpdir(), "villani-runtime-cache-")); - const platformKey = `${process.platform}-${process.arch}`; - const runtimeDir = join(cacheRoot, "0.1.0", platformKey, "villani-code"); - const runtimeExecutable = join(runtimeDir, process.platform === "win32" ? "villani-code.exe" : "villani-code"); + const asset = resolveRuntimeAsset(); + const finalDir = join(cacheRoot, VILLANI_RUNTIME_VERSION, asset.platformKey); + const runtimeExecutable = join(finalDir, asset.executableRelativePath); + const runtimeDir = join(finalDir, "villani-code"); await mkdir(runtimeDir, { recursive: true }); - await writeFile(runtimeExecutable, process.platform === "win32" - ? `@echo off\n"${commandExecutable}" %*\n` - : `#!/usr/bin/env sh\nexec "${commandExecutable}" "$@"\n`, { encoding: "utf8", mode: 0o755 }); - await writeFile(join(cacheRoot, "0.1.0", platformKey, ".verified.json"), JSON.stringify({ runtimeVersion: "0.1.0", assetName: platformKey.startsWith("win32") ? "villani-runtime-v0.1.0-win32-x64.zip" : `villani-runtime-v0.1.0-${platformKey}.tar.gz`, checksum: "a".repeat(64) }), "utf8"); - return cacheRoot; + await writeFile(runtimeExecutable, "test placeholder; not executed\n", "utf8"); + if (process.platform !== "win32") await chmod(runtimeExecutable, 0o755); + await writeFile(join(finalDir, ".verified.json"), JSON.stringify({ runtimeVersion: VILLANI_RUNTIME_VERSION, assetName: asset.assetName, checksum: "a".repeat(64) }), "utf8"); + return { cacheRoot, executable: runtimeExecutable }; +} + +async function waitForCondition(predicate: () => boolean, timeoutMs = 3000): Promise { + const deadline = Date.now() + timeoutMs; + while (!predicate()) { + if (Date.now() > deadline) throw new Error("Timed out waiting for test condition."); + await new Promise((resolve) => setTimeout(resolve, 20)); + } } function createHost() { @@ -141,7 +164,8 @@ test("prevents overlapping runs and aborts active bridge run", async () => { const oldProvider = process.env.VILLANI_PROVIDER; const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -152,13 +176,14 @@ test("prevents overlapping runs and aborts active bridge run", async () => { villaniPiExtension(host.api); const ctx = createContext(messages); const runPromise = host.commands.get("villani")!("fix it", ctx); - await new Promise((resolve) => setTimeout(resolve, 250)); + await waitForCondition(() => messages.some((message) => /Villani started/.test(message))); await host.commands.get("villani")!("second", ctx); assert.match(messages.join("\n"), /already running/); await host.commands.get("villani-abort")!("", ctx); await runPromise; assert.match(messages.join("\n"), /Villani aborted/); } finally { + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); } }); @@ -166,7 +191,8 @@ test("prevents overlapping runs and aborts active bridge run", async () => { test("Pi model path resolves model auth", async () => { const oldCommand = process.env.VILLANI_COMMAND; const oldUsePi = process.env.VILLANI_USE_PI_MODEL; - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(true); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(true)); + process.env.VILLANI_COMMAND = "mock-villani"; delete process.env.VILLANI_USE_PI_MODEL; try { const host = createHost(); @@ -176,6 +202,7 @@ test("Pi model path resolves model auth", async () => { assert.equal(messages.includes("auth:pi-test"), true); assert.match(messages.join("\n"), /Villani completed/); } finally { + restoreBridge(); setOrDelete("VILLANI_COMMAND", oldCommand); setOrDelete("VILLANI_USE_PI_MODEL", oldUsePi); } @@ -187,7 +214,8 @@ test("explicit Villani config does not resolve Pi credentials", async () => { const oldProvider = process.env.VILLANI_PROVIDER; const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(true); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(true)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -199,6 +227,7 @@ test("explicit Villani config does not resolve Pi credentials", async () => { await host.commands.get("villani")!("fix it", createContext(messages, { model: fakeModel() })); assert.equal(messages.some((line) => line.startsWith("auth:")), false); } finally { + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); } }); @@ -224,8 +253,10 @@ test("default path uses cached downloaded runtime before launching bridge", asyn const oldProvider = process.env.VILLANI_PROVIDER; const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; - const bridgeExecutable = await mockNodeBridgeExecutable(true); - process.env.VILLANI_RUNTIME_CACHE_DIR = await installCachedRuntimeBridge(bridgeExecutable); + const bridgeCalls: BridgeProcessOptions[] = []; + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(true), bridgeCalls); + const cachedRuntime = await installCachedRuntimeBridge(); + process.env.VILLANI_RUNTIME_CACHE_DIR = cachedRuntime.cacheRoot; delete process.env.VILLANI_COMMAND; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; @@ -237,7 +268,9 @@ test("default path uses cached downloaded runtime before launching bridge", asyn villaniPiExtension(host.api); await host.commands.get("villani")!("fix it", createContext(messages)); assert.match(messages.join("\n"), /Villani completed/); + assert.equal(bridgeCalls[0]?.command, cachedRuntime.executable); } finally { + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("VILLANI_RUNTIME_CACHE_DIR", oldCache); } @@ -269,7 +302,8 @@ test("approval event is confirmed and answered", async () => { assert.equal(request.input.path, "safe-test.txt"); return true; }); - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -284,6 +318,7 @@ test("approval event is confirmed and answered", async () => { assert.match(messages.join("\n"), /approval_resolved|Villani completed/); } finally { restorePrompt(); + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); } @@ -296,14 +331,15 @@ test("rejected approval and UI failure default to denial", async () => { const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; const oldApproval = process.env.MOCK_APPROVAL; - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; process.env.MOCK_APPROVAL = "1"; + let restorePrompt = __setApprovalPrompterForTests(async () => false); try { - let restorePrompt = __setApprovalPrompterForTests(async () => false); const host = createHost(); const messages: string[] = []; villaniPiExtension(host.api); @@ -316,10 +352,11 @@ test("rejected approval and UI failure default to denial", async () => { const messages2: string[] = []; villaniPiExtension(host2.api); await host2.commands.get("villani")!("fix it", createContext(messages2)); - restorePrompt(); assert.match(messages2.join("\n"), /Approval UI unavailable/); assert.match(messages2.join("\n"), /Denied Villani Write request/); } finally { + restorePrompt(); + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); } @@ -332,7 +369,8 @@ test("approval prompt content includes path or command", async () => { const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; const oldApproval = process.env.MOCK_APPROVAL; - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -347,6 +385,7 @@ test("approval prompt content includes path or command", async () => { assert.match(messages.join("\n"), /pip install package-name/); assert.doesNotMatch(messages.join("\n"), /pi-secret|pi-token/); } finally { + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); } @@ -361,7 +400,8 @@ test("abort during pending approval sends denial and abort", async () => { const oldApproval = process.env.MOCK_APPROVAL; let unblock!: (value: boolean) => void; const restorePrompt = __setApprovalPrompterForTests(async () => new Promise((resolve) => { unblock = resolve; })); - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -373,7 +413,7 @@ test("abort during pending approval sends denial and abort", async () => { villaniPiExtension(host.api); const ctx = createContext(messages); const runPromise = host.commands.get("villani")!("fix it", ctx); - await new Promise((resolve) => setTimeout(resolve, 250)); + await waitForCondition(() => typeof unblock === "function"); await host.commands.get("villani-abort")!("", ctx); unblock(true); await runPromise; @@ -381,6 +421,7 @@ test("abort during pending approval sends denial and abort", async () => { assert.doesNotMatch(messages.join("\n"), /Approved Villani Write request/); } finally { restorePrompt(); + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); } @@ -398,7 +439,8 @@ test("multiple sequential approvals keep request ids distinct", async () => { seen.push(request.request_id); return request.request_id === "approval-1"; }); - process.env.VILLANI_COMMAND = await mockNodeBridgeExecutable(false); + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; process.env.VILLANI_PROVIDER = "openai"; process.env.VILLANI_MODEL = "fake"; @@ -414,6 +456,7 @@ test("multiple sequential approvals keep request ids distinct", async () => { assert.match(messages.join("\n"), /Denied Villani Patch request/); } finally { restorePrompt(); + restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); } diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index c3ebefb6..24a99feb 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -23,7 +23,10 @@ interface ActiveVillaniRun { export type ApprovalPrompter = (request: Extract, ctx: ExtensionCommandContext, signal: AbortSignal) => Promise; +type BridgeStarter = typeof startVillaniBridgeProcess; + let approvalPrompter: ApprovalPrompter = askUserForApproval; +let bridgeStarter: BridgeStarter = startVillaniBridgeProcess; let activeRun: ActiveVillaniRun | undefined; @@ -87,7 +90,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte }); if (abortController.signal.aborted) throw new Error("Villani run cancelled during runtime setup."); - run.bridge = await startVillaniBridgeProcess({ command: executable.executable, cwd: repo, signal: abortController.signal }); + run.bridge = await bridgeStarter({ command: executable.executable, cwd: repo, signal: abortController.signal }); run.phase = "running"; run.bridge.onEvent((event: BridgeEvent) => { if (abortController.signal.aborted && event.type === "run_completed") return; @@ -216,6 +219,12 @@ export function __setApprovalPrompterForTests(prompter: ApprovalPrompter): () => return () => { approvalPrompter = previous; }; } +export function __setBridgeStarterForTests(starter: BridgeStarter): () => void { + const previous = bridgeStarter; + bridgeStarter = starter; + return () => { bridgeStarter = previous; }; +} + async function resolveModelAuth(ctx: ExtensionCommandContext, model: Model): Promise<{ apiKey?: string; headers?: Record }> { const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model); if (!auth.ok) throw new Error(`Villani could not resolve Pi model authentication: ${sanitizeErrorMessage(auth.error)}`); diff --git a/integrations/pi-villani/src/process.test.ts b/integrations/pi-villani/src/process.test.ts index 6e7d14a6..23abfc6c 100644 --- a/integrations/pi-villani/src/process.test.ts +++ b/integrations/pi-villani/src/process.test.ts @@ -5,17 +5,15 @@ import { join } from "node:path"; import test from "node:test"; import { commandToSpec, DEFAULT_VILLANI_COMMAND, VillaniBridgeProcess } from "./process.js"; -async function mockBridge(script: string): Promise { +async function mockBridgeSpec(script: string) { const dir = await mkdtemp(join(tmpdir(), "villani-bridge-")); - const executable = join(dir, process.platform === "win32" ? "bridge.cmd" : "bridge"); - const path = join(dir, "bridge.mjs"); - await writeFile(path, script, "utf8"); - if (process.platform === "win32") { - await writeFile(executable, `@echo off\n"${process.execPath}" "${path}" %*\n`, "utf8"); - } else { - await writeFile(executable, `#!/usr/bin/env sh\nexec "${process.execPath}" "${path}" "$@"\n`, { encoding: "utf8", mode: 0o755 }); - } - return executable; + const modulePath = join(dir, "bridge.mjs"); + await writeFile(modulePath, script, "utf8"); + return { + executable: process.execPath, + args: [modulePath], + display: process.execPath, + }; } test("default command is villani-code", () => { @@ -34,27 +32,27 @@ test("reports missing executable without unhandled process error", async () => { }); test("rejects when bridge exits before ready", async () => { - const command = await mockBridge("process.stderr.write('bad startup'); process.exit(7);\n"); - const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + const spec = await mockBridgeSpec("process.stderr.write('bad startup'); process.exit(7);\n"); + const bridge = new VillaniBridgeProcess({ spec, cwd: process.cwd(), readyTimeoutMs: 1000 }); await assert.rejects(bridge.waitUntilReady(), /exited before ready.*bad startup/); }); test("rejects malformed bridge output", async () => { - const command = await mockBridge("process.stdout.write('not json\\n'); setTimeout(() => {}, 1000);\n"); - const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + const spec = await mockBridgeSpec("process.stdout.write('not json\\n'); setTimeout(() => {}, 1000);\n"); + const bridge = new VillaniBridgeProcess({ spec, cwd: process.cwd(), readyTimeoutMs: 1000 }); await assert.rejects(bridge.waitUntilReady(), /Malformed bridge JSONL output/); }); test("processes successful ready handshake", async () => { - const command = await mockBridge("process.stdout.write('{\"type\":\"ready\",\"protocol_version\":1}\\n'); setTimeout(() => process.exit(0), 50);\n"); - const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + const spec = await mockBridgeSpec("process.stdout.write('{\"type\":\"ready\",\"protocol_version\":1}\\n'); setTimeout(() => process.exit(0), 50);\n"); + const bridge = new VillaniBridgeProcess({ spec, cwd: process.cwd(), readyTimeoutMs: 1000 }); await bridge.waitUntilReady(); assert.equal(await bridge.waitForExit(), 0); }); test("exit during active run is observable", async () => { - const command = await mockBridge("process.stdout.write('{\"type\":\"ready\",\"protocol_version\":1}\\n'); setTimeout(() => process.exit(3), 50);\n"); - const bridge = new VillaniBridgeProcess({ command, cwd: process.cwd(), readyTimeoutMs: 1000 }); + const spec = await mockBridgeSpec("process.stdout.write('{\"type\":\"ready\",\"protocol_version\":1}\\n'); setTimeout(() => process.exit(3), 50);\n"); + const bridge = new VillaniBridgeProcess({ spec, cwd: process.cwd(), readyTimeoutMs: 1000 }); await bridge.waitUntilReady(); assert.equal(await bridge.waitForExit(), 3); }); From 037faf5574d0f180932c4949007cf52266757c15 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 09:07:48 +1000 Subject: [PATCH 11/37] Use scoped npm package name for Pi integration --- integrations/pi-villani/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json index bcde9661..d063f1c5 100644 --- a/integrations/pi-villani/package.json +++ b/integrations/pi-villani/package.json @@ -1,5 +1,5 @@ { - "name": "pi-villani", + "name": "@simonvillani/pi-villani", "version": "0.1.0", "description": "Pi extension bridge for running Villani Code as a delegated coding runner.", "main": "dist/index.js", From 5a6a81219a1d208e085fca424dd4bcd6b38c7157 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 09:17:22 +1000 Subject: [PATCH 12/37] Fix runtime checksum generation on macOS --- .github/workflows/build-pi-villani-runtime-release.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-pi-villani-runtime-release.yml b/.github/workflows/build-pi-villani-runtime-release.yml index 88f6d565..935592b7 100644 --- a/.github/workflows/build-pi-villani-runtime-release.yml +++ b/.github/workflows/build-pi-villani-runtime-release.yml @@ -64,7 +64,12 @@ jobs: run: tar -czf "$ASSET" -C dist/runtime villani-code - name: Generate checksum shell: bash - run: sha256sum "$ASSET" > "$ASSET.sha256" + run: | + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$ASSET" > "$ASSET.sha256" + else + shasum -a 256 "$ASSET" > "$ASSET.sha256" + fi - uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform }}-runtime From 231b6feba546cf4b2a17ef07b879c0e7393bc9f6 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 09:17:47 +1000 Subject: [PATCH 13/37] Bump Pi Villani runtime version to 0.1.1 --- integrations/pi-villani/src/runtimeConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/pi-villani/src/runtimeConfig.ts b/integrations/pi-villani/src/runtimeConfig.ts index 0068a484..07dfddfb 100644 --- a/integrations/pi-villani/src/runtimeConfig.ts +++ b/integrations/pi-villani/src/runtimeConfig.ts @@ -1,4 +1,4 @@ -export const VILLANI_RUNTIME_VERSION = "0.1.0"; +export const VILLANI_RUNTIME_VERSION = "0.1.1"; export const VILLANI_RUNTIME_REPOSITORY = "mmprotest/villani-code"; export const VILLANI_RUNTIME_TAG = `pi-villani-runtime-v${VILLANI_RUNTIME_VERSION}`; From 237d9feb9ea411f29f6850f9ca1bb694bc7e18c9 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 09:22:00 +1000 Subject: [PATCH 14/37] Fix Intel macOS runtime runner and bump runtime to 0.1.2 --- .github/workflows/build-pi-villani-runtime-release.yml | 2 +- integrations/pi-villani/src/runtimeConfig.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pi-villani-runtime-release.yml b/.github/workflows/build-pi-villani-runtime-release.yml index 935592b7..65779215 100644 --- a/.github/workflows/build-pi-villani-runtime-release.yml +++ b/.github/workflows/build-pi-villani-runtime-release.yml @@ -29,7 +29,7 @@ jobs: extension: tar.gz executable: dist/runtime/villani-code/villani-code - platform: darwin-x64 - os: macos-13 + os: macos-15-intel extension: tar.gz executable: dist/runtime/villani-code/villani-code - platform: linux-x64 diff --git a/integrations/pi-villani/src/runtimeConfig.ts b/integrations/pi-villani/src/runtimeConfig.ts index 07dfddfb..675c3996 100644 --- a/integrations/pi-villani/src/runtimeConfig.ts +++ b/integrations/pi-villani/src/runtimeConfig.ts @@ -1,4 +1,4 @@ -export const VILLANI_RUNTIME_VERSION = "0.1.1"; +export const VILLANI_RUNTIME_VERSION = "0.1.2"; export const VILLANI_RUNTIME_REPOSITORY = "mmprotest/villani-code"; export const VILLANI_RUNTIME_TAG = `pi-villani-runtime-v${VILLANI_RUNTIME_VERSION}`; From a3e2f1189ebb0ca450642f115d0d69fbe7d9ccbe Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 09:29:31 +1000 Subject: [PATCH 15/37] Derive runtime asset version from release tag --- .github/workflows/build-pi-villani-runtime-release.yml | 4 +++- integrations/pi-villani/src/runtimeConfig.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-pi-villani-runtime-release.yml b/.github/workflows/build-pi-villani-runtime-release.yml index 65779215..6afc7ec5 100644 --- a/.github/workflows/build-pi-villani-runtime-release.yml +++ b/.github/workflows/build-pi-villani-runtime-release.yml @@ -10,7 +10,7 @@ permissions: contents: write env: - RUNTIME_VERSION: "0.1.0" + RUNTIME_VERSION: "0.1.2" jobs: runtime: @@ -53,7 +53,9 @@ jobs: - name: Compute asset name shell: bash run: | + RUNTIME_VERSION="${GITHUB_REF_NAME#pi-villani-runtime-v}" ASSET="villani-runtime-v${RUNTIME_VERSION}-${{ matrix.platform }}.${{ matrix.extension }}" + echo "RUNTIME_VERSION=${RUNTIME_VERSION}" >> "$GITHUB_ENV" echo "ASSET=${ASSET}" >> "$GITHUB_ENV" - name: Archive runtime (Windows) if: matrix.extension == 'zip' diff --git a/integrations/pi-villani/src/runtimeConfig.ts b/integrations/pi-villani/src/runtimeConfig.ts index 675c3996..d5daebdb 100644 --- a/integrations/pi-villani/src/runtimeConfig.ts +++ b/integrations/pi-villani/src/runtimeConfig.ts @@ -1,4 +1,4 @@ -export const VILLANI_RUNTIME_VERSION = "0.1.2"; +export const VILLANI_RUNTIME_VERSION = "0.1.3"; export const VILLANI_RUNTIME_REPOSITORY = "mmprotest/villani-code"; export const VILLANI_RUNTIME_TAG = `pi-villani-runtime-v${VILLANI_RUNTIME_VERSION}`; From d7c0facf35989991e6aeaeb6778de3819cfff800 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sat, 30 May 2026 09:59:42 +1000 Subject: [PATCH 16/37] Fix Pi approval visibility and plan permissions --- integrations/pi-villani/src/extension.test.ts | 49 +++++++++++++- integrations/pi-villani/src/index.ts | 64 ++++++++++++++++++- tests/integrations/test_pi_bridge.py | 45 +++++++++++++ tests/test_permissions.py | 15 +++++ tests/test_runner_approvals.py | 37 +++++++++++ tests/test_state_runtime.py | 24 ++++--- villani_code/permissions.py | 2 + villani_code/state.py | 1 + villani_code/state_runtime.py | 22 ++++++- 9 files changed, 244 insertions(+), 15 deletions(-) diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index c84d490e..8c71ebae 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -138,7 +138,8 @@ function createContext(messages: string[], options: { model?: Model; aut ui: { notify: (message: string) => messages.push(message), confirm: async (title: string, message: string) => { messages.push(`confirm:${title}:${message}`); return false; }, - setStatus: (_key: string, text: string | undefined) => { if (text) messages.push(text); }, + setStatus: (_key: string, text: string | undefined) => { messages.push(text ? `status:${text}` : "status:clear"); if (text) messages.push(text); }, + setWidget: (_key: string, lines: string[] | undefined) => { messages.push(lines ? `widget:${lines.join("|")}` : "widget:clear"); }, }, } as unknown as ExtensionCommandContext; } @@ -276,6 +277,39 @@ test("default path uses cached downloaded runtime before launching bridge", asyn } }); + + +test("startup and final events update visible persistent UI", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(true)); + process.env.VILLANI_COMMAND = "mock-villani"; + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages)); + const joined = messages.join("\n"); + assert.match(joined, /status:Villani: starting/); + assert.match(joined, /status:Villani: starting model proxy/); + assert.match(joined, /status:Villani: starting runtime/); + assert.match(joined, /status:Villani: running/); + assert.match(joined, /status:clear/); + assert.match(joined, /widget:clear/); + assert.match(joined, /done/); + } finally { + restoreBridge(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + } +}); + function restoreEnv(values: { oldCommand?: string; oldUsePi?: string; oldProvider?: string; oldModel?: string; oldBase?: string }): void { setOrDelete("VILLANI_COMMAND", values.oldCommand); setOrDelete("VILLANI_USE_PI_MODEL", values.oldUsePi); @@ -297,7 +331,10 @@ test("approval event is confirmed and answered", async () => { const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; const oldApproval = process.env.MOCK_APPROVAL; + let messages: string[] = []; const restorePrompt = __setApprovalPrompterForTests(async (request) => { + assert.match(messages.join("\n"), /status:Villani: awaiting approval for Write/); + assert.match(messages.join("\n"), /widget:Villani is awaiting approval\|Write file: safe-test.txt/); assert.equal(request.request_id, "approval-1"); assert.equal(request.input.path, "safe-test.txt"); return true; @@ -311,10 +348,13 @@ test("approval event is confirmed and answered", async () => { process.env.MOCK_APPROVAL = "1"; try { const host = createHost(); - const messages: string[] = []; + messages = []; villaniPiExtension(host.api); await host.commands.get("villani")!("fix it", createContext(messages)); - assert.match(messages.join("\n"), /Approved Villani Write request/); + const joined = messages.join("\n"); + assert.match(joined, /status:Villani: awaiting approval for Write/); + assert.match(joined, /widget:Villani is awaiting approval\|Write file: safe-test.txt/); + assert.match(joined, /Approved Villani Write request/); assert.match(messages.join("\n"), /approval_resolved|Villani completed/); } finally { restorePrompt(); @@ -346,6 +386,8 @@ test("rejected approval and UI failure default to denial", async () => { await host.commands.get("villani")!("fix it", createContext(messages)); restorePrompt(); assert.match(messages.join("\n"), /Denied Villani Write request/); + assert.match(messages.join("\n"), /status:Villani: denied Write approval/); + assert.match(messages.join("\n"), /widget:Villani approval denied\|Write file: safe-test.txt/); restorePrompt = __setApprovalPrompterForTests(async () => { throw new Error("dialog missing"); }); const host2 = createHost(); @@ -418,6 +460,7 @@ test("abort during pending approval sends denial and abort", async () => { unblock(true); await runPromise; assert.match(messages.join("\n"), /Villani aborted|cancelled/); + assert.match(messages.join("\n"), /status:clear/); assert.doesNotMatch(messages.join("\n"), /Approved Villani Write request/); } finally { restorePrompt(); diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index 24a99feb..d30494fc 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -9,6 +9,8 @@ import { PiLikeOutput, renderEvent } from "./render.js"; type ActiveRunPhase = "starting" | "running" | "aborting" | "completed"; +const VILLANI_UI_KEY = "villani"; + interface ActiveVillaniRun { id: string; repo: string; @@ -60,6 +62,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte const done = new Promise((resolve) => { resolveDone = resolve; }); const run: ActiveVillaniRun = { id: runId, repo, phase: "starting", abortController, pendingApprovals: new Set(), done, resolveDone }; activeRun = run; + setVillaniStatus(ctx.ui, "Villani: starting"); let finished = false; let resolveFinal!: () => void; @@ -79,10 +82,12 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte const auth = !explicitConfig && model ? await resolveModelAuth(ctx, model) : undefined; if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); + setVillaniStatus(ctx.ui, "Villani: starting model proxy"); run.proxy = !explicitConfig && model ? new PiModelProxy({ model, apiKey: auth?.apiKey, headers: auth?.headers, signal: abortController.signal }) : undefined; const proxyUrl = run.proxy ? await run.proxy.start() : undefined; if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); + setVillaniStatus(ctx.ui, "Villani: starting runtime"); const executable = await resolveVillaniExecutable({ overrideCommand: process.env.VILLANI_COMMAND, signal: abortController.signal, @@ -92,6 +97,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte run.bridge = await bridgeStarter({ command: executable.executable, cwd: repo, signal: abortController.signal }); run.phase = "running"; + setVillaniStatus(ctx.ui, "Villani: running"); run.bridge.onEvent((event: BridgeEvent) => { if (abortController.signal.aborted && event.type === "run_completed") return; if (event.type === "approval_required") { @@ -101,6 +107,8 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte renderEvent(event, output); if (event.type === "run_completed" || event.type === "run_failed" || event.type === "run_aborted") { finished = event.type === "run_completed"; + showFinalRunMessage(ctx.ui, event); + clearVillaniUi(ctx.ui); resolveFinal(); } if (event.type === "error") output.error?.(`Villani bridge error: ${event.error}`); @@ -122,9 +130,16 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte }), ]); } catch (error) { - if (abortController.signal.aborted) output.warn?.(!run.bridge ? "Villani run cancelled during startup." : "Villani run cancelled."); - else output.error?.(error instanceof Error ? error.message : String(error)); + if (abortController.signal.aborted) { + output.warn?.(!run.bridge ? "Villani run cancelled during startup." : "Villani run cancelled."); + showDurableMessage(ctx.ui, !run.bridge ? "Villani run cancelled during startup." : "Villani run cancelled."); + } else { + const message = error instanceof Error ? error.message : String(error); + output.error?.(message); + showDurableMessage(ctx.ui, `Villani failed: ${message}`); + } } finally { + clearVillaniUi(ctx.ui); run.phase = "completed"; if (!finished && run.bridge && !abortController.signal.aborted) { try { run.bridge.abort(runId); } catch { /* ignore cleanup races */ } @@ -143,6 +158,7 @@ export async function abortVillaniRun(ctx: ExtensionCommandContext): Promise { run.pendingApprovals.add(event.request_id); + setVillaniStatus(ctx.ui, `Villani: awaiting approval for ${event.tool}`); + setVillaniWidget(ctx.ui, ["Villani is awaiting approval", event.summary]); let approved = false; try { approved = !run.abortController.signal.aborted && await approvalPrompter(event, ctx, run.abortController.signal); @@ -183,6 +201,13 @@ async function handleApprovalRequired( const stillPending = run.pendingApprovals.delete(event.request_id); if (!stillPending) return; if (run.abortController.signal.aborted || activeRun?.id !== run.id) approved = false; + if (approved) { + setVillaniStatus(ctx.ui, "Villani: running"); + clearVillaniWidget(ctx.ui); + } else { + setVillaniStatus(ctx.ui, `Villani: denied ${event.tool} approval`); + setVillaniWidget(ctx.ui, ["Villani approval denied", event.summary]); + } try { run.bridge?.respondToApproval(run.id, event.request_id, approved); output.warn?.(`${approved ? "Approved" : "Denied"} Villani ${event.tool} request: ${event.summary}`); @@ -191,6 +216,41 @@ async function handleApprovalRequired( } } +function setVillaniStatus(ui: ExtensionUIContext, text: string | undefined): void { + const setter = ui.setStatus as ((key: string, text?: string) => void) | undefined; + setter?.(VILLANI_UI_KEY, text); +} + +function setVillaniWidget(ui: ExtensionUIContext, lines: string[] | undefined): void { + const setter = ui.setWidget as ((key: string, lines?: string[], placement?: string) => void) | undefined; + setter?.(VILLANI_UI_KEY, lines, "aboveEditor"); +} + +function clearVillaniWidget(ui: ExtensionUIContext): void { + setVillaniWidget(ui, undefined); +} + +function clearVillaniUi(ui: ExtensionUIContext): void { + setVillaniStatus(ui, undefined); + clearVillaniWidget(ui); +} + +function showDurableMessage(ui: ExtensionUIContext, message: string): void { + ui.notify?.(message); +} + +function showFinalRunMessage(ui: ExtensionUIContext, event: Extract): void { + if (event.type === "run_completed") { + showDurableMessage(ui, event.summary || "Villani completed."); + return; + } + if (event.type === "run_aborted") { + showDurableMessage(ui, event.summary || "Villani aborted."); + return; + } + showDurableMessage(ui, event.summary || event.error || "Villani failed."); +} + async function askUserForApproval(request: Extract, ctx: ExtensionCommandContext, signal: AbortSignal): Promise { if (!ctx.hasUI || typeof ctx.ui.confirm !== "function") return false; return ctx.ui.confirm(approvalTitle(request), approvalMessage(request), { signal }); diff --git a/tests/integrations/test_pi_bridge.py b/tests/integrations/test_pi_bridge.py index 4aa39c5a..234dfce7 100644 --- a/tests/integrations/test_pi_bridge.py +++ b/tests/integrations/test_pi_bridge.py @@ -8,6 +8,8 @@ from typing import Any from villani_code.integrations.pi_bridge import PiBridge, map_runner_event, summarize_approval_request +from villani_code.state import Runner +from villani_code import state_runtime class DummyRunner: @@ -33,6 +35,49 @@ def collect_json_lines(output: io.StringIO) -> list[dict[str, Any]]: return [json.loads(line) for line in output.getvalue().splitlines() if line.strip()] +def seed_planning_repo(repo: Path) -> None: + (repo / "villani_code").mkdir(parents=True, exist_ok=True) + (repo / "villani_code" / "__init__.py").write_text("", encoding="utf-8") + (repo / "pyproject.toml").write_text("[project]\nname='x'\n", encoding="utf-8") + + +class PlanningClient: + def create_message(self, _payload: Any, stream: bool) -> dict[str, Any]: + return {"content": [{"type": "text", "text": "ok"}]} + + +def test_bridge_planning_does_not_emit_execution_plan_approval(tmp_path: Path) -> None: + seed_planning_repo(tmp_path) + + class PlanningRunner(Runner): + def run(self, instruction: str, **_kwargs: Any) -> dict[str, Any]: + state_runtime.ensure_project_memory_and_plan(self, instruction) + return { + "response": {"content": [{"type": "text", "text": "planned"}]}, + "execution": {"final_text": "planned"}, + "transcript_path": None, + } + + def factory(_command: Any, event_callback: Any, approval_callback: Any) -> PlanningRunner: + runner = PlanningRunner(client=PlanningClient(), repo=tmp_path, model="m", stream=False) + runner.event_callback = event_callback + runner.approval_callback = approval_callback + return runner + + stdout = io.StringIO() + bridge = PiBridge(stdout=stdout, runner_factory=factory) + bridge._handle_command({"type": "run", "id": "run-plan", "task": "delete files and rewrite history", "repo": str(tmp_path)}) + deadline = time.time() + 2 + while bridge._active and time.time() < deadline: + time.sleep(0.01) + bridge._drain_events() + + events = collect_json_lines(stdout) + assert any(event.get("type") == "phase" and event.get("phase") == "planning_started" for event in events) + assert not any(event.get("type") == "approval_required" and event.get("tool") == "ExecutionPlan" for event in events) + assert events[-1]["type"] == "run_completed" + + def test_stdio_ping_emits_ready_and_pong() -> None: stdin = io.StringIO('{"type":"ping","id":"abc"}\n') stdout = io.StringIO() diff --git a/tests/test_permissions.py b/tests/test_permissions.py index 369e87d9..ab0938e0 100644 --- a/tests/test_permissions.py +++ b/tests/test_permissions.py @@ -72,3 +72,18 @@ def test_public_target_for_exposes_normalized_target(tmp_path: Path): def test_bash_matches_malformed_input_fails_closed(): assert bash_matches("*", "echo \"unterminated") is False + + +def test_permission_engine_allows_execution_plan_without_weakening_mutations(tmp_path: Path) -> None: + engine = PermissionEngine(PermissionConfig.from_strings(deny=[], ask=["ExecutionPlan(*)", "Write(*)", "Patch(*)"], allow=["BashSafe(*)"]), tmp_path) + + assert engine.evaluate("ExecutionPlan", {"summary": "plan", "risk": "high"}) == Decision.ALLOW + assert engine.evaluate("Write", {"file_path": "a.txt"}) == Decision.ASK + assert engine.evaluate("Patch", {"file_path": "a.txt"}) == Decision.ASK + assert engine.evaluate("Bash", {"command": "pip install x"}) == Decision.ASK + + +def test_execution_plan_still_respects_explicit_deny(tmp_path: Path) -> None: + engine = PermissionEngine(PermissionConfig.from_strings(deny=["ExecutionPlan(*)"], ask=[], allow=[]), tmp_path) + + assert engine.evaluate("ExecutionPlan", {"summary": "plan"}) == Decision.DENY diff --git a/tests/test_runner_approvals.py b/tests/test_runner_approvals.py index 6e5649b4..e446a348 100644 --- a/tests/test_runner_approvals.py +++ b/tests/test_runner_approvals.py @@ -49,3 +49,40 @@ def test_runner_approved_ask_runs_tool(tmp_path: Path) -> None: tool_result = next(m for m in result["messages"] if m["role"] == "user" and m["content"][0].get("type") == "tool_result") assert tool_result["content"][0]["is_error"] is False assert "a.txt" in tool_result["content"][0]["content"] + + +def _protected_runner(tmp_path: Path, approved: bool = False) -> tuple[Runner, list[dict]]: + events: list[dict] = [] + runner = Runner(client=AskToolClient(), repo=tmp_path, model="m", stream=False) + runner.event_callback = events.append + runner.approval_callback = lambda _tool, _payload: approved + return runner, events + + +def test_write_still_emits_approval_required(tmp_path: Path) -> None: + runner, events = _protected_runner(tmp_path) + + result = runner._execute_tool_with_policy("Write", {"file_path": "a.txt", "content": "x"}, "toolu_1", 0) + + assert result["is_error"] is True + assert any(event.get("type") == "approval_required" and event.get("name") == "Write" for event in events) + + +def test_patch_still_emits_approval_required(tmp_path: Path) -> None: + (tmp_path / "a.txt").write_text("old\n", encoding="utf-8") + runner, events = _protected_runner(tmp_path) + diff = "--- a/a.txt\n+++ b/a.txt\n@@ -1 +1 @@\n-old\n+new\n" + + result = runner._execute_tool_with_policy("Patch", {"file_path": "a.txt", "diff": diff}, "toolu_1", 0) + + assert result["is_error"] is True + assert any(event.get("type") == "approval_required" and event.get("name") == "Patch" for event in events) + + +def test_unsafe_bash_still_emits_approval_required(tmp_path: Path) -> None: + runner, events = _protected_runner(tmp_path) + + result = runner._execute_tool_with_policy("Bash", {"command": "pip install package-name"}, "toolu_1", 0) + + assert result["is_error"] is True + assert any(event.get("type") == "approval_required" and event.get("name") == "Bash" for event in events) diff --git a/tests/test_state_runtime.py b/tests/test_state_runtime.py index 417f52b1..6ae6ab56 100644 --- a/tests/test_state_runtime.py +++ b/tests/test_state_runtime.py @@ -39,19 +39,25 @@ def deny_if_called(_name: str, _payload: dict) -> bool: assert "plan_approval_required" not in event_types -def test_non_villani_high_risk_plan_rejection_path(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: +def test_execution_plan_allowed_without_approval_callback(tmp_path: Path) -> None: _seed_repo(tmp_path) runner = Runner(client=DummyClient(), repo=tmp_path, model="m", stream=False, villani_mode=False) - asked = {"count": 0} + events: list[dict] = [] + runner.event_callback = events.append + + def fail_if_called(_name: str, _payload: dict) -> bool: + raise AssertionError("ExecutionPlan must be allowed by policy without prompting") + + runner.approval_callback = fail_if_called - def reject(_name: str, _payload: dict) -> bool: - asked["count"] += 1 - return False + state_runtime.ensure_project_memory_and_plan(runner, "delete files and rewrite history") - runner.approval_callback = reject - with pytest.raises(RuntimeError, match="Execution plan rejected"): - state_runtime.ensure_project_memory_and_plan(runner, "delete files and rewrite history") - assert asked["count"] == 1 + event_types = [e.get("type") for e in events] + assert "plan_auto_approved" in event_types + assert "plan_approval_required" not in event_types + policy_events = [e for e in events if e.get("type") == "policy_decision" and e.get("name") == "ExecutionPlan"] + assert policy_events + assert policy_events[-1]["decision"] == "allow" class _RetrieverHit: diff --git a/villani_code/permissions.py b/villani_code/permissions.py index a849dbd2..931a2197 100644 --- a/villani_code/permissions.py +++ b/villani_code/permissions.py @@ -61,6 +61,8 @@ def evaluate_with_reason(self, tool: str, payload: dict, bypass: bool = False, a for rule in self.config.deny: if self._matches(rule, tool, target): return PolicyDecision(Decision.DENY, f"Matched deny rule: {rule.tool}({rule.pattern})") + if tool == "ExecutionPlan": + return PolicyDecision(Decision.ALLOW, "ExecutionPlan is an internal read-only planning operation") for rule in self.config.ask: if self._matches(rule, tool, target): return PolicyDecision(Decision.ASK, f"Matched ask rule: {rule.tool}({rule.pattern})") diff --git a/villani_code/state.py b/villani_code/state.py index 43faa570..06376179 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -538,6 +538,7 @@ def __init__( "GitCheckout(*)", "GitCommit(*)", "SubmitPlan(*)", + "ExecutionPlan(*)", ], ), repo=self.repo, diff --git a/villani_code/state_runtime.py b/villani_code/state_runtime.py index e4d9cc6e..96eb4d54 100644 --- a/villani_code/state_runtime.py +++ b/villani_code/state_runtime.py @@ -14,6 +14,7 @@ from villani_code.autonomy import VerificationStatus from villani_code.indexing import DEFAULT_IGNORE, RepoIndex from villani_code.live_display import apply_live_display_delta +from villani_code.permissions import Decision from villani_code.planning import TaskMode, generate_execution_plan from villani_code.project_memory import SessionState, ensure_project_memory, load_repo_map, update_session_state from villani_code.context_governance import ContextCompactor, ContextInclusionReason, ContextExclusionReason @@ -1311,8 +1312,27 @@ def ensure_project_memory_and_plan(runner: Any, instruction: str) -> None: update_session_state(runner.repo, session) return + approval_payload = {"summary": plan.to_human_text(), "risk": plan.risk_level.value} + policy = runner.permissions.evaluate_with_reason( + "ExecutionPlan", + approval_payload, + bypass=runner.bypass_permissions, + auto_accept_edits=runner.auto_accept_edits, + ) + runner._emit_policy_event("ExecutionPlan", approval_payload, policy.decision, policy.reason) + if policy.decision == Decision.ALLOW: + runner.event_callback({"type": "plan_auto_approved", "risk": plan.risk_level.value}) + update_session_state(runner.repo, session) + return + if policy.decision == Decision.DENY: + runner.event_callback({"type": "plan_rejected"}) + session.outcome_status = "rejected" + session.next_step_hints = ["Revise plan scope or lower risk before retrying"] + update_session_state(runner.repo, session) + raise RuntimeError("Execution plan denied by permission policy.") + runner.event_callback({"type": "plan_approval_required", "risk": plan.risk_level.value}) - approved = runner.approval_callback("ExecutionPlan", {"summary": plan.to_human_text(), "risk": plan.risk_level.value}) + approved = runner.approval_callback("ExecutionPlan", approval_payload) if not approved: runner.event_callback({"type": "plan_rejected"}) session.outcome_status = "rejected" From 0e3fa1ff189ea170f9174e6a8da6533199d56145 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sat, 30 May 2026 13:37:36 +1000 Subject: [PATCH 17/37] Fix Pi approval response deadlock --- integrations/pi-villani/src/extension.test.ts | 162 ++++++++++++++---- integrations/pi-villani/src/index.ts | 102 +++++++++-- integrations/pi-villani/src/runtimeConfig.ts | 2 +- 3 files changed, 219 insertions(+), 47 deletions(-) diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index 8c71ebae..9b51c7e4 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -16,6 +16,7 @@ async function mockNodeBridgeModule(exitAfterRun = false): Promise { process.stdout.write('{"type":"ready","protocol_version":1}\\n'); process.stdin.setEncoding('utf8'); let buffer = ''; + const approvalResponses = new Map(); process.stdin.on('data', chunk => { buffer += chunk; for (;;) { @@ -41,6 +42,9 @@ async function mockNodeBridgeModule(exitAfterRun = false): Promise { if (${JSON.stringify(exitAfterRun)}) { process.stdout.write(JSON.stringify({type:'run_completed', id:msg.id, success:true, changed_files:[], preexisting_dirty_files:[], verification_passed:null, summary:'done', transcript_path:null}) + '\\n'); setTimeout(() => process.exit(0), 10); } } if (msg.type === 'approval_response') { + const count = (approvalResponses.get(msg.request_id) || 0) + 1; + approvalResponses.set(msg.request_id, count); + process.stdout.write(JSON.stringify({type:'phase', id:msg.id, phase:'test', message:'approval_response:' + msg.request_id + ':' + msg.approved + ':count:' + count}) + '\\n'); process.stdout.write(JSON.stringify({type:'approval_resolved', id:msg.id, request_id:msg.request_id, tool: msg.request_id === 'approval-2' ? 'Patch' : 'Write', approved:msg.approved}) + '\\n'); if (process.env.MOCK_APPROVAL === '2' && msg.request_id === 'approval-1') { process.stdout.write(JSON.stringify({type:'approval_required', id:msg.id, request_id:'approval-2', tool:'Patch', summary:'Apply patch to: two.txt', input:{path:'two.txt'}}) + '\\n'); @@ -122,7 +126,7 @@ function fakeModel(): Model { } as Model; } -function createContext(messages: string[], options: { model?: Model; authDelayMs?: number; signal?: AbortSignal } = {}): ExtensionCommandContext { +function createContext(messages: string[], options: { model?: Model; authDelayMs?: number; signal?: AbortSignal; throwStatusMatching?: RegExp; throwWidgetMatching?: RegExp; confirmResult?: boolean; confirmError?: Error } = {}): ExtensionCommandContext { return { cwd: process.cwd(), model: options.model, @@ -137,9 +141,22 @@ function createContext(messages: string[], options: { model?: Model; aut hasUI: true, ui: { notify: (message: string) => messages.push(message), - confirm: async (title: string, message: string) => { messages.push(`confirm:${title}:${message}`); return false; }, - setStatus: (_key: string, text: string | undefined) => { messages.push(text ? `status:${text}` : "status:clear"); if (text) messages.push(text); }, - setWidget: (_key: string, lines: string[] | undefined) => { messages.push(lines ? `widget:${lines.join("|")}` : "widget:clear"); }, + confirm: async (title: string, message: string) => { + messages.push(`confirm:${title}:${message}`); + if (options.confirmError) throw options.confirmError; + return options.confirmResult ?? false; + }, + setStatus: (_key: string, text: string | undefined) => { + const rendered = text ? `status:${text}` : "status:clear"; + if (text && options.throwStatusMatching?.test(text)) throw new Error("status failed"); + messages.push(rendered); + if (text) messages.push(text); + }, + setWidget: (_key: string, lines: string[] | undefined, widgetOptions?: { placement?: string }) => { + const rendered = lines ? `widget:${lines.join("|")}:placement:${widgetOptions?.placement ?? "none"}` : "widget:clear"; + if (lines && options.throwWidgetMatching?.test(lines.join("\n"))) throw new Error("widget failed"); + messages.push(rendered); + }, }, } as unknown as ExtensionCommandContext; } @@ -324,6 +341,14 @@ function setOrDelete(name: string, value: string | undefined): void { } +function approvalResponseLines(messages: string[], requestId = "approval-1"): string[] { + return messages.filter((message) => message.includes(`approval_response:${requestId}:`)); +} + +function assertOneApprovalResponse(messages: string[], approved: boolean, requestId = "approval-1"): void { + assert.deepEqual(approvalResponseLines(messages, requestId), [`Villani: approval_response:${requestId}:${approved}:count:1`]); +} + test("approval event is confirmed and answered", async () => { const oldCommand = process.env.VILLANI_COMMAND; const oldUsePi = process.env.VILLANI_USE_PI_MODEL; @@ -331,14 +356,6 @@ test("approval event is confirmed and answered", async () => { const oldModel = process.env.VILLANI_MODEL; const oldBase = process.env.VILLANI_BASE_URL; const oldApproval = process.env.MOCK_APPROVAL; - let messages: string[] = []; - const restorePrompt = __setApprovalPrompterForTests(async (request) => { - assert.match(messages.join("\n"), /status:Villani: awaiting approval for Write/); - assert.match(messages.join("\n"), /widget:Villani is awaiting approval\|Write file: safe-test.txt/); - assert.equal(request.request_id, "approval-1"); - assert.equal(request.input.path, "safe-test.txt"); - return true; - }); const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); process.env.VILLANI_COMMAND = "mock-villani"; process.env.VILLANI_USE_PI_MODEL = "false"; @@ -348,23 +365,25 @@ test("approval event is confirmed and answered", async () => { process.env.MOCK_APPROVAL = "1"; try { const host = createHost(); - messages = []; + const messages: string[] = []; villaniPiExtension(host.api); - await host.commands.get("villani")!("fix it", createContext(messages)); + await host.commands.get("villani")!("fix it", createContext(messages, { confirmResult: true })); const joined = messages.join("\n"); assert.match(joined, /status:Villani: awaiting approval for Write/); - assert.match(joined, /widget:Villani is awaiting approval\|Write file: safe-test.txt/); + assert.match(joined, /widget:Villani is awaiting approval\|Write file: safe-test.txt:placement:aboveEditor/); + assert.match(joined, /confirm:Villani wants to write a file/); + assert.match(joined, /File: safe-test.txt/); assert.match(joined, /Approved Villani Write request/); - assert.match(messages.join("\n"), /approval_resolved|Villani completed/); + assertOneApprovalResponse(messages, true); + assert.match(messages.join("\n"), /Villani completed/); } finally { - restorePrompt(); restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); } }); -test("rejected approval and UI failure default to denial", async () => { +test("approval confirmation denial sends one denial response", async () => { const oldCommand = process.env.VILLANI_COMMAND; const oldUsePi = process.env.VILLANI_USE_PI_MODEL; const oldProvider = process.env.VILLANI_PROVIDER; @@ -378,26 +397,103 @@ test("rejected approval and UI failure default to denial", async () => { process.env.VILLANI_MODEL = "fake"; process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; process.env.MOCK_APPROVAL = "1"; - let restorePrompt = __setApprovalPrompterForTests(async () => false); try { const host = createHost(); const messages: string[] = []; villaniPiExtension(host.api); - await host.commands.get("villani")!("fix it", createContext(messages)); - restorePrompt(); + await host.commands.get("villani")!("fix it", createContext(messages, { confirmResult: false })); + assert.match(messages.join("\n"), /confirm:Villani wants to write a file/); assert.match(messages.join("\n"), /Denied Villani Write request/); assert.match(messages.join("\n"), /status:Villani: denied Write approval/); - assert.match(messages.join("\n"), /widget:Villani approval denied\|Write file: safe-test.txt/); + assert.match(messages.join("\n"), /widget:Villani approval denied\|Write file: safe-test.txt:placement:aboveEditor/); + assertOneApprovalResponse(messages, false); + } finally { + restoreBridge(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); - restorePrompt = __setApprovalPrompterForTests(async () => { throw new Error("dialog missing"); }); - const host2 = createHost(); - const messages2: string[] = []; - villaniPiExtension(host2.api); - await host2.commands.get("villani")!("fix it", createContext(messages2)); - assert.match(messages2.join("\n"), /Approval UI unavailable/); - assert.match(messages2.join("\n"), /Denied Villani Write request/); +test("approval status rendering failure sends one denial response", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "1"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages, { throwStatusMatching: /awaiting approval/, confirmError: new Error("confirmation should not open after status failure") })); + assert.match(messages.join("\n"), /Approval UI failed; denied Write request. status failed/); + assertOneApprovalResponse(messages, false); + } finally { + restoreBridge(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); + +test("approval widget rendering failure sends one denial response", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "1"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages, { throwWidgetMatching: /awaiting approval/, confirmError: new Error("confirmation should not open after widget failure") })); + assert.match(messages.join("\n"), /Approval UI failed; denied Write request. widget failed/); + assertOneApprovalResponse(messages, false); + } finally { + restoreBridge(); + restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); + setOrDelete("MOCK_APPROVAL", oldApproval); + } +}); + +test("approval confirmation failure sends one denial response", async () => { + const oldCommand = process.env.VILLANI_COMMAND; + const oldUsePi = process.env.VILLANI_USE_PI_MODEL; + const oldProvider = process.env.VILLANI_PROVIDER; + const oldModel = process.env.VILLANI_MODEL; + const oldBase = process.env.VILLANI_BASE_URL; + const oldApproval = process.env.MOCK_APPROVAL; + const restoreBridge = installMockBridgeStarter(await mockNodeBridgeModule(false)); + process.env.VILLANI_COMMAND = "mock-villani"; + process.env.VILLANI_USE_PI_MODEL = "false"; + process.env.VILLANI_PROVIDER = "openai"; + process.env.VILLANI_MODEL = "fake"; + process.env.VILLANI_BASE_URL = "http://127.0.0.1:9"; + process.env.MOCK_APPROVAL = "1"; + try { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani")!("fix it", createContext(messages, { confirmError: new Error("dialog missing") })); + assert.match(messages.join("\n"), /confirm:Villani wants to write a file/); + assert.match(messages.join("\n"), /Approval UI failed; denied Write request. dialog missing/); + assert.match(messages.join("\n"), /Denied Villani Write request/); + assertOneApprovalResponse(messages, false); } finally { - restorePrompt(); restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); setOrDelete("MOCK_APPROVAL", oldApproval); @@ -459,7 +555,9 @@ test("abort during pending approval sends denial and abort", async () => { await host.commands.get("villani-abort")!("", ctx); unblock(true); await runPromise; - assert.match(messages.join("\n"), /Villani aborted|cancelled/); + const responses = approvalResponseLines(messages); + assert.ok(responses.length <= 1, `expected at most one approval response, got ${responses.join(", ")}`); + if (responses.length === 1) assert.deepEqual(responses, ["Villani: approval_response:approval-1:false:count:1"]); assert.match(messages.join("\n"), /status:clear/); assert.doesNotMatch(messages.join("\n"), /Approved Villani Write request/); } finally { @@ -497,6 +595,8 @@ test("multiple sequential approvals keep request ids distinct", async () => { assert.deepEqual(seen, ["approval-1", "approval-2"]); assert.match(messages.join("\n"), /Approved Villani Write request/); assert.match(messages.join("\n"), /Denied Villani Patch request/); + assertOneApprovalResponse(messages, true, "approval-1"); + assertOneApprovalResponse(messages, false, "approval-2"); } finally { restorePrompt(); restoreBridge(); diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index d30494fc..e0db876c 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -94,6 +94,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte onProgress: (message) => output.info?.(message), }); if (abortController.signal.aborted) throw new Error("Villani run cancelled during runtime setup."); + reportRuntimeSource(executable, output); run.bridge = await bridgeStarter({ command: executable.executable, cwd: repo, signal: abortController.signal }); run.phase = "running"; @@ -101,7 +102,10 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte run.bridge.onEvent((event: BridgeEvent) => { if (abortController.signal.aborted && event.type === "run_completed") return; if (event.type === "approval_required") { - void handleApprovalRequired(run, event, ctx, output); + void handleApprovalRequired(run, event, ctx, output).catch((error: unknown) => { + safeWarn(output, `Approval handler failed unexpectedly; denied ${event.tool} request. ${formatUnknownError(error)}`); + denyApprovalIfPending(run, event, output); + }); return; } renderEvent(event, output); @@ -189,31 +193,99 @@ async function handleApprovalRequired( output: PiLikeOutput, ): Promise { run.pendingApprovals.add(event.request_id); - setVillaniStatus(ctx.ui, `Villani: awaiting approval for ${event.tool}`); - setVillaniWidget(ctx.ui, ["Villani is awaiting approval", event.summary]); let approved = false; + try { + setVillaniStatus(ctx.ui, `Villani: awaiting approval for ${event.tool}`); + setVillaniWidget(ctx.ui, ["Villani is awaiting approval", event.summary]); approved = !run.abortController.signal.aborted && await approvalPrompter(event, ctx, run.abortController.signal); - } catch { + } catch (error) { approved = false; - output.warn?.(`Approval UI unavailable; denied ${event.tool} request.`); + safeWarn(output, `Approval UI failed; denied ${event.tool} request. ${formatUnknownError(error)}`); } - const stillPending = run.pendingApprovals.delete(event.request_id); - if (!stillPending) return; + if (run.abortController.signal.aborted || activeRun?.id !== run.id) approved = false; + if (!sendApprovalResponseIfPending(run, event, approved, output)) return; + if (approved) { - setVillaniStatus(ctx.ui, "Villani: running"); - clearVillaniWidget(ctx.ui); + safeSetVillaniStatus(ctx.ui, "Villani: running", output); + safeSetVillaniWidget(ctx.ui, undefined, output); } else { - setVillaniStatus(ctx.ui, `Villani: denied ${event.tool} approval`); - setVillaniWidget(ctx.ui, ["Villani approval denied", event.summary]); + safeSetVillaniStatus(ctx.ui, `Villani: denied ${event.tool} approval`, output); + safeSetVillaniWidget(ctx.ui, ["Villani approval denied", event.summary], output); } + safeWarn(output, `${approved ? "Approved" : "Denied"} Villani ${event.tool} request: ${event.summary}`); +} + +function denyApprovalIfPending( + run: ActiveVillaniRun, + event: Extract, + output: PiLikeOutput, +): void { + sendApprovalResponseIfPending(run, event, false, output); +} + +function sendApprovalResponseIfPending( + run: ActiveVillaniRun, + event: Extract, + approved: boolean, + output: PiLikeOutput, +): boolean { + const stillPending = run.pendingApprovals.delete(event.request_id); + if (!stillPending) return false; try { run.bridge?.respondToApproval(run.id, event.request_id, approved); - output.warn?.(`${approved ? "Approved" : "Denied"} Villani ${event.tool} request: ${event.summary}`); } catch { - if (!run.abortController.signal.aborted) output.warn?.(`Could not send approval response for ${event.tool}; bridge is no longer available.`); + if (!run.abortController.signal.aborted) safeWarn(output, `Could not send approval response for ${event.tool}; bridge is no longer available.`); + } + return true; +} + +function safeSetVillaniStatus(ui: ExtensionUIContext, text: string | undefined, output: PiLikeOutput): void { + try { + setVillaniStatus(ui, text); + } catch (error) { + safeWarn(output, `Could not update Villani status UI. ${formatUnknownError(error)}`); + } +} + +function safeSetVillaniWidget(ui: ExtensionUIContext, lines: string[] | undefined, output: PiLikeOutput): void { + try { + setVillaniWidget(ui, lines); + } catch (error) { + safeWarn(output, `Could not update Villani widget UI. ${formatUnknownError(error)}`); + } +} + +function safeWarn(output: PiLikeOutput, message: string): void { + try { + output.warn?.(message); + } catch { + // Ignore notification failures so approval responses are never blocked by warning UI. + } +} + +function safeInfo(output: PiLikeOutput, message: string): void { + try { + output.info?.(message); + } catch { + // Ignore diagnostics failures; they must not affect runtime startup. + } +} + +function formatUnknownError(error: unknown): string { + if (error instanceof Error && error.message) return error.message; + if (error === undefined || error === null) return ""; + return String(error); +} + +function reportRuntimeSource(executable: Awaited>, output: PiLikeOutput): void { + const version = executable.version ? ` v${executable.version}` : ""; + if (executable.source === "override") { + safeInfo(output, `Villani runtime: using VILLANI_COMMAND override (${executable.executable}).`); + return; } + safeInfo(output, `Villani runtime: using ${executable.source}${version} at ${executable.executable}.`); } function setVillaniStatus(ui: ExtensionUIContext, text: string | undefined): void { @@ -222,8 +294,8 @@ function setVillaniStatus(ui: ExtensionUIContext, text: string | undefined): voi } function setVillaniWidget(ui: ExtensionUIContext, lines: string[] | undefined): void { - const setter = ui.setWidget as ((key: string, lines?: string[], placement?: string) => void) | undefined; - setter?.(VILLANI_UI_KEY, lines, "aboveEditor"); + const setter = ui.setWidget as ((key: string, lines?: string[], options?: { placement?: "aboveEditor" }) => void) | undefined; + setter?.(VILLANI_UI_KEY, lines, { placement: "aboveEditor" }); } function clearVillaniWidget(ui: ExtensionUIContext): void { diff --git a/integrations/pi-villani/src/runtimeConfig.ts b/integrations/pi-villani/src/runtimeConfig.ts index d5daebdb..cb551f4e 100644 --- a/integrations/pi-villani/src/runtimeConfig.ts +++ b/integrations/pi-villani/src/runtimeConfig.ts @@ -1,4 +1,4 @@ -export const VILLANI_RUNTIME_VERSION = "0.1.3"; +export const VILLANI_RUNTIME_VERSION = "0.1.4"; export const VILLANI_RUNTIME_REPOSITORY = "mmprotest/villani-code"; export const VILLANI_RUNTIME_TAG = `pi-villani-runtime-v${VILLANI_RUNTIME_VERSION}`; From 905ec7046dbaf996e1b402e646089f8adb141ea5 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sat, 30 May 2026 14:39:31 +1000 Subject: [PATCH 18/37] Add Pi bridge approval diagnostics --- integrations/pi-villani/src/extension.test.ts | 14 +++- integrations/pi-villani/src/index.ts | 69 +++++++++++++++++-- integrations/pi-villani/src/process.ts | 20 +++++- integrations/pi-villani/src/protocol.ts | 2 + integrations/pi-villani/src/render.ts | 3 + tests/integrations/test_pi_bridge.py | 5 +- villani_code/integrations/pi_bridge.py | 56 +++++++++++++-- .../integrations/pi_bridge_protocol.py | 2 + villani_code/state.py | 2 + 9 files changed, 161 insertions(+), 12 deletions(-) diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index 9b51c7e4..1ee6bcac 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -161,11 +161,23 @@ function createContext(messages: string[], options: { model?: Model; aut } as unknown as ExtensionCommandContext; } -test("extension registers /villani and /villani-abort", () => { +test("extension registers /villani, /villani-abort, and /villani-confirm-test", () => { const host = createHost(); villaniPiExtension(host.api); assert.equal(host.commands.has("villani"), true); assert.equal(host.commands.has("villani-abort"), true); + assert.equal(host.commands.has("villani-confirm-test"), true); +}); + + +test("/villani-confirm-test uses ctx.ui.confirm", async () => { + const host = createHost(); + const messages: string[] = []; + villaniPiExtension(host.api); + await host.commands.get("villani-confirm-test")!("", createContext(messages, { confirmResult: true })); + const joined = messages.join("\n"); + assert.match(joined, /confirm:Villani confirmation smoke test/); + assert.match(joined, /Villani confirm smoke test: approved/); }); test("/villani-abort reports no active run", async () => { diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index e0db876c..fb626716 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -41,6 +41,10 @@ export default function villaniPiExtension(pi: ExtensionAPI): void { description: "Abort the active Villani Code run", handler: async (_args: string, ctx: ExtensionCommandContext) => abortVillaniRun(ctx), }); + pi.registerCommand("villani-confirm-test", { + description: "Development smoke test for the Pi confirmation UI", + handler: async (_args: string, ctx: ExtensionCommandContext) => runConfirmSmokeTest(ctx), + }); } export async function runVillaniCommand(args: string, ctx: ExtensionCommandContext): Promise { @@ -62,6 +66,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte const done = new Promise((resolve) => { resolveDone = resolve; }); const run: ActiveVillaniRun = { id: runId, repo, phase: "starting", abortController, pendingApprovals: new Set(), done, resolveDone }; activeRun = run; + debug(output, `run starting id=${runId} repo=${repo} task_chars=${task.length}`); setVillaniStatus(ctx.ui, "Villani: starting"); let finished = false; @@ -74,6 +79,9 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte try { const explicitConfig = useExplicitVillaniConfig(); const model = ctx.model as Model | undefined; + debug(output, explicitConfig + ? `model configuration mode=direct provider=${process.env.VILLANI_PROVIDER ?? ""} model=${process.env.VILLANI_MODEL ?? ""} base_url=${redactUrl(process.env.VILLANI_BASE_URL) ?? ""}` + : `model configuration mode=pi-proxy model=${model?.id ?? ""}`); if (!explicitConfig && !model) { throw new Error("Villani could not start: no active Pi model is selected. Select a model in Pi, or set VILLANI_USE_PI_MODEL=false and configure Villani explicitly."); } @@ -85,6 +93,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte setVillaniStatus(ctx.ui, "Villani: starting model proxy"); run.proxy = !explicitConfig && model ? new PiModelProxy({ model, apiKey: auth?.apiKey, headers: auth?.headers, signal: abortController.signal }) : undefined; const proxyUrl = run.proxy ? await run.proxy.start() : undefined; + if (proxyUrl) debug(output, `Pi model proxy listening at ${redactUrl(proxyUrl)}`); if (abortController.signal.aborted) throw new Error("Villani run cancelled during startup."); setVillaniStatus(ctx.ui, "Villani: starting runtime"); @@ -96,12 +105,21 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte if (abortController.signal.aborted) throw new Error("Villani run cancelled during runtime setup."); reportRuntimeSource(executable, output); - run.bridge = await bridgeStarter({ command: executable.executable, cwd: repo, signal: abortController.signal }); + debug(output, `runtime executable resolved path=${executable.executable}`); + run.bridge = await bridgeStarter({ + command: executable.executable, + cwd: repo, + signal: abortController.signal, + onDiagnostic: (message) => debug(output, `bridge process: ${message}`), + onStderr: (text) => debug(output, `bridge stderr: ${trimDiagnostic(text)}`), + }); run.phase = "running"; setVillaniStatus(ctx.ui, "Villani: running"); run.bridge.onEvent((event: BridgeEvent) => { + debug(output, `bridge event ${summarizeBridgeEvent(event)}`); if (abortController.signal.aborted && event.type === "run_completed") return; if (event.type === "approval_required") { + debug(output, `approval_required emitted id=${event.id} request_id=${event.request_id} tool=${event.tool}`); void handleApprovalRequired(run, event, ctx, output).catch((error: unknown) => { safeWarn(output, `Approval handler failed unexpectedly; denied ${event.tool} request. ${formatUnknownError(error)}`); denyApprovalIfPending(run, event, output); @@ -126,6 +144,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte mode: (process.env.VILLANI_MODE as VillaniMode | undefined) || "runner", config: buildRunConfig(proxyUrl, model), }; + debug(output, `sending run command id=${runId} mode=${command.mode}`); run.bridge.send(command); await Promise.race([ finalEvent, @@ -139,6 +158,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte showDurableMessage(ctx.ui, !run.bridge ? "Villani run cancelled during startup." : "Villani run cancelled."); } else { const message = error instanceof Error ? error.message : String(error); + debug(output, `exception: ${sanitizeErrorMessage(message)}`); output.error?.(message); showDurableMessage(ctx.ui, `Villani failed: ${message}`); } @@ -155,6 +175,20 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte } } +export async function runConfirmSmokeTest(ctx: ExtensionCommandContext): Promise { + const output = uiOutput(ctx.ui); + try { + if (!ctx.hasUI || typeof ctx.ui.confirm !== "function") { + output.warn?.("Villani confirm smoke test: ctx.ui.confirm is not available."); + return; + } + const approved = await ctx.ui.confirm("Villani confirmation smoke test", "Approve this test dialog? No Villani runner will be started.", { signal: ctx.signal }); + output.info?.(`Villani confirm smoke test: ${approved ? "approved" : "denied"}.`); + } catch (error) { + output.error?.(`Villani confirm smoke test failed: ${formatUnknownError(error)}`); + } +} + export async function abortVillaniRun(ctx: ExtensionCommandContext): Promise { const output = uiOutput(ctx.ui); if (!activeRun) { @@ -265,6 +299,10 @@ function safeWarn(output: PiLikeOutput, message: string): void { } } +function debug(output: PiLikeOutput, message: string): void { + safeInfo(output, `Villani debug: ${message}`); +} + function safeInfo(output: PiLikeOutput, message: string): void { try { output.info?.(message); @@ -279,6 +317,26 @@ function formatUnknownError(error: unknown): string { return String(error); } +function summarizeBridgeEvent(event: BridgeEvent): string { + const id = "id" in event && typeof event.id === "string" ? event.id : ""; + const runId = "run_id" in event && typeof event.run_id === "string" ? event.run_id : id; + const parts = [`type=${event.type}`, `id=${id}`, `run_id=${runId}`]; + if (event.type === "phase") parts.push(`phase=${event.phase}`); + if (event.type === "tool_started" || event.type === "tool_finished") parts.push(`tool=${event.tool}`); + if (event.type === "approval_required" || event.type === "approval_resolved") parts.push(`request_id=${event.request_id}`, `tool=${event.tool}`); + if (event.type === "error") parts.push(`error=${sanitizeErrorMessage(event.error)}`); + return parts.join(" "); +} + +function trimDiagnostic(text: string): string { + return sanitizeErrorMessage(text.replace(/\s+/g, " ").trim()).slice(0, 500); +} + +function redactUrl(value: string | undefined): string | undefined { + if (!value) return value; + return value.replace(/(api[_-]?key=)[^&]+/gi, "$1[redacted]").replace(/:\/\/[^/@]+@/, "://[redacted]@"); +} + function reportRuntimeSource(executable: Awaited>, output: PiLikeOutput): void { const version = executable.version ? ` v${executable.version}` : ""; if (executable.source === "override") { @@ -369,6 +427,7 @@ function buildRunConfig(proxyUrl: string | undefined, model: Model | und provider: "openai", model: model?.id ?? "pi-current-model", base_url: proxyUrl, + pi_model_proxy: true, }; } return { @@ -393,10 +452,12 @@ function uiOutput(ui: ExtensionUIContext): PiLikeOutput { } function sanitizeErrorMessage(message: string): string { - return message + const apiKey = process.env.VILLANI_API_KEY; + let sanitized = message .replace(/Bearer\s+[A-Za-z0-9._~+/=-]+/gi, "Bearer [redacted]") - .replace(/api[_-]?key[=:]\s*[^\s,;]+/gi, "api_key=[redacted]") - .slice(0, 500); + .replace(/api[_-]?key[=:]\s*[^\s,;]+/gi, "api_key=[redacted]"); + if (apiKey) sanitized = sanitized.split(apiKey).join("[redacted]"); + return sanitized.slice(0, 500); } export function __getActiveRunForTests(): ActiveVillaniRun | undefined { diff --git a/integrations/pi-villani/src/process.ts b/integrations/pi-villani/src/process.ts index 57987c44..6fb1a41b 100644 --- a/integrations/pi-villani/src/process.ts +++ b/integrations/pi-villani/src/process.ts @@ -10,6 +10,8 @@ export interface BridgeProcessOptions { readyTimeoutMs?: number; env?: NodeJS.ProcessEnv; signal?: AbortSignal; + onDiagnostic?: (message: string) => void; + onStderr?: (text: string) => void; } export interface CommandSpec { @@ -31,10 +33,13 @@ export class VillaniBridgeProcess { private startupSettled = false; private startupReject?: (error: Error) => void; private startupResolve?: () => void; + private onDiagnostic?: (message: string) => void; constructor(options: BridgeProcessOptions & { spec?: CommandSpec }) { + this.onDiagnostic = options.onDiagnostic; const spec = options.spec ?? commandToSpec(options.command ?? DEFAULT_VILLANI_COMMAND); const args = [...spec.args, "bridge", "--stdio"]; + options.onDiagnostic?.(`launch command=${spec.display} args=${JSON.stringify(args)} cwd=${options.cwd}`); this.child = spawn(spec.executable, args, { cwd: options.cwd, env: { ...process.env, ...options.env }, @@ -55,11 +60,14 @@ export class VillaniBridgeProcess { this.child.on("error", (error: NodeJS.ErrnoException) => { this.closed = true; + options.onDiagnostic?.(`child process error: ${error.message}`); this.rejectStartup(formatSpawnError(error, spec.display)); }); this.child.stderr.on("data", (chunk: Buffer) => { - this.stderrChunks.push(chunk.toString("utf8")); + const text = chunk.toString("utf8"); + this.stderrChunks.push(text); + options.onStderr?.(text); if (this.stderrChunks.length > 20) this.stderrChunks.shift(); }); @@ -75,6 +83,7 @@ export class VillaniBridgeProcess { this.exitPromise = new Promise((resolve) => { this.child.on("exit", (code, signal) => { this.closed = true; + options.onDiagnostic?.(`child process exit code=${code ?? "null"} signal=${signal ?? "null"}`); if (!this.startupSettled) { this.rejectStartup(new Error(`Villani bridge exited before ready (code ${code ?? "null"}, signal ${signal ?? "null"}).${this.stderrSuffix()}`)); } @@ -121,7 +130,13 @@ export class VillaniBridgeProcess { if (this.closed || !this.child.stdin.writable) { throw new Error(`Villani bridge is not writable.${this.stderrSuffix()}`); } - this.child.stdin.write(commandToLine(command)); + try { + const ok = this.child.stdin.write(commandToLine(command)); + if (!ok) this.onDiagnostic?.(`stdin write returned false for command=${command.type}`); + } catch (error) { + this.onDiagnostic?.(`stdin write failure for command=${command.type}: ${error instanceof Error ? error.message : String(error)}`); + throw new Error(`Villani bridge write failed: ${error instanceof Error ? error.message : String(error)}${this.stderrSuffix()}`); + } } abort(runId: string): void { @@ -163,6 +178,7 @@ export class VillaniBridgeProcess { } private failProtocol(message: string): void { + this.onDiagnostic?.(`protocol parse error: ${message}`); const event: BridgeEvent = { type: "error", error: message }; this.listeners.forEach((listener) => listener(event)); this.rejectStartup(new Error(`${message}${this.stderrSuffix()}`)); diff --git a/integrations/pi-villani/src/protocol.ts b/integrations/pi-villani/src/protocol.ts index b89a8a6d..3426e90b 100644 --- a/integrations/pi-villani/src/protocol.ts +++ b/integrations/pi-villani/src/protocol.ts @@ -7,6 +7,7 @@ export interface BridgeConfig { model?: string; base_url?: string; api_key?: string; + pi_model_proxy?: boolean; } export interface BridgeLimits { @@ -47,6 +48,7 @@ export type BridgeEvent = | { type: "pong"; id: string } | { type: "run_started"; id: string; run_id: string; task: string; repo: string; mode: VillaniMode } | { type: "phase"; id: string; phase: string; message: string } + | { type: "bridge_diagnostic"; id?: string; message: string } | { type: "tool_started"; id: string; tool: string; path?: string | null; command?: string | null } | { type: "tool_finished"; id: string; tool: string; ok: boolean; summary: string } | { type: "workspace_changed"; id: string; files: string[] } diff --git a/integrations/pi-villani/src/render.ts b/integrations/pi-villani/src/render.ts index dae3cd44..dbc56086 100644 --- a/integrations/pi-villani/src/render.ts +++ b/integrations/pi-villani/src/render.ts @@ -19,6 +19,9 @@ export function renderEvent(event: BridgeEvent, output: PiLikeOutput = console): case "phase": write(`Villani: ${event.message}`); break; + case "bridge_diagnostic": + write(`Villani debug: ${event.message}`); + break; case "tool_started": write(`Tool started: ${event.tool}${event.path ? ` ${event.path}` : ""}${event.command ? ` ${event.command}` : ""}`); break; diff --git a/tests/integrations/test_pi_bridge.py b/tests/integrations/test_pi_bridge.py index 234dfce7..f019b487 100644 --- a/tests/integrations/test_pi_bridge.py +++ b/tests/integrations/test_pi_bridge.py @@ -144,7 +144,10 @@ def factory(command: Any, event_callback: Any) -> DummyRunner: events = collect_json_lines(stdout) assert seen["command"].limits.max_turns == 3 - assert [event["type"] for event in events][:2] == ["run_started", "phase"] + assert events[0]["type"] == "run_started" + assert any(event["type"] == "phase" and event.get("phase") == "diagnosis_attempted" for event in events) + assert any(event["type"] == "bridge_diagnostic" and "model configuration" in event.get("message", "") for event in events) + assert any(event["type"] == "bridge_diagnostic" and "tool call requested" in event.get("message", "") for event in events) assert any(event["type"] == "verification_finished" and event["passed"] for event in events) assert events[-1]["type"] == "run_completed" assert events[-1]["transcript_path"] == ".villani_code/runs/run/transcript.json" diff --git a/villani_code/integrations/pi_bridge.py b/villani_code/integrations/pi_bridge.py index e84fc4f7..10ddceeb 100644 --- a/villani_code/integrations/pi_bridge.py +++ b/villani_code/integrations/pi_bridge.py @@ -62,8 +62,19 @@ def __init__( self._lock = threading.Lock() def emit(self, event: dict[str, Any]) -> None: - self.stdout.write(to_json_line(event)) - self.stdout.flush() + try: + self.stdout.write(to_json_line(event)) + self.stdout.flush() + except Exception as exc: # noqa: BLE001 + self.stderr.write(f"PiBridge response-write failure: {exc}\n") + self.stderr.flush() + raise + + def _debug(self, message: str, run_id: str | None = None) -> None: + event: dict[str, Any] = {"type": "bridge_diagnostic", "message": cap_text(redact_text(message), 500)} + if run_id: + event["id"] = run_id + self._events.put(event) def run_stdio(self) -> None: self.emit(ready_event()) @@ -202,6 +213,13 @@ def _run_worker(self, active: ActiveRun) -> None: "mode": command.mode, } ) + self._debug(f"run worker started mode={command.mode} repo={repo} task_chars={len(command.task)}", command.id) + cfg = command.config + provider = cfg.provider or os.environ.get("VILLANI_PROVIDER") or "anthropic" + model = cfg.model or os.environ.get("VILLANI_MODEL") or "" + base_url = cfg.base_url or os.environ.get("VILLANI_BASE_URL") or "" + source = "pi-proxy" if cfg.pi_model_proxy else "direct-config" + self._debug(f"model configuration source={source} provider={provider} model={model} base_url={redact_url(base_url)}", command.id) def on_runner_event(event: dict[str, Any]) -> None: nonlocal verification_passed, latest_summary @@ -218,11 +236,14 @@ def on_runner_event(event: dict[str, Any]) -> None: latest_summary = summarize_tool_event(event) or latest_summary approval_callback = self._approval_callback(active) + self._debug("creating runner", command.id) runner = self._create_runner(command, on_runner_event, approval_callback) + self._debug("runner created; entering execution", command.id) if active.abort_requested.is_set(): self._events.put({"type": "run_aborted", "id": command.id, "success": False, "summary": "Aborted by caller"}) return result = run_existing_runner(runner, command) + self._debug("runner returned result", command.id) transcript_path = normalize_transcript_path(result) changed_files, preexisting_dirty_files = attributed_changed_files(repo_path, before_dirty, before_dirty_hashes, touched_files) if active.abort_requested.is_set(): @@ -252,6 +273,7 @@ def on_runner_event(event: dict[str, Any]) -> None: } ) except Exception as exc: # noqa: BLE001 + self._debug(f"exception: {exc}", command.id) self._events.put( { "type": "run_failed", @@ -307,6 +329,7 @@ def approve(tool_name: str, tool_input: dict[str, Any]) -> bool: return False active.pending_approvals[request_id] = pending self._pending_approvals[request_id] = pending + self._debug(f"approval_required emitted request_id={request_id} tool={tool_name} summary={summary}", active.command.id) self._events.put( { "type": "approval_required", @@ -328,6 +351,17 @@ def approve(tool_name: str, tool_input: dict[str, Any]) -> bool: return approve +def redact_text(value: str) -> str: + api_key = os.environ.get("VILLANI_API_KEY") + if api_key: + value = value.replace(api_key, "[redacted]") + return value + + +def redact_url(value: str) -> str: + return redact_text(value.split("?", 1)[0]) + + def summarize_approval_request(tool_name: str, tool_input: dict[str, Any]) -> tuple[str, dict[str, Any]]: tool = str(tool_name or "tool") safe_input: dict[str, Any] = {} @@ -489,12 +523,26 @@ def git_changed_files(repo: Path) -> list[str]: def map_runner_event(run_id: str, event: dict[str, Any]) -> list[dict[str, Any]]: etype = str(event.get("type") or "") - if etype in {"diagnosis_attempted", "diagnosis_generated", "planning_started", "model_request_started", "repair_attempt_started"}: + if etype in {"diagnosis_attempted", "diagnosis_generated", "planning_started", "repair_attempt_started"}: return [{"type": "phase", "id": run_id, "phase": etype, "message": humanize_event_type(etype)}] + if etype == "model_request_started": + return [ + {"type": "phase", "id": run_id, "phase": etype, "message": humanize_event_type(etype)}, + {"type": "bridge_diagnostic", "id": run_id, "message": f"model request begins model={event.get('model') or ''}"}, + ] + if etype == "model_request_completed": + return [{"type": "bridge_diagnostic", "id": run_id, "message": f"model response received model={event.get('model') or ''} stop_reason={event.get('stop_reason') or ''}"}] + if etype == "model_request_failed": + return [{"type": "bridge_diagnostic", "id": run_id, "message": f"model request failed model={event.get('model') or ''} error={cap_text(redact_text(str(event.get('error') or '')), 200)}"}] + if etype == "approval_required": + return [{"type": "bridge_diagnostic", "id": run_id, "message": f"runner requested approval tool={event.get('name') or ''}"}] if etype == "tool_started": tool = str(event.get("name") or "tool") tool_input = event.get("input") if isinstance(event.get("input"), dict) else {} - return [{"type": "tool_started", "id": run_id, "tool": tool, "path": tool_input.get("path"), "command": tool_input.get("command")}] + return [ + {"type": "bridge_diagnostic", "id": run_id, "message": f"tool call requested tool={tool} path={tool_input.get('path') or tool_input.get('file_path') or ''} command_chars={len(str(tool_input.get('command') or ''))}"}, + {"type": "tool_started", "id": run_id, "tool": tool, "path": tool_input.get("path"), "command": tool_input.get("command")}, + ] if etype == "tool_finished": tool = str(event.get("name") or "tool") ok = not bool(event.get("is_error")) diff --git a/villani_code/integrations/pi_bridge_protocol.py b/villani_code/integrations/pi_bridge_protocol.py index 8b93ec63..99be2723 100644 --- a/villani_code/integrations/pi_bridge_protocol.py +++ b/villani_code/integrations/pi_bridge_protocol.py @@ -14,6 +14,7 @@ class BridgeConfig: model: str | None = None base_url: str | None = None api_key: str | None = None + pi_model_proxy: bool = False @dataclass(slots=True) @@ -101,6 +102,7 @@ def parse_run_command(payload: dict[str, Any]) -> RunCommand: model=str(config_payload["model"]) if config_payload.get("model") else None, base_url=str(config_payload["base_url"]) if config_payload.get("base_url") else None, api_key=str(config_payload["api_key"]) if config_payload.get("api_key") else None, + pi_model_proxy=bool(config_payload.get("pi_model_proxy")), ), limits=BridgeLimits(max_turns=int(max_turns) if max_turns is not None else None), ) diff --git a/villani_code/state.py b/villani_code/state.py index 06376179..14c6cc1b 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -1172,8 +1172,10 @@ def _budget_reason( if self._debug_recorder is not None: self._debug_recorder.record_model_request_failed(str(exc)) self._debug_recorder.record_turn_finish(turns_used + 1, "model_request_failed") + self.event_callback({"type": "model_request_failed", "model": self.model, "error": str(exc)}) raise + self.event_callback({"type": "model_request_completed", "model": self.model, "stop_reason": response.get("stop_reason")}) response["content"] = normalize_content_blocks(response.get("content")) transcript["responses"].append(response) if self._debug_recorder is not None: From a61ecd0dd5bc8ad409414e4eb22027f40529aa66 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sat, 30 May 2026 15:01:58 +1000 Subject: [PATCH 19/37] Fix Pi bridge persistent stdin deadlock --- packaging/smoke_test_runtime.py | 60 +++++++++++++++++-- tests/integrations/test_pi_bridge.py | 80 ++++++++++++++++++++++++++ villani_code/integrations/pi_bridge.py | 5 +- 3 files changed, 138 insertions(+), 7 deletions(-) diff --git a/packaging/smoke_test_runtime.py b/packaging/smoke_test_runtime.py index a938730a..31717d6d 100644 --- a/packaging/smoke_test_runtime.py +++ b/packaging/smoke_test_runtime.py @@ -1,9 +1,48 @@ from __future__ import annotations import json +import queue import subprocess import sys +import threading from pathlib import Path +from typing import TextIO + + +def read_line_with_timeout(stdout: TextIO, timeout: float = 15) -> str: + lines: queue.Queue[str | BaseException] = queue.Queue() + + def read_line() -> None: + try: + lines.put(stdout.readline()) + except BaseException as exc: # noqa: BLE001 + lines.put(exc) + + threading.Thread(target=read_line, daemon=True).start() + try: + line = lines.get(timeout=timeout) + except queue.Empty as exc: + raise TimeoutError(f"timed out waiting for runtime output after {timeout} seconds") from exc + if isinstance(line, BaseException): + raise line + if line == "": + raise EOFError("runtime stdout closed before expected response") + return line.strip() + + +def cleanup(proc: subprocess.Popen[str]) -> str: + if proc.stdin is not None and not proc.stdin.closed: + proc.stdin.close() + try: + proc.wait(timeout=15) + except subprocess.TimeoutExpired: + proc.terminate() + try: + proc.wait(timeout=5) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait(timeout=5) + return proc.stderr.read() if proc.stderr is not None else "" def main() -> int: @@ -17,15 +56,24 @@ def main() -> int: stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, + bufsize=1, ) assert proc.stdin is not None assert proc.stdout is not None - proc.stdin.write('{"type":"ping","id":"release-smoke"}\n') - proc.stdin.close() - lines = [proc.stdout.readline().strip(), proc.stdout.readline().strip()] - stderr = proc.stderr.read() if proc.stderr is not None else "" - proc.wait(timeout=15) - events = [json.loads(line) for line in lines if line] + events: list[dict[str, object]] = [] + stderr = "" + try: + events.append(json.loads(read_line_with_timeout(proc.stdout))) + proc.stdin.write('{"type":"ping","id":"release-smoke"}\n') + proc.stdin.flush() + events.append(json.loads(read_line_with_timeout(proc.stdout))) + if proc.poll() is not None: + raise RuntimeError(f"runtime exited before stdin closed with code {proc.returncode}") + except Exception as exc: # noqa: BLE001 + stderr = cleanup(proc) + print(f"runtime smoke test failed: {exc}; events={events}; stderr={stderr}", file=sys.stderr) + return 1 + stderr = cleanup(proc) if events[:2] != [{"type": "ready", "protocol_version": 1}, {"type": "pong", "id": "release-smoke"}]: print(f"unexpected events: {events}; stderr={stderr}", file=sys.stderr) return 1 diff --git a/tests/integrations/test_pi_bridge.py b/tests/integrations/test_pi_bridge.py index f019b487..63bb916e 100644 --- a/tests/integrations/test_pi_bridge.py +++ b/tests/integrations/test_pi_bridge.py @@ -2,6 +2,9 @@ import io import json +import queue +import subprocess +import sys import threading import time from pathlib import Path @@ -78,6 +81,83 @@ def factory(_command: Any, event_callback: Any, approval_callback: Any) -> Plann assert events[-1]["type"] == "run_completed" + +def read_json_line_with_timeout(stdout: Any, timeout: float = 5) -> dict[str, Any]: + lines: queue.Queue[str | BaseException] = queue.Queue() + + def read_line() -> None: + try: + lines.put(stdout.readline()) + except BaseException as exc: # noqa: BLE001 + lines.put(exc) + + thread = threading.Thread(target=read_line, daemon=True) + thread.start() + try: + line = lines.get(timeout=timeout) + except queue.Empty as exc: + raise AssertionError(f"timed out waiting for bridge output after {timeout} seconds") from exc + if isinstance(line, BaseException): + raise line + assert line, "bridge stdout closed before expected event" + return json.loads(line) + + +def start_cli_bridge_process() -> subprocess.Popen[str]: + return subprocess.Popen( + [sys.executable, "-u", "-m", "villani_code.cli", "bridge", "--stdio"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + bufsize=1, + ) + + +def stop_cli_bridge_process(proc: subprocess.Popen[str]) -> None: + if proc.stdin is not None and not proc.stdin.closed: + proc.stdin.close() + try: + proc.wait(timeout=5) + except subprocess.TimeoutExpired: + proc.terminate() + try: + proc.wait(timeout=5) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait(timeout=5) + + +def test_cli_bridge_persistent_stdin_ping_responds_before_stdin_closes() -> None: + proc = start_cli_bridge_process() + assert proc.stdin is not None + assert proc.stdout is not None + try: + assert read_json_line_with_timeout(proc.stdout) == {"type": "ready", "protocol_version": 1} + proc.stdin.write('{"type":"ping","id":"persistent-ping"}\n') + proc.stdin.flush() + assert read_json_line_with_timeout(proc.stdout) == {"type": "pong", "id": "persistent-ping"} + assert proc.poll() is None + finally: + stop_cli_bridge_process(proc) + + +def test_cli_bridge_persistent_stdin_accepts_multiple_commands_before_close() -> None: + proc = start_cli_bridge_process() + assert proc.stdin is not None + assert proc.stdout is not None + try: + assert read_json_line_with_timeout(proc.stdout) == {"type": "ready", "protocol_version": 1} + proc.stdin.write('{"type":"ping","id":"persistent-ping-1"}\n') + proc.stdin.flush() + assert read_json_line_with_timeout(proc.stdout) == {"type": "pong", "id": "persistent-ping-1"} + proc.stdin.write('{"type":"ping","id":"persistent-ping-2"}\n') + proc.stdin.flush() + assert read_json_line_with_timeout(proc.stdout) == {"type": "pong", "id": "persistent-ping-2"} + assert proc.poll() is None + finally: + stop_cli_bridge_process(proc) + def test_stdio_ping_emits_ready_and_pong() -> None: stdin = io.StringIO('{"type":"ping","id":"abc"}\n') stdout = io.StringIO() diff --git a/villani_code/integrations/pi_bridge.py b/villani_code/integrations/pi_bridge.py index 10ddceeb..1e28f4ac 100644 --- a/villani_code/integrations/pi_bridge.py +++ b/villani_code/integrations/pi_bridge.py @@ -82,7 +82,10 @@ def run_stdio(self) -> None: def read_stdin() -> None: try: - for raw_line in self.stdin: + while True: + raw_line = self.stdin.readline() + if raw_line == "": + break commands.put(raw_line) finally: commands.put(None) From 85841b4512408a385d415f0db1c649fabdf20043 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 19:15:32 +1000 Subject: [PATCH 20/37] Changes --- .gitignore | 3 + integrations/pi-villani/package-lock.json | 8 +- integrations/pi-villani/src/extension.test.ts | 28 ++++-- integrations/pi-villani/src/index.ts | 92 +++++++++++++++---- integrations/pi-villani/src/render.ts | 4 +- villani_code/integrations/pi_bridge.py | 26 +++++- .../integrations/pi_bridge_protocol.py | 2 +- villani_code/state_runtime.py | 8 +- 8 files changed, 133 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 7d843bf4..94c8fd9c 100644 --- a/.gitignore +++ b/.gitignore @@ -145,3 +145,6 @@ Thumbs.db # Local secrets / config *.env .env.* + +# Local backup files +*.bak diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json index 9113521f..0369bd23 100644 --- a/integrations/pi-villani/package-lock.json +++ b/integrations/pi-villani/package-lock.json @@ -1,11 +1,11 @@ { - "name": "pi-villani", + "name": "@simonvillani/pi-villani", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "pi-villani", + "name": "@simonvillani/pi-villani", "version": "0.1.0", "license": "MIT", "dependencies": { @@ -1091,7 +1091,7 @@ "typebox": "1.1.38" }, "bin": { - "pi-ai": "dist/cli.js" + "pi-ai": "./dist/cli.js" }, "engines": { "node": ">=22.19.0" @@ -2468,6 +2468,7 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -3424,6 +3425,7 @@ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/integrations/pi-villani/src/extension.test.ts b/integrations/pi-villani/src/extension.test.ts index 1ee6bcac..c45be6cc 100644 --- a/integrations/pi-villani/src/extension.test.ts +++ b/integrations/pi-villani/src/extension.test.ts @@ -103,12 +103,22 @@ async function waitForCondition(predicate: () => boolean, timeoutMs = 3000): Pro function createHost() { const commands = new Map Promise>(); + const sentMessages: Array<{ content?: unknown }> = []; const api = { registerCommand(name: string, options: { handler: (args: string, ctx: ExtensionCommandContext) => Promise }) { commands.set(name, options.handler); }, - } as ExtensionAPI; - return { api, commands }; + sendMessage(message: { content?: unknown }) { + sentMessages.push(message); + }, + } as unknown as ExtensionAPI; + return { api, commands, sentMessages }; +} + +function sentMessageText(host: ReturnType): string { + return host.sentMessages + .map((message) => typeof message.content === "string" ? message.content : String(message.content ?? "")) + .join("\n"); } function fakeModel(): Model { @@ -211,7 +221,7 @@ test("prevents overlapping runs and aborts active bridge run", async () => { assert.match(messages.join("\n"), /already running/); await host.commands.get("villani-abort")!("", ctx); await runPromise; - assert.match(messages.join("\n"), /Villani aborted/); + assert.match(sentMessageText(host), /Villani aborted/); } finally { restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); @@ -230,7 +240,7 @@ test("Pi model path resolves model auth", async () => { villaniPiExtension(host.api); await host.commands.get("villani")!("fix it", createContext(messages, { model: fakeModel() })); assert.equal(messages.includes("auth:pi-test"), true); - assert.match(messages.join("\n"), /Villani completed/); + assert.match(sentMessageText(host), /Villani completed/); } finally { restoreBridge(); setOrDelete("VILLANI_COMMAND", oldCommand); @@ -297,7 +307,7 @@ test("default path uses cached downloaded runtime before launching bridge", asyn const messages: string[] = []; villaniPiExtension(host.api); await host.commands.get("villani")!("fix it", createContext(messages)); - assert.match(messages.join("\n"), /Villani completed/); + assert.match(sentMessageText(host), /Villani completed/); assert.equal(bridgeCalls[0]?.command, cachedRuntime.executable); } finally { restoreBridge(); @@ -332,7 +342,7 @@ test("startup and final events update visible persistent UI", async () => { assert.match(joined, /status:Villani: running/); assert.match(joined, /status:clear/); assert.match(joined, /widget:clear/); - assert.match(joined, /done/); + assert.match(sentMessageText(host), /done/); } finally { restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); @@ -385,9 +395,9 @@ test("approval event is confirmed and answered", async () => { assert.match(joined, /widget:Villani is awaiting approval\|Write file: safe-test.txt:placement:aboveEditor/); assert.match(joined, /confirm:Villani wants to write a file/); assert.match(joined, /File: safe-test.txt/); - assert.match(joined, /Approved Villani Write request/); + assert.doesNotMatch(joined, /Approved Villani Write request/); assertOneApprovalResponse(messages, true); - assert.match(messages.join("\n"), /Villani completed/); + assert.match(sentMessageText(host), /Villani completed/); } finally { restoreBridge(); restoreEnv({ oldCommand, oldUsePi, oldProvider, oldModel, oldBase }); @@ -605,7 +615,7 @@ test("multiple sequential approvals keep request ids distinct", async () => { villaniPiExtension(host.api); await host.commands.get("villani")!("fix it", createContext(messages)); assert.deepEqual(seen, ["approval-1", "approval-2"]); - assert.match(messages.join("\n"), /Approved Villani Write request/); + assert.doesNotMatch(messages.join("\n"), /Approved Villani Write request/); assert.match(messages.join("\n"), /Denied Villani Patch request/); assertOneApprovalResponse(messages, true, "approval-1"); assertOneApprovalResponse(messages, false, "approval-2"); diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index fb626716..3fe7d0fa 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -35,7 +35,7 @@ let activeRun: ActiveVillaniRun | undefined; export default function villaniPiExtension(pi: ExtensionAPI): void { pi.registerCommand("villani", { description: "Delegate a repository coding task to Villani Code", - handler: async (args: string, ctx: ExtensionCommandContext) => runVillaniCommand(args, ctx), + handler: async (args: string, ctx: ExtensionCommandContext) => runVillaniCommand(args, ctx, pi), }); pi.registerCommand("villani-abort", { description: "Abort the active Villani Code run", @@ -47,7 +47,7 @@ export default function villaniPiExtension(pi: ExtensionAPI): void { }); } -export async function runVillaniCommand(args: string, ctx: ExtensionCommandContext): Promise { +export async function runVillaniCommand(args: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise { const task = args.trim(); const output = uiOutput(ctx.ui); if (!task) { @@ -70,6 +70,8 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte setVillaniStatus(ctx.ui, "Villani: starting"); let finished = false; + let heartbeat: ReturnType | undefined; + let heartbeatSequence = 0; let resolveFinal!: () => void; const finalEvent = new Promise((resolve) => { resolveFinal = resolve; }); ctx.signal?.addEventListener("abort", () => { @@ -116,7 +118,9 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte run.phase = "running"; setVillaniStatus(ctx.ui, "Villani: running"); run.bridge.onEvent((event: BridgeEvent) => { - debug(output, `bridge event ${summarizeBridgeEvent(event)}`); + if (event.type !== "pong") { + debug(output, `bridge event ${summarizeBridgeEvent(event)}`); + } if (abortController.signal.aborted && event.type === "run_completed") return; if (event.type === "approval_required") { debug(output, `approval_required emitted id=${event.id} request_id=${event.request_id} tool=${event.tool}`); @@ -126,13 +130,16 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte }); return; } - renderEvent(event, output); if (event.type === "run_completed" || event.type === "run_failed" || event.type === "run_aborted") { finished = event.type === "run_completed"; - showFinalRunMessage(ctx.ui, event); + showFinalRunMessage(pi, event); clearVillaniUi(ctx.ui); resolveFinal(); + return; } + + renderEvent(event, output); + if (event.type === "error") output.error?.(`Villani bridge error: ${event.error}`); }); @@ -146,6 +153,17 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte }; debug(output, `sending run command id=${runId} mode=${command.mode}`); run.bridge.send(command); + + heartbeat = setInterval(() => { + if (!run.bridge || run.phase !== "running" || abortController.signal.aborted) return; + heartbeatSequence += 1; + try { + run.bridge.send({ type: "ping", id: `${runId}-heartbeat-${heartbeatSequence}` }); + } catch { + // Normal during shutdown or bridge exit. + } + }, 250); + await Promise.race([ finalEvent, run.bridge.waitForExit().then((code) => { @@ -163,6 +181,7 @@ export async function runVillaniCommand(args: string, ctx: ExtensionCommandConte showDurableMessage(ctx.ui, `Villani failed: ${message}`); } } finally { + if (heartbeat) clearInterval(heartbeat); clearVillaniUi(ctx.ui); run.phase = "completed"; if (!finished && run.bridge && !abortController.signal.aborted) { @@ -248,7 +267,11 @@ async function handleApprovalRequired( safeSetVillaniStatus(ctx.ui, `Villani: denied ${event.tool} approval`, output); safeSetVillaniWidget(ctx.ui, ["Villani approval denied", event.summary], output); } - safeWarn(output, `${approved ? "Approved" : "Denied"} Villani ${event.tool} request: ${event.summary}`); + if (approved) { + debug(output, `approved ${event.tool} request: ${event.summary}`); + } else { + safeWarn(output, `Denied Villani ${event.tool} request: ${event.summary}`); + } } function denyApprovalIfPending( @@ -300,6 +323,7 @@ function safeWarn(output: PiLikeOutput, message: string): void { } function debug(output: PiLikeOutput, message: string): void { + if (process.env.VILLANI_PI_DEBUG !== "1") return; safeInfo(output, `Villani debug: ${message}`); } @@ -369,16 +393,52 @@ function showDurableMessage(ui: ExtensionUIContext, message: string): void { ui.notify?.(message); } -function showFinalRunMessage(ui: ExtensionUIContext, event: Extract): void { - if (event.type === "run_completed") { - showDurableMessage(ui, event.summary || "Villani completed."); - return; - } - if (event.type === "run_aborted") { - showDurableMessage(ui, event.summary || "Villani aborted."); - return; - } - showDurableMessage(ui, event.summary || event.error || "Villani failed."); +function showFinalRunMessage( + pi: ExtensionAPI, + event: Extract, +): void { + const status = + event.type === "run_completed" + ? "Villani completed" + : event.type === "run_aborted" + ? "Villani aborted" + : "Villani failed"; + + const summary = + event.summary || + ("error" in event ? event.error : undefined) || + status; + + const changedFiles = + "changed_files" in event && Array.isArray(event.changed_files) + ? event.changed_files.filter(isUserFacingChangedFile) + : []; + + const changedFilesSection = + changedFiles.length > 0 + ? `\n\nChanged files:\n${changedFiles.map((file) => `- ${file}`).join("\n")}` + : ""; + + pi.sendMessage({ + customType: "villani-result", + content: `${status}\n\n${summary}${changedFilesSection}`, + display: true, + details: event, + }); +} + +function isUserFacingChangedFile(file: string): boolean { + const normalized = file.replaceAll("\\", "/"); + const segments = normalized.split("/"); + + return ( + normalized !== ".villani" && + !normalized.startsWith(".villani/") && + normalized !== ".villani_code" && + !normalized.startsWith(".villani_code/") && + !segments.includes("__pycache__") && + !normalized.endsWith(".pyc") + ); } async function askUserForApproval(request: Extract, ctx: ExtensionCommandContext, signal: AbortSignal): Promise { diff --git a/integrations/pi-villani/src/render.ts b/integrations/pi-villani/src/render.ts index dbc56086..70619d84 100644 --- a/integrations/pi-villani/src/render.ts +++ b/integrations/pi-villani/src/render.ts @@ -20,7 +20,9 @@ export function renderEvent(event: BridgeEvent, output: PiLikeOutput = console): write(`Villani: ${event.message}`); break; case "bridge_diagnostic": - write(`Villani debug: ${event.message}`); + if (process.env.VILLANI_PI_DEBUG === "1") { + write(`Villani debug: ${event.message}`); + } break; case "tool_started": write(`Tool started: ${event.tool}${event.path ? ` ${event.path}` : ""}${event.command ? ` ${event.command}` : ""}`); diff --git a/villani_code/integrations/pi_bridge.py b/villani_code/integrations/pi_bridge.py index 1e28f4ac..ec9def19 100644 --- a/villani_code/integrations/pi_bridge.py +++ b/villani_code/integrations/pi_bridge.py @@ -1,5 +1,6 @@ from __future__ import annotations +import io import os import queue import subprocess @@ -82,11 +83,24 @@ def run_stdio(self) -> None: def read_stdin() -> None: try: + try: + fd = self.stdin.fileno() + except (AttributeError, io.UnsupportedOperation): + for raw_line in self.stdin: + commands.put(raw_line) + return + + buffer = b"" while True: - raw_line = self.stdin.readline() - if raw_line == "": + chunk = os.read(fd, 4096) + if not chunk: break - commands.put(raw_line) + buffer += chunk + while b"\n" in buffer: + raw_line, buffer = buffer.split(b"\n", 1) + commands.put(raw_line.decode("utf-8", errors="replace") + "\n") + if buffer.strip(): + commands.put(buffer.decode("utf-8", errors="replace")) finally: commands.put(None) @@ -426,6 +440,9 @@ def build_default_runner(command: RunCommand, event_callback: Callable[[dict[str villani_mode=command.mode == "villani", villani_objective=command.task if command.mode == "villani" else None, ) + # The bridge owns stdout as a JSONL protocol channel. Never print streamed + # model text directly to stdout, or it corrupts the event stream. + runner.print_stream = False runner.event_callback = event_callback runner.approval_callback = approval_callback # Villani mode normally auto-approves ASK decisions. The Pi bridge must preserve the @@ -493,7 +510,7 @@ def attributed_changed_files( def is_git_repo(repo: Path) -> bool: try: - proc = subprocess.run(["git", "rev-parse", "--is-inside-work-tree"], cwd=repo, text=True, capture_output=True, timeout=10, check=False) + proc = subprocess.run(["git", "rev-parse", "--is-inside-work-tree"], cwd=repo, text=True, capture_output=True, stdin=subprocess.DEVNULL, timeout=10, check=False) except Exception: return False return proc.returncode == 0 and proc.stdout.strip() == "true" @@ -506,6 +523,7 @@ def git_changed_files(repo: Path) -> list[str]: cwd=repo, text=True, capture_output=True, + stdin=subprocess.DEVNULL, timeout=10, check=False, ) diff --git a/villani_code/integrations/pi_bridge_protocol.py b/villani_code/integrations/pi_bridge_protocol.py index 99be2723..9382fa8a 100644 --- a/villani_code/integrations/pi_bridge_protocol.py +++ b/villani_code/integrations/pi_bridge_protocol.py @@ -50,7 +50,7 @@ class ApprovalResponseCommand: def to_json_line(event: dict[str, Any]) -> str: - return json.dumps(event, ensure_ascii=False, separators=(",", ":")) + "\n" + return json.dumps(event, ensure_ascii=True, separators=(",", ":")) + "\n" def parse_json_line(line: str) -> dict[str, Any]: diff --git a/villani_code/state_runtime.py b/villani_code/state_runtime.py index 96eb4d54..9d079f3f 100644 --- a/villani_code/state_runtime.py +++ b/villani_code/state_runtime.py @@ -608,7 +608,7 @@ def truncate_tool_result(tool_name: str, result: dict[str, Any]) -> dict[str, An def git_changed_files(repo: Any) -> list[str]: - proc = subprocess.run(["git", "status", "--short"], cwd=repo, capture_output=True, text=True) + proc = subprocess.run(["git", "status", "--short"], cwd=repo, capture_output=True, text=True, stdin=subprocess.DEVNULL) return [line[3:].strip() for line in proc.stdout.splitlines() if line.strip()] @@ -711,7 +711,7 @@ def _run_patch_sanity_check(runner: Any) -> dict[str, Any]: } cmd = [sys.executable, "-m", "py_compile", *checked_files] - proc = subprocess.run(cmd, cwd=runner.repo, capture_output=True, text=True) + proc = subprocess.run(cmd, cwd=runner.repo, capture_output=True, text=True, stdin=subprocess.DEVNULL) stdout = proc.stdout.strip() stderr = proc.stderr.strip() if proc.returncode != 0: @@ -770,7 +770,7 @@ def _run_patch_sanity_check(runner: Any) -> dict[str, Any]: } collect_cmd = [sys.executable, "-m", "pytest", "--collect-only", "-q"] - collect_proc = subprocess.run(collect_cmd, cwd=runner.repo, capture_output=True, text=True) + collect_proc = subprocess.run(collect_cmd, cwd=runner.repo, capture_output=True, text=True, stdin=subprocess.DEVNULL) collect_stdout = collect_proc.stdout.strip() collect_stderr = collect_proc.stderr.strip() telemetry["collection_sanity_ran"] = True @@ -989,7 +989,7 @@ def run_verification(runner: Any, trigger: str = "edit") -> str: lines.append("next: inspect locked file, produce one bounded patch, or stop") cmd_results: list[dict[str, Any]] = [] for cmd in commands: - proc = subprocess.run(cmd, cwd=runner.repo, capture_output=True, text=True) + proc = subprocess.run(cmd, cwd=runner.repo, capture_output=True, text=True, stdin=subprocess.DEVNULL) stderr_lines = "\n".join([ln for ln in proc.stderr.splitlines() if ln][:5]) stdout = proc.stdout[:1500] cmd_results.append( From 7a1ffd31ee8049420a583a1061b2af164279b640 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 19:26:57 +1000 Subject: [PATCH 21/37] Prepare Pi extension and standalone runtime v0.1.0 release --- .github/workflows/build-pi-villani-runtime-release.yml | 2 +- integrations/pi-villani/README.md | 2 +- integrations/pi-villani/src/runtimeConfig.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-pi-villani-runtime-release.yml b/.github/workflows/build-pi-villani-runtime-release.yml index 6afc7ec5..275aa60d 100644 --- a/.github/workflows/build-pi-villani-runtime-release.yml +++ b/.github/workflows/build-pi-villani-runtime-release.yml @@ -10,7 +10,7 @@ permissions: contents: write env: - RUNTIME_VERSION: "0.1.2" + RUNTIME_VERSION: "0.1.0" jobs: runtime: diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index f39a036f..da80dc76 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -5,7 +5,7 @@ Villani is a high-reliability coding runner for Pi. Pi stays the UI and model/au Install: ```bash -pi install npm:pi-villani +pi install npm:@simonvillani/pi-villani ``` Use inside any repository: diff --git a/integrations/pi-villani/src/runtimeConfig.ts b/integrations/pi-villani/src/runtimeConfig.ts index cb551f4e..f6c36e9e 100644 --- a/integrations/pi-villani/src/runtimeConfig.ts +++ b/integrations/pi-villani/src/runtimeConfig.ts @@ -1,4 +1,4 @@ -export const VILLANI_RUNTIME_VERSION = "0.1.4"; +export const VILLANI_RUNTIME_VERSION = "0.1.0"; export const VILLANI_RUNTIME_REPOSITORY = "mmprotest/villani-code"; export const VILLANI_RUNTIME_TAG = `pi-villani-runtime-v${VILLANI_RUNTIME_VERSION}`; @@ -35,3 +35,4 @@ export function resolveRuntimeAsset(platform: NodeJS.Platform = process.platform function isSupportedRuntimePlatform(key: string): key is RuntimePlatformKey { return key === "win32-x64" || key === "darwin-arm64" || key === "darwin-x64" || key === "linux-x64"; } + From a605368df45d08b6b22a7f1676a6dc04997d090f Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 19:30:00 +1000 Subject: [PATCH 22/37] Fix CI workflow YAML syntax --- .github/workflows/ci.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5d2173e..a353403b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,10 +61,4 @@ jobs: . .venv-smoke/bin/activate pip install dist/*.whl villani-code --help > /dev/null - python - <<'PY' -import importlib.util -assert importlib.util.find_spec("villani_code") is not None -assert importlib.util.find_spec("villani_code.cli") is not None -assert importlib.util.find_spec("ui") is None -print("packaging smoke ok") -PY + python -c 'import importlib.util; assert importlib.util.find_spec("villani_code") is not None; assert importlib.util.find_spec("villani_code.cli") is not None; assert importlib.util.find_spec("ui") is None; print("packaging smoke ok")' From f4931b30e29fce46318d878035005971b8ee2b67 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sat, 30 May 2026 19:44:44 +1000 Subject: [PATCH 23/37] Publish Pi extension under mmprotest npm scope --- integrations/pi-villani/README.md | 2 +- integrations/pi-villani/package-lock.json | 6 +++--- integrations/pi-villani/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index da80dc76..c8a5c2d8 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -5,7 +5,7 @@ Villani is a high-reliability coding runner for Pi. Pi stays the UI and model/au Install: ```bash -pi install npm:@simonvillani/pi-villani +pi install npm:@mmprotest/pi-villani ``` Use inside any repository: diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json index 0369bd23..b9fd51b1 100644 --- a/integrations/pi-villani/package-lock.json +++ b/integrations/pi-villani/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@simonvillani/pi-villani", + "name": "@mmprotest/pi-villani", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@simonvillani/pi-villani", + "name": "@mmprotest/pi-villani", "version": "0.1.0", "license": "MIT", "dependencies": { @@ -1091,7 +1091,7 @@ "typebox": "1.1.38" }, "bin": { - "pi-ai": "./dist/cli.js" + "pi-ai": "dist/cli.js" }, "engines": { "node": ">=22.19.0" diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json index d063f1c5..f1697c11 100644 --- a/integrations/pi-villani/package.json +++ b/integrations/pi-villani/package.json @@ -1,5 +1,5 @@ { - "name": "@simonvillani/pi-villani", + "name": "@mmprotest/pi-villani", "version": "0.1.0", "description": "Pi extension bridge for running Villani Code as a delegated coding runner.", "main": "dist/index.js", From 137a20fe33e23fb1e4f35eab584bac31b2b05251 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sun, 31 May 2026 09:58:05 +1000 Subject: [PATCH 24/37] Fix Pi model proxy tool argument normalisation --- integrations/pi-villani/package-lock.json | 4 +- integrations/pi-villani/package.json | 2 +- integrations/pi-villani/src/index.ts | 6 +-- .../pi-villani/src/modelProxy.test.ts | 51 +++++++++++++++++++ integrations/pi-villani/src/modelProxy.ts | 25 ++++++++- 5 files changed, 81 insertions(+), 7 deletions(-) diff --git a/integrations/pi-villani/package-lock.json b/integrations/pi-villani/package-lock.json index b9fd51b1..bd70dcc8 100644 --- a/integrations/pi-villani/package-lock.json +++ b/integrations/pi-villani/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mmprotest/pi-villani", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@mmprotest/pi-villani", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "adm-zip": "^0.5.16", diff --git a/integrations/pi-villani/package.json b/integrations/pi-villani/package.json index f1697c11..07a276bd 100644 --- a/integrations/pi-villani/package.json +++ b/integrations/pi-villani/package.json @@ -1,6 +1,6 @@ { "name": "@mmprotest/pi-villani", - "version": "0.1.0", + "version": "0.1.1", "description": "Pi extension bridge for running Villani Code as a delegated coding runner.", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/integrations/pi-villani/src/index.ts b/integrations/pi-villani/src/index.ts index 3fe7d0fa..a302fe4e 100644 --- a/integrations/pi-villani/src/index.ts +++ b/integrations/pi-villani/src/index.ts @@ -405,9 +405,9 @@ function showFinalRunMessage( : "Villani failed"; const summary = - event.summary || - ("error" in event ? event.error : undefined) || - status; + event.type === "run_failed" + ? event.error || event.summary || status + : event.summary || status; const changedFiles = "changed_files" in event && Array.isArray(event.changed_files) diff --git a/integrations/pi-villani/src/modelProxy.test.ts b/integrations/pi-villani/src/modelProxy.test.ts index 60bd4e1d..619ae5ae 100644 --- a/integrations/pi-villani/src/modelProxy.test.ts +++ b/integrations/pi-villani/src/modelProxy.test.ts @@ -79,6 +79,57 @@ test("translates Pi assistant tool calls to OpenAI response", () => { assert.deepEqual(response.usage, { prompt_tokens: 3, completion_tokens: 4, total_tokens: 7 }); }); +test("preserves already-serialized Pi tool arguments without double encoding", () => { + const message: AssistantMessage = { + role: "assistant", + api: "openai-completions", + provider: "pi", + model: "m", + content: [ + { type: "toolCall", id: "call-string", name: "Write", arguments: '{"path":"calculator.py","content":"hello"}' as any }, + ], + usage: { input: 3, output: 4, cacheRead: 0, cacheWrite: 0, totalTokens: 7, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "toolUse", + timestamp: 1700000000000, + }; + + const response = piAssistantToOpenAIResponse(message); + const choice = (response.choices as Array)[0]; + + assert.equal( + choice.message.tool_calls[0].function.arguments, + '{"path":"calculator.py","content":"hello"}', + ); +}); + +test("unwraps double-serialized Pi tool arguments for Villani", () => { + const message: AssistantMessage = { + role: "assistant", + api: "openai-completions", + provider: "pi", + model: "m", + content: [ + { + type: "toolCall", + id: "call-double-string", + name: "Write", + arguments: '"{\\"path\\":\\"calculator.py\\",\\"content\\":\\"hello\\"}"' as any, + }, + ], + usage: { input: 3, output: 4, cacheRead: 0, cacheWrite: 0, totalTokens: 7, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "toolUse", + timestamp: 1700000000000, + }; + + const response = piAssistantToOpenAIResponse(message); + const choice = (response.choices as Array)[0]; + + assert.equal( + choice.message.tool_calls[0].function.arguments, + '{"path":"calculator.py","content":"hello"}', + ); +}); + test("proxy passes Pi auth options into completion call", async () => { let seenOptions: any; const proxy = new PiModelProxy({ diff --git a/integrations/pi-villani/src/modelProxy.ts b/integrations/pi-villani/src/modelProxy.ts index 5172b1b3..c19ed1e2 100644 --- a/integrations/pi-villani/src/modelProxy.ts +++ b/integrations/pi-villani/src/modelProxy.ts @@ -197,7 +197,7 @@ export function piAssistantToOpenAIResponse(message: AssistantMessage): Record ({ id: block.id || `call_${index}`, type: "function", - function: { name: block.name, arguments: JSON.stringify(block.arguments ?? {}) }, + function: { name: block.name, arguments: serializeToolArguments(block.arguments) }, })); return { id: message.responseId ?? `pi-villani-${message.timestamp}`, @@ -240,6 +240,29 @@ function writeOpenAIStream(res: ServerResponse, message: AssistantMessage): void res.end(); } +function serializeToolArguments(value: unknown): string { + let current = value; + + // Pi providers may return: + // { path: "file.py" } + // '{"path":"file.py"}' + // '"{\\"path\\":\\"file.py\\"}"' + // Decode up to two string layers, then emit one valid OpenAI arguments JSON object. + for (let depth = 0; depth < 2 && typeof current === "string"; depth += 1) { + try { + current = JSON.parse(current); + } catch { + return JSON.stringify({}); + } + } + + if (current && typeof current === "object" && !Array.isArray(current)) { + return JSON.stringify(current); + } + + return JSON.stringify({}); +} + function toOpenAIFinishReason(reason: AssistantMessage["stopReason"]): string { if (reason === "toolUse") return "tool_calls"; if (reason === "length") return "length"; From 0e336bd30070c57a44cd7091c600a86b2c7a8b4e Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Sun, 31 May 2026 10:15:17 +1000 Subject: [PATCH 25/37] Updated readme --- integrations/pi-villani/README.md | 436 ++++++++++++++++++++++++------ 1 file changed, 357 insertions(+), 79 deletions(-) diff --git a/integrations/pi-villani/README.md b/integrations/pi-villani/README.md index c8a5c2d8..cc2d5c0f 100644 --- a/integrations/pi-villani/README.md +++ b/integrations/pi-villani/README.md @@ -1,131 +1,409 @@ # Villani for Pi -Villani is a high-reliability coding runner for Pi. Pi stays the UI and model/auth host; Villani performs repository repair, edits, verification, and approval-bound operations through its existing runner. +Villani is a coding runner extension for [Pi](https://github.com/earendil-works/pi). It runs repository tasks from inside Pi, asks for approval before protected edits or shell commands, and reports the final result in the Pi interface. -Install: +## Install in one command ```bash pi install npm:@mmprotest/pi-villani ``` -Use inside any repository: +That is the full Villani installation step. + +On first use, the extension automatically downloads the standalone Villani runtime for your platform, verifies its SHA-256 checksum, and caches it locally. You do **not** need to clone the Villani repository, install Python, create a virtual environment, or configure a separate Villani executable. + +## Requirements + +You need: + +- [Pi](https://github.com/earendil-works/pi) installed. +- A model configured and working in Pi. +- A Git repository to run Villani against. +- A supported platform: + - Windows x64 + - macOS Apple Silicon + - macOS Intel + - Linux x64 + +## Confirm installation + +```bash +pi list +``` + +You should see: + +```text +npm:@mmprotest/pi-villani +``` + +If you see more than one Villani package or a local Villani extension path as well as the npm package, remove the duplicate. A duplicate load can cause Pi to expose the command as `/villani:1` rather than `/villani`. + +## Use Villani + +Open a terminal in any Git repository and start Pi: + +```bash +cd /path/to/your/repository +pi +``` + +In Pi, run a coding task with `/villani`: ```text /villani Fix the failing tests and verify the result +``` + +Other examples: + +```text +/villani Add input validation to the parser and add tests +/villani Find the cause of the failing test, make the smallest fix, and run pytest +/villani Add a new endpoint, update tests, and verify the suite +``` + +To stop a current run: + +```text /villani-abort ``` -On first use, the extension automatically downloads a platform-specific standalone Villani runtime from GitHub Releases, verifies its SHA-256 checksum, extracts it into a private user cache, and launches the bundled `bridge --stdio` runtime. No separate Python, pip, virtual environment, or `villani-code` installation is required for normal use. +## What happens during a run -Villani uses your active Pi model through the local Pi-backed proxy and asks for approval before protected file or shell operations. +Villani uses the model currently selected in Pi. It can inspect the repository, propose edits, apply patches, and run verification commands. -## Supported platforms +When Villani requests a protected operation, Pi shows an approval prompt. Typical approvals include: -Runtime downloads are prepared for: +- Writing or modifying a file. +- Applying a patch. +- Running a shell command such as a test suite. -- Windows x64 (`win32-x64`) -- macOS Apple Silicon (`darwin-arm64`) -- macOS Intel (`darwin-x64`) -- Linux x64 (`linux-x64`) +Review each request before approving it. Villani runs with your normal user permissions inside the current repository. -Other platforms can still use a local Villani installation through `VILLANI_COMMAND`. +At the end of a successful run, Pi displays a final Villani result with the task summary and files changed by Villani. -## Runtime cache +## Using LM Studio -The runtime cache is outside the repository being edited: +Villani uses Pi's active model, so LM Studio must be configured in Pi first. -- Windows: `%LOCALAPPDATA%\pi-villani\runtime\\\` -- macOS/Linux: `~/.cache/pi-villani/runtime///` +### 1. Start the LM Studio server -The extension verifies `checksums.txt` from the matching GitHub Release before extraction and writes a `.verified.json` marker before reusing a cached runtime. +In LM Studio: -## Developer override +1. Load a coding-capable model. +2. Start the local server. +3. Note the model identifier exposed by the server. -For development or troubleshooting, set `VILLANI_COMMAND` to a single executable path/name. This skips runtime download and preserves Windows paths with spaces. +A tested example model identifier is: -PowerShell example: +```text +villanis/models/qwen3.5-9b-q8_0.gguf +``` + +The common LM Studio OpenAI-compatible server endpoint is: + +```text +http://127.0.0.1:1234/v1 +``` + +### 2. Configure the model in Pi + +Create or edit: + +- Windows: `%USERPROFILE%\.pi\agent\models.json` +- macOS/Linux: `~/.pi/agent/models.json` + +Example configuration: + +```json +{ + "providers": { + "lmstudio": { + "baseUrl": "http://127.0.0.1:1234/v1", + "api": "openai-completions", + "apiKey": "dummy", + "compat": { + "supportsDeveloperRole": false, + "supportsReasoningEffort": false + }, + "models": [ + { + "id": "villanis/models/qwen3.5-9b-q8_0.gguf", + "name": "Qwen 3.5 9B Q8 Local", + "input": ["text"], + "reasoning": false, + "contextWindow": 100000, + "maxTokens": 16384 + } + ] + } + } +} +``` + +Replace the model `id` and `name` with the model you loaded in LM Studio. + +### 3. Launch Pi using the LM Studio model + +```bash +pi --provider lmstudio --model "villanis/models/qwen3.5-9b-q8_0.gguf" +``` + +Then run: + +```text +/villani Fix the failing tests and verify the result +``` + +### PowerShell setup for the tested LM Studio model + +Windows users can create the Pi model configuration with this command: ```powershell -$env:VILLANI_COMMAND = "C:\path\to\villani-code\.venv\Scripts\villani-code.exe" -pi +$model = "villanis/models/qwen3.5-9b-q8_0.gguf" +$piDir = Join-Path $HOME ".pi\agent" +$modelsFile = Join-Path $piDir "models.json" + +New-Item -ItemType Directory -Force -Path $piDir | Out-Null + +$config = @{ + providers = @{ + lmstudio = @{ + baseUrl = "http://127.0.0.1:1234/v1" + api = "openai-completions" + apiKey = "dummy" + compat = @{ + supportsDeveloperRole = $false + supportsReasoningEffort = $false + } + models = @( + @{ + id = $model + name = "Qwen 3.5 9B Q8 Local" + input = @("text") + reasoning = $false + contextWindow = 100000 + maxTokens = 16384 + } + ) + } + } +} | ConvertTo-Json -Depth 10 + +[System.IO.File]::WriteAllText( + $modelsFile, + $config, + [System.Text.UTF8Encoding]::new($false) +) + +pi --provider lmstudio --model $model ``` -## Defaults and configuration +## Using another Pi model provider + +Villani does not require LM Studio. It reuses the model selected in Pi, including supported cloud providers or other OpenAI-compatible local servers configured in Pi. + +Once a normal Pi prompt works with your chosen model, use Villani in the same session: -Default behavior: +```text +/villani Implement the requested change and run the relevant tests +``` -- `VILLANI_COMMAND` unset means the extension downloads/reuses the verified standalone Villani runtime. Set it only for development/troubleshooting overrides. -- `VILLANI_MODE` defaults to `runner`, which maps to normal `Runner.run(task)` execution. -- `VILLANI_MODE=villani` maps to the repository's autonomous `Runner.run_villani_mode()` path. -- Pi model reuse is enabled by default. The extension resolves Pi-managed credentials and provider headers with `ctx.modelRegistry.getApiKeyAndHeaders(model)`, starts a temporary local proxy, and passes that proxy URL to Villani as an OpenAI-compatible `base_url`. -- Upstream Pi API keys/OAuth/provider headers remain inside the Node extension/proxy and are passed only to Pi AI requests, never to the Villani subprocess. +## Runtime download and cache -Optional environment variables: +On the first Villani run, the extension downloads the runtime for your operating system from the Villani GitHub release assets and verifies it before execution. -| Variable | Meaning | +Runtime cache locations: + +| Platform | Cache location | | --- | --- | -| `VILLANI_COMMAND` | Developer/troubleshooting override for the Villani executable path/name. When set, runtime download is skipped. This is a single executable path, not a shell command. | -| `VILLANI_MODE` | `runner` or `villani`. Defaults to `runner`. | -| `VILLANI_USE_PI_MODEL` | Set to `false` to disable Pi-backed model reuse and use explicit Villani provider config. | -| `VILLANI_PROVIDER` | Explicit fallback provider (`openai` or `anthropic`) when `VILLANI_USE_PI_MODEL=false`. | -| `VILLANI_MODEL` | Explicit fallback model. | -| `VILLANI_BASE_URL` | Explicit fallback model endpoint. | -| `VILLANI_API_KEY` | Explicit fallback API key, if needed. | +| Windows | `%LOCALAPPDATA%\pi-villani\runtime\` | +| macOS/Linux | `~/.cache/pi-villani/runtime/` | + +To force a clean runtime download on Windows: + +```powershell +Remove-Item "$env:LOCALAPPDATA\pi-villani\runtime" -Recurse -Force -ErrorAction SilentlyContinue +``` -Explicit Villani provider variables are advanced fallback settings. Normal Pi users should leave them unset so Villani reuses the active Pi model. +To force a clean runtime download on macOS or Linux: -## Final output +```bash +rm -rf ~/.cache/pi-villani/runtime +``` -Pi renders operational progress only: start, phases, tool/file activity, verification, governor redirects, failure and abort status. It does not render Villani prompts, hidden reasoning, raw JSON or full transcripts. +## Update Villani -Final output separates attribution: +Install the latest published package update: -```text -Villani completed +```bash +pi update npm:@mmprotest/pi-villani +``` -Summary: -Fixed failing auth tests. +You can also remove and reinstall the package: -Changed by Villani: -- src/auth.py +```bash +pi remove npm:@mmprotest/pi-villani +pi install npm:@mmprotest/pi-villani +``` -Pre-existing workspace changes excluded from attribution: -- notes.txt +## Uninstall Villani -Verification passed: true -Transcript: .villani_code/runs/... +```bash +pi remove npm:@mmprotest/pi-villani ``` -## Safety and approvals +Optional: delete the downloaded runtime cache. -- Villani operates in the current repository and may edit files and run verification commands through its normal permission/sandbox path. -- The Pi bridge honours Villani's existing permission classifier: `ALLOW` operations run automatically, `ASK` operations prompt through Pi before execution, and `DENY` operations do not execute. -- The default Pi integration does not silently approve file writes, patches, or shell commands that Villani classifies as requiring approval. -- Approval prompts show concise operation context: write/patch requests show the affected path, and Bash requests show the command being requested. Large file contents and patches are not dumped into the prompt. -- Rejecting an approval returns a normal denied-tool result to Villani; Villani may continue or fail according to its existing runner behavior. -- `/villani-abort` cancels a run even while an approval decision is pending; pending approvals are resolved as denied. -- Pre-existing dirty files are reported separately from files changed by Villani. -- The Pi model proxy binds only to `127.0.0.1`, uses a random available port, and exists only for the active `/villani` run. -- Pi credentials stay in Pi; the Python child receives only a localhost proxy URL in the default path. Model credentials are unrelated to tool approvals and are never shown in approval prompts. -- Pi packages execute with normal user permissions. Review source before installing third-party packages. +Windows PowerShell: -## Limitations +```powershell +Remove-Item "$env:LOCALAPPDATA\pi-villani" -Recurse -Force -ErrorAction SilentlyContinue +``` + +macOS/Linux: -- `/villani-abort` cancels startup, pending approval prompts, and in-flight Pi model requests immediately via a per-run `AbortController`, sends a bridge abort request if the bridge exists, and force-kills the subprocess after a short timeout if the Python runner does not stop. Already-running Python child commands may not be interruptible until the current Villani operation returns. -- Non-interactive Pi contexts without a usable confirmation UI deny approval-required operations by default rather than auto-approving them. -- The Pi proxy implements Villani's current OpenAI-compatible `/v1/chat/completions` path. It does not implement `/v1/messages` because the bridge points Villani at the proxy with `provider=openai`. -- Streaming is compatibility streaming: the proxy calls Pi via `complete()` and emits the final response as one OpenAI SSE chunk plus `[DONE]`, not token-by-token streaming. -- Non-git repositories use lower-confidence changed-file reporting based on Villani mutation events only. +```bash +rm -rf ~/.cache/pi-villani +``` ## Troubleshooting -- **Runtime download failed:** check network access to GitHub Releases, then retry. You can set `VILLANI_COMMAND` to a local executable while troubleshooting. -- **Runtime checksum failed:** the archive was not executed. Clear the runtime cache and retry, or report the release asset mismatch. -- **Local override not found:** if `VILLANI_COMMAND` is set, ensure it points to the executable path in the same environment used to start Pi. -- **No Pi model available:** select/configure a Pi model, or set `VILLANI_USE_PI_MODEL=false` and provide explicit Villani provider variables. -- **Pi auth resolution fails:** confirm the selected Pi model is logged in/configured; auth errors are sanitized before display. -- **Bridge readiness timeout:** run `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio` and confirm it prints `ready` then `pong`. -- **Proxy startup failure:** ensure no local security tool blocks binding to `127.0.0.1` on random ports. -- **Proxy upstream error:** the proxy returns a sanitized HTTP error to Villani instead of a fake empty completion; check Pi model/auth configuration. -- **Approval prompt unavailable:** in headless/non-interactive contexts, approval-required operations are denied for safety. Run Pi interactively or provide an explicit test approval handler. -- **Smoke test:** from this checkout, run `cd integrations/pi-villani && npm install && npm test`, then `printf '{"type":"ping","id":"manual-test"}\n' | villani-code bridge --stdio`. +### `/villani` is missing + +Check that Pi installed the extension: + +```bash +pi list +``` + +You should see `npm:@mmprotest/pi-villani`. + +Reinstall if required: + +```bash +pi remove npm:@mmprotest/pi-villani +pi install npm:@mmprotest/pi-villani +``` + +### Pi shows `/villani:1` + +Pi has loaded Villani more than once, usually because both a local development path and the npm package are installed. + +```bash +pi list +``` + +Remove every old or local Villani entry, then install only the public package: + +```bash +pi install npm:@mmprotest/pi-villani +``` + +### The model works in LM Studio but not in Pi + +First test the model with a normal Pi prompt: + +```bash +pi --provider lmstudio --model "your-model-id" +``` + +Then ask: + +```text +Reply with exactly: hello +``` + +If the normal Pi prompt fails, fix the Pi or LM Studio model configuration before testing Villani. + +Check: + +- The LM Studio server is running. +- The `baseUrl` includes `/v1`. +- The model ID exactly matches the model shown by LM Studio. +- `models.json` is valid JSON saved as UTF-8. + +### Runtime download fails + +Check access to GitHub Releases and retry. To remove a partially cached runtime, clear the runtime cache using the commands above and launch Villani again. + +### Checksum verification fails + +Villani will not execute a runtime archive that does not match its published checksum. Clear the cache and retry. If the error persists, report the runtime asset or checksum mismatch. + +### Approval prompt does not appear + +Run Pi interactively in a terminal. Approval-required operations are denied when no usable Pi confirmation UI is available. + +### A run needs to be stopped + +Use: + +```text +/villani-abort +``` + +### Debugging output + +For troubleshooting only, enable extension diagnostics before launching Pi. + +Windows PowerShell: + +```powershell +$env:VILLANI_PI_DEBUG = "1" +pi +``` + +macOS/Linux: + +```bash +VILLANI_PI_DEBUG=1 pi +``` + +Turn debug output off after troubleshooting. + +Windows PowerShell: + +```powershell +Remove-Item Env:VILLANI_PI_DEBUG -ErrorAction SilentlyContinue +``` + +macOS/Linux: + +```bash +unset VILLANI_PI_DEBUG +``` + +## Advanced development override + +Normal users do not need this. + +Developers can bypass automatic runtime download and point the extension at a local Villani executable using `VILLANI_COMMAND`: + +Windows PowerShell: + +```powershell +$env:VILLANI_COMMAND = "C:\path\to\villani-code\.venv\Scripts\villani-code.exe" +pi +``` + +macOS/Linux: + +```bash +VILLANI_COMMAND="/path/to/villani-code/.venv/bin/villani-code" pi +``` + +## Security notes + +- Pi packages execute code with your normal user permissions. +- Villani can read and modify files in the repository where it is run. +- Review approval prompts before allowing edits or commands. +- The downloaded standalone runtime is verified using the published SHA-256 checksum before it is executed. +- In normal operation, Villani uses the active Pi model through a temporary local proxy bound to `127.0.0.1`. + +## Reference links + +- Pi package installation documentation: +- Pi custom model configuration documentation: +- Villani Code repository: +- Villani Pi npm package: From 08c12c5de576d2697bc551f2dc29b7e9eb19b0ae Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Mon, 1 Jun 2026 15:30:54 +1000 Subject: [PATCH 26/37] Updated readme --- 01_qwen35_combined_success_rate.png | Bin 77706 -> 0 bytes 01_solved_tasks_by_type_fixed.png | Bin 79832 -> 0 bytes ...ined_frontier_success_vs_total_runtime.png | Bin 107634 -> 0 bytes ...er_success_vs_total_runtime_reversed_x.png | Bin 107766 -> 0 bytes README.md | 225 +++++-------- Villani_Technical_Report.md | 309 ------------------ Villani_Technical_Report.pdf | Bin 461254 -> 0 bytes ...al_Bench_Technical_Report_Leaderboard.docx | Bin 0 -> 303337 bytes ...nal_Bench_Technical_Report_Leaderboard.pdf | Bin 0 -> 392266 bytes ..._terminal_bench_2_leaderboard_position.png | Bin 0 -> 244585 bytes execution_time_distribution.png | Bin 86571 -> 0 bytes 11 files changed, 77 insertions(+), 457 deletions(-) delete mode 100644 01_qwen35_combined_success_rate.png delete mode 100644 01_solved_tasks_by_type_fixed.png delete mode 100644 03_qwen35_combined_frontier_success_vs_total_runtime.png delete mode 100644 03_qwen35_combined_frontier_success_vs_total_runtime_reversed_x.png delete mode 100644 Villani_Technical_Report.md delete mode 100644 Villani_Technical_Report.pdf create mode 100644 docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.docx create mode 100644 docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.pdf create mode 100644 docs/assets/villani_terminal_bench_2_leaderboard_position.png delete mode 100644 execution_time_distribution.png diff --git a/01_qwen35_combined_success_rate.png b/01_qwen35_combined_success_rate.png deleted file mode 100644 index fcbc1d15a6bf461f127083f00218baff82c1feca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77706 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 UuKwL9K~ySPvHJbAWp1DT4?V%$3jhEB diff --git a/01_solved_tasks_by_type_fixed.png b/01_solved_tasks_by_type_fixed.png deleted file mode 100644 index b95032834cfc84c8e8159ba4e27492b81990ecd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79832 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 ujo!6^UuLwkj2nrYQ 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
FDf(KRX9C!1d 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�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

Sq&BfZf<-z3&&zeQ>fhiQI0H)~MoloE9l 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≺0S#0?TpyhEiTb1t{C8TMKH43B)P76&vWLOBi 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�XJKc}7Gy_xs!Gq< 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

LgW9lGE9I;3j0w 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

wZvgaW~Il>FkwD)xKU+sE(q96b98~{`phN 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

mGMG|ZK3kc_r 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

eX=oGH*L=x`9t*SMxeeCcuM@?Cn!)6u_JZ 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
^A&!iK5X+)AN(D%aXm#QNi!#_j3h>g1dV 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 literal 0 HcmV?d00001 diff --git a/docs/assets/villani_terminal_bench_2_leaderboard_position.png b/docs/assets/villani_terminal_bench_2_leaderboard_position.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f35bc2d479285d2b670cb59d178361b978ad26 GIT binary patch literal 244585 zcmeEu^;gwh_brO3fS@#zf^>tlgmg)#bb~Y;Qd;R$y1Tm@jfX+3)z3u}9eulnyCjqD&_t*t&VFf%c5(!Ddax3__CGcsEK z-*+%r+nF%7YB&slPeHU1{{n%7BN>PNdGai&DjDtx9Grx(fRc04-n@golIrC1Bgz9J z^o(aOp9Q|*L3-xoHXU?GD!U-+Wzes!XmFCeFFdG8394K z|No2p?;TV6f1k*(iUZt#-tMaO2*w|A8-mA;SfEsM6diezsJ-_W2Ld zSBm<=!q>=0r`@fDu0A()F0SuRY_lT3xhdB>93x3`#YWWM|6Ud<|8}oVE=u;-o3IgW z3+ElgwS^emte(N?p0~B_rAX(?n?Y@2XPo9Y)==FpYbXsfDQSeN{563%SVtD>zg#M% z4pTF;w$=e61_lNjTLuIZO3Ju|xZi*N;EMYBF|n`;J6>pHW#^KxGoY4gL)#*AWo>T< zEHxWl-~$5#3m(vvdW$t(oL!vLK5w(wlsS2o|3V9Sh4L#U#XD<_Ojty0RiHy?uHFe} zlOajW%&ee5h$2HUC$Dr=U0wa?{L<;^N}J z!NcBMUon%W@^lq{to;=ele4lFjQZaz_)8%Kp9^m^=i%KLzx`&|7VGzs3F%AOGjiA7S-xcq=O_Z!mCzHyO2;dPXVhE|>U-c-#W^_AGq=N(dv! zDk@?`)2axv9TpHjD3{2gH8eCtboKT3cSP?_+AIwTSj^WGPFiWI+H~xQ2?@bF+`$hw zLvUDMnZaq`Vj8A5CIa*CgEU96wE74t}gq z@x_Mm1`@u8h6cWJb3s~xD%NK_4x-$Fq^>>a!|w(7TP${e?(L}>UW)M4mtfK4=aZwO zLTNg1Pw$^Ho#wt(tFvd`=uhm+Vpot_luh^^XaMawx2>f)2yi>$9As__^8ue3O+fq+ zazMAkZb>B@z*SLEb@x+KquGp2sZc?gDqaUGXq0<@eL3(rvnxaS6nkhQhLK)bOzg!% ziuTdPS)12_`>*I|-^$HFydw*4!8ZhW-=Cj<_qlP{9Ya_g zypoWRZ&n-_#{$QPbl%h3+twhBABBmAMjhnm_gtOBI?&twHq+|UJ61L}EcTk5oDKg- z*~PF#FO$Jky`G@QGK+P)Cbx4*z0)_K0<33?#agNHJQByx@&~#3ASv@k$j)>2Ni-j5#zUgvoJ@>g-?vBae4~_GB8cGw(YH1U&&Qx#9mw8QD>u#m93AvO zl?@4glEsL5bMi}_{RzR&Bo^&60bzvpkr4&*(~0BP9n(KCOsA{rB{x*FC{Xa1E&d?- zQoQu+pXo&^jJfl_hCE=-xI~J_zd}JdrOUy@bL3fMetLIz;wD4OA~BWYgTh^7sk4Rd ziC{PdoN7Ogwo{dmS)qi-xYi>^n>^0%kcq7 zq7oV!7V6EY8WR>?Vn&xwQ*~5Tagt{oywbh(ya%QKQ&m7l|ICmrsn_lI_v+h}jk3R> zuvtgP)U(}~Qo(SBc_qRiL*7Qm?i}S^U44s;v-+FMogdPLlLD%$s@o8>_3m8beV)`{ z63P=<^pe$BSMrsyF{LCvCs759EKY=S8QI%|7e(3)1lSuJl8HYsfBY9LWU*3HQ%^NO z{B58mgq^hay}h}{^vfTmS65cc+%Fl{p9u@weVxf;9w6oq#g zA6VhxZ_X4QsD!gbL2@Zu3WtKDN+}RRo2d8-p}SgTG&MKJnM#tzXYU$8coY;8%KW`S z)+<5yIEUf(N#PcVL za7usAmMEKN&r8pX2tGZTNd9=G7bA`mN^pb4UabCt7Rz$-pN$k&O6pH|K&EL>mUF-b zE3>z^FIzkG)YY>}-;py^87_Vr^Vpd63BzY`cPNJtq!zWMQ*?K_QnKaS*F;O(rzS2J zwG~yu>p{_W?wT=@9ZEJ)(f6qJR7glDx|2!ojB~6+UeV}O@z~hV@R@ZfO+6nGdW`3HYmfk0*&wo9 zuegY4$XOLgMM_4&F|_}DfX8CN#!C7QrT2s7bcE4Jj||Lr4hF}FQEY-t0Zw^`T3)vIb)nYXD%;iVrBC2 zt>==AqIz;E8NIxI;GHmT{(H7iG6iv)?BhR}WTbeyj3^QsPi6mRu}J)Cp5LKSm&|IO~e}}>?ZhhWOP(d zR~POBh9W07XPQNPMc$4wLJMC@-pX=MB-;Oke$8AH@0)8*mhNs=R#shOGryCPk~|&8 zmp^V$e@2;R>{S-u>dS+Hu;ahggqn`5W>8C$|cac83&!27F zOyyUa{QUKcgdmnjyV)ZYIhJ8X@T$?%@425^wvy=G5;}+%Y>cX zdNE-)umD^NGIH|e>EKOH*JYjw%Ne+(d5JX`dJ>yF$V=#U)cns0AQao~V%vq=>ULYD z5AMS;-Ph_ct#WKD`ve5!Ej0l^SZ-Sm`+xy$&TwBTY=iqCpyRZ^l9K4gICyypKWz4Q`5xI=e5oV?ps?+fBM(1oLZa=xKdOIVd7xY>LNK<+ zuXlI#r^`6Q1&SYih&Z2GT27CawOoH=jVaa)D=MN(j|*6nrwph0?Q}2?z8&Mqp0&Bb z52W>ZSXv@8aOt4zSRIM(hqbg>I)=L@A2+!z;C_p&gD(Y8SRUeP znccpb1f<3J8of`2p}QiwPkttw6;?vFIIPJ+mFJk76JW89LH0Y=tX_BFMfNgM5yh zS1-F{6|12 z>?b1V2G(z!O{W6gy8qDj;KB)p`M>OrP6eq&cj+ko=%P3aw!0SH;4yb|MoJf&lE1l6mtm*B;;>cQSf8Rb?40*hOol_TLsAsiQ{g<572M zrLLhN8H6}hy?R-p7XdAtbS(vHE_Uo=pn|4CL{Cp2MXiO0)u;N&Wzw#!w(%VE5z&>CaoV~!9%v>5sfrRl|*`8MNv{$`mP&_c|fUk1wPA z?Mg~aC-M;Q+}z~ToA50pqr85lqbVpX7DF$Icz%POv)S5`_epw5e?*TpE^n*G!N$re zR~^Jr;HoMDJHDzapLFjhD=VvLScIXfr8>)F@uQqh$4@INE0qaLdQDAD(;A$Vl}<~L z7+*7j&I#d#>kCjNeh>YI10gRiAtA8xc)0TB?c2a3+F09-yDvV;+=2c5pTXj;?Mjv2 z(kHMBfzB~cZUIFlMumx)-Q$u+R-!f1M0U8$NDH&Z6KUJf>JWup zpq5pa`=+Nqd3A>JGd@0WEeaDf<|HS_26HVCd~i@ge*)#20I@K>yxG?~g8mneLnJMg zpGLXpnV9Pfzy^S*CXSDfcP1qC-TvU&3UWa-krbl2`51B${H5f!nZ=&28nVHAj+(;bO^MW>}FTt)x5e0)Q(%Tp#BvOk+ zrIGV$Z+}nE#2mRX!m+HT!mp);@9g|sH_aN(($X?3H}^d~FG_j2Z9q_1+o;K)&E*5H zCe#7mWFWa61gvCud`CxDr~dg38!nf9og6=CugOKuP{S$5SDgX0#27Dd&NRcacCK?x zv!})ZA&F>CyZd@G2bAYuSC5T$yzUp6uZcyL9@<~Lgt{SuC=~l#;p0L7cWo=lN|sA4?Q#oMG#Pw(PO|)?&6=D5r*6UZ3&HuXJIcNbv*bM=tnOOOsQOX!aJMIOZHh?L8lIv9K@yH>GyFatr!LTo&Co zGqqOmiWsAA-7eQVSTz=lLGhmbDt|;QMeYd-&f04iC3a$e{qlC4|46&f=EO>d%O~KC z`_T@wq5>=Orv~WD-CfT_6S0fsW;)3SYd~u{G&$*??TaAUSoeFe`}O=sCj_{T&hF)< zU+row->|~`p3#!kG{xa2>h=eeGN;M%t7&{$pXvgkr4kck1Hzbarm8(@&w_x*4i^;t zwrz+>G*RYD6ciLztD!f|4Hut&q@}sllCm-P!yK;H55(vY~PC+%#0Bm zT0QQ+UR(~p_C)-9%&euQRrPfk9jsm`E!DH-BX*N#SX5QDZ>&FM0-M>%ayji}iT>yW zy;{9hbz4L{Xl`w7x{1>HtQLqO&@ZjEn!YOxWE)!X+guF^+UoQF9wY|H*NeMe^UnE^ z!@=H0c;4$%2mv?2piawgs1(j>spo^Jq@?5%u_E=I7AqMdel*3dK5Zj%);&(VTC3yE z%f2XvA0+oL(xm(csPrt84>Ac`OJH5se=h&($*F|kQwL8W(EazY4|C<|u zUU~H8{AJeL7tq%_B{)!wi3f0 z0%9C@K6o$h>S>%sbI>A-zPd*8_ILpFV{hf-exuXT;Yg=i#R`ACXYRUIAFQ7p&M_)< zTO?-r@WJ-tj_Z!kn&EE69qwCO6L33*zX6a}iqeihk$pcfL`U|vXtGIMV`I>lol|EVrA-t4AM@C?81SXPoQ)BX=SArefvTaA1uqB}x!9@}WB%pDtyz z(3EP4==%SjT0A~D=m0_#@DZ(p-IwhK)6>%+vB1_Fp6u!fC`*WB*n<@Kt>0-L@Iz(V z?(sE7Q1AvAa0NI}5HxL1gsD;y7u^e^I4dhF%fHTIyYYVwlH&&mDK0*Nl!jY ztB}3To!t_vQ04lr6FG^~0o?)KPB!CClkgEvOyM~5`z01pwA4?%tshXL6fM(mSG%0h~bS#=K(^hCJi!vyi3rOMb+y9`i_j8u3 zj_~o%moFD|dD{{sN>WLBzHSP?iNAwcTwD2cINy zy1jbh@qk3AL(>>RUVgVo&gsC43Gz+^wE(X3<>@PY)@PFgzN?Ay`m>jqBBA)K{T$5i zH~^;3ILo>N2%$gegT?_{d$WQOj5bo0(fPf#{Qgw>%|Lj3{#(FBh4X6EyuVxfQe`=< zUUGagQe=yv$?J-S(d`jw{@q3fG~mNodhZFQA#lMP^j_uV+)&LyC0bTVNSm|+}_#IzgkMKgKTrF(5d^0p5w12zDptoJ^kmz8~6k57H@u& zzddYd0Z0HWyajIw`tk8%&GmQ<;#fm|3=;Kn@Aj#w64X0_REe?EXr7ggxsw<=(3Tx( z!mR&Cm4)0M&I@2(SS(0U4(e}Iy%ogDM#?k}OOZ3&qPw*6buHz2iGio7)k#&&ix$PBuX!*eUBt z%ulCv#Au~mceiZJ?Z9OJ`&|+;qEM+7uc4%xLQI8GukK=v)>MPz`yGUd9u5IqI8eg6 zlXOg$Px4RmwB8>kHiU$R9)rfH4%hKH;OAnu?*#yAZ>e@KGy3}+w#Ic$Eu#k)q(YED zz@5 zTkuTn*F@{@HXh(Ez|e13$Q54q1##CP|7XR|Wh?+xf6sJ9)$R79H(jX9??0>sNosjA z)p!YZCJR~l5t&h`EEw_G*sDY1^7G}=Rsf3)r&;}!OHHh`UIu`>4MK>>M>D1kdYQj? zg@X`j0E-w8#PkMu!RV!moY|{WDK5vf!atr$XyR*Jm z!)4+<|1fX}6l=m%M95Z?$_v#5W^O7D!b-7WD}h~wlcka7GB?DQ#owiU@>DwUUpVcx zHZ5+_@VxyZ9GvslhT#m8yY`SODeEBx)MSqY7OddS$M>V1GZ|*$j{*@lg#0c~D<6|G zmrOBbL5~QCPQu(D;h7?l#**=wf-W3I_txYWR`ZBJsqqctbyzV3eZD|Ru_zmeJRk%n zabkvm%R|M)&5YICNOJZY4R+0XqZo>Z%3*IQw{+Fyc0j%Vb}qj)6%>(>K%+D~4ZzpX zVqsDt?Vg2^tOv?jB=5E=$jy9g<~?%{4oa8|I?bez+eW+tohUBiU zD(tA&zc0D_4;8pbMR&?6eKj-F-wTijtUDbD)SRPdRGyLKf(J(z=cZKYShk^mRu z)FU;R3p${1tv=Kwq3A=%N1?QRU;yL-8=FmS(BgmW?xu}$YM(aH!yT)It_@at@U?JO z+`@rQEP705K0YB%f8Mk3Xt9mlChC3QaIT6aEVr>0D#y~Md~f+h4tS#^9`x_j7!>*T zmXyEe_WF=kuLHw8GJn>)@KAp=B9eW6b-j9btQdDYduUfIc0Ej;=3qQGX<%cqNOCn+ zK<^R);7^%eC*G^AQCaU_SPYChEm32P3?$mEzy6d0yvD@D^kxTg@ZCAu0ge+Q(4=1z zg?}6^0toF-;fNpyFdKJF!ZyKe-T5y%mKZ{{OfYsDmmM80Q2%gtgnIu`3TT)>ciTA= zitlsl0BFRMByFOUwrGDMewUD+80it4Wamt2PC9!FO(=eTeh7S*acDXQ?LlmI$}+cV zKm{nXZ-pYgEi3~?UQ8~zA>t(yPo_ef-DP1?GINr+tD zY24?SEDL*Yq59wmk=`OZt48k)mAHeRQ(DiUw*YdB%IQM37QAnR^>=9KjpyJs2B;Wv zeQTb>I}J}-Dpaj-z9Rq8cEE)l1y%tk>AJf|$4@=ZicL7sxM3X7_5z9G)H5}>x=*E7 zD?83m6##6pO9CY|yYD%Gs0&H;S@cZF|9LznZTp3z(S9qyeb$k>s8!xIN23mG_EUN^Fvbp?mocL?M8{^XvIg=ObTASHSJO*kb9tOdE;LaP=LCPTj^ zc2?E1I==HYbK0Yeu8hP$-Jc1T#G;|G*L?r}JzYZWC%b3`WwXT``i(nosc}6_DR9Ac z$Zq;prfjc~=#HEf_<}f7#wI4Z8Xi^j+Tv_QNF{VYc{G322xK7aD1EVJvLX9HZbqa$ zx&--$!oW)4er$=RiXhp^>BSlP0pzgNT>>Hkb@{=;%q-{*iXr{bAjgg*_yo`bV$9Ho zv;H|PHht&ZqDOaK zX?Ggvx z{mF@d{PSfnr1~IHm!W|WRaO&|Uo0-j{7!}0rPoIS#^(%O1u0d2Ljh%}MUKK1lR^rI zPLO(2K@#7y_e$c({!(t{3L(F)C=swU$Afb&l2UPTEPCj@G1Qq+<;aqtB`kM-5R5L8 z9WPXAzriX*rt8_vrB;+5FO>A|S58uc#e7Y&4ZUK`?@e|VmNviW!e#mC=1&{oVA@_U zdZ@mGteb%7!hD!vW@7r?H0}9&Y6=%$wODzogqyfTO?P1(+LAA5=_ziMF^CZa-gb4vD9!QV>XfC!?npID}XBli7Ydp29_G~!OOkt z56gU3>rqgMvR)bhfziRS`G%Lc8ErZ5CcXk@GTk5^kfh7okEPxeT@<+7y0D7Ae7yf+ zs>+P8CGm*f50xMU1X?;Ulx&Taz(2pl_xif%9xh!tvAlf#krN-?Phz#Jy#x-q2lK^$ zEhQOGYt5RS(XA%Kl6`LhaY&owY!r>Bcj=hXyo@5e0)xKX_-093}@SBhsV^ZwWw>paWnr*bFKz}E=DJ&7LKq_zT5 zUD@4YwhgVSwh=R6R`pkVs}U5c_irT>F)Q}#NvR4?oc0r{Z456xvaMA4?SH3{%1f(F zZ=!-7Rx|aKg+6d*4s~hc0wVc$|JbYX=0bgtHD2<&JU@ThSy;dbSPpG55s4u0?#Q6` zgU4&(k-5O3k`ejtRnu&|Wc<$aXV_DJMRs7V{|JL2evO5KAnVC6@ISppj84;OawBmW z00)nFNnP5us_y^;gUs)Px(+@H_bSNkR^>KMxh^)}UZ!Pc{s6w2)_Zdfn17<}FqJ5J zo*6*exdvw}i07@=c4}%6vPUnh0D*INnN{geIi>~efYHHdldU4)N8d9u%Wv>$eGIau zuld%_z05}j1yG&G^O)cm5mEf}XJLH>beIfkY6|!My#XNdd(TOR+U5xET`xQL_&2GT z%*MAS3tvBIXDuk(VRd#)36CIb9QDQiOi3y63BWV}$R$s{xMA(#81Xp3`RrwBW`?er z{!_6RFM6;7|NiYSKRfg_9jeIhcNcw495}+j5U~O8wYFx+6W|;GHlR6paaevE$IedQ z!XjiH8AqxGE;%_l6qu5h$9Gl5rKJ3;quFR0>Lq3b?LpyOJ}S?wb3IJSQp4Og-C~Bp zf{lwOEgsI8*HnY-8POh#raj|cE!qQXm^ zeK_LMQa^wbrZ-VZK@(T5Kg^O|eF=H}p7aQ4Eo9`Bz}DDn@Rb z&F+9Dxd>UZB_h5=V`{)&)w$6kN1MB_=VAeN>YMPqJX12Vhrwia1F-j;&TDVlfTf}MqZ4f5z>2jo4fBUQw6vH`7N7w3npV>{UuSTEMgkob6{R%+ zW!GkB?=37`fPE3r7f+fSFNH4$w0vs`U@H6^t#TJ&r=l^-Z)~W^EoU!BHwS1q(K`Ws zij)b(qs~8^KHWU(JA^L(DF@o5q1%ZXmMr6|0}jAFJK%W8Twh;h0GK~jW&~-mln#+5 zQyp=|ynYGff0V|HeGvtP5z27o(~_WHLQuh6#}%g*DK-FlBV<|@ft=^b5EpLw(diun z-$7*et5>gvD!zXBOvI14u4S}HI`sQD9Q2Npkg%apEZb(7Yz$6^zi7ZD)(iZUDE||o zN${?&Sl#9i2#tFtmx8R~3PlA4CXmyR(d{Q!TcT3 z(d2WncI*~Ix)Pq7Adk@LR3bgnJzNG~8iI%cv=tuA=?5BvASC7WI;*ERZH)TsGi;oW zJkMlP`G3UZVE5KHWSINQ;7-*-kB;-Bv&r$sklRx3Z|&Uf7VcfATx}k47M;o}{bT)e z`%lRzDOaZg<ZyC?+$rETzcN0av5ul`=x<7@H=wD*3JX-q1XhNYd*kmm(2$TB^E)>V zy@;&jcYK$?S`r*X-wMnPXvbSm=$90Fn8)dJ!1H$j z%J=Bq3W@&eimvJisx%&J2kg-n@hoiyjux}p2V~3OiJC2rSpH!IT|fu5J-wixYxX=0 z9?VRwq?UjBq~&32CjSG>Ds;zjFkAUL(r0`OaN0xZt~g-7q;>{Zd%p9h+$Di6*?3^r zklcb>AXEkX1p2JwVMjc~1fuyG*iz*Rze$gwyoB9lrI@QYAj+U+Hu?$3y*i@_mqLhyhq1c~eIhb%>dpOqxq|?(qK#;>+J!nd~48XxctNE$})EY~T zny#79U5FbGIXPGNU?1F2kvv9v{Xo*kU{mjo1JzRP&BZ(~g4Z9Pz?)aP&04CJb5A0j z*dE)KIXMV8Iy#ozJ2*HTuXvDwAh2_DyWa@i`e>MDArLu-WS8t%hT}>coBK(|s;IaK zhVbrqTq$zyZz|im85#bes%T(l?{qRfxUHG;%6^Hq;siGT{J{L7D^Q2-SA;)M4*-Fu z-0+%ZZ>Cmt!*YQi8zk=e+Y9~6mgYD%C)9~jHG2CKXjL%G*Y^AGY^~2`3@Hio6P?fp zyu=#!Z+f)kF~u_@DYF^=o6|1IY2Bd+&o>`z!r3JN?YQ_-fRP9!MuYAYEwzV3^eWSl&!%@l zR#-zV4)_$(Q~^M%@jJs=H0A_8+hkX#?$-DI;P@H%Q2SI%JHqB00Ym!@#{F35(WuT% z{skfXIf?r%GWO$brvXSRz|JI6G+js3$YBlSLEoV%fX~(w#>(~jHV76|T>&fIdHVRv zC2Uf@bht&sB)!fq6CkN$gD%9&*(P^dzfinDpAH`a;z3}|eh_+Ld-O*S=1TNK!6QAL z0<;gPDDybo^SzG1vt4tz;JY+r;CylSHX|c5y|56OR*Dwrzdx+$iCHbj>eMWy=nIG2 z#gII;J@3|-VFnN2oq||GE*E%12srR&9S?v_mR8R=;jz+exn~zh zyi*MZ_^1S2J{nF3?`XJ@fKUxHZkPiv+RC=?a{)l?mYfCkxdaA=iqy6=+w3|2pE$DX#`kgj3BB`(b<>fuUqf{#cPZdgI#$;E${vTFNX%wKzun_$ zI9kBq)RIOay9%QQNtJ7ejwLaG)1-VP+Rj!ADd4W_uhlUJ1V*cTiR_Ln;7YmE1YDTU zK(2?yZAmgNo1R6>uAqVfI*@8tO~si!?u@wA*)7AsQMAsEN{uurz(y8ew-(%U{_6+e zq$)EQWPs_}iWHyQ)~qRzLd}6(z>?j!)Y_iJe~Nk;mOd3YVBIe)QV`qV1xDk*@HnZ$Pa(1JrRzQ%LHDQkcX~P_ zGC9De6r}3?rxb})0&=XtsqSF*0(jxBT!#fE5Zh84U2d^w9QUKl+w`omtehBWV8QXt zagakECU{5i^#>`b()MSi;6_&@YX~p_p0PG;1(6#T-LQoAdHfjl1+hS>z`f5V%(nt0 zz(2KGwE(PiqeAW8&flKLY@avi^%=W;__AkMjtPHzfg>~VaJ%TqWOX7OFB6cPm6dk6 z^w35*FN~fMwQp)F{t)`0^A!h&b3@)}AUg^%?JS{?(anS?#3XJg9xP zcs1j&8{+!7EbgRsKjlTA3OyAa(f(EtI1l1%PO}5w!r<{8Tt+eFcRhLtFOnuyDJCrzQtCi z(}L5$KLJ?w-ufVAjz}7?Jm@1E&H-B!^S2d_DbKBUq(ma`n3>VuzI_WaV;682l-q3U z+ixu(81d5Rg8PpYN&@_NVCNr5!JaT`w{-0BKmOzqTU!;c+MS>tq=A@ol!yiBWH^5;P$>IYF1P=(#M0CME_m{i*UTl18tt z%wB@fN2UY|1*||E-zg5AR=sAP&Zj3@gVZ}fu@ghwor_#=mr3n)dbK#y;=)%_!hwj% zR-l%fJ!hK!*+A4S6wG7*UO+JLA74B=P`uTkUo+)k*U)}@ih9uzFqiUBE8g_-RH&Ob zh&tepnFb|Jj2b%o;x)1EtyMX4wlYs46;D{w9k+=}3XTSUjq^3jGSb8W7Oezg;Se)= zk>9Phg+-A*y!_9YzX`~ySD|hMfz+cOZ+0q89{E7kR?d5UWc6{T2~g7MU>IiEw)-=# zKc@E%{v+KNA7sgeoq8$%yG1EJM=-qOMjJPj3JhSS-Qif0GG9kCus|#7yCEO5^wU6a z|CIYHV|7p&-F+e8?QfC^qmMUtrc^9y;o;&gc3<&?I8#AxtEyN-a5?ZmYbSU*mZze% zK{FUtJ5g^@85axte#*3=p~0OU`75)J`H3q{RwZhUc)RSDKlAqw++AVgL+Qu!v{)sp z4JF?>c$&k4+RBFC`#hAuF&)gpy8ftocR+qDsn-+@5h#EmtQY4A>}_GZ6_in$FQHUt zm6#6n39MKpq&&7ehVfQy*HfTA`=Xn})5QUl zK;HL=k&eeaLbRf#ibWcJZyL38<7WOAad z4KO*49F~2jqWei?WE5$NrB(raF`jA@JCaTv#dxFJd63+#9l}q}qqS{}{(IMy z{{7L>QCkvCI+77EA;VfE*z^07dW1~~9wlOM!u_Ns=vk326EAiL+uRe_&7Pv5glZDM zMsK=)3I|MnWLky~(t$XkG|G7ac1E2A9rq8Dni5zaN*0^EBTY_9JC1`TEC+ZwIwVFU9tngD@M9AyjmD`1`eC3E-E6~chzPTjz2^@GR5kxn3GaP`eKo) zt>xhkOTo|PC%%Q= zliH_iuiYQ>I^6JTwUB;$$kC;7ReXSv1Jwp5z{&lc+>_BKK0p2lmnY>;ATPWkjB>Wh zf}WKD4wyQTgv3JM9OTkyI9bHzlWw@;F!&;;I?)Dg8YL$up*0=8b2AH6wgsxQ7{Fq- z07j6D2hL-kaC$A5&+j;(Gko=YF~GqL#_`ssb%3~0 zZ9dU|ehlupcvz@mX0L;~j;xNIj?wVwX#3n^l;^6v{6AyF3h`i$U}a@pO3b(Yse6BY<#J(KYb*}yW0i4|wLHgAb;11) zEG%Urf+D(bFpCfaqP9DjbmI`RPVY=uE%md8#SXK5n1a{@|L zQ!#&DKPyb$+1-^Yu*gON+k@HiyTvinLiyB=G=WpCTc`doT`~7QKLblt9WDrE#aI0xE}d_yjZd+yEz<)ize5`Qd3lHQKFGXIes`%VPv2ac6w4(Td64X zu2Wol_Yn+aUN1zgt}n-LvgJqSW+l_UpU(T1JTWm5Q^*ge*=S4H-W~Q`thk_z!RWPA zZbY8iUu5_eyzi0dgVoQkZomX1VZ8yZ%-W+AI!sjR(ffN--8MVvv_Hi)*+D*8VI&V` zEYpt}03a#0QOW{Bo6_-#AbD*N)&9y;G2oQ`@}(8fVt|wcRxbH1!ZU1aFbYb`0onnK zgHvuvi(LlDhx7WO+|T*>)Dbsd;^Jx9-yl!{)(cc(-GH{f)*Db?$P(Bs=<+?a3tU{0tDztS6%?{~ah|{!TA*Dn zwnuFPN0YP5p9=yzdPQtUa;cT;U|COX6R}*L!V^(2_B_{#41gZO-J|QO(7dN}r@hso`&NA5rl)x+N zbII&b9ZdiUS|_?h^TMNc@(;6fb62H5hYZ;|pBIdmUHFP1#Kz7>7%C>zJZJL>-O@JSqk}l`fWOsot=$OWhA5|yw46|<-rmE=QKX_BnNfZ{@XY1 zv-50Kj0Z?7kK1kg7$cH}Fi+5@j?9<9EQtEv?^V0?s3#hc>(p-nKqCsnFq}y;Wi;(t(Yn_XlT3MhFgsos3LbT}q@oP)6;6JVjJm?^Q&4_W$CPa$CKRT3cJzy-_Vv+udslI)N+-&n z+!5=k$J78m4;H$?{SnXvLdDTb4z#dO)6Tj4ovbVGM zsi|=+&u7Vel`R$cn7m$}zXzsY+5&lZGC3z@nLI-H|bl(vLIP|!Lp6}bfG&0qYzxkioURY}|X zoT<%_t1IVaE~~i~@-aRxE(t0LHCd>QlJ4N&>m!?GJ^;1FWn{3qAEGxevx{R+)<@C!Doe#=ew~eB zsop%!!Zjk0<>ul>Jk+)Y!Op zGB$s=Of_4VMvy8tja4Zv^EEV_+$U%A$c~Jjlx!5xfOL={Xis|%h9cx=N}@#m??ua4Y-$BG(NICX1!eS;->nNz9N>4>;`T(=r=0eaE1G$PN} zPt5oq^QY|7o7)@Dc(T33%bJRA*%UZ9AHU?^SHlJn%UHz zislf%Ivp&aNup1TjDQ3JU)vn}L#rpE&HZ2jO6k%96Xd{g ztZx+Zkgsn8KaQ6ZB2%w8I=IN6mkqGRe3!Y_^0IITllX%}ULDgo_S)Q*OxZeW_xN$S z-0bBaO`Iw4iQyP4STjjUOJPW&#|Q%41OM%^9jtFj_b_d&{v@L?vra2JD3L_xb?mmE zmbA3AQsGKyOY=>d>f}M2GBKEA%n(X+oND5IOynAKzh^}4jvSC#NfiP%>Cz+4sO^M~ z#Qjl);Kfi~{zoS1t(>DvFt#$3uj=HJ!dc>z7ey)BCS&Pmw@{?7t4lRU$-NP(386^< z-x)ZVkbu{=XlR~DWP69kD);-!ACB;6ivV3F@wu`uGM~`w*({HUR9`14M&*riCr3q* zUoO*JT^Eq4B4fnuYpn2MoyP9ai!=ey5t>TeKJT*&Tkyr+#4M4 zSl&+M8W-~v>TVc5ro#t#WNK6D1mQ^`BU@3W9|KC;QY$(xAl02g`4YcVjT(sU9B1C9a!6(ciqimPwY zm-VPr7w3`{@|_I?xmga<(?PopZ?Wi)>txzgYJ5cmRDVSYe)$+Jp8r%_r-JI)ZeVdl zSo_#E7bZS!3{@mhg2wnL*j4h}ZOP8(1VsJpXkT%E3kw`X3zUw%v-e)ZZs5sO-s74VU+A6$-wKP9K zmoh=8MM8bNH+^biI#%G4F7@WQS1h^}DG>HCTU=HQDA28T)DREuj^jk z=O1`KJ${&FW|kQ}IgkC=_AS=+xA{A)KaKJWQKOdi3Q!D>Iiq(OD6a}|VqlknN6wBR zMJLKKp2m3ZUf1I{X+G>Rw)wWH97dFTtqlBgWCbGk*u2F{B$MifWQmu5mKt+a7Aj4x zM@6-RfeaF`Nb^(3EofQKk@44T=0v65@Zg|NWB+AjIOx`V^jGh8JTE;s;&G3vVzKov3I2ab+0nMHMD~>FMWd0D3r#EgM=ELao zah^tZC3P568}nSbr782pZd-dBD?GHIIp=?bkoo%baFXdrO^Ee0G_}$d=B`)SuIJ67 zv!QVq)JG5Y|85rFNsJ+#6`TxY_`~uC4DqEd%eHaxTZ`}QiD#C=qI3AZT&m|OagLPM z3D@tedoB-F3(egYbt#ay0VfjMiKg;=&Z+?W{`KoDon3bcPoixI*l08oIseB4s`dan zZ3z{Yq$|c|FM~9C<2{eGLG8V+T~0tT2MN^ywZNT0|5w>y*M8isG4D*6mLv20a|N}b z&A7I@2B;URE@!-~MZw9>T5SCl5Bfd(XFC{otS+17Wp~oPUGu+&U4F?IF*3c`-PKHs zE$F@z)oACTQ|+nCUjQUVG&7El+ao>(5UV65mXso2J$mF7lpuo4wZC2wB%DHcUdq{N&IKsHthuxg# z$5fv_%bY3-NhA~bnNAhBHXmCIO57YE7NSw~$SraAh;Y%bC^=750dwp1rc=Bo5a6O3 zq(U*$J$COo?X2Yz(y@_uc6P%2;)``7#D7N?mb*s&QDAD4Nmf**7|aj*N3>rJU<_@c z0>yt+tl}F^F5AQ;06YZp$HI_8>y+7`|8(9+H3|*bCYI*9nm~K@vHbIArOOZ<9%yl@ zI_XFDewaGHHN$qQvDNm%hVM4}5VS*mPXDg1rrVtRfuN`c@U$XEw<3uTp82)|> zdMtNl(g983)_yTD5DxDSiF@eJQ{5XG_4-k&#Fx4;HJ@J_6+DQ#hr0T$ZuMK;xw`La zR$Q8!Zfu&5z0^STwr==0LG%UrE>0VHweYAF>eYlj@uB;XcX0{v}ZM& z9A3CLBXvt}CGP(m`Q*g=7rZ48WA!D=AF`~pQ6gGz<5Rp;-4~juhRZ_zK+qS+O$jR| zK|f8iD$KinFX0Up!-SLF(gt2Qdxo`sNZ z#DZ1^hCoI~qso}3TKEc16W8HDhBCX{XjWAkGlD>X#fBbFcors=w$rSq6whbCr+8Xp1QrS}JNwQsq59 ze|sQzEXeY$G0%E3<8UyS&`gYVC6FFNrfW<`ZOd6=r3?CTPfzfPHxN@`pwhtbD=ZIK6PFQX{PxJXJGq5p9R{ZkCRJm@0g_BUOODSRKT!xxBBAG%)bU@Tq;<6G3cf0DVPZa6oKNlzK98+KEoZ-9UVB4|>Bvko-iRBZb&-tI)+ zLEW?P7>=R-PYq&GKp;OhG%z3rnV%8FovaWF?EQL&IRPZCg>a+E`xOr~mcA!KfFbzN zzCVy9cjLa^Hf^83fdmv`zjsFcRKX@Nr6kk4K2^!opV2fixQ*{4W#Y&v!O%O$r08=R z9s4~pDq2>l+JgEsd`-+vwN-lE(FDnt#@}>Jqs6mw3cJ-5;S-Sw~^D^_v z>wX`HDnVdy)v7W6?^Gl2Ftl;yG#@|_i~|ABZaqD}WtZ1i%9 zN6wL|Z`$Tm%V?5nu?~-+U{otu36z;uY=W|S>*4HOLc-k#JWb{T5}U*^_9xH>iX@EK z-{12&mFDMVXS`iq_4~h^xXnW7AAuPB%GlU9+AN3l(c3beoz1jV5=4v8HazB2;lo4A(GnXAJUW~3JVFBp(ksix*DV4#N3!*-s$^yK zccn}$^Wmii)%@SpC3nIt80zph@Pwt{JPi?gAaVWVcy1v-R{XPh7!7tzHT%}aKI;zE z6*RDf^HI?8^t*zm&-tF((mY_$e)jbAe1D$hLwP?#?b^Zn!&@8acyx61@IdpFly}@n zCRuZaNZaYEEPuNm(u&+N^PE*9r>J2iO>;6st}yq8ZuM8D@Df!Z_<+#D$BKe! z2wE3EHbwhee|dTPoR=2@qJTvjGtP8m_A zAgw787-sxv%~kbT0wx&Y##6Ou;tG2K&<8-GC`F=JI`@)AFz?HkfJ5*ZXTlAYXPx{7 z;X9_$EknzikLtcF9U&URX#>s{;Yt*YV(b%mU@FAAr#!i8+LckUKWMv)!XPf)d5TFCUmbD zpP!r_$*v@%)OoZg&VMe^)}8R&dcypV;Exgfi-rs53Vs`|`yHG9e$@T0??gSX9bx>W zl7o?3C^i1)YGE|pI^qX|G-wpOw;Cf*^$4TPGW_ZXY}9cFb0$_?xexYZ_5>a>cz8v6 zWCnjEqD)0J8ZE=;8}i!iRnK!)t}_oTiId=Sp!P$8Dt>lEGza=V&JSc{yA=`FMbg$c zT`*lHc4Ututyq@!aX~}hO)710aL{cWgz)>{zJ2p?9Qp%&&FN(KXy|PCdU;*pDbS^d zYE89(p2W zzq7BYPe11z^h>@=$UwUuZMjoG&1p^0360lkI&$!^_GZ+rnOMhfX?37S=JeRBa$~bj z26UFGF5;>-pVUy12Nxe|eVK7^>AAdoa_0%~56ME)p>}L`M?*+{qo zdHPRTN{R1DJr#dtxw^UP|HDn+5g;7%N9S<y!jD$MfAvXUppH+dOyyx(vn&n0#!pbY~jUBr8Om`!CXW!tzLEhk&yA^4my$N$}@LW_K9Ig%G*P0PY{&2fZ_cp_KrGYDA0 zQ2nCea)-6`*7jfJhV!I}t~-K)f+L(+y=O17_@*wSYQ_zfRRC`TtzPWI2-`og(ITi= z4iGv2x27_Kw5mQJFhqTY%6zz3b>-+9`E81u<-9zE=J;qt9g8W^GLju(qKdJDieRnK z8F{CqjnM&S5$hdkOpio>ByyMUysI_eq(N;r0*eQP&c3J5!7}>qvD_(;ciPh`*@}bl zlx$52FF4Jc-Cxnk(9Vg2dbrWBQ>rQ|zjyo)0f9vxfFm-n8DNCbTlxH5 zol~TBui4Auk$`+;;%r+RBc_4hC-*uC*cZ7$NP+=kV z$Dt4yKWo=ln@xdUAkHg%^~aXjQ{S<})qix3;@ie>SAECWyi+5NdePE4u7Qi2^Zm>n zlyio(%yR-WgRb1@NIGR)Vc~kA{%zmHpPnP-PZ~c6Vbl2}{&eN#J5e(-$mY<;>X#z(B0TT7>z-*ubATy3<$;}KZJ zZiaPjaP9w7{f0L(D#~{eG3=MIyd+agcx*|R`*9O|96N48JDtWp*p|<4qIsSj2;yAJ z<3y|q%Q^#=6E!b#+~LAUFkx6>Eim+Gxq&Zv)cGAuQI%U7jTkI^+zkCI1hn17X&bqZ z-t17ZamTW@s8D?lXTU+DtXw>I`Pu16#FSnp_x8*9D%h?sHtl>zGJ)|ir#zqTHV)|* zOe~hfjd^p(d;W_wKO%^>`npBsZa|OQ6me>*P#ZU@ppy7YEU(~ z`e`OPqlcUzaVUFtPe1n_6AVFx$q;?vN70LqF&b06s)1Y&A3oXK5Vo0Bdf1Fd`}9L` zig*Xp!awDX_@H-rWmyav#pT5d9}rJ53z1HPrFktyvdVD*vHs<3Z3kkZ5A5>ddQ)JQ zUz+{8g^1~M@JZ?fu6Sv2TX|(PK&!cHFcd^xjv{At8`3$~r(l9A|K*{~#_=i8$2#2_ z)%m~~@KEJdWLPx$516{w*kr<3cU>jZ!-r18V; zVQb43Q>cA+Q0g`zM%WFsuSV|wgx%cR+bh{cQQZz8U)E=IlINVqH%|AB$U8P7QxieKWq_Fd_g zYg1LRlyO^HCXfmu%q?#Sy6$aGk|k&qw|JXZJ_I{4VhSzd#BN^AVb-npcz)M7iSKsI z(p-lk>pdAhP?s|GC&Fzxof+&~d9UnSS?d(L;49gez~gOQ$?Qg{=2uw1^W->@TC7+y zsWZGxj)))t(|^n+#WE=Sc#3q>ODH+i765w;^MkcG3^dYSoezFu`@0rz;83!g54V)d zzhFV-k`yJZEC2_v+5PqNOA<&>Vo%9kCbMvxixY~d1&zV6F3zhm-wON{Jwb=|JjP2f zDUE9#ExDzx>}1f)63v#HO;V(a0EC#YV)K?ZZ|vr5J>a6Qo}+JdhyAfR-g8F0!|?w; z7*yX5oM&{oxCi!O(D=w?RS>m*Y5`oM+|6LD4`5$K%5TYCQp3#{>PW{`0V+4OEC(bM zf-0UPcN&C)FG1N@!lEpmlLBxBkV5ljLJi1JTZ`-&M8DUY|uHw`tvy=qv0 zXYsD&&8`C+QaM@ENFk3CtsHl-{~qmUFGm{4tz?B7ObM3ybSYu*{puGT=}<@!WOJJ; z<6~o8-RrV9zePgLKKKTVa>qp}KWdY1E?pedTFa*`kp|T^yWdMeYz{#gkCysTef71@ zmg*0N%sdR4Z{gF?K>dRn-&BI*>v1~g2rY-Ds1ESN-kMoOM8wa|Yxapr?vZeT65*j! ztLA8l%E@XKjCs!v`(O4Xa}v28Y)byiLfpMhM=J$t&MV+IM_@aEj-pzp24&FwI-$B5 z&G8%R`A*$QTDzwPb|C%HL`nE`PRmPp*N7c098Ozv&ySKZp_)2v1O z#{gOSGFGTtdmSX4AFIDq|2je#qrP+5+b#W~Mk5XN25M?W+HI5u_>`eYLKVU`gy=qj zt&2m=rC@MrwCbs?FeRCbEh&<%3Uwq*jm6|W4wD{!ByD^;z9O=Aa(pgGOZinn*I?NIPDhk zY7M>_zdg!;yXe(l{bH!j3WCge}&%|H7UB zU+D<{?jn}v&mx0Lng>Zj!HDE`wQrrzX6IG%kUsEJm7wGTBZ^;ktsuM4=9RfjmXq@o?1l{O$|9=6mCbN9!aH4;e?OroMfp*HZKhy<3h_~ef#s5z~) zv<;w-HZM)b^cVz~=}#dfEV>l8c%Ss_Y<~y{oHjkYbrDY`NiXkfJCn@MGNcj12$G*H-2pdDiN)lzo-cz z5l;8Te(}yauyFy%fqoH`x}^8D1Ky;pyC4u0z-#g#sM%t;cobm4tt^xM;e-TBu4 zTv@6>%4ktk&0>AuBY3zmyXL!#MIB}90JSR^h@Mm#03G~Sp(+_NxPwamiJ2J%B$mp3 zL+VH9bR^H=e`!B_l!XFWL+9gAFxt4-uX^cEx-c_y{R0E`9}|sBMzf<smX4qQ zHiEW>D~X))cGEwdHys$)eLA8>!Ww&?fU&@rjqo-lrLkd(2l;3=EeIO6k2;MJk=4z> zK&R6K_8$4?Mz3FA2Zb1DiAZu^Wr1Cte18bDx*ZgXJ(V>U@QEH6)CT40tIx-?@y*BS zo;Rjk(2tdwGU_gazwMT4yJBS>+R@zvb7ZxPPVKfg`p^E8fn=Vg9&bpgvC z%tc!*m9wiRpn0-6Q+f#TZWfh}iFCr6`ow-$IIV1?v;}VseNAm9D*!X!K%?fr=%6rw z;X_pjxIL@{LPo^X0~ty*ap{Wnq#7-vB!~X?z*qfnYXby$7FDsMBf137*TrG|L7i}A zQPGC~oI4ug8b}s#^=r*w0O`@$X0_q#>*jK7pxVF;QS|KqPt5je;y;jl9yYt@L!t!8 z!K3ro>2MH6f^Ze$GEHYE%R??MALu3Z^!6COHDak|y{Bwr3#Wkl?WlB47+jwSfd=)| z4`n2AjV?ukPFNTnghE&{LX5{?|5Y`#>%B0y485sVjoQvw0dIx-XeD;gc8LO%QmH?-&NWae}_&>JuGk_|yw%}QM9c$3V ztY5z?nNLQ}ocs4<0kA7s?8Xs67^%O2PMzEBlY=#OHE9X>e9-V|9*s!11`RCO_O8N% z@&#E0l0NO&jJIww(F+Rds7(LwNF!$0LN{!a>AA*VnMwHAEbs1jjl)<$T3Y@CpkOmD z@DA``*#hY39ULk$@^aOx&JQ}?!Er|=C>sO!n?bZcIS}F^qoz97V@`GH$C_vX!C_A? zi~TV7kBu)3{tlJj(3O=DybIE4OrS5xxRbCz7Yos*hT<$L zAR|kt;R9puz1u=)Kqu+`jQQH?4aZ1`f?8GY7hW=4?~gn6Xh~!s^zo%8BO=j+q@ktY zcB8C^703E4-Jg(GLY}I7AQ%pS+X{OhPL~Ux?Hcn%+$9-!eOX5MfDY!Y5znBashBL> zma}aPu&vBycYC<8iVE^4Zk8Zw{N~Ky1&XHw4jcb49_uE;4GOcrS7ti5I^W?u$$iYk!g z<>Wr#;^O*MXvG2iZ23$Z(2J#AmNXq({yD1#=oStYCt|mi4O&Zr8Lccet&^kCyPdG0 zLT!WS%zp>*-)%!|&R)fdk1yO~6`(-;5#~7HTzEtFy6+47A>WRG4J!^&R*>e_^$(u0 z?8?^M2CSdVw>x6)8~C*}NqrWO0+AM^0q{3s&^7{R!#_TdDSYnrTyM9>q2Mg|)p#Le zkNogIJ=h_x|*~L4FdR&sKH-`{a*hC5H5{QdQt$&aef2;;kz<7k{(I< z%XKo4ev^*6t@|3e>&_Q!r|70mdF+l2cBdOH#&-Lo|WA`cDOa_GpxY5B+{bTp4{MY33 zC8|A|L3}9EF?ik>kx&udueO3}zfZ63j_P>T5ua}TgY$A5?!CDA2L9Wp>(@T3aZHyx z@={d3^@6q=qz9n6_kQNaI6_|ig>zN&OvpT|xkKF-TG6IMxxzq2E!-+4d!YBpz%wOt z%SJsAa%nJNhN@Uy4R3>09>4NbUCZl!KKE^bo0VXc53?!tZXTX*&Zx`9EJn@YYI<~n zNV~hB*iLV5h6f%zrN-;_h>W|sV-|TfuU>ss?YE43w5bTsG=mWC4#|`zbgVT2g!-&p z`Ia6MC+6_u3|MVas^UNnoM%RD2ea(5gh*Rk#O;?LRQh94^#;iMfZ-OoI`?gDD&Bx` z7U)rFM#=<_tx#8Ss2`{Ou%r?Na4!s9f?#zG@lQ8Ng8xnvA%qx?_fgx15rKD}y4I29 z4jrLA`1Iee3{l%`+h9@J9i({9jMFx#jykCw3A=7nS=2g6Ea^`o#m3bXQDB=R%|6?p zBi}+u#xdXN(t2w^smtgI*5=Bu4oYYW ziCAn~)c}Pga9GI@e^ACc?kk6i%y&%T_f+_sf!dDx&8A9)%YU!h%5t&iln4yb9N}jE z;PoPZv`q;gQtvKVFFlRqSBnt^q<BNnU zFAh33$%Ty)o7+{Hba~Y|=;_hdYwX(rtE5KJQ95@w=S7F6NlGC1U#sqzV8 zuIWH3?mf3dcHr}3yIsJ+02a8pSHE0_0*Ggupo0+(+l#`tp)ligY37@n(UZ`vb|BF^ z-IIW#iKK>}FpNok6R{$JTaVj(gaV&NwixfZnieuW-t(~`-`Tg$yjKDmQ3Cq}ZV8Z# zXZEHtgDv1kpK#FWJ2LP+#h1OktBK)~8&h=bUVND>U{l|i#7wiO~45wo8caR#>db*S80A?zth>#FU6hLds#-R)PpXUf&;^mCXy z94(LBW;V#=a=~3=Iu2cqjwXf!Nzkyr%3Mgd1D)Al=7ys1xW!RJtcVR$;9!l_ale-x z;%=n}HFOZ9#3BM~p$LV8=~v|LG7Gj2*_6$deeVJ zq$Uy#n8kLqWau$_kQ1bq<=qF5bE@_e3;7cdETE&XxSfG<_r6Z~RsHh(xfI4=VgZNI z+$hu0Z@1}agd@!p!J~?rE}_vV(kuM>bFjM}yd*@#%!e`QpcoQ|Q@wruDTSE$i_2_H zt_v)|`aAfYvSxoh^LMa4V(W_)5&o57(S22B&v|R>uE&>i$~rSme?=v<&@ScW&cadNqyRNh*~3Y5pR+?AO{akGu-_e~d;D<-<15Gq95IFU?7wgsrLGIFmEQ%scsX?;)Vz2X(S8bkgXT8_1 zoh;N3&33@WT?*~1vx||5tCP=Ehakb8g0oa&F@jh1nJo+o1Z7~?!%zkh-NKv`NZT~f zt&65X00}-+_`WcN+FKjLWlyO1Ajh)Y@n{qA>}{72Z6;%PJhfh$(!-FDTlsq&Oh*3b ztq{!HFp|a{pMd5>IbC~Si0x%36n)finfxdvN=3e%?EYkwB8x9}4= z7fvW%DA!>Ks6f*$V+=RWoT17&nlCLIZFI^`b)d*0T0J$ER?RNwOC?K_* zgO*SgqG{2^;@AobgDz`5*b@=ZGx)lQp||%8SX00!egF)ud5Xgg;CMJ%!&@^JsQRY* z6g{^Xl!pV3KcAePoZiP-`-7h}<|qLzdz20QVKy)d)+l;`uw7X86AQS`IWIZZgiB}< z-zRXdkQGXc4aiRh#@QdCRIG#@ObnRRL>ZY~DWk5CeC<&RV5T#o!4@@xqNj5z$4GS+Vy}I3$SGj z4tzy`XP?}C{S+M?3Tnh;%#zCz5E9Y?+c<6!9Akn^q6M~&@VOu0aH%V$Nm|*`RBbTQr&?Se_kAfR7TNyuC#FZaJF>K4 zf=$B@n0;%qF+SiIf<+mrnVG&&O#vtg(X}`M&H%LV-iTK_tNP9mZ-XR&D0yRpc}W}ZfN|Z( z+#KDQp8oIZGWrjH;}V}%38aLcI==xw;G`W26n?&oPF~S1gRR63<>oDaCXo$;KJYAo z9N#oCfddo(P(_H@%5o7B5?)+ZM}Gim{tWc)tK1LqkS}Pp($d!dE}a-OJTUjLp8!f5 zC>I!~kq5{^i@;LONYzLJGBSVgg3ONXoAbG?F@s!W!R8hVF{CYuK%7Os3uNbrri0Y7 z%7YTN7dw;3++YKOLjd`cOlK$L`>k*Y2;dOFn1JqVhY?im*Fn&qcflFJfDp*aVbHv_ z@1N~|1K3ySuCA^~_wLt^TgciIS%qhN38n~~OAzK(^UHsb6@gF(=HUUO#^Rk4jJ3eV zf?7afn6t^jnHPrvS)h!J)BXvG<#e?-)L95-qRL~}5B5*ek=U_m(g185_Ro=+bVrM^ zFujS3k8g%Q3oSf8CI~bX(7eQfkBQ_O$XNvfNq^9gZ1ewgKta#*fBj0Md-ksJ+5h#g z{`(IquK#bpD>5wl|Ni=ai)#PfAN7C#<^P|JyQca7yP#O|Hopt;M~dMaXaxq}NmoY- zRBa@DfJyh5iv6kqzv80ZI&t zti@)d=eCgZnFMUb;pgGu$x+Is>xyQ_UQ+2RVSft?Q?Nk@P7g_nOkiMu8*w1zNYUKr zfT4t>B#V$=7!jsq&&57(BBpTBmeUmYsh%peoaAWN3+U?V8k)Th`m~2r=e&EJw|M#q z*d?lL)@yp^ET(JOrg`ALm6nxn{==kbz1#krO3;P4KSelpspBhM)|-?m)9GAvv^#J) zp1bZ#>b@(;C>(f)paZ)SPnrXmMNbn(n}J3G6$ z_%Gt1L4p)PIzaKq+)rttDo@(j2Yz#qMRSFm+I-Ve0Lde4Ir4dHHQ-K)hO4p4QvF>3i88_Q$7v`A;M5Seeyn=i!d* z4ETmr?&0F%R>g4KP~=dIcC_=3`u?bgy(blfS^xo&fNe12yjFL)8Hg*brc|`4z#6wz zFzeezv%#!a!!0{D-UOHJm)p0IUA~}Sv03Hrz#xB3SAyHYQUPHZT!>&KwZ|Wp6(yD&PuV3es z`q4C)hUv|l9-Sk{qA*I(0|R4jm{Int*}mD|vG0Non-ji6-I{dt^yz5y>`vuwX2yR5 zieWx@(RsMPw`ch7B@P@1(}{wc&7mnjnvb!=!^6LZJMZuBr-G4+&793iV_UrAL6WuM zrpH<3D;5wBlW^T2v4m569L`Vx?!zB7_9f=0crwNqgScnmcg`%=TCf5m0tRD?l4;`0 zP5pS*$KAJS4wJupxeY4VnZNUxw4w&@H;0Hg4C-2eB2wx&VhK$&*<=IAhoHBNT)Oa* zjXAD-2%j<5Dl@zbx*3Kr9bIS5d}OlG+Sb-Ns1KQ$*ZvAKKkI(SirKO1NSBj@TG<}; zDD4%mDULre(o_9LmyozPUI15mgXEKnn%d~qI~+9lT;i)07D_epZ{;s9m@?g* zo-fsox4W;&`QAT-;h3n~W^V$o)4|^DvhuQ-H5DwFY@(qxqIr&v zj~o9!3Y2~>1K6#l{$zKX>=MW?_i*=&HfPY_yF}ZJbdIkuy)Nh~c*ebd14=Zu8K#Wp zwdE+LD)&{=305^Uv};57k%XDpR$tWD#L>B!u(?xlFD%ZpdGt1o`;*+;+}^ zk5}ihPqDqdEiI$q7Z`Z6r>9p$X0(+3ZLq$(Yr1_c4>^xviTus_0p$TFVuJ0?L(mB- z|DM7FS2%5hX12Z_pMb#Z_%;!e9s2l4=n8q>?Ju>50I-3&K&?s<5Cnt<^$8~bt)uN% zR1j6P#9DcshtC_lHp-&vx|uhXa<&1RZPjv>quPNye>Cq}%E{?;E`Y_-+4-=tF@ z<<&Q_Dq4J=UcYpYsi*4>BYE5ZU1iTgTzpD!4wye=oo>z#oJ*H$6x^13s8wXKlWyge z)TWMGM7wWivms@uc;%DU7JoPpI7Rvmp9Cv6 z-6D?i0mfI%s{YH-P&C@s<_emV3)t)qi?oiXv3xs-$tZ(UvM#=E*_f!Osz~n93T?Fn ze#{vuE;XE*PSNf8Gd%pP*U0TOO z>yEERPf@yEx6za`^LQzE%|E)=9?G6|<}mZS9R2iXK>ar9{*hURO-J(#GX(W_K48ak z;gWYTRdM9czWMONF%{!XvFPHrNPH3sOA@x3TG|Hx(!g#1%}F>Of)$n>3tMslVPThP zVddqI>+15q>U*Ei6596m^n6XvNB^m`cW8T*scS&LL9;H)swn1qJj?h_ZtN=B%45t(ewiwL@5@Q5oo#Yw<$dk! zmE&MK4L3SE`(3^rPCQy6ABgC)|NO~L5qfQ6;%iy&^3|i|IvSd)s;c~j2df`GP2R5r zTev8!7YE-`2~vDo)hxct&c5Da3>9R~`l`3r)9db4fq63Dvz(4*uHdara_my&35|$l zSiUOE%J0*!cWIj>g$IvyMgNfgB>MHm^M6yk`H?c`?}~&zv{RlRP~QGV9m5s|44CN1 zJ$3)sk>FlP!j_Ra8HfjQZj0bN$kfAPU87sJdByO|{W0OHMsZVl{)lY>&KVeebg}R| zT1)4)`F7x2<+T`~s&R3_xNYh6cd{72tbBU%>6hrZ0ILqgle95Kn9LlkPX)hd>^a*K zhR~{JTU=1WSEN^usNU|1YjijT<;_sOa7Z}xJ+4wtmFH0$|aMo1Eb2)+s_c}YnBz^8rq zcEU$7?~=!C>>6BtSPALO!Jj_00;Tv0nn_oTBulKy@c}0nmw4}3Ia*!*Z*q_AG!ghKD?LiK`Aeh_fmR! zZEgM6nv+&&Ld6CF(f6_9NRO_H@Dg?of&w=}>WhApZ z=GdCfJE#)g{zPH-#g-BKm0<#HY(O(9XY1GF8>9%@kwRgP6$1BS$IpRu5w-g6zP|RJ z+l@0oX%mM{g!Yuvp(z37`NMYvq}Ne<_ZIz_)jG<=R!W;o=twO9v02Lwl8S{L-R) zBHLB5wY_z5bhuVq-A!~|3T?B(lxBisv(Tlmpx~BP@q;{#d@Q(lAg8-4%uYQpFi_=k zjP)^$rVS3q&S@#<`A7cK6cmO>Bzwhj=+D3++R<`%f2EIk&^DxaY;jf8Q*@Mn^r?X&t<{vo+(rE z2fqH@Lc>dt$llVb#LFAW!HfO<;Nc_Q8?Z62eHN6le9m-hQA85e%fIW{YTj>NN8@w( z`_tdzH=BBqPmS2VQmHMYmX=oYXe&8nFrUkM7bBkfix$`|l9ECy9^XSYDxB}s)HSx! zGO{^B{KDh930O#w^hv0$PN}bu3Vs=xnPEL=f6l*uYvxw%fqfOeUv4GSiF zFuS(=2pm+=&bpFC{2ykg`n?==MvhNTQ!9$`p`Jm9qx^Se84eMyjm@^x_8I@iWPLCc z5pyR)=0E#lIPO*^>Nu+v>aVwqoH}eaRX=*e81flRnjx#h-6Z`>BE@55p zDP>}1y4kwN??I`QcZC=)KgkzZp*QAVYhuF zjGwu0pPz+BsJZvt=`Vezu=$w3ZMQV+vVpdH)hZ44&y6*RAQubVqX;4f_xW>p{HUh$ zQ$E)d9B~tQt^Va>6Hq-0?5{L;^pjOE$~8|kQvrJd*~&nbNX7a7NE7Wt94{yNuiE0C z!0p1Zif4^pn->Sg2KDV<8_toeX@s534>qx`f5+UT=J=OD_epkt(9ck$kVl{lK8c$NLm-#^zN<#Z3;>xLK^p ztgrV*htnrUvdIcXw^v{;i%O*G*2%uPE*^ddT&Q*hzY@m#N#R8@8_Ww-$<#B1qYbG$ zR1b7KJf!_8A}!D@w%%@*oTzt~%Hkwpgk(JSfv!Y))^oJF+ReaLsED-6l%2G;s#umKC|55;7R)G0&gfqVj>mj=|T(E z?zh%CdsB{B%^a29(pBD?zF&E`z&bURGo5p#3)WqCbs>~lr;D@O3cg9LUiGID@U|== zZ30g|g^2wLuV|6Yx8~;bUls1GTpRNB2AzAp&(SsLquk*>A{P(y{dt~zq;I(-unTC7 z4?kS&XY|Thb!BUR4EEr_If4dcGo-lIr;8Sea2Jgf>vcQcmpnQ<+S#=~nM>Igc2o@0 zHF&f+{YO+(6BkVkchz(I#C7w$G(t#iyQVWxpuxcN(-OlaQ}##+h}+CgPwv1ck*$vY z=$pw1nY`$6&(|LN=Xyn{ZUwUHR!0~|=`S;7OG+O4SA^ot&dzQfDKqq?2>Z{_OGSWW zbdwLm<}8J>;c}^e@(;R~{p!~`9cL|_*biQ*SGXQ=A;kPx4g(}YR6$YkAW`tLEtG`z zyJLyJ<4|7Cy#DP_1%;A|ijT<+A}T5>wG!lS4>l*6$|{IQ4vp>qv&Tw>l}J@}@aBoZLRat-$IRI0{N}lLlVup}I+YhC zCJy-(77fyb4G#M&{`35f`1ol222~ZM<>#{*`L+I1MK`f&Xp=_k9UdQ!BDlwD9nG@0 zBcv`TE-6A;(2_SMGLE)o@qNvnFgF@uc=qVh3UrP00#i$H+i{vrkgJ_CFE5>sX1&fr zK59IVRVZzi8}M&i4*W!3NcU(>d#96eR&Zy~vpX(%Uv04qs-7 zD|jzb>&^E#1zURM8Pw_CjTAv&ukSY=HIxRjA-Ve>(%y&XrzzG;2kUMfcI=vXbN51} zWNIT*+@|}cXdDg>w(xO&l%_XnJ>0ZHX`Np^8?c)BpcwgP`VrV=ARY|nYLZo2O*XF? zct$NBZzDv+>-d!Ms~FTQ5Bv?p)zpX~99==%U%Anl$Z)njJqH!90mE``5ZrYQ#}0JR zTCjDSfCUdwPv&Ul5{^|^`9m-;YWscZqv!+;rR&r3@o26$PB}V?-v&}VHvcM??ssG| z_DM)_g4Bo0r2FMstJTcR%pFx%Ns%yWD(daIPbr3aX%eAf3D8BDn4l_J=t?z77{gp8v{dx!?1ntzuo$mA-MWOF9O_50qHW^!-C&V> zS@&3jGPVN4!a87|y;65J&wX}wl->{}neB`Ib?PgLBi$MS~TVhV>XhP|U`UC?JX zT75T${a3zK3dfYIm!mr35JlP?*9LD&!0d3K);vte^MNFd-OCdL77nA0O;1dNzZOFkk6jLyajB`3+{Ra+;NARiVLF;IK=wKNeb0NONr}Yj zJPTlJRZ!>06!+{NuWg`0m8U63h?3$^3Yq>cWAV7O7-kY&p3i&{yohw?mZw+nI4Gc74cVS4An+wG;%1nm{?OvZJTSYpG z!J5)0pUx>B?^vA3v9quOOJ^P|dJdpjqy zoY0jX9Uc9u9RgdJGl?$rN|g9e@&g^07`e>#my{F~FMEz`a`eBqlZC+@CZ=eBuQ9BV zqgG8AU-`}pd#TTO>`-)(Zx}Y${3zG0rlNhs$>{|hqQt}`rA8xkq_nu~m~!`j>|Aby z)+jUT`tv%*=hTm`GgGcst9jbvV>O2b<-^)oxeG1mL4&wPdg{4QQzE!TLp zq7`RXlEJ|z7Lh+ui=`#~UFov#=IxXDU38vo2IjEAxsS5Dg-qW7$jRhL4%DbE(D+?o zQ~Lm&VhK6|?Q#oT!5gkU3Fjf&F9>0M_||0eagLVE@0kn873)Gj`A9Q}WAO6AYUHUV znrRPF+POxW^wJ;Lw7EvykWdE;+l5!$PMGJ}$n9FB>xo?w8?9H7eB%8XL!b7l3!2Qm zNA}(76af-+@(IGKIiM>Ge%jg{`?IglFW=lb)u;mkrrlD1%V_a4w!&-Hc8)D|7`wiB zS3hK^Fs(_FPc_CC{2A;aX4fwF(Sn7=H76v}NMAeLD5b0J@ZJh;S{eh1g@Qs~$+wtS zeFr-S?U5#OoaSTi%fH2l-H7A12(ngy5rc%26CcPGj8d|r#Kr17FKM9bkHoMm(%)Xj z#l_!&g{gDacz{mi-s%<>O%k z;>)qIL9g*9wKTjYSKt-vNqQ``ATm^ALFx9`p-ldX9MH|0Tbje;!ZDxHKjq`+$DS5m zy3G8P)z2T_kgTKq;^oDx@3&K@mvqoPd}3=$xVMjM`1b8h*Bh=V-k|}4&cf_F@B^6* z<+9748q{m7Q26g$e{AwPCxtWq!=r2k>{HWjp2A&R!k9ifx0AuQg|YeE$>x84|M6Ae zq|r|npF{2bQmS)3Rj|Am9o6z(W%+!FLs2*4M6!*=Yjy3(^p7WtQ=*M{l0g)I*j$}v z#xbTlxqsbbVxnJb!v--zOIw>H9}{@dji){yYkjjOu*8^9%m0)-rB5#EoOVm%HVtWL z++S08PMBXLRaI52Q4`L0=S;^B)(5c&i&V<3>Tx{%A!l^l)nw(Bx>*E9+hfz^$!Tpe8|oH1Wr0k z<5Ax^p3w>G?OwUC7%OjEGH_?v)rX8PAjrkLphuqkHf7UPlh~q59{ul5NB8);CDV~q z;b$So+9)eyNUC=hy0JqhADa!e&Sr`lZuI zywkl=ZwtbLgIn@r31AVHZ>rbb0*e9@ic$ObJC~E?ZGC+YD&39~v&;3by9$0;t{R=K zuk3<0QdcG$sKzc0;fTW54Tpz2hW%I>bvAcT;lqOenkMG}r`Go!Pv5Bnc%Tz?1ZYrk z-DPHhO$>*dEPZ1q8%byT>SH+r1~-?M6U{ZBxm>48O7!t_Mt_PfpTtkC$|SGyPv>&? zfI+J95}>Z?g93ikR&L%ICTVFKQm^6}Dm1_kj=A{oLN(i*amHq%b=&lJK`z7_eV;36 zy4|(St!lOnEN{$%tr|{AcVByYf0fD;d}tO0fohTcO#ko1K13vV6+gni=&Dt}RaC8> zr_pvMiOp%g^1jvlVL~z&R4_+oYo=x0kFcJJi(l23tP?kr#exbGHM@cZ+84A)yH{^- zogHx^Thmngu9HkmphjANu9t+l+Ys*xmjtY*>oiYZ$ z+R%aC@fK`u1hYa@XD7ihPvmN1c?fP+Z@gE^|6%GYqpE7VwNa!I5CrK^KuM7nNl{8l zX%G-W8YHDdDFq4XkdlxF1*BU-TDrR%>D=F3?|IJ|-;ZYupC7vSUh9rIubLW#4cR1X zB5tOqm-?i7s67FzrYA9bCpi>Yb8o}ZGXHRwonS9nTH6ucy}uMJ-l?Q&o3{rkSEDxvq&NPh<&Nv3?`w-dZb>*V42zF>()gyBzDQ_E2! z)kE&6!>&fcBipkj4h9+WF#H&%#0F;2;6ABy!?K{F0vfuh%AC}%Nlfl1{2UEd&TQM(>hDrole?wK+c9-{ao|-ZRl! zQF3m}dzT|c&ljEOxSZ*sD!5;Y>9joaioNhG|FjCdL4ga=`DA!P@X4+D-U*NW(qZz`nA3*$m$X{% zf&xxhx(`g-=<`mdm2ihM;8)1@XW|l~AmDdoe_3D9Zl|dCia1QF&L1yr*!hwy%UV2u z?`ttq{-v`C74RbDtR33*FfvG2+*CNm`Ae2=%6NnD(VAOXdGLGY?{jfFW z7Iq`B%RO~p;6zD3)X~}Bm?WX8a`1n6>}p%ou8D+ zXGHky%5+KO>j?gMg+iIy|88^`Ea@C z>!53e+jnOcm{I3SO5&P-tiYAfs-5yzzBfkrYZ5`2;>) zQ(uK=3Qf~qmwxloA-G4Du(_U7;$!+_LIs4|;w2)L-{}jF0$oHz(}5D40VrHDa0r+&lg<+BWr-NAbR zEzf{TV&r%nv)VbSN{o_{!r<8CPH%0*g40gHT<{Wy&J2LBxWkJxDD!NTO@~>{UjHDM3?L-QyeQObYMJ(wUSK{?so$1G7F!hd+tTD z22dfSzDt~t_huqhT^-K)(&-@4{=oC!6K7YqhOsfq+cYY$uWH{v$30K;U?7y0#_FbOmy8Gq&Ep^R$ztwa9zx~?MOaeW^(^IT<{$2K~+P`jMCo zj9F%YH1$11Ji@G$9QY$mDrTh(_X3l^8#d}Uy}A~F@s0f5`T6*o?@D5(+7EN0q21EB z<^J$A_w~9mh?&KpPKKI#Zadg(b}R7__t|Ht*7@}5O3eGUu^m{=V8xMmr=xe5%aWj> z^+-Neqvgrf$h(S$Prm<2xz%lX$ST-Gn)ClI*wQOLn8>-rppP`^XHKv<3}B=`<*npfrbSjIsxYf3_79MUD3^ zT+|6UUubj|K9^(=7X+!L7mC4UtIKVQ_|ub}e}_`@nF_vWl1~9iwVB;`__D$sBa~J+ z67TaMh?$T}(&3m(Q%k3zuN^n7HMrq}%ibXC+W^JHSJnn0ym4~;4U3Zj^J0T=9 ztu^#%Q%m^S#9^Y)%vuy1IgbG~6!D>(I=^1`D2{pnA$^LhSjb94LPFpBV6oIFnpI7z z#-Yrsrbj-Jyn>Yptj8;ut;}6l8dG*FvnLM2!omU;oxx5oL%HJ~^BP|k%;vn8hdR-? z_Ogy)K!1gb{MGN}BM)AZMi)4>r#8y)mnZJ+*F9? z^Mk7wP%wBzj1-=^)->)yugQlleq3o1rDBM2Q6`y^#kc~O@WLbZq7vLKQlreEct6Bd z4nnua`c$9Yi#fl>BYZ-<)&i?XfhAjW(Ij~S9{*IKsHG<%+P%DRqZV<$hO!=GuO2Sf zQdxQShAL(#)m}QXFznI9OwJ-(kynps9R4iw1K%Cr^L$xy4Z_s9N1Oi{zJC4T?|chx z|D!UiRzkd69U|xG;oUf(VIy_@?FM5I;@(Fh!CZ27+)MJwesBT&QEfq2u42&q0#Nm? z%$hKLA`7<|$M`}wyadh6+ZE}$HSQSDR0pBE9kJj;bQ`F|X3F%3=L@G%L{sa3tGeb#U z&-491B%e<=>^DX#X?i3jNsVa`gm9<})ozrr-dB?_Ve|f>gQFvyU5u%__rWYApCE{F zH-tuG3<+%GBLVfn)iWe3pQM560&vDx|?uCvyu49v~FlS~Ws7e1)7ngCPU><7E zsl+_(R5(u-9&;l$IVL71Zm7vL<)EL(zo9Oj=5U2mL!sfET;6FO(>=Yklv9sB{Wjis z*!4_!w`O}U(YcQ-;jIWdEwL|o?Q!(IU|RNs^@)FG>8m}?#n0dJXZ~)H!!Ds+Q!ZdT zxD=^LqAsjokKlCBE>o#ZhIoSx-ho8HcQ5n*-AfC$Fw=vTTkgI~ywsC;*GWGnKKz6J zP+pYTM-~2o{h}U!ywU7%Vv+|YEtYX;27k_EM~bXP-dRnbr1ppZ_@+i07*iG#_D1NR z8Y8ThCkEbJ^kzoFB`CC(5XyY6h}_KWhqdRYY_p^6V9O}Z><;TFN`zQ@F9EBT?R8I* zsl5Vi46Cs+A6B@vdj|)b%ob<<{kFE=cXRkzy6<&Y~T@U0y!dli+dUc)b19lt=RYso;7W?=*8iQC&EspB2Lw7dMFn3& zW8+nLx5u`BiK!ntXfn6mT|O~b4RFO1=f3u?N3@1l+yBE)_$*6#d}F0#7G%{IN&JT8BEe#IMM@ zKD!Bb{9%hB*&Jh_R>MpfV)?B6<>3XMSn>YdEl3G0zW!AEEQH3_vI-3;LVheJciA18 zT@kp-<#sA>aE%JeD!2+QN`IyPIYZ5N${;yyAyh_%SuGX`Q&g(pS{71P#gjBP3k2Vo% z@SPZNx*(J#tt&Xu+A1S(z3Hp=EC#P1fhJN?C1FZ*a9qUqS$~vc+-cB$3GaF3l1ZGs z`!goTlxo@-Pkdq|l=F7}&!Wy63a>rwnpyrmk_%4lC5h3-#uwJKtClXJgSj0Z*4wY{ z@2}K49Tjw**WxZ6eZl3ebvNVs@ z^J4l%Ncm_)MHjw^&sG##kMv3NX-qMBib+88xh8-R+e^o3yS|+d)pXYfs{!r>Ae}~j zI6g8~NGyn&eQO8$<5`6HgAN=N9;|y|-yxO;s-M>l;ZN;?6P_M$DPdLtd!6+%)2!H- zyMOKQ2`!gtO6OaSi-f{sGt$%RD}(@D00lM!y-sZQ;`B=$&r7rG#F0i{VeDa;vWqd? z&;aDKel7H94QX5l3HDsyNf7QbI%AVTvPg#BJKuLS<9OG*BtmItlk50d62&fT zpdU-4-AHe|uj9Y`vb_x5t6w%n^@AS_PX%^M^x)wxrGX%*-4$0)<5T5?hfn77az`#3R>;?XR4XxV&HaKH1 zSj6|W6Ao^+D(%iB*u64g~t}}XJVZ#^HemMQ1J|Ap0+Xr8ddxqT5 z|9sQG0g@mtPpiZ`q@|_j|M~=!+pqH{UBl|wcnjSL$S+#{q4Jf_MvbBJCpwWMo_S+r z`B}FAyEr4U1h5PdnF^$rg{ce-kEQzi7J7oIq6m82cF!?pHAy}_$pUP%@uc!#- z6DyZ4^$`qqYu zd>Gn$HWdk3y%DX7*!>`2MTEhMv|_0?o@k(4<$WQVS6IHTg*OLK(k*~=p)6cDI|1tT z&DJK+7dy-T!E)=Nq13|c)!o}83kS#Z%B}^t2s)(794CAIB0e%wb>V>N?xJX?oJqu= z8_xFyR)(AUB@1rlhQ77#eLFMh#=UoTuTA(RN6)!STwFq$dg2%wW0dmQ(U!)tMH@cT zypE)(;KM>Fa~Bd6Sfm$nH9m%P)8q^{m##?8f)jThm=;0Db6;)Je;8jbE=723IFnWp-VwvJyYx@G_F zl)KOf*@!O+qxsGbUzzcaZ`}YDfv?;nppc^)*5Fi-W9tuGo2%G+OeQMs!ap0GZ|~Cz zu@-WSXVIAmv(fN^LRv&v1TsO^;pedWSZDa$1eUrayy7Jdpz&EzRvChahK@2O#=AQ& z&QYdAKPz?s*nMOd#}@clWtrMawX_oTB>tWk<(29)KJwr$?(F z4g5GG02N{_uQ1s8F3IKf_i9|KcbU~_&aT_%Z{XH#U5)t8<+UXYW>GprX^-HC{U)!w zKWmZiEozYS+hFsfYGjv$Covj;8nJlSMo*ugHB6zcM2-HE*j-ddEgP z^a#Hc_J$3x`wlP7%y+#Wwz7(fEhjuV$?!l$d|N0y4Iz=fN8riUZat}`HYSv za1AYJZN_uZk+|=GjDOK`W^prr*Di}qR8((C;5p;AOP%$FtM+vvlAvbO0bYS77>tAE z_xEa+sa(IU%2?rWUWBSrTfYgnqeF&-Y)PtMRe61>yLEI2y16i6BA{1o%=l=Y!Kzs9 z=4+RAjFB1Zb@C#~Zo30}i(xL-`>KWZW`Md>$WOb75a5Q#b>j?l0q-gGX|R~=w^!-p zb|mEiW#94^5OPt&-L0W^M_B_3-${?Qjoh$U*qi?S7FN%gb zQ@nS2JKd1^^*SP3%rGa7W7tclW8Vhl-|&}0zY~u=RU&c zj~AVtH3eU%v&KfcF!1@hH_JsucCzd$ceVE+|Jtb}GpCBm3BCE#+l~6Taf-m60cSHa zH+L1pJIK%sw;tM+zI?XBjS0UlFI3t)b#^t{Yg4Ud#dUv<_K<21UbVn^;e6FoJYSTb zewu%l+V@{A{+;fqOOapad-pRtV==|KH+H|#dDV{%iXjfAMt8VSphG|)w06FaA05>M z7OsTjyA|GEU}HrbItFGqcTMgha{i~e(FkhU{Z%L!Xa*L?29@@#y22$)2~bqEd2rI4 z$3gwTjZGAWf1iem3J+8r?#mDO_@c7QYwXWLv=_VD+aCi-i^yZ3S%R~m|h}NWJFn8__A+v6YlJ^(~^cYvrVtF08J+(`<*R|{q z4&H=PI2JHOtE*?}mW2c!v`;&+^yOGtlm?UvdoE%=cDn3*=&;d; zgVy`YM+BSbAM~Jpg2WJB?qSJ!Fp{x4;V#ZRv~D zRI3`Vs4dru3+QX@?m-f@=7Co?MAP@uk)>qgqGm2X+=cQJ8C)n_btvGzN;6J$?oB)I zA$|BQ?M-sk2iojQ-HhbHz~ZD*`peu+&$aWO3>2MGvhec?l+?3}y1m?vc_?-2=?#$c zt1k!6wprtek@A%q&fsAC04G^l^$BkZ=j|k}$jrBn`f-7A=Az;LD}eqPIH!F*fgAIA z_mDdI)eQJXsb84>siiljK2N6t<$NBO(`EHlue(q?f(~K%(E=g8nWeIH{J_qWwZqrK zpeOE5il+O3{6$2ZHt6n-0O8-g#DHjjok$t{IzAHAl}vbKuQyNi{m?QvC#%fZfs?z| ztGag}(b^p@eih^`ojP1}f48R?=H6WUUHLk)Q27cob2x5j(JcdK5>lpXsPv7J z$_1PPCnix9viaauuQ)kSD}ZSr7!3dwWV=*kbO%R+6B|K+hia>@KE=5BztdQ1-dmPq zLj&~azUm>oBEz{zS@Zl`XqKBBzQYfr@=yLyT&g7~CJQoM!xswO*pQOy!vGKeo7yu5nR2xR{zhRF#T?p3Jr$(%5t2I-k+hw# z$ZGn_BG4b?pf0bL6yS?3(b#w7aq>Ls274jE#qhrelmh_(*Mo@GXvvH%ie`T*u}UtW zj^mz!-ZRoq!JpJDYD)%GXPQK_c9L{h@hTj|v$=18kAZiAbPzNsHej6MHNX9bdNfDD zg7@v{Rl;qtdMM9#=yycnOv|&+`9lUfmkS%TR?`XJW8t&0?6Zs|^e z558AkE&rm)dY+r9Y!WeFiE^ZlrVOd%eSS6(m04~5ta3gpL`F5m%}FGiz!7HPQdZr% zFGE!2P~#U7xaZ4HdRV=^u#sL$ZxHj3vvEBV?6&ycs=OJC!cJW7^ z%WV718qAtw1&PM2#V)R7ooc6KpP|B)0qMCLk|-WJRrAWy5+9L4#B$@@sU`oUb49=w zrAJRYQCFzmI*JJNS9&Y%oD!_uzgCdj^u)(;Zq;SYY#?WxCDnE4!|DBBXQU<8iiz_) z+oIpHI75f$L(%_N1qPU-UxF=#=xFgq#X;YdS+1i7MA zWvjuA?r6#!&v(X#o1(Q9aenCAEL*9j%!6*j6OAw5kky`(C&b?K7~zn|EdPezk1NAX z*%c>>2SS;f++W^pOyFp6>NQRZzyCOP2*N7Pq$+wN=KbB>_XPz76WiR@eb+Jwz0iu@ z_UQSEoDSz-U_AKy7bx+%-W>xgLv#zOQA<4_O@9BRi=G1o2+lSWlNs|dD+>#b+q*5P zgg)vzAx=$%3=PizRrt#@v_$gIEX*tdUfWk>?=pM zvpG&ycu>8au9kSH^T#D0P7FJV#(eE%+vaes_2KL!PH?6^k#9e60MGrYHcIlQ~P zP4&QNFOaS(|b}J@&L9*Hoimbl+@O+g}+_ z+q$qNxtoMIeiBQHoEo(?#k0z_ooL8ItpFYx2=VmHjO~i{TG7J|gb! z9z>)Em}iagge5n$4JMX3YpK* zR@w&J1tN{h0Ii#j2|Hzt&9_FHaC2fS=szR<)5-4K!tgXS!0!YF`Du4R+?{s)wS@)> zoFI4%HZR%9n!Z;Sa#7oWybKm{C{P)*=W+J9g{b)2n93=Z?z^^qXTScXY%jPA zi7qpFh_b?oIf1(6`>oqCfROe>S}{rGyKUy`<)tkG0Vk*Zl}Qo+sIXngK6Ko=KezCM z#P0p!7?9$YOE+st>C{ni5V(m>#F(os5TLmsEoP^i7FMvwSP^eKTv~;RuFz2 zCO#!LnhnP`Yrl(b92knvD-7;L7icq7#{ekK$A!KHWMCM9lvgknl%*F_mZSk%IqU#yUYzcMYT58$MHY-$MWvE@2yUC?F2w@--T zi;OQ!artK3&y2wtaM}}$f!f5Yl(!u!CTsD^pDaviO~?#U(hC(M_+NxI(47>=XODgI-?)6MDp%;CzZKE{*EAw=}aVkX%HS~QeD`#2^45e(6s+8FmxNp(n1F#R(PuY+}y4(?@chmH2c{ve@RTdZl9fU zB=9_kY6o|&J);BO;nkzSEi`X}#77>y5{>b{GRdK25Q5X68 z;(5*g3N9}%(9o_^2{fK2dp%tXutW$S(~;qMiIKPA*qQt8N`` zjrl;W&)N5bl9Y+6{>4=O2W^TRzQykRam^Y#wI5dZ#f*(J{R$R1vg+NAeCZ7!OrfIZ z`u@QnYfwYL4HDcr01~r6=!upB>VF8<&=&j^#1mwrr8>4v5jd|WN#p8Tp@5HJCLft3 zuwDB2OQZWVs5Tm_0*wUM0lE8g4d(a^Ju&?q2*SS74h_8O%X8CH?HmQ}qX`UC>Vf?O zVW`@tJ7fJo!IkRqonWWn#ZzXU9DriXhjRSlOU(`HQ{HRVypEdSsRXtu-7BGSYdnV% z7KO&P>)ThF`+Ltlm%mL9U-*NuBt<85D@&&^sq+`~uB_l8l#60ZRYG|lFBd8ZmY~GH zbc840uch_l-yFm3zZ*)^`nE2wf9&w4t*v8o8QxOUz9f+jNS>CuE}5rK?<$l#Ez@G+ zwhs-?30!&m$C~6ZOi9I27 zY*y3)elFery>UZ@B>$jpwQcxdlqYkp>=8vJt)rj>**#cJ>&=&TLi){jFXEnFsRxzC zrcjA=6~U%0oW^-trP>DGhGj{UZ?5|K&|%GY{!zj9JSTrURV`unf*WcFza9^FkD{4? z=BKP~wk#Z|Tx!dse$oGb3%WX^uB;8@;)(Y~^fnKc_6DFBCyAAIj1%JV7^*Ts zj+Jw&+SEmL<+1v0ablYsQ_tkJa2Ft7XF*xVrQ``ESyLC%2u*iiX3ps6MLtuIZRqkw zV@N29Dbx5Ad52m1T`aY|{oYl=M|mL#%{yI(YN!K%z(MquhQ_Sp&it$3n0eqd9=~}X z@Ez;->mOrHQD$r3kdvZs@Fqr2_vb6}FUipg!Sal%N0_6ty0vLI* z1uQ3In9oijnBiIa=XP+*XpHp0Zra(*d+2O~df)fv^XI{7x^`Bp%~lXUDwlbR7`Qfv zc0|6*LsO-*m;EHm-OtRNX->$a`L)DDgwSpGs)c%fOHb}_%8Nz0tfh4yb5YS9kOG9L zKx45_(@O}O7-T{IkKe9Kq-;D`m|ev|xDDFWKsziNW^hKRq_yMNmtU@1DpYE{4%&3^k9OS&11BG;tW! z1cTzV+qe?kw}=$H9pGe5X2J@Tj%_q zOXxZ1wh==5agv{@W7UHPKbv%O-R?tTkjB7sqOV6M8v1ik0Biqof2qy*j7F#M_U)a) zw)@YDc!~W)luTJkObpiE;_4b-PaMDbMf7dFDOW#FRMPyCVL50|e>xm%eke3b3cz&{ z%g=Ue`B_l%wG~Y^bD+!XZR1j%K*OI=9BAc~0VRc|J?4+{I8yij?l+fc7?lJvuE{z1#c8%DJJ1p^P%eP0ATx3U4pEdM|apHF--2w+i%tdTlRnLVWd9tw*lSqaQyi z-sh4<$5UCCmVD`cZK&SaaR1>yVd*Cn z>dpeEg&e@@kHc(o`71`>C11mu2TK&w3#m7Vz`eTG=CHaQ%>b>4#U#xx>8GO3nQgvM zsqgT6r|oQf^Q&kHc8igov{ZM-8=63|d%vj(PeYu8wP4)^?wJpCScp;uZVGfTavbxS ze`IJ9CFO?v^C1kZqfKd5Rn^pAHvlOBPh#VVq||teLIMa66L=44M9JPCUHzM;GW>cp z+5t0gzr>-UC+*v}67^`{U0>GP+(5X0@ab?3=mL>(GF2Du+CBz|H-y;W6mHT)P6x=^ z+c@0RYkih4836~H?b5y(;OE!9854GV>d$OA^!3V}t};r*#D5F6$mSxOGskjjb8x7{8iAE+RW@<&%7U>=?amhtI(4mGVD8Fks0S_Z|nNyUWx0u@My`JeC|-fD8nV^-cT_(h4hM@ z{4F-4rwM|NAmdBaTaya^dvn#W@nul!6N!b1j$FygsoRQcRSRKT<+q1OJ3IDB}PBIvJ>*6Do}IZ4@J1?53i-Rrr@XN-bmelu%}E z`Hr3xc25+XE(S9*5|7=|zsKAKJ*YqIX50=4bC4~sQ-sOl$yEF~6N<8;0%QZNW7ek+ zew{^;RnvM=i-v3oAjH)EUtHH?8D_40g>imA%JwEuHL2#StHsuWj<#MlwL2F(Xvs&#)wE*m9x@Ib`j=^IT{=W9F9=(h28$=va@Hkh8BI;aqUQxde4dYM&@mFp(}1Q%soB67gx0qIdC8hVpS-} z>Yb)LN&O!K4FGN~sV_rrFIZ=~{*1~RL_h4K9{#uJH_T+~WvAT`HuuIOcDJ$3^FHal zjFyj4Z+4R;qBb61TMz*)mh&bcenvEE&HZdnk>sn6rei;vr2U2=g9M2M0$=9c>Lb7& z8k=~BU7k`6zpx6gT|R8%u~YICt{zBGikPZ#3-G!;r-JYolBwLKb#&dyiSAJ7O`J~` zKJAQkJgb>UETv#Ed$HczS5fqKR9TyvGy6--+9dYG9;_gjQ zEJve?N;G|RI-=MDVD)~R2$&b(;JXfd3oUfF?9rRgrlrx8DHv0ry8;JG@wM$LvtO^uB1Se^Wkrh&=rYp;h;iAlTQXFh%Ad)v1kzB|xb3RqQ6lO@|>lzr4 z-?D$oT3(gSm&{9epO9}kLS)-?uabuGppF#S-!&Bli}61GxIN7)A#od)tA+~pi!A>~ z*)EX|yW}$hFafbqMWw}R+)kWI+Y=^etB#TU)t9#>V9OqFCA__Hc-!fT+UgSuG^4`^ zK;_IG>m#;Sw8uR1HZ$oAtMttp)^}Uq|5t_Ycy_cws;4tP@(Lud7}|Qk59tSAXvZSP z_o>OMC{BANR-$sG4wz1PKVb4tqK;dl5qxs38muzMdar87aX?}6`sMZbw(J*Ps>S_IY2^)5fe<{r3 zX~{tpltk755y)ME{Lubo&4S;7jHZUZHOlD5UR1;nUEMC7Qq>c&%lo}Up6o*$Bi<^| zWD|d2iLCJ0i{7bxv)*?i#=g4l^1B1u_Zc7U0=~VjrZgdqM7S!Z@BP|KTz@)Qzw_3X zu@-G+=h?sLgA{-HHlaL;J1YkC=w*dN#Yo5VF2vg3RT%>3Q=)G8fo^+ zKJ^nOOrY2)-J;7qRrN_!C5t_Ke zX#Xu>REP#88$>L7#$)W^FCgE8R1anqwg=m#{c#KVdVv|XQOwVuBV8OeRR)F=BI@)? zlCMI*UUOXY($>~WRjjF`)GDmJ3gp&=hNiX_OPr3!q}#!7z~p^by{WE%$SV9bjrA}@ z3qS_AuF_=JvXlf%bhv=wn>$I3vd8w{(yq%o|!Av2h>-B9}}o5(`wag+v2TXhOh>b_&)pV)y*6+S3G~ zS2JqA*)lq+L)vM#hy=nYH3Y5Ed3rQ)vfb8`d><<2^G1*%T7k#<&N=5OXcLHQJ>5e;@ zx>JDwHtM7cowwKUA)qqM-ZF#ej-W%H<#eRJSq3t|IC}4-8aF)2EVgeTdGbugSGItN z_$?B>Gd}aOhsX%52=9Hc z%&TPRu3K%i{@qT$qw`J(u!0eCX=17D$^|ITs;%!6$_8 zuEikYUg{H(rri-)>V~NXa%-bQ8fodlIu+P(aV;rVe6U!p!a(0mF617|MFW}peajpQ zfcSjeaYaP=M6sW6K7m3rT&gT1-y-`Lq<3IJBnfFImRC--leDLL-mn9# z$Cb4u+F=}=r&UTB`hWGeX z$lThx;Ku=3^gdsuN=$dg>)&yn=$QAer?l(5wFOapwcC-Rb!`z0aqm`uflj6anl3xG zWl18qgMXA6i4pllRCmNtwO0p|kwuEpR^PLwseXwIgR(c#D)V}I z^l}~lW$6D~6%9n*j57(`s&Q=;R+9czEqY;D9yY-ML&4yB?=`0g`Y?=YjPQK-#|_1< zdsnaau}iE>@IrRmPLG&RYHF%6Ue?o$)TGiB(V=&BeINcmym}pRGMu-nd?q*GG zZCnu-{ijdvjSYO0Y=)?GF*d7o z9tS@2K27VDQtBc8AsFXZ+wwCy3S(>})V{z64b&MN_7_pcphzE`_Pis&Yv&09r1^nQ z5seOjg*-U!XOJs420AY#Kou)_E@gGSA~BJMjN{@8P(`;Wz5ez8cy>1qbLLD=>Vfj` zC&Sh^o<{&9&9+8$Ah7BZ{Vzg2fZE11K*_cIktB8rKh{a*wpgwl#O z1{1b2MTz#L`*T=Ml;Gs$sS&CmH(%r*(7XZ~ZBPlJguTxVWkz9};1nh%CO!afykFcl z(9B=~!<0XlOkN;|b^Y3OR`u0>);|U&b zc(w&BM{Y;rlLuh)b;7HYKEVw)1*`5&CtpbcB_v{5 z=Sl>LI|u4KVf!4EP7tB-!A9R@PYR7-E8-#q(RZHA+ZpKpa4KqzNvmW1E%4>m1t;YX zx-~I?^5Evm{Bl4x1iD^dhELb=ukUPr*j6r9=ZNYUg_9Z%vlH5$r?WFF-Yh(sES+K5 zZ(n&M0RaO#3mU@_kaa~hY`@KdV*8=J* z`#uhPX+dcs-rAk0`fg-zXFp7~FT5=2zTnCaA|f+*xK0?*%aISo;}?@g8!K^g|w6}LS-dMm9gpoGH! zv8cF%1Fu7KB|rrKImJQq#9d=ZhlMc6+oj%&&Nb6)glE+ME-71om308ND3Bpub?3^fb}y| zB!vj^g;sk&N;10j?S)kykTx?gJ*2q(gB(@>qKfehJ~yJw2Y17dcLz$8e<+P!nR;)D zxTRPeSv&9V+@QUNIR`><=;9gfh@d0+J*pMl5ZKC0vJnf536$>iqN25JZ`#(^Z4D7M zug(0aBY2jG0K9>jr38>-;Oyd-1{LOGrPt!&f04EvV@wLs!v1`{3<++Kmd6C!VuAIy zm;MpeW68&Odr=G2qR!Ze-xGiV06~8kjfM(3>=0euo{|J>xaFqh>~K~pm%|`X3vwl2 zm;jyMm@d8r=O`u`JOcDwFRh@o0K$2*9ThOp`d3vwf}k7Z+5K*9o*ym#Zmx!3p#6(l ztUwdf9*`}Q_MwU@M?D|6kadbEsF_=wr?bZJA4+Q2%LeN&q{&GFwd+$X079w1b zgj#?(5gy1~E#=~H-4!Gv*jlq^``ZDaLZ6$6vv($@{`}kb2@)UxIGt#1Er^r|0H20v zW7@7uQ#r(9Q>v{7AOh*G?Jjn?ExHmd)*WtcV!$n7;)x&7X_WltzVW5@Jvt!%mU7lC zm#Xata2Dbn@cJrq3Em^8LaVT=2u|R8B~nKlIOjw z%)9nXF$b~70mqHw;o*Ti$#woqe-ovo+n^D|ei0lL+}tCUAEi~0H_4M_2Ud|;&r++i zcUdZhoO+PfV|01d8}Wr0RaJWIk%dqTvGe8tcoZ;Lm)8tV)ZL9$6(f^3snt3dC05gV znGx}*K@09Hx5vUkZvaUYsc!d2>xr$d37PF_=Ws|9&>~(U-%1y|pURU=f>vM6aUa;-}zGCbduxeg9rm=-rlYNa7;~*k=estdi1^SfK={Iol;0!n+#-wTt%GtV26A|NSLRE!b8ZaM`hM`)*Npl zA8Gmev)!*nmtk-DJjyeu*NRfld;HSUGPMH@%_o2W zl;&t*M9JQVG>=j|S_#ZKyr9I~7%$e?^3c_N0D0yC{9uuXI9za4aKaXcxHPtNuZf9C zIGji-=szLU5!9j!Lve;1={S(M;t&tpz8TQ{o87laN&ODQP=PQZ5It-_68s)W-<^Fh z8TrubP`J{g?U>J|jUILh+3fvBqpQ_~TVg2(_`BZeo+|+uK|Av~i%6VzMh4Ro$JbD- z_eZl{o0N@7b&ytqi`W3o%vf-K?H@dalmj$x-ElsuNZYd^m=~jo16B8{gC4P2a2O(# zq&V@)XsU{IoZ|b|P-->p<#GrO2cQ-kIsm(0zcerVS*a(g=tAklTFzhy-^$8I$Uyq$ z8cg|LO2WwBQXNUqLXKllMO`a3A8vu;iwMwc&?PH(wPI~Pat!-3ba+-d&HLhRmK?VsEsKQ#d}IXC=nSM^GiAe0)uie)hx)k5&IFi zm*>IZ&AtAot*st_I$x84=zJZpDUsd{p_PPu9T*Jrd@5g9yUgm2QIZIlCdZs!Z0nWs z-s9NJMEU(sm(UmbKS-0RB@)R>p_2LfJpEJF+8qk@De%_9Re~hQ|I6k-JMN~Bs^R{9I?pYE@-32Z|;tIg5S zCUMX2e@Ap)NNNy+P2*6v`Ye~PS+*IHzaP(UkvZfVK^(zl*zO>o@Q?=5rO?q}>^F4F zm$Cm1B>K{U<^Up51MJqmdw^T8d1?l}z10~2S?|B+CZrCkAwFPtzL9CAH`@>=vc#dU z#j|>@by4%@xwL`lZ>X2rj0FFDfoMUv>{GtQkIN}NYl0W{U@zg};~rj`=8|qARQb{f+nlo#6?n!pu-HfS+`Mo;mjSx9MU5p;12(Px`6j&Q?CCcLw{BE!wM81sb; zt>8?*6=Ji@ix%2x9@)t=%N*PG8s_u0nXSX&kJQ1(lSi7zO|Kbpb7IN_s;g@jmx2QW z8$kwd@HaH5^aYt?Xg;{9;V(m$HYT8fV=f)Ji>QDB%Wu^n>7Q5>UYXev^ zJj&d+qsG?TB31|6$8gn$)(9a3jU?AD2@t!~*Gz+>eSI(bi)@=PsULksWho#lTqHXr z+(IK?T^nH=z5zDZXul6ns}aa6kQ!zD6mCaS3LvlQrRCj1^xal9^;-55Dw?>!GC+&1<6#XO!iW%tet6X7^!{3 zCVCPkF$qnyPr&u41Z4EUy5}Wn90dgiL1vZ99W;=dkb^U>eR^|S?6OZLrJ}M?uev@j zyZ-_7JEuE9Kr z>b^xn(Bzb?uN|;CR7L7DJjm5iK4c+K*k?$ z1byK?a}5E7`LV@3T{(~pKd#%Rb;9NK1H9naAcnfY^0<9XN5+kMpSF12om|lrT=tYF7dUU zAr}NGeWv8mHh5|ZY4O%m*!3XQX$Cl#g7IrW=FvP9R}ZWjjgZ)}iJ}2-#;_GYzma1R zuAXn=?-k%1$3C*>*DkUC1kuRtMu9zSP-Ia*3inF!xUj0YDbD|ar$`b~c?8{-@ZnZXFM5!c zSLwFQ35Ch*>L$}I@kkADjZlj?khg}?_O}tOrhC92nh^DNfh3l*#(@-+eh@mqN;5`& z&+Q1m9nyi;c__sZaQ9@IKjsTuN6@GW<-ni z!C%_3!eN$JUZG35%9=*-;qr7*JbVmjh>G6y*FmZ9zR%GdPzq5|TKLLOAvpbSjRqlr zV60!a|29bporZ{kv2`am+l@9R4q+Fq=AP%mdg=IHPA{|OowF~D`dbu zR$>tZffLFIKo}dJQ*F|h2^;KzV!Gr1^>-N6JquIVoM*quOSvmlklK*& zWXd;d7`E2;cc^UbK}WPPQA-2llgc`(XmdLMqvx&Qh9>`ZBb|;LpctO^)CxU&|K4wF zrUvTpYJ9Ix3{7HDc*j@0HE!G(*;#kJ7Fmz|6x<6CSj7u5pMC_1LW__=4u#5v+j}I< z_d$$uDM;q!$wde@h2Dw7pjzXnFG-%J;8E zLk6yOrr_&KF^@Ni+nqDy}d4 zf9!pQUzFX}_8f#<}l%-)rx^*0rv6tuhXf)WsxlKr{uqC^aBwu-;mmlo;uc ztA_iIz6vphnP0zu6o^4@pvOSaUOL@4<7QBpCEsCo!S6J4l%=3Q@5~R?GZMH|^ZNiu za^vJ8p;JZ+8|%}jA3~ex=(z4T;_B;VsIiZ~=Ib&4`ZfOscw8RFN_-EXAp%5q6i{eM z-JTTX%wYpsV*Tq`pugY`3S^)@g0pqVT0MZWRdD&8&uoe>Oy}em2LQ#`+}r{uV+cV3 zPBfXGIuvT+r2|ksx50}BK5GuhE2l(UlMQ-wnw~z?X=M~g(SaoYSxxnVM~sv;-6)df z<>gyI_t(<81j2;Myd_bLxoW3C*11xaoKNMYf0(V-j>l2dEK8@m!tV<{#A z+fq1f>0Rrj;|QrnDOkeqT6gFJV4vkHBX!Mh`_xwf0in9?<}<)SKKRz`HwL-!BrnnhkRKJO3EnZ@*Z4{b(+glmCUXmmHM*6x5DIcBW6%;WAoB zNVm4OZt-yAoL!I>0ZkrpYisL|%^%X;$N=Af<}bB{_fEh%2Fg(QxzN%E=xo5h(fpD} zk^#S`)H03G!45tI{7r4n+F8Z|r62M7l;0kbA2r@$M8v~X#}LpcQw zkS6NOwRidO)z#;M^44|s#DoF7|2Z~xa8Dgrl zpFrO1t7z}|{5&z}SbqQhecVOz255GCP0v1dC#)CM_~Qhy_@SZK9b?HGbc82N>}mW` zl9PR!66t^pObi$nDA_SGF(96DR@% zqqz$_qcs~FXUGt}gqEUxZDCldA0Bkwot-aW4Fs&~Dd+?G`-?+lc<&iV30642fE#$u zI1W@oR@0YBG=-#Qb_b%>AWfNNeKsjnTdE-LC~D|X`ixGf3_Sr6uKmxG^s4|#LV^N9 z&>Iy_5R4rhbPrLoQsLYc3JQ-Pn>7l5KG@k%TiZpcUmr@9if?(G;WlHz)bEmO+>swB zwb;v);o!>$4|b&>n%Ev|ljvX8hDsGY1W38yCOE7QL{TAsPDMH{yCK9M`0TLqJ%P;! z5IelL_76rj8j`MQ^8bcj;m4{_!w!+v6{+x`*acJ;x0w`pq+t>q- ztNAB?cTj@Ab$XHgsfPG-pjTgHA-Nz9%uc}M^r2rd3{C#$z~3i|`=PXGf6Ag|EXw}! zzdrw;FOqf-u4yCwI-mb|?PC3N-~JlKzh5Ib|3%gQkB`GI%=+gUW&b|%Ki(+S|0}2b zp9hB~P(gZs?#$m`{;xMrF4X-Qng4l=Ph9?g!sdT`{hzl6r~YGH{(Y#X^Z)xVr0idJ zkvT4&IkF)x>fKLC8IHM6rzt#oHcoBmEi57s!r7D*CW!Wo2M=QF?3gLu8Lm}GKlm&l zoCckMrEZ1)jvD@Z8~$xp|EKNgzcc*b>&KsW|6Qv7JvIJ*XAop5MeU6npr+IdXVTu= zQ~YDtPF9!XPD+=Z#C=-nShUn{R?$EH{`>8JhxPBl{P&yxEWB~DdVKZrqL}+>z;v1W(;x~E_ayE7 zB*op6u1qtUn0UiT5tpy!%*}N^nBrvDDGjRP#rja|aTKg4xM%EsP{y2F&FDucS5!{S zjw7z#zxw@0!_`Ft{;XZyx=32oIKB1#B?k>nb-neH*Rx%@XS5Qup@F%-8zg{2A9?95 zw9%SoqgR&?jR(I8+)EOZSYjf58y2PzosDzAv6pdS_=-%~X`HPpZGAg3agd^Z@sBx; z2%-^^OJ2aFYmk~nX5aI1-RzAO+nGD#F6w$VYosJ`MHqv252UysP*XpoF}(-$p&Z9U zj_C5Iq7Y^EuorWAxNX%}sE>X4R9>!up%-(Y)D5QhdG%9O8jbm)bwR>$B_KaMzqY-2 zW%RY4Zpioj?WQ^>f{nRAG0zbMVpimf7#Y3LR}}$l#$RraGlq-ug2~)9Ew~Mz!Y(t< z9Xow9-wx&YpyK5H?}4{&Z(vx8mUuTXXNt=0P+QMX>=24*G0Df@(BgofYTr<8gTTYc zc{T!n`1|orBBjX|ueSZ(y_}VCyo00dq=6zc!bDLwCT?u5M?goa!Ge4LV7dn(NWlU{ zF}}(k4{JI0COGb>7OG_YT1w#-P9iV*(8d+r(bd(xI+p$fA1538?HlWGg&mF1_Hw;{ z)lv1)eZtkP5upi;Vou9LhM36g*7I1xP#?zf2*!(x)~1vZ6jB= z(o=1n&jE>1n7D!*@{x$J0A{NsQ^;^BmBp*E*4MecxW&VR>r&23g|!@Ec3%d`8Z0PC z9?(oh-!h>rqJDZZ;^k~dmI$xq0D~+c0l_Ejv=EKKa}gep^m;_YcXzTr_;Hnv2s8|? zYwD6NA^Tom|Le)))5|9aer?2bpRDlGofd?`=@&;H`!oA4($d7wCV#C?N!`lY-PebX z4bB%RE_1g7j^Fu3ukMPMn2FppCcEYFgHE1%5j=Hn=7Tm#=1bpfmBnJSx^0|6X$%iU5l>yiqq`WsOZS3JZ}k!i3x zWEMw1t?+CmWbNtJ(PIySD+#x*ieA>4;f7p44nwpv`kl~s>0jTO>>ukWlOgn5m>;Pm z{HmNzjNo@axIy49sJ0^~s+=*gF#(J(o;sk@;50P-swXODT4V7g+z0_u(pzttySShA zds&Hi!!R+AL_%r}ffznna(UYY%m7c)RVkf@!5yRs5| zoJ*djjPP8xv{XadUpTmU`|(aG(08CRXnbj~+dm zSeOhHa$31D;@EnT#}{g+K(|9Yc)k~BfnC$?9`1hdZzb+2J3c)m8M=w%GW7KHN^4v7 zbrPY{Umnm?&sDciv#37ZZHl<2^(hS36&DngL5X=x6T<75u!!)JWLMG% zbi*YJjp9g>)4w$<|Jr}lpICjmWqNS_Ab(RAVE<{MG30&1(`(Gf(#Yuppq}#^D;uX{ zkFk5XHFCJ3e0wFL`A&R)T(K4B^C@dc8GMonkVAN{>4w(i^|C;-IknF#_6y6j_OpXj zX!iJar^Jm7`-2kO3y|f@eSUNgap!84zwyW?D!Bv^Ha@Qg$FOnS@+O-gqR2EWuv+7B zu#R#CiQNl*Dk{cmW8`V=3GXx|TIYFIf4q8!@cz;4sdPT*5!l1~Bn1i&jbb?v+ufwe zyITvTTC1Dyj!Q5TGqi;=;rrr!@T_#@!m9;FeF=74^xplXtL&m=)8Gs4eKq`PA)4(ZX!#VF4k|1k z9v$xKj~=WP!B2iI`$R-UB_7*kqm>>3P)P!^^VLQ1Y+z!(A6%XI z_*f4-@idBzUw^C%NFVNl!(0+!7P|cw3QL()vw}2u%h20Mw!W?ZZw4cXrp63_jKZX!2vPionInZ23f;fGSF2v~adQJQF_Qd*v*Wq{w zaC1Q00(3&uD(z1IHI`1;^%eFoPkf0Bpb84S6h_Gsxuqe5H}r23cHVhBlYg-{1J}s{ zVLd5c^YXQVf}#!f$YZ$Fjj(uSxCS&ouWi>9lWzt7M_t)i9}C-kpS`fBW8f?RAYBV3-JYZeIa^V>@7b@@ zGP-YmooB73;XMjrF>Oh+sC3=(g-Uls<8JkAUFm0|?d2WMiDM}u8m|#j-m5P}+$JU_ zE>}3MbzS?WgE^C>Rr%GLz6(ryX{eCXx*D-D+eZtNi0eW{1PnvXV(Hk8gBDaXjTrC{ zt+I#hR&pmBY=9hlfV4^O+AJ$6`FXs`bpJfGXtsZClmJC|cc9okK0dyqQj@P`-xE1( zt>mJvsYy~ZKChD&nXRS%Y)rYk|K?xI4(`>W)P3pAX~y`mlWix~U>HB?Kl7!y!js$f z64(3+8%#5Mq-Q@)ylXzTc;EJ8|C4Mg&!atu<^9xDL)#>;tvTzS{kP6m2L+9nOy0v> zBbHU_I)U&ObeKmVz;^vW_9CWzzPGiNOY5y{Eo8O4ji{{b7Y6ai-1pfWmqvrrh+PfR z7j&L7fa**rv^IaXuw?=MoA-0I*S%(*wJ#qA`fktnXN1l?ilZ{t#97`^T_}#)VJ~|M z$>w)K{{Fptey85DX%@U~42nwmU(7Q79?F{gIh# zL8)sdlWpEy>@p_>;;B`d^KElNLc$4$XP?Y3y|E~@-Lc%#LR8OKXj-qWr(B7Mg1dDT zCoL>F@Z-k`vaPVV%MW8-F7!qmhx%#8@rh&!(`>%gBadK1qLDHW8g^~ux4w$1LnPii zh002eVs^D#zh3FpJ>I^53;oiMgo2h<`@?i#bDMTK0s%hI>|k<0mrEuqo8N~P?>N4- zMfF!jfvWQb#-m!!9&m@X*zV*kVbJYVNREWw{-!QUh>9@U5{0I{PobYMqQr42_B5k8 zl>V6Zew{AYqO!75Q~%jBFM+^AAfz7LRnlM{HZ)PmG*zB(GcYv7*$lt+s`qNCy^8Xc zhpyZ6ez0*6caxlBt6lLrc=EyF0W#z}u-?Brks$jeW3K2*JVS-h*4nqm^62e-+~#aV ztxX7?KzQ{2oF6Ner$>afOzxAPv*2g`=S*puR&14UrlniU`?+A}X#X-;i7S6K>Y=XD z-CfDTe01?)gFGERLQ7lgacAYHVKiIp6w@g;VBxkH1E7y0{Jb^2u%X;S^ zN<#GRLge@CyFTvd&5We|K^`x!%aZ&nMz+mTncU3G#PW%vZ00tB%DU+c<6zqpo6u_Z zsSu*TvR9gEM_s!$miGsTS>La{hz#c~{`19_!_|oi<+sdd)1XJ?F@$U)|C0ePh&8_S zxgK8J(d*nMv7X-{IzCz&*l}In22K>30g&o?>|SeWnF@$(To_7eu65Mb(n25{9UY@@ z>m8H3B=ClCdwIg7LtjhK3r~z){bf@G3%WcjUf*i{yHu@P_;oqTK90k*bp6i-7ciUs zwF@+Ocxv0Iy?faUP?Q^cgA&0oZfF^B5dsl@AptY<5rbC9zFLDZA-;yXaL98gZD*1p z_-%e22Toh>kiTGqTa~B>m0_JFDwWhz7fX|+T^3{%>SMD4{8TvG`vm0vYOE@y7ITwt z{}Fh9DFA)ihuM}Reseh07?*_mgrw(maC(F-yZH}wjPBmH95@-lqC%O9*_V@$yM&K; z_2U_9Ocer>zqLj>bcs8AfgE@Uz!ge0A6bxFI6gOaL`kIeS8G4SHBMr=7}U*j#c^`5|Vwm z9Y$u{M=|%MayT?Fsu~IpL6s(2)XtyxO)962jSauc-q|wy`BUJ%JG;1Ep0#;f>tc6| zx4Ww=XQkTnw)qGCan&=-%HLjXR%L}Ze_a6Qw=F^Nqg|TZK*273OEgc08h(5Jm=Q@f z3^GsAXohO`N4H{21VT(q%=`c&?}wQ_uAY{bc9mhAiHnQ-?H|qxZs)bCvU*$+pQL2H zrHnPZ$WqMv`p2`4#l-!$rFO-P{5ufKCi?jT79n)%)TxeqiBNa1>cMyJn?|&bQJiO(wXKy}MdVh`hsP5q6PEB*SO!R2Z+BPL? z@VAl@{umQ(ZbM2HLv&Wc7v+2==!n;u?B;Z^)~`#9Ug*DGoZlRxJ?~_A^OT~Z;y1OT zQ`&+KkuGC!hQTyE_a?=IJF2Y2PSFXT&9%wZU?cfQ)cCHbHBNvq@?0c>F}XSmn`~@h z#V*$t&2JcgtI}gzu7ahWBKF}G3Qw&ZwP-RTQmU6PFhhk-zT3M1#b%lW|7#Y3o78j`{t zF-|tVSO_)Kmw%>%r@G_Wd9Tz3=k&(%m?98z@q#z0$5W+1J9VJQfF=GCEd?+$%=!=4 zpeZ`8KmttrUI%aheV{YZ8{PiwZVmNy*Q0~d)iUwTdE>4UK-J1XU0bIzl7?~kgU+El zIzu;`4lxc`gXE*|=iX!`7rYH0#Stalyi(bgp(+-_Fu|Ltf$MdRfHI6%S0zGDCM^wB zk|&91?*B(a=mP*2gc$Ez zLX~*z7Y!FB`b8euDc|KW8J2WT0O7E!5}}b#O`fZ(sr{5~xX$?gvDCV1Ry>>Q=HhGV zWh%XArf+t3_#cRi|8l*9cW?CvQY33V=XBycTU_37e_bA=bj+KM&150c4sDad3YDY90eLBH5H{} z#}F^+2=$gY#LP0?W9|1^F5uYd(@hcg+Y?1{ts9?#U}tm7)r15abe6UTTl?p=-+hh1 z@*47}n%~98v%2GYD?~I$C2K}yA-rEtHcVz$Ved(Ej@+gfa6Nlf!kysG`uI9%^W`oV zkL7^jLqy58;hL@0Ol$ic>@I>uwH`K==QC^T8!v$rg%~ui?msx}gbsvinwoXs+k^Yp z$f{bZaP9H{aEY}l--O<+LVEc12ZUUDw@be=TuB2P8Ls%tVQgNS`zdO*K*X{3C3w5QVQ4Y z=Xx#x(}y1vky2&j-bA?^c_kxvDDBXa;&R5QR5pkPaKK`r3f(`wGmG?D9SW~ZEG?Wg zVs*UpeoOrJqj!C!_BGFLo5c&=+w?V2T)ndR@Liw!X_0crh7Bo2-?=JYtJ*~T{rBvc zTeB1wZ(9X5PBMM43y`z6u@%>Fy|_F={+&MVsJ;qSOpGbx7to)XGC_E6((sJ~^jmAx z>*2oE8l-MKQgID{9|YnB`SN5G=|b+>iWtuh5M^F{VZB+zFae-a(}^gDx#0^7Ub|F? z-(_uT%&6;#;SyI;IXO94bcpvhR#defvQa`U@(MD6MOMsf?NXXtl0xZl?d}+EZGk8T zwq?U~Vo60N2r3{cQ1_D}sitO>4jiqzK|rqC9qjEpGK@G7)qoe+fT?FjHoy)ehTS7M z$Ev}&tqv$BlU%HCnZtZ-VkR*l9F8#{?f}eU1Gb*9CAtIO$eW`OY@^pO&Z1Jo;NiUwv&feW;abN2H z@IvdYHGcXuRPZYkbkCd@_{Dv>u7H^{ms73incw_{-sctuetnr5MBU|%%>=1X<648= zbC}?p8!P6R;b^HcN|$7;ostUon`6@~eg@#n)J!0#7XIX@`o2sn^d!yEB4YZ$eG0w0 zwSJ7DF-PPezkTZ1A|3+|8Sst)NpG2q67P?@pT* zb=zIPCLT%~7~T+qkGRNZdP-AMvjVDC4N9>r@d*ij{Vt(tVN>8HAS>;JbcT_3gs?hZ zQ~UH1v%XO)pK%mGwlt)_xU+W8(9U8g*DT6Xk_9kY@w^M(u7hQT)4ZF8*#f4Wi)HjfQnfKcvDEHWKBf<^k6wL8{Ad$y{2mAzr2ils>xvkVXiK|3^^C< z8_HJ3;gTo%h&woW!kNa$8XxbSxLh|Ak)isg(%g^7Vf`%l!0fUdY6X%8)mG(27M+TT7cV!~BR| zDZ6+$zr)1&)K+oXOvNxa8J$ZA3F!e+NgS=eRoIP7D%tIP;w0Wa&t zyQ|_S`?uol`XH87Dv}Q7ci1}%6Ake7U>y3g9*@J~ygQJ}f zGjp?5Hw3+-3DbdQld68+LUW5%0`vXZ0{rb^u3HN2q zzjZC`>sE#2I- zPAGxd%}025pg*1$w&h>etvaDftttxzxWB22jA`Fr`YtUkJt?&{KvYk&tOH&wdYlMa zQe7E0oUl36Rc^ zWMp=BcR%VRl&yk@b#`c|Y~*9a7u8}qvPD#=oOan1jVv>* z&xVi4+G{q#->O;;g)O~$w2dx;S>=1TQ9D91j|LPFNHEi_TbZ(u*_B}|83RWXiA2_J zw2i#s-opWWJ8P4(qnR{_54vN>T>>K23>9T(56l)@VUx}NGHnV(fTsNvI;f$c#uI)s z4Vm{&OcX-o)5S0$AuZZWapnw51ur+ZYR0M9zK(Ws=w|oW?FiCkpS;G9(&*BEc{HDG zuQ6S#nZM7gcP8Ci&%(~$`tb#G*kyx(TmGywtgAPjk(XU%S{Sz2oo78!{GJ=p9d_<5 zvz;2`lmy;OLQce07D=O(;Bg{7821&S*2i(B*RxM^Go*ER;k`PMcG~;7q2%%*j3)^3 zY!To4hh3$-fppxK`Cy2v!~C(g-`zH7xlTvDx#emP*{U49B|(5#5Y?S$8aSsg6VehE zJ)fniSbjkWlEbD-=FNCnHZ5^vRghUa85IK+PQxR^;Ai_2bu%@)_hl*5Ai~C{;t>;< zAbuGrnd5L5vLhR2R`ND72)$xp4lCHFJe*z8@R>4JAl=oE{B!j1rQWW>^(YzovzZ`8 zMWLN-Fb)P|Xbci|o;?jk2{*K}J|@uxyQWcWo?;I;n^Str#fxWX0%5QJ z^|Lb>fdKM7?BpS%0I+vl$M^GS0?$zf;L)6R@f%w0uzH+6L&I{MXRp_a0R(>EH#K>* zj_FzsnjIbOxb~i2Ol(C25#QXbOD^WD(UD3{#JI7}&P5nM+f}%(GVh#sOO^JH$9m6A{)i~@Q&o<0d0pN%4xc}#LiIkGe4?-) zc5`8%NM8uZ?oU2DFn4Dd$pZ&Rb50nShk4u4aW7Ns8V{8icAYztLz@8cMWvAW678i` zW`(ViCse}pXJ~v3SX91Lf@JT?IHc~KU7bHE282ZG36m5R72T`ffEH4dt#N!O4tP&Q zakIYX!u9<$dpI~Fqj6Wzit~>K*B^jywyFlAY9U^WyW#%9cnI)GcAoE?F8$E=(s(SD z?dZrNxkJYmQuwFN^Qxt`>c%m@&-PAsBdhMz3ENpR_%36=*h@M=!NF6O0O6G0uV@>D zx3Za67|D93Ryrj@>TS-I8hP8X?Tx3ux!8?eu1ac|u{@n=s#c}j3w@2Pp9j+wC2pGy zDMj~n_xm&lOcb`ZwoV`OOZ4*}-wviJRQmODZDZqmRooH9u`M9M_~ZEyTw&r>nX~;9 z0OI( z#_yFD4UUMg>ak0z*^Ne&NY6t8C>(&UIUPAK=#NJ79_EpyPahm+Q=_a%&Mt3L1^$@r zO%Aw~$$aZ@vDD6)cJm^DdeDdO!M5edYJY0g^bB`o)0GV7RWS)$+q|y!)|SA;3recr z4mPyovDu#>HT<34>nPox4wqHkf4juP&wrkpLt8-*o8R&FN)*e10YA)c1cHu^?x9Xn z+3j~HO25SNntbKb#MIOU5YsZALZCTx-p6dMuD%7&-GS^R2?@*Nx3>`BO_Jmrw)jF) z7XZ?rb%hrrLT}Q!n))J9T^O;9O1+mX+5FDby(T{FW|4Ttml`uaa> ze3N3E6n9=`=o`i?Ku%WrtWMmy$s6gg{%zQFxW3JiFd&b3AqvUR#_fE_rhhPvVCGuU zM%tz*9VaR;FV#a;VQcHf!%Q|HK|YIZL=>0Zo8fy`^={(<>aI(bX(4f5B zaixAEy&Km~CfiDvUq}cK0q~slqVohx`aj_NS4SCuWgQK!5(*YX6et63uQxTzk-O6I z;$C(>0G0!}bGjcr`mps58#|w~o1Q<4{q@u;^r{U)p z#qNI3P(7g&6_IjnzDGs0p!~Kxx%@=oM1YQ6N)0d=faQe%@MU8qDvl_>B#--C8UPQ^ z0H)CxYn#hAdY-zpw78zI-BdVyXOwuFrMj~Q?@I3ZtgJBE7}dk+{F7+Nd4@8Nj#@i9 z`e$UYaCLF}vVL{x*Sp@)RTy6@IFWB6StndA~b_gYMmewLSem)&6# z*0i2+GyBR_2zCs>**+V5k@xJV81M#iHwCZ%6_mg$GYh0(bJn6ZXZuQ75Dd_WS2u(v zc&Xfp$~9rrw7+KAtGH(BzW8vQlV!4I)u^PbtWxf0!vQtT$&M_KFIu^f=n-ThNN{rk zKTP7{SY%B4g~%3Nh*Z615h0hvQmv668txhoRFfB)_V_}qas|U^vM~HHd38_k@!R@l zDYz%}eD8|*ay-yvz#@p)rP-aPu0>xJ4|%_T08a$I#2t z(cUi4#J$Sng>{eGjM{4f(n`!U1Qn;xpI7@}OU(z~A}+xe?YT2cam;d5X@NtKNn9;U zmwxx#%=U`dX`TKob(zfdo^Lw$=g@psBa}M*>Dn}q+cwQCW&{BTn(sb7LOC@#X$^iH7x~BNUr|^_M~HpY<&dH=1DK#*HqpBk zRdm+X1Msh0t9{GpxEOrIGQsHms8NyA)by&KZOQ0voxW)`>07m)HBHrKq-Xg8UugT& z*W%{|3j-ws*nFpcJ&j%$dT%iqnIRf+a$3qNEz8Ors5H}e>i@bxOz`2; z`RG?SKHZi)xpP#rSIv*ledFay{Iz~2`#w%IxR^$tmn&enS>VO`0=$jxmJ)h;b+sBep`-f=`Z^w;j4kr$0=oE9eY zX;L>yp_0iYrx$h4(l=_0kKr42&p#ch?NQh(?I*A6=Ao0|YqX+Si8f8C{b^OPYiQUO zFECcfA&asow=g{@&e-xLI+Hiur>VS$SsuqHZ_;h&zbch?=!imBkg(s_blpexaRkuW zN`^g8aOjh&BOv86TpTEE>(}p9CK-uCr((VFE^s@VU*t7@%k(Jrc{5wlPyJ9aope{~ zB7yP@l}rr_3YEN7ZHHE#()GONaK@2xhvv(KwDAj86?zn^%9k8RT%u~%2W<4I=Yvnm zi*72l387cgHH$67rUF0S$JEDJu@_+Q5xB=$AD?ZZTl>qUs(OdbdUahUDG}ZK2Z78E z2ZQLOI8ObB_d{C)9^@%{J_LT7my_J%xsTkXQ)b*es^d!ck!~zJj+R--jdlB&^1{ZFZXk2tic*xEB2d>+_JGSQRm zPnt3Q3QJ2!@BCPFXVs@-JqfF1>JE;ToZy6S?OuUN_j;15ZUUM!yYfimGGm2CXktE= z9=T_lh&O2^9`rLx*E7a(X(+|0Ju!yY!tvHdVLw()H(+|uB`txtSzZLQ;eMi<-gDz! zykpbNbd5q&0E6B+^yvt3AU72Buz?(v@8N4C!SEF_3|rwt=>ii|;Y|q{@KJ%oo^EDg zG@OHNx0q#<)b;pi#$A+ddsB7sXe=7r86V4Q5xaui&r;C$%HXuK*RbsT^y8iYn*Ikq zxoC7|@h}&SMah$}sRBj0#*I0#8G634idQWAlj+*!j-ERc0n))E&oHg|BSollee|9? z@BCb^)=o8s=kKa$rfzxBKjA^6`F|S&BBHy%BwS%ZhCTNInaJvRX%KtHcCTtA5fPu+ zP(jaL2+C4-Zg;*X9TRuIw#xmH*|#FsJ~fL?XK0C6)iOzjvLOO{au`~80<=15r6^P}# zKi&^uoDT3-T@YZob1)eyHq(lCNNs9?QK<4f9Cm0(P(P{?GY+QVV=rGSl^Dg2`#jVd zq;D@@LB`$nAu#CpaQ6b6yK;v?gtD!CQu+GE8Tl#i!z~%iOetSh`bWxmDBNL5<){NPt5%_@ZQVmIO&9ckNR!@HJ)UTiFYUa>< z716fdn3i-7DNkz0P4dSKNIH+)R^sSJR3C+1vRfyL5%qBOYuIp`-27J7cd>M0#tXNM za68QR1krIbwIf&Ei$)w8;*W}}j@p!A!s@bZ$kmFtZQMAX(L}RWgB5!7;WdH-MN8WeZ9lv%k&0O zv`$UzRVU9z8np~?mhN=Puv}`u`peM@r6@MY?ZPk^4dm$Ut|pUnoA%5e@EyztfpQDvVXH)b|N5c`YaW$fUctDLJK3WWLK?;I}YhJD4<}KeGh;A z`aOersrr!oXJnk!lesk?F=sK4JCJEaRt9#qy{k3z=5fN|Vr)H7jgyqH-Ry7OCY;5YRlYBjx=$byIP@Q-a=L zw&UXkF+KOMsu_tz7N}I2DE4&ae8Y)oscO2d1QamlW0jReVn`0#~o zEd%Ol2Or4s8|svmco{ZQ>S zUB;GVsIr^V*GRoOeh574;OmNaNxMdYW*R&AvqF+ZICw2bf4r+s+@<2DaDA zy4#{TuO1Sfx^Y~`Yinu3~1?Qcwt6 zDjq4yIa<9MI+d2>8N1?==suqwkKMLYEO%VO83D??(!sK7GDJb2Oyt+9mSbbepko~P zJK$imp7EtyUweDWy5sJkO-RnB@9Q&Y*U@a`9&?;kp+VarN?_16BNGbd!(jI_gyD}~ z;1oMpy-#rXW_&Aqvs+$lx;-s1EH10+GLKoGEXJ_4*|%|jYeBW(^2BqM$Ik5@TWwiF zEAdxD`MG4+ITy@IbShodGx}pO!dtN3wplohzC&47iHIHTObR!g3j{KCMt3&QC#|r@9qPDc zDoO6Z;@*5c$x~y(Cdqxz1c^P`ziq-Lbb4&1aO_+kwlcGLxy%ICRK3HR0J;NZ%)x3M zxy#I;QT~V*euL0TiDJy#Rov#f^F(4M(QT#GvV18P;PDij$@&X?mRiX3dk^VcHadqr zRw`qJU2HGjHh#=+c~G(z69u1`ew7?5z0%Cl?1-|A;!)8R0V1$W9kz{Auh#bzt>A4R zu^oo&Ee{^tJ`c;tMurYLdo!C_w}na5Jn?XA^ty=ah9vGv)8rEFsqSD;a2vJBCY7(W ziENKV@wjEi6!tAf;Fj8a!`7}Gy*iv9e1=K(C#-+mQNsLcN&qkDtB zV&|7Iww7eBuTZnhUj168W}#f2KWTT)U7v&Z&kuHNE(qEi6Og&Hgo++Hk9wk)9%^&_ zS=GVWtNdZgn*-!NT9m<#dD!v;Aqgu;%QFD?S9I8opG2nJr?qN>=jxQ&FW%4IY;4 z3R@K&mucH=`9!X3)Y|SgS=|rM|8+F)hmw-#KTx(E?F+ap1^4G0X6u+#Y3<*(?70EH zh+G7-GMD3Ui967kciS_vQ`<+J45og*3oHXRr;Z5e)Ou3> z`Xl0w-&fZ8V}JjO@ID~}-Ov7hya@t8>+i?e3zzl&{snP^>t5}@e|!Ag*Z0re!~NTb zpC^g_zF5SacNCNae}B~b%2mM5{(d|Z|6h2(e6`m4O)rfeu*b*l8f+u%W2E%&=+oph zVdxL4R5HakZ(EF9k%$NvRm`QJYs z{x@D>df68UTR!j~?v|XPb|Cs~ud4wLe|9be;)bo@|LGO*|DRi~OzrUZ#&zImp;6ej zw~!T8*f$$NrK-j$Q>1xibH1w8TWj=6hD|&E+*Q z&mpCu{Yr{VnZsPzwIMdBVd!`lFdb69f1ty0QwrxcxAKkNMp;xoD$DA+#um#bzob#f zZPWGH{jjzF!p@ea%W7u;rUlbJ4W9c~Yb4a1O?}r7ZLeRjiiX6>^V;vPFRb=eYq@oA zy3FjNnU!&X$9jEpcIy58Y0O@n)$@^7-n~qYGl-`z&iuXI?s%C`Q>iv7M`=YSW^CPX z^78pX^SS01X_x2Vbl!ej`OKueSmRxZOR@d?RRZlUR+SUA2k&%pA^bLHd(k{0w-Ux``iEe!r#L^J-1}{4qVk=}7=E7u++pXJZIg%J@jnSv?+5 zNfr+_&zle*d|nr9I~Ng!?#XZal9M$VBFscP#E~@Dorazb55X#DlOo2qnf`VMRR2r<=+55u;)ZgupSU51-aePSdN^I&I)qABJ`&DosFoKkt*1@ONrq`T zb(3D$7%eAR1=N9+|6Z+^HPnf_zAsaecAhV+Q# zvr3GGSO_4a3!?7Md*tWe64JTe!XIMF3+b_c+nj$vZjRpTfD`=FpQ{tP)0NuBxh`39eYUid2IJ+^o zY@UgS9PqB3y7)dV$%Plt5%Y8j-c00>smu82{<#4&*)SPb-B=md?Zj+-wlcwc3mm(Eb<3nha+{&x{ z^k1{?zzefWtveMdWYw;{J({3b*NjA0wVuB)9);E!I6#4xwm*JEojX>W+z`~rd7U7DB5C2G1yk#XD?X z)Gc(|W^4qFO%*`~;nmh76R^=^88&g5MQurPq5?ROvvi+^$Mij*bSe4`A%j+99++P; z9Mitxa!s$SBv^AUBAW82C}m~_^h4UVApHBP-0az$0pl>=ml>zRrfJx_oMBkyvEBL} z@Q+2i_USy9te*k&9y=Lrny@I;CI?4aRk=IDkh>qOH3+OnCu5e~Ru223ls97e%o6dp z#>7;$?OH#vpZL9Njbr`ZjRm)SY`7F7w7eXCf!nafVfd=NaAbDXt{~QReX!O|LxR@z zLEFLp;B<)C%;z&)<~yn}w@nn%m+W{Ob}I|aQ0xoeN*(nMbM!-6lI2Bp42MI-j-t&h zD@1WK12^W3gZ6d7`GCZ7Lx`)O&o|~A&e&M8Hfg&z=*3pJlA@~9c1SK3t?f8)vzen` z6gSyL4;S;f&?wV&nM)OY;SIEN1N8m;ta{VODR$Cmjlvw~K2xbj) zO6}tPDph}rH^DfUJO4H1SS?)5&+%(=Z$acpI|Ri#6JYcjdW z`z6OA&bk2d>>dFo+32_X^wIm;u6{OD_SoY`PUgA0Go_1RGPpom0Ttjb%$Ve{t~46)oov2%UjHAW|A`P`xcW~JjASNnftJ4$T6;Ba|=b4xR9Qf)b@%Z-^%?9 zSX1hw*v}1LGg1LJk_wxS)MO_gcGE3F*#w;O#2yBn=e)u}gWs*|6{{8hC%ucs_o85u-_K4z19My|WhNDnv z)D^v?ppUbmu&JfHEANR;UvI>49I=!y<|u}JhV7==*VnA~YeZnXNY$;aC~e@k92xui zV#muImSUgxkyosEt=>)dNDy+6hO}5XLduH5g93Sn;JdA^AcF z;AhN>I>G?MDlCXqsq&|}IxH|rA!!Bjh6RwYIL74K2~K|(OVLI-#&8)(ha7ejVZIR} z#zQ|W%0D>xXur_MCbiy&vWnP!;ncgFUw*1x{`y2PAL{m!>g?OhViYf|&xUl)t2OR> zE`t)!mHNt8Dx(q{N3LmFRcS9Hw-as4Mdjjn*;KV04B7;?hii)fg#0N8DF{Q>$Cq4n zZB1bLR>M7q3QY1l+EB3H94uuUQF+eM3p-o)jaeseAP?3{34Ft!e=ojji=r(yTH5Sy zrjVeIfGjn3M#B?U7cI|es?sBW8e)`+hRwr%q|2<>)2&Awgv(W4fZC&Yvn0>N_Hts4A=q*5Bj{k;}*NW)8Fe6cbA*amhEFZtH|w$EEMp z2YDNTy_~CIj8QrcE-~zN2!z)Ikh$NG3Gu86 z@tPP;{rZitZinK*RL5OUXC3{3h2oS}A5J;32c0@)%AOQji zA?y8K^uC|xocEvioaelMyyNLPw5Qc#NUq;^eAacN=d)k)ERvU+#yc;9hud5;dS!mL zZbp6g!rY%0j0FT|K8{tU*Y6Fu$1s)scB4CVqQ~9~T4c;}b*~flM!WMJr6}>j79}G+ z^9!{B!wR9V?#I>r@Xu-ZNLsW|l~19rMy~u&a)mRZp!Xf?&dPzcF_2_sh%IvmIyH^N z?jx`p!@W9l%{|_16z@B`0U)U7L!sP((hBh}vZ~BKD2(?W*XR_n^evFWsW;ZkdGb1REEAzJ2Yh4y>;nRt zoCB+Ebyy*!l4qTNqbdk!*Zo5_`QsEWmGKVf**Pw0y|WrBO^LaI zRD6FB5i0oJz-Q-CQz>cav_QD$0jrFM3AeYj?n^LEqj1Ru7w0Q}psAD2hK+a^lr;7_ zc@G!CH8aJ;O7|AeDdH&}&^`qKP_YN~PYxwlP9I43jDy$6EOYI8W}XCS?6?SCi6M7e zn-;?)Jytp5O4;Kj!q8QBoxzYU6%u~;UJ@63JpBSm_pXw4SF#B$gg)fK5?aVmt#!PhXx31a9RCo5zOhjd6U1x!w<}~z^`W7 z)0hn@f@Qc6UM>qgf1bEGg6*mc8uP0dS#<;% zKvnZ5#m*XkN_VNvLC{pu!&!vvS{B~W+GzP=7JhPi6MFzy!QlQp;sJ9GncJig-n?L* zcvolWC=^;tJ2&qvC8EdjUq=o+I zBW{F+jL?DI`W)+nyZFmaxVy6rl6dn(5CFIo*~|wR&Lvhyl_sm`OEnI90O(6)(!N~h z@CaJZx?V@$xe`)XzZnC(C5;uJj!5^+tnNKr!Yr{Zp5Ms-a_gS)J2uv;p|gWGM_O|d zjQNJP;=%Uazq^&R{T5e|xWQ{WFQv^iu)gr?bs08bBe8*J`bhP7qGNbwXz);Fi|5_y z-ZuGD)Q9X0U?5vPh%RYrI;@6nKFsE*n@?B2+0!4GjU&lU$aw-G#mgv$Zi6`XDp`{# zANck>KJX$(kWi#(*uLYNSjDV3b+QVRb?sD4IT<)}GUt=dI%yibUcMUqd=g7#T?iDn*(9~*OYFGiH*=IDm zP#mX$XV%MCH}d;P6-MJ@-$yLu5qG&BqaO8gAiE7m!W(Sb#Kv6v9_+E!Aoa5W)p&*AAPxo4d_R48pGej?=@tQ_h|b)EH10loGBw&rQ%ARsx6@8 zBIa;>YF|S8!okdk1nQzi-pm(khk9iOW2M?qu7_J)8oJ6e-Q|CRca?i{JK+Dj$)jz) z7hw1+AxD;@uizHE*2i=)kME3??w9YV?(aQUE7pot4*5Mz+du8pcD)}P?VODRw@hX4 z>PYt*Th=|&KnxjqEx#k)u|fJ#pId@WRM~F4dL|1uD%>DG{MkCZDXfs|hAH8+$FT~U zjAPg@S@=RAnWwueZ3_JbL*XoC9hHXWO{zOmsM6K+h&vgjxjsFp!ou%xhp4v<7?C`d zrrt*c&PVOmn=d^*U|wmJX@GcLZ#c<`S72I&U;7X(Zf!|DJ{=3mY-@Y&->M}J8^i2> z;aaL6`r;NVQZ%<^x2B41v0caEOhd0!V0#lwpfhl&qAb7axfX=+3{PNN2eTkZAb76k{NED!)qPPr$v8sj){Q7*fO9r(@mWTI=Y~M5Q;RC)U zO_8YUBFKX=7oN*B@b$_A90d_WXgp}b|X%s>DuK8@vRN4yOAd#2gR$tq{;#$#fiJMysorAJSP0` zGNF_3lk9AUUeM#-VCiZ3Nof@4oMy2vSDWc3N=tN-H3s{;)9E=cbTr)NYVkLG!4`}ZES!@5{vdD zGVd`Zl&S6-9Kp3DF{C0!Xc;6fu}4M9Kf169W#P}C-$2}Cilb+02!vVmG67j2&rLc9 zPmRVBqlW+U@Z@b}4t^J_bnWV8Nxri*70PwPM%ALen+YZvM7Icig2`yELeTtW^x{&F z0l({>70pjI68GisqW5s0zRw}CZ-^#u7;@nNV`O38rWp;Hh?Q(m zW=l&Ui|8g3oOBouISn&qE zo36t(O9+`6&_nxKbHy@-9V zX(Q`u*ExOJADb;U6z@GU@}0cfRs7@ilb2(a(%{5s=!V#>73v98sHcv(2e${cOvVtB z@n3Wl4O7@@s^u0l|M1f;*a_Qy_+Fa8_+A)W<1EB35_rUg;f-@Oo#sxgSEgk>KSzwUN|(&ro(%0gr1UP zW{S!FH3J6biv>2)L_Eg9|c*DtKz0PPqM%AKb*fZT|{=?194U?vS*cy~4LVw)V zE7!Elf1)}mkF1l zwk*R`GNG}P4p(Y9=R$Nsgpehp|8+3?;-q^Bd`#nax;#V0tlwYW?F8{7QYNMtGV|nJ zFK*n3SXhGo#DgKj7Ujo@xi}G@%r7b?os8X92oM9TP39xROO0EUO&Xe=)^?lgGFMod zLjnLgMKvI?K{hHUq+zTvuWW7o@^;#_Zy*@z?k%CX{iA}Md@kLsi;v!;>-V51l7E&q zsTTZvMC3^|7SMMx-7={e5d$vlsEHogm7eOTiCjQ{Zvz~?tHT+I6%bBL<|ylqw|Zr% z-yzQ;+!61dGXFw?oU)GL*AXASmm~JemI>?6;6%%+q;gwIjXvkrn0yZ{ zwHSuF@e(b@k0skB!N0q$FgH^pMk1F#O}x9gosP9O&4h=+Hv0MJy+}$*^AazYW4CTR z*lGx))}ew-1LpMs23j{j1^7LMQyGcNr>y zd~UX@pwAcyQWA4vcGAB@U8H!qg|zOEVfI5-C!Bl_N59I~n`VfDrjo0=Q%IKdlc8sg zFH=2=TMaVQ3@oEVo9SwQ7``2bz&pnu2+wYiy^u3cge8Xkfcl`(GUUWlctGHgMyNL} zb!vvE;g65!WZ>xfG0QKv8y_ikuBEpUq*x@d(Hu_35XP2WB9?n%mi=o-Cc_Jb36DZ& z?DBd|rR#?mqQ^(gc1ZgYRm#Qep3@E;;$ryDVJ!bzBhiu;nmOeMA{dkp&CQFw&i=_e z4MJ9Wu){d6v5>7++s<1x44Ha|s!mKfPqCKu_@dkt89lorvocTqkQX=jR5v{LIHdk* zUacAQbLJQ!`LfQy)tu(l^DPQ%?-}S-Tj`)l`G$p0zhX!HG?t)W(`+FBAi$Mkx2n80 z7R|T3EAj3!ie#)uD0Skv=zLDqU{jPw+k?}B?vb`Wzp-y8953{)0 z+tHaXxzG>LljVk6^3HyhE%`}H1n%Lg59c;iPM z4lA?|w8NoAlq{cN$`qm<-84JW!V_w=3hGu>bSGcp?pkJ6)UFh6J)47&Lu@9mi(x{m zW@79)mDn^8L&oc^K0Qes)s9+jyC2KgbOIB(upf={iC5mXoC@yk_hKxADldz|b=w%Y z4d8@;y6HFM_)O^ER@wWen(WH8N$s7M8t)<#Vd-z8P1w5~V@j-zmqYTcGKcT3HVQ^m zb2O1>KE8Ryk1`X#dr{7(-X;rZyZg?8D`p7CP1W-91Z;+JDj^vsy9@&~ z=ugvwm&{45LBqv+FT3)1hpE$IId1q*^`)KrQI!R*0dq~`cSN`CXS>})M;#FDxAo}( z4_`ZLpR3ijw`9pY^`yZcTl+5!FB7_ipRL<?Ww4Kd%xHc)32Y6+1?dGU(~X8GyF8-PVf12r+euMNvn#T|iR zM5T3XXS5nlI6)MS#wuR`QRDG|Aw9H@gLZY-?;QlV*!aP=Gj@~O0gXMqc_sw}Z&2y3 zsdqEj|5eyJU`i~K!BwOJTH!MQhHM%nfLa}}lCO5+v((NGN0p>OElcT_0%F6CAxKm; z#50)wt2eg>ORAZ9b{%PG(NS+)`RG@%@W#U+K>#xAFwx%+UW^-|Y2&0P$}R1~23A z$9?*ay4Hu7izZSmK>>zd??p#HKF)@wPC0uy0t8}oo<=)mMgnY+CrHS73W%uLnKD@8 zZNqt}ZI_Kxq>4uVh6r#Iz5`ufGz$k>7osH20`Gy~G}~(m|CDKJPQY+|#L|ddr}u=T zbzCNJGc_!K_LghDAATq+`K?7UBIL0*6JhwWX+v&7=m?&fsXsd9P7((L*K3hHOKNe8 zn8~aq^pF9TP1Ca0Z#)`E)pgUDHRS)9a{+YXu%GOs%#zGTC0v22_&dY7YG;$knMU-2 z4l0L7yIm`swTXZOec=01(?^rA`1X4c&m}I+F>BkUV4V0@7C_uzZV`{kK8)m;CAhp7 zRW+{yP@QSR&}(cS%RiT{!+12#;LLU%gcRgMx9%~W!-o;ji1t>DD^GlF38)NF0A;^9 zf54rAC{zyagS0`sNSnBQS=Al3U*7BwV$x^pzub|M4kQ=Md`Jlwn4K4@Kb6qlzzU@~H5{&*!G(uO)32}M8O#qy*+VAk+l^K( z^*VbEua$6^LJP~%*jWVpmsA-(&+Vny!Ta@2pr7aq3mHT-+uyonSk@4{A&1S1J!MjK zwH=VVO*H7Tg;&LWL1XCCS0UA7WWD$1C4wR6!|xpK>#o`jEl0;@hOeH}H94Dhys|qo z(;#%ya3LWu-M`*D#@$5rF-{@0{r%dI{`g6os>XL>O9plRB!X^SqF=-Si8QE@eOGrt z&ziANm&c;rgKVXD`?h$J{6DM%nCbT&&OghST8taB|?Xs2_d#4+=?TFHH$*VJ;C9G5`A4h|i$^VdF5+ zR7)hA{;8*vXgrUYDvKid)H+&QWx(egHsC90Se1?c^?GkP_3~vHy(982w1`D8(+VdB z4w^&7oUqRpiAgfFU|;E;dau7+qGd5RI7JO@T;W!wUPmqgX{>TvQxqpzJF+ZmpxW2I zuYEI!1yoeTa>u;{%%+JiX6(57sw!eosv-gC=F&1u&RCl&yO$u=g6Y6Qvsh~pWVgw! zNe4CF@n8_M)n9qOely#V(6}t`bY=yqTfw<>ELI`p*Th^PVyF9p?CQc`Wse{MAB8K$ zz(UoEP~YSX;x7hLLH^3_VVqswcg6X~5hj;!f00|C+#pQ=}*=wA}UhN}_@xDV( zgDwjP@3VF(62ivjj zUYO`Cf|!>bvkb9u#7&#F$vzcFD9K2dUp5^%qU+Q5w7Uso)1qLn{p!_`)Dj3%1Kh5cyq`F?!bs#iqem{y}zr7{8+?E5wvJdMc zX69TDNzuf;Haj65+;ocVoP*r`)OlDe( z5M~h|noE|KNjjgX`I&&tv8ckxr+vyoQ7dw3HV9yqm2v|vdL;-TR?(LP5;~shvrDMg z(j>JDNWp!9v!F~^4N3&qtjN)`Fc0i;f;L6DbrnZt40@^719;!3|~nSFE42=c6V8`%L#^*=C9|s z^S*h4iX_^BuJq>oHo3&(J7VoPoLBnX-%5CKLLX+KaZ6nrQ;$uax%hQmx$G zx+svGs~VXNM~0GEO(Ht>EDJBOz~Q>VhSe=?8+oD6_APg=wJO9>^W!nA(*@awZClC} zsoxnbw|5Draw5Ww+z{C;V3og);!-t|4$vu43x9sI4{vi0Bl$Q}BnhV38eEk*OM2Dc zQhWYbX()bcZ7O*HoLYxE$oX@{Gk!!{yTXciaI&Ov@67`SfE6?fcGSnorgM|ns*u=o z;-(7$P{Zr<$j)ZCI+O~a_dd+Fy(tT0Z#-aHj9I{b`C7jCLSC~_{uS{<26IM8zVAt& z>D4GVTWfI7WdIEqO>mq!Z_%ouA_O}UNpM2Mo@O7$vz8OaV_Qvkq?t&nUi1vL_h0m& z7m)1idWvkZ!Wg28xf@uBhN4BKd3=UYiI+=mpc)0m3r^4UE=aeotN8t^uQX25)F>`7 zmy0sP`hv?a4~8 zA|g)Uh;@cuWp@*>2s=+gsY~AWioQIAm0o~P9sh9YrNY=@%vc6H>$vwvqhAgXgk9O2 z0lg0Ugpno^rIKJEX=!AI>%(zS#~Z=BpiSCk?tpiI$tc9|b4iag1%1 z4X=Ee4h0i%!kc-_@arEk_#)3@D{#v_%FFl}{ zKh4hW5a=fuf1E0*h>ks*ZDMSe9TJ@?`F8T!_QrEFy%Y3fZ2rPdBjJuU{aE|wz{Cv> zg$swH-ay9ZV)*uT=C8>^T*)p{q5VhFCILH>j7CX6YJQST(P`^6u}V8q?>Z@r3l z=c8vzYufUNt~I~MIi16s6+rklEcyMA2-0n7|XNHVrn5jdfL z0fJ|sx+9)4+wj!QD$((AkBC!mh&Z3bXv4+9*@hYQ%?<1QA`k=Gya~4i)wKKA z4@6AFX{*()>`jA+Kx}qD-_`{iB;x&c(ub>knee;!QPp_$tSC?!se$3S{9+@xSE?(F zriM@C@wb9#2c6E=l5KA?@$VOEjnvX=&%mHJX~1T{C;ET}TDilvo~|iKa#BU(P<9%K z!nnO^Ey__YXoUQ?SSpH{u%(0+cOM(3Fr*IKA_c=6+`grb06yjB5CAN33D}I{${zmk zY)w*NcE@Ff*{@pObog6oRPFL6MT0AY{xyZ&K@dx$afGn+-fU+)2B>1Z>kaA)P?J6Q z^rtC1)H48j>iJIwvyuNG_OijUX`Dyc2)?)LZ{#%JXRW6bK7wWbP*zl896oHEL{+w5 zVV3z*f?Hgncp`mDqN6pZQBY&jA5dJy-JT4<%st8W_6d2n3w`|8?;e9lQn=X+6Fss4 zOg2_c(#e?&oRo}J6ui>1K4=cIvlJWaRcs+Hc9w9->@N71BvMb<5Wvp!75NO7=pm za5haJ>*)rN*#!}hn~ocu`B8Jrnl0)+h%o&>JL|In9B}jP(6$U^Wip3v#uJg}jYk+FIG8d+WPuOEh?(JZ*i(!dd%_1p!QIYeMJHLCs><%GH)@b` z-{Dpz+fClG7={{XzcnWq=1?mPCe~!@~+GONv=eQpPSgZaqQVRs< zevuvC@69$^?Q2jLRrjPgqk?3f*lLr1<@xi^s8M(SX|u{*FGPwDae|@Z3h6|}<>_ag zZPPeu0}Ctd2SqOU@@XbJYi16+2A|`qw)q8uyY#Z~j%jw{zU}%Y-BKh~3!}^}(Oyo{ zh?uRkAcDyurdyatV($5ux2Lf@f8lRa?;4JM=(w}j)a2YAZMu(f6jJ8Kj3K-DY}DJ& zP+wQYm8t0rA941tIh{B@-euJaGBvgVzpA*rUCEG}W)S*m9HHV!q+Ki5m^6{%c)(ZS z1b82Cw;ACJ8>o{WaH@UHtI?!|?cm~BNdIBbYc^jtM_m#5=SA3!rX(_IIV z+AY!XMA?7r`$Ah@4={Ehuwy_mKWq}7^9y*Jd7EZfIDxBMq;LWgI)cf8A7;04{;Y;2 z^|;rcNC~*x=EX5^_+R2sWK9SIoZzr7NtQ{#HSg%SZ>);W6f;G^biQ@?HqhccR+UtPb$@zN65RN$<%xDzQwSR0tQ^@=& zFPY{wkz)7*!vGlwK!4fm_fQ29blXfny=_)ZMxhIXDKe-u@s2|XsRzQGh}J#r(fKc#AhTEw{f!n^=txwIl%FG=4~z=)0bD-G*Q zs6@17iRMUwkH=Qa47nFZkDZFer=qnLM4Hx03DVe$w=63GZF6(1xy;fIJ<3myYbRHBbmcL;?*6sfE_$=!hi@fc5GqX_Nzm@V47mBhj?XyJlky9`K+~sSqEy{ zE1)U*F8w5i2h4E^C}472hbnYAhhjWziMCqC1_MFlTW*@BlUogNYNnV%mw_$Yt>n#&tD-1 zbVR&fa@6rZ*#a@^dI2k_8qA6U$j}6kesxN_rjS9?U_V;F?JW2VVWdEQXPX4$th^ML zs){*qmbb&^K3@zHOeNgPeMAJgw9*a5$89XQsE>motsEM+240ZXG`dX#}mq<4veT z(}|scys-2m6Y&Ay+*G{J)JA_<=(O<3KFI)SRc0 zfCTyewL^)?c20-PHNl;k5!Ga9D*F@Z;Jajzo|kbG$@X+=7D2s533nEt3j^jDnq22< z`Vm?Bs`*Fk{bI-y6iVPD%oUZ<*yt~Yma<#ph=}LspA%94iZ=Id>GQmJ|`$#we zPE#6M3?RFMffREmK%CgVTMK1{lys7@qcFxE7@yCHM+pWN9k%eeAO#l69!PY|b_Z>? zb1K#<%Shi$0UM%(n}3XyC`g9s7CoIegk?4I#CmqUEU8ogZ!U~~p_b4D=z4R{6oThZ zL`ar(H7|d>h2$uRyF-|r-ed_iGZR^|f1)$~2!}p^bR%o(bOePvG@P(9S$LHZ{qZko zdiTH;%my((U_1}AKzp1A5;I45<)Hp4KH7p5d*fZ!8qM|#A_!UW9vxd;W@6ZAngKxu zgls&3QR+LGAlm*lXTge*^nIJaeqyQa_VZ3gFi)*^^7*EKA5yy{+l}s>+HRl+c(xxx zZD<;EnK|1`e?S6o)YFeZ9h-)owCG}C;^@m*Hblf^XjvJ~h2wWl7)o=K7U$P*_XL%s z6)Ics0I^?MwaY;1!7pc#7@9lldMs zjRL6%x>0A{lDlPO$-q8iySej)PEfpbnD^!x@PleHT4Gd?plFc^AC{a_bj1a>>%9Xo zURD883X&V&!uWLTp4EwW0PG^s&vw-eLEpFWXaYdMP{>^8epgD!A+1RiLjr3~NktC( zMXX{Pym7`NE+w!CM16pp?l}1pn+C04y?z`lNiUaq8C*0zfMT48vR1zSl2ajGoQ5xt zH~7WYgZdw*a-h|6ll#Lby$j^yLCsaGFMUO3CF{e?>=M%YT7OxiK*d}d*6SD{xvRVQ z`klt4qp!!=RD=DL*&1K<`VY+r2RBcI3n0B<3q7nA)(%>H$evjIaEgb2wIyz3%-ZNa zlK9uTCv?;}2PVNJfTQ`s4ij7+WSVZ|VUdO7_k&_Q8FEwprrO1w21#Bg97i%I8^k&4 zjk8rQgt4ugD~lG-!JkUR1f8a5Tek2p2$1HF1X72B2K^CTn%Ms74Lr)Ulsy8ZPz7~> zB~yI@^HTmc?2#UzO{LiqG5156jt5&y(mnCJd#yZ&Rf3!UIygCDFKw)#{j&tETlYcs z8PF9_8ogp}nTo_b@K9BCH}yo)jel~vgED^n>RR7S_m(=>hfSyPL8S)8Api2s+lT-< za5m#1mnu_7>O`VU!bN%p*jopFC=AUxr)v(;JK%%z&7~bKMlxV42m-Q!pBDBF{e4uC z`c0N{2CA=!aLb#?faAtDoqFz9-N)b*+>RCpp_m9TNR+{<+1N}* z>@hV9XUD1I#n0B$)KP{8QX(N)F6;^(Q$);U9uZ>!?g~0=fESCJ;HmfImDaR-rU!s% zbDgEpOKu474vyIC1&_csuqb=o{!t$CUfMV-*pNmwP&Hve30S z4C1kptWAW+WswV*X{=xvvM+`LO_Vpcurbk~ZZ+1CcL_PK;}9rW`c(Z(N+8Q*>)zw- zA3>*w8X8P#LeE!!ZrO8u&F%&4OVe5A%x}kmuP&+ z>VV|vAt=W54=--=vYW~$k&r)EKj3eNZX^KTW;}i`V&o^y0*%}F`^Zos0?{Z8nmkmk zkjMvF^$?jEu~gZz#-+eK6L(xCLj{;CIwxulvNK#DNu@dz8Hr&0%m*dRZe!20CMzFq zqKphOdn8H=Sj*E+s{izSFfF*m_4v8S3QoIzaj)b*X1YWbSj=b$wD?o?^Xsh1zg5c} zy7#aBAJ3J0-c%SH&d=dH5gy`oEsH zkc#N&ODXvB#uU4`0rgM+Bf?|d^&cK3{qHD<|GdTjcZFTF|E9f{Df2!r|Jk~q7QCxN zDABsnKjSkD{Ld3VpO-mR@9F7!78<7#1i=vNP*#Kj^Wyalv{1;32s*dnx?{-yu=zqi z{Qp6!#{YXf<^MYw<-f(~f4vs{eGZaXXt^|IAUw zK)v5_vG~04Ip^9liT{22zp?*fUEFP}|DCS$pF{Nj=reS-=YMwM=Nj6eQukeQF@{?% zIuJHLy`N}7%I`oDeWaindy~K*zHDlLUdw8G2@Y!_Mkt8Rc3)VH^BM$y_%0wnw$Z}R zkn+#jG&(Kc5eHnky-lRaXq-Q(bZu!AuthfYrD_HxUbQr%LucgpOgYJFpe7(4W{_OZ zyJ@LQFLR@{e*4)(A|`?K=aO5rFt6d*BLW^+UrlVZ-ql|rZthiJ*#w`$X@6m+=*DU4 zv75VplW+K4vA{tM%#;ZBTwMM$aFJ^-OY#kDFyRtbPUO)mY1<4ZQ)Xo69ax@3#l_jp z4B6xWn0}dRcBCLlmFc0+*F6vH{`j}re}hntsO*c!N8ji`5v(pzLfh$v;1=-c3guL` zLqw-S(9rvcMp=6D9>Q}I(L{McM%ID5dl}e&Oyj^2fgCIVLd`BtN8;~J5Ph?;bR$*g zfcl8M1pS!?Y%thvlKZ7mv9~nz1%D{u=O1H@0|18AAIl)2un7iMy1M*{J;xkD>gs>Y zHeoCRmt}Wc#w+T1nw4Mbg|ou_r`4`KY`;tp(r(LwP-xqKO|hW#_9nZ-W^D6s-fA(9 zZNQu<=d0cE?aJ@q+Af|vf41D?@)WK$FD8LWH{?8fO8Z9+bKNu}%zq%?vVgvZ+a%jL z9Ag;sFV+nDq;G0*3me@}{**{Nyk+A-q+ktRx@BDmjF1~F5iR-}pxT6C}VYaXT>Qrk5IUxvHh4g`A ztZ3f3kqCCC5&zY<;40A2m@j`V;*xd2GPD}4ND{e4O~CTy^e9wZ0#{}BV+F=lVA1%m zp%iI=D=uRuQ@ye~Z~&g5c-`g*IAuw?tNe8KLr6yPLP;;je*5{$Mo~c4wZ*^0Gq2^f zK+C*gIe4ueKKc>KZgnx??jxd0S52hjNx=|;%C-r9E0v=QhK%j!?u$56N#|-D=dC*j zy(x;pyii^B#OHyhp_Wv2M?!JIeth4OJP_7~v9{(Gmz@E1LhyTicJijLv$2zoWbiL& z`8)Mnl@*74%7EhVs6r~(%wWt1Hn}}7hozZ7yf+^`1=cf!_^3>qJ|d(_io>{BDu~{( zkh>+<)Ncy41anC{fYj3~>}oye)w;ipaODiFWJsTjz%J1oB@m%t8CN^a*BsZ`Ik~wi za*9_kS?O`=AWWp7y9rq)K^=wYb5F@~FSwaqeOjT4jxniEEv^CXs2M!|7P(c;tGd9C z&t+%ovUrGLN%yNVzbqLMah)$|Ys!3jpQcI#gSzO@10{Qr^AIScT(AWpBMf56(E%ne zek#VYU2%8;!*EwAz~vKQ7ESm4{TZx-{|K}PeAj~hj0GdEOKpuu%{o4hL)MKcPP z$i8JFq-REQHiQiaP&jD_EUbj!+wG>SSHHI-Up-RO_ZvuJzYTtMIW`YA#yoyCTE1U6ED!NY*rov+5cO0!?`uw@qUW}$b1*&tkw>}kGoD$719c_ za0ei?X5YRh#Z*A}JSCyM9VSt;$?(o4@5aE}Ee1%(D`7qV5UG63LY1BC9UH(aR0y3KMIye!V~9tSn+yLbph2j-dGhssNQKP{?#Ux2@BLaDHvV=< z^Z^%veSZCpSW0UO5^I2^?H}{ z5qp;q?;^X*ovsn#^HJnatG=qX8tc|2?^7{Su4gQ~Tuzq&S_gLrXT__ApS^&;el1|v zm7ny?BTMRi3a`&YH`82^ybykjdkmf%m$c&ni3kS&oQS9;CEV0wzuK;N6si-$vj>Mf z(=9Z#2He?W=Rk&?^x1m3amsy`N9F5XmPz^Ns(y>zi4rF_tPV^fHC+VcBx9#u$Q?AV z84ROjL`j9b;n%^%YPDyVz_c^~D zOzn9eDdf*>&JIN05g|J(eVd}e_=7Gh*Qrp_)!C-O0DT#ky-RxOo(c%MY1eP8*Mc*D zvD8i*0_ZIOV?wzzD9BVW97g+PZ@|Mw{-7=>jlq;Hlj*`c4+_SE=&=M_y1JGp{S2T! zU1Ti#ncuOQ^S@>qgtgriuz=zo*5+!P)zr3MT3ZzdX}kd*Yt z66=RYzegeE5MZIXb1BV*5!U0gXI8G`_^P)ukY>W&%D`>k zk3g@SJ#)d@$BNCQgCH3ChT3#Px^AbR70lj4Tle^fw#sCDMvVp zFL%V=+@^QbD>K6LvILn9YO(azZ>^0}!G2lU-3O$KS9T+xUTLPBiRw0BcM%^T3JMf2 z9v_^OWjPyLAx{AN+SYyoqtW;fBsi3zmJ@1F68ob`9l`H6$gic6U0V2(Jli?ae>Lf@ z{54};2~QdBOYq&f-Q_v50AKiQRHRgAigHg1x$;PUddy5Q6AWVq%!8$5_C)51o0E}} z)x3yCBs){6lYIvEdmE&0N3jQ98DUP_^k*wr^F?dt??b|b=se4ddTM+7@XiKP5hPFt zFH8_8X1nM=lFFe4I6m>GY!Qx+HP?8aOZV)$t8+*Tz|7q+f>M+F@l2dxO^2|FM%?xq zML#?HRXHj}e5`D1$|ZlQ>uf_Nk2XKTD%lJB_PyD~YhpppFYqVk;BB@dgfqa95c_-DS=YT$eb3unMqdLz3#e2QPtDUD>9G~ z2bd=UyHtF3KJ@=08Aj+ut$!2FiqbHgtGBEffp;A|WFDV4uQ91EK|RU(>>=#tK}2NC zlvMML*dxJlYA6%_pgD?P@*~gbM2G=5A1D>@G@8x;J)F%AXrlH48}{%7m(JN%@4o*e z1MBqLU;B~TvAO=I`6uULQu>eH6B;>o>YG^hy_eh4y`FP!ZZ~b8_R2~Ho87_kMh>xs zT!9Q*2x0MHaj`-Mm5c}@?*c~;cNYdG4 zCMBSBI)(7rV=>F}(&cgm>`)NoM75T1N%F42L1om1H!7qu--67lO9tr-SlUoRLqOwP zO>@m%-Ju_WMtA$}pIa=RE1v+5METM0#3Z;vMC>Ba_UWtWUQJ2&KOZ1J3gQ%-d}j_L zD?&;Rt_`I0^d=XT{~*Vq5XghphNAZ1TA9+eJ}+u8%lBFym#|2ucx1m5(tf=P`(oQ2 z;Y3a4n1wQS#F4#2N`T8_*Zt%HNlh2vz1sBn^`gOs@&R0r3Q0*{`XW}@ zE^-9YHryU1(CS1ZQHvl|PTmtWW*TsKIgbA2-V#%0B@h=Kj$Tsj){>TJ1>Ed0VVF8q zMa@DmqAQYr-Jvsl9C}9KQl(+XH;1KwyEllr!kLrpe+0dKAy)vibj-daj*-(F z>}dNE7)|QEpwNL3wO5~~?_GP2rKYJc(76ciicaSwz|49me28*Wju9Gvg4^iK;gdVG zslATaQq95J(ThRoD~uJv93rrXg|m&@wZc~3M)RiMHS`GXx(ti{-jsgb)($qTZN?v- z2Mb&y{QK3LA%)2>km$s^G#m=Kh_fr^u&s6FI8PtY3~V$O9m+;=4^f=@sLPTis-*he zyxdxfa$RD5_?(>sK8Mh6^o?EL4b-I1^qte~R{@0sI5pTk zvT;bmmNwEvwn~vJqsJ!e zWk&^YvNBe=6;jPIHGpn8H6r`2T*B^wC$So-7f@W}Cbknu12-+R2#m&(HB{7VNz-V4=Vj~$p zn6z~n$H0%&ZW1+@IT%RRmSCccv$qQMlp92DZun6Qd0xyzaexd#gzoUQq@n08Q_T-| zb$P;;>|EJQ;5f&S+rDiuFdNFXFpKL2_laCqZ=Cul7GX3d;WmH{uTv&gGA8ToTD8P$*hc1t8w^pdt~j=8t7KM5)v|xz|>FEvNlRRv7Xf? zpB`+1A%wssuE%ReS@fXQ0VuzB_bz~>JrgE zfdWBy()Fo`Noo$xtPho65yzdZEhEYLbm2Y+trdxYtq&a5!tSG2`FBr4VBEy##S@hK z`z%Xm{z=1pE-Rud8m3Ti&9A=Nz1Z54S5w+qX+w68C1^#L@d(Br(}Qa@C`+1DA(w{~ zWs9_G4H6F8)3nTjDjrLlAwgzdo=02?lGZ|M%XcVuQz95RXl=UWkQF`u{&=8WO&nL; zcRAf3scT}qlz;w|wQo=EMy43UbHMV1=YAVKOZJ2yBK(h-`sCla@`aBs^B zm^VO^PZmGv=hh0MB-KN~EwcxI{Cr)-CEJW6Vr3FoTD>x>X(K^QT)bIcU{im-qgQEv zIIjl+dA>gG3wAfU-tw~xEltK#nZi%E>W_B(6UKv8tR3T%D6=N3D`QmObJW+MGT}8- zrO6$-gJ{)@H=N88aY{ctbv)6(f1rcYe2ps+$O5$Odh-E3^DS%8)TVv)$qv8|*uT$# zE~2Vum-A#_PC_fBJRHZkmK589Fo&+ECE}2*3+IrX4hHG2QeP&_+noN;gkfHfJw`Ig zwAq~ws-VJk}E3Z{85h6QhV8V&b=%dBb73B(t| zg*|IoJ|F;mFfanK3(tJ|HGRvg!}vqE1cm6n$2?m$$~-}830s43brP3N2E&a6BE-Hy zmUsvO=~rjJzQQ#Y96mw-v*TI|j*6cNtUrdl>PSt2Zbv{@zS!DhT>Dsp>i*G1xYpVe zmK9aOn*`W$9z^c2Er4K3XpvwnD{SvewsScKgU6Y~Enp395^*TOzOXpCsp|_8wL+)fi+15^!PX=)cP62hnVFjZS{*a+) zjvSs^i2$G=fkUql!FtR>Qhu3z`7{>f(QyT+(mg~+$x^At!-r6_tR z23DBPY58#F5iAQw=({(+Nwwrx2kGj}BKP`P&u|N?#Bf&TvR-meWLb)F*dR#7!!6+o z4BpG}R^jAKIj;?+^Sk2Eoi|c^4C7^^fMvh&tMXowms4$k>*a^OAX7eagbKcIxNItc zeJpbH_km~T-+w3WkX44W7PN;63N5TE6-||IPR{m@X#JVy${#8IJH@HG&_`69@`PXH zl*iBiB{aQKFcS5}_kVqH|2<22^lhltgi~!fdu((;Z!D^b#Wm+N261uO3^LyJpmo;8 z=Xci)Q)NF{S;a^0WA8m|_w4EH?Cb+Avu$das*7A^$>TVAjRS?U%cpJ^fm-VCzyI#M zaZ@gIwcY!)+3Dh|k53+UsCc9@eK$j28~f?FZMiFLcIy&vJ_Qru4z~-c4v?`0uUnov z=G;DD{qXlMjB=hldFI7c%GAf&!9HgzUkK69=i;cD<+U>?*IvyIRwNkS?^DMw6;&})Zfr-D37%3Zt zoGD;r^g@hh@*(#F$qUQLadB~)Ui6aFn|Bp~&}5(zYqkk*P_8Z~Czr&0ytDXY`B3`3 z&GPEMLtfaM8086?F!k20z>$W+B)GcWnq#zhHQfI39~(la<}Z`*ZA6}yV{L7%J-h&k zgkkFGFZr!{S&%?!t|k(RyEGi0Mn~}W3|eKIlaR*#rPtXZC6O;`eYgJ+}yG>15Sy{htQ1wSW2ew8AGd|OB z=ht6fT39&peV`K0VjZI>tn{GmUmBRE61e}wu_SP9WP-oB$>U7s@-*{s9W}AHZ~OF3 zaXV@#Wb*5N#!a*E;=7hBFINP4cMGVw!Gw#yAK0%cy3+eZpSRp=n4E-Ty0a4V#+{3v z_47a6yVQ}Def33}{^rR;caxHCZ&mu2*JyEzBxJVtw9IedJM*@WNsige9Isi~<<$g( z=%qg^-4;qW71@^72UAm>)z#^nwltIuM+ts^U$wtJdHp#y#|W^7-eV9}ihMS_*j=Y3TFKdWY=)6LZ)Gr?o zTl&3!aIpB-$0v)N3*uAC9WMXXWpS^Zo1{A*#hwHq-@sZ!L*rbg=If0c%U!B1SX+d4%rcCwH+yn2|HOK^BHOr>;NXz%@xQ*c zE%ezLbNlvzIl09>hv3m}joln&Gr!VD3e5iIU+RueZu$B7?NC(opA`sL`9=u=GvoGj z4f?%`Y|Pnt0cf5U7Z($Ed>fpgs^T(Io>AElnojMP0*T|@xw7!fPb(iD-`sO_9y@1R z!OG1nEiD~*=98x(hkFbwpYKmp=|ByR0@uF>_ImkYw(U`YYsYbhA%EsuWtY8ud&WH* zKDT^{UeC2HgkHjPt(aT>etzTA)95EGgrA_utu#&Lkb!{{W~ zw!+=nOMS<7m6t&ZYDDcvRetY8dLBR^|7*z)PDFuic_Zt35XY!{hDziJi8wr+oSDyr?mz;zt5-b z$9nb{hKLd*Q+MqIJPr04{y0q! zO-C6^9#iBtT%Y(`Kxq|RxV&M*hC?K4&tx@cJFED3xNzBqZI%6&Mzb`IZ0sAn`Sa=1 z-cZUvt-Lo&%mr{;<=+srT$&d2dg`X!_Gh1n7`L}Z-||Gtgeifk^h`wun2>swyEwt& z;r2a;Z7-59?4O9_b^KhcXJ}yXX-LTP>3-&&5y-JCaVq@b^xywBeYqMs(|GUR)f9)v zl!BYIly}8u*5vwni$rzT`rHHXkT)E{`Mr4Zf3WwTaZO-d*D$U#qYgGk0a1#KN|7eg zJB)=As+7=+iu5ME6B{~8(@>bIm;W{e1a<_5Q*t}4G(I@3K(l(BU7a|zX!1^29FwfyScrCtKDU^`hgR!w#(94@lU$@r2Uxw z$o{MZwskmew8}I7Ud_zQmMKf3c-GljzP@UrP*-H)TI497kZR9?BewA9G^d${k`!;AE{*S z?x2a&9C?1B7rxdAty;wO)nd^BM{;#4Tc&n3Ho|GkBR?^1`ekSo4cYq(-@U z1x#0kvlUJVetw)!Oicgm*|R1Mo|$Tlf*00HAfdokSq2r-?x)#3;mt~5!##mK4smb1 zxIQE9$siGr(2}-PI_^zlKO>whnP5iW&V1CLE4oE2o{;ux?hS9lbRks-4qqDD2P*< zkN=ICnOPc!kFR{ba^(Vk0)s(%IV$?~?~iRv(H$1O7ql#bV9{P|rm?a8+@P@Qb~9lG ztCt{V&xrsc<&VV@s~P+{ygL?YhYaP2n@xo}PAMrV4n|E+-M&w{9_JadK)(#!O=cO$ z7h+{)70;RYi|rZNmyLA0J6NI#*n!W^ZqAX-SDrd>@VurZ1Z1WmpT4;y=Xd$SCoo~%vO zWnWUHJbJfTMI!Taa(=D;l!2NEcG!M^^Tq8Rl)u_!*^Jvx&!1t~sy^>=+k1Vy@bG8F z{t}~)yUf;v4kW_G^x+&&kK2EIZDGSu(_lj@%h!2FdQAK&oG!LQp4z<33R9MCRfj-= z>l^8&fxo!k7#*A)|6?;BTO>jEt9oA(^)SCAiu>!O^EWK9^&d2E%T!XYcR$`)_Hvvl zXihp$+nPBauZ0mNs3g5klrb-2c|121@yA|s%PEJ$2dwO}Zf4G=mDso`?Vr9`1`}&8 z2%4s;8{RPWq+R{k@AKB$lV0}@byPQoHfL;(3N@)z*}czj);{*9B~sjR;79gY?WL7d z%z|p4`m9(M#B6Z$-xKp)U!E0)7bkqHoqi-JC%rA=63#z(_GfoS5d?8#Kl2~RTz-k;mU+7K z$7dnu@#}}rPrNqZRe)sXoWah{j@YSMy;}WIZhu8%v=*V78&^|Age7ah;c7)6?UD>W)8X{F)^|I7!w*&mmVYHL?zIu z_SMl&&d$gp4dbZFNNTXEo24rH%AMosRF8!o9_ggI7DXEkI0!K}%w;}T<_{Ji%9|iF zW9>99d!*UNhAko^6}u8LQ(-C|#H$_LdK3So@)OQngYblrdbcPAhlwkQATDH^woI=5 z_B_d+=)^APdk^9YR7bjxAAh1{^Tkb<3LL~87Y{;sILv|$hySpSKxWEuH8(elSLqC0i106VKf)1`uYCxL@I=X((G&=jzLA@13rq_{2svZ*Og<=t7r7hnyNeH92uRw8?5B6S}(Wb5i$3K;*OgB{4ya=Y!z~h^u4d z+pvWKgM!3^zZ+QvO&n542c1Ia<>r?rXCP@13;g=0uZcPgxgPj*4nzyuWt>aB_?1ux zcp%t(+Lrnb>oVOiGeYav88`>+H&K@$aprbr!4?b2*2QJtf|AvFsCqM`TUhv#$fF;& z6jHtxe#G6~U9C?T?!DKQ(gE`t^)cxjSjOME6hyycU zhKKj#dwQkAm#kK9u}!&9oew)wLHn3nZz&zMu{JZg4x|rS(WdKH9q6Y>A-1h6YC98TF>MmTGgS{(`%#eLHh_i21MTS}wsy3eK&bWzKN0b;Fl2 z1pMUZt?tRf;wF-s-}bCd>LCR^VEYiQ8^8B`xQz5+>=ns_;#yi&^*%j4T?WQRHy%t- z1w>v6&$Q*5)wuJSW`$+Mz1hc16lXc(s%Sf(R>s0v^7Cs6ykG4-CPOQrq!d1$T#Ibk z4RrJH&|5RB(a-jF4*F3WKH6Wqg0c+Gm8OM`ros_ClM>hoZUHx4!QNplRs?l(~43&D|V^k?+QY1N{U+j{~vU060 zvbSb?ffJ!{Nt9QGxZ2tXN2D+~Z>V2r1-qEchYa^>5^2wmgK2~tmMW@J=jJF6kzrxi zCJEIJvxh&QIA3^`RLXQiU$xBkyV&j2wg?Wxe2GGahKeA&9D7U`yR1(FQa^Y^kyT<5 z`nat|nd&jYQ&*;#_zf0ApQd(x{(K86694rvp9&kiNt6V@v~MuMnQ3Wh7K>~QXhll} zL5oi}Kj$0FOeei~>>TKNJ@vvRepSc!UnQe^Xc-P1lIZ8ppL1?67xBj27>kmuF}z`k z=o5Y~WN82iBwTY`h?L8h!E$TJHL2LFAt6Hn=9(tlR~^FPa7H(fr7-V8AU-45%0t^R zI5cB$tbgjBkI$~{S-R|?p#LjZAmW_I>M z7^;ZL6VKPY-OO8qH&Rvo6KGYaK{3ql_K&O+Xkx`t9mt8)gahaohk0aq^P^j<`ySj?T&Vc1+4l5(k9n2{rJ}YydB&X=5P2QG zJm18A3)~uLzZ>})GWcPS1<2ZtB6M5dZ*UN3A7^nB)qnu=P!WKMh|$q8!&SS#H7|~3 z7Bt>!Ubx5+5D=hAcFQ~WTcg)XEMyYdg@>kIQ_aW58iP#fo4*i1@}!3Dh!M=U4z-$h zwX%w`qeeysV9XlbTdHB!lboNxh|lVBNqbG&E`)aFjggj?mhv8>r>kF^i3oPtMoDt} zrqsYeK`_O+K`Tk>-Tg#JJq*`IYq$`h?{DY~=`l0N;ek!So6tYk`Cb#dJ=c{F$d$aF z<^E;ludxsLG8M0TjCU*x^U0#jj=j=()UXaBN?wdVtLcU z#xKoHPJUR4%u}bz`4pXHll!2?#K+PmAGmi9CJB@d?NdtqD_91Kg%HbqHQT37{U5!~ zMw+kfw-11N$7&BTk-D zH~C9MV6|NkV{Uf7*o7=7U{U%Ny4FSd#-Ie&n@rE=Nfh(nBFp(Me$YzNkYe1wiYc)8 z@@pqFGm#j_LA8zDIftkBm-6q!bdXlRHm}6g=wIu0Ilm@AgMyP|0j_ZYKrItiPn|j? z`fN8c--d^~q{K?G>E&6Dtk+Qjs0x>d=&f3Dn*lpuin;GBNSKZMs_IXF#=p5NOjiE z>m-w1^pxgb8{pyQ*}9|@>~tPydCc&Dn0 z3e4d1#sL*`Md9H?K)S-#g{I4eDR{t4CcjDJes;X zqu32wQ7`I3mlq*npXu#pjn8_@4M3-zhGBetQgYOVPoCbvx?TjAZ)1(4K;V+7IZq(6_vei~t#W0(GWA_S0kJAN zifx4SBw!b(^k=!JAOYD}BBI*d&F8g+z}ilVZ+;tFwexpvhhPb~9X0Gi)>1E*_4+ zjH=QJAE+5hoE#nV%h&7)zfZP=yhu(tIjd;i5`ZJ(x7uR~H9hJ2xja6cLk$6uO5|Xf zog^-g3;&}p%6}_sc!N^uP$=S;I8j2>y7yLrO5*p+ROcyH2`QcSSlY5SuYG8;I-fW- zkvmeio`_^{!4!n_WohQuoSI)5r;z>Y++%!yu9%3}>wfrj1U`QI!|4#{|A(}D+uGVv zYW$Ox!#VOHm*P!+l|54FknWS;=!|WHqCwnmIr?r}M>7BW@c=S=8J?CghYiOHJ|SXk zQ~C8;HP9Jv>i}?D6fKjWH7B}EtD?s{)pfu7s3G~0SPm4`y4;Tx=(9fN*y{%wqLFOk z*Te%!0gKwZ3d5xd2P;1|t*lUWXW73KE$c6O#7uOX%XSg>A9dy_YbMqg^ut*2M;#el zr!I6X==cglvYH^~=Vl_591t+#e;Jht+Hw1-Flyn) z)SXuM-e#rm<2!9FRr>Z;`~H7Cfr3GU$f4jq1o>84#`!32O_sT?D9O(fWFlTNR=tgd zqc6$NBYY0_cP?1Rwy&knsBo|vK2U)yYECGB+PTh|9JSmuN9o`Nr&y@M=XZBK7bT^n zj8q~ohufPLB|(JKuLZWPE~I>w>qF-jE(Ywbi^guxw_AxLKXdVZ(KGZqaqL*bkIhre z0&p*egv29%LY;%5Qt4HYQeocg_XNMfnf&|9mpz(yj@9-LBedM; zn7B`?0HuOhb(dOUZy(Iuc1Pvx3fV1vX0;9yb(5WKxk8IlGx=K2sN`h7u?kI7Nyiaw zQC;t6+DnplABv8dN#fR`+EvmUSw9l^4IIb654#4=$|-Qlb+cP0~USq9I?3IyqLRRf#_OP|Uj z>F~&jyt3ZpwQ%g!;Q4Jxc33*?`=q#jh|HJljmxeptn)Vf2G_aWNEnZ6PCi(YEe{sH zUk!ekR}(8bTp7@Fc?|WNUdsT0tm1h{?ebL6%3ta{Je-fYPobo~P;~?(2pS|jLzWG- zUJTA<5Bimr?%q{Jzq!Dh_E0I5OQwhVreX!V1kgh(X_6WwxLdx4P#CZBw6Aa(?lYp| zcPG4-^$)5(j5J!ka^p|eTH-F4tD7&|J$V)* z93*mBZSP45Lm#zw2*GgP`8`$;*wxOL7a9?Yhi_Ni7(^b-Uc7d{fjW7Max=)G-nofG za%8q%J?46D|B1+@z47NJO%E&Dck{~@x_UnwwS0u8`JsDx*EO26)SUvtR8f z#92N(B5?zfJX$WI)4mIrUqYo_5m<>Rc%&vuxQg(N&_EB@)W*%q3Wy$5BQiakT#i*+ zq~i7vuh;CN4!gAbS0ifmof8e_1cY^4OUdo8#cxhA3tjAlMuXzGcV%TI3xT2v@NE5` z_6@)3WgX@Ok#|{F(i^E3fW4`1ZPF^B>0_rb)jC#Dco;o}0RxkV1@vq;fB*c%9y)|O z2K!sBq#lojxC-MEhs?FHIv!r`xQTp~NMG{y&W?VnMFT@J>W@F3#0pxv6hyMhn*bR} zbEmqk{_@zHHWnonm3-TEi`K$K5&rq(Iq+!hkL0TZfL$yW8%;4 zZxhD+fL6ZPVyBScNE0;K6U2kuuY3Whgx0SQjrfla3gW)_N^fyhEnz9w^y$;rmEnK> z`Qrs|lzy3xe8}h-zZ=`qP(bk+1{mg}%o8(+gFpW?(CDE;xICnYz~d_R{{Yn228W`q zXtOKE?~OS}(Xgvlc2mGD2=)^xZz3Y7E`Lh8jO$Zu!Zp{lR%d4)ZJ9@M7Mf8){dd-_ zN@(%q!0@;85w8Fu+?wm;;a&Uf@vw;S(dj?`{1rb^Mh@u~yyD{GVsg_bWoy2jA93>R zS%Yl@L9d;m5=H_mRFW&1LGd;KN7dhbx| zr|Sm4Rf9oDE9Rx7>-c~r6uqTcOvQ?a2mMAa0K$Ww>d^~Uj?QS|beo<7urxBzH!>Ou zO_}y!ICt)2M6#j|AX*6Fk2@SZ)DIloTDpfSJ?+)Aor&5Lfs~3$ry)E2qo|QZH>>bB zMYLXWGk}uwtgaB6Myg*c2T>bJ4p&Hoks8PM#&rNhIc!Dq9PNSgo2Rm?-4$%;I{Q60 z#A5+kKtAZa++fLv)oyjkAoE%o6nE5ohS!GD3i#Sixf6pF8sCg-gu3FiP-Ma{EVnJHi#kTk0 z7>k5w4j>$tToWO>+Al}*I#3_TTH$~LQDNiUr=X#Jl2*-Ll+|j?RObhVstq}rjU7{= z&fJxxFt*38l`NqN>0QYXoBRB?k2PhsojiKnR=5HCegUlFzt*bf-nqGT*MIZ&}iA(t~P2oX!k&=&KFkYcxcr^Mv)M zP{^KwleL!>0&_l0{+_H5pd9*M2m>j)PUHCyanxorC&AImDm?-(^R>oxI&u>g8D+L4 zCok^%!?2a4?SaB}bI$UfWs}L74z{K}mE*#iIhaHD0c!09zt^DHG+ntcA$R{(Az`vN z*$R%|TTgGHfS-!VQX(+A@mzm_~C zz~ugjvNsc1U5OQ#3ClUk!6SI{w|-U}JW+^S{4w?Ay^Co zYLWclizTsKa2`%_9?;ro+veG^QyswV@LCzr8I$qyBrGG@72NMuxlY6~GHCR?mn;VI zk5iwD-J*F}un@G9ErQ5)TQ6SI%7}N(O660k&b{VE*g_Jw$y&vh{Yed*GLdq4w%BE-IDyrK5-)H5jSQz!Q) z>izTpHSMn-R_ufhx^$`SAP||D9$)(da>2pEzf4OjN@D5&Ujy7GN!tBeEBAZ?*qc>x z<6j-Hkf+)>m@as0Pn^9h0AvYTV%yHZ18{|E0C5!qCF3JoR~}elFcQu{3=siu`i{3Bo&kAXCoaC7=2bZ(K|Y|_y@+LvdN0KkaL*#7j3p`oGI+RkekAJSdg z{nl&M<~cKe2H0(ukQecqVx9OPY9LxB;O<%eLd3&SO=gT-kCUkYK1d;GCxMuxsuID5 z0T*p1mJ8g>wzhNa$)?9nGTx+HN>vCl!7CnKZ-L1%unB-)kOTAOPo6$K@cGUwPYTHk z*nesOm+3+`NhA2U$9xwC_5!D47|?z4p&`Rft5dmbnQ6aLCFB&7NXj;Pr!xU#Qtj*3 zp#`Y!-(OD*zm0}$i~CF+FpC&GR{dntMKLa$KXiI`I9_bZ-x9PsQm0Z!G$}fQ@boO- zin;!<g~Rk+=}33*7X(Rkw*G0xSwxlAw& z-|kh|=KIqA?n;n<`m#$PumP+p@f*GAZj}VJ1?$o^(~-eng}CRz1&!_{q{R?pPSyk% zrV>_!czAgH{QPpY3P)`4x9{8$_x)CtAnR&@ZVeuHnP@C*qVB6eDl+kiJk3??l9Ok( zpe<&Lb-MOA4ybe1T?v?sE`Z4hh`}2+Q?`ze=a!L}TuW^{uF5bwQkDgIKPWH|m>~@7 zZnizi{V=VrLdt-!ID{=S&92-Xu^-sI222T4$Z}}NzYe=xCGGjf6!1l|w{C4lFhhhg z;0XM{8^sN6Y(6yS`sr~R%?VLwUgxuvu9duFOg;KKxt4PYJiqe{%3dl*>{-O{BSlC- zBw;qwdyn5nBuk}a99sG)_9Umnu3QT3IdQ2;7Lr;z1GDiGk8B0@%Kv}@X6Qo&gfu($CscyCiBoJG_GsNAll zZU1IBw5|2T>l!Cpq)6m#TiWWv8Py=RoMlj8|NT%XPQmIW98L@13()wD=>qYh{J>O% zBm)Z_iJhL8;R&LyMLJ6aWQlM4`KTvz(B-0~9`B{nU(ldd0*l1Ger`>D=(x`Hq*`{{ z_g&v0IwvclELMWevs={PFGD8DXIQz~nX=~LM*aM=W|A0!*0{_==H)yLImu^`k<;hr z2c1829UUFGQ)y6exhqwHvOj1!QX#vE!yJ@7c-~>?tFD@J^ zQ(?8B1%SD(=}hiLaycwj1?fXLwBWO{!V`1sdat@`uN2YnIN61`g@@j z5D|?4orij`9jU~(!;O4;HG}{;`j()%30xt%fbY!3bgM^1M9?Dqv**u&?s^HY`1p^e zf|Q@s+A;{n_TB@KfGmK>rTj1 zYC{Rg$(hkUQ9nh+7(qQ{2|;x(t~G9LNse(K1rB~jaG&arxT^K(=5mRn&*j`&JDSrEY) z&G)i|)943?mKQ%xE@SfSXE)9X`5FB0XFsy>@Hem?GAe}BZV{X_g|RR+CQnF_W9Pi> zzt(F1dA!hZ80zo@nJ8gZ%dM62sK94=NC&*_{9cRx+YtQwaZeV6VytAUP?kha`1}1J zk%(eKY4*QQ>3gfl$8wwY_v7S&vudf*>6}aRF)MF=MeU*C`Tpv>#r5Fd$NuyGzdC3y z@c;fQIQ`FniU0ZM|32)0*5dC!{eNOXh8kAs;NAQsGaM$LlW17PfAwIhGv(xwdhDv6 z?De4eF!a|Iz9U9Qit~@$m#)wH>527b?Md1X^yU0Vd-J~*#pu%iK&}7$^OKk>|9#m1 zTB0NWU6B918t~`;F35iuneuO_Ho6PuKbDX`z}N4? z|Gg{!*GK%{Gyng8nEYqA{kxizP1k*j%=nD!UjW+t5gHtMsvny{(t_qR2Pwn88Y99x z73x0+TxrF4At~Y{)AbLYDNBqj7qa*bix=0!S;bs?e_~hg|Js-RuoWmvnDHQOFGs9F z`!rW{uWWh}8@m?(80Pf9{#a`WD7Rm^Kq<3NUwb(oUX@x9UzVdCY2jbIEZYHi?HcH! zdKw!@pj#s0dlb=P%m63iN2`(hTeFx5b6I2!sV-JV6JGdaOl*g6GOkG|;5_{8lfn#7 z7;0GW-**(cI9^z%MCR8isKyFfW|q6y&p2-jT$!pBcXaHF1McP$AecaS52rprHy#ij zm6Vma^QjqprXz+kDiJzUz_)cK1NxXCzPli`8?!B#K6mOur+i^R5?Mw2Vm1(+M0$lu zgw^z7Me1!}a_~{Ltl8xPulHIVsUQD0<;nOb5mHY%cjSoBtFF$JBTv4@@S7R{oZ5#8 zeP8a`JIyRZ>{AL2FX@aCB;Rg3ZgE1klEm8cPQbXd{*zmxn1fT8EXabHC2sut&Qzss zZ5Mv|xw&Wh3zoxfYPClB52>qHZzoc!7PD&<9ifjb<420lh&$N?oa#Y(D;^`ygEkgy zVetgY*!Gtf*REbI2Mvm#QK@RbP1gXLsk3~2@+dUKIENx%)xDah?3A7RO~HLN$EG{J z(2}~R38gGL!(vPU2^ zWa2l>Q{Q#rCZ9ONmeZZA@Q#y-SH}z(IcmC10Bh6gwKvkQzwX<=PNG8S5 zxJOaqgFo$W=Qo=&>E}H{KvP!*9`EkyIRN077vSFb@iLW81A)QuATk=`>I5WCLwtfb z0j3}E0c6+lR^fRw$IBILmnkqU(3R_>A7QE_4KPHkc`T*108+XZ-@R{4qZiVe0yU*` z(SnW!P)U9R1;B&dX2$buX`pCX+IaV6q!wdodQipUx_4imjg5_lOCk&I-GXvi*I!7; zPl2>?6>4i>1!AFDS8l&;Ln(W3r`}M^wjHe`OR2iFawbs>TZzY|+G{lg5cStn8aNT} zZJ3be{WcyZ-+?dLD={vq?A zBSo{b_v9`IfW9PwFyjeu?IotrCJtE>K(ga1yu93y;ky%qbNq(WtNC|u-W{{-ddECR z3gVZ?7utI=-9yw&$~;4WK0xqmI%-n-(74`%Mc(NJt*!1jSPY%*kGyhs;N?ydwoF1^ zgfiYJfX1#m+IxN2xw6SKR~MbJ&3uDX`uBRDK^G8#Rt~YPV2jd$4NYUBx~=WPDraYB zpJcvKK#!}$0EaZkXQHw8@?-gStD%vR<#ZzZK%K2NFp&~hJ>1>V0AS5^#Ha&F@*Ssj zSNu%OX>2T<-XMQMM3qb-e3wSAq~YeEx$?q~DpjqI_Cj}8+`fYz0M)?HqA!6mJd^`6 z-sRrHI)KL6Y*_(&gjZ&ei{`={e(|Q^uH~0R#hgiEW2lYEV?BFKSHMVV8Jigj23EX0 zDs56Y5Qi&YYG^orV(-wC}w< zeQDOPD5=(GB?}M-hoL{GXbtDjqCtM3GMHOkE%+WU3WH}S3{uB~#GLjXYbHLZq1XNw zWuu;Xb(X{6b6*R9BvHQ=2RWRu?n=SOlgMdQTldG0-*TGQ_$yVgVj@N3>JHw=oJ3tL z%Jg7XLmwxyf7lOYUUFF+vt^N#kTjIkydTLJdsj}J^iaX+I6Xq`{)$h?(EY3cNcmr?*Rf` z-{+SbR$Q#ZRiQT5L9%W+iE$lOHJq-wEg}KXKjo$y8a(SBIMvaP!0K3fqNEGV+0oxp zThIJyf2)nPHu~YS_q*#8+Sr;*_&k7hqmC7JgVtgUO|7wJUYFn$3C&g-hK?tRgTk-9 zy%#~_-5nn6&n91)-<@5W`l!V&n+JpRI%0%e-z+?P-v*2YMXkeIa21ISU%q%T=jRjj zd>h^$u3lEY9`tgDCJ*=D4wvL?(XV3vQJkvwo-Y&Ytmu15ugbwXu+wfNniu4vBE!K` z)5ky@t6R1H3ooCDF0i&blBCPF7CL!A!9Zhe0gOz$Y7}7h1Gd1NjP5?tvpnWAE>8FB zL=(!AOk5wtI2tltzFg#FTn07=eGvGgq0ddDszaAH9qtL59^gW1&%9tF%s`F5i%XVr zYo4}J?*m?WIZ%tEoNpA};CtKj1Qc(-BWO}skU?_M)6<7v+^2ZNpZMp3`AY`SUS1%B zUJZgHwnFh47sa+|CHzKHDOIeXFrY8d$5w@jWM~&>g|j%43gUTFRHzm~vp{k|ixILf z(H(ygb=5T`ZvFW#hujB{L6=cbhuc*N5@9uW9yH4Nfldn=VJy;~alPJ49do=1^zh6Z zGX90Pn?YjtmJ^h@%b?xjCIj{3YMTm^5O4>g3WC=aeL<%evG~{LpGQ!WPh7_8GmmZ0 zXWA7(e+7FGa;kzj=v5mqxZ`m5#0gO1SErMRYl5KDvWBZZsx{KE;pG_yywCSIRsZY7I6?3!q$!VtbP0^W7L)9mk5BT3K&*C-M|84-^&BkCeXyAun8sQEAfk zE|ty`H&UI9Ejxz76C_G}Q;UjnRG4Sthmd7Do2H@ z5Ka0fEo~fVLG@a%r&MN9r7+bU2hiLC5Z>ccIC_}?&-Efg6EzDo zD~;d4;PyXXza#i8%HuXE5u6m_Ajj*=WrsZzNZ2Txxxx5aULe+MC7U>#l%pB-R2>JZ zg?X2?(ZH7EL>!fL`C6k06g6Yq&~f5YF>LQ8;72d_Hu=0+pgH%~N6^q$bo!%qG&%z~ zCh^BC)!+N;T1!dCyqL(h(Dd6{&`Tx}c3KQA0a%`s@#sE~;6%{O3B+Bn`d%ypgUv0W z-+yXG?`%xnpYl`bM3${ z{E}q1Qxo(A`!cun0ivdq1UEG9lN>?o*D|aE9G3E>)H4tU^3&4Oq9t8B@^*v!O41R3 z_`>V(CpY+1cn+8TlFyhb<#!v}zPWwYopvz#+UB!(y+vynoAoa*Xq=6v&(AUCN~iFn z75w9E+d#P{P;%b!kq!I`jcpr{4gtHXx%tdOOUo_lw64Y}R!J2iTf$B6q|KwyG<&b# z;4K(L>6-NYxmj0(Yug&!BK!*z9C~ZLo;hzin3j2m^C1hJC9Be~*UtUEre z^2<+3U0u~Ruq+snU2o?%mqGM(kJWkZJ52lZYJMO4aSws^d3oAxt!FX0w*YSiB>{3* zyH*vgtj%U?U`>;5?G^hv-);u1Uq{*172#%h@`ia{Ip-4eZDhO;e9>fipi2NdR6rDg z0LD?D0gB35kqkh2(FwVlS{Tlf--^S6c)=1yPy~KR$C|tX@{aXB2@UCS7+)jc-~D5qQfL#oF8Uzh#+5ljvP)9U(eVvX*A zN{xth*j&&FqB>f{`g_hTief(zC9yIRf2!7NDlY;ros*i~rQcxk8Z{BHrT^Ur+46=l zCNbZyH@~Cg&0}`d@> zpKc=!~KgPfw z0F}vwLMI$>WUTg~soTRw94q(pfDGYcODL0G$d>j`5qH2lD4zc(;F)qs+a-Wm4DF|z z3XF1tz`1WUw_m27`UG2Sp5LQL))+3c)h>?|PFH4)?BNb)QAdxCjt;hfG}g{yK{G##p58KRK7A^(~_Cu$8U! zQTut@#Of54$b}jkjF3#ZYZGk+lMiuX4_2j^gbW0F|1MT{q@h^7i!-HV2A&|dG3tpG zUpd82MV8pEM}@`$$37a!x>oW<6WWkzfZR|JoMki*6RQ^CS-B&}vXKEz3EW}q*@cM` zE3>^;G9J?z-cE$U0bV`mE38lQUOSuJqi> zJjsO2eW+B12iAm0tfPK$mKsxvzM!Y4yKb#Y)eScvpTYO3^di#U&@CoegF(93O!RAZ zJ1y%dzH#qx7BR6{lyO;W+Dx%gjqb`|@!&ztHjRX%tMO+QXp2VbTvL@=5y>(Y31SY9 z3WQ8cZa;nc6gc$?U?+>M?zPf~nxHI5Azq{%SX2$>6?wH@OKIA*-o0z`^Gta&{WW?# zXBG!1Rx4$>-Y^@!o^GL4%FAEQ;t3G2pfp*;eV)j1PL$ww?uQZ!oN)No7qWdOf`KT7 zFIrq&w3Qw9-B~=$1@htpiJseF6au7Ohq2O3lS=#Kf*)RLd$BhPp*K!UNIx=u&bJB9y1gYS9vQ;btt{+-8 z6FH^#lJp_D`w@+ZiUHk06rOhZgRg{slZAXZo4g4SPs{m~?lOB~bp5Ae}(wD{FeK_aV(|eMB$!{Il<# zKyvcxEH58l$MqYVhq(3Sfu(-B%X;|aT@9?fyu6;+D}j>6?d#@g(Z}gYYCxs}hQ(WI zgtJV*VSQ46#yiXS(vGd`7tKn2>6{Pn+A*l?(jxOF7wp20u_$IgT?-(L2AK+~>Re}R zf46)cjVZE@3~JjuyHoe>OSl!#g)lyrD1L;=W+xxza4^+|Lc3t8T*YRp)!~3T>zO`$IBPnZ6`HA>mxYs9m&t7E{rkc%5{n_br`O%QH$Z@ z1)52%54Ew#yde)*91e%i_5o4QK+oR;HUt6RuOjU+d$Y2py4tQittCO+F_v2+A>+g3 zhuP#IJ+;{DSD>u53IZN(Mo!b$=o?5iMXFe5&QC0$5`*Ph+KKP?2UZ6Jl?>p=xx2aP zfDLtp-RIjCb{I8T?={u(bzqq|{P?Sf3!xHm8S^e(g^``95Nc^&*OYp6244*SN@8)7 z0kub=-{;QD9Is9TnlTp0MLkJ7_L-%KO!&1ODS}zL4#4pSPKS0dDHFW$wF?T|=NF)a zE;(oepOssC&leToGddJ29b(b={# zXV`Z9(t>O|q7l!JpN$4Xlb?S6x#Az=7xj4o8etF6GT_D!9!Ps28+DbK1n%7v&DMMm z!qXy)hCE>Uthg+iH@w?EL-W*vS}ah+x^E}9f5(F00B^kXThH&XE~Ek!3Urx#H*ekp zBtUl(|A$}Zwk{--@Q*Z>9)+~io7Kd)ZBs_WSe z2kNht$(U1g)c4Vwg6Wd(^I}*@mk~zWy4B&bM6;Spk7r&g|Nl0`;>KLI%Ga$aRahCc z3^~c93zlP~o%L+xGc0*d@gfd`AD_zvACxF84IpSbS$f689DC8M6{x{_e2W@e-C>=9 z3%H>{;S7P@lcg2^u>PERjYCZ1rLDqYOg2!cS;QWHFsYy+L@JsoQo@J_!=EiF+D9dS z8mMtJbjCG~J+f?zRKOZq23|opU^8-oqm_;oG+lxZXnC|EAC7}fIjmyu`{#{6+Sp}O z(GWTEE{WPMA3l#hAtnm4j&b>bC2-4FCN5>$Akm%Vef#+Jj;3Ixjd}>B^Dp>23_%ae<$rB(*IBlN7bbFV)Wh*$=+2H#Q>7 zAwl5Si=XdKwB0f>ZmkNN?@kc}WyM_2du_rp7E?OcDY$v<$NT5U+aZOAQY;NNKfj1b z-_QbJFZPOB;=#(P1da{0moI=i;~<~{K1-dkf)_Z_wTs6$*KlP%#jOz>*-eLsxak>g z72rRH&w=Z63t6(%CY%K*tTdxHf_-s{&6S0}VMh=NiTO3(z4m(`(0zkO%3clo#lqDW z#iOAQ*V`Nv`t1zd%gGMwD^P#L%E|u|LjH1`t<#zKTm2Sa;lFe;Xv0l5>PZnNrr6w2 zQ7i6|cYS)g)tgoyH;FTsEbD?b#aRc$Pw}aMc4>4Ln6y4WBrOBE5P7;KXfVj@$2uR{ zP+Z1ql`{Eb4JR%)>}bvLbu1?9e0=a=qz;t|W)gW`O@)#pvDXdE*cJBfp~W73y=nd$ zIh%2NziP*LJ=mXCbm8$#kc!iA-+{dnlL{h6K#E4?F>2=bL2c+*wSMCo~CUHVG%eS_L5vxJ68Q3$)1z{P|V^AQDQ8EF5@ zi=W{dv>7w$N>M>v@Wt%Kp|||M%43KGPU} z`@?6)06>i8g!a;10;{_zv#msnSkKj1)34 z2IP>4zEx?Dfg006DOYWV^XJooe?D#p(meD-KC4Q5CREIF+hNQA)W>B{K5| z<<0Vc4Cul%AeMbX`Gza$TH1LXyKC`#E7foqTEkegAq*y(?*~oK(w#XZnp!n@WNXv3 zl?2wCe|XGyi`T_HZ0lxExVhAR;t^rlXbq-~F6Ia|lGI=h!rw+TAAiv5aqtyIXTT+< zUy{}$AW_M+2Q+7G8HN42dUp)pSR;cE*RzGpN3YK(h&on+<%}}eTKIpoQZxWPH!YE{L*u6R=2<5p-$Iz=LY!H~7=lKLtHtbIKk2!I+wqS+`0+v;LDP$oQ3U`c zQeNS8Jr&w@O7Fhrr2ac8vHl{fq-!5dlutmnym6esCX<{oESfB$7X3V$y-)FV;?(Ta zx#j6RL0siBIJha3qsP5=KI?_NRSvtvfaQF*3#DI<~vTfSMeb|cw<`e zrF4>67~8}yBQ}nU&+rm$NcL-}6@E~`k)_cKMquHO-!bal@*Z6j&eIp3=j(+!%yBzb zkelh|muBcPolh$~JS0u$7X#sN(|4if;hY+UNM2v=ZK#8Z%^$%(mW%p`tER4wwR3YU zLS6!Tpp^AcAqJ;1+X)Ln%aZ0tiO|Pj!MgsAs0|`l9!H5v^_KkKj#GcYCO~|mjQV*n zoUSf1BZPvhfn7mls+bOx5N?&>fXOd|nyO5N9-#{nzudno;qF2bBLk1-8&NjOP#Tx| z4u;v1W|CGj{+$c1*^rPB<43D|Py$`-{EYBro7@kjj7Dd?eLHzK(tf-=_oTcRe|C1z z;T*FKPGN21UC9C7=Z+UY_Jp?EaJ_XX@EdbFAkPGQAsT!AEV}}mE19NXH#$civ>fD@ zlN-$$fh6&PV1ySrHyhk4Vvg^u@F1YmW%tZOGXnB>M`BXy%ou8WUX!xFYni8)U&)#4 zTaq?{y5H2&s!a!wIEp zg3<5sdh0NJLgC;;p^iEAOQkd6=GEJlJX00pXqu6Z-@z}#!}9yC(4OgMkekPSyu(n) zI3a@#;RCC!fkp~>#yJ2i)hHV?jMx5{s73OJvn$@9E7Pt4tqxZWz7NTN-t}Kz=BGb} z8uwFyU%J!s}}LJr2~61y?AOAyDTP@Hq9q8??8Nopc!ZF$G>?y}dJS z12rm=cv;^+YQ}x_7?dO4Sq{6C3bYlS#~L+J&b~E1H)*dd<<;OdPP3vUKqoQ%n3I&t zV`y{Tq!@EcrT@#}YQuZWKB+&>IT5(ijhAG;I+1~Ny>qLMzQTpT!UVE7G!5ScK5_^m z^LzJLEq6`AI$%0to^HswAJ0{Jn0j}P;f5c9^wu!D>GKDo;GC)Go31+ z;;ZidY>a07?Y9s8wp#pP0}Hy)Vl#7dhI;FO+fDqu^KK4(!OqS2$W*xp0=8WV;!k7S zw>y_D&yRAz2TgM<1KTs2jauw?W6!Htvy>Ce3r3O87uZyl`=r`P$*PEeV1ry;r3!}u zjZaK(oYi@%-UTk0KPvUwn5Je?@)RX71+y zy9g0~E%#o?qCN+>@4T7`Vrrn`YI(MUsQGOY9;>V><#?g9;YJ3uK7zTLR8Ub|_LI!d zJ@>b)LkWs|I9D1P;zXvku{S1f(d?^0S}Tz9-R!N6m(6S2q56T1=s>!qKI5^I-WHkbwlXhMvi=EdHwTJsh5n|hd{Qe8r1|8S z*0|51Irm++C2^KS9o0Pmqr z<2gXi_2Ame6|f*i_y^XJ(zuUiWgLHD6@Y~Z9`aIw4lA84OfPS$){fS8aZUkEP1zH} zz|qS{$4b~7SsL-@Pt$QIzI*&uLJEtlgr<4z<+mHGlOK$pN*Nly-(%&z15ENFi@I35 zx}mB)Fj}hkHbh5v=2TQ$dPjx!D?RF|)-aaBtZ-JI8cJ!)reRG`fl9FjoxvB)@BJSK z7YGLe;3KgqOOLvkVwbtm2C86Z0UqMik4?@OqgINF40*pE8r^&RsZWj+UtL>m!pRwU z;Cq0%y%B0+PJ3R~#%WWi~xn0QCiAl+BJ#Wsg<6-Jv1qnpCHo7TUB_ zonE%QYSE1L3|o7l>L9~V4rfmX2#srK?c2L_NSL%fX+AyJ5AXO&v%7@08ij_ex zC|zfMiUMz)CU5}7`+G%=5}(uK6q;WDvssQzd+skYQCt@#NfSTzn)tik^ArP-pR;9@ zB9_@AMWfk2+drkM=3nvw;MmsE{LV6zwv5xpZ+_Kv{GgTyI;>doxwmc*^#8E;-ce1a zYuoqCIQCIT5l|4ZP^61=5U`gzN{7&UXA}V`f|SrhP&xrZ zj|39l^LCH>d7k%s*ZSV|t@Zu4vzL2Zdouy<-1l{z*LfW0@3@6s>r4-|!o5S9L8|(B zw}i+LkrkX$%XU%xY_jEwV?OzNJ2@;QHI>64pa2{7uUR#bm5>v(FWCJUrQwKWW8TJi;!6kvRB&F1)`>7I}8q2 z9KAcTM@WwumV`FidC z)xxLm-v|2cWyc+uBxyl^lN)93yQ;W*w9bBBl^m^ivO6P&D^bBkwqsl~QHGmus=8as z1>($aeXGYKN!cK%T3!R;i&;Bm&!Nv{&4;}p9mJGbK<8rL0>^w5w<-%t^nFhTz9~r_ zqXGF>z8Yd0NteA=9xxIrZ+=>U*&y4#A|-4#PgC9oKZ;kA+l+pRpI-&Wd9>gECaP~| z1#xqz)rY+$DC`h7cttcFG{*t7%gdW#oo$tHLaP6@{zyq_Y3bi;_qRb}Wg(N@PDmkq zu5JJasRVgxZ1+DLEi$AYt8}h1D7?=P#80l-{&ljO{3~P8L|H$6C6_AS&7v0Xq>;)} zzvhkO>nBm|)U@_k{=DE4TMj0ub*!nc5l<;4%%!Aj_7fL+p*!`Bxa*2sf-n5~##xff0{j zvasX?Ra#B4pcf+Iy! z5jc%NBd3`>d0B{&gdsB3HI^mMLWHvz#LN%ZxI;GGz4z(T#|D?a`@jo>-Cya6y*G8< zCLjRz9&lX=?OYCAm@BobI*vbPvwXjCZFNM3g>%|0XL<^z_jTT>SO$mx+J@iomk4DS zYpU@428^seUeju>%GQNd*YTTwwNycct91Q?h|&DCa-6sZNt(GxSD=U8Zn(Z?ypk}|+b3+-mt$1)=v9rF zr)tpt2??7n6Ts=HI&*>vL@aA#_7r~T?zQ{+$7|SEoJn8iiRGQC&W~U^HmOZo%29s5 znPQ#WA7&iJ+w{;$XdB?IKC_89NqV+ph9%LPwbao_AfyL}ABDAKa?)~{anB3vMqNjk zcwqqC42W1{7Pp!2h0vHXTWPB*(QN6s|D3Em|?X<_~w%F7cM>yx! z2E|(9kdxh#tS77q!7;+GG|O^$c4S?*2L?!a*Y_6FSw+lVbAbZg^AHFB7qF;X+GIIU zSj}`bqoTX-e0_Zpo&LApR6}j_XiFiONzgJ-00x#JSS5I#*~sCf?HWNCS~DuK2rL{e z@b^n8D&mG=OOgSi?KW=RYMlpt`BpfGSf8RTX*4q;G{$-(fj8=@{0Nbd>VysscUqef zmG}HpTS6A*#eiy?-`M=uq>d+92!XCG-y4Ls4x!9c4kp=Pf=m8R=H0WA>wo?Am#0zP z>9AAs*&th^uyBQdXqGS|da_oG9|YYd8er*h!`tw?|9IusQR*0a>vsK7DJfo8-{@p% zWtrv5(tL=Ht?zZiz%lkJr!P!=Y5g7O$6A`G5`LcPC6;O$>z9m+(2PWHJ z^`xqUF4j9auEBPBMgTqhAuZVL`^+n@#BucbdUjzrhMCs7>pp#PD72h7MCwz;)`(er znfBZJW}ZBd_w>M&$QcyPXZ*SToX?-|WBsjVHtT8ziXRQYR(ogyQ{-Y_yd-M-S_aTw*xKNML_CSOwvm56k6${QCkmNL=(x{K^+NSKDW^HA zPi%=E)(DCW&+gF)xh4*~JP0xZ87R$$E3+!Y3O$&`8n?m|?I5Wr}>#l?SsKV)1 z?XDMxvwcWrEo>Q9rE}S)wdq`0q_>X`9D+}70RSx!D#3%A8%~KS+phfaZ5{D_59VKj z)fR3yKPhKVXH8c4RXl}iy3c+ssNIqf1C>i}!#ETf?P%jx@OOwm z{1_>vPpMnY1HsjLq;>QdaFr0qHrj7wrVFeF_SkUh%1Y6I$)DxScs*OXWBo}owAOUD zjwq_FEQ3ENPS!FA0=G60djbLTxAlR;VU@IDaJ8wj3TpvgP)N2Z6*3;9jmsZqmE-l) zR|;X@fwJ|_@^6hn5G3NSg&?&Xb<*tz(@U4X4z8|wwx@otXt=c^v|yJbVp_K5r8fHv zId~S1BpbRQGV^E|2vN6zmw#EteR0Hd_@|y=rtUb^o|XJ8_{2`oaX~IzNNfllG!~vM z&YjgqROJG5cyyvfrZe%mt~u#M8l&Kah&O8qO@gEHX%QEEFwT)mtrt*&ojO0 zva;ZShVD?FfPQACd#>W`p68)a5^a&!Bn0$#l0EGDmHViF!n`V*4A+$0wBpXDahqPQ zaseF*1B9rOqVlNaej}ky-B?$UQ#;}Uq$<=ZlJgUN+0|ZRSp2IGmj+FOtUtb^?50}#rIDm+4_RdM5j_H@5#?66e5St2pKwElTDb4u{ z>wZ1vGH3u)Q)*H~6gXecoB-kP%admZxltg%#L3uKfy#VVU%y{^coU1h&m-8;+3B|pI zCFcZTS5mZspZ6iU`%4COGN!2vC~J08Ifi_3WNw+Sep9l%BCra4;{yCW)c z^5#KsEeY~XolA%<_V<3Jjno0itLBNU>q4s8F4|m7Dc)`VqZ5?Nxl2orkmXp;eW7>k z-gTXtnta+}+I%I;zCp~=U#+^ineI5>oYH!FHX?z5xPzEomm_(_{WdhSjmG6Ab_z;i z2tr+t1X(Q^;7%a_<4(hd8J4=2B5weG+PS$>JR+VtjMQZ5+UenKL#g0}ob7augCFZ} zyZ4Khnr9R&ef>fszCg9uz7Zq9q>X~4kn5mukBWsu&X_={&0woVeC<;k%V8j{2z=UB%D4v1V}g z|Asyi+?(bjWm@NKXe!q{!aog8-Y;;ZmvH{Rk3-hi0G4Xq+qWYg+CPkvv^T2VoQg+a zcBlt}fM0_(C#ZM_PCD84TkdgETh@SSK&;zHYx*~b-ye|b=vB;~s%4U8NZJJ)Dv;cy z!GVtxljRSIv~A2Uw*f{wC!U#~rJbG$`UV#Y$Owo9(UsgM#3Ai@8;U08lSd(y99$NlCWa|C5j|CQEf#W@@zh_w0Q;DUmf*x`JsKgK1(n* zmG$U?yTEOBg&UZdR~+&jKz_x8QPhR)C>P6s8Ca-`#r$C~mEec^REl<)e|oXo$~vr)O`( zuD?^ih;V!>jrEaiDOe_Apr%Ijm1fNZ=n3p)28|sE1X&2>S`_XU-Dw9?H>$&m!i|65 z_P&(`|rgZ4!tL0L(SS)V0nJGJkrEV4VqD6;CMPYO33>;A*0JT&K5%0Qnbw(r z6-DKuxaZ85v$}Z0>*sIz=0md@1?80|erSsVAmV?4H5eh*&n6IRRj^)eZ;{tQH%gzn zLhOBqMELGecPFP|N`c&*r7c089t;e7C3Y*!;&aRBsKWA1J%_EZ1@DZZt+~-OJoqPg zK)6LAl&>gx;|z04t|r00)G7*E`&4zO#&}(?^Z&i65PE9_8;y7zAD0s1#*ry*e0Ra(!tW|y%*w) zN*vO_ew?k5YXoI?&ZVvIpNRj$YaHI+1>OSJ@1O1=REzlXhlO#ruk(Y!^-sU-5ym2H zmI|L>7POdkiY!oR)D;9t@tQvh`SF&&?S^9LHiDy&bR;H&(J4mW4bKAo=g#`=Yv`u% z9>7#)0~en8llc|!E3Ld-->&ppeGZ~U4)i6-$W^_2_b!&UgWOwIBhp9{2T0@H#*R_? z;6tCBo#lg_`PuVlvvW}bvQ8_hWeWp&^*an>h>gN@Sck^s>f;pR%J0^Jbq4HX!Tji^ zkd>uJF+M|YnoXcXi0BkVpN$8bt<1784$_vi;^G24XhNo`Dgm#n{drD8C;7&H&(}ulsO-lJ&FibzKoyaG+M2h@>8I#*`;cQSSecEl^aRF83HCc7;1E&I2 z^w+^~Re=N0%r z-XUn19Ynr>EdH=v`6n4=L+6*VQmdbPj+y?ifB)uby8D;5uM*5Z-fWC;^FQ>FpO^K= zKmWs7`5%`9Ea(3L&-~9T^8e=ru@A4(_yrb!)Qzh;Kfde#2c*r|&OFh>M0cIDdAWT4 ztoENek2*(;M}|jy($lgGW93%$W5r4@mFvYxejXVXrzX7=ppJgK^5^m2Kaw~nj@~~Q zWMUliXRl{D38t-^Ckme$t1C?rJTKs0~!HyJUj_RJ1PH?7(sH{H}n_bR2U zq090oj3?`|mp|;|TxIksHixCJr)55RC#Cbw#EV%#O9wGj9Hz{-PQ;;Ll;=PtXEHm3 zA?x`)B0AqFE6R?cb>qg3qA4Mrw{H~|do&6B`mc<6q=<+9=*^R_mYA*P8yc?`F?6Yb zZ}r8&yt2B|=4*H3TyL(btuRuXc-mVQv`l=Lt_?;$_u1IXmd@TW|NKT{61~;>6meX! zP9ThMvlEzx>ku!qA)bmp4_C9o zF7oBqQKmTmQu8|)u&ir@|Cs3)scrjrZI1#MkEZyUZNVy6?^`aIMEid+C7L_+K_cxQ zQCfAIYqvpRVUUsL*K17DOu(j3W6oW=q}8l(sy~Q;Uu&But&fW++AJ5P$zr}f5#@1Q zylhl?H*l^uCu$60tS0+%DCz9Keyy$B5+|3NmsoD;p|G*Bu}z_yHx(vZd5ttHyDfV+ zb2YFqP7%s;24Rk-K2h>!jnLB5)06dDdjprG)M8d^eV!=L$9RwPOFu%|xq{Wn(Ln*` zQO{z(U6w2jc%IAETa91iJf*kmKp1s!Ewetn2#OhaOA5J1Gg zC=1Y|%=V>H`jfeXCq2%1;l9+k&pHQnaQ1YVR`+Jx$6JIFi_sZ1wY5XWB#>)_T{?Yy(ONXmC(?}I=_ zu3A+Msoe*U>%?A4)BPU$0m(h9sjY#zV}1bv0dP#1BTU&>7)IAzegA`nDz}z8bt4Em z(J58Yg&Y<$_*Wy!J=`rz%KKpq7uXZ_$gG1MgJF#P0gn%=V_N&&6PC~B5i@T9cDwsU zz)WjYo2=(d1Pu4)!R!Jr-t3=S{>sq)3Lky{y+*3YZhUgzcq3PaD+JdGY?`UekbA>OxoOL~M z>*Nw2(rNfL6i1y1c%7cL7VRjaTs3^;5`L{7{6={?HRD^PwDQZV=O_DnSlRcDv#daJ2$2SoO7L<(G9!1gi=8RYh1^Ea*^AbEc7Qh1aAckASZ_1%>8OqS)+uEe z+X*W*gBBj>Ww)V2r<@UFCM3FxGR_myU$LL5yYk$dDnJ+mT7T5GE2mOW@EhYhbk6nQ zN<~SivH;{#55Bb?kSr0@ETG}RuiH=dk+Tj<7^-kEeX^AZO|prJRHWmlv^pj0!KhJS zOfW5sMm}091CtreyIr4OyUI1$WvV6eR<2P=FW^gi%Q1=z)K%5>bpsK@{NG7`aaHlwl^{GM>ytrnemu)+e zU3u*qrA!m2ayKl!Fp~Dko%LGZ-La4uM{dxF0)1gFlXTaUXfK@Od_)2Kgdk(`^D%yL zy4HQ^j35eZKB3Hi`mfErf_aH-h^^Fi9WmWfJa>-VpK3#7(Pz_iv| z;=LD!F&SggKL+8RL#0WhbCzA$MyDoljUaR9ElI0};V5OWn8Cw;oFd~4f)${aTD!Zo zrlzL6%T-xn&77qtai+IantQ;ATDD=z&4dN};Sxf@QNEp2F*S3od_}L-sXI}vx>$Jz z0G4fT6UZrmZ$^}o<=HJ>jYNes7|ucF4K9g^X@lbpX^>BTj@Q>(dm$Vr?vQiy5PP;$ zak}iIrMt2^I0m$bf%0K!TJh)(G`)jfhD1R7Fo;sJ_^o*O7cAE;nI<0I!2b>YsnO6RH9TnJ?P;PhvGm?DC}xoC@iIn3AJ zh(`j6kKYds{h0gHt}20CCvFt1tz93yR*`7t-Fq_@!{7h2Ui|fO_nzJS7cX2?pF*rq zu&;-%2lk}TIESmz43j~=XA^uHh`X4WyB*G0^ve|(u7Qp=lFr=DH3ieu9kieOwiP!LkD{xy9(xu z&vIOLRW5fV_TezwudofXp(CL3E)d%a953D@?Rioor{YL2pTp+6D{C?vV5}Y zr!Wz0f%EBo`KqaC2b{S>H8OpSKTckHu>53qmFs5F^YBx#52Otdn!#HA)u%eOwi3F~ z{)5rxmOSpW;NuQ7i-fKwPbgW@C&p4kqGvU8)Qcp#~t7ZVd3pB^Wl12DT{M_d*df^A6tq~8_Cw19*Y%DI&b zgT5B__PP7V>vVyR%tXJ^-l)pDK0V@PRO0yx9F{EB7`haxcObw16+So^7VmX>NmjN= zZX8I^SlzAi@n$lRG?o{O3(LBAIWaj@pS6hN95)srw-qq>Q8|@Amz&vqP~n?=+^}oZ z=K+)u>c_ZsJ6$OCP>8Y3{DHCo)`93xOS%DzXRZmx7FjM zdRVW&um#qS>=thLW9moPP4AH1?Fp$$E->68GP>vwhLyO>Zb5aYRJDLv~G#`q9T4$EnkyvWqrsp=l z6n$FJKc~iPCAF$)Vu?!Ck8vQniZzJ@3&lxb&Q43Z*&CNiM)PXMCRaaxjOFt1@E~Lx ziX~=WQ-ND;_MeK5Cxjh0IyokD0Up4chuIx|4}dZ=JFb-c;6o}3s4CpE&vy>dCAU0u za}BRUkfVybG~xC4tt~s4ogXT)w@ZEuk?8K3e$C~_PoEY>t$dnCm?lkf8-0+0eQ^n` zo2RD^$uogcuxLWO@0|>fQ9YPp<7ydfF{HSWlUfCWST-)Ioxkaq1w{(`@Q(pfm!Bgc zW`7)^wiot^nARmsh>AArY-C+H7|c3+BsB*i~VT9RmVP`o)hCx0QKdWrHI@L(XqG@PuV{&iak?H)EKhDtK#Kzius93(q`xvhe&v12F z)mO~dM%DHmx&@ryzwRNP&fBC68WtHZKsX^)VgsF*z8qQ=n^N zat-ZsGS>HAjL!F@RV6m|XoLB|M)qf-#@M8#rDdA0m)XcxI{4#m!%>PG1*M!(nXOlX zDD??tmKI9JrnV|Xh3vT?s+)g`coFK$b9z0(P%^52_s-$6fdCAeeaF0bJu(+I=C*!c z(d>-aL)RIDy{S2=JfaXx4m6o$HiCev7ysBn64`TY=f^2 zvR-o*HRH$~trW~^2hPE{fp<@Vca@9t-|iZyf57++&`Go8LbL>WDjdu*>TVEBYZc-U zTjuT_80Plq(QOFa)$MA&^^9~O2g!2)+c`XH2lnmz@(vK^{tbJC46Ax)mfpOECnnQ$ zxQyRCuf}<@JuBp-7(e`2u#{K1)8oQ872hRRd)Pqr3z&A5z67vx*pkW;A&V*%boe&# z%Rr_@UsA2ldXI=A`S15nTjHh-OTv!+HVQE-+jM&Aqpowc#KOqbnKSXh#l>Bw(v{hI zS;-qTa|D`+R%MVvmGfi}aKv)L zIAk;ZYo($-3&iK-=D0PG%n>t1NUWF}Odfhp8%aCX@zcJ49Flx%jv24Ik3`iNmD)#6 zNYv%QH|kB-wbR8L=^{3KSbncHTyvw-4uSBf?K1tj2V~V_iRbI4UxUXsPRc&LDU=PS zurDJ}DOjkHRM>@~T4M!f{s&##Ges z7@H;6AWSmikX!G&>psk%V$7ic*85U>W`S4^u9fx((&Jrxd0X{t5)U)s^v6!d`O@kw z>YKLv!Q>YyUj}b#J6aOUubYzzK#fmbU3b8D+4JlmE8>kr;!^_MMWgRyaF;i$GN#F9 z&Lfq6%?4$i4{$s#i^Ju>a*&ATvfQCcT*%#~iWU?XtFDwH-Z?I_(C6QJbI00r_zzS8`!ZZ+N4r&XFfXwV+Re+@Gb|Tpk56 zfa~NzD$&zY12;ahQ!*&trxlLl$)jytR&QmV8a~(g zJUKO$4tRKW@+xb)<_dE9qHmM)jmqvnixxD99DZX^eLW>{b)$s zl#-HS7BEtS8ni39F_?gN#Bt?k0BDbPZ^)xHTF5wO0i=7NkZG-2eO_Dmz8oj*rG<4# zdkvK=+&Z>7A|^G;*okUPeMh2V{z#>>(q6%Mi5|`RZETK=kdTms!@NPMZP%qfcR-bS zS!~?ibe`zy}EN*j#C9eJC>a>q9 z2a{HVP*Z0Ua>D-o_te>+PSd}pra{jsW7EAQ7p!mv2}U_ zVtUuszZW)%g1xSn*Ke;fHvRMWtGB{=N3S3Y{*~66*Jr<8vQ#0{Ps<)?A#4bODM$z3*JE5l8LgFjU%0sF07x}B2g*W35Zu@T z;^Jy$Ws=|*Dpxr!A`C&aldZAZ!K{KhfM5gaSeoZFxv$hNXR!c5Gmw5&gm|DV*p%A9 zwhzhdy09aUA3EBcafR_4&GpL};2zC%B+4P}n8n{mkUpPow!t0v%;4qV#a=7LQHtl-?;%ci$GO{H-;WWPiUuqBbyW3$uM<4%Be zghu}R@l%LwE`vEAof2q2faw8RBXetdx4@$@mndwCO&D$*RKjd;R6}Qr85&uBbz3mm z#ykiv$1QCv-i)iHc0;_op;}I*Y#PM{PKQ>PQ^T_i5>ZeU90G{1B>( zgMqG-Ouspgqx5%Mbnqs*UWiVm`}@P==C`0dTqf+80*A@m-lhCl)M#D=z()-i2Zmy?IyHqAe|(rZre&N0a^bhCuTCCY)1~KL#7DhdnwM7 z@A`-Q$d$=f0U$Cr(V}yWwI$3Uy**?SY45?&xNG@yykt-Fu00p@I}(sVma4jb(}ube z=b%O?eb{4U9(E#2bMK+cS`@lKhR#hF;6#l^+Ar3LBp6{k)d&ouYn5qiJO zU@+L|>-t8ewox7C6%k_z*Y{%Hv3!nigDg1nP`2E|iQo2geE$5IP_FNY_FL0OuQi06 zTsEsNjx3%dJRj1Ru1>Xv$zAyTqxXOnt9xd$)OSl zd%=98T3Nj%pReB<5fmC6Facd8iri^nYgTiugTkrlz`o8mGTP`mh6=>th?fDx#P&lu zDO+Pf);mKxgUb$h6N=i2*nw+wM8K~Ux(6Zc1WX9 z0Ok4%2YoUIGV?;pwI2bbRUF2Qp_%(@Y9$B+J10Vo7P2~9@LQs?d+RY>iA<)=$2LuAE_%>wstuuV&;abcFb|6P)Sn6!o z<0RPD1~aPs=Y^t zX%IjQ0aix96w^r7xaR$zAa9Yp5XK>4vBX+bR@S$pa55Ev$XvPn>*ky8EjJMbD8V8k zQzAz_QzC#4l%^+ybH9eW?3Ue;Bo{O10yCNTJ5Qg(?Pi~~waEy8$`5+~89-n;@g}yjU!f;$)A)gVZli0fij{GuuVN}R-j?>-#wjeEvY4G!=-+b_Rwxv< zT}W^usYRVTm{mUv42q>%%$o}XDOo-B{h5X4+(Q-jA!%0DeD#5G6QN;M5@2sSk@`?a>swuiLv19y=8eq-gpjGB2~Ri2-zA0Dn@G z?nkZtaQeB;0Be^7QWLw4=41$iy%|1VyY|dGbIYSXbED((9P-h$;TmZ)d8?w6Pnrm7v+@etmsO;`re%{Ew1+&<V3{Ijb#-wJ8riF$ZcfoSoZ=aoo}Kn*BB{Em=Zc+HQq%# zaP|?4>Ee#?K!Li-d})8B*Vc1=E_HqaPX>n(s_*n8GvBd zZmkpY?1z!nOGSYhx49W9WZY*!hEAf!@~IX=j*Yf%mWdM96?mVe4~YC7{nvu(=>33x z&n_sq7|Ont3&cTa+9V-Y$wvNQI6S17|)t*APa*YeBXkHMjf z<$`&$Iq(i@ZWMA-DfwGx3#*k3j0{_Q8ni7TtMo@h5dzPF?mQ))B~yuAHTr2`P#%f4 zH(p;z-A}8~R77db9^)?c=y6|A^u5h0Vy>ezaXw1;j>_ihR3w)@sr35p73PTQ`1sVB z>gVZcGON?J9ov;oW%~JA>XA)h+Kie_@ywlO1om&_`XKUwJ_!@Xp*ww=cuXD#V}ErV zbm-GlKxT2B?2&tZc*pmp!mQMpK2KFuRo#3oT_i;O7TDmYNf`B(Nu&*zpBrl6-> z15iPAyIY|5j9zGab^b+{o2!0^ab(T>p2Ob_pjZ^^t3M?#t6P3Bd{Aj%Cmoag?j0zT z7vNNmXV6p|ZiamUe#HMNq2f*scU$yq&yS{O>F?ER>92u}Rpq*vF!Kgn_jKBp zBikyW|A5b%N75J5kOOv{gspPWq5+K*QSh{(XLxm_k}1M!8e-vZ)LgCPb%5o3on7ig zqN-~2g(Rzcm2f0te@BLk3@V1gKJ{n2(fAH&GIgHv4(-=EW;ii+IH}J zrw{R>xx)ntqkkEQ;$4$p%RQ+gF)g|kDD$p`eHywrKw;cr^ z_XM0+piNJ<8y4N?IPg|;FDA)KBI9FFS{qj0{c90-XW>t~h-ayvsPh{zsjfHfC`7`} zA}A!J`_9!+_kyWpUqvZ)RUkeF{O<$`W>@Hfn;k*&w-3V}3%5y{3Vm5(8M;LVPV|djaS&3G z8EB5d1Jr14AaFb@8@X4(crJVP9w#TN>t4!V)gI^t{CA3dYue0WdHxe53R5%Rtcf<_ zwW{S7>;}gR3CE#!1M?yan`GQ*2uSR!eYtC6@1OqO{1JgwJpMtN5*}<$-3@IrH_DJY zb8A%p-rE;RHBbN`T0)hjp^6P)wMJb zij5@fTA?!wO7E9tCf;MG>U|r7xTY_!bRLZoymJjZu@LoW<`|!LhMo}GtED@wMb>I7 zi~~6jKo6>D^4OvMoO1pqNa1!z9d<$^+>O0dCeb9#=?+|f;dtQA``M2zkv9hve9m=J zKMo9Ahm@XP-7wm3(_Ik=a(na`qb)|HdH;Uvj)cMQ1+6dviRI`Z*12S?OnnvrWg!Yk zj9tQuvzt|{J+SPB7L-;#tGrZcrB#@$GzrRDkb(jN-}O(BP#x#hP$ukkhbZAJO1ef= zrPo?#0`#G6Co%&RZ!G5^eJMb-&a`!EgiE$5$U?Q){>U2=Cg4hwA;x zVbAX^w-%}GCpYMrAfAyWZ%^)PA5Nb>-5M{I4~^Em3ZkaKHv6%|kh|!wSkG!STzmmg zgglyW9^`OBuNQY@^PH|rU!JZptPz*`riBb5CPX`rZK${XwFLV)@B|yBhlKz~TA#GGfq0)Kol~$`i^CJpoBWH(*;e4Z72t4lS$_ zGeGceg-)BDUS9XNG*y5Du|c;^#PD(L_XK6G8rqHaKWm<*G>9cm*8}oB6W*MSe2}%7 z)FlN&Ja+wgx)7tug#tla<06+y#S(i{5$XM|mhADduh#>g2dKvI+Y44#TSH6be53>n zb;*QGLNUg}c1)uK{fO%Dws3xI>`e|^cO1y%M&gRIlyTmnGKbuHsqHXN zX_`FKk6_zK7*?L?I`6l3uhW7fW|HJUz`h1P<&B#vP-LN;OdLCYriZ~G5M@1 zJMnHiGy6eica*{KC5umIta*8v!C#YWT&hQo7McX{F)Na%ZMe-iGF?r>skReQXIoBh zX~cAN=Kt(dUOcLwXG$pOIxk^6((l~KLY$xJBd`Z~o^S}^dsF|{54lb%U_~yXhC1Ed z`uwvdNvwT-F%OExnKdyXBZ2PxVLG}dPb%@YRuL~`=1??8D>mnHL_ z|Jxg4Gu?cvwXx+Mnkw;nn$;gq%lb+;62;AVK=S}e<2r~!U4WYs_n$Af?JvuPYE9gJ z<+yIv9pcQMlOU$-me}d6Ed0>ja?jC`ld{2p<_jSB+aMYh@+0O3z6v2i7$R1G`?wz& z$b}gZBwPi{!Bfq8s(f)LD8!S^0Cr`yQ6;W-_VF3-zrZXDc@5aCVWzO59zB)^w5Wu{ zgz@d)gi*2J0ZGg^uTRR6%`?}m5i7`e@uJWKnhSv8JY%@p1SW~sGYp@WeMUELDlD9{ zwb@juQL9_KWbIEIh>MTMt4??DB{j$dHg9Ys4)Z06d3CB z4tI5lwnRLl-#j$_&<+UGJYkyO-OWYor;9AxHq^pZyGbrt7~)n1AUvh3xn!G*{Rfa$ z)^@1q8N;aV8bF-&LF!n4zeTZ|E3x5=Ylbs9rh{=EQQD8w-vyVC`Wst!B>AORG04l~ z%~k9tGLigKIM580+Qlpn96ojN3bdhm70gNEGWuFtE06yR4-z5C|60gekWXigk2yIPNyaZL$PNn{J6K>o zb-fogq+CZ<)coQYe!3piHb^tKW8+d9&Yji%%iB88MDFJpLx~H~+*+ z+ek<^K+*7~@nvzMtIY;zxU1L4*G|Gcysq<{=#$WgmXwsV9ZC)Kr_;-&$LH?{;3L_cHM5!Aj9mXL zy{NfuDI|aTskPI1(;@nHn@C_-VdsN<$=u}Xy*LFw*)HK>tu^vJZzr{<&3%^xn6w?3;XvYS}w{n>)MCSl_}Mt;CskVIzqkq?wWVX z?RN&lKn_{g0$2(3=Dl2|PMqz78NMu-@kCC&+0zbPHI>Lw7=`2@W7FESDq@wWU1SWCY4;M{ybA{dQ<2z`jD(Nmq@`0D8`_3_@MVq7ZMW8 z|2qGzvt=7XT6J~}Ioxl#yw+Q8j!C(;``}#gyX&~gV>mog0uhNs15O#=0ARVknjar7 zao})N{(d#Y{BN9VlSYtfi23}u3$z=|H!wTsvORt@n@f0c`DqaohCB^z`S8_Ih)D+5%a039)YmMd; z;G^XogpUpoz}}0~|DMq_kjU1Ps-irHbQ7xLj^|g2-hAUu1OKJ5$HJzS3EyOH9zK~4 zZkZ}pU(Kg=-vv7uV-bI%2LAt-cqO-JsIN6-Vm#j|RrZ4ddri|#zU3?DxOGZxtzVHXvgskO8lxf~FY*hNcF1}cy1ozUJ}voty912$1n?Ou z&^;px>tMq7IO%JlT8q|P_p&{z`=w}#E8LIL=#C`C3{Y%P-SKX7O@oehc6c^jyec-& zq&7L?#Jl^*+b{dTQvw6wFPUhwedF@zooZrL;~)mWT&V6*KcDeKhmi87R`?c_F{&&= z-(B*GtUmLjR_bT-B^QR++%oiFyVQk7I@%A=s5X}~v$k6pGS^nwy6uKF|UGI?-91h=UsO(|dXMBI_IH^8G5n}5b znnKh%CQl-*KCh7*NGEvgYXi-HD#WuHx<E&>gvtx{S-3*1E z?w#So91!=iDK2*_zEAV|7uY>;Z3{EzdjKCQ8SVISHLLs0V|6*XVd*V&YaDm*Twh)! zj~k@%Js_9a!_s*cg^jN^j%$zCi<7eBfddIj3;cs@5;i$sEc~;nwGKpyhoAmLX$4OS ziBFO9(ZnWyFlu<$BUH~)Tf)S*`JC#&fVtKvApu9q$7(<1^ap|iobjWfWsFGfkk!Y7 zA7x#DqOPgv*)vO7y_GqG`g>1h>sQ0LW)n3W?dZ=B&6;$z*-vKc!a9|(GSMM~qFJ@; zXVa}}r8yk6$5$rXz}Jy_U_#^!oSEIc$wG(*V>}vbd@T25z-CsQ@bDz4-gAb(Y$@Oa%cIfla9f5XO1?+R7=noAI1fXXE z|BOdz+PmJ)BT7)u1gtW1Vg=?o)KfcT@-kYt`ldSEJa%&xfwn!#X&N|r{ISL${91iz z@U?5##P8XDyJv$u>Ro2p8XuOkZVS^`Ml&>UVN6#-1`oM|eL6L+%gq0sNXaCv5?h;NA3kQx z1gaA@sSRU8Lql$F4dA0$cocq)7Qz?$Zn@7nE<{HEOL<}Vs2A-5Lb2=SC1^mZV2eDx zvyBMZg&U4THG>t0B634R_h2@>p16RHF&Esqm)ENUT5O*aBzj>@?3I!7 zlBJ7H`^G^OtSeZpYxV!`^xP>p6L!*U?dGr+g+7oit*k`o;W^^#-|e~mnuAS! zI9O!!9_KPS`>L$7+=hg46r@syHI;%{)He!6R(yohK)R2V?}HK%fc2t%{f;AV3tlYO zn^}QOiS$#!CuJ(#lG&zHZ5I8737%%*PM8t$Na$ZwN51F3whEc8-rOQgNs$q6(eyB*%R7#IE>15tEX~xGK|#EpE(5)1zC!|8B+05 zU`i>m<62oFQ8`m*sQ0pU^RhumpQ{x%C1lZ!;dEq_^Vibjh8IY8O31YGveNYOrv$_6 z3Zed-%hQAPHWYu-jb_SF^{risJGi4O5nZc@%qpC@C*t-E zIbH8Q$nyF)W?#j%&6!`EAUSJ;d%5jn@B~1d6|HyP{RWstEHGnx>&A@{`)OPfz-!_P ze=}NT5d_iFd`~F5M0bE=^GUMDu3Zw2jBV-hzFc!h!E(q59 zBxLIm=v!1KdB<8=w^B4&((g;kttUiBh!!B^+UbLj;qQSmo7Hp+)BfPw1y`r;H zH5RC#uzJ|!!7XQ#Q*J|$?PGvqZ8H+E+~mFGz97C9eD>z_H(o%sO1RKmqhOo3*Rqdq z=OX&~axE4})wyPcTHu5aUiDP?IyUweV$Q%bw43Jq@uh{ixh z>WG#De=?4nbp;ncTs{_hQo<-rHA>}C2y7gP?`cvsn$5fu!JNexq7ejee*K-|baif} zy#b1wYZ#+~NB4$UZ~;hXr33OGii^d{KEK%F0g{@XPT> zQdf>NG`NkY*CR2TN6kaET2v;*A1!5|>gr>)Eb)3e4bh*)ryxHLFzJa3J~zRd#|NV` z|Jc^b76;N%B=tL?G&h|>E8Wf0ORCFWb*E*FG{Q8h+_uWgA z|Fkou4p=kt(7Iim7$(oxR*%q1z@$|my26;7<*U)%T`U*z)r z{^=;-NycJ3dqCT)rR&XyMMvvJ7xr22(D3IzoWBo^S%*Y~l)pop!sp+2yMGxL|DiJ5 z+_IhhhE3Dp)%KI~_r;ELWkF0w)5^Ps7j7%PEfyTqqDSuTNY7{dVR=ExZBY97?<5C+ zN8@$Ls@;mUJb#I!J_}_k8oLjE%cmMiL z3Cy`vR=pnl-ER}96`+rD43)=lxh<^ZA%hsV7@N1C`PxI@Ix-On+!J#2G zmm45g4nhC;+jT=2GXKHH;2tOg|Z*0#F)bg8t^wTY{174V4ZP9)`5X7 zRXC>ydvtin*5+<344ovyhk57gHOG%z#exdx=1^@od0@vC7D?vR>-TpGrJlydp5i!# zuzWJ_KK`w618_7|Wj&~$aEhdAZ*}&xSzly00FqGG=854mYDO!<(9`y(ao@P7RZ z`lAM;wY=`i1JLvX@Y<$_`G{}>->X5QDYz3gT-6x9o8u3+rUwc=o2x8?h|I+%gU%4N zXHsNa>AUG%bnOF(G})&3=t2d|)se+25xKn(FF89RV~7?pugiJ7!=4I82X5)~<`H(6~}6wrZkvTehuzUmic+x!ONRpxO3502faS+|KIp;$4(t>t?o9|IQ;4 zP9vTv#pz%UWs`Vt!mb_6MZKjy9;HD?AA%JdwN!(AE>D|6#l0tDY`ZH8VY305^%z-Z z#~k4ee`P&k;Jf|3kU`zFj+60w4*fnb@156sWR8XBNJ&}xH0Kf8jThmk5OcpEG<@KJ zMu1}cxah+J3WPWgejR`TO%xPAvT|_TKxS%RYV| zR$V0(Dv69VP$Z)$+0h`g%*>=@gk)u_%&a0KiR^63$QB`#J<5y|VZBIIrt7uFrjc z|AG5)f8M{;)x+ieexK*-e2(LJ9LF=-wd$j67#O>lyMzueVe6+s!@bCn-l(T!e&!an z2aJWmh^*eYz$(>K9~zPJeA-zs_rw4}q%#^nA2#1y+u2BT%K!Bm8Nx{j;bLOkF9JE0 zX?NivV;#3YWTc)t*qL*VPvC+Gx(+b8rH7t1$$=4%f)jG7^y8ZhjrsFq^NStX1O;jC zql*g(pYacI#J=nJnvmfg{n7bjL{7|wQ}g3n>^+LZl!P7FI#{>N0_{m98#lb5?n^aN z2AFfj?0}ubh4=T)=ZEbeB^~>@{ExtpLp`=RK|bNfe1aQYYw{^ff+|;jv3N%sMvzh- z9-abSb*-n={IyCdlrmW7Ft3~L&ug~fkZsl@2U@oZv_l6D9EgR~#{erQ!CNmzd>dql znf+7r*8Z9d9K7rnCgaEgS(9u({7xF~kHKyn`mWcQ(!yTnGNZ7QCc#LK|Mt3h?VPmK zkB^3dqkQ+@a+;OIJRGd4KBaLEtHJ0Q8(w7e=x?UM{fCgG5nF2EvUyCEh6aa{7;+NW zF)HUa!o%OZ|H_+^2S*`qv;hdCfKk`{{P)Zx<(PQH_jlMrRtu6E_P=7+aXWAmH00!r zA`WV+luL$PEAs&O<=WN=fC<)Ub6u1@$#=bjlav~-f*2SC(Gz+?VlP9jYTEE;FRG4A zP}@K2SHq_+8ARi*M(mQ!ZQvo7h%gbxt(+jI3}^BY(ss$UAmP_ zL0NJ{Q`{%8@>3WB0E`ps^hnGiIrI91Nk+=Pz!->-B=Ld#v6eA@foL9pI+bR0JF zTmg9lW z^7!IK0h`J2oT=|o7c4egu->J);6LYq|M6?IcjKzW*5K%5f!$Bo>K94>XDRm|KeBm7 zdTQ%`zw1ALi#`3n{u2M=n*4vxNh4G8@4I>{tT=2s)l{n}%G0B7L~9pGVG~Dc>OjOd z#Q@k3x$u^bv6I9yYAgP8D6~y2_x~qk_@7^2=Ktb4^Lg+8{@8zBAL7r_|Ggmpz8wF1 zK@jEt=j(q@$bVgrUY7R{2X`$mPqaf0`>U(xqq!dbBP6oNiO=*WcHup`8N{j8@iFJH zaJTf-L+xE$v+bWz`A!wi<~S`6-ZSYgl!CD+pV7Af7U{4^t_wQeht9^+>&biz91G*o zv$G3%qVy{hmhq+Dw*dzH_uDSdg#R4Q`^GpwwRtx2yM2D zL`?}nz$jMcs25nLa_STZbPpEK5endb|Fh5syqM$MzR9kYp9K-!X({z$2e&j#>g%Zc zZqBG7^&Uz6cR0OaFw%7QisVP9^_4Jw^8gS80v!thY&$rxO9r5F$g;!A-5V#O`3#%X zgze@$a|==-$431Dw^kKpYy?8N-vY}DUfVwh-U!*AVN7!5%Q9+h+PO1Q*j~l^;ORCL z3e?op>oboFY^LJx*`~)q1CtC4EPz?3XZ_}H8Yh=6*e$e%|y&Wo)T(3Sw6l`1bolR#poLX00D* zn*BOpx7mOXhrK*fT}AXKLBPz*yL)5iR|TOHA-cAzs;eND8TAxPgtgu_VpsK>e8LF! zWQ4FNvA+)XF3lmqJ@mv~)u#OS2fUYIIdX=W5Cybk83rD3bA8QgOZS&Hj7GxR-3`j! z$raaE%&z^tRAHw7gaK|Mp-?F7#}}xs@LzpCW|upFk#&4DkD=o= zAf^y}_rEKYY^)duR8@>0D|A?X#=na9i~`MQ6#NLImUrgi>xLEJSL5bf$02$t>MR0J zdgXKHa_pviiwO(e_0{z(gGTW;qRvMfZLyRj4Z^bqPMl zqhskMQV&W%3B~8eLQkV4n0P+~Oa=zwAR0xSPlLX)%kbpB@xE@bzdr_=yCj3g=!ce; z3Sy;NjG|65u%&1MW)-M4OGSK_iH>aL!bj%B3fQk-HMeZBv4p4XX`Nzmn9s=0gv-wj z&qUyE?laba0BLY2SF|lBO2Wgi;@R+!^|gq4-2Ah}qIBo($6_6|s70z_1tdq2=C-z?k9BkD2b2OsrC2+*a>@Z_L~a z=aDb2D=sd!n<`51mvHc}4V;Pz-EY4K76G8MTVODxLM&W{K;H^`djLnt;kq;;Uina7 z7D|TX)1WmeC?HyA)t#K46?#OBwZKGGc>ycq@HcOK9eD^oE%q8GX&2@1qH&Vo7L z%$eWGy%7kA#iJf~QYbhWQ;_%yZ<^YsGn1WeXfg@M<;PpM<9uqYPnTPM3%_vo=B)b7 zn}!2lUL+|dSf@+?cT7@F4mN5{iu0m60p7QheBhX*aR1+9J+4|qYcwcv7 z^3h-Auh?B^t7np%lM@UO5+k*Q9FtB%Tos%%2m=Vs7TkgI@O=&&+Xr(*)C5#0@)@_a zgkP}8g52;<>tJ7BRC+NT06OogA0gmSVs0Z#PRHA@GC#(5=SzbUsfZ3Ku5>FXa6WZC zJU=?Fh{|C%tLvZ$}%hwZR`gSVZ^369T^Q%jysmKl{K1VrR{(vkCa9X>jNr?KG>xzHIio zkL`U#sv-IHZ&%nyS8y~yS$zg&*-Pw2raq-21IS(OfddfJJ7#8FQXL=e`9pE7qm-CQ zSkN>ziMOZgv;+Nx)cH_X9@SgS+p(AW9iECLt%4kg&*u6(m`;Mg@lL*Uopv^t>*8k2MYAwx%?9>d)Res=?ru_Z(IxGk1F zu72!DQcdq>E8ZyC)J_gO5hHkp^6*+71})U!x^R^+P#gdBqB5jmmX+75a?*3XRv#&v z4gh-$H+vTu+4V}Fg&I)s5v=0M+;%4zzmY#2f?SAa#4aG#u(`Myr%%t0(b zftM*im=-3Kf4k?3tX)j zhaA$&^~i88K6^ap#vc*hn?VIDQvtU5ZCgmvi?0TxRjLhHQI~o*+fT;ClA`%SG?PJK ze0iWtmOu0P13a-lgE;J>iyiy-ygQ^MGbZ*cQ7TRz)SsEr*Hge-BLPF3TEgeU`D~J&gsI`Rh=oo_bVqUqnHp@jP;t<;HFe{6h zg%nmDHsg&HE!Sx{H5-5`GfOc!3yIyZR5PFb{f#YbNLc|;;oq4&%X$Jwd?X<=qL~Nm z88)`^-6@AR|eJE4qUpKaP@2a}3++F60WOC&MzuT2I2T^;l)=Qu3yBIeQ0CJ)@#)1#W= z$HR^y=vsg!7{I{Z=E{uL(vh@S4mA}yt>+i7jGmGT0KACjB4VHrQ6r37SG;gbA)?}s z;c(4j2isS#MI$LMf}u%&Q5#a~<%i%+oHx_Pqkc1hSODO-@Z;W$HIyM12~JD8`PXX& zr!4)>#w#ZHojL36lx&SCHY0M7Fn-wFSQPEg3wn+Ko&Lx1 zth2KT{M101%bVC&FjXu~)H=A!fw>sx7`D8-Zoail-qqE0I8c5E8$W;k#->QF?E2qf zbN|1?rlcD-QyaFYbp^yi#?ShFIoq%~zVgp#YjWTo=i)sS4EzQhG^fKXxu^X_e=~pN z!T<+XEFfCY)y~#7F28t*UqGNzof4R6pe@#0>2h#sew19C>XCmi4mE;L>0R)Z@4z!; z90jQo{_fim%yBcUS13U~vJu4wRcbQO*uQr`8DYJS0u)80kIb>elsuIWnujWZPiNb%34&Eu9wJSTtdBxv$HdzCTn9R zYN?K5#{%X==(*o#W$`Y&TKPLVFjpQc+Wp_>N81W#>}>v59F$ARDyh%1MJ3$#7=6#s z^_h{@xnoQAXJO$+xx23t9-_f7FBEaEU#6O@y?K82-h$-AVnUyh-_x@R_S*39^Y^y{ z+3=cS>J0-MNv z?0)rulPw^e5^JFX+WUH^c`u=g;l$3y_NY9_;BOV zPH?#pIe!rVP)^|Rz3%D~w^diD6RGT*zWPL17pb3P6?oW{5d zPAecZNzE5xunAWl?~ninkk*=cc>Eokij)J;$%PLHdHH67^$0kfnGKaZov4#$z-$E= z4KJf-((|8e-_6<~ybO5#iopsoz7<^1aNJnFhuf^+LBR-n5K{Cx?~Y%kAQb5x0Af$k z^P+Q2&iq;8TylW%^}+hrc%WJHd(e1*`w|d~+$LIXv1&-$-SU6C4n%BCQg+7DGCbjD z6_F_B))#x|SFvWqh=WTbM@aY@7Et60CK3%DQR-E>*MQpL&P;4@K3Uhh}7WcumTW4dt+j5?!d+?VW$~ zaQ}Hq3~#{@VYDSNhB@(i%oQRPV(h0!$kWublLBHJ8n{!Txe%^>i35&RF`QCF+V6JW z+=h7@Z+9jR8Q1$PUW?w+Ev+bW1C-EI;E~{NwdgK!?orEumj-pLpFg-2nQOhD)@f_y zB}%H7S2{X6SU+;Fb5QY^);V$OaSWdV`2HzH;?94JuK6|gJq`+2&M`D5g9NZNiN53OSg)RR2oEj7chBv^|{*!Yrw#cv*Vt{rdw<`L5l_yj|gw z_7R=E91(d@)!JXb8<(h6U`=1^OUEY@c)_d(G}C)9D5##{srs33RjXF~H_LTm;tg@U z$;ilf%4*?3AonnBZZFKR*le}DaS)sfTPqn9~b8y^V9De4x^L%h%{>G5w#HQ73d`aebUmuuEZy0z=?lt9$DBAz?75@!( zG<`vn;xia8`&trCZ-xw08*>3ThI(kvYrXtZl@fo=at`IGq3Oo6&n$(B^z|aUd2p!- zIT?p43WY}Et`ek+*x~2nXi9t?5zmQMlSPW<+5!1957g2$e_UEzU0#-Y=A^lsnmrWK zm%R)O98zdWy{HO(2>(p8!s|sDPex!|QLXg&V?z&f94 zN0#A}*#Ycbtrq(OqKEGwrRW-WW9CR7=9}OSNbd&VCh*A|hb6$1yK zA!xslf<}{-P2iG{-P}pS9OzX!^2AgL6Qh9xTxI|xw)5*bZ93-6(9TVEN#n8gJzLq@ zs*L)TwQ;f_Aj@gpj`707O99w<$l}Xz;aH*RjYVPl-&Uls!$v;bmV!|r7NtX? zgvSC=n>($U$E&1oNTUa31NDLEK|kn!!ycg&a{6=cR8rNww1=vgC|kHn)}lFX3bkhF zN)U}65TACWIqCzJ@^A?vHf$9;EGtKe+Y(kBh=>FdLFW)em5Uw%sF*go{Tt}A=Bt>T z4RDz9QKg56Gbk53Y;R4uDFNuoYWzD7>cIygZ8U85)@Jj=jo7n#Mgc8jV`EH}CDbv( zphp0(Ayxw!wWqN_-y_w8`drV-IVcuhqXhJ0)RyuJ1i`sZSmol~(Bx!soK97Ost_pN z3ouLOu!JWWjcsDmk9w|^Wj$D1<@QW6OA#pSv14T{Qo6d7gF{32d~`ByJ>Esl{tl>1 zb!Vrv^BRu^pzNmZqE&D*xJEJ=7~cSb;6!pN+nHP!v3@maR3;6T;QUy-&e?k#C$C<; zYBl-u=0BJUz2(Xro15#;5Ez1@;8n`FbrIE~HU-6@Y?wQ$%@$JpbF%jSYd9=MM=YJI zi!6Cd@EJR;r@B*7&&2Co-{b)g2Yr9CLX90idWw zdD2y2qYC)v&)l36veh-VAUPWCbcZS&ktrG6sb>sy_l>URDtO0do zweu<2^tKhb0#cas=4xc|>ZIUZfI~P0N^qLG?VE?&zhlpm8bY`IQ9hO`^wlhvZGNDt z&qw+@JoOQqnNF)^hynZbw%J^op?Zn^?1W!3&@^)aeh+td!=>py)M@fo8N5JmfZo1F zUBYT_zsg_#4Wd$%F_oD)zO+0yuv50heyZpMf#aaSC%VRI27<))=+PtGGcRac!8DVj z;~SMG-hl9%^PrfZVqgL|u916NG*>62ijb#!QvPf9L}eYbSTl4cJuW-w=Lg$s0sqW_ zxj1UBBHaxqiV3owgT>KaXaM!LT!pdm6_h_nCfeJ#U^nUFZn+jZcuf8QGX`)C^ zBzc}gumZBmjoHEU{~zGSKUsvt5cHY<`0IcEaqEAS=>PmHtNZ`2e~jb5VWITMU3Y5} z9ba1~jVoTiDfHnBXo*nFSd9;moz~7#+8xZ%grL+s7e0yH2tn^?OIplU+u3SC<8v1T z_}RyGLnnWdH9VFe&9>|6VH2@gZ8K?&Ywl$Kb7kKTHI1>Rpj!336)xY%GuNR3VKw%n zFzGOCvuS3LlI_fC=^!7A9HIM%+ktt~v8S@ERaGNe#J!iPAF%#CqD9nZHxd_rUNsa+ zfR~cK%&T}-a(dW*4U8y`uIN(2cM4ug`tx6-nG)9DCIzwAmK_@@CTm|edv~v-TfJyu z>QWUdqmhu2v#t5IwT~8c^6V~?tDkEHHFf`+D)47LtXFG}Tj-zG%G8`Fu)OyE3dy5G z|4+789rc#dWZ!mW5=p_r_^l*+zi|K;(LP5k8pxIov6^VQ3(6H&HxHD02NdE7WCwAYD!mnegy(e>P8C>O>v22=;Sh!$aZb!g=0ZK=7 zoYu1+y#hryY;@Mn&Mpb7jESFx|LN#d>&nQY4&S{E&2@|McbQz?9tj8QB9e0jEoCgb zw-l`&+R{f9t|QL|SMDxM5j#7WtKr-6du>i5;M2f9ojpNUe}5$wqEuU>T|o@I zupC$h1DX&}Rx?X9FEeT7J!JWo)*o_HG!e$tl`D1sEND3J?Rt*Pp={IEYlF4HfeH8K zPGk|YKA40UeJXS77#drZ$vz!^UWeMzp=m8_OQGGhAdbY2Y@_5GmzluKt^syUNZLWR zN61N$1$aMYWemn+#T@5+kUsQHfFzRdk2KlEG|<ZCO`5o`!gj>eA^XKxR7wkL+(wMZS8N~)P67MWfJu~a+P4EJ@_R;3)Zx|U@3@s zOB2}UMxUZDBX+3-%szsX_*9*im!Fr9kJ1B4PvUEogU{NklbmJV%nDPcxYj}9l5%~< za*??!pTq;AH{Yx-Pah2vSYK7!%(1euXkHAAPtq+~d1(2drR;}ulA7C@UAuQn&o7%T zt&aIGTV(5x?RZo0NJQ>LR1Nhh!{04aLC5VWaE1+Qa;dV~Z6f8u1rFWgL>``BeV5D3 z#(h$uwI?MeFhO4G*~V&b*$)fl1pU+0wlNv%yoO0wW?P}5I1&)oGCxrlfc2dvZLMSN zHyqy(pOSbNMU{@X`0D-=jHnu&(*z;1 z-nz)nDfW|uhXE|Z6Galxfz0r6!hw`YuLhbUT&+tloH?}x-Zjlt72SF&XrbZxo(dZ&UHU*LN%8+Q0G`M6{d6ZNtF`W@9~ zRfhpSB|CMU?{z_jyOw1n{ z%NXB$f2T1?`4o#3ik}AjNJM8|Q?1XTX64^Ki-)9x*w;1dgW7cJX>P724_Gbbr)cJh z6H`n~C;*rD$5KApPB3DamseIsix%x-E%-8vzO?Hq&K+}73CnNqv!Wnz31K|iH}qC! zCX%mM_awUDZ#KND`9NKFQ!y|}|B9|Y*d}e*R%Z5lTnGizqymdM%PEcP2qY2V74#38IshLtav8G!&kw0X^n z>39uOV2Ks~t%68{_1C|;WNdzW?X}}JldxTEpWYS2!7`SBSjv1Wd1c8ZcwUA*(tpNW z-PFO}m`TH>)$&!xNo7;pkr}46Rht)Ao-EJO*S^j*@%^yb@~WBey?l75o{+VD7QE_j zQ;?`Mv!9rH_Q>ymMDuEO{$Ucy#A-#>1RF9g%_;4o=J_?EaL3+prOasm_xI{KX=rE& zK@XsI6u0jIrN*IhtM2I${b4~tH|N!nWAb`{9~XIjsecbO+YM$uV)K%WCIl(UF;}bz z7!a!Lmc-BQ+elng4-iKJUq2xB`SZPuf=)th#e}p4j*S5WV+Ep@XWg;A6(3B%a_Kq6 zVS(7rT+^|7(GAJh(R#EZ_d|dF{0S@kG(O`^mB0f|(I4PVN4KSqKns>aj`NKrMEdM~ z00f|AzRQNsa+(IuLHq0Z(UGTzg~2@+{rt+fV}R}9g9i=0Mb3(Q_GcYG_M2gfG1xYl!Q~3 zb{dZMi@}id!K60ZpxYsPqCwkSC2Pd-7h0nCBm-KCH$k*>@Fpm(%2fFP$NFEgvh`=XOCbTeZm0BnCh#nZ^ z4OXVeUBtAW=s$DtH`r-Ykt!T1-z5M<$$*6Do=!#x1@s(*#Mw zpz${GAcNGudDvMM-vY5u!T)e$S9-cufgG{nmg=(P(uI>+0xJi}NGT3;Z}k4T^n=#S zJvKJ*LD!1eC=7No^SzL-2P+G4yaL{YYaMN*ptd9a`#$DTW`I{ z*)~d~upCAKuq94*&k(-qFl@*+Z@%(v)gldBM?k7zFh~hyp|_a*%I@7w8;gFb`uc}{`4F%?_CweYBPy9!3gro^J@CntcMyJ< z1yQ%vi6df>luQ8~0b5A89s_bSgo_XXIb}|iKHk;=R2KXaLb42oM$+xeOaOpxztPUmRT|HZ%nd%?(WdrnLuuSN~(A9j~S^dI(kdxwd%iZIq*%kGH z7yj%JAun3g_MhY2V(3$Kz$LMt$U}4Yg1fhe(m|rt@4q=?wTn|DJ|%WoBaq2|CUG)$ z&0=oYqNM9B@=5Vw;VS`_3qLQ&MhLJ}SY#RfxP~$?Ahz_am~1#N+owz_Ryp1$j_@%z z`VnoLvX05EYV*OQ60u90IZWj;ZoZ3>}f7%bG`ro$q2er>&VBQM&2mv^YVwRg81Pxgjgf@< z?C$m-es2V=ph$%F*5~|X?Yq=9s?P~a@AYJ}VmZq-S1BsrUQ@!c^n}eMZ}QzAH3?=Z zPywF0=f_}p?mQl!>GyUqVo@~KX~)cjiiB4oOU4a4QWuJthWTQcL7`gc}k9fZ*|MiB6WZEe6{re`YSitiM$gL$+<2=C}gs0F4mDCk!=k;uL zf{T!E<17!@ynV2?@f*!98qO5VN@{Cr*gq``3rB8fjb7S6#bvv;DxxeVCiY~DEQ4oASc;i#Je~7q9E5u)pNul3KBCoxJ`e)jTKr_%=nEXjS#eHksRS^nt*$DpY zW^Jh2P1lFMF$xM6@V+Le3S0PK_%%j2U$w|$%O>&&|sVy>D(Sx}PhU^`2n{YRW04 zUSuts;uu(b=maQmX6a5F>+QV7TS>(1hC6fp!ALmCCUE3uw(lY%U_gKVb{ z*pQjVN$%(1|7)k|W7nOZJ!jT4@4SC~-}?Lx-kw=O4~uia;=hgqhC5qdsQQxrh>GPp z>xui}5fN!~D^&abeqH|&yAh|_TasitA@EM)gtOaT_>uRSd;k8XkZWzyXLj1e>e9?{>!}}4Q9SE4yZgQy8QU!;l%m&uxNDzzTrZUg^S8#v zeWG02PeujaXlUu@ z&wpu0M9?;*GX<~bFkm%f&=3ED0>R+TwcU^xzBCJqh&ar^t|V5q!1&<8v8_)%$f@OW z4qlR#C7&JodO0^uD=wnFsp(0a8;jA(O7voG&)XiCEpFe{OKX~TNz-tNGagcQ<2cQs zYpCl*;_SSK@yr3eO23M}n5!=*3+!`EL-z@hV|MPQp0F8hX1B2au&Cq8fmKR|la@@U zHr0I1?B<^&C9!8^12HvL<&@+|?+o^k02*s(Z4I&w zd?KA~#C`6}R+66u&XhbnJZIWvb#$0!_3JMxjJ1hp&oLnCbDur?G&lGB4oU{skq`RU zwntFU{F(dwY_Q}Lx|`8uOwpq-sW52IIem~*+b6E%faZD;cS}o4?AEUO$m-4Ub=A;U zgFCWx3Liza2-QapuGdSV$y+@&@aGqp9oQ)PQ`I2xTxgN#+Lcj^eO*>;r*Y>yzV zxqd#wuZ7$^o|QGO*pGzUvh)bQN)7qiMzLMcS8Fylwxz+v!O%bb%(V1}j;;+HVi2)D z;5F3~rG1N$U+EnQ$wx+8(t?G-ZcTxQ!w>icl`rb+v%34QM=9mHd3uUaf+-Ky^A?il z;0O2i_HM1;cI}y$*To0ZyeaD0`;(HAAj{ka+W85k&G|on%8U;6NRTq`${;B%c0BrM zew1Yg#mmEWot2e4_U&sLT1t>3zw#x)_&R#4ox6<4Neq6xr^dKRxi|mWrDIw5f9!w! zcnh2j+%q$IaB23^(0E|dp;`Ed3`~*$_QND3z_=^33_mRgzXAJ`bZu>|cXAR+T~gXZ zhx!0oOUlSxx^stF?u~%kHd2aXXU~2pwc?Pvklq<59m0L9R1A#8w~ng|25l*9P%cEp z#kqxs(z<#?Rsjc^{xc{Yw{luFjRCB7QrzF~-@l8=%Tr>1Mme4j^U;=)??v|Kn+6W_ z-pn?NdvLl*G5Wy^j?)@BVqi`64h;MSPXFi1%45fV?E+un8J_c#>)nz~&CL=RRH7X} z{_@nl-Bwmsg?971z>28Iw{ku%BBGtxzGW}XcZ{W})pPEX;kyivjUDIYq`+jR3>Wsn zkl(}O?^RMqeK1@8)Y%Esvfq2XTJ|w9`GW@c3wE9Swttwgw$U+t@cP^eB?G_M62roj zC<#z5_mB`8v~t@hDJet4!Y*oPNQcJDM85AnfpBj*(Xkzyr7|)yF6ryH#-rhM% zN9wT)%^@jtU}$)ph2>CVW8+7M3tMrgOThyhTnJpWh>ebZa`3eJTU4^|loI#L$jBVs zpE$JYV`yX)jp2+z%e#H!6SWe`%G=?ZS&6PZ<8G}=q0_p0-#wDl+ZE5ad3i4x8L@-#;gyl`;C@%Wa^GgAjI3;9)YB#Y8&Trhherq( zQc6#M|Erps49AX7{Q`UfpQ-iHU8{&VK?mJky}#hxJ>5~W$?b~TrGebXAv zgUhe;i{}~c?mMug-lkWJr*_7GYgeH&Z%xVek4cEo~452kyy*qld%a2R_`JM($U95u=E}mzQ$xl0Yi>u5Pjz2L$ml*%+LR4&sL~N+|`!8N`KX#QPIf$lyZt^>g#jm zfJYup;sN(8w5MT9WaB=6)+0TgOUB1n_x63C)>Eptzfbplr++W6+k^eFpI=u0dQBdU zBZK9SFG53iO7Gr{U8twBoi?d$&BVVK<@VMT{eg?_U$|vul#L{!&WX<-$jI!O>?$EW zarFd(|EJc9?dMIqzqZS}L|O(JzmRkdD=y|=mfr~U-Pms;A#u0IMOR`R^R7|% zMnWu;>A9PLdRQo4au~$w7$L;CS9?!TQaHG<<_Z*ug2=bM2S6}g^sHS z;p6hT^J6aeSw0Du64AN&`KY9%XXbj9y-qET#BM#^$Y(wbA`GmNoZW;`Nu;wpbwPb0 z!p)wlnqO2`=#K5%zn^Mmsah|*Jth3$C9m*e{ET)`kp#n!2D>t5ArRb7dQe%39{G_PgPt z&F#$|VPPGr<`LeWo-dmd6;DLH6NByH&s}A<@RsXcTi!iAo4g%Y6X8q`B)GWjq|3i1 zCVU|dEWZ(5=1c+FoZ8KsN4dH8f=DE>DDS4bOK-G=&7e8n_p710x_U-d)+IDoGvChl z+#2|DJ#t+$)Yq3B9N|4xLNRo>$)D=#D3E1JJ@*}V<9^8j{RgdpB^ivtig(vzVizvU%F0HmNnupL1Fpt?Ewj5wQq(=pq8vK9 z4A`Is&itqH@@>#7lz#RK+^Zt?DH${I+m${eXA%Yvu!G0(8ET5BQh}@l!|Y*uA_Nml zGgULaTE-YHN3&R_CpHcfF=->BN37Zrw8fox66`Vlw#CX3yM~sQ9)Z|JZ_@FX?q|;z56iy;77XRl z6YvqCuC9JDOV|GHIwNs2m-FT zk^l~ff=mFHlMOZ_PmW)G$#p}Smc=&Q7@3AuF8sM!NmD}u@uo?jc7uMbyD)y?J2=2! zMS#@sz{kO1h_a=%H7YsT8#O9%cfe&3hmfh{i_JC^oFS#pxpfDo_mz41_8w~9r}KGp z=V0pZm0xbZ3gTxsJ|=2jaE55K$S#!IR0v9!nS}`rpF^S)jGZ=OsbPGL2|A*C7`REE zl9G#K(aH2Gyt|8jQ^v-}A2g)DRu)s`&tq64PZBFpcA=h{`JP>jJGtBQY0L|#RZ5hD zU%fh{lB#y}FW1HKF7HDh^nWQ^W+@47+qO+6f`6ZI!JaDB~qpY_?SHu&f}Esa+;3N{8k+U!RPP1o&YB6%1S_uCk%tEu(2M>=1b za1nFpOja!x`P0rDTPhzLKnPoLCE%%8Tr@e4R{s)p#U8k%Z^`>4%X#N~{aId$@mttl-0nR7)R zYSHQjwO_pSXHUJ3zU22F9fmc~q}*_6NRBj!is?)8m-fg%a^U3P?Xg6)z_B?x;p4Exr{9)a`zK;**jfzEBWM2s#8XX-CyQZK z`nTLNi;|5T%{qol#7oEjL)6fNbK?wK*TD*CW|h5YXD8sKQFLR}=2hOSLrxkiryL4n zxgHuB2Th(7K%4V@VUcxsbaX3;c9CD@+dhfGy1<|yH`AVZaevOPhJveHAM-zoDN0bu zM~ap|F89b-YLD}De7&l1yD{7r{ai(@Di@E*BuAgEu&}TX{RO%%L7T^^zDqX9T>Rrd z3+T@deY+wPk>qpf(wx=IY^^XU?fzqeS;xS-*}1m%d1x3VC7Y`&lh7jtvb;1|AhP{14L$EWe>6IS+U4yo!&1mVm>-=iZnGf-7++Myn~$1 zA<0Sekn>t59SV&Q`dhrbyk*d~>YA9ip(h|tiMhEsH=a~4ugtHunCtmMeRUky7B{(~ zHMyN={*#p7G=lt(PZt9sxmwP+Dpmrh>R;A_FcE1>ZAts1dH)U&*PevZ&hWw9@pUP3 z$(1X==IN0)zbfQPGCz@IPP^jNSGJw#!6rKSu}Y#8hXm|gqAkkG&gQ=J6f7V$qE*cpMY5`_syKf6rO;bg$ep^whg(vlZkVh;>`FRH52APpNdycPLf zAL(Jg_)MixIyhj1Q$bOYiXi1^m4l`~voddtF7GXBgz1?Xcga{kHpTc}RN*(;Be=8+ zJ(-+n$)QO-I#6Icdl10G^^pm->V8ddTe%IJF1<@iI)>AdAh+&)O7+^~sxyzTgi~2F1SSzxxKm01a9`xR6lc}k_?`^m=AsPPoZGCl~=1F9g97C0j z<7y4V!;=#dbO$-K|9bcCR*UC8^vdPWFFxfl{}bzA!s2!5n9q{#0eDuuFjK#nKITj; zY>wUVE40u3;wTj{-q_p>|HD_@4opWV{w!>$FqFzi)oSAFYi7m zt_6Pq9|kw=qLOdzDgnX42U%spT&>17>&~C%6gm9Vo#Nv6S05T08!uiaB~@B{7s2(G zqc-A=pqoh`i^$O}{Z0%z$AY|eCu?`*@7%MqbnWu)IQGjl?ep|`)Wsy|xgqep{>&Q*W^uBI#bQ75w4pfx(K#lmRRD1$rKB_!blh7?;o7rnqnqaHhd|KvdM z0soMMgkM*l7{}!tCera-Ps_aqlJE-)lxVBorlt99|M2_vK*N+dr_dhsf*x;7F0?FA zy7>7Kt6j~9hjp_|j~p|UbJe-)XQB%PHRj1=yUFu zxu1SLkYn6hxLuvkcnb;bW;1i2`+X`sJ%;WNOlZ_@OvuX0aQ7Az8??RS3Cl8cJ0Tx= z;BK?0=ew7N#>VB_R_)}gV=ip#S*Dk7Q zuLl&kg+#B?^J#^lp<&tDWg^mzG$)W<%;<5}c?>Q(8!uVQo`U!XwwhO_URB>`vJr&|gq=*wk^O)D^%s%1 zA+`JtLz!X`0ZRie*RqZEMV+;|=9dm`H-Xyu?I0i3s|(K~jwAwhBV@7S>1GNF#z!A) zARg_ZiNv3^_7*CV{B|>0N%c;vf0CgRqexXN`67X7)TKb zKuRv+tB!&M#F^yge+Hz`V@ZwLRo1;JXvi{D{2I!`NTg2@2Y!g*pN4S7?WW>0YLR3& zIDhAhLZZbcVkQ_6W0?^5Dy5F@0r2QU%d?eGv)H}%K81Fb2$|D;$72^Jwvj$_sw;#n z*7Mo3vWBSgy;M}kg`DAI0(tGN^_3E$c|Z*9hcN>%r0|xt9Xoc=3Z6TEMCe}KPlu>l zB-~#Kkxt?Y3S-C8@98eDu13j6ijcS4Op)8uZ7n?5XPgB=IL3OTfw@gmiP624OJMuvtIx z9DZ>XP^_R84)Vi7YCCsMb!6|J9pd_8bK0!GQg*l_`xM0UyMZM_@kmuJlSXy-N%s$WRTL>| znOm{JO9I{z+;9#U?BUgNAIW>*_JUvT^`_X0wc7eh7 zjH6H>oGvu0P^RnIj#at95nkpwLpnwUlK2&*(6_0nZa{HSOl&Wk8y+^eboJ`)3*=%B zfNh zG81q+IRA1T`u5tNC?{hRw^(SLA`$!QZE(k7uk$3jzuAdEgpj+hl76wqrjR(BQ@08EwALWq_rg%%WtXoG>hdd7pdxphn2a-h*BKyqM!+yDBq~zoa zSJ(D?}JE%b8#BO9Oi zid=N9nZJddy}H!bve8^v(fI!I?w7eVItIAa<(}6?4_x@tA#oc%>?ND5HU^o~vwh!> z?%TDIb8ll;>HKILb*r#i%T_DJ|~R@NO=^1mZ~rd{unFmotdkALIp-1=m}evOU128F~x@_qnh&+lTD zDpJo2J2_Raz8A008@o^0Ee5YF%GPTev}Gmk-CK+}7shMGTKuW^?Cu{QR7aeNL~+Sh z*dD|Cu=AB*p1KWTe%+Yocy(@dL6Fy^g%$!jNrwz;&dffk5Epw?S@`4R&;ZHot{hq( zYhKh9MX=LETFw zc=B}Nx3fKBNDi$OI7r@E;hvtS9(rVxx`6litA^T~KO4QpWp%mh>+|iA%UjD_mRL7{ zhwXMI{cCB+_&8u9Jjf)az{q*5$3JepY6_T@X>EN`fJDrfuC;G;l>NgSAz`}#ZP8cf zO!B|J9ROy;ZKD1lYE}E=1Kna5?jyx{>r9G)}57=?~{{*-Cw>u0PIb>uUHE+ zuUE8Z_3syxoIX-4b*uB7d9Nz-ezMkB78pjTf7CZ0ZqR+Dd=pGkZYUP>+PklHU_?S7 zvWP-^m_)>XFKqcm&kk5{mzYq84g%hvY}=)2-N#${7$BoAbtnHN<_tpxx7o=6%p$f^ zQBjeUBLB^9=iWjk6ogwyuaN+ku zNf#=>N9)4>rH8Zr-Dhj-yvqp-lR?hDqmUupO&dPAZ{G`{J!BzoUF6H9y1ab8()=~M z$@@}}#C4EtuQMBT16Qpm&1vsf*Gqc~-M>yDD|@=n{K^&grdg?tA%q}lqmJiO9#M+z zoSucrkCu{gFTX|z(iA&oPbcj>(O2_c;BmHF`@-~#%Bm(tU4|m0sj~ zXPl&KN#+s~c`$t>T8Cyr7`|1mL2+@@i)|*I2kJi9N>5V8z_bFX(e6vX{%dqOc zlJbQ8BI@u8>FuIR!autp*V!V*proSzf7pBTa4h?EfA~gJhRB#q8Hx}ZQ6jTa86uL| zQ_7GzWG-`sNSZ~N=gK@!2^D3kh{#N)%;WpHp0)N~Yp?yj?_a+^e;vnO>pAvg)!lVp z-|u;zpXu~yk$u(sWuTEn;#cI4qjr#=7g}^U_h5MR)Mk;}2k#p?hR&7*y5B5yn4T{1 z(2x<01v3jFZ9?M8%D{v;)CE<_7T|jp+tPQp9XVnCQ2v5sFl_o;*5q!i>Zeebk?fD? zl$-`oY!+O3(|=q~rlc3GO+elCf${qWK@^+md$U0KbbQbKnthc&jPrPChn+D6$sqSi z$ia>0DjQ{M_ea$);KvkVfEsobxgeMBC}!rM^mI{7hn6UM5|52-n2xFl!hmZy=y$PeRcnpT!^tJ} zCAO8@3P9C3+S8S*HHP+~arkUGMdCbqL#gsOXRZn!=QWz2enhDst`S0(NrEnA?bbCI_~-j(~wN)KceqEt>7Y+_?XP5E<}=X z)XSDL;~^6BrEfvOJG2<(Q#;8JzeY*IqH&+R4j~bdw2CQ~UE3}XZmJg1O?_%t6l=1N zw?F@C%bve3Uv4lmR#Tf;GL$P{ec4fOVQo#Ls_LLS20KZ=$Q6N+s({-8!Uaq`JmUEW z`jJBsagVn<54j_I$L+x2I?`-IERp;cVVKp_tRCm)vH(M-CK2}&;+Bj}<3YolNU2XFBO`HWu}Ho?>(U7l{m2(_H+$r+>i)5C z?G*DMrH17@LXFrTk3&y?WpW>|QGg-6!Y7tk+oevFEb8Qy*D z9J<8rTG`0xu$%ly`#zed69Xf=WsXSZYc3ydVsB?ALHTR1`tHZ1bY@RMoK9>2p<-KP z>#J!9(5!9ye9U=5C!IqeGAcnMb8K{!)!pZQy8brO)mUL?HEKE1s4+5I)%?nM_JSz5>Hy-8_;2fxzIc`!*M2(qBWGtWYW&z{|J(Ac}y=u)kSmi%&M zbKL4#J2<9KOP?zOvi9$plBBg@t2s8529j(W zWlf(xy{qU|%yF8$M(Mzh4JOIv(wWo4CG<+VE6X03Meq#tmNR9z=O zxG6qNWddgh+)MrZ`C)7VCxjA^&|I%%p}D;}scZaN__?~{y#g^$gi1>9^8?}{ucsJC^*M{D(=Bq93ZL4calYsRa|cXsKYb*ab1u~kvU>*SxI zPXT#(N8sp{xV~DzSV$ozEiL)=8yhp^zvf;%${F$KQ3!X>Y*m%} zpU)F5A(ueA9=h74pK62|>U^d_KqJ4z6GNl0fpa2E((5QbAW>c5`nn*cyb;MyWUBAO12)F&V|*z2b(jM zBc{5ha^y@~@~U+EwBI$+u*xecQqXhD*4#|EoscMfO2@5uM>n#j#aY4} z{uUN|^?*iUo5i=uHpoxnFQsw6TT`*iXO|Ix8AJx$Pko#ooS8X0tpoubMnO_d)~%A% zw}}AVcoVZy7%7vfHlYZahu&flO7eE(WGKQi z1{{OZ%WKWEqn~OUr?0HnvVwrNSYG^xoQ;nhOIf%3j~w?%T%1E!av?{tDq+qj;$iaQ z<8wD|Ol)c1ZFI6g0FtQK@E0$3ZK9;Czq)VV!wxncK^DgLs71eLhIg!*B6UsAor|6nRE`&R>E>BE zS`_IetXFEFRcm!AEvMmS=AI3PeRe{beNxW-5+EBz^3Rx_@YOUk{aYUu$urf&ek~(; z=6SPornYhl&%|pfb)C57soq;3q7rb=D7cuK@bDz3rSW5sLkujVu*@@>Vjew$$oJBLhnjZ{4I*VWyX#g{?Nbdl?fXe9v!6FO40YLrn$EV2^t+Q)Q3JL zV;4=jXvT}UIKN?ywuFuDY%=(#6@Pqp@n3>;ay!Sx1HJ19Et||u)V6%jx86+JarCeE zmNZ-cmP&hxxsY4aNa~f{y>rT$UTiIPGYRhR< z)};3I6dvH({V7Hu>D39aMMXu*^v}0%*BS}Adsq4Vc~%^n7YPZJXs8up>2ve)SjiJX z3GBYUEk#P8+*MnfT5j~^>wi*D`uf3&^=LdRfhbI)6qa~#1kKLUzyHJ<`^)D0+pUj} z*iw@;b=PDhlPoPQ*{s+5Hq}MbeH;K|!pbe;wDv;crTbvX=H1GVE+r)ld+tmMzZ^-J}38;&`bB8ebK)V-q+kBvOIU_LbM+yX=~f# zrB_nvR))|EWS@W41soRuw2CAWikh~U+N4FTPsZ$RhiB)F&DiR-yrUC7tUMNWIiovo zsj)Pc^2O_9pnv&NA{!3Y7Sj8MhAOaC_P@U$F1f*S7ZXs5^-*9MO+daCv6Z5fTMw`eypNY^-IO2yJ&sPje2L?1}S;css?KYdzLZDer4pb~=ZIjfG^ zf*cEn2}2=Pabr;zrmcA77wRJHdG|7fjkm^G__d_!W`tVBrfLp?Jp__H zAmTXX=KS;wr^zlyCzoieV@~rnPh)m$8-_q%`_F?nxzRgiwOAogN-2LC&&}K%8LIfY z;m^3cQ;yBjOjFsm$*4$Ea~oPxbM)f&3;L05iMhGald7tH{i=?yonIW@ec`o+t&pN> z(9;_hd9stm3RB{n=RYKxZ{-O!;PTuE4SK=F zl@*H(KMHM@!KQ$LED3tG$)=?BHMSpebbjYp!RMLq3XG5Tk?%XR?-fh0zphqkz0>AW zua%5rk$E&O7raDKXcYnzjP^3`&u=V*?($`Wu@vvty_p;7tYflJC z57^jlj~-fmj8Q>UR<}raH2A2Jl1`EKxpNMa-CjBw!eVEC_V#KGM`RZl7f&r>9#1&G zD_#Oaw|`xvUutA~g1RNdCsRM=H*MBXynH$FLta~&$Nld&?z7hW8V-FjVql5(>GzG~ zWB=>i`#@ABVuW>EzzQ;KWEumvw6a#b+ih>%8oJ z+|rH$XJcj0^_RhR3B3)Jy8A(8#F4ugQ*v4QmaOPcn~2n}lT%oWh$`tkzVB|5n~<5( zus*)m=eX{5lbt(v4)>IABn?IFztU`qI6C#qJOS*L`s|T)mo6=zACx-x@X~{M*Giwe z{niKVx;-J4&Hd_yov1tzG6!M!Eh#DOy_mMA%g|7(yPF#=9ih}XY^9?Li^!5O1Grqe zK>v-V0Xosfmswf#;u;#gb{72nDI;3++yq`WI@-e2=9JmLm%Cv8`#8u;DFFDg@_*7#s`f9$!qi`(z1ZEDnr4kGOm z6FXbfRL~`BYy0Zf7-dfMj&-#M`Y9b<3TM@|RUn`dGb+1N;fo-{&KJ8rJd?|6Ub`=D z!u_1FF6Wn^2J6>(L;W4V>&Zy#-s=U}X1Xdz=>sKf^!Mb@Ze9&o@hl?{P9}0s0732~_h~TN1l=WoYZn(D4ygR_<*a9>v-w^mdb7 z_o&2-iVWkuhUkvRyxCV5AwkSY(da zM+FCmii?V#-m*0xB}_GpIdj=tJtHQIx;uXGsi2M#jME)X=~Shdlc0Tb zwPm;|PJYX?IA$~c`_=j!ht!FO-AN|po-KI2sYwO)(+Xu*kIY{m{+jS7=KE8|Xr{hK z-X+EKUFaT|xlIb(w5+~HZ0OB+pJpL86bIDFcFXSWECDc?I?-O|{|)R4@pb@%*(V3ESkv4N4T82S^I6K-bo6v(^T zz(;U?-$mAO+87qB|naR`t%M) zQt1r!AWVTf+wFF(mU<0+V*G7#tm((tHxoDgy@c?X?^5f`bnTtko4xvluRn~mpFgi( zI_`RUr^vQ8kp5<0>G>lf9%`D#rsRZFm7o0eSC9jlY2VlB#om?eRXvRxh5<|JY;3lQ z%v0&c6l)#}WTX#|<>2)wg{)$D+M;SH`(AZmb+?%0usL+#vECmt5zareWJ|k1`A+bWS|i{uLezGHv(E zUu*NEqoad@A*SKz{lvx?e*Zc$GUf6k@pmrfJ7#&gd5CytczTv~jXiqP#8v}Jn?>X( zmR*$I*v&GJ9OJ+#{h6Z{@&Z|U-S-RL-6ztpNV|02iUlLMK|8KLs|`vfhoMhgBwv`j zz@qQTFFmlLd9py%!M3m<_TJN9TS*YGoxXO_XMq#);s}Od_`3gsqK6Zbx<1rJx$w{FIi&dRmdj<@_rrCjugyvn5il289on zGp%RW{Fs){xTvW9<|psbw}*0@i*!YLCl!Mly92^>LU=13g+)d9q@5Gh>fM>8U6xIH zZ$jQLYbskLP9bepwaLZA-0 zuTxy1UlUjW7OL>E)=WCA+Ag#uuJT2VI5oJL_$Uode)qezc^Yp@@8n2j3+CTfv#VvY zvcqjJgQga6&>fH(0(fQSa^sF!4y* z{Scn&pNFE}e&PAzHq6&9DRV1X)?L|gQ;QHw>^>rzeE=Q&_k26SRU^&aLtp0Cn$4P* zbUrUG-yJKszGe_IKRLL^%lvhAwLT+p!+ULoV1WRwGJ{OsW!%=wx%8WAwdl&;^;IvH zvs_05S30h}wCtE5)sXeBS5y7^d9S+G_*#p~-RYLat_oXEbMo1_*&O>pL(xaYCwj|I z1th;nhMUHORWuONple-4A(upa#It|j))UXU{_6(GH#dPr?73`Ex!y)dTcdYfTeiCW zb;h3b8^d3>8x}EYnabf>yQHkDYSAG!P1lEl{qTtGPSA$TpDZCk{Q2{$g4rz`s6me7 zqv}YGeix_MH+BS2HpF_SDWZahbv?OiYig9Fl7!Xsul>NNs3Sb4`4~EX!8@lqpoI%y zQN8^OD*FN-6T@e(p~+B)zI*}NuAjrh`c`A{YUtEoB=khT*4_g13YDrFppx#j=5UGYn`bituAF_&dIX2qvuo=N`U{`5l98Nxo2)A&8Qh~L@gM@ue+DlYW+`>T-C4V$7#GX4jn%H z8UCh1FCtd7K;;V-K!_XM`(9Z|hRj*Yv#vN}3ak6~=M*54u5~s_&`B;FS(sWTtB zLe8NlKil{P7Bz80S0IhdVc!yVLvIFYDQPNJE)laE3l$Kp7Z0))T0JekUJ$;C+vNGdV0FbLPTUB@O_Ae z(5g%*>{C0Bx&CHcUw5B2hu~89c=-XrgDld{ixOaV$VnKws>IbFoKRGJspe%Hkt}o! zp6x<8ZZ9v-=97JOOGR^Ie{z==X0HM%B==pc^PJK+M?J2gevU@&%;R)>E|AsJb&uuz z%Plu)h_u>EHR!0V`$Rz#srAx_A@Io?XvPQcazuZRNy8u`x1rC!`qcxTxx~{n4~{i~ z;`A48fgg3pfh!WEY30%EKTF|5k@BsdUwXgylGX7(;j%PY$adRjhcq>aj~Pjos-Z58 zJ2Vbo8a}q^j`la>xZf^aeVUzdAo29`J2UfzitnSHDNQc5W}IWYMHQ^NlbGB3_fqoc zg(?7TK|&MDdYQ-Mgq{-_5M!)Fy}-i7*_^0rO;GdBW37~jy*vYYY+WaN6mM^{&30dD zXT0#B@X_p~poJp8XG=W2dq?fTH?D38;x_A|7r-fF!04`Ch6->v?DTJb^Wx9IA}hkf2> z2#rrn1j?=J@7olBOhIU;zBFYgHXt^XtGk>nyt%E=$#QnG$7IW)q1}ujp*m!cS58Yq zeXdK(CA_kd3H8yA1Al>3U*GvEA;D~*L6=lB^a#sY!h~a0(nW%S)viue3&A78cEg=x zcV_JAXGfJUGkgS^crJ;Gt!Oe5K^k}QyT}VL4m@dxSc{h#zL~&`i+?tJrn1W0slx@& zJQn(M`0$}aHP}KL(A-JPH<_IS5u(&H)$}j_n)n4Blg^IdRdJXHc^H|P$Vfodqu8(M zo;z3l>SR>Ev4_Z2L~V+YrX5THFH?*BdHm>+8B)LPo$qr$Q+oY)-j{6cl5vo;bNU^q zqS@R;8;NyQysh6LvT?q*|3G$8(b2@S&*G<+d!QkLGmw?k7up7a&^f8_moNE|E-I9N zM(fO@878E-&K$S3KpK;NB7wNp&KuNNNImpiq4{hlO9pQHbUf~j&5~nbwaU64_FYi3SYFJx3F*_P!W;%(X)rBL2~u1)iT)-IFioi=}6z<2DXfT%rG&lyc4<8^0exWq9T@Yz&?) zF9kn6KNbYHHmmg#a&sO^TxC3xesMEsZD={~+Cqs}_3C5+6Z@mA(trTUqi?M@qa$6- zGY@EeE4RMN^rQItEjYDkX=$@<|6HbJKSHZF)AjLtvYFy)$zLh-t15-5}t>K7)9J zwp2oa6&JDg@Tk|$`2hd-B`1=zvcmV=<#_4QaV^-3P5=vyEoN#$uC(#xJ1$^fbM{6B zSwLr!C~S7MG_2-WM_k}G64^SXPkND&5P(z}b7+{V_M5js>67WC1!KGK?%S*oHT??x(8k>b z6Vq#G5KhXGk=pILgR^NuRaw5IhFz|G;@=5^11EV|Ur zc)sKVRns8|fp~SGS9q+CaVS76!n}uFQ?S2pmvR+j&N5N`^-Hzl%NIs?uOZ-PR zd>>KMV;yZy=oPs(e&#otoQ1gSN zgK@hWN=OC>{IL7158ow8wyL6n0ZHd@Z(;GK02Xq>@Hog zA8S8DI+1H72K&Vp6ga6HvpW!`PkZ70+wnV#^_gM<1xtj~^wc|T%?`H722zi8I- z(b#L(N#ogxwS9N)-qp&#W|VHU!UpB6Z@%3xQ!A^Ra1vMd^zc9mRue=&l58;7=s$d_ z3RO7Uw37V8)4gSbl6XR`StdNl`=-Y&Zf0R|7w(C8xZm(M5W?SpoV4`mR?J&;#(hw< z)q&DXSDK260M+;}~ z;7|!MLN?qvgnI`L0et03kTmf!hGg5BY`NKQXmS!tknwL$5)drFUSPhuIE^R7jTO&J zBe}2Tfo4caN&SSp)ltNN0#=_!IM6r2a-ox9zyi%|P5H(;ya<_mM~<-Knv^(lL?Pi+ zG>r0hk?~23P^5MTOU8?@}jU58H?Nw3Oj|jaN z$IM4~NkUW3-J1T>q#g(HH?JZUKS9}tb1T}|h!VE(w^y0s_?%T#_9P<9fzY(d0iGn@ zQR2aYOS9=N*@{&1O0<#pqN78Eb)SAlBq7SO8HPBRErmaK^ukT!S6(iMWlz1oe%(b2 zZi+NC=oR+khS|>WGaR3U5B(y996{mXt~oJF(&aSN{Lm5Lk3!CdB7&JCA|iZ|f3WL} zc};(FbGEh-93K;A?djhh9vBcrLICvE-xlXP?d+Fl+41a|uU_SO0Vg=1or0pG7bPgIl^I#*@vJyhhKwdUY#13Lsm{N zRNVmvF-W$Uo#@=m(XmE{F5{YyJ_PPB_<}6)Y_1jb@qY>7@>Z5i=E{Tqzbf0OK-w}rpGG8szjPl zW%2gVSHCOoPz0+2$nsZ38G~WzbvpbnGx`?IFUvJEMxZn0D5ECVT`z{6ovo|c`^n+RIgwd;Q9M&9e9_}Xt3L!k$e`8#q^JsdPX6{gx!hW~r zT`5DX%`=;7aJ!6xxPELd$+=2P`});B5%ekK}&4h{#B4E-u@z zo!_d__NVqu0(71>>X8kO(s~w`{r1q|X~=OG6D`F-!@;lA84R1Dw&Q_WXP4go;b0V+ zlXP^jmuWQaVggLLct;I3M@m zbC!ll%8P@$$|_a#G}z9DorTjgI@K}T&If<5&hsU7`~>E;d>Z_c{qXR1Xxv`aEVmvx zCsXwSevWLj#yuoowR04Md3~Rsm>Vnc|5CgWlA(UuM$|?)Mz2dE{KJRStLt^b_`g)f zi){FvR=dl*Zew4C#rufL;nox;jHtaMBU?2zG#>qy^IY^Lu7jnSo>x^;CQ%5uH$##= zd{swbTtT9L0J(^2*$oz>;dMmDNqEeQ62@}Adq;__Fj?eIo}T1rk~h)QFKqmUG(q?q z{RB0hn^yReHMh5`oH#+kIu~ji7`()FbVbwmTf8%^kF1@Vn+pKohX@$q!^d%Dg7U(} zmdd~=_UZ74cwh!c(c%%t1GDPDfhW)5HH8!YeLCM$ekr$|c(o89vY7~$!A%O!f^FG# z$nz?PKU+|*-oYifjcL#63h-iZUQ+1k>EZS{m0Rc|M~y@j1^cPiD%)Yb;h&X?5)u+M zD7m{BQ>vS?SW#$C<`&xbl3#9m&hPJ!mq*>Jbbav`JyBS&4lod?TbG64uChH*_wNhL z8LFsIVGGMG7{M!XYoYQirA7eb=)*-@i5X=e(4Wj<*bTSi4mod5sO~k9y4Sj@vrDv& z2*$Df?i|3|3uPq?AdHX!D+296N=tLH7Jp&g+b=tgPhrCq;Z_7w9*+f3!>xOL4v$!O zWD@RoO5<~MG&F?H0H2`6?8=obNSonh7Tt>rTyE_UrJ31libPbQz-Q062>Bp9e6t`- zO`c%qiUpK}ySW+9q6A_~RkqEytnB=Jf@+}}DCB;K8y=o_C8X5T3@1#<4!Qb4=<+(- zbII-@3_n1o%GTyPJ#7)~a>|8^v`awAFyRJ*70@#KBCxfq;T=?OClsD*l{rmVLZhUN zl%D3)=y7-Orl_`_PetNrk(Tk=#BmJ0_jSA0L^ zDW948=8evP?#cT4*BYmd3f#7H6*<3~G4WPT2xTE7wH=qyG3?lsHR%wv0hb^r3}lGEEOKd9eWeo)dJYlq70 zR!GkNo%PZea8YT$T3Fbq@8M|w_3k6bA{;Yu=Ee8ow(rC$$e%Jp;)WG4F)&;RURzoX zpn=XLV&}}b&6P^I9g5Wo_}e3)MRTQ z2Rsp%-CRHV4XeqLt*?pYuRU_I-0$#3K*nt`yQZV|eX~$cj*d1a6*&6*Qd*J*j-Awx zM0=uT5}z9I3eW1pGf5sFJAIR3Zx|X9b&A2+5S4&+-vz_V<*I)JBdF%<*0|QP-KH7Q z7j3=EAsHAO%hM2(zj4U0fSQr9k1%HY2L$~3nqv_hCgzzv?{o}p8j^?@n3=IB$Eq4? zJQPtZ=;H6|>tn$6J2mx3%6VAx-f|CCML?Dj1n92|+6b6^S5pR_(LOwV^C#SA@#GjSx{pI3duS-o@{WbA{3D^1TO9D24L3 zs9qAW4@iyTSILa z;YJ{GG^olayF!#=#Ed?_vDCo6U=CoXK))1FMnO3GBVmIdKW%K>5WtN-?k@6|U#NyZ zPu5LKwD-g!if7D{$Xa&1)qwW-Vt1GPzH=z|opbGvJ^eI{ky z+LQf)!nt{~Go2r%={7#lpIf0Ooyh9$>8q)aQZ_!@-TO5<*Jb7Uot;LDOMmT?JS0lX zRqQO*x+>eA%s5-i5pks{qA&_{*u6#b@A%Gu0dsWRts39m%cAT z74obzk3w^`C^;o14*H=h-%2Q-K6{4uX_IZphK}oS*H*LMCB=SFH7|{x2c52~IRHunC_XPJA@NEE9xzVwiy&IbZ4623?_V+HD$KHkjh3pb(VtUfmHRX7UaJg!Tw?EnFi$npg4l zEA6lLb{QI(Sy_d`1y@spWH>%@H~+~v=4vlC%egM?l3HOpvg8zp?}~!7 zxV+K}R59RtUL<1R&3R9+?e3tcNNO0kOZ*1bA|ekTK0f93j^uDS^xelNELTmoeS5=Z z96NEo>HYf?x{@8_X~L~(7wMn04+Sd3{3EwR$>hXa5BtjfMw;q-V0T39Lj@X=#=EVO|d zj!5Ziy|uaE#&3XHgm;!=BLMp3O!|fN}Z}%Uk zm-l>r>>-UdHbNR|nkOg1RtQP+u9*oV|5*CEFr#8wI{CS|<%G1yeJTV_G^@)|rhI)a zdE@n$bb-@Kvm1eRI`JEslr)1hZ5oga1|cEXr}r@5&oSxD_LOrRxJD>RqJ{+wSoyTh zHzu#7!)emEKRP&gSlvPmKzPHe8!lsJzaJll*@y&>i06*A&2&1;Vb}PCWdr?*O0>SR zgAtil?rx`dFWbG&%X^1Oj}XLR<(czj_b>GF&+5ao7=@F z9F{fk@Dx6DLW=hY%PvsFbV=*S19;wrZC60&ceolV*YYU?f}Q*4uV`*KeRp{6tk+}( z_9$xbR#PY&rmnE2x0h!RH@CL>r=?l@wdm^TOkuw#4OuVRy#2dQ|NUTik`PPk3qSVT z@$aP^iF*~;-OB#3}TB9{$r zEh6#(;1GOoWF&OUwWyNtwX_Vq%E-8jE!{!zr|goE;ly^>8vIR>(@5kZ9YuMH0!T7V%EPencGsapv+7yGUSuI5 zAxM%EK)Q-nu9Yqzy$bv+M9^*v6I}7}+`A6Va^jl3b^rc-@zNsVxhv_A|NVaa{Xzcm zAHoz!Y(XT-5r~w2t7lPr1;~1@24maQPju=gH+1n*;r%7?*&^8fXV38#XUsK_HD>?B{@pmDZ!VO&rP0#(jN-wG)U z6=0j#!Eo_=w!8U+MX@TKmQ#v>WRE?S0dYN5d4lorEgc;NdZJn{x?zet$ob z8B?N~{Oecp4h-^BV_D@DKygV^7}z##-ptR}cd9JU2Pq0bM8d#!R({Il#K$Cl?uF~* zWCW4L;v*uW-kbARo9PA7eYLi~`ueD8xBN4D`t!!-w*PoLlr}CQ88(7?%fjzYjmvQH z;tM9oMH!!UPSVfu@jKi3RhYjT3w&YV_F0^gpD4O=CAgE7S?ceUMuPR@Ach*7S!q)gDn-@KJ%hPPHzS63NdTK2UcN8^^WkYRfsZ;o9V#pZeS zwNk+5XmvyIrk^@)XJK(GIJi-}>CCg8cktXuC+zJdZr(J2ku=XH0Ph=1K_+rX!7V76 znv#e%(Z+_BNGYwYCAxPaVHd#;3>+LHhfPq~5eaW!c4=s!x0ehEdqHtAJ{#FT=Q~Cw zCggvH0FdehRDmEJQF|_R1NgtUGc#|3C=cFO=nI%8d&(6-qsG5{=`c5XnDh7zW&~Y) zl+1#F1>01Sm3syNP*r!C3_!$tpyC!6-JnE8GAK6@XFH8BF!B!h_OYS2r z4vc*0muhfROm~?0^x`hi{@s9>pLgP24Gn}!fmNCS*e26@>aOx}U@(Ow}a zPIMgPK0b2D8srxdp}BX@H3x_6smxNic4L-78$lr;`kD>O8f4uf(wG};LJjDe`xA9l zRpbalR6@PQxgg?NhMHoDar!Iv(pSCkF~(9%B=h|Sx<-LmT_TDW!ZNqTDc-Zsmf7$b z5T#}iw=BBPy{DQJF(~g{??k$Idi*0C*JyZNnQ*fsYAPPDguO!w6>`d;mx8JOaL&mAFbfcPT=ei?zyK$jIhHDynHNrb^XI~=(AOW0=ZU0ecka<;yH zePBCqWlXUaAR-E!RK07LI3e;T(nDm9TNCsEN;#2;LU3V-yHv1yl4MEu_R42+z_-^;OEnr8b0g zDL}ZCgVkwY4BGgn;g%+Fy{lIr**%VqX2Jd|V!nkR9C`?2g zhyq=?Z;+2zZ?g{%KUb|&sgW)-i{rK@CK~{gyrNApne`n_$g)x!2encouA%J>uX($2HRMd@b z%+W*`A2b9i;oP@?Vk5bS132bQyaGBGd3fw_bblcZHFBj;TUWOhdJ+h&>O4EGY;EZf zt$OI{mmMf-#D_<#MmVQzZ`TY6wsi*LkfV{+j6N=+(0sQ1tDHR?PqV9zL8S8q< z3sd2L#<~VFYGN<+hgdm!@Uu&ay5K=r5TlQ%7eXq65o8N0+wRw0fWUv&@zkNw7V3HX zU%~UpMI$^Fz`XmdEwDQPYeoS~9qc)TY7B~zh(*V_+&l=x#kCZ;hA$v`d5pYnpKyj* zSy}OIsRFaUzb*@St{V1ktS@`!+2U9xxbuijFmXzd1r~tZ5 zMRFc%*WL0AVMa_24%1bu2;Wvis>_e!1riB~H#b3e<28|R8Wc^rq^!a!rlb!~?1v|k z8e4?W9RD3fh#x}%Bm;g^P*CvV`tK9T$;r$&I>{W~9|miWdQl5NYD78Wf8o?Mg@HKFCPzvGTUWbBUaaDv*Ez2^u;pD+r#X zIPB~_kajRFCB+Px#8cDT^}0R(4ALQSgcu$9_wA!YZ-uNpGAw@fgW(@`tn)7s$aso! z<319zgFp*Z05d@qR&{fe0*0uWW3KEx(Z!B(h_$*$u)_BiUT0(r1*mCk_@crRA$q{# z0#OK1dx+pLS+BBc01^(6LOp7Hf)phD)Fu*A@O~nHouCs?1Er20jX(2b7cm6^CADr} z^~2ws7bV(64htal3+%~oiIPYlB&yIb;XbB-S(Zpcz}dt?a_-hP7L&x-HeM?pv-+YM=V zmys{*aHg`YmpKVC62bxi^kG1K;QL1`3KxLQ1K~-4M2G+{-mjbp1jTvlMd1MYr@+$l zl;bQcpVKWG=l;r659j`oAbdC$*`cua65&s&rL|K4Y zvz`gDo1Ed?#}z=z+t}KE#+ygHv4~EDIDn&UEl(0BmS(&KN))sSL7AD`klqjmtpc*{ zU116rzCJMX|BM<&4C19w2;^$#Ru&_!5?8eLFtDPa62j} z;`==p7jS(mBDyRGtI7HHsk7t9C`iE95Rp3JHYaRw`50vIcs}({^S~q_R^)~s84~0- zxIn8BXBq}4KfDuoM-?4A(j0!N5Qi7z#vT@>PV5-smT?P4X^|Juu0sF~k>Wg#Y%v^# zdpF7nbQFRRtW978PC>{x@SvaDUBKwUTIGN?rwVD|GnC6mu5}UJojKA)5!zLQE%SJy z8jkt$7l6AGXgcy}!kU{2={Y@5CCXqNlDyEZyu`w2@V>|vyY)(z4gc;PW{&NgoU|mE z?vg%4*yDco_q9j=iFJ9xEQw%KCEBx0!tt420{g`+Z(0+){oyg!OdZ0J4i+tyfuTFw zi~YqHX*Cnr3Gb;N`QG$g;%= zz!RCU97NeJK(1WKTRpV;tjOb}N0mV!pm~-5Rw=LLJ33FGcKel8zFrltOal$bt!-RK ze}2vRRbbz%a4%-8uaB>57V3czfd1xazLvgcn22xtQB+XS|Kx~yjXgYOFr?CQ%$K(2 z>_W95woMQdH12F7o;67$wi31Y)pAa5ZY|u9WF+`FA4-_<;ikT4dHl%Fq1YH)w1L$5 zwqIU_AZZGW%i^!_)gC4c0oBlAO?{Ls)x=jjJJ!KgzBcdS=hcoxZ|qWm0(Fa+VFcHN zcq*_hfG;c<x@9-yL-h(vlysv^?#ksfT?8+;4C=6!}eTDJgH{H@h3`Bn*T zPjDe1%S!4|+l>yaZrP-U;}Z(Z%^V?xOWj#uf)T-_z1WGYTz7U3hz%F6k$llAe|RdL zRuLL|G0$du)kmTz6&4m&{nl*9*NxmJG6%QWX5Q%ob8~aV)(^}x^|YTRJK6Yj+VTI| zE}ItluXw98TfzU1w<=FUkUDs4{nRr^9Y%EV78206J#dTiu`p2i;>9wb?%Q49pg8Xx zrHF3t$5GIt$XZ|kYT3xf@Cn(6a*HdIE~J{uQ()K&y*A3NJM;F9k2jE!a0x^s*$Hbr zwgSnhTUqGqDAg0Mt-R(A&5ux*J<<;kJVM?Tr0GlK^(byoD3KG?PAK7_ zNLTfM$^X=ms2=kP7Z^DS7T>)lC!{R7yjL9*{8o&%sn#`MsSG>G6p)5~?y32O8ek&O zIBOdgI?lBmb@o#ei0oXzJ9@qk`_YIi1&x;G&xH#oxhd59R{Zf&BnxCmN)U)*bZ8-) z&GtWhJJ}KDdgM-UFf-FttBS66B<~pRCLpQh1|W>o;Z9Y5DNnDjd0erwqV|&YSugoI zcAkhORhSyX>C&$JB92if4Wa@nB6Jy3c}-1?_Jy-p20}_8$s^EW3{2bc#96OU>iBd41RliUQ8-A2Qj&0gqQb>7r zVK#Z&Ii!>IF(k!%NeKK^t||YusVUq{QQGm^0XJyfaJ`7;+k!tJ*1BMJA&Mh_0Yni6 z7$*`TFsn6ws}CRQ<9jV^_CnJ@9oq;!a|7K|qzcg@oG9RL^@2+vqSsq<_$^I7LUSKT zM>&~Bh~Gf39(A42F@17A!+<6nCo0MQ*f!3u;X4nf5*;ua8FV{*Z;Y(0cA`YQ%r1}r z3hiYXsr*%>43&50BopzaD*q?O>j%a6>|Cv`Kct>wZ_F>9gbi2me?`5#PhX`bp*>Gv zW!wgW7y}AGLthy1OrhM|LPHaEkzJn^Vk%-D!Nyj3yb@-JkVa5za_S(@ur5TI*hcP{ zcD)-1Y+|On>@Ev8E{?Q{>)5+YL|GRWvd_-Z&74`7on_{J^7!!!jM|Pd)@JuEN}oGF zTp$GImv150ZDl@VYOy`zWtzp3vD-IM@C1h>g%y(g@hBJTCBJc#AY3_;DFZ?E6$o&_6iAK;5{mOy3p%zQfLPL1O`SVCgZ!JBRS|!fUhK9 zA=Rv;mPBM@J}32^T84f{$Bh<35eDvKQaYj%0-g)k1n_tV=5=)__Z?Iv4&~@S4&~q6 z0`dL)^OrDr{R^wJ$$3Jvb57N_6Ii_W(W*Cg?drgZQ+FW@qIJljA;z?XAt?Ix<<2b) z#F!8f(a1oEBbFfHI6~RV04xd2O7EA1M)3OL_KWT$dso*wkh`cJ3A2tkL<3Y7EWg=C zMhaQZvgCez&yZD|n5Y5^=8^WQU+f1jzyB>Lu2|jGoP*aFV}!A3Cz5atu}f?4P;KYq zmG6QALirga&`5g^BaHeqd~o&W3fF==`_J<}c*;il@Ud3Da$z!xIdBvc`7~(E9XtBz zuTuCXC`HT!@u=)I6hDcnB9vn-_VwGh%-3WHEh}V9)Q8LaR|dw%X+_d*%JrZ|2Zyoh ztwhtlll5Fo)@=O1TUdVFE7i@!YguQ$?D3me@(T1u%=0gk&z$|KudbffoR!o+&6fq? z9dl|{m1e8!NiGV%$R$}`JYV6h1j+JmzgXk}(*Uq~k(fw@cNmXwYo){`Y_eB8caGB- zc$1F)w`r&5wvTi&Nw4moJ*-M1B6cy(_%r+fM^2<8z*M^h0&CvmYZR~F)K*tXqSnBf zKuJnYZOD``WCT+8xzvMx_IKyze@c)6i(rnza2|+Jq;G9S0E$+2>-Kbc1o^eD;>98s zb2z)y$`7K?;5&4PS>w5kGI}oDl>u=R#V%viJUp=)o%hSDvR^&zkY~qC9`Nn2y^(%% zRoZ%NTf-63CLnppZRE>t1pjIdzO72%s0&x_IgcaxcmC;`475t-#v?C^^77`Byzi$m zz>;QQs-~}JUP`Sl&^NGgli9L|igZuNbz=fp6!1>Auh&OgP5u3YMb4;qw-O4SW>LqH z(ZLC(2A!|bGS}2UiIg^pbnCHriOtT2u0K9i_IxR3CGP#2@J#Qm)iSjBTbMWg@xH&B z(j))3Z(zIDb`--t3@XV0`bhub{x_+W=&!FYWU+N|eyeUPZB*pUN?wINLJ8~Pi10a^ zi={=XDH*E9*eR?3_R9VTVr%SZanVTx6&G(t8*d8Q-plJa?T%(11O=F4npGHPBO&~k zf0O^lvh_a10e6tcv;ef%?s-rZNxPqls$I-6dAj_BV<+Cq$)WGx3&|Sq-~TJ+DtKi? zECr$8)NcH=m8Fr-ofeC~XfPz-AC2md@+{ZDn2xT{>%qXD-2)RMN0n)P1qFvPi%Yx& zU8M_c1%{%#hgc@lLS@;YR$&OCB^1VJ5`@Pm%U`?-_p4o!-Ak)1`508i=MBmKpejOz z{>_EXxwmySvQ4PEx?0`&N9gF>SXb}Y|LsE;m)J$yzs-6>`VxvSX6FJxs%XDyVR$0M z>E{wx@npPEN#g;;06u&r5gr@s_Jj~m;+ARr-P1n*$1aKwP^aIUH*P+87$i`!LR*{g zZvhkPMy8$b6G*$>+1V*#V*>iU*8!7T>svzcikbwA53wT+zx>wFOt9)J?;x4?l(BGM zG%z?IV5lI_b5LEq(R_{tAluKMrU~E6-1*&QT!g;NyjswOJ6@&17Q~5%NwlYprDc+R zVd!@-LBKDli0^>#!Rv;VU*GLQ`yoxJN06O;q{_lQI)<#`{rhAk!nGgVu&4X%zfl4p zS(J`lA3vcIDAhGOG!%q}QslTD&~+^c6-g%`Z$ukxyfaPz3dnbKag$`hB3v=&7vHzG zGLx{FVV9@|>wmkOnN{HIB|sTeLFy*=8|@KRQE$$Oo0KVCzkc1%3$sAw=g%q5=ilxS zGYMnh-n?m(XXW9&UU)JL+#N`kH(Pm1Dsbz5qTPa!sogU3b947P!?UuoR_BVIb?Tk) zEw7qe7KdLnBQh0xr~7^noK#a|An(A7jl~&z&-*kKISz!{i%u=j`xf2k9V<9FVJ9uA z_nyB{PW=-HuzJuAB$6<8FJcHNTod}P$ImB5K|=b>&!M3t`_gq9*^d31k0zsBCmqY# zK7QQSKR?u~wQ98zse9-4iaX@E@mVyARsZAZDKm3%-G%&#oPmDfxb62t0hJ;rI2q}- zJ>NsSy$n!LN@$dcHl7OlpiLx@{53$e)GtY=q+G?uZ6+otms!7NqR>L$Asp=@6pD{X z9ga;}uM!7zzKH5&KJAiSUYMl6H$28MJNNz`KQW||URXA9Un)8}06M6^Yvl;Zp|%ym zeb%q--@jA;eZ>+Jjpe7O(T}~+p;!IF1lwqIEu4EM$)t$U&%Z{AbOMqIgdq5sEQ@2h z+|CW$G{((C87n*JNt$|kb-;;2f5aXjzyid_kcb#M&;ugQJeW_F4IVGLeM8VWSP7P| zd6-%iE{z{^<%2mxJ!NELmA_jLe}VqY+rR~h+-lcSEJfTU!!7Yb4vxmt+1;A=dp zbomLe26HH(115@vP|zf-T7?S9OaOqrwd*;%xB|RUyTwT%36d^E!^M1%1%wp>9Q;AW z&X^Lsv8GVRl1PM*!=#KB=gx7+!P&V6c0#$j(ddHmbpsKZ=jhS@ANJleDynpg7A>{S zBH9Wls2D&61R5nMQKb!l0+KT-BB4M)a<+}#0-~jWWRy&i6p9=S4G0J*smO>(sv=01 zeCO8gbNbx-e%$fK8{>}q#^Fb6BUIJi`}@|n)|_+Ah1n;RG(QZ1LMbkMTLUGv58&%W zabgT5GM8n)Q*Hcr96Q-N1`XIUuvxjxiLSS+ty=bbu>y<-7jQk8$y*L85eU#$K-WE4 zbG1Axs95s69Y&A9|Ev#ikaFn1(e<`CNWWPdMH({n)1VRV)7pq#$kvAeo_C$lq12>x z=F9mph_%;V%pn`st*=P-;P(r|GTwL_t5xB)h zNEg3cLxP=6OsgS5RKEq#Me;8iOn^3z_MNG)9_J0H7fI(SQXz&DVA2TbGZ!1G=ioF} zqID1bp#(YJ`3o7cXDF ziEDU{S{548Qh<6sNF)Pl8}DPP#RQ{a3o&X8Fqd6V1sjp>00)DCg*Y)K2D1ykYr~-W z-GO525yJ%b_xQ*wNWPq6KV!{f&f_U)RKV(d$g$f8ZgMX?#xZf_WNTXa|Ep%B#agP7 zIp)-${9FCurKu9G_7aSAP$TVz69_z5Fs~t=c)$Ld%?`paVf)jSaT~vt# z@ZRY$&LS-%V+S{C6s>Qt@8Lszi%J!^hW;g3rGRbSnq#!uf5+)#0$lLuWRc3hj`<5K z2vq{?7>S1PS7%`1`36usy52aJXL5;K9SWc)#^5RMmXTSgBlB$h2#qc)&L+~0%uH4S zmAUSI3UXj$t=HuiK6O@jbLSA0R$-Ui}{D$MDO%(Xs}dGs=}=n!8Aii zaA`l$3%>v)A^IJNc~oc>Sq1DLyRh7I0oC&Oc6$1im9V_Jetn&!(;x|{NTziwJK|y$ zeHi5k-ss$Kk#q=(0V~-(6(jG5{mv(t7Xz+J6em&|0A2vBx!2Ljjf2fD6JPhN+OUlT zV|+Y--Me>3y_$mO!C4g*?WU2SCvdlMWG)h?N)+a90E|{R@BJ4e{$;8Hg!IXph(cJt zpUcV3eGT%CI5N{cvB551zF+KZ)1Joyl|mW%GoPWC7*;LM!3!R4^_qVgK9XBsuYppC z6~r?kTOlG3Se(bXMM%zwrug*+K?v+8kU*j{{1%j;;QpQpZ}31g#sOq-=`1lB%yV|4 zHiExczba zwswl%N^fs(&}7lT-p$)|+;kV_SYIKj^(ovzoXG|MiIecZg;t3_!0S{9=P%i`<)l9g zem`A$FHI_J>KI`Y0N@aDVGF0kwGEJTU^lQrB0%Cld-nG-EYVHu><<7U?vc#<`nsiN z2p0(W4^v7u5v2T?GiMOIx`1gzo-L2%_2z9&H_+r$3~z|_b3h;AEM5js7Lkl#X~0JU z+TP$a*hF~2Vnk@r*T5dYz@m_a-$Y-5v~*h+ta-upLySO}QK2mTjGPGDl?TG@yUB-| zBU3Qe3lg4n1i9qwEP>1%1?V&pLX;!sSA%5y73NWiHY#?gu86T>O?i&%F&lCP=EGx9 zD0H$URGS2USQoDXUE_H)FR&$rFzNdt+ki%?1igA6FiZu9;M+HEb`VNgAD=RCo_1f} zT_W@xZ;FUnG59oHp*C)NcJC(Pgd<2+@J4oc#=u0QRV7v?>rYEyHuF7{D^XX^8*3!% zY`%Nf=(PxKZ3XNONPeVhAxva!o2SUY*!P_&}e?rrQALOs>WY=TR@ZW|{%5%)@Au{Y+ z@+)zdFzI_eW`^fDkL)@r{}#!?h2U`j%uzO-Uc^8!LTQiS3n}p)+z1SC2RU&V*@z!8 zquU?|aL{LvIS_Vm{ae^U3{WFRi=n7`4dGqlkmC9CB~SR&p~4|=-dfKY5n%+p^tYm- zWk@wPaSJaFgW%yrFfKuQvTicZb8U&ts=)f`wIl+jhg~z#RfTEg%l7S)C*pBYmp+)__eU1G6 z`Tzd&|I@X8Vd*awzUdk0AVb8->rg#F@vh=HTYwX^;Jf)c^qB|J_$rN9QT33Lb^^y}}>tYh>tAt^oKfF_VbV z9-ocE#q@Bn1CCmpcgptOVN~Rqk$+?_C-vR#)k`zFUd}t)w`D1Ln(6he>t4uYSMup; zE>g87#yE* zBHdWew&xOwL=p{#b7sUWU7ho&ZB%nNWEPnEt$~?ysYSh(3ryps+9~T+{e&R=sJY1dGXv>O{q z=nCD?Is97wf;c>AwB4&qOHTvku%xGkBioNf^2-P|i}=_je~%n~V2(->(lEOmzK-Iw5OU#9avyb)_h?N7nac$k_x!AlFCfHAvH% z?Pc0LdH7J3%=LhkWbSwK<}Ke}TA{0=d9}Oo?%&Tq8jey`9YFDE-yM4n95_%?R>n-p z?x=mz8jnFUm7nLE@J#lQhaD|>r!<$5IDS6)hPcy|$}`5-ej?h`9hW?(LsvEyEe*T3 zJ5C#N%6S!lOqrPWo;RHCu(wfix^{QdTd|ArVXvmrNwH%vcy@y#gCYwkC^#MoW=( zzO2jA3I(?8!-bBYQyN-GuVzwn8>u9c1qS)KVUu8NSDxjiEJa{twZ%&dHYOfW$)ApW zpG17PXXI)$Tah^Uf86p+^jo|uD?3BUgko^t8jn24l|ARGvP-{VPGPm;575(~Jj4QW z_LJi>B<_%aGn{@*zD*JMkK?W~lOI8%w{U^02fH4GvBO zriAu`^WrIN$lB>%Y!MX}mUFda0%daC(Yd<&+aM?8{UcAWeW8aym`emk@0 z7_{~LW$j^_McrvcYwZ!)Ld5X;!ZXf=QVWLdB0UczS>0BUl8&?nRV9@bSp_V#C)F({ zy$^WugmAWKDX_>u{i&gepY*-+kBvn^_EyjgRogJoSZ%I=zY3=YhkANnwr{ zrJdJZE#*7vFSnSZ$2FzBEXs?Kp`7w(5kDUMudwGJk^FjLd9?vj$CuSpnl?3G`oDl9 zhSzY_Q(1Y4>-qWk5~teW6_xn=?`ve{I?Z}UM$#}MTW0E;iQ5-$|IFhm%RbF(IeKS4 zn|ldyp;?Ry$+oDqz%`@PP)ZqqCw?2~j3^ip8HD*fm!^`#!ROrON6TmsOz)I+$XV&O zo+S7dLB2+M&KJ!}JPH8RiMW!`_+UYkl%VfPPyG4&`4f~FD}_&tFXiSe>(G)Lwy_9V z3kzMvTnCmQhowRllhGi9e~&s1E|OiIBVgUSbrTbHDgt}3}+feUOC|7MV2cFYaJ0E+@C-JF%7|^b>eRx23{qKf5W@Wd>yXOL zf4RQyIn!VSQ8YY%Js(cU$uusdi=?0N-R>W0{iwwmrfD;zlt+Y*?JAJdQ(__9PBLsjD5Rq+_)jxx;j&) zVSmr@itPhiNCpRAJ}}$<7II%f`exEm6)_j%EX7b_RdS{l6c`*kcC7U1Tn0%m|K2XI zvnFXf1QaAazNHTrk9ft##x_W@;EcYgYtop=@|w6n+MXX5*qU#aCbEN#O_Qt-0B2@q zMuCDV9#6$_fBq^`ictgqNsTqjaYgyr6-8E8hUQ*Uwr*#0wQTuPNXz_*R9{k2p@=?! zA8(yOytTHGYb?(IsIk1IqPYMN_I(b-bvpVP#*6<%ETG0883Ly@pvh8O>^!n{YqpKC ziAzI;rdcx9?X&*Ilu(g#cXpG^L8nb^&)#dz-D0%3xG0td4^<72DZC0RSFUWyxzyd< zzn7G$2OQ(Nt?fe%JNN#I)?+Jtdv`8Kx_rG@7-x#e^a{0H=F0(Uoez;N-)3gaew;k{NuHJSQkKaX{{i@r zs^fsZ)%$vppQK^_z|qn(J#8IQkH1!TMMcHL$1~j9yH%uTZo}0-iI(5}K+2ai3JjSB zz9XYvo^-U>z_Y61zMo$T?L1I5Bd;D)q-IK##$=;toIH_!!^@6S$4fYj`{9yCi4jQ4 zQv+s}*0^6%vgPOr9W}M*y4=;0RL`GojAKrQ?`dNZJ&-wKS$4LzA0Dg7CW3=FOToM+ zQGo9m4W~#)$-7)WEi-gPz~z5qHQnKE6aB`Dc$VYIKepz(b77jjM3$fMar`LA!yNRnsrfg`c9}jHTue=PAumrfC=bmwjrRY_qSi_!RXU zo>CO3|M)M30PjM&M=lyB;honcp zEv<~m;rEdL&f&NJJBMGCne1d2(AAK1=zkcu=$@2yt=)~?eHE!MsN$imXR=YDUX9$e zG_;Z&G2c>0-H?THidNm@_R=xYq(Q~Oh;SbfdBYYjz{mG7KGGwJ2sN)gSKb&uVV|rm zaEoKoZm?gZ@Y`n}ytv=o`!eAL=u`8ec-^Oy4F*h&@2BYD z(7#eXZ|pL+!H;F482jqCLre{H7?FgW@cK=yPK`D=Z5je|R6DXX>4qr;omtofsr^sQ z@7%dl{`RdrPQ8~jTEia&TNG=~(z8-pGa+fV?kp;d&0kMSDaGfEa%47Iyl+AgmH)kn zGBu3_25qsBH#s|6#*L%4zPA0R8}=>011FlI{rM#K>k*#-`AU9hzJYO+_s^gEP_gOfRsZ}3{;s$Edo23rcaICmf6od2 z`8{*f|9-fC-jDy@x&Py9F5xX20RtYUL(|3-gQ7NYSUDr~nEl<+#kh01*yXoQKb5da z9hE~{se_X9YIEBDb5AdN&`bUDvtskr<3nwV%KJwq>BgP4?LYRXS@3x!=YKuqOy%L> z;dQL6+Go$EqjJ_XGKw1<+<_^FWVHG53kk_GJ;z2zFCZJ}VKN1zr1W>ndi)CJp%#2X zjhnHp7l^`-7{bbvrI`CK9UF+7Y z`Jf_KCADunLd4|m)%Qohw@+_DjB+U_W8z2;bOIsfxoV{ zYV6UmzaLKZ^2g;o!0uN5^iu+Wo4mQ$;`cT_0zoOl9+Hm%>PmLoE ztb>OSzbw6x&I7cfKZ%-JzqB}gN2qXua-=1#QYc>oSVSUl8#9sJhcs`88hcK%$&9^| zt2W0oMABc|6Qr#%CWBnoYu3UmWysj2%XMMM#+%B%DUe@i!WF_u(JSvBx)n}A$|Z(N zQmB>a^oWj$X=h=~K}P%}Ab?jPkC8;Jhpb}NdDidOP;IR7cO zhXCKv*>mu;uZt<7oyOy6z(dr}kd}+fQ=!~1KS!SBUqQL4gbj54NI_ND3D6gKGG zEkgI39(9fXcKbVM%;Hact~U$OHS$Hh+`K$<;FIfESOTEbUz|*f2iz5fQ45@Xrerde z$R8+A054e7by(YWLN-P05c20g_3`|o)^52L7eb(TKv~xOeLTH#?MG72i81TpL$GE~ z5=h-+&_i3I5Gn|0+p}Vgw7}fgfT`sB+3y6{> z?0ena`ogo>cI^^U$U|zJ=`phoz*S1~?9Fik1rf@<@+9WIk3;YKnHP;yc)tvhc`R&3 zor;`TY4I$BTop3;47B-|;o(%IP5pS&L^~t&ORFNo=NSODr)Fei6y5O_OGec0a|-fj z;G%VLg;coX~zZ+q4mPIuj-~WpLn3Y51G6_|?MQuzu|G|TzyNY{5$WTW#+?0`* zA8ZRwXtjxa&Zj>70S|?ooTX=El&T^-qXE)ZbQf9zKIYib#mU}8h;emy=jv9GTX3LZ zo9vWv(_oeUdIOB;C26PWc4slNvF&2sScL!{&Ta+0LO0rjT{3zmtw@0Zt0+<+W{eRo z`u1jU=FOXvg>%CWCIzU8#i}biJB_nD^fnK+Lw^+B^`!;K`nJj z7=)!H;FqA{;^G}U1|0`=;*hpK2@GsZm|3}cHL$M-2&@m$g$|4hdoLDtftJwFRJF}z zn88FjL~iMTq32`+g$G8a$W{4xd1E`q;R~bc;ZZQZu+TFwkhtZ**po+(o*~tg(C>K< ztsjldu~%5wrl+^pvL>P(nt=?|UYs&22xmYcD(Q4>WUl;zf@oq7Zo!lgu;UH=uF%FF z6cW<%@>=8<5YRkbx+g_9<20~rzhUxulxXy*sf??hF<1|k?d^u&p~dr&veCM;myy&m zQ@PB1ZJN?ApaVSdg{Pa_-J)-w*PoA&)}_?Pt8n8H@}rYlcUHX|@Cz6RT2t$;3LNO_KjAQ%#p$Qq(P4z%2+d2Ep4HYJdGaJv38x%aTNy48H=-PS zaAxL!uk|Z@BCa+GB>*~GxjRo0&+YN!48XFJ@NuR~5@jU1a=-NS;D8dq-PJ%xo5j~T zasuLV{kBx=?UWcGk(_Ut^aDB@D$?|5il}>l95I?+$oq{GQ0*7^Nz~S=6@Go=t~m4P~{`ycXPmTWdRadipzE?pn`&#(5 zV$b_vXC_{)U^SoUuj~PkCT@+Di^mebG*=v?sj7NWdie9_=W`>)D%u8ichDMK6~`wi z*f8Dcou+NSs;xx2YFGRN0$*iet~8ViLI zm!=$*;CRxCh3b(3>6#sf0CU)Fq)=V+8agHr+vdkAi7?7{@L)oVC`!*p7}i`c`!MPd zE>&hx@q~}@F*@GLT97-dro0?hfJzgiWs&CC43i-?h-ACm2QN$xx9jhJJma@gNl|eE z@5`)`=(NiEG_&kQim&hVaYwM3yvC6#{Ir)b2ohVwr zwzaw0;`5(>s>3@5UK?bj=Rx^wRyy-5h8 zA&H#jK%|Er`Dhz9zIt3+>c{A`hg7N(tq)?30GvVaZjlGukwCMdh}!pVnC$;3PZ2dK z-B9&ZME&*a6SH%jOGGC0uC%v)EFv_NJeqHU18cN9jgB)=7?7GzT84d}a^d1EmmW0n z;hvTWU%&q1*l)}KE+1AMdae0+d7MzoaKCKoMf!)$O+nhHJC}saFU3c=NJp*YrG8{h zzEJT}kp`>GL=+DnHa7hDA#1T7^Z0AER%$pCs0Q)HaWf&|py$%UbjZI(vx)Kp+~l?#GIizc*!xLAsAwDVN0gCJgvZ=( z&8&%72u>}UWmw{MU~tzcMmLD28@V?eN@xs&CG$kHStJ8AMb@@WfibuXXr*Lj<7_Ev zbS0RccIS8t9O|@Hc;)HEcl(w;wAvK&as)9>6x)Z>Xfw~4Nv}sjkQAQo^qTVnO=pUf zN&zGor_Ahi&+#hy{XhP&uq}>o`5fssJFuj)VT}@7fI+1Da4}BgP==V?9{HUjiKP0>aoO1U{FuoLnzVDM=qugqv3YdbfVD0T;!}A&w&x@ z`0`u83OM0)DwgIQ9u~$^e!0OM#yiM7_fcYyX%#L^NwF~OF%EPiCaIaIeuTOTJ}L#!?jqF3z(prj@woGo5j%on%mNXB`GR+Si}?gm9gMHK!du@2j} zE}moM@qUZ*hX|;ToK~0wJr^}SU6p|N;gkCWx@~c54>6B#w%EuDNo!8X0TRob>0Qe& zESzTFfzkly9Tf z6R(XHa7kju7f?e$MVbZ%$r#vmO=R$zg1Nc-LN~W}5b_@!YH?6yk}+*T()FbdOvDl7 zmA(uO2_}A)vPa4_5TI?8LNBPfon@_}$y)vXy;auC-8*--zeT64tM;-=TxB|%p&U0L*yB`Oe2C%aaW!&CZCe$foL6Ljf;^Xs9d>18;1*zH z#3UAZLQKrB;B!wE%HG1#_v4l`0zptwRaHmf^$B>Iql9Dt@1;p3O)a>G0}In~s-fcX zNhd~HvsLi;)fFpF1Ox>UG$W_1$L)_-vGFQugo(P7(GWk|U)QHm43`ESv$>>7bit;V zhy#Z&6(51}x*?)?w3N$t{h7G)?%LP^Ed6#v_|XKkA1Ed@En*vLSBcwv-zT=i|H8}+ zKEZvAfPJ?w>uPJ0J|8ZriB^)tMyHlc=gBwgg%i+ALr_y#F~pPf*%M!sxtAw*`*J^SYL47iT4^I%j*kK`( zlbs<)?bHfyHaoY8oLaf^P6&)DFy`L;2Nj6^;{lwBk8j<&Wo2b0iq1H_x6P<%ep$cf z0Pj#^@#3T~v8;N%g@a>YsWbmeXDxgiO_&`M%jxh!kfek4*7yFxOu z<3#l(YxYeMvYvU^)1Db4rDl@9OI0DGnor(-3AiwB$S6_<5!{ppRII zqLpe8i$g#S<^mG#UZuXlrO=?#B0Q&xPk)=nu|He9G$-dd-9Ft=ltvVB@eyvdYl=GT z%C;`x!dnX6ox?qo{1Xz)O^#woRZoFqmBbB1fm{zSECBzhEhTGkFsF!Mo6j5`>F$n3 zbG}kij!qwfueIVdwV5VR{w*2a;-QWm-xv9(HuZ&FCg1-`A_*PbazI(*;>Ac73jM5xr&8c||A^{($mKu4vZR7jO$|IqrNcF+EBsoVi-s1d#S~zdKIzMUUZQjJ> z6W&)xEb0>;iB+c|;KSOb0h4@)lRe4BW@)}}i(bA{_$ZX&^v0&5Sj3`olw`;> z2Yy?<>jROuq*$Nw^nvu3;V03N>^O_`;C(_my5Ex!qP5qr(N+WuB{SVdzWpHIVckOJ&qKhBkm3d+O-rn(`=#$|lEW>EVwy6$m{3ngG810C74A#*O# z62-3D*Vn6&C|dHIjnAt z)55o6kiuZQ3z=6feBLM;qlO;CxqVP!?M=Mw>5Q6*0nFl;mYT?=$ITP0vfrW*ED8LG z(C-*=h=~5$FliDhE(_o@F;?vRQajqY`EMjk=px+EfOHA?jRFmLuBZ97j*Xq2Q6-_W zQUYdBf?T0_HhNm<7&7~mv7g)H>!p+c>Bkfbnud+UUZz^W*s+TLyq1=xwK9>;ru^1H zq5NDGE|sRpZJEl@0Xi~b>j-8J=;k%w>A_~D{pyw68SlT*5?b8>K#O15_k7ks@O-e8Mgj|OE_y)7+oo_-Z)Jk&xKDb__W z&@gGLu2$Z>Is8x-fS)kkfF`U`Ih<%I+H#EOoSa{AX_r&1G3V;yZT{FJ8S`{rettFV zD~VF)p_W+0Sc%GlA&h-W&*edlU+>;h*D5KcztNqJ`9|3yVU+7p3geV3PM1m{vzweB zuaV$8i^7w>?JXfv%d{A2Z1F-A41qV0h^*}=66)smUdp(UG>Tm6mQA) zxzK^tVaZfR2t8WNhWM7BR;~>7w+Rm#GA~6y#nO){*H|xG;<3`IV`j2SR_aIP?|8Iz< zWMZJMY><82*kiQV?R>Vwz(_?^%9>($SMW#m)me=j?c)hl(F*McxX3{j9KczpY%Am7@JAPZpXq{Z7=t(#xcs$C`i3=yL`etGvuvQ^V?%96nhhELsd4kMS>YsLZrMBm}CWEGdV z4Pj%m%Y_T=uj>`>+&L9rMYY(|g@nrFC_jIaLZ_XuurT<`hHXp3`6J}QP0xgI%wWsk z6CtL(>L=qMNh_As>}dj+LewetAwW=4402yqJAva@GdE8VSp-L3f6Pzgg=|_f1+BJJ z$jutac`e^&W`h0bPF)I`Xx*=uTO9qp*=zuUCdijeJg_L-7>VB7yP<>gmz_$)1A|H{kCz-8>KIw#l zh|aiS?V0pYJZtY|+}rT%xFG)J<^kx$;*vh!@KwvcDc3$;QAvqur7e~Y*yYRT&uU7{ zSwJ=FT3Uf3!_3w=-QL!%e0+TDO9W2$`SX4L@~kZJyjcd7z;nS34=2)=Uk?(B59~y5 zM}0mw2og0ryB9p=4GpnI%SLBcxl$M91O?TBd0Enj>zRVOFEfqCt$$C^=c=Rk>JBpq zNf1tv=QnSuXj+7WAOHsNqS+|gGWM!M=~BL|vJLaoMPvEOS%q_LrWC{CUj(>{_G?-vJlb;X zN>@t2`}>zUk5(Ev9=Nst&X~Zk!QJCKPZh)ZS~T; ze19F?VL?e+BxtCveaH+BF7v%4SDa@f=Kb~4>s3|7wFKjSjVD;sDw#7iX+(76#s{=a ztDMpa{iK9heco2`1(bK9s1FDb6|3*Mom~K6Y$WUCuwH{TH~qFB$tvvw0M!ty#L@0C zexCD}i#Lem4Tv*Q9%R(WlI=p$)71k+A3vUM$ma$(QBhqjelw(~$jec=^XXE2bhJFJ z4}uvRc8?AWG%oCI-E_vkF*_}uzb(SZb^08UH8Ser{Y8pkx&%-qTGu%G<$Wh!ef?H9 z6?eDRI)U{P8YfTQM783_$k}k@iAh?uFfzuVJJX8%-qh&2gY)-KANCY}7k!Z7L z&z`H@XiT4s5a;7lK;E5olv_znjgifgkY@_u*WT?kYpw*yOwx=z zB^UC$KB;=jto;5=^jQDBgOV-#&Hwzpi&NyXOLVV#B!2-~Y|ZNnR9HpB6D^XHIi(eL zdLC_l$44Ii9njV;&xy^1V1p%s8gAH4eTLxlD^Nf0@F9R86bwrqacNwaF^zB&XylB(q%5br%j8UNyRp_6A|=i>uhi%Xd=(^bQFO;ByV z%Kw`)Y4Fud;zm8!n(?}T`yDl@; z)Ey$bVCd@RrkJ#5FFd8Sv0wr;E{Nb9bDTwDPrFi1;S}I@cL~$;dYNIbp{7ZH`qTwK)KwpFyAaKb}EuQe|WO&zDU5*ZOrMGiH@_F@`T_Lxcd1VrAvj`}fyX@f*(0t$x>- z_4yZD^^;N6)k5sX(+-;Q`R7NGidlSlcL8$shdk$>+A7f=+S+TKmJJOM1xEJ1bbLIN z{kTkI8~DT1-}EVv!z8Wd_DH|*tTzv1-4b(h{?u7CG;AksXIJf(10joY&{frb8Z&)17Itj#ZG{F|Xa;KT{^Rc!|A!0rMur%&Prcz}omVn0wD!L;xDB*5U{~54azO z3ehkcKTDBxe()IMy>!JGNtLMtX_Wc#QueIYQR|KItCg8sQmt67<@T_{oUVMEiegKO z`*7~G@7HY^b62EC@n=Ufxq! zNd(Caq7}H5Hj}KSm67VOKPebmV@NXXSO2ZZ`LrB1f7Tm>^{4V9+!)4!O zEM31X@|b-b!v2Lm2O*(U$E-wu_$OMT4yZbuHj4xG$X(PEY+JX+K)Bld0-FFd_`A}$ z&%aDdjhw3k16Xaz%@xgXR;IwKoJO=JFshpEz@!tbrC2H2JJSdm8z3ID2}kT)v)i{- zSU)$$S+?S}h$o>tN6=MpskG=QaHYh6sAJ(2Jqs-O0=WK$(>A4h6ahNlw#G1aj0F)ju(v-AjcnxHX)^+Y9 z?jx4tIl;el7bKD(*fjO7UyY4Bp=Y(M!%V5*b8PouFl#@#ILD1t3D~WHp<%THy?Pt6 zj|@9^_k2rhD4>12#!Y9=D=QOSa)EeN**&cpBGc$ z=AdNkYiMzCb32=~Mj0%CeppS{+j~iw)0s_iNl7EmV1C?S9P|Btyt?z?Z-UBp8CA~? z1~6K%5g}Gp%y}+u6BmMFN!rnZQus)7>=B{eQ7O&n647mF(J=IaKf6<0e*Gczj0A** zS^2VVKb#YrcfFJVK~!WWpKP|3yZ$9%IHy|~=x|s79X3RFnqANu!w8E5;sk|#>S2Gm z&_ZLH>)ep@`@qQ$A5=5?B&?du#bwd9v%jzdlOHq*aAJSkG57=~` zXPnVoyEeXve&WOlKz(FlnLuiyOUlD?s}di{A1P{Gv#c2KCOe%O(7DshtdFzL#Ky)r z#nbxD8|A`#@QqHujVLnwAx-Ps^Y1`!1v3B~?a(YpN)qi(f^GYB)M!bm;f9m<^8yVJ zYTYHiwRu{zK=DylqUIFL~ zO2uKly&FPf)0Abk#HnBbV~x^p=oAA@r_<+v{K8Mf0D4#CyyAJR@yIgskyQJQf{CSD zjbHOcMPhPPGS8LY`^@RnkcOl_;emO>S&T``Y7&x?IzvIGy_bWdGN5Z=e%`MuEG$gY zSPClIZK<5^e%z&$E&m8ZfX_#Y=Bl?9_eJCrY|V-B1RHZUzo18U45u-$s!tGW1yclW z-jZ>TC=R%d()$EX+il%w|A{Z*4~3;#1F&@-O^pv8y}|K>f+mV?`A5$*_){%Jd=Xio z>pcvHTjQKv9OfVy68ZRrU}*^nmFYJ7Y&4*^9vVj-ZZm&A_`18Fb!BBGm{en~Zo~Xi z^1Fw7#Ijh|e5GTt`i(+nA*vL~oGsFVk}3Y-L-hb(!8_e@b5>a*ZE=47$ZtmXPmTb@ z5W8DgSm+3qb7M=9ecw?(C`?3(kPQ*o_v2Yr;)y^ut8Ow6UPd+h8Vhx6M_4B_X<0wf zjZ<10S3d3mEZ_ko-rMqAN1R$-zoyC zIEMdPg8Toy1c!lG|B~dMmzz6qi&gdmL?%^9biJQnMUqIn){N&As~h>N(Ee})uYAt5i?F@N%cucgA z(}Fd7Jp00(Lt>BEmU@SRH7>b#ppTtcKKw+r~zDnf*|`?Ye)clD5nSGS*p<=B^U_UvVFqx*=ZWT|nKz@0KJ>MT9l zOJ|WS(Xio=k5@uW6l>R=nsOwHYsZdcKJ{z#`58GeePe*EiGZ>c*x06#=7owD12W;N z{6uKdA|fuBw8|~b*KLdVr7O^~vIb5|ex^>qP_71K2o8YQ+1x=8)X0M^t^d+od7m$C z+x|V+l3uwA3Ja?sp^zguV30qRPz(bbx(T8#3g)4)01LsFokVF*D2{b>&LDOqAyiUg z;5)%$F}-Jc6|raE{0@rE@U zH|{*iwsU9QC&h1*7a)IuDH1(4$Y`$ur?g9YV+z?Irx6G>uG*gma-UP&XdX%#f(VpK zxGVz;heBy`rZ0nlKll(JaX}JPA@n&p8mAw@JW`Wy*`4etB62Q_e9tFIVRHXU%T?9X zDErUloJuR43fcS;hq9XOS23E(LG+dmZkXOknE)ekke^=>85M;GPpuuqs*g2%rxO8T zUFh_j9%>%E91fJ1*)D$Um@aU>WZgS;A@8v-o11mrdV|e+7_E zBCtGNoT({8lZCcIQi5$8axbua86~sz$dhMSHlQY|dXr7~NOy)A*1|$(^8Jw-M&yzQ z!LDFwd_$^>wL-_|Krjg>MPdA|4l?N^xh}eYVCR^@5`(*Jmm@3l+$Njn$mqHp<+l%PVQcTw)Q;Q+T>(e{$on1yRWid$&p+QW7p^Hl~NzAg_!^o0Y`0LuA~SQ&y@ z$IxDZ!0ZTJs*G6HF=S9|15lw6I~;Nhfp*tEL%?Qa2HU1oxJ_|G=jbcD_|3%h>ea>; zaV#W|lnvefOX>uGy~VxL1*8R7gC&I6)=c

fQ1y^EVrSq~{}S$Ez>1>Judg!^S&b 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 Ll8yZJ=-K}Z%b;Q( From ec72711ad2b1ce252029f4e2335ff86a59b69ce2 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Tue, 2 Jun 2026 07:41:05 +1000 Subject: [PATCH 27/37] Revise README for improved clarity and details Updated README to enhance clarity on Villani Code's capabilities and benchmark results. --- README.md | 183 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 94 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index a46cc18a..de97ae33 100644 --- a/README.md +++ b/README.md @@ -1,149 +1,154 @@ # Villani Code -**A local 9B coding agent just passed 92 verified Terminal-Bench attempts.** +**A terminal-first coding agent runtime built to make small local models complete real repository work.** -Villani Code is the local-first terminal agent runtime pushing compact models into real software engineering work. +Villani Code runs coding tasks inside a repository, gives the model tools to inspect files, modify code and execute verification, and keeps the work oriented toward a passing result. -Running **Qwen3.5-9B** across the complete **Terminal-Bench 2.0** suite, Villani delivered: +It is designed for local and constrained backends, where the runtime has to do more than pass messages to a powerful hosted model. Villani focuses the agent on the loop that matters: -| Metric | Result | -|---|---:| -| Tasks evaluated | 89 | -| Clean scored attempts | 445 | -| Verifier-accepted completions | **92** | -| Full-suite success rate | **20.67%** | -| Tasks successfully breached | **31** | -| Tasks conquered on every attempt | **8** | +1. inspect the repository and task; +2. identify the smallest useful change; +3. edit or run commands; +4. verify the result; +5. recover when verification fails. +Use Villani directly from the command line, or run it inside [Pi](https://github.com/earendil-works/pi) through the `@mmprotest/pi-villani` extension. -## Villani enters the leaderboard at #126 +## Benchmark results -At **20.67%**, Villani Code + Qwen3.5-9B slots into **#126** on the current Terminal-Bench 2.0 leaderboard, above **Gemini CLI + Gemini 2.5 Pro** and **Bash Agent + TermiGen-32B**. +Using **Qwen3.5-9B** across the full **Terminal-Bench 2.0** task suite, Villani Code achieved **92 verified completions from 445 clean attempts**, a **20.67%** score. -The public **little-coder + Qwen3.5-9B** entry scores **9.2%**. Villani reaches **20.67%** using the same 9B model class: **2.25x the score**. +That score would place **Villani Code + Qwen3.5-9B at #126** on the current Terminal-Bench 2.0 leaderboard, above **Gemini CLI + Gemini 2.5 Pro** and **Bash Agent + TermiGen-32B**. The published **little-coder + Qwen3.5-9B** entry scores **9.2%**. Villani scores **2.25x higher with the same model class**. ![Villani Code projected Terminal-Bench 2.0 leaderboard position](docs/assets/villani_terminal_bench_2_leaderboard_position.png) -| Position | Agent | Model | Score | -|---:|---|---|---:| -| #124 | Mini-SWE-Agent | GPT-5-Mini | 22.2% | -| #125 | spoox-o-m | GPT-5-Nano | 21.8% | -| **#126** | **Villani Code** | **Qwen3.5-9B** | **20.67%** | -| #126 before insertion | Gemini CLI | Gemini 2.5 Pro | 19.6% | -| #127 before insertion | Bash Agent | TermiGen-32B | 19.3% | -| #140 before insertion | little-coder | Qwen3.5-9B | 9.2% | +[Read the full technical report](docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.pdf) -*Official leaderboard entries sourced from Terminal-Bench 2.0 on 1 June 2026. Villani's position is calculated by inserting its 92/445 full-suite score into the published ranking.* +## Install Villani Code -This is accepted work on hard terminal tasks from a local 9B model. Small local coding agents are already real. With the right runtime, they can navigate repositories, change code, operate terminal environments and land verified outcomes. +### Requirements -## Eight tasks conquered on every attempt +- Python 3.11 or later +- A Git repository to work in +- An OpenAI-compatible model endpoint -Villani solved each of these tasks **5/5**: +### Install -- `cobol-modernization` -- `fix-git` -- `git-leak-recovery` -- `merge-diff-arc-agi-task` -- `modernize-scientific-stack` -- `openssl-selfsigned-cert` -- `portfolio-optimization` -- `prove-plus-comm` +Clone the repository and install Villani: -Ten more tasks were solved on a majority of attempts, extending the verified success frontier across repository repair, modernization, configuration, log handling and terminal-driven implementation work. - -## What Villani Code is - -Villani Code is a terminal-first runtime built to make compact local models finish real software engineering work. +```bash +git clone https://github.com/mmprotest/villani-code.git +cd villani-code +pip install .[tui] +``` -Its standard is simple: **the task counts when the verifier accepts it.** +For headless CLI use only: -The runtime drives a model through the execution loop that real coding work demands: +```bash +pip install . +``` -1. inspect the repository and environment; -2. collect evidence using terminal commands; -3. make targeted code or configuration changes; -4. run verification; -5. recover from failure; -6. preserve traces for the next improvement cycle. +For development: -## Why this matters +```bash +pip install .[dev] +``` -A 9B local model does not have spare intelligence to waste on drift, redundant tool calls, weak recovery loops or performative transcripts. +### Run against a local model -That makes Villani's result decisive: compact models can already complete verified terminal work when the runtime keeps them focused on execution. +Start an OpenAI-compatible local server, then point Villani at it: -The full-suite evaluation delivered: +```bash +villani-code interactive \ + --base-url http://127.0.0.1:1234 \ + --model your-model-id \ + --repo /path/to/repository +``` -- **92** accepted completions; -- **31** tasks successfully breached; -- **18** tasks solved on a majority of attempts; -- **8** tasks solved every time. +Run a single task: -The remaining unbeaten tasks define the next engineering campaign. Better recovery, tighter verification and stronger control over long-horizon execution will expand the frontier. +```bash +villani-code run "Fix the failing tests and verify the result." \ + --base-url http://127.0.0.1:1234 \ + --model your-model-id \ + --repo /path/to/repository +``` -## Technical report +## Install Villani in Pi -Read the complete report, including the full 89-task outcome map: +Villani is available as a Pi extension. It runs repository tasks from inside Pi, uses the model selected in Pi, requests approval before protected edits or shell commands, and reports the final result in the Pi interface. -[`docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.pdf`](docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.pdf) +### Requirements -## Benchmark protocol +- [Pi](https://github.com/earendil-works/pi) installed +- A model configured and working in Pi +- A Git repository +- Windows x64, macOS Apple Silicon, macOS Intel, or Linux x64 -| Item | Value | -|---|---| -| Benchmark | Terminal-Bench 2.0 | -| Backend model | Qwen3.5-9B | -| Agent runtime | Villani Code | -| Tasks | 89 | -| Attempts per task | 5 | -| Acceptance criterion | Benchmark verifier pass | -| Clean result | **92/445 accepted completions (20.67%)** | +### Install the extension -A duplicated extra five-attempt `qemu-startup` record was removed from the archive to preserve the fixed five-attempt protocol. +```bash +pi install npm:@mmprotest/pi-villani +``` -## Installation +On first use, the extension downloads the Villani runtime for your platform, verifies its SHA-256 checksum, and caches it locally. You do not need to clone this repository or install Python to use Villani from Pi. -Install with TUI support: +Confirm that Pi loaded the extension: ```bash -pip install .[tui] +pi list ``` -Headless CLI only: +You should see: -```bash -pip install . +```text +npm:@mmprotest/pi-villani ``` -Development dependencies: +### Run Villani in Pi + +Open a terminal in a Git repository and launch Pi: ```bash -pip install .[dev] +cd /path/to/repository +pi ``` -## Usage +Then invoke Villani: -Interactive session: +```text +/villani Fix the failing tests and verify the result +``` -```bash -villani-code interactive --base-url http://127.0.0.1:1234 --model your-model --repo /path/to/repo +Stop an active run with: + +```text +/villani-abort ``` -One-shot task: + +### Update or uninstall the Pi extension + +Update: ```bash -villani-code run "Add retry handling to API client and update tests." --base-url http://127.0.0.1:1234 --model your-model --repo /path/to/repo +pi update npm:@mmprotest/pi-villani ``` -Autonomous pass: +Uninstall: ```bash -villani-code --villani-mode --base-url http://127.0.0.1:1234 --model your-model --repo /path/to/repo +pi remove npm:@mmprotest/pi-villani ``` -## The mission +### Pi troubleshooting + +If `/villani` does not appear, run `pi list` and reinstall the package. -**Make compact local coding agents finish real work.** +If Pi shows `/villani:1`, remove duplicate local or npm extension installs, then install only: + +```bash +pi install npm:@mmprotest/pi-villani +``` -Villani Code is building the runtime that gets them there. \ No newline at end of file +If a local model fails, test it with a normal Pi prompt before running Villani and confirm that the endpoint includes `/v1` and the model ID matches the configured model. From ba2ae953ef114e2cf55dbad829849b35f131c5b8 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Thu, 4 Jun 2026 08:08:35 +1000 Subject: [PATCH 28/37] Add regular trace debug ATIF artifacts --- tests/test_regular_trace_artifacts.py | 256 +++++++++++++++++++++++++ villani_code/atif_export.py | 261 ++++++++++++++++++++++++++ villani_code/debug_recorder.py | 38 ++++ villani_code/state.py | 47 +++++ 4 files changed, 602 insertions(+) create mode 100644 tests/test_regular_trace_artifacts.py create mode 100644 villani_code/atif_export.py diff --git a/tests/test_regular_trace_artifacts.py b/tests/test_regular_trace_artifacts.py new file mode 100644 index 00000000..a7bba7e1 --- /dev/null +++ b/tests/test_regular_trace_artifacts.py @@ -0,0 +1,256 @@ +from __future__ import annotations + +import json +from pathlib import Path +from types import SimpleNamespace + +from villani_code.benchmark.runtime_config import BenchmarkRuntimeConfig +from villani_code.debug_mode import build_debug_config +from villani_code.state import Runner + + +class _SequenceClient: + def __init__(self, responses: list[dict]): + self._responses = responses + self._idx = 0 + + def create_message(self, payload, stream): + _ = payload, stream + if self._idx >= len(self._responses): + return self._responses[-1] + response = self._responses[self._idx] + self._idx += 1 + return response + + +def _seed_repo(repo: Path) -> None: + (repo / "pyproject.toml").write_text("[project]\nname='x'\n", encoding="utf-8") + + +def _run_dir(debug_root: Path) -> Path: + run_dirs = sorted(path for path in debug_root.iterdir() if path.is_dir()) + assert len(run_dirs) == 1 + return run_dirs[0] + + +def _artifact_paths(debug_root: Path) -> tuple[Path, Path]: + run_dir = _run_dir(debug_root) + return run_dir / "transcript.full.json", run_dir / "trajectory.json" + + +def _completed_client(text: str = "done", usage: dict | None = None) -> _SequenceClient: + response = {"id": "final", "role": "assistant", "content": [{"type": "text", "text": text}]} + if usage is not None: + response["usage"] = usage + return _SequenceClient([response]) + + +def _run_regular(tmp_path: Path, debug_root: Path, debug: str = "trace", **kwargs): + _seed_repo(tmp_path) + runner = Runner( + client=kwargs.pop("client", _completed_client()), + repo=tmp_path, + model="model-a", + provider="provider-a", + stream=False, + print_stream=False, + debug_config=build_debug_config(debug, debug_root), + **kwargs, + ) + return runner.run("please answer") + + +def test_regular_trace_debug_writes_full_transcript_and_atif(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + result = _run_regular(tmp_path, debug_root) + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert transcript_path.exists() + assert trajectory_path.exists() + full = json.loads(transcript_path.read_text(encoding="utf-8")) + atif = json.loads(trajectory_path.read_text(encoding="utf-8")) + assert full["schema_version"] == "villani-debug-transcript-v1" + assert full["runtime_mode"] == "execution" + assert full["messages"] == result["messages"] + assert full["requests"] == result["transcript"]["requests"] + assert full["responses"] == result["transcript"]["responses"] + assert atif["schema_version"] == "ATIF-v1.7" + + +def test_normal_debug_writes_neither_new_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _run_regular(tmp_path, debug_root, debug="normal") + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert not trajectory_path.exists() + + +def test_debug_off_writes_neither_new_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _run_regular(tmp_path, debug_root, debug="off") + + assert not debug_root.exists() + + +def test_trace_debug_small_model_writes_neither_new_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _run_regular(tmp_path, debug_root, small_model=True) + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert not trajectory_path.exists() + + +def test_trace_debug_villani_mode_writes_neither_new_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _run_regular(tmp_path, debug_root, villani_mode=True) + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert not trajectory_path.exists() + + +def test_trace_debug_benchmark_enabled_writes_neither_new_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _run_regular(tmp_path, debug_root, benchmark_config=BenchmarkRuntimeConfig(enabled=True, task_id="t1")) + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert not trajectory_path.exists() + + +def test_trace_debug_planning_only_writes_neither_new_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _seed_repo(tmp_path) + runner = Runner( + client=_completed_client(), + repo=tmp_path, + model="model-a", + stream=False, + print_stream=False, + debug_config=build_debug_config("trace", debug_root), + ) + runner._planning_read_only = True + runner._runtime_mode = "planning" + runner.run("make a plan") + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert not trajectory_path.exists() + + +def test_atif_root_fields_ordered_steps_and_token_metrics(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + client = _SequenceClient( + [ + { + "id": "r1", + "role": "assistant", + "content": [{"type": "text", "text": "done"}], + "usage": {"input_tokens": 11, "output_tokens": 7, "total_tokens": 18}, + } + ] + ) + _run_regular(tmp_path, debug_root, client=client) + + atif = json.loads(_artifact_paths(debug_root)[1].read_text(encoding="utf-8")) + assert atif["schema_version"] == "ATIF-v1.7" + assert atif["session_id"] == atif["trajectory_id"] + assert atif["agent"]["name"] == "villani-code" + assert atif["agent"]["model_name"] == "model-a" + assert atif["agent"]["extra"] == {"provider": "provider-a", "mode": "regular"} + assert [step["type"] for step in atif["steps"]] == ["system", "user", "agent"] + agent_step = atif["steps"][-1] + assert agent_step["metrics"]["input_tokens"] == 11 + assert agent_step["metrics"]["output_tokens"] == 7 + assert agent_step["model_calls"][0]["metrics"]["total_tokens"] == 18 + assert atif["final_metrics"]["model_calls"] == 1 + assert atif["final_metrics"]["input_tokens"] == 11 + assert atif["final_metrics"]["output_tokens"] == 7 + assert atif["extra"]["status"] == "completed" + assert atif["extra"]["transcript_artifact"] == "transcript.full.json" + + +def test_tool_calls_and_results_are_linked_by_call_id_without_duplicate_cumulative_steps(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + client = _SequenceClient( + [ + { + "id": "r1", + "role": "assistant", + "content": [ + {"type": "text", "text": "checking"}, + {"type": "tool_use", "id": "tool-1", "name": "Read", "input": {"file_path": "pyproject.toml"}}, + ], + }, + {"id": "r2", "role": "assistant", "content": [{"type": "text", "text": "done"}]}, + ] + ) + _run_regular(tmp_path, debug_root, client=client) + + atif = json.loads(_artifact_paths(debug_root)[1].read_text(encoding="utf-8")) + agent_steps = [step for step in atif["steps"] if step["type"] == "agent"] + assert len(agent_steps) == 2 + assert len([step for step in atif["steps"] if step["type"] == "user"]) == 1 + assert agent_steps[0]["tool_calls"] == [{"id": "tool-1", "name": "Read", "arguments": {"file_path": "pyproject.toml"}}] + assert agent_steps[0]["observations"][0]["tool_call_id"] == "tool-1" + assert "[project]" in agent_steps[0]["observations"][0]["result"]["content"] + + +def test_redaction_applies_to_both_new_artifacts(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + client = _SequenceClient( + [ + { + "id": "r1", + "role": "assistant", + "content": [{"type": "tool_use", "id": "tool-1", "name": "Read", "input": {"file_path": "pyproject.toml"}}], + }, + {"id": "r2", "role": "assistant", "content": [{"type": "text", "text": "done"}]}, + ] + ) + _run_regular(tmp_path, debug_root, client=client, redact=True) + + full_text = _artifact_paths(debug_root)[0].read_text(encoding="utf-8") + atif_text = _artifact_paths(debug_root)[1].read_text(encoding="utf-8") + assert "[REDACTED_TOOL_RESULT_CONTENT]" in full_text + assert "[project]" not in full_text + assert "[REDACTED_TOOL_RESULT_CONTENT]" in atif_text + assert "[project]" not in atif_text + + +def test_export_errors_are_non_fatal(monkeypatch, tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + + def boom(**_kwargs): + raise RuntimeError("export failed") + + monkeypatch.setattr("villani_code.debug_recorder.build_full_transcript_artifact", boom) + result = _run_regular(tmp_path, debug_root) + + assert result["response"]["content"][0]["text"] == "done" + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert not trajectory_path.exists() + assert "export failed" in (_run_dir(debug_root) / "stderr.log").read_text(encoding="utf-8") + + +def test_execution_result_unchanged_except_new_files(tmp_path: Path) -> None: + trace_root = tmp_path / "trace-debug" + normal_root = tmp_path / "normal-debug" + trace_repo = tmp_path / "trace-repo" + normal_repo = tmp_path / "normal-repo" + trace_repo.mkdir() + normal_repo.mkdir() + + trace_result = _run_regular(trace_repo, trace_root, debug="trace", client=_completed_client("same")) + normal_result = _run_regular(normal_repo, normal_root, debug="normal", client=_completed_client("same")) + + assert trace_result["response"] == normal_result["response"] + assert trace_result["transcript"]["responses"] == normal_result["transcript"]["responses"] + trace_messages = json.loads(json.dumps(trace_result["messages"]).replace(str(trace_repo), "")) + normal_messages = json.loads(json.dumps(normal_result["messages"]).replace(str(normal_repo), "")) + assert trace_messages == normal_messages + assert _artifact_paths(trace_root)[0].exists() + assert not _artifact_paths(normal_root)[0].exists() diff --git a/villani_code/atif_export.py b/villani_code/atif_export.py new file mode 100644 index 00000000..c4b7cc1e --- /dev/null +++ b/villani_code/atif_export.py @@ -0,0 +1,261 @@ +from __future__ import annotations + +import copy +from typing import Any + +from villani_code.trace_summary import normalize_token_usage +from villani_code.transcripts import maybe_redact_payload + +_REDACTED_TOOL_RESULT_CONTENT = "[REDACTED_TOOL_RESULT_CONTENT]" + + +def _deepcopy_jsonable(value: Any) -> Any: + return copy.deepcopy(value) + + +def _redact_tool_result_value(value: Any) -> Any: + if isinstance(value, dict): + redacted = {k: _redact_tool_result_value(v) for k, v in value.items()} + if "content" in redacted: + redacted["content"] = _REDACTED_TOOL_RESULT_CONTENT + if "result" in redacted: + redacted["result"] = _REDACTED_TOOL_RESULT_CONTENT + return redacted + if isinstance(value, list): + return [_redact_tool_result_value(v) for v in value] + return value + + +def _redact_messages(messages: list[dict[str, Any]], redact: bool) -> list[dict[str, Any]]: + payload = maybe_redact_payload({"messages": _deepcopy_jsonable(messages)}, redact) + redacted_messages = payload.get("messages", []) + return redacted_messages if isinstance(redacted_messages, list) else [] + + +def _redact_requests(requests: list[dict[str, Any]], redact: bool) -> list[dict[str, Any]]: + if not redact: + return _deepcopy_jsonable(requests) + return [maybe_redact_payload(_deepcopy_jsonable(request), True) for request in requests] + + +def _redact_tool_results(results: list[Any], redact: bool) -> list[Any]: + copied = _deepcopy_jsonable(results) + if not redact: + return copied + return [_redact_tool_result_value(result) for result in copied] + + +def _content_text(content: Any) -> str | None: + if isinstance(content, str): + return content + if not isinstance(content, list): + return None + parts = [str(block.get("text", "")) for block in content if isinstance(block, dict) and block.get("type") == "text"] + text = "\n".join(part for part in parts if part) + return text if text else None + + +def _tool_calls_from_content(content: Any) -> list[dict[str, Any]]: + if not isinstance(content, list): + return [] + calls: list[dict[str, Any]] = [] + for block in content: + if not isinstance(block, dict) or block.get("type") != "tool_use": + continue + calls.append( + { + "id": block.get("id"), + "name": block.get("name"), + "arguments": _deepcopy_jsonable(block.get("input", {})), + } + ) + return calls + + +def _tool_result_call_id(result: Any) -> str | None: + if isinstance(result, dict): + for key in ("tool_use_id", "tool_call_id", "id"): + value = result.get(key) + if value is not None: + return str(value) + return None + + +def _tool_results_with_call_ids(transcript: dict[str, Any]) -> list[Any]: + raw_results = transcript.get("tool_results", []) if isinstance(transcript.get("tool_results"), list) else [] + invocations = transcript.get("tool_invocations", []) if isinstance(transcript.get("tool_invocations"), list) else [] + enriched: list[Any] = [] + for idx, result in enumerate(raw_results): + copied = _deepcopy_jsonable(result) + if isinstance(copied, dict) and _tool_result_call_id(copied) is None and idx < len(invocations) and isinstance(invocations[idx], dict): + call_id = invocations[idx].get("id") or invocations[idx].get("tool_call_id") or invocations[idx].get("tool_use_id") + if call_id is not None: + copied["tool_call_id"] = str(call_id) + enriched.append(copied) + return enriched + + +def _observations_for_tool_calls(tool_call_ids: set[str], tool_results: list[Any], redact: bool) -> list[dict[str, Any]]: + observations: list[dict[str, Any]] = [] + for result in tool_results: + call_id = _tool_result_call_id(result) + if call_id is None or call_id not in tool_call_ids: + continue + payload = _redact_tool_result_value(_deepcopy_jsonable(result)) if redact else _deepcopy_jsonable(result) + observations.append({"tool_call_id": call_id, "result": payload}) + return observations + + +def _is_tool_result_only_message(message: dict[str, Any]) -> bool: + content = message.get("content") + if not isinstance(content, list) or not content: + return False + return all(isinstance(block, dict) and block.get("type") == "tool_result" for block in content) + + +def _new_messages_since(previous: list[dict[str, Any]], current: list[dict[str, Any]]) -> list[dict[str, Any]]: + if len(current) >= len(previous) and current[: len(previous)] == previous: + return current[len(previous) :] + return current + + +def build_full_transcript_artifact( + *, + run_id: str, + model: str | None, + provider: str | None, + transcript: dict[str, Any], + messages: list[dict[str, Any]], + status: str, + termination_reason: str | None, + redact: bool, +) -> dict[str, Any]: + requests = transcript.get("requests", []) if isinstance(transcript.get("requests"), list) else [] + responses = transcript.get("responses", []) if isinstance(transcript.get("responses"), list) else [] + tool_invocations = transcript.get("tool_invocations", []) if isinstance(transcript.get("tool_invocations"), list) else [] + tool_results = _tool_results_with_call_ids(transcript) + return { + "schema_version": "villani-debug-transcript-v1", + "run_id": run_id, + "runtime_mode": "execution", + "model": model, + "provider": provider, + "status": status, + "termination_reason": termination_reason, + "messages": _redact_messages(messages, redact), + "requests": _redact_requests(requests, redact), + "responses": _deepcopy_jsonable(responses), + "tool_invocations": _deepcopy_jsonable(tool_invocations), + "tool_results": _redact_tool_results(tool_results, redact), + "streamed_events_count": transcript.get("streamed_events_count", 0), + } + + +def build_atif_trajectory( + *, + run_id: str, + agent_version: str, + model: str | None, + provider: str | None, + transcript: dict[str, Any], + messages: list[dict[str, Any]], + status: str, + termination_reason: str | None, + redact: bool, +) -> dict[str, Any]: + del messages # ATIF dialogue steps are derived from captured request/response pairs. + requests = transcript.get("requests", []) if isinstance(transcript.get("requests"), list) else [] + responses = transcript.get("responses", []) if isinstance(transcript.get("responses"), list) else [] + tool_results = _tool_results_with_call_ids(transcript) + steps: list[dict[str, Any]] = [] + + previous_request_messages: list[dict[str, Any]] = [] + system_emitted = False + total_input = 0 + total_output = 0 + saw_input = False + saw_output = False + model_calls = 0 + + for idx, response in enumerate(responses): + request = requests[idx] if idx < len(requests) and isinstance(requests[idx], dict) else {} + system_prompt = request.get("system") + if not system_emitted and system_prompt: + steps.append({"type": "system", "role": "system", "content": system_prompt}) + system_emitted = True + + current_messages = request.get("messages", []) if isinstance(request.get("messages"), list) else [] + for message in _new_messages_since(previous_request_messages, current_messages): + if not isinstance(message, dict) or _is_tool_result_only_message(message): + continue + role = str(message.get("role", "user")) + content = _redact_messages([message], redact)[0].get("content") if redact else _deepcopy_jsonable(message.get("content")) + step: dict[str, Any] = {"type": role, "role": role, "content": content} + text = _content_text(content) + if text is not None: + step["message"] = text + steps.append(step) + previous_request_messages = _deepcopy_jsonable(current_messages) + + response_content = response.get("content", []) if isinstance(response, dict) else [] + tool_calls = _tool_calls_from_content(response_content) + usage = normalize_token_usage(response if isinstance(response, dict) else {}) + metrics: dict[str, Any] = {} + if usage.get("tokens_input") is not None: + metrics["input_tokens"] = usage.get("tokens_input") + metrics["prompt_tokens"] = usage.get("tokens_input") + total_input += int(usage["tokens_input"] or 0) + saw_input = True + if usage.get("tokens_output") is not None: + metrics["output_tokens"] = usage.get("tokens_output") + metrics["completion_tokens"] = usage.get("tokens_output") + total_output += int(usage["tokens_output"] or 0) + saw_output = True + if usage.get("tokens_total") is not None: + metrics["total_tokens"] = usage.get("tokens_total") + + model_call: dict[str, Any] = {"model_name": response.get("model", model) if isinstance(response, dict) else model} + if metrics: + model_call["metrics"] = dict(metrics) + agent_step: dict[str, Any] = { + "type": "agent", + "role": "assistant", + "message": _content_text(response_content), + "content": _deepcopy_jsonable(response_content), + "tool_calls": tool_calls, + "observations": _observations_for_tool_calls({str(call.get("id")) for call in tool_calls if call.get("id") is not None}, tool_results, redact), + "model_calls": [model_call], + } + if metrics: + agent_step["metrics"] = metrics + steps.append(agent_step) + model_calls += 1 + + final_metrics: dict[str, Any] = {"model_calls": model_calls} + if saw_input: + final_metrics["input_tokens"] = total_input + final_metrics["prompt_tokens"] = total_input + if saw_output: + final_metrics["output_tokens"] = total_output + final_metrics["completion_tokens"] = total_output + if saw_input or saw_output: + final_metrics["total_tokens"] = (total_input if saw_input else 0) + (total_output if saw_output else 0) + + return { + "schema_version": "ATIF-v1.7", + "session_id": run_id, + "trajectory_id": run_id, + "agent": { + "name": "villani-code", + "version": agent_version, + "model_name": model, + "extra": {"provider": provider, "mode": "regular"}, + }, + "steps": steps, + "final_metrics": final_metrics, + "extra": { + "status": status, + "termination_reason": termination_reason, + "transcript_artifact": "transcript.full.json", + }, + } diff --git a/villani_code/debug_recorder.py b/villani_code/debug_recorder.py index 0628962f..e803b642 100644 --- a/villani_code/debug_recorder.py +++ b/villani_code/debug_recorder.py @@ -7,6 +7,8 @@ from pathlib import Path from typing import Any +from villani_code import __version__ +from villani_code.atif_export import build_atif_trajectory, build_full_transcript_artifact from villani_code.debug_artifacts import DEBUG_JSONL_FILES, append_jsonl, append_text, create_debug_run_artifacts, write_json from villani_code.debug_mode import DebugConfig from villani_code.trace_summary import ( @@ -381,6 +383,42 @@ def write_prompt_rendered(self, text: str) -> None: def write_working_context(self, text: str) -> None: self._safe(append_text, self.artifacts.path("working_context.txt"), text) + def write_regular_trace_artifacts( + self, + *, + transcript: dict[str, Any], + messages: list[dict[str, Any]], + status: str, + termination_reason: str | None, + redact: bool, + ) -> None: + def _write() -> None: + transcript_artifact = build_full_transcript_artifact( + run_id=self.run_id, + model=self._model, + provider=self._provider, + transcript=transcript, + messages=messages, + status=status, + termination_reason=termination_reason, + redact=redact, + ) + trajectory = build_atif_trajectory( + run_id=self.run_id, + agent_version=__version__, + model=self._model, + provider=self._provider, + transcript=transcript, + messages=messages, + status=status, + termination_reason=termination_reason, + redact=redact, + ) + write_json(self.artifacts.path("transcript.full.json"), transcript_artifact) + write_json(self.artifacts.path("trajectory.json"), trajectory) + + self._safe(_write) + def write_final_summary(self, *, status: str, termination_reason: str, total_turns: int, mission_id: str = "") -> Path: if status == "completed": self._emit("run_completed", {"termination_reason": termination_reason, "mission_id": mission_id, "total_turns": total_turns}) diff --git a/villani_code/state.py b/villani_code/state.py index 14c6cc1b..5b657930 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -1100,6 +1100,12 @@ def _finish_bounded( total_turns=turns_used, mission_id=self._mission_id, ) + self._write_regular_trace_artifacts( + transcript=transcript, + messages=messages, + status=mission_status, + termination_reason=reason, + ) return { "response": response, "messages": messages, @@ -1291,6 +1297,12 @@ def _budget_reason( total_turns=turns_used, mission_id=self._mission_id, ) + self._write_regular_trace_artifacts( + transcript=transcript, + messages=messages, + status="completed", + termination_reason="completed", + ) return { "response": response, "messages": messages, @@ -1451,6 +1463,12 @@ def _budget_reason( total_turns=turns_used, mission_id=self._mission_id, ) + self._write_regular_trace_artifacts( + transcript=transcript, + messages=messages, + status="completed", + termination_reason="completed", + ) return { "response": response, "messages": messages, @@ -1842,6 +1860,35 @@ def _inject_projected_context(self, messages: list[dict[str, Any]]) -> None: state_runtime.prepend_text_to_latest_safe_user_message(messages, rendered) + def _should_write_regular_trace_artifacts(self) -> bool: + return ( + self._debug_config.mode == DebugMode.TRACE + and self._runtime_mode == "execution" + and not self._planning_read_only + and not self.small_model + and not self.villani_mode + and not self.benchmark_config.enabled + and self._debug_recorder is not None + ) + + def _write_regular_trace_artifacts( + self, + *, + transcript: dict[str, Any], + messages: list[dict[str, Any]], + status: str, + termination_reason: str | None, + ) -> None: + if not self._should_write_regular_trace_artifacts() or self._debug_recorder is None: + return + self._debug_recorder.write_regular_trace_artifacts( + transcript=transcript, + messages=messages, + status=status, + termination_reason=termination_reason, + redact=self.redact, + ) + def _save_transcript_and_link(self, transcript: dict[str, Any]) -> Path: path = save_transcript(self.repo, transcript, redact=self.redact) self._update_mission_state(last_transcript_path=str(path)) From ca602bf57646879d1985a6857139bce7fe5dfb44 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Thu, 4 Jun 2026 08:53:08 +1000 Subject: [PATCH 29/37] Fix regular trace ATIF trajectory shape --- tests/test_regular_trace_artifacts.py | 59 ++++++++++++---- villani_code/atif_export.py | 99 ++++++++++++++------------- 2 files changed, 99 insertions(+), 59 deletions(-) diff --git a/tests/test_regular_trace_artifacts.py b/tests/test_regular_trace_artifacts.py index a7bba7e1..a26ac543 100644 --- a/tests/test_regular_trace_artifacts.py +++ b/tests/test_regular_trace_artifacts.py @@ -160,17 +160,39 @@ def test_atif_root_fields_ordered_steps_and_token_metrics(tmp_path: Path) -> Non assert atif["agent"]["name"] == "villani-code" assert atif["agent"]["model_name"] == "model-a" assert atif["agent"]["extra"] == {"provider": "provider-a", "mode": "regular"} - assert [step["type"] for step in atif["steps"]] == ["system", "user", "agent"] + assert "steps" in atif + assert [step["step_id"] for step in atif["steps"]] == list(range(1, len(atif["steps"]) + 1)) + assert [step["source"] for step in atif["steps"]] == ["system", "user", "agent"] + for step in atif["steps"]: + assert step["source"] in {"system", "user", "agent"} + assert step["message"] is not None + assert "type" not in step + assert "role" not in step agent_step = atif["steps"][-1] - assert agent_step["metrics"]["input_tokens"] == 11 - assert agent_step["metrics"]["output_tokens"] == 7 - assert agent_step["model_calls"][0]["metrics"]["total_tokens"] == 18 - assert atif["final_metrics"]["model_calls"] == 1 - assert atif["final_metrics"]["input_tokens"] == 11 - assert atif["final_metrics"]["output_tokens"] == 7 + assert agent_step["llm_call_count"] == 1 + assert agent_step["metrics"]["prompt_tokens"] == 11 + assert agent_step["metrics"]["completion_tokens"] == 7 + assert "input_tokens" not in agent_step["metrics"] + assert "output_tokens" not in agent_step["metrics"] + assert "total_tokens" not in agent_step["metrics"] + assert atif["final_metrics"]["total_prompt_tokens"] == 11 + assert atif["final_metrics"]["total_completion_tokens"] == 7 + assert atif["final_metrics"]["total_steps"] == len(atif["steps"]) + assert "input_tokens" not in atif["final_metrics"] + assert "output_tokens" not in atif["final_metrics"] + assert "prompt_tokens" not in atif["final_metrics"] + assert "completion_tokens" not in atif["final_metrics"] + assert "total_tokens" not in atif["final_metrics"] assert atif["extra"]["status"] == "completed" assert atif["extra"]["transcript_artifact"] == "transcript.full.json" + full = json.loads(_artifact_paths(debug_root)[0].read_text(encoding="utf-8")) + assert full["model"] == "model-a" + assert full["provider"] == "provider-a" + assert full["responses"][0]["usage"]["input_tokens"] == 11 + assert full["responses"][0]["usage"]["output_tokens"] == 7 + assert full["responses"][0]["usage"]["total_tokens"] == 18 + def test_tool_calls_and_results_are_linked_by_call_id_without_duplicate_cumulative_steps(tmp_path: Path) -> None: debug_root = tmp_path / "debug" @@ -190,12 +212,22 @@ def test_tool_calls_and_results_are_linked_by_call_id_without_duplicate_cumulati _run_regular(tmp_path, debug_root, client=client) atif = json.loads(_artifact_paths(debug_root)[1].read_text(encoding="utf-8")) - agent_steps = [step for step in atif["steps"] if step["type"] == "agent"] + assert [step["step_id"] for step in atif["steps"]] == list(range(1, len(atif["steps"]) + 1)) + assert all("type" not in step and "role" not in step for step in atif["steps"]) + agent_steps = [step for step in atif["steps"] if step["source"] == "agent"] assert len(agent_steps) == 2 - assert len([step for step in atif["steps"] if step["type"] == "user"]) == 1 - assert agent_steps[0]["tool_calls"] == [{"id": "tool-1", "name": "Read", "arguments": {"file_path": "pyproject.toml"}}] - assert agent_steps[0]["observations"][0]["tool_call_id"] == "tool-1" - assert "[project]" in agent_steps[0]["observations"][0]["result"]["content"] + assert len([step for step in atif["steps"] if step["source"] == "user"]) == 1 + assert all(step["llm_call_count"] == 1 for step in agent_steps) + assert agent_steps[0]["tool_calls"] == [ + {"tool_call_id": "tool-1", "function_name": "Read", "arguments": {"file_path": "pyproject.toml"}} + ] + assert "id" not in agent_steps[0]["tool_calls"][0] + assert "name" not in agent_steps[0]["tool_calls"][0] + results = agent_steps[0]["observation"]["results"] + assert results[0]["source_call_id"] == "tool-1" + assert "[project]" in results[0]["content"] + assert "result" not in results[0] + assert "observations" not in agent_steps[0] def test_redaction_applies_to_both_new_artifacts(tmp_path: Path) -> None: @@ -214,6 +246,9 @@ def test_redaction_applies_to_both_new_artifacts(tmp_path: Path) -> None: full_text = _artifact_paths(debug_root)[0].read_text(encoding="utf-8") atif_text = _artifact_paths(debug_root)[1].read_text(encoding="utf-8") + atif = json.loads(atif_text) + first_agent_step = next(step for step in atif["steps"] if step["source"] == "agent") + assert first_agent_step["message"] == "" assert "[REDACTED_TOOL_RESULT_CONTENT]" in full_text assert "[project]" not in full_text assert "[REDACTED_TOOL_RESULT_CONTENT]" in atif_text diff --git a/villani_code/atif_export.py b/villani_code/atif_export.py index c4b7cc1e..c550a080 100644 --- a/villani_code/atif_export.py +++ b/villani_code/atif_export.py @@ -1,6 +1,7 @@ from __future__ import annotations import copy +import json from typing import Any from villani_code.trace_summary import normalize_token_usage @@ -62,11 +63,12 @@ def _tool_calls_from_content(content: Any) -> list[dict[str, Any]]: for block in content: if not isinstance(block, dict) or block.get("type") != "tool_use": continue + arguments = block.get("input", {}) calls.append( { - "id": block.get("id"), - "name": block.get("name"), - "arguments": _deepcopy_jsonable(block.get("input", {})), + "tool_call_id": block.get("id"), + "function_name": block.get("name"), + "arguments": _deepcopy_jsonable(arguments) if isinstance(arguments, dict) else {}, } ) return calls @@ -95,15 +97,24 @@ def _tool_results_with_call_ids(transcript: dict[str, Any]) -> list[Any]: return enriched -def _observations_for_tool_calls(tool_call_ids: set[str], tool_results: list[Any], redact: bool) -> list[dict[str, Any]]: - observations: list[dict[str, Any]] = [] +def _atif_content(value: Any) -> str: + if isinstance(value, str): + return value + return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")) + + +def _observation_for_tool_calls(tool_call_ids: set[str], tool_results: list[Any], redact: bool) -> dict[str, Any] | None: + results: list[dict[str, Any]] = [] for result in tool_results: call_id = _tool_result_call_id(result) if call_id is None or call_id not in tool_call_ids: continue payload = _redact_tool_result_value(_deepcopy_jsonable(result)) if redact else _deepcopy_jsonable(result) - observations.append({"tool_call_id": call_id, "result": payload}) - return observations + content = payload.get("content") if isinstance(payload, dict) and "content" in payload else payload + results.append({"source_call_id": call_id, "content": _atif_content(content)}) + if not results: + return None + return {"results": results} def _is_tool_result_only_message(message: dict[str, Any]) -> bool: @@ -171,17 +182,20 @@ def build_atif_trajectory( previous_request_messages: list[dict[str, Any]] = [] system_emitted = False - total_input = 0 - total_output = 0 - saw_input = False - saw_output = False - model_calls = 0 + total_prompt_tokens = 0 + total_completion_tokens = 0 + saw_prompt_tokens = False + saw_completion_tokens = False + + def append_step(step: dict[str, Any]) -> None: + step["step_id"] = len(steps) + 1 + steps.append(step) for idx, response in enumerate(responses): request = requests[idx] if idx < len(requests) and isinstance(requests[idx], dict) else {} system_prompt = request.get("system") if not system_emitted and system_prompt: - steps.append({"type": "system", "role": "system", "content": system_prompt}) + append_step({"source": "system", "message": str(system_prompt)}) system_emitted = True current_messages = request.get("messages", []) if isinstance(request.get("messages"), list) else [] @@ -189,12 +203,12 @@ def build_atif_trajectory( if not isinstance(message, dict) or _is_tool_result_only_message(message): continue role = str(message.get("role", "user")) + if role == "assistant": + continue + source = role if role in {"system", "user"} else "user" content = _redact_messages([message], redact)[0].get("content") if redact else _deepcopy_jsonable(message.get("content")) - step: dict[str, Any] = {"type": role, "role": role, "content": content} text = _content_text(content) - if text is not None: - step["message"] = text - steps.append(step) + append_step({"source": source, "message": text if text is not None else _atif_content(content)}) previous_request_messages = _deepcopy_jsonable(current_messages) response_content = response.get("content", []) if isinstance(response, dict) else [] @@ -202,44 +216,35 @@ def build_atif_trajectory( usage = normalize_token_usage(response if isinstance(response, dict) else {}) metrics: dict[str, Any] = {} if usage.get("tokens_input") is not None: - metrics["input_tokens"] = usage.get("tokens_input") metrics["prompt_tokens"] = usage.get("tokens_input") - total_input += int(usage["tokens_input"] or 0) - saw_input = True + total_prompt_tokens += int(usage["tokens_input"] or 0) + saw_prompt_tokens = True if usage.get("tokens_output") is not None: - metrics["output_tokens"] = usage.get("tokens_output") metrics["completion_tokens"] = usage.get("tokens_output") - total_output += int(usage["tokens_output"] or 0) - saw_output = True - if usage.get("tokens_total") is not None: - metrics["total_tokens"] = usage.get("tokens_total") + total_completion_tokens += int(usage["tokens_output"] or 0) + saw_completion_tokens = True - model_call: dict[str, Any] = {"model_name": response.get("model", model) if isinstance(response, dict) else model} - if metrics: - model_call["metrics"] = dict(metrics) agent_step: dict[str, Any] = { - "type": "agent", - "role": "assistant", - "message": _content_text(response_content), - "content": _deepcopy_jsonable(response_content), - "tool_calls": tool_calls, - "observations": _observations_for_tool_calls({str(call.get("id")) for call in tool_calls if call.get("id") is not None}, tool_results, redact), - "model_calls": [model_call], + "source": "agent", + "message": _content_text(response_content) or "", + "llm_call_count": 1, } if metrics: agent_step["metrics"] = metrics - steps.append(agent_step) - model_calls += 1 - - final_metrics: dict[str, Any] = {"model_calls": model_calls} - if saw_input: - final_metrics["input_tokens"] = total_input - final_metrics["prompt_tokens"] = total_input - if saw_output: - final_metrics["output_tokens"] = total_output - final_metrics["completion_tokens"] = total_output - if saw_input or saw_output: - final_metrics["total_tokens"] = (total_input if saw_input else 0) + (total_output if saw_output else 0) + if tool_calls: + agent_step["tool_calls"] = tool_calls + observation = _observation_for_tool_calls( + {str(call.get("tool_call_id")) for call in tool_calls if call.get("tool_call_id") is not None}, tool_results, redact + ) + if observation is not None: + agent_step["observation"] = observation + append_step(agent_step) + + final_metrics: dict[str, Any] = {"total_steps": len(steps)} + if saw_prompt_tokens: + final_metrics["total_prompt_tokens"] = total_prompt_tokens + if saw_completion_tokens: + final_metrics["total_completion_tokens"] = total_completion_tokens return { "schema_version": "ATIF-v1.7", From 6d170800b690d1309367cd5cc365c91469bd1959 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Fri, 5 Jun 2026 12:23:24 +1000 Subject: [PATCH 30/37] Make debug artifacts ATIF-compatible --- tests/test_debug_mode_and_recorder.py | 7 ++- tests/test_regular_trace_artifacts.py | 86 +++++++++++++++++++++++++-- villani_code/atif_export.py | 40 ++++++++++++- villani_code/debug_recorder.py | 63 +++++++++++++++++++- villani_code/state.py | 47 ++++++++++++++- villani_code/trace_summary.py | 15 ++++- 6 files changed, 243 insertions(+), 15 deletions(-) diff --git a/tests/test_debug_mode_and_recorder.py b/tests/test_debug_mode_and_recorder.py index 596ebd72..5a168c82 100644 --- a/tests/test_debug_mode_and_recorder.py +++ b/tests/test_debug_mode_and_recorder.py @@ -130,11 +130,16 @@ def test_mission_state_event_records_turn_index_when_available(tmp_path: Path) - assert mission_event["turn_index"] == 3 -def test_debug_metadata_records_configured_provider_not_internal_format(tmp_path: Path) -> None: +def test_debug_metadata_separates_api_compatibility_from_inference_provider(tmp_path: Path) -> None: recorder = DebugRecorder(build_debug_config("trace", tmp_path), "prov", "obj", tmp_path, "execution", "m", provider="openai") session_meta = json.loads((tmp_path / "prov" / "session_meta.json").read_text(encoding="utf-8")) events = [json.loads(line) for line in (tmp_path / "prov" / "events.jsonl").read_text(encoding="utf-8").splitlines()] run_started = next(e for e in events if e["event_type"] == "run_started") + expected_model_metadata = {"identifier": "m", "inference_provider": "lmstudio", "api_compatibility": "openai"} assert session_meta["provider"] == "openai" + assert session_meta["agent"]["name"] == "villani-code" + assert session_meta["agent"]["version"] + assert session_meta["model_metadata"] == expected_model_metadata assert run_started["payload"]["provider"] == "openai" + assert run_started["payload"]["model_metadata"] == expected_model_metadata diff --git a/tests/test_regular_trace_artifacts.py b/tests/test_regular_trace_artifacts.py index a26ac543..6d25c7d8 100644 --- a/tests/test_regular_trace_artifacts.py +++ b/tests/test_regular_trace_artifacts.py @@ -2,6 +2,8 @@ import json from pathlib import Path + +import pytest from types import SimpleNamespace from villani_code.benchmark.runtime_config import BenchmarkRuntimeConfig @@ -23,6 +25,12 @@ def create_message(self, payload, stream): return response +class _FailingClient: + def create_message(self, payload, stream): + _ = payload, stream + raise RuntimeError("model unavailable") + + def _seed_repo(repo: Path) -> None: (repo / "pyproject.toml").write_text("[project]\nname='x'\n", encoding="utf-8") @@ -77,13 +85,77 @@ def test_regular_trace_debug_writes_full_transcript_and_atif(tmp_path: Path) -> assert atif["schema_version"] == "ATIF-v1.7" -def test_normal_debug_writes_neither_new_artifact(tmp_path: Path) -> None: +def test_normal_debug_writes_generic_trajectory_only(tmp_path: Path) -> None: debug_root = tmp_path / "debug" _run_regular(tmp_path, debug_root, debug="normal") transcript_path, trajectory_path = _artifact_paths(debug_root) assert not transcript_path.exists() - assert not trajectory_path.exists() + assert trajectory_path.exists() + atif = json.loads(trajectory_path.read_text(encoding="utf-8")) + assert atif["schema_version"] == "ATIF-v1.7" + assert atif["extra"]["status"] == "completed" + + +def test_openai_compatible_metadata_uses_lmstudio_inference_provider(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _seed_repo(tmp_path) + runner = Runner( + client=_completed_client(), + repo=tmp_path, + model="local-model", + provider="openai", + stream=False, + print_stream=False, + debug_config=build_debug_config("trace", debug_root), + ) + runner.run("please answer") + + run_dir = _run_dir(debug_root) + session_meta = json.loads((run_dir / "session_meta.json").read_text(encoding="utf-8")) + summary = json.loads((run_dir / "final_summary.json").read_text(encoding="utf-8")) + transcript = json.loads((run_dir / "transcript.full.json").read_text(encoding="utf-8")) + trajectory = json.loads((run_dir / "trajectory.json").read_text(encoding="utf-8")) + + expected_model_metadata = { + "identifier": "local-model", + "inference_provider": "lmstudio", + "api_compatibility": "openai", + } + assert session_meta["agent"]["name"] == "villani-code" + assert session_meta["agent"]["version"] + assert session_meta["model_metadata"] == expected_model_metadata + assert summary["agent"] == session_meta["agent"] + assert summary["model_metadata"] == expected_model_metadata + assert transcript["model_metadata"] == expected_model_metadata + assert trajectory["agent"]["extra"]["inference_provider"] == "lmstudio" + assert trajectory["agent"]["extra"]["api_compatibility"] == "openai" + + +def test_regular_trajectory_exists_after_model_request_failure(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + _seed_repo(tmp_path) + runner = Runner( + client=_FailingClient(), + repo=tmp_path, + model="local-model", + provider="openai", + stream=False, + print_stream=False, + debug_config=build_debug_config("normal", debug_root), + ) + + with pytest.raises(RuntimeError, match="model unavailable"): + runner.run("please answer") + + transcript_path, trajectory_path = _artifact_paths(debug_root) + assert not transcript_path.exists() + assert trajectory_path.exists() + trajectory = json.loads(trajectory_path.read_text(encoding="utf-8")) + assert trajectory["schema_version"] == "ATIF-v1.7" + assert trajectory["extra"]["status"] == "failed" + assert trajectory["extra"]["termination_reason"] == "model_request_failed" + assert [step["source"] for step in trajectory["steps"]] == ["system", "user"] def test_debug_off_writes_neither_new_artifact(tmp_path: Path) -> None: @@ -159,7 +231,12 @@ def test_atif_root_fields_ordered_steps_and_token_metrics(tmp_path: Path) -> Non assert atif["session_id"] == atif["trajectory_id"] assert atif["agent"]["name"] == "villani-code" assert atif["agent"]["model_name"] == "model-a" - assert atif["agent"]["extra"] == {"provider": "provider-a", "mode": "regular"} + assert atif["agent"]["extra"] == { + "provider": "provider-a", + "inference_provider": "provider-a", + "api_compatibility": None, + "mode": "regular", + } assert "steps" in atif assert [step["step_id"] for step in atif["steps"]] == list(range(1, len(atif["steps"]) + 1)) assert [step["source"] for step in atif["steps"]] == ["system", "user", "agent"] @@ -189,6 +266,7 @@ def test_atif_root_fields_ordered_steps_and_token_metrics(tmp_path: Path) -> Non full = json.loads(_artifact_paths(debug_root)[0].read_text(encoding="utf-8")) assert full["model"] == "model-a" assert full["provider"] == "provider-a" + assert full["model_metadata"] == {"identifier": "model-a", "inference_provider": "provider-a"} assert full["responses"][0]["usage"]["input_tokens"] == 11 assert full["responses"][0]["usage"]["output_tokens"] == 7 assert full["responses"][0]["usage"]["total_tokens"] == 18 @@ -267,7 +345,7 @@ def boom(**_kwargs): assert result["response"]["content"][0]["text"] == "done" transcript_path, trajectory_path = _artifact_paths(debug_root) assert not transcript_path.exists() - assert not trajectory_path.exists() + assert trajectory_path.exists() assert "export failed" in (_run_dir(debug_root) / "stderr.log").read_text(encoding="utf-8") diff --git a/villani_code/atif_export.py b/villani_code/atif_export.py index c550a080..38d77ad1 100644 --- a/villani_code/atif_export.py +++ b/villani_code/atif_export.py @@ -130,6 +130,26 @@ def _new_messages_since(previous: list[dict[str, Any]], current: list[dict[str, return current +def _api_compatibility(provider: str | None) -> str | None: + normalized = (provider or "").strip().lower() + return "openai" if normalized == "openai" else None + + +def _inference_provider(provider: str | None) -> str | None: + normalized = (provider or "").strip().lower() + if normalized == "openai": + return "lmstudio" + return provider + + +def _model_metadata(model: str | None, provider: str | None) -> dict[str, Any]: + metadata: dict[str, Any] = {"identifier": model, "inference_provider": _inference_provider(provider)} + api_compatibility = _api_compatibility(provider) + if api_compatibility is not None: + metadata["api_compatibility"] = api_compatibility + return metadata + + def build_full_transcript_artifact( *, run_id: str, @@ -151,6 +171,7 @@ def build_full_transcript_artifact( "runtime_mode": "execution", "model": model, "provider": provider, + "model_metadata": _model_metadata(model, provider), "status": status, "termination_reason": termination_reason, "messages": _redact_messages(messages, redact), @@ -191,8 +212,8 @@ def append_step(step: dict[str, Any]) -> None: step["step_id"] = len(steps) + 1 steps.append(step) - for idx, response in enumerate(responses): - request = requests[idx] if idx < len(requests) and isinstance(requests[idx], dict) else {} + def append_request_steps(request: dict[str, Any]) -> None: + nonlocal previous_request_messages, system_emitted system_prompt = request.get("system") if not system_emitted and system_prompt: append_step({"source": "system", "message": str(system_prompt)}) @@ -211,6 +232,10 @@ def append_step(step: dict[str, Any]) -> None: append_step({"source": source, "message": text if text is not None else _atif_content(content)}) previous_request_messages = _deepcopy_jsonable(current_messages) + for idx, response in enumerate(responses): + request = requests[idx] if idx < len(requests) and isinstance(requests[idx], dict) else {} + append_request_steps(request) + response_content = response.get("content", []) if isinstance(response, dict) else [] tool_calls = _tool_calls_from_content(response_content) usage = normalize_token_usage(response if isinstance(response, dict) else {}) @@ -240,6 +265,10 @@ def append_step(step: dict[str, Any]) -> None: agent_step["observation"] = observation append_step(agent_step) + if len(requests) > len(responses): + request = requests[len(responses)] if isinstance(requests[len(responses)], dict) else {} + append_request_steps(request) + final_metrics: dict[str, Any] = {"total_steps": len(steps)} if saw_prompt_tokens: final_metrics["total_prompt_tokens"] = total_prompt_tokens @@ -254,7 +283,12 @@ def append_step(step: dict[str, Any]) -> None: "name": "villani-code", "version": agent_version, "model_name": model, - "extra": {"provider": provider, "mode": "regular"}, + "extra": { + "provider": provider, + "inference_provider": _inference_provider(provider), + "api_compatibility": _api_compatibility(provider), + "mode": "regular", + }, }, "steps": steps, "final_metrics": final_metrics, diff --git a/villani_code/debug_recorder.py b/villani_code/debug_recorder.py index e803b642..42137a72 100644 --- a/villani_code/debug_recorder.py +++ b/villani_code/debug_recorder.py @@ -22,6 +22,30 @@ _RESULT_PREVIEW_LIMIT = 240 +def _api_compatibility(provider: str | None) -> str | None: + normalized = (provider or "").strip().lower() + return "openai" if normalized == "openai" else None + + +def _inference_provider(provider: str | None) -> str | None: + normalized = (provider or "").strip().lower() + if normalized == "openai": + return "lmstudio" + return provider + + +def _model_metadata(model: str | None, provider: str | None) -> dict[str, Any]: + metadata: dict[str, Any] = {"identifier": model, "inference_provider": _inference_provider(provider)} + api_compatibility = _api_compatibility(provider) + if api_compatibility is not None: + metadata["api_compatibility"] = api_compatibility + return metadata + + +def _agent_metadata() -> dict[str, str]: + return {"name": "villani-code", "version": __version__} + + class DebugRecorder: def __init__(self, config: DebugConfig, run_id: str, objective: str, repo: Path, mode: str, model: str, provider: str | None = None): self.config = config @@ -52,10 +76,22 @@ def __init__(self, config: DebugConfig, run_id: str, objective: str, repo: Path, "runtime_mode": mode, "model": model, "provider": provider, + "agent": _agent_metadata(), + "model_metadata": _model_metadata(model, provider), "created_at": self._ts(), }, ) - self._emit("run_started", {"objective": objective, "runtime_mode": mode, "model": model, "provider": provider}) + self._emit( + "run_started", + { + "objective": objective, + "runtime_mode": mode, + "model": model, + "provider": provider, + "agent": _agent_metadata(), + "model_metadata": _model_metadata(model, provider), + }, + ) def _normalize_changed_path(self, file_path: str) -> str: return normalize_repo_path(file_path, Path(self._repo)) @@ -383,6 +419,31 @@ def write_prompt_rendered(self, text: str) -> None: def write_working_context(self, text: str) -> None: self._safe(append_text, self.artifacts.path("working_context.txt"), text) + def write_regular_trajectory_artifact( + self, + *, + transcript: dict[str, Any], + messages: list[dict[str, Any]], + status: str, + termination_reason: str | None, + redact: bool, + ) -> None: + def _write() -> None: + trajectory = build_atif_trajectory( + run_id=self.run_id, + agent_version=__version__, + model=self._model, + provider=self._provider, + transcript=transcript, + messages=messages, + status=status, + termination_reason=termination_reason, + redact=redact, + ) + write_json(self.artifacts.path("trajectory.json"), trajectory) + + self._safe(_write) + def write_regular_trace_artifacts( self, *, diff --git a/villani_code/state.py b/villani_code/state.py index 5b657930..21d6e726 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -842,6 +842,12 @@ def run( "tool_results": [], "streamed_events_count": 0, } + self._write_regular_trajectory_artifact( + transcript=transcript, + messages=messages, + status="started", + termination_reason=None, + ) self.event_callback( { "type": "diagnosis_target_forced_read", @@ -1178,6 +1184,12 @@ def _budget_reason( if self._debug_recorder is not None: self._debug_recorder.record_model_request_failed(str(exc)) self._debug_recorder.record_turn_finish(turns_used + 1, "model_request_failed") + self._write_regular_trajectory_artifact( + transcript=transcript, + messages=messages, + status="failed", + termination_reason="model_request_failed", + ) self.event_callback({"type": "model_request_failed", "model": self.model, "error": str(exc)}) raise @@ -1860,9 +1872,9 @@ def _inject_projected_context(self, messages: list[dict[str, Any]]) -> None: state_runtime.prepend_text_to_latest_safe_user_message(messages, rendered) - def _should_write_regular_trace_artifacts(self) -> bool: + def _should_write_regular_trajectory_artifact(self) -> bool: return ( - self._debug_config.mode == DebugMode.TRACE + self._debug_config.enabled and self._runtime_mode == "execution" and not self._planning_read_only and not self.small_model @@ -1871,6 +1883,27 @@ def _should_write_regular_trace_artifacts(self) -> bool: and self._debug_recorder is not None ) + def _should_write_regular_trace_artifacts(self) -> bool: + return self._debug_config.mode == DebugMode.TRACE and self._should_write_regular_trajectory_artifact() + + def _write_regular_trajectory_artifact( + self, + *, + transcript: dict[str, Any], + messages: list[dict[str, Any]], + status: str, + termination_reason: str | None, + ) -> None: + if not self._should_write_regular_trajectory_artifact() or self._debug_recorder is None: + return + self._debug_recorder.write_regular_trajectory_artifact( + transcript=transcript, + messages=messages, + status=status, + termination_reason=termination_reason, + redact=self.redact, + ) + def _write_regular_trace_artifacts( self, *, @@ -1879,7 +1912,15 @@ def _write_regular_trace_artifacts( status: str, termination_reason: str | None, ) -> None: - if not self._should_write_regular_trace_artifacts() or self._debug_recorder is None: + if self._debug_recorder is None: + return + if not self._should_write_regular_trace_artifacts(): + self._write_regular_trajectory_artifact( + transcript=transcript, + messages=messages, + status=status, + termination_reason=termination_reason, + ) return self._debug_recorder.write_regular_trace_artifacts( transcript=transcript, diff --git a/villani_code/trace_summary.py b/villani_code/trace_summary.py index c27afc60..165209ed 100644 --- a/villani_code/trace_summary.py +++ b/villani_code/trace_summary.py @@ -155,14 +155,19 @@ def normalize_repo_path(raw_path: Any, repo_root: Path | None) -> str: return normalized.lstrip("./") -def _extract_repo_root(run_dir: Path) -> Path | None: +def _load_session_meta(run_dir: Path) -> dict[str, Any]: session_meta = run_dir / "session_meta.json" if not session_meta.exists(): - return None + return {} try: body = json.loads(session_meta.read_text(encoding="utf-8")) except Exception: - return None + return {} + return body if isinstance(body, dict) else {} + + +def _extract_repo_root(run_dir: Path) -> Path | None: + body = _load_session_meta(run_dir) repo = body.get("repo") if isinstance(repo, str) and repo.strip(): return Path(repo) @@ -195,6 +200,7 @@ def _infer_tool_category(name: str) -> str: def build_tool_call_records_from_events(run_dir: Path) -> tuple[list[dict[str, Any]], list[str], list[str]]: events = load_events(run_dir / "events.jsonl") + session_meta = _load_session_meta(run_dir) repo_root = _extract_repo_root(run_dir) warnings: list[str] = [] validation_errors: list[str] = [] @@ -438,6 +444,7 @@ def write_tool_calls_from_events(run_dir: Path) -> Path: def aggregate_summary_from_events(run_dir: Path, *, status_override: str | None = None) -> dict[str, Any]: events = load_events(run_dir / "events.jsonl") + session_meta = _load_session_meta(run_dir) repo_root = _extract_repo_root(run_dir) warnings: list[str] = [] validation_errors: list[str] = [] @@ -626,6 +633,8 @@ def aggregate_summary_from_events(run_dir: Path, *, status_override: str | None summary: dict[str, Any] = { "run_id": run_id or run_dir.name, "status": status, + "agent": session_meta.get("agent"), + "model_metadata": session_meta.get("model_metadata"), "started_at": started_at_iso, "ended_at": ended_at_iso, "duration_ms": duration_ms, From d4bb3c64c7af9da76b7e70db88376e7df16c5521 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Fri, 5 Jun 2026 12:40:59 +1000 Subject: [PATCH 31/37] Minor fixes --- tests/test_debug_mode_and_recorder.py | 3 ++- tests/test_regular_trace_artifacts.py | 3 ++- villani_code/debug_recorder.py | 7 ++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/test_debug_mode_and_recorder.py b/tests/test_debug_mode_and_recorder.py index 5a168c82..cd4b6ba8 100644 --- a/tests/test_debug_mode_and_recorder.py +++ b/tests/test_debug_mode_and_recorder.py @@ -130,7 +130,8 @@ def test_mission_state_event_records_turn_index_when_available(tmp_path: Path) - assert mission_event["turn_index"] == 3 -def test_debug_metadata_separates_api_compatibility_from_inference_provider(tmp_path: Path) -> None: +def test_debug_metadata_separates_api_compatibility_from_inference_provider(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("VILLANI_INFERENCE_PROVIDER", "lmstudio") recorder = DebugRecorder(build_debug_config("trace", tmp_path), "prov", "obj", tmp_path, "execution", "m", provider="openai") session_meta = json.loads((tmp_path / "prov" / "session_meta.json").read_text(encoding="utf-8")) events = [json.loads(line) for line in (tmp_path / "prov" / "events.jsonl").read_text(encoding="utf-8").splitlines()] diff --git a/tests/test_regular_trace_artifacts.py b/tests/test_regular_trace_artifacts.py index 6d25c7d8..b382dbf3 100644 --- a/tests/test_regular_trace_artifacts.py +++ b/tests/test_regular_trace_artifacts.py @@ -97,7 +97,8 @@ def test_normal_debug_writes_generic_trajectory_only(tmp_path: Path) -> None: assert atif["extra"]["status"] == "completed" -def test_openai_compatible_metadata_uses_lmstudio_inference_provider(tmp_path: Path) -> None: +def test_openai_compatible_metadata_uses_configured_inference_provider(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("VILLANI_INFERENCE_PROVIDER", "lmstudio") debug_root = tmp_path / "debug" _seed_repo(tmp_path) runner = Runner( diff --git a/villani_code/debug_recorder.py b/villani_code/debug_recorder.py index 42137a72..bbc683e6 100644 --- a/villani_code/debug_recorder.py +++ b/villani_code/debug_recorder.py @@ -6,6 +6,7 @@ from datetime import datetime, timezone from pathlib import Path from typing import Any +import os from villani_code import __version__ from villani_code.atif_export import build_atif_trajectory, build_full_transcript_artifact @@ -28,9 +29,9 @@ def _api_compatibility(provider: str | None) -> str | None: def _inference_provider(provider: str | None) -> str | None: - normalized = (provider or "").strip().lower() - if normalized == "openai": - return "lmstudio" + configured = os.environ.get("VILLANI_INFERENCE_PROVIDER") + if configured and configured.strip(): + return configured.strip() return provider From 5f0b8a08e8f773c9142f047185a39ab058688007 Mon Sep 17 00:00:00 2001 From: Benchmark Bot Date: Fri, 5 Jun 2026 12:42:28 +1000 Subject: [PATCH 32/37] More minor changes --- tests/test_debug_mode_and_recorder.py | 11 +++++++++++ villani_code/atif_export.py | 7 ++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/test_debug_mode_and_recorder.py b/tests/test_debug_mode_and_recorder.py index cd4b6ba8..d0f1c000 100644 --- a/tests/test_debug_mode_and_recorder.py +++ b/tests/test_debug_mode_and_recorder.py @@ -144,3 +144,14 @@ def test_debug_metadata_separates_api_compatibility_from_inference_provider(tmp_ assert session_meta["model_metadata"] == expected_model_metadata assert run_started["payload"]["provider"] == "openai" assert run_started["payload"]["model_metadata"] == expected_model_metadata + +def test_openai_provider_does_not_imply_lmstudio(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("VILLANI_INFERENCE_PROVIDER", raising=False) + recorder = DebugRecorder(build_debug_config("trace", tmp_path), "prov2", "obj", tmp_path, "execution", "m", provider="openai") + session_meta = json.loads((tmp_path / "prov2" / "session_meta.json").read_text(encoding="utf-8")) + + assert session_meta["model_metadata"] == { + "identifier": "m", + "inference_provider": "openai", + "api_compatibility": "openai", + } \ No newline at end of file diff --git a/villani_code/atif_export.py b/villani_code/atif_export.py index 38d77ad1..8e8309bf 100644 --- a/villani_code/atif_export.py +++ b/villani_code/atif_export.py @@ -3,6 +3,7 @@ import copy import json from typing import Any +import os from villani_code.trace_summary import normalize_token_usage from villani_code.transcripts import maybe_redact_payload @@ -136,9 +137,9 @@ def _api_compatibility(provider: str | None) -> str | None: def _inference_provider(provider: str | None) -> str | None: - normalized = (provider or "").strip().lower() - if normalized == "openai": - return "lmstudio" + configured = os.environ.get("VILLANI_INFERENCE_PROVIDER") + if configured and configured.strip(): + return configured.strip() return provider From 260f750801cb7be1aab8cbe07e11873d2e12c4f2 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sun, 7 Jun 2026 12:25:08 +1000 Subject: [PATCH 33/37] Isolate task execution and track attempt evidence --- tests/test_execution_context_isolation.py | 172 +++++++ villani_code/autonomous.py | 7 + villani_code/debug_recorder.py | 12 + villani_code/execution.py | 2 + villani_code/execution_context.py | 574 ++++++++++++++++++++++ villani_code/state.py | 172 +++++-- villani_code/state_tooling.py | 1 + villani_code/tools.py | 94 +++- 8 files changed, 974 insertions(+), 60 deletions(-) create mode 100644 tests/test_execution_context_isolation.py create mode 100644 villani_code/execution_context.py diff --git a/tests/test_execution_context_isolation.py b/tests/test_execution_context_isolation.py new file mode 100644 index 00000000..eb0df283 --- /dev/null +++ b/tests/test_execution_context_isolation.py @@ -0,0 +1,172 @@ +from __future__ import annotations + +import json +import os +from pathlib import Path + +from villani_code.debug_mode import DebugConfig, DebugMode +from villani_code.debug_recorder import DebugRecorder +from villani_code.execution import ExecutionBudget +from villani_code.execution_context import PRIVATE_WARNING, TaskExecutionContext +from villani_code.state import Runner +from villani_code.tools import execute_tool + + +class CaptureClient: + def __init__(self) -> None: + self.payloads: list[dict[str, object]] = [] + + def create_message(self, payload, stream=False): + self.payloads.append(payload) + return { + "id": "done", + "role": "assistant", + "stop_reason": "end_turn", + "content": [{"type": "text", "text": "finished"}], + } + + +def _make_executable(path: Path, body: str = "#!/bin/sh\nexit 0\n") -> None: + path.write_text(body, encoding="utf-8") + path.chmod(0o755) + + +def test_task_command_environment_strips_private_runtime_from_path( + tmp_path: Path, monkeypatch, +) -> None: + workspace = tmp_path / "workspace" + private = tmp_path / "runner-private" + workspace.mkdir() + private.mkdir() + _make_executable(private / "private-command") + monkeypatch.setenv("PATH", os.pathsep.join([str(private), os.environ.get("PATH", "")])) + monkeypatch.setenv("VIRTUAL_ENV", str(private)) + + context = TaskExecutionContext(workspace, private_paths=[private]) + proc, record = context.run("printf '%s' \"$PATH\"", workspace, 10) + + assert proc.returncode == 0 + assert str(private) not in proc.stdout.split(os.pathsep) + assert str(private) not in record.before.path.split(os.pathsep) + assert "VIRTUAL_ENV" not in record.before.environment_names + + +def test_private_runtime_mutation_warns_in_tool_context_and_debug_artifact( + tmp_path: Path, +) -> None: + workspace = tmp_path / "workspace" + private = tmp_path / "runner-private" + debug_root = tmp_path / "debug" + workspace.mkdir() + private.mkdir() + context = TaskExecutionContext(workspace, private_paths=[private]) + + result = execute_tool( + "Bash", + {"command": f"printf changed > {private / 'state'}", "cwd": ".", "timeout_sec": 10}, + workspace, + unsafe=True, + execution_context=context, + ) + payload = json.loads(result["content"]) + context.finish_attempt() + + assert PRIVATE_WARNING in payload["warnings"] + assert PRIVATE_WARNING in context.attempt.warnings + assert "private-runtime" in payload["execution_context"]["path_classes"] + assert payload["validation_evidence"]["label"] == "smoke test in polluted/private context" + + recorder = DebugRecorder( + DebugConfig(mode=DebugMode.TRACE, debug_root=debug_root), + run_id="isolation", + objective="generic task", + repo=workspace, + mode="execution", + model="test-model", + ) + recorder.write_attempt_state(context.attempt.to_dict()) + artifact = json.loads((debug_root / "isolation" / "attempt_state.json").read_text()) + assert PRIVATE_WARNING in artifact["attempt_state"]["warnings"] + + +def test_cumulative_attempt_state_keeps_all_files_when_last_is_helper(tmp_path: Path) -> None: + workspace = tmp_path / "workspace" + workspace.mkdir() + context = TaskExecutionContext(workspace) + context.begin_attempt() + + (workspace / "primary-one").write_text("one", encoding="utf-8") + (workspace / "primary-two").write_text("two", encoding="utf-8") + (workspace / "helper-last").write_text("temporary", encoding="utf-8") + attempt = context.finish_attempt() + + created_names = {Path(path).name for path in attempt.files_created} + assert created_names == {"primary-one", "primary-two", "helper-last"} + assert attempt.side_effects[-1]["scope"] == "cumulative-attempt" + + +def test_clean_failure_outweighs_polluted_success_and_records_contradiction( + tmp_path: Path, +) -> None: + workspace = tmp_path / "workspace" + private = tmp_path / "runner-private" + workspace.mkdir() + private.mkdir() + private_check = private / "private-check" + _make_executable(private_check) + context = TaskExecutionContext(workspace, private_paths=[private]) + + _proc, polluted = context.run(str(private_check), workspace, 10) + polluted_evidence = context.record_validation(polluted, kind="smoke") + _proc, clean = context.run("exit 1", workspace, 10) + clean_evidence = context.record_validation(clean, kind="smoke", final_behavior=True) + + assert polluted_evidence.label == "smoke test in polluted/private context" + assert clean_evidence.label == "independent smoke test in clean task context" + assert clean_evidence.strength > polluted_evidence.strength + assert polluted_evidence.suspicious is True + assert context.attempt.unresolved_failures + + +def test_retry_receives_structured_failure_memory_with_context_difference( + tmp_path: Path, +) -> None: + workspace = tmp_path / "workspace" + private = tmp_path / "runner-private" + workspace.mkdir() + private.mkdir() + private_check = private / "private-check" + _make_executable(private_check) + client = CaptureClient() + runner = Runner( + client=client, + repo=workspace, + model="test-model", + stream=False, + private_runtime_paths=[private], + ) + + _proc, polluted = runner._task_execution_context.run(str(private_check), workspace, 10) + runner._task_execution_context.record_validation(polluted, kind="smoke") + memory = runner.record_final_validation( + succeeded=False, + summary="final clean-context validation failed", + believed_succeeded="the private-context smoke check passed", + ) + assert memory is not None + + runner.run( + "retry the task", + execution_budget=ExecutionBudget( + max_turns=2, + max_tool_calls=2, + max_seconds=10, + max_no_edit_turns=2, + max_reconsecutive_recon_turns=2, + ), + ) + + rendered_messages = json.dumps(client.payloads[0]["messages"]) + assert "Previous attempt failure memory" in rendered_messages + assert "Something passed in one context but failed in another" in rendered_messages + assert "private-runtime dependency" in rendered_messages diff --git a/villani_code/autonomous.py b/villani_code/autonomous.py index 706f2e48..affadc73 100644 --- a/villani_code/autonomous.py +++ b/villani_code/autonomous.py @@ -327,6 +327,13 @@ def run(self) -> dict[str, Any]: ) task.status, task.outcome = self._adjudicate_task(task, verification) task.status = self._update_lifecycle_after_attempt(task, op) + record_final_validation = getattr(self.runner, "record_final_validation", None) + if callable(record_final_validation): + record_final_validation( + succeeded=task.status == TaskLifecycle.PASSED.value, + summary=verification.summary, + believed_succeeded=task.outcome, + ) self._update_category_attempt_state(task) if task.status == TaskLifecycle.PASSED.value: retired += 1 diff --git a/villani_code/debug_recorder.py b/villani_code/debug_recorder.py index bbc683e6..e656a63b 100644 --- a/villani_code/debug_recorder.py +++ b/villani_code/debug_recorder.py @@ -481,6 +481,18 @@ def _write() -> None: self._safe(_write) + def write_attempt_state( + self, + attempt_state: dict[str, Any], + failure_memory: dict[str, Any] | None = None, + ) -> None: + payload = {"attempt_state": attempt_state, "failure_memory": failure_memory} + self._safe_write_json(self.artifacts.path("attempt_state.json"), payload) + for command in attempt_state.get("commands", []): + self._safe_append_jsonl("commands", {"ts": self._ts(), "execution_context": command}) + for warning in attempt_state.get("warnings", []): + self.record_event("private_runtime_contamination", str(warning), {"warning": warning}) + def write_final_summary(self, *, status: str, termination_reason: str, total_turns: int, mission_id: str = "") -> Path: if status == "completed": self._emit("run_completed", {"termination_reason": termination_reason, "mission_id": mission_id, "total_turns": total_turns}) diff --git a/villani_code/execution.py b/villani_code/execution.py index e16eaadf..ecdda31e 100644 --- a/villani_code/execution.py +++ b/villani_code/execution.py @@ -29,6 +29,8 @@ class ExecutionResult: runner_failures: list[str] terminated_reason: str completed: bool + attempt_state: dict[str, object] + failure_memory: dict[str, object] | None def to_dict(self) -> dict[str, object]: return asdict(self) diff --git a/villani_code/execution_context.py b/villani_code/execution_context.py new file mode 100644 index 00000000..e004377a --- /dev/null +++ b/villani_code/execution_context.py @@ -0,0 +1,574 @@ +from __future__ import annotations + +import getpass +import hashlib +import json +import os +import shlex +import shutil +import stat +import subprocess +import time +from dataclasses import asdict, dataclass, field +from pathlib import Path +from typing import Any, Iterable, Mapping + +PRIVATE_WARNING = ( + "Warning: this command modified or depended on runner-private state rather than only " + "task/workspace state. Success evidence from this context may not reflect final validation." +) + + +def _digest(value: str) -> str: + return hashlib.sha256(value.encode("utf-8", errors="replace")).hexdigest()[:16] + + +def _is_within(path: Path, root: Path) -> bool: + try: + path.resolve(strict=False).relative_to(root.resolve(strict=False)) + return True + except (OSError, ValueError): + return False + + +def _safe_resolve(value: str | Path) -> Path: + return Path(value).expanduser().resolve(strict=False) + + +@dataclass(frozen=True, slots=True) +class PathBoundaries: + workspace: Path + private_paths: tuple[Path, ...] = () + + @classmethod + def discover( + cls, + workspace: Path, + configured: Iterable[str | Path] = (), + runtime_paths: Iterable[str | Path] = (), + ) -> "PathBoundaries": + workspace = workspace.resolve() + candidates = [*configured, *runtime_paths] + normalized: list[Path] = [] + for candidate in candidates: + if not str(candidate).strip(): + continue + path = _safe_resolve(candidate) + # A source checkout may contain the runner and the task. The workspace always wins. + if _is_within(path, workspace) or _is_within(workspace, path): + continue + if path not in normalized: + normalized.append(path) + return cls(workspace=workspace, private_paths=tuple(normalized)) + + def classify(self, path: str | Path) -> str: + resolved = _safe_resolve(path) + if _is_within(resolved, self.workspace): + return "workspace" + if any(_is_within(resolved, private) for private in self.private_paths): + return "private-runtime" + return "external/system" + + def contains_private(self, value: str) -> bool: + if not value: + return False + for piece in value.split(os.pathsep): + if piece and self.classify(piece) == "private-runtime": + return True + return False + + +@dataclass(slots=True) +class FileRecord: + path: str + path_class: str + kind: str + mode: int + size: int + mtime_ns: int + link_target: str | None = None + + +@dataclass(slots=True) +class MutationSummary: + created: list[FileRecord] = field(default_factory=list) + modified: list[FileRecord] = field(default_factory=list) + deleted: list[FileRecord] = field(default_factory=list) + permissions_changed: list[str] = field(default_factory=list) + symlinks_created: list[str] = field(default_factory=list) + directories_modified: list[str] = field(default_factory=list) + processes_started: list[int] = field(default_factory=list) + ports_opened: list[str] = field(default_factory=list) + + @property + def path_classes(self) -> set[str]: + return {item.path_class for item in [*self.created, *self.modified, *self.deleted]} + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class ExecutionFingerprint: + cwd: str + user: str + shell: str + path: str + environment_names: list[str] + environment_hash: str + environment_value_hashes: dict[str, str] + processes: list[int] + open_ports: list[str] + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class CommandRecord: + command: str + cwd: str + environment_hash: str + resolved_executables: list[str] + exit_code: int + duration_seconds: float + before: ExecutionFingerprint + after: ExecutionFingerprint + mutations: MutationSummary + path_classes: list[str] + depended_on_private_runtime: bool + used_clean_task_context: bool + warnings: list[str] = field(default_factory=list) + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class ValidationEvidence: + command: str + label: str + strength: int + context_hash: str + clean_task_context: bool + depended_on_private_runtime: bool + produced_artifacts: bool + scope: str + exit_code: int + suspicious: bool = False + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class FailureMemory: + believed_succeeded: str + final_validation: str + contradiction: str + context_differences: list[str] + files_and_side_effects: dict[str, Any] + contamination_warnings: list[str] + strongest_failure_evidence: str + weakest_success_evidence: str + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + def render(self) -> str: + return "Previous attempt failure memory:\n" + json.dumps(self.to_dict(), indent=2, sort_keys=True) + + +@dataclass(slots=True) +class AttemptState: + before: ExecutionFingerprint + after: ExecutionFingerprint | None = None + commands: list[CommandRecord] = field(default_factory=list) + files_created: set[str] = field(default_factory=set) + files_modified: set[str] = field(default_factory=set) + files_deleted: set[str] = field(default_factory=set) + side_effects: list[dict[str, Any]] = field(default_factory=list) + validation_evidence: list[ValidationEvidence] = field(default_factory=list) + warnings: list[str] = field(default_factory=list) + unresolved_failures: list[str] = field(default_factory=list) + + def add_command(self, record: CommandRecord) -> None: + self.commands.append(record) + for item in record.mutations.created: + self.files_created.add(item.path) + for item in record.mutations.modified: + self.files_modified.add(item.path) + for item in record.mutations.deleted: + self.files_deleted.add(item.path) + mutation = record.mutations.to_dict() + if any(mutation.values()): + self.side_effects.append({"command": record.command, **mutation}) + for warning in record.warnings: + if warning not in self.warnings: + self.warnings.append(warning) + + def add_evidence(self, evidence: ValidationEvidence) -> None: + self.validation_evidence.append(evidence) + successful = [item for item in self.validation_evidence if item.exit_code == 0] + failures = [item for item in self.validation_evidence if item.exit_code != 0] + if successful and failures: + strongest_success = max(successful, key=lambda item: item.strength) + strongest_failure = max(failures, key=lambda item: item.strength) + if strongest_failure.strength > strongest_success.strength: + strongest_success.suspicious = True + message = ( + "Contradictory validation evidence: a weaker check passed in a different or " + "polluted context while a stronger clean-context check failed." + ) + if message not in self.unresolved_failures: + self.unresolved_failures.append(message) + + def to_dict(self) -> dict[str, Any]: + return { + "before": self.before.to_dict(), + "after": self.after.to_dict() if self.after else None, + "commands": [item.to_dict() for item in self.commands], + "files_created": sorted(self.files_created), + "files_modified": sorted(self.files_modified), + "files_deleted": sorted(self.files_deleted), + "side_effects": self.side_effects, + "validation_evidence": [item.to_dict() for item in self.validation_evidence], + "warnings": self.warnings, + "unresolved_failures": self.unresolved_failures, + } + + def build_failure_memory(self, believed_succeeded: str, final_validation: str) -> FailureMemory: + successful = [item for item in self.validation_evidence if item.exit_code == 0] + failures = [item for item in self.validation_evidence if item.exit_code != 0] + weakest_success = min(successful, key=lambda item: item.strength).label if successful else "agent assertion" + strongest_failure = max(failures, key=lambda item: item.strength).label if failures else final_validation + context_differences = sorted( + { + "private-runtime dependency" if item.depended_on_private_runtime else "clean task context" + for item in self.validation_evidence + } + ) + contradiction = ( + "Something passed in one context but failed in another, so the execution contexts or assumptions may differ." + if successful and (failures or final_validation) + else "Final validation did not confirm the attempted solution." + ) + return FailureMemory( + believed_succeeded=believed_succeeded, + final_validation=final_validation, + contradiction=contradiction, + context_differences=context_differences, + files_and_side_effects={ + "created": sorted(self.files_created), + "modified": sorted(self.files_modified), + "deleted": sorted(self.files_deleted), + "side_effects": self.side_effects, + }, + contamination_warnings=list(self.warnings), + strongest_failure_evidence=strongest_failure, + weakest_success_evidence=weakest_success, + ) + + +class TaskExecutionContext: + """Builds clean task environments and records generic command effects.""" + + _PRESERVED_NAMES = { + "HOME", "USER", "LOGNAME", "SHELL", "TERM", "COLORTERM", "LANG", "TZ", + "TMPDIR", "TMP", "TEMP", "XDG_RUNTIME_DIR", "DISPLAY", "WAYLAND_DISPLAY", + "SSH_AUTH_SOCK", "SYSTEMROOT", "COMSPEC", "PATHEXT", + } + _PRESERVED_PREFIXES = ("LC_",) + + def __init__( + self, + workspace: Path, + *, + private_paths: Iterable[str | Path] = (), + task_environment: Mapping[str, str] | None = None, + allowed_private_paths: Iterable[str | Path] = (), + ) -> None: + runtime_paths: list[str | Path] = [] + for name in ("VIRTUAL_ENV", "CONDA_PREFIX", "CONDA_ENV_PATH"): + value = os.environ.get(name) + if value: + runtime_paths.append(value) + self.boundaries = PathBoundaries.discover(workspace, private_paths, runtime_paths) + self.allowed_private_paths = tuple(_safe_resolve(item) for item in allowed_private_paths) + self.task_environment = dict(task_environment or {}) + self.environment = self._build_environment(os.environ) + self._attempt_files_before: dict[str, FileRecord] = {} + self.attempt = AttemptState(before=self.fingerprint(workspace, self.environment)) + + def _allowed_private(self, path: str | Path) -> bool: + resolved = _safe_resolve(path) + return any(_is_within(resolved, allowed) for allowed in self.allowed_private_paths) + + def _build_environment(self, source: Mapping[str, str]) -> dict[str, str]: + env: dict[str, str] = {} + for name, value in source.items(): + if name == "PATH": + continue + if name.startswith(("VILLANI_", "CODEX_")): + continue + if name in self._PRESERVED_NAMES or name.startswith(self._PRESERVED_PREFIXES): + if not self.boundaries.contains_private(value): + env[name] = value + path_entries: list[str] = [] + for entry in source.get("PATH", os.defpath).split(os.pathsep): + if not entry: + continue + if self.boundaries.classify(entry) == "private-runtime" and not self._allowed_private(entry): + continue + if entry not in path_entries: + path_entries.append(entry) + env["PATH"] = os.pathsep.join(path_entries) or os.defpath + for name, value in self.task_environment.items(): + if self.boundaries.contains_private(value) and not any( + self._allowed_private(piece) for piece in value.split(os.pathsep) if piece + ): + continue + env[str(name)] = str(value) + return env + + def begin_attempt(self) -> AttemptState: + before = self.fingerprint(self.boundaries.workspace, self.environment) + self._attempt_files_before = self.snapshot_files() + self.attempt = AttemptState(before=before) + return self.attempt + + def existed_at_attempt_start(self, path: str | Path) -> bool: + return str(_safe_resolve(path)) in self._attempt_files_before + + def finish_attempt(self) -> AttemptState: + after = self.fingerprint(self.boundaries.workspace, self.environment) + self.attempt.after = after + cumulative = self._mutation_diff( + self._attempt_files_before, + self.snapshot_files(), + self.attempt.before, + after, + ) + for item in cumulative.created: + self.attempt.files_created.add(item.path) + for item in cumulative.modified: + self.attempt.files_modified.add(item.path) + for item in cumulative.deleted: + self.attempt.files_deleted.add(item.path) + cumulative_payload = cumulative.to_dict() + if any(cumulative_payload.values()): + self.attempt.side_effects.append({"scope": "cumulative-attempt", **cumulative_payload}) + if "private-runtime" in cumulative.path_classes and PRIVATE_WARNING not in self.attempt.warnings: + self.attempt.warnings.append(PRIVATE_WARNING) + return self.attempt + + def fingerprint(self, cwd: Path, env: Mapping[str, str]) -> ExecutionFingerprint: + value_hashes = {name: _digest(value) for name, value in sorted(env.items())} + return ExecutionFingerprint( + cwd=str(cwd.resolve()), + user=getpass.getuser(), + shell=env.get("SHELL") or os.environ.get("SHELL", ""), + path=env.get("PATH", ""), + environment_names=sorted(env), + environment_hash=_digest(json.dumps(value_hashes, sort_keys=True)), + environment_value_hashes=value_hashes, + processes=self._processes(), + open_ports=self._open_ports(), + ) + + def _snapshot_root(self, root: Path) -> dict[str, FileRecord]: + records: dict[str, FileRecord] = {} + if not root.exists(): + return records + try: + paths = [root, *root.rglob("*")] + except OSError: + paths = [root] + for path in paths: + try: + info = path.lstat() + except OSError: + continue + mode = stat.S_IMODE(info.st_mode) + kind = "symlink" if path.is_symlink() else "directory" if path.is_dir() else "file" + target = os.readlink(path) if path.is_symlink() else None + records[str(path.resolve(strict=False))] = FileRecord( + path=str(path.resolve(strict=False)), path_class=self.boundaries.classify(path), kind=kind, + mode=mode, size=info.st_size, mtime_ns=info.st_mtime_ns, link_target=target, + ) + return records + + def snapshot_files(self) -> dict[str, FileRecord]: + result = self._snapshot_root(self.boundaries.workspace) + for root in self.boundaries.private_paths: + result.update(self._snapshot_root(root)) + return result + + @staticmethod + def _processes() -> list[int]: + proc = Path("/proc") + if not proc.exists(): + return [] + return sorted(int(item.name) for item in proc.iterdir() if item.name.isdigit()) + + @staticmethod + def _open_ports() -> list[str]: + ports: set[str] = set() + for name in ("tcp", "tcp6", "udp", "udp6"): + path = Path("/proc/net") / name + try: + rows = path.read_text(encoding="utf-8", errors="replace").splitlines()[1:] + except OSError: + continue + for row in rows: + columns = row.split() + if len(columns) > 3: + ports.add(f"{name}:{columns[1]}:{columns[3]}") + return sorted(ports) + + def resolved_executables(self, command: str, env: Mapping[str, str]) -> list[str]: + resolved: list[str] = [] + try: + tokens = shlex.split(command) + except ValueError: + tokens = [] + expect_command = True + separators = {";", "&&", "||", "|"} + for token in tokens: + if token in separators: + expect_command = True + continue + if expect_command and "=" not in token: + candidate = shutil.which(token, path=env.get("PATH")) + if candidate and candidate not in resolved: + resolved.append(str(_safe_resolve(candidate))) + expect_command = False + shell = shutil.which(env.get("SHELL", ""), path=env.get("PATH")) if env.get("SHELL") else None + if shell and shell not in resolved: + resolved.insert(0, str(_safe_resolve(shell))) + return resolved + + def _mutation_diff( + self, + before: dict[str, FileRecord], + after: dict[str, FileRecord], + before_fp: ExecutionFingerprint, + after_fp: ExecutionFingerprint, + ) -> MutationSummary: + created_keys = after.keys() - before.keys() + deleted_keys = before.keys() - after.keys() + common = before.keys() & after.keys() + modified_keys = { + key for key in common + if (before[key].mtime_ns, before[key].size, before[key].kind, before[key].link_target) + != (after[key].mtime_ns, after[key].size, after[key].kind, after[key].link_target) + } + permissions = sorted(key for key in common if before[key].mode != after[key].mode) + return MutationSummary( + created=[after[key] for key in sorted(created_keys)], + modified=[after[key] for key in sorted(modified_keys)], + deleted=[before[key] for key in sorted(deleted_keys)], + permissions_changed=permissions, + symlinks_created=sorted(key for key in created_keys if after[key].kind == "symlink"), + directories_modified=sorted(key for key in modified_keys if after[key].kind == "directory"), + processes_started=sorted(set(after_fp.processes) - set(before_fp.processes)), + ports_opened=sorted(set(after_fp.open_ports) - set(before_fp.open_ports)), + ) + + def run(self, command: str, cwd: Path, timeout: int) -> tuple[subprocess.CompletedProcess[str], CommandRecord]: + env = dict(self.environment) + before_fp = self.fingerprint(cwd, env) + before_files = self.snapshot_files() + executables = self.resolved_executables(command, env) + started = time.monotonic() + proc = subprocess.run( + command, shell=True, cwd=str(cwd), env=env, capture_output=True, text=True, timeout=timeout + ) + duration = time.monotonic() - started + after_fp = self.fingerprint(cwd, env) + mutations = self._mutation_diff(before_files, self.snapshot_files(), before_fp, after_fp) + try: + command_tokens = shlex.split(command, posix=os.name != "nt") + except ValueError: + command_tokens = [] + private_dependency = any( + self.boundaries.classify(path) == "private-runtime" and not self._allowed_private(path) + for path in executables + ) or any( + self.boundaries.classify(piece) == "private-runtime" and not self._allowed_private(piece) + for piece in command_tokens + if piece.startswith(("/", "~")) + ) + private_mutation = "private-runtime" in mutations.path_classes + warnings = [PRIVATE_WARNING] if private_dependency or private_mutation else [] + classes = set(mutations.path_classes) + for token in command_tokens: + if token.startswith(("/", "~")): + classes.add(self.boundaries.classify(token)) + if mutations.processes_started or mutations.ports_opened: + classes.add("external/system") + record = CommandRecord( + command=command, + cwd=str(cwd.resolve()), + environment_hash=before_fp.environment_hash, + resolved_executables=executables, + exit_code=proc.returncode, + duration_seconds=round(duration, 6), + before=before_fp, + after=after_fp, + mutations=mutations, + path_classes=sorted(classes), + depended_on_private_runtime=private_dependency, + used_clean_task_context=not private_dependency, + warnings=warnings, + ) + self.attempt.add_command(record) + return proc, record + + def record_final_result(self, summary: str, succeeded: bool) -> ValidationEvidence: + evidence = ValidationEvidence( + command=summary or "final validation", + label="official/verifier result", + strength=5, + context_hash=self.attempt.after.environment_hash if self.attempt.after else self.attempt.before.environment_hash, + clean_task_context=True, + depended_on_private_runtime=False, + produced_artifacts=False, + scope="final expected behaviour", + exit_code=0 if succeeded else 1, + ) + self.attempt.add_evidence(evidence) + return evidence + + def record_validation( + self, + record: CommandRecord, + *, + kind: str = "smoke", + final_behavior: bool = False, + official: bool = False, + ) -> ValidationEvidence: + produced_artifacts = bool(record.mutations.created or record.mutations.modified) + if official: + label, strength = "official/verifier result", 5 + elif kind == "project" and record.used_clean_task_context: + label, strength = "project/task tests in clean task context", 4 + elif kind == "smoke" and record.used_clean_task_context: + label, strength = "independent smoke test in clean task context", 3 + elif record.depended_on_private_runtime: + label, strength = "smoke test in polluted/private context", 2 + else: + label, strength = "command exit code only", 1 + evidence = ValidationEvidence( + command=record.command, + label=label, + strength=strength, + context_hash=record.environment_hash, + clean_task_context=record.used_clean_task_context, + depended_on_private_runtime=record.depended_on_private_runtime, + produced_artifacts=produced_artifacts, + scope="final expected behaviour" if final_behavior else "partial behaviour", + exit_code=record.exit_code, + ) + self.attempt.add_evidence(evidence) + return evidence diff --git a/villani_code/state.py b/villani_code/state.py index 21d6e726..33bc26a5 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -4,6 +4,7 @@ import ast import json import re +import sys import time from pathlib import Path from typing import Any, Callable @@ -20,6 +21,7 @@ from villani_code.context_governance import ContextGovernanceManager from villani_code.edits import ProposalStore from villani_code.execution import ExecutionBudget, ExecutionResult +from villani_code.execution_context import FailureMemory, TaskExecutionContext from villani_code.hooks import HookRunner from villani_code.mcp import load_mcp_config from villani_code.permissions import Decision, PermissionConfig, PermissionEngine @@ -41,6 +43,7 @@ from villani_code.transcripts import save_transcript from villani_code.context_projection import build_model_context_packet, render_model_context_packet from villani_code.event_recorder import RuntimeEventRecorder +from villani_code.debug_artifacts import resolve_debug_root from villani_code.debug_mode import DebugConfig, DebugMode from villani_code.debug_recorder import DebugRecorder from villani_code.mission_state import MissionState, create_mission_state, get_mission_dir, save_mission_state @@ -488,6 +491,9 @@ def __init__( benchmark_config: BenchmarkRuntimeConfig | None = None, debug_config: DebugConfig | None = None, provider: str | None = None, + private_runtime_paths: list[Path] | None = None, + task_environment: dict[str, str] | None = None, + allowed_private_paths: list[Path] | None = None, ): self.client = client self.repo = repo @@ -517,6 +523,18 @@ def __init__( self.benchmark_config = benchmark_config or BenchmarkRuntimeConfig() self._debug_config = debug_config or DebugConfig(mode=DebugMode.OFF) self.provider = provider + discovered_private_paths: list[Path] = list(private_runtime_paths or []) + discovered_private_paths.append(Path(__file__).resolve().parent) + discovered_private_paths.append(resolve_debug_root(self._debug_config.debug_root)) + if sys.prefix != getattr(sys, "base_prefix", sys.prefix): + discovered_private_paths.append(Path(sys.prefix)) + self._task_execution_context = TaskExecutionContext( + self.repo, + private_paths=discovered_private_paths, + task_environment=task_environment, + allowed_private_paths=allowed_private_paths or [], + ) + self._failure_memory: FailureMemory | None = None self._debug_recorder: DebugRecorder | None = None self._benchmark_noop_completion_attempts = 0 self.console = Console() @@ -601,6 +619,24 @@ def __init__( if self.small_model: self._init_small_model_support() + def record_final_validation( + self, + *, + succeeded: bool, + summary: str, + believed_succeeded: str = "", + ) -> FailureMemory | None: + """Record external/final validation and retain contradictions for the next attempt.""" + attempt = self._task_execution_context.attempt + self._task_execution_context.record_final_result(summary, succeeded) + if succeeded: + self._failure_memory = None + return None + self._failure_memory = attempt.build_failure_memory(believed_succeeded, summary) + if self._debug_recorder is not None: + self._debug_recorder.write_attempt_state(attempt.to_dict(), self._failure_memory.to_dict()) + return self._failure_memory + @property def event_callback(self) -> Callable[[dict[str, Any]], None]: return self._dispatch_event @@ -774,7 +810,12 @@ def run( if approved_plan is not None and not approved_plan.ready_to_execute: raise RuntimeError("Approved plan is not ready to execute; unresolved clarifications remain.") self._ensure_mission(instruction) + self._task_execution_context.begin_attempt() messages = messages or build_initial_messages(self.repo, instruction) + if self._failure_memory is not None: + messages.append( + {"role": "user", "content": [{"type": "text", "text": self._failure_memory.render()}]} + ) if approved_plan is not None: if self._mission_dir is not None: (self._mission_dir / "plan_artifact.json").write_text(json.dumps(approved_plan.to_dict(), indent=2), encoding="utf-8") @@ -1069,6 +1110,12 @@ def _finish_bounded( for block in response.get("content", []) if block.get("type") == "text" ) + attempt_state = self._task_execution_context.finish_attempt() + for command_record in attempt_state.commands: + if not any(item.command == command_record.command for item in attempt_state.validation_evidence): + self._task_execution_context.record_validation(command_record, kind="command") + if not completed: + self._failure_memory = attempt_state.build_failure_memory(final_text, reason) execution = ExecutionResult( final_text=final_text, turns_used=turns_used, @@ -1085,6 +1132,8 @@ def _finish_bounded( runner_failures=collect_runner_failures(transcript), terminated_reason=reason, completed=completed, + attempt_state=attempt_state.to_dict(), + failure_memory=self._failure_memory.to_dict() if self._failure_memory else None, ) transcript["execution"] = execution.to_dict() transcript["final_assistant_content"] = response.get("content", []) @@ -1100,6 +1149,10 @@ def _finish_bounded( if self._event_recorder is not None: self._event_recorder.write_digest() if self._debug_recorder is not None: + self._debug_recorder.write_attempt_state( + attempt_state.to_dict(), + self._failure_memory.to_dict() if self._failure_memory else None, + ) self._debug_recorder.write_final_summary( status=mission_status, termination_reason=reason, @@ -1425,7 +1478,10 @@ def _budget_reason( self.event_callback({"type": "benchmark_scope_reminder_injected", "task_id": self.benchmark_config.task_id, "reason": "no_meaningful_edit"}) messages.append({"role": "user", "content": [{"type": "text", "text": reminder}]}) continue - if self._patch_effect_check_pending and self._patch_effect_check_attempts < self._patch_effect_check_cap: + if ( + self._patch_effect_check_pending + and self._patch_effect_check_attempts < self._patch_effect_check_cap + ): self._patch_effect_check_attempts += 1 check_observation = self._run_patch_effect_check(response, _attributed_changed_files(), instruction) if check_observation: @@ -1708,67 +1764,111 @@ def _run_patch_effect_check(self, response: dict[str, Any], changed_files: list[ for block in response.get("content", []) if isinstance(block, dict) and block.get("type") == "text" ).strip() - candidates = self._canonical_modified_paths(list(changed_files) + sorted(self._current_verification_targets) + sorted(self._intended_targets)) - target = next( - ( - path - for path in candidates - if path - and not path.startswith(("tmp", "temp", "debug", "scratch", ".villani", ".villani_code", "__pycache__")) - and (path.endswith(".py") or path.startswith(("src/", "app/", "lib/", "config/"))) - ), - "", + candidates = self._canonical_modified_paths( + list(changed_files) + + sorted(self._current_verification_targets) + + sorted(self._intended_targets) + ) + attempt = self._task_execution_context.attempt + candidate_summary = summarize_changes(candidates) + has_external_effect = any( + command.mutations.processes_started + or command.mutations.ports_opened + or "private-runtime" in command.path_classes + or "external/system" in command.path_classes + for command in attempt.commands ) - if not target: + if not candidate_summary.intentional and not has_external_effect: self._patch_effect_check_pending = False return "" - target_path = (self.repo / target).resolve() - if not target_path.exists() or not target_path.is_file(): + only_new_files = bool(candidate_summary.intentional) and all( + not self._task_execution_context.existed_at_attempt_start(self.repo / path) + for path in candidate_summary.intentional + ) + if only_new_files and not _is_code_change_oriented_request(objective) and not has_external_effect: self._patch_effect_check_pending = False return "" - patched_text = target_path.read_text(encoding="utf-8", errors="replace") - patched_excerpt = patched_text[:2400] - intended_effect = self._derive_intended_effect(text, target, objective) - syntax_result = "not_applicable" - if target.endswith(".py"): + + file_effects: list[dict[str, Any]] = [] + for relative_path in candidates: + path = (self.repo / relative_path).resolve() + if path.exists() and path.is_file(): + try: + excerpt = path.read_text(encoding="utf-8", errors="replace")[:1200] + except OSError: + excerpt = "" + file_effects.append({"path": relative_path, "state": "present", "excerpt": excerpt}) + else: + file_effects.append({"path": relative_path, "state": "deleted-or-missing", "excerpt": ""}) + + cumulative_effect = { + "files": file_effects, + "commands": [ + { + "command": item.command, + "exit_code": item.exit_code, + "path_classes": item.path_classes, + "warnings": item.warnings, + } + for item in attempt.commands + ], + "side_effects": attempt.side_effects, + "validation_evidence": [item.to_dict() for item in attempt.validation_evidence], + "unresolved_warnings": [*attempt.warnings, *attempt.unresolved_failures], + } + intended_effect = self._derive_intended_effect(text, ", ".join(candidates), objective) + legacy_syntax_result = "not_applicable" + syntax_target = next((item for item in file_effects if item["path"].endswith(".py")), None) + if syntax_target is not None: try: - ast.parse(patched_text) - syntax_result = "ok" + ast.parse(str(syntax_target["excerpt"])) + legacy_syntax_result = "ok" except SyntaxError as exc: - line = exc.lineno or "?" - syntax_result = f"syntax_error: {exc.msg} at line {line}" + legacy_syntax_result = f"syntax_error: {exc.msg} at line {exc.lineno or '?'}" prompt = ( - "You are checking whether a code edit actually matches its intended effect.\n\n" + "Check whether the cumulative effects of this entire attempt match its intended effect. " + "Do not focus on whichever file happened to be edited last. Consider every changed or " + "deleted file, command, observable side effect, validation result, and unresolved warning.\n\n" f"Task objective:\n{objective}\n\n" f"Intended effect:\n{intended_effect}\n\n" - f"Fresh patched code:\n```\n{patched_excerpt}\n```\n\n" - f"Syntax check:\n{syntax_result}\n\n" - "Does the patched code actually implement the intended effect?\n" + f"Cumulative attempt state:\n{json.dumps(cumulative_effect, indent=2)[:12000]}\n\n" "Answer exactly one of:\nYES\nNO: " ) self.event_callback( { "type": "patch_effect_critic_started", "canonical_modified_paths": candidates, - "target_file": target, - "syntax_check": syntax_result, + "attempt_state_summary": cumulative_effect, } ) - critic_payload = {"model": self.model, "messages": [{"role": "user", "content": [{"type": "text", "text": prompt}]}], "system": "", "max_tokens": 120, "stream": False} + critic_payload = { + "model": self.model, + "messages": [{"role": "user", "content": [{"type": "text", "text": prompt}]}], + "system": "", + "max_tokens": 120, + "stream": False, + } critic_raw = self.client.create_message(critic_payload, stream=False) - critic_text = "\n".join(str(b.get("text", "")) for b in critic_raw.get("content", []) if isinstance(b, dict) and b.get("type") == "text").strip() + critic_text = "\n".join( + str(block.get("text", "")) + for block in critic_raw.get("content", []) + if isinstance(block, dict) and block.get("type") == "text" + ).strip() stripped = critic_text.lstrip() - if syntax_result.startswith("syntax_error"): - return f"Patch-effect check failed: {syntax_result}. Fix syntax before completion." + if legacy_syntax_result.startswith("syntax_error"): + self._patch_effect_check_pending = True + self._pending_verification = legacy_syntax_result + return f"Patch-effect check failed: {legacy_syntax_result}. Fix structure before completion." if stripped.startswith("YES"): self._patch_effect_check_pending = False return "" if stripped.startswith("NO:"): - return f"Patch-effect check mismatch: {critic_text[:400]}" + return f"Patch-effect check mismatch (cumulative attempt): {critic_text[:400]}" self._patch_effect_check_pending = False return ( - "Patch-effect check was inconclusive. No syntax error or concrete mismatch was found. " - "Do not create new verification/proof files. If the edited source already satisfies the task objective, provide the final answer." + "Patch-effect check was inconclusive for the cumulative attempt. Review all changed files, " + "commands, side effects, validation evidence, and warnings before claiming completion. " + "Do not create new verification/proof files solely to manufacture success evidence." ) def _derive_intended_effect(self, rationale: str, target: str, objective: str) -> str: diff --git a/villani_code/state_tooling.py b/villani_code/state_tooling.py index 201ca60c..a5074cd2 100644 --- a/villani_code/state_tooling.py +++ b/villani_code/state_tooling.py @@ -665,6 +665,7 @@ def _debug_callback_with_turn(event_type: str, payload: dict[str, Any]) -> None: unsafe=runner.unsafe, debug_callback=_debug_callback_with_turn, tool_call_id=stable_tool_use_id, + execution_context=getattr(runner, "_task_execution_context", None), ) runner.event_callback( { diff --git a/villani_code/tools.py b/villani_code/tools.py index 423807ed..fc361cc4 100644 --- a/villani_code/tools.py +++ b/villani_code/tools.py @@ -3,7 +3,7 @@ import glob import json import shutil -import subprocess +import shlex from pathlib import Path from typing import Any from urllib.parse import urlparse @@ -11,6 +11,7 @@ import httpx from pydantic import BaseModel, ConfigDict, Field +from villani_code.execution_context import TaskExecutionContext from villani_code.patch_apply import ( PatchApplyError, apply_unified_diff_with_diagnostics, @@ -56,6 +57,8 @@ class BashInput(BaseModel): command: str cwd: str = "." timeout_sec: int = 30 + validation_kind: str = "command" + checks_final_behavior: bool = False class WriteInput(BaseModel): @@ -143,6 +146,7 @@ def execute_tool( unsafe: bool = False, debug_callback: Any | None = None, tool_call_id: str = "", + execution_context: TaskExecutionContext | None = None, ) -> dict[str, Any]: model = TOOL_MODELS.get(name) if not model: @@ -158,13 +162,13 @@ def execute_tool( if name == "Read": return _ok(_run_read(parsed, repo, debug_callback=debug_callback, tool_call_id=tool_call_id)) if name == "Grep": - return _ok(_run_grep(parsed, repo)) + return _ok(_run_grep(parsed, repo, execution_context=execution_context)) if name == "Glob": return _ok(_run_glob(parsed, repo)) if name == "Search": - return _ok(_run_search(parsed, repo)) + return _ok(_run_search(parsed, repo, execution_context=execution_context)) if name == "Bash": - return _ok(_run_bash(parsed, repo, unsafe=unsafe, debug_callback=debug_callback, tool_call_id=tool_call_id)) + return _ok(_run_bash(parsed, repo, unsafe=unsafe, debug_callback=debug_callback, tool_call_id=tool_call_id, execution_context=execution_context)) if name == "Write": return _ok(_run_write(parsed, repo, debug_callback=debug_callback, tool_call_id=tool_call_id)) if name == "Patch": @@ -172,7 +176,7 @@ def execute_tool( if name == "WebFetch": return _ok(_run_webfetch(parsed)) if name.startswith("Git"): - return _ok(_run_git(name, parsed, repo)) + return _ok(_run_git(name, parsed, repo, execution_context=execution_context)) if name == "SubmitPlan": return _ok("Plan artifact submitted") except Exception as exc: @@ -208,15 +212,23 @@ def _run_read(data: ReadInput, repo: Path, debug_callback: Any | None = None, to return raw.decode("utf-8", errors="replace") -def _run_grep(data: GrepInput, repo: Path) -> str: +def _run_grep( + data: GrepInput, + repo: Path, + execution_context: TaskExecutionContext | None = None, +) -> str: base = _safe_path(repo, data.path) - rg_bin = shutil.which("rg") + context = execution_context or TaskExecutionContext(repo) + rg_bin = shutil.which("rg", path=context.environment.get("PATH")) if rg_bin: cmd = [rg_bin, "-n", data.pattern, str(base)] if data.include_hidden: cmd.append("--hidden") - proc = subprocess.run(cmd, capture_output=True, text=True) - return "\n".join(proc.stdout.splitlines()[: data.max_results]) + proc, record = context.run(shlex.join(cmd), repo, 30) + output = "\n".join(proc.stdout.splitlines()[: data.max_results]) + if record.warnings: + output = output + ("\n" if output else "") + "\n".join(record.warnings) + return output return "" @@ -225,40 +237,65 @@ def _run_glob(data: GlobInput, repo: Path) -> str: return "\n".join(sorted(hits)) -def _run_search(data: SearchInput, repo: Path) -> str: - rg_bin = shutil.which("rg") +def _run_search( + data: SearchInput, + repo: Path, + execution_context: TaskExecutionContext | None = None, +) -> str: + context = execution_context or TaskExecutionContext(repo) + rg_bin = shutil.which("rg", path=context.environment.get("PATH")) if not rg_bin: - return _run_grep(GrepInput(pattern=data.query, path=data.path), repo) + return _run_grep(GrepInput(pattern=data.query, path=data.path), repo, execution_context=context) base = _safe_path(repo, data.path) cmd = [rg_bin, "-n", "-C", str(data.context_lines), data.query, str(base)] - proc = subprocess.run(cmd, capture_output=True, text=True) - return proc.stdout + proc, record = context.run(shlex.join(cmd), repo, 30) + suffix = "\n" + "\n".join(record.warnings) if record.warnings else "" + return proc.stdout + suffix -def _run_bash(data: BashInput, repo: Path, unsafe: bool, debug_callback: Any | None = None, tool_call_id: str = "") -> str: +def _run_bash( + data: BashInput, + repo: Path, + unsafe: bool, + debug_callback: Any | None = None, + tool_call_id: str = "", + execution_context: TaskExecutionContext | None = None, +) -> str: lowered = data.command.lower() if not unsafe: for bad in DENYLIST: if bad in lowered: raise ValueError(f"Refusing command: {bad.strip()}") cwd = _safe_path(repo, data.cwd) + context = execution_context or TaskExecutionContext(repo) if callable(debug_callback): debug_callback("command_started", {"command": data.command, "cwd": data.cwd, "tool_call_id": tool_call_id}) - proc = subprocess.run(data.command, shell=True, cwd=str(cwd), capture_output=True, text=True, timeout=data.timeout_sec) + proc, record = context.run(data.command, cwd, data.timeout_sec) + evidence = context.record_validation( + record, + kind=data.validation_kind if data.validation_kind in {"project", "smoke"} else "command", + final_behavior=data.checks_final_behavior, + ) + payload = { + "command": data.command, + "exit_code": proc.returncode, + "stdout": proc.stdout, + "stderr": proc.stderr, + "execution_context": record.to_dict(), + "warnings": record.warnings, + "validation_evidence": evidence.to_dict(), + } if callable(debug_callback): debug_callback( "command_finished", { - "command": data.command, + **payload, "cwd": data.cwd, - "exit_code": proc.returncode, - "stdout": proc.stdout, - "stderr": proc.stderr, "truncated": False, "tool_call_id": tool_call_id, }, ) - return json.dumps({"command": data.command, "exit_code": proc.returncode, "stdout": proc.stdout, "stderr": proc.stderr}, indent=2) + return json.dumps(payload, indent=2) def _run_write(data: WriteInput, repo: Path, debug_callback: Any | None = None, tool_call_id: str = "") -> str: @@ -338,7 +375,12 @@ def _run_webfetch(data: WebFetchInput) -> str: return r.text[:10000] -def _run_git(name: str, data: GitSimpleInput, repo: Path) -> str: +def _run_git( + name: str, + data: GitSimpleInput, + repo: Path, + execution_context: TaskExecutionContext | None = None, +) -> str: mapping = { "GitStatus": ["status", "--short"], "GitDiff": ["diff"], @@ -348,5 +390,9 @@ def _run_git(name: str, data: GitSimpleInput, repo: Path) -> str: "GitCommit": ["commit"], } cmd = ["git", *mapping[name], *data.args] - proc = subprocess.run(cmd, cwd=str(repo), capture_output=True, text=True) - return proc.stdout or proc.stderr + context = execution_context or TaskExecutionContext(repo) + proc, record = context.run(shlex.join(cmd), repo, 30) + output = proc.stdout or proc.stderr + if record.warnings: + output = output + ("\n" if output else "") + "\n".join(record.warnings) + return output From 8b284ae39b4aa09b5196149ce4e7b67ba38a0e75 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Sun, 7 Jun 2026 16:33:38 +1000 Subject: [PATCH 34/37] Bound execution telemetry and recover command timeouts --- CHANGELOG.md | 1 + tests/test_execution_context_isolation.py | 405 ++++++++++++----- tests/test_loop.py | 4 +- villani_code/debug_recorder.py | 7 + villani_code/execution_context.py | 528 ++++++++++++++++++---- villani_code/state.py | 100 ++-- villani_code/state_tooling.py | 48 +- villani_code/tools.py | 80 +++- 8 files changed, 873 insertions(+), 300 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 682c6ca0..c60bcffb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 0.1.0rc1 +- Reduced runner telemetry regressions by separating compact model-visible command observations from full debug artifacts, bounding filesystem snapshots, handling command timeouts as tool results, fixing absolute Read path behaviour, and adding no-progress loop protection while preserving execution-context isolation. - Hardened benchmark validation command resolution with explicit allowlisting and clear environment-failure classification. - Added benchmark interpretation-status policy (`headline_comparable`, `informational_only`, `internal_only`) with blunt report banners. - Expanded aggregate provenance reporting so environment/harness instability is separated from agent weakness in summaries. diff --git a/tests/test_execution_context_isolation.py b/tests/test_execution_context_isolation.py index eb0df283..4a39d1c7 100644 --- a/tests/test_execution_context_isolation.py +++ b/tests/test_execution_context_isolation.py @@ -4,169 +4,346 @@ import os from pathlib import Path -from villani_code.debug_mode import DebugConfig, DebugMode -from villani_code.debug_recorder import DebugRecorder +from villani_code.debug_mode import build_debug_config from villani_code.execution import ExecutionBudget -from villani_code.execution_context import PRIVATE_WARNING, TaskExecutionContext +from villani_code.execution_context import ( + MAX_AGENT_TOOL_RESULT_CHARS, + MAX_COMPACT_RETRY_MEMORY_CHARS, + NO_PROGRESS_MESSAGE, + PRIVATE_WARNING, + TaskExecutionContext, +) from villani_code.state import Runner from villani_code.tools import execute_tool -class CaptureClient: - def __init__(self) -> None: - self.payloads: list[dict[str, object]] = [] +class SequenceClient: + def __init__(self, responses: list[dict]) -> None: + self.responses = responses + self.payloads: list[dict] = [] def create_message(self, payload, stream=False): self.payloads.append(payload) - return { - "id": "done", - "role": "assistant", - "stop_reason": "end_turn", - "content": [{"type": "text", "text": "finished"}], - } + return self.responses.pop(0) -def _make_executable(path: Path, body: str = "#!/bin/sh\nexit 0\n") -> None: - path.write_text(body, encoding="utf-8") - path.chmod(0o755) +def _tool_response(command: str, *, timeout_sec: int = 10, tool_id: str = "tool-1") -> dict: + return { + "id": tool_id, + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": tool_id, + "name": "Bash", + "input": {"command": command, "cwd": ".", "timeout_sec": timeout_sec}, + } + ], + } -def test_task_command_environment_strips_private_runtime_from_path( - tmp_path: Path, monkeypatch, -) -> None: +def _done_response() -> dict: + return { + "id": "done", + "role": "assistant", + "content": [{"type": "text", "text": "finished"}], + } + + +def _run_dir(debug_root: Path) -> Path: + directories = [path for path in debug_root.iterdir() if path.is_dir()] + assert len(directories) == 1 + return directories[0] + + +def _command_rows(run_dir: Path) -> list[dict]: + return [ + json.loads(line) + for line in (run_dir / "commands.jsonl").read_text(encoding="utf-8").splitlines() + if line.strip() + ] + + +def test_compact_model_command_result_and_full_output_in_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + command = "printf '%07000d' 0; printf '%05000d' 0 >&2" + client = SequenceClient([_tool_response(command), _done_response()]) + runner = Runner( + client=client, + repo=tmp_path, + model="test-model", + stream=False, + debug_config=build_debug_config("trace", debug_root), + ) + + result = runner.run("exercise command output") + observation_text = result["transcript"]["tool_results"][0]["content"] + observation = json.loads(observation_text) + + assert len(observation_text) <= MAX_AGENT_TOOL_RESULT_CHARS + assert len(observation["stdout"]) < 7000 + assert len(observation["stderr"]) < 5000 + assert "execution_context" not in observation + + debug_record = _command_rows(_run_dir(debug_root))[0]["full_debug_record"] + assert len(debug_record["stdout"]) == 7000 + assert len(debug_record["stderr"]) == 5000 + assert debug_record["execution_context"]["before"]["environment_hash"] + + +def test_full_fingerprint_is_artifact_only(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + client = SequenceClient([_tool_response("printf ok"), _done_response()]) + runner = Runner( + client=client, + repo=tmp_path, + model="test-model", + stream=False, + debug_config=build_debug_config("trace", debug_root), + ) + + result = runner.run("run one command") + observation = json.loads(result["transcript"]["tool_results"][0]["content"]) + debug_record = _command_rows(_run_dir(debug_root))[0]["full_debug_record"] + + assert "execution_context" not in observation + assert "environment_hash" not in observation + assert debug_record["execution_context"]["resolved_executables"] + assert debug_record["execution_context"]["before"]["environment_names"] + + +def test_private_paths_are_not_recursively_snapshotted(tmp_path: Path, monkeypatch) -> None: workspace = tmp_path / "workspace" private = tmp_path / "runner-private" workspace.mkdir() private.mkdir() - _make_executable(private / "private-command") - monkeypatch.setenv("PATH", os.pathsep.join([str(private), os.environ.get("PATH", "")])) - monkeypatch.setenv("VIRTUAL_ENV", str(private)) + for index in range(200): + (private / f"private-{index}").write_text("private", encoding="utf-8") + private_reads: list[Path] = [] + original_read_bytes = Path.read_bytes + + def tracked_read_bytes(path: Path) -> bytes: + if private in path.parents: + private_reads.append(path) + return original_read_bytes(path) + monkeypatch.setattr(Path, "read_bytes", tracked_read_bytes) context = TaskExecutionContext(workspace, private_paths=[private]) - proc, record = context.run("printf '%s' \"$PATH\"", workspace, 10) + proc, record = context.run(f"printf changed > {private / 'state'}", workspace, 10) + context.record_validation(record, kind="command") assert proc.returncode == 0 - assert str(private) not in proc.stdout.split(os.pathsep) - assert str(private) not in record.before.path.split(os.pathsep) - assert "VIRTUAL_ENV" not in record.before.environment_names + assert private_reads == [] + assert context.boundaries.classify(private / "state") == "private-runtime" + assert PRIVATE_WARNING in record.warnings + assert record.external_or_private_state_may_have_changed is True -def test_private_runtime_mutation_warns_in_tool_context_and_debug_artifact( - tmp_path: Path, -) -> None: +def test_debug_root_is_excluded_from_workspace_snapshot(tmp_path: Path, monkeypatch) -> None: workspace = tmp_path / "workspace" - private = tmp_path / "runner-private" - debug_root = tmp_path / "debug" + debug_root = workspace / "debug-artifacts" workspace.mkdir() - private.mkdir() - context = TaskExecutionContext(workspace, private_paths=[private]) + debug_root.mkdir() + for index in range(200): + (debug_root / f"artifact-{index}").write_text("debug", encoding="utf-8") + debug_reads: list[Path] = [] + original_read_bytes = Path.read_bytes + + def tracked_read_bytes(path: Path) -> bytes: + if debug_root in path.parents: + debug_reads.append(path) + return original_read_bytes(path) + + monkeypatch.setattr(Path, "read_bytes", tracked_read_bytes) + context = TaskExecutionContext(workspace, snapshot_excluded_paths=[debug_root]) + context.run("printf ok", workspace, 10) - result = execute_tool( - "Bash", - {"command": f"printf changed > {private / 'state'}", "cwd": ".", "timeout_sec": 10}, - workspace, - unsafe=True, - execution_context=context, + assert debug_reads == [] + + +def test_timeout_is_structured_and_attempt_continues(tmp_path: Path) -> None: + client = SequenceClient( + [ + _tool_response("sleep 2", timeout_sec=1, tool_id="timeout"), + _tool_response("printf recovered", tool_id="recovery"), + _done_response(), + ] ) - payload = json.loads(result["content"]) - context.finish_attempt() - - assert PRIVATE_WARNING in payload["warnings"] - assert PRIVATE_WARNING in context.attempt.warnings - assert "private-runtime" in payload["execution_context"]["path_classes"] - assert payload["validation_evidence"]["label"] == "smoke test in polluted/private context" - - recorder = DebugRecorder( - DebugConfig(mode=DebugMode.TRACE, debug_root=debug_root), - run_id="isolation", - objective="generic task", - repo=workspace, - mode="execution", - model="test-model", + runner = Runner(client=client, repo=tmp_path, model="test-model", stream=False) + + result = runner.run( + "recover after timeout", + execution_budget=ExecutionBudget( + max_turns=5, + max_tool_calls=5, + max_seconds=10, + max_no_edit_turns=5, + max_reconsecutive_recon_turns=5, + ), ) - recorder.write_attempt_state(context.attempt.to_dict()) - artifact = json.loads((debug_root / "isolation" / "attempt_state.json").read_text()) - assert PRIVATE_WARNING in artifact["attempt_state"]["warnings"] + timeout_observation = json.loads(result["transcript"]["tool_results"][0]["content"]) + assert timeout_observation["exit_code"] == 124 + assert timeout_observation["timed_out"] is True + assert timeout_observation["message"] == "Command timed out before completion." + assert len(result["execution"]["attempt_state"]["commands"]) == 2 + assert result["execution"]["attempt_state"]["commands"][1]["exit_code"] == 0 -def test_cumulative_attempt_state_keeps_all_files_when_last_is_helper(tmp_path: Path) -> None: - workspace = tmp_path / "workspace" - workspace.mkdir() - context = TaskExecutionContext(workspace) - context.begin_attempt() - (workspace / "primary-one").write_text("one", encoding="utf-8") - (workspace / "primary-two").write_text("two", encoding="utf-8") - (workspace / "helper-last").write_text("temporary", encoding="utf-8") - attempt = context.finish_attempt() - - created_names = {Path(path).name for path in attempt.files_created} - assert created_names == {"primary-one", "primary-two", "helper-last"} - assert attempt.side_effects[-1]["scope"] == "cumulative-attempt" +def test_absolute_read_outside_workspace_is_rejected_exactly(tmp_path: Path) -> None: + requested = Path(tmp_path.anchor) / "outside-workspace-file" + result = execute_tool("Read", {"file_path": str(requested)}, tmp_path) + assert result["is_error"] is True + assert result["content"] == ( + "Read is workspace-only for this path. Use a shell command such as cat, sed, or head " + "if you need to inspect system files." + ) + assert not (tmp_path / str(requested).lstrip("/")).exists() -def test_clean_failure_outweighs_polluted_success_and_records_contradiction( - tmp_path: Path, -) -> None: - workspace = tmp_path / "workspace" - private = tmp_path / "runner-private" - workspace.mkdir() - private.mkdir() - private_check = private / "private-check" - _make_executable(private_check) - context = TaskExecutionContext(workspace, private_paths=[private]) - _proc, polluted = context.run(str(private_check), workspace, 10) - polluted_evidence = context.record_validation(polluted, kind="smoke") - _proc, clean = context.run("exit 1", workspace, 10) - clean_evidence = context.record_validation(clean, kind="smoke", final_behavior=True) +def test_repeated_commands_warn_then_force_no_progress(tmp_path: Path) -> None: + context = TaskExecutionContext(tmp_path) + observations: list[dict] = [] + results: list[dict] = [] + for _index in range(4): + result = execute_tool( + "Bash", + {"command": ":", "cwd": ".", "timeout_sec": 5}, + tmp_path, + unsafe=True, + execution_context=context, + ) + results.append(result) + observations.append(json.loads(result["content"])) - assert polluted_evidence.label == "smoke test in polluted/private context" - assert clean_evidence.label == "independent smoke test in clean task context" - assert clean_evidence.strength > polluted_evidence.strength - assert polluted_evidence.suspicious is True - assert context.attempt.unresolved_failures + assert observations[2]["next_action"] == NO_PROGRESS_MESSAGE + assert results[2]["force_finalization"] is False + assert results[3]["force_finalization"] is True -def test_retry_receives_structured_failure_memory_with_context_difference( - tmp_path: Path, -) -> None: - workspace = tmp_path / "workspace" - private = tmp_path / "runner-private" - workspace.mkdir() +def test_retry_memory_is_compact_but_full_memory_remains_in_artifact(tmp_path: Path) -> None: + debug_root = tmp_path / "debug" + private = tmp_path / "private" private.mkdir() - private_check = private / "private-check" - _make_executable(private_check) - client = CaptureClient() + client = SequenceClient([_done_response()]) runner = Runner( client=client, - repo=workspace, + repo=tmp_path, model="test-model", stream=False, private_runtime_paths=[private], + debug_config=build_debug_config("trace", debug_root), ) - - _proc, polluted = runner._task_execution_context.run(str(private_check), workspace, 10) - runner._task_execution_context.record_validation(polluted, kind="smoke") + runner._ensure_mission("first attempt") + proc, record = runner._task_execution_context.run(f"printf changed > {private / 'state'}", tmp_path, 5) + assert proc.returncode == 0 + runner._task_execution_context.record_validation(record, kind="smoke") memory = runner.record_final_validation( succeeded=False, - summary="final clean-context validation failed", - believed_succeeded="the private-context smoke check passed", + summary="final validation failed " + ("detail " * 1000), + believed_succeeded="weak check passed " + ("claim " * 1000), ) assert memory is not None - runner.run( - "retry the task", + runner.run("retry") + retry_text = next( + block["text"] + for message in client.payloads[0]["messages"] + for block in message.get("content", []) + if isinstance(block, dict) and "Previous attempt failure summary" in block.get("text", "") + ) + artifact = json.loads((_run_dir(debug_root) / "attempt_state.json").read_text(encoding="utf-8")) + + assert len(retry_text) <= MAX_COMPACT_RETRY_MEMORY_CHARS + assert "files_and_side_effects" not in retry_text + assert artifact["failure_memory"]["files_and_side_effects"] + assert len(artifact["failure_memory"]["believed_succeeded"]) > len(retry_text) + + +def test_isolation_preserved_and_resolved_executable_recorded(tmp_path: Path, monkeypatch) -> None: + workspace = tmp_path / "workspace" + private = tmp_path / "private" + workspace.mkdir() + private.mkdir() + executable = private / "private-command" + executable.write_text("#!/bin/sh\nprintf private", encoding="utf-8") + executable.chmod(0o755) + monkeypatch.setenv("PATH", os.pathsep.join([str(private), os.environ.get("PATH", "")])) + monkeypatch.setenv("VIRTUAL_ENV", str(private)) + context = TaskExecutionContext(workspace, private_paths=[private]) + + proc, record = context.run("printf '%s' \"$PATH\"", workspace, 5) + + assert str(private) not in proc.stdout.split(os.pathsep) + assert str(private) not in record.before.path.split(os.pathsep) + assert "VIRTUAL_ENV" not in record.before.environment_names + assert record.resolved_executables + + +def test_runner_forces_stop_after_second_no_progress_event(tmp_path: Path) -> None: + client = SequenceClient( + [ + _tool_response(":", tool_id="repeat-1"), + _tool_response(":", tool_id="repeat-2"), + _tool_response(":", tool_id="repeat-3"), + _tool_response(":", tool_id="repeat-4"), + ] + ) + runner = Runner(client=client, repo=tmp_path, model="test-model", stream=False) + + result = runner.run( + "avoid repeated work", execution_budget=ExecutionBudget( - max_turns=2, - max_tool_calls=2, - max_seconds=10, - max_no_edit_turns=2, - max_reconsecutive_recon_turns=2, + max_turns=8, + max_tool_calls=8, + max_seconds=15, + max_no_edit_turns=8, + max_reconsecutive_recon_turns=8, ), ) - rendered_messages = json.dumps(client.payloads[0]["messages"]) - assert "Previous attempt failure memory" in rendered_messages - assert "Something passed in one context but failed in another" in rendered_messages - assert "private-runtime dependency" in rendered_messages + assert result["execution"]["terminated_reason"] == "no_progress" + assert result["execution"]["attempt_state"]["no_progress_events"] == 2 + assert len(client.payloads) == 4 + + +def test_workspace_snapshot_cap_is_recorded(tmp_path: Path, monkeypatch) -> None: + import villani_code.execution_context as execution_context + + for index in range(6): + (tmp_path / f"file-{index}").write_text(str(index), encoding="utf-8") + monkeypatch.setattr(execution_context, "MAX_SNAPSHOT_FILES", 3) + context = TaskExecutionContext(tmp_path) + + _proc, record = context.run("printf ok", tmp_path, 5) + + assert record.snapshot_truncated is True + assert record.to_dict()["snapshot_truncated"] is True + + +def test_runner_policy_does_not_remap_absolute_read_path(tmp_path: Path) -> None: + runner = Runner(client=SequenceClient([]), repo=tmp_path, model="test-model", stream=False) + requested = Path(tmp_path.anchor) / "outside-workspace-file" + + result = runner._execute_tool_with_policy( + "Read", {"file_path": str(requested)}, "read-outside", 0 + ) + + assert result["content"] == ( + "Read is workspace-only for this path. Use a shell command such as cat, sed, or head " + "if you need to inspect system files." + ) + + +def test_repeated_reads_participate_in_no_progress_guard(tmp_path: Path) -> None: + target = tmp_path / "note" + target.write_text("content", encoding="utf-8") + runner = Runner(client=SequenceClient([]), repo=tmp_path, model="test-model", stream=False) + results = [ + runner._execute_tool_with_policy("Read", {"file_path": "note"}, f"read-{index}", 0) + for index in range(4) + ] + + assert NO_PROGRESS_MESSAGE in results[2]["content"] + assert results[3]["force_finalization"] is True diff --git a/tests/test_loop.py b/tests/test_loop.py index e50a686d..1dd29512 100644 --- a/tests/test_loop.py +++ b/tests/test_loop.py @@ -490,7 +490,7 @@ def _execute_and_set_pending(tool_name, tool_input, tool_use_id, message_count): assert "order-check" in next_user_message["content"][-1]["content"] -def test_loop_does_not_append_duplicate_validation_summary_when_dedup_returns_empty(tmp_path: Path): +def test_loop_does_not_append_routine_validation_summaries_after_commands(tmp_path: Path): client = FakeClientTwoBashThenDone() runner = Runner(client=client, repo=tmp_path, model="m", stream=False) summaries = iter( @@ -518,7 +518,7 @@ def test_loop_does_not_append_duplicate_validation_summary_when_dedup_returns_em if m["role"] == "user" and m["content"] and m["content"][0].get("type") == "tool_result" ) - assert "" in second_tool_result["content"][-1]["content"] + assert "" not in second_tool_result["content"][-1]["content"] assert "" not in third_tool_result["content"][-1]["content"] def test_loop_retries_twice_then_succeeds(tmp_path: Path): diff --git a/villani_code/debug_recorder.py b/villani_code/debug_recorder.py index e656a63b..4654ddb6 100644 --- a/villani_code/debug_recorder.py +++ b/villani_code/debug_recorder.py @@ -298,6 +298,7 @@ def record_command_finish( truncated: bool = False, tool_call_id: str = "", turn_index: int | None = None, + full_debug_record: dict[str, Any] | None = None, ) -> None: payload = { "ts": self._ts(), @@ -309,6 +310,12 @@ def record_command_finish( "truncated": truncated, "tool_call_id": tool_call_id, } + if isinstance(full_debug_record, dict): + debug_record = copy.deepcopy(full_debug_record) + if not self.config.capture_command_output: + debug_record["stdout"] = str(debug_record.get("stdout", ""))[:240] + debug_record["stderr"] = str(debug_record.get("stderr", ""))[:240] + payload["full_debug_record"] = debug_record self._safe_append_jsonl("commands", payload) self.record_event("command_finished", f"Command finished: {command}", payload, turn_index=turn_index) if exit_code != 0: diff --git a/villani_code/execution_context.py b/villani_code/execution_context.py index e004377a..eb2b7ff6 100644 --- a/villani_code/execution_context.py +++ b/villani_code/execution_context.py @@ -6,6 +6,7 @@ import os import shlex import shutil +import signal import stat import subprocess import time @@ -17,12 +18,44 @@ "Warning: this command modified or depended on runner-private state rather than only " "task/workspace state. Success evidence from this context may not reflect final validation." ) +TIMEOUT_MESSAGE = "Command timed out before completion." +NO_PROGRESS_MESSAGE = ( + "No meaningful progress has been detected. Make a materially different change, run a " + "materially different validation, or submit/stop." +) +TRUNCATION_NOTICE = "[truncated; full details written to debug artifacts]" + +MAX_AGENT_STDOUT_CHARS = 6000 +MAX_AGENT_STDERR_CHARS = 4000 +MAX_AGENT_WARNING_CHARS = 2000 +MAX_AGENT_MUTATION_SUMMARY_CHARS = 2000 +MAX_AGENT_TOOL_RESULT_CHARS = 12000 +MAX_AGENT_WARNING_COUNT = 5 +MAX_AGENT_MUTATION_ENTRIES = 10 +MAX_AGENT_ATTEMPT_STATE_SUMMARY_CHARS = 1500 +MAX_COMPACT_RETRY_MEMORY_CHARS = 2500 +MAX_SNAPSHOT_FILES = 5000 +MAX_SNAPSHOT_FILE_BYTES = 2_000_000 +NO_PROGRESS_MAX_STEPS = 8 +NO_PROGRESS_MAX_REPEATED_COMMANDS = 3 +NO_PROGRESS_MAX_REPEATED_WARNINGS = 2 + +DEFAULT_SNAPSHOT_SKIP_DIRS = frozenset( + { + ".git", "node_modules", "__pycache__", ".pytest_cache", ".mypy_cache", + ".ruff_cache", ".venv", "venv", "env", "dist", "build", "target", ".cache", + } +) def _digest(value: str) -> str: return hashlib.sha256(value.encode("utf-8", errors="replace")).hexdigest()[:16] +def _digest_bytes(value: bytes) -> str: + return hashlib.sha256(value).hexdigest()[:16] + + def _is_within(path: Path, root: Path) -> bool: try: path.resolve(strict=False).relative_to(root.resolve(strict=False)) @@ -35,6 +68,21 @@ def _safe_resolve(value: str | Path) -> Path: return Path(value).expanduser().resolve(strict=False) +def _decode_partial(value: str | bytes | None) -> str: + if value is None: + return "" + if isinstance(value, bytes): + return value.decode("utf-8", errors="replace") + return str(value) + + +def _cap_text(value: str, limit: int) -> str: + if len(value) <= limit: + return value + room = max(0, limit - len(TRUNCATION_NOTICE) - 1) + return value[:room] + "\n" + TRUNCATION_NOTICE + + @dataclass(frozen=True, slots=True) class PathBoundaries: workspace: Path @@ -48,13 +96,11 @@ def discover( runtime_paths: Iterable[str | Path] = (), ) -> "PathBoundaries": workspace = workspace.resolve() - candidates = [*configured, *runtime_paths] normalized: list[Path] = [] - for candidate in candidates: + for candidate in [*configured, *runtime_paths]: if not str(candidate).strip(): continue path = _safe_resolve(candidate) - # A source checkout may contain the runner and the task. The workspace always wins. if _is_within(path, workspace) or _is_within(workspace, path): continue if path not in normalized: @@ -72,10 +118,10 @@ def classify(self, path: str | Path) -> str: def contains_private(self, value: str) -> bool: if not value: return False - for piece in value.split(os.pathsep): - if piece and self.classify(piece) == "private-runtime": - return True - return False + return any( + piece and self.classify(piece) == "private-runtime" + for piece in value.split(os.pathsep) + ) @dataclass(slots=True) @@ -87,6 +133,14 @@ class FileRecord: size: int mtime_ns: int link_target: str | None = None + content_hash: str | None = None + + +@dataclass(slots=True) +class Snapshot: + records: dict[str, FileRecord] = field(default_factory=dict) + truncated: bool = False + inspected_files: int = 0 @dataclass(slots=True) @@ -104,9 +158,30 @@ class MutationSummary: def path_classes(self) -> set[str]: return {item.path_class for item in [*self.created, *self.modified, *self.deleted]} + def has_effects(self) -> bool: + return any(asdict(self).values()) + def to_dict(self) -> dict[str, Any]: return asdict(self) + def compact(self) -> list[str]: + entries: list[str] = [] + groups = ( + ("created", self.created), ("modified", self.modified), ("deleted", self.deleted) + ) + for action, records in groups: + for record in records: + entries.append(f"{action}: {record.path}") + entries.extend(f"permissions changed: {path}" for path in self.permissions_changed) + entries.extend(f"symlink created: {path}" for path in self.symlinks_created) + if self.processes_started: + entries.append(f"processes started: {len(self.processes_started)}") + if self.ports_opened: + entries.append(f"network listeners changed: {len(self.ports_opened)}") + if len(entries) > MAX_AGENT_MUTATION_ENTRIES: + entries = entries[:MAX_AGENT_MUTATION_ENTRIES] + [TRUNCATION_NOTICE] + return entries + @dataclass(slots=True) class ExecutionFingerprint: @@ -131,6 +206,7 @@ class CommandRecord: environment_hash: str resolved_executables: list[str] exit_code: int + timed_out: bool duration_seconds: float before: ExecutionFingerprint after: ExecutionFingerprint @@ -138,7 +214,11 @@ class CommandRecord: path_classes: list[str] depended_on_private_runtime: bool used_clean_task_context: bool + snapshot_truncated: bool = False + external_or_private_state_may_have_changed: bool = False warnings: list[str] = field(default_factory=list) + no_progress_warning: bool = False + force_finalization: bool = False def to_dict(self) -> dict[str, Any]: return asdict(self) @@ -171,12 +251,34 @@ class FailureMemory: contamination_warnings: list[str] strongest_failure_evidence: str weakest_success_evidence: str + timeout_observed: bool = False def to_dict(self) -> dict[str, Any]: return asdict(self) + def render_compact(self) -> str: + rows = [ + "Previous attempt failure summary:", + f"Final status: {self.final_validation or 'failed'}", + f"Strongest failing evidence: {self.strongest_failure_evidence or 'final validation failure'}", + ] + if self.contradiction: + rows.append(f"Contradiction: {self.contradiction}") + if self.weakest_success_evidence: + rows.append(f"Suspicious weak success evidence: {self.weakest_success_evidence}") + if self.contamination_warnings: + rows.append(f"Private-runtime warning: {self.contamination_warnings[0]}") + if self.timeout_observed: + rows.append(f"Timeout warning: {TIMEOUT_MESSAGE}") + rows.append( + "Recommendation: use the clean task context, address the strongest failure, and run a " + "materially different validation before claiming completion." + ) + return _cap_text("\n".join(rows), MAX_COMPACT_RETRY_MEMORY_CHARS) + + # Compatibility for callers that previously rendered the full structure. def render(self) -> str: - return "Previous attempt failure memory:\n" + json.dumps(self.to_dict(), indent=2, sort_keys=True) + return self.render_compact() @dataclass(slots=True) @@ -191,6 +293,17 @@ class AttemptState: validation_evidence: list[ValidationEvidence] = field(default_factory=list) warnings: list[str] = field(default_factory=list) unresolved_failures: list[str] = field(default_factory=list) + timeouts: int = 0 + snapshot_truncated: bool = False + no_progress_steps: int = 0 + no_progress_events: int = 0 + repeated_commands: dict[str, int] = field(default_factory=dict) + repeated_warnings: dict[str, int] = field(default_factory=dict) + tool_steps: list[dict[str, Any]] = field(default_factory=list) + tool_failures: list[str] = field(default_factory=list) + _last_evidence_signatures: set[str] = field(default_factory=set, repr=False) + _last_command_exit: dict[str, int] = field(default_factory=dict, repr=False) + _previous_command_had_warning: bool = field(default=False, repr=False) def add_command(self, record: CommandRecord) -> None: self.commands.append(record) @@ -200,12 +313,53 @@ def add_command(self, record: CommandRecord) -> None: self.files_modified.add(item.path) for item in record.mutations.deleted: self.files_deleted.add(item.path) - mutation = record.mutations.to_dict() - if any(mutation.values()): - self.side_effects.append({"command": record.command, **mutation}) + if record.mutations.has_effects(): + self.side_effects.append({"command": record.command, **record.mutations.to_dict()}) + if record.timed_out: + self.timeouts += 1 + self.snapshot_truncated = self.snapshot_truncated or record.snapshot_truncated for warning in record.warnings: if warning not in self.warnings: self.warnings.append(warning) + self.repeated_warnings[warning] = self.repeated_warnings.get(warning, 0) + 1 + + def register_progress(self, record: CommandRecord, evidence: ValidationEvidence) -> tuple[bool, bool]: + command_signature = " ".join(record.command.split()) + count = self.repeated_commands.get(command_signature, 0) + 1 + self.repeated_commands[command_signature] = count + evidence_signature = f"{command_signature}|{evidence.exit_code}|{evidence.label}" + new_evidence = evidence_signature not in self._last_evidence_signatures + self._last_evidence_signatures.add(evidence_signature) + previous_exit = self._last_command_exit.get(command_signature) + outcome_changed = previous_exit is not None and previous_exit != evidence.exit_code + self._last_command_exit[command_signature] = evidence.exit_code + warning_resolved = self._previous_command_had_warning and not record.warnings + self._previous_command_had_warning = bool(record.warnings) + workspace_effect = "workspace" in record.mutations.path_classes and record.mutations.has_effects() + process_effect = bool(record.mutations.processes_started or record.mutations.ports_opened) + changed_strategy = count == 1 + progress = ( + workspace_effect or process_effect or new_evidence or changed_strategy + or outcome_changed or warning_resolved + ) + repeated_warning = any( + value >= NO_PROGRESS_MAX_REPEATED_WARNINGS for value in self.repeated_warnings.values() + ) + repeated_command = count >= NO_PROGRESS_MAX_REPEATED_COMMANDS and not outcome_changed + if progress and not repeated_command and not repeated_warning: + self.no_progress_steps = 0 + return False, False + self.no_progress_steps += 1 + threshold = ( + self.no_progress_steps >= NO_PROGRESS_MAX_STEPS or repeated_command or repeated_warning + ) + if not threshold: + return False, False + self.no_progress_events += 1 + self.no_progress_steps = 0 + record.no_progress_warning = True + record.force_finalization = self.no_progress_events >= 2 + return True, record.force_finalization def add_evidence(self, evidence: ValidationEvidence) -> None: self.validation_evidence.append(evidence) @@ -223,6 +377,20 @@ def add_evidence(self, evidence: ValidationEvidence) -> None: if message not in self.unresolved_failures: self.unresolved_failures.append(message) + def compact_summary(self) -> str: + summary = { + "files_created": len(self.files_created), + "files_modified": len(self.files_modified), + "files_deleted": len(self.files_deleted), + "commands": len(self.commands), + "failed_commands": sum(item.exit_code != 0 for item in self.commands), + "timeouts": self.timeouts, + "evidence": [item.label for item in self.validation_evidence[-3:]], + "warnings": self.warnings[:2], + "unresolved": self.unresolved_failures[:2], + } + return _cap_text(json.dumps(summary, sort_keys=True), MAX_AGENT_ATTEMPT_STATE_SUMMARY_CHARS) + def to_dict(self) -> dict[str, Any]: return { "before": self.before.to_dict(), @@ -235,6 +403,12 @@ def to_dict(self) -> dict[str, Any]: "validation_evidence": [item.to_dict() for item in self.validation_evidence], "warnings": self.warnings, "unresolved_failures": self.unresolved_failures, + "timeouts": self.timeouts, + "snapshot_truncated": self.snapshot_truncated, + "no_progress_steps": self.no_progress_steps, + "no_progress_events": self.no_progress_events, + "tool_steps": self.tool_steps, + "tool_failures": self.tool_failures, } def build_failure_memory(self, believed_succeeded: str, final_validation: str) -> FailureMemory: @@ -242,7 +416,7 @@ def build_failure_memory(self, believed_succeeded: str, final_validation: str) - failures = [item for item in self.validation_evidence if item.exit_code != 0] weakest_success = min(successful, key=lambda item: item.strength).label if successful else "agent assertion" strongest_failure = max(failures, key=lambda item: item.strength).label if failures else final_validation - context_differences = sorted( + contexts = sorted( { "private-runtime dependency" if item.depended_on_private_runtime else "clean task context" for item in self.validation_evidence @@ -257,7 +431,7 @@ def build_failure_memory(self, believed_succeeded: str, final_validation: str) - believed_succeeded=believed_succeeded, final_validation=final_validation, contradiction=contradiction, - context_differences=context_differences, + context_differences=contexts, files_and_side_effects={ "created": sorted(self.files_created), "modified": sorted(self.files_modified), @@ -267,11 +441,12 @@ def build_failure_memory(self, believed_succeeded: str, final_validation: str) - contamination_warnings=list(self.warnings), strongest_failure_evidence=strongest_failure, weakest_success_evidence=weakest_success, + timeout_observed=self.timeouts > 0, ) class TaskExecutionContext: - """Builds clean task environments and records generic command effects.""" + """Build a clean task environment and retain full command telemetry outside model context.""" _PRESERVED_NAMES = { "HOME", "USER", "LOGNAME", "SHELL", "TERM", "COLORTERM", "LANG", "TZ", @@ -287,6 +462,7 @@ def __init__( private_paths: Iterable[str | Path] = (), task_environment: Mapping[str, str] | None = None, allowed_private_paths: Iterable[str | Path] = (), + snapshot_excluded_paths: Iterable[str | Path] = (), ) -> None: runtime_paths: list[str | Path] = [] for name in ("VIRTUAL_ENV", "CONDA_PREFIX", "CONDA_ENV_PATH"): @@ -295,9 +471,10 @@ def __init__( runtime_paths.append(value) self.boundaries = PathBoundaries.discover(workspace, private_paths, runtime_paths) self.allowed_private_paths = tuple(_safe_resolve(item) for item in allowed_private_paths) + self.snapshot_excluded_paths = tuple(_safe_resolve(item) for item in snapshot_excluded_paths) self.task_environment = dict(task_environment or {}) self.environment = self._build_environment(os.environ) - self._attempt_files_before: dict[str, FileRecord] = {} + self._attempt_files_before = Snapshot() self.attempt = AttemptState(before=self.fingerprint(workspace, self.environment)) def _allowed_private(self, path: str | Path) -> bool: @@ -307,9 +484,7 @@ def _allowed_private(self, path: str | Path) -> bool: def _build_environment(self, source: Mapping[str, str]) -> dict[str, str]: env: dict[str, str] = {} for name, value in source.items(): - if name == "PATH": - continue - if name.startswith(("VILLANI_", "CODEX_")): + if name == "PATH" or name.startswith(("VILLANI_", "CODEX_")): continue if name in self._PRESERVED_NAMES or name.startswith(self._PRESERVED_PREFIXES): if not self.boundaries.contains_private(value): @@ -333,21 +508,20 @@ def _build_environment(self, source: Mapping[str, str]) -> dict[str, str]: def begin_attempt(self) -> AttemptState: before = self.fingerprint(self.boundaries.workspace, self.environment) - self._attempt_files_before = self.snapshot_files() - self.attempt = AttemptState(before=before) + self._attempt_files_before = self.snapshot_workspace() + self.attempt = AttemptState(before=before, snapshot_truncated=self._attempt_files_before.truncated) return self.attempt def existed_at_attempt_start(self, path: str | Path) -> bool: - return str(_safe_resolve(path)) in self._attempt_files_before + return str(_safe_resolve(path)) in self._attempt_files_before.records def finish_attempt(self) -> AttemptState: after = self.fingerprint(self.boundaries.workspace, self.environment) + current = self.snapshot_workspace() self.attempt.after = after + self.attempt.snapshot_truncated = self.attempt.snapshot_truncated or current.truncated cumulative = self._mutation_diff( - self._attempt_files_before, - self.snapshot_files(), - self.attempt.before, - after, + self._attempt_files_before.records, current.records, self.attempt.before, after ) for item in cumulative.created: self.attempt.files_created.add(item.path) @@ -355,11 +529,8 @@ def finish_attempt(self) -> AttemptState: self.attempt.files_modified.add(item.path) for item in cumulative.deleted: self.attempt.files_deleted.add(item.path) - cumulative_payload = cumulative.to_dict() - if any(cumulative_payload.values()): - self.attempt.side_effects.append({"scope": "cumulative-attempt", **cumulative_payload}) - if "private-runtime" in cumulative.path_classes and PRIVATE_WARNING not in self.attempt.warnings: - self.attempt.warnings.append(PRIVATE_WARNING) + if cumulative.has_effects(): + self.attempt.side_effects.append({"scope": "cumulative-attempt", **cumulative.to_dict()}) return self.attempt def fingerprint(self, cwd: Path, env: Mapping[str, str]) -> ExecutionFingerprint: @@ -376,40 +547,65 @@ def fingerprint(self, cwd: Path, env: Mapping[str, str]) -> ExecutionFingerprint open_ports=self._open_ports(), ) - def _snapshot_root(self, root: Path) -> dict[str, FileRecord]: - records: dict[str, FileRecord] = {} + def snapshot_workspace(self) -> Snapshot: + root = self.boundaries.workspace + snapshot = Snapshot() if not root.exists(): - return records - try: - paths = [root, *root.rglob("*")] - except OSError: - paths = [root] - for path in paths: - try: - info = path.lstat() - except OSError: - continue - mode = stat.S_IMODE(info.st_mode) - kind = "symlink" if path.is_symlink() else "directory" if path.is_dir() else "file" - target = os.readlink(path) if path.is_symlink() else None - records[str(path.resolve(strict=False))] = FileRecord( - path=str(path.resolve(strict=False)), path_class=self.boundaries.classify(path), kind=kind, - mode=mode, size=info.st_size, mtime_ns=info.st_mtime_ns, link_target=target, - ) - return records + return snapshot + for current_root, directory_names, file_names in os.walk(root, topdown=True, followlinks=False): + current = Path(current_root) + directory_names[:] = [ + name + for name in directory_names + if name not in DEFAULT_SNAPSHOT_SKIP_DIRS + and not any( + _is_within(current / name, excluded) or _is_within(excluded, current / name) + for excluded in self.snapshot_excluded_paths + ) + ] + candidates = [*(current / name for name in directory_names), *(current / name for name in file_names)] + for path in candidates: + if snapshot.inspected_files >= MAX_SNAPSHOT_FILES: + snapshot.truncated = True + return snapshot + snapshot.inspected_files += 1 + try: + info = path.lstat() + except OSError: + continue + kind = "symlink" if path.is_symlink() else "directory" if path.is_dir() else "file" + content_hash = None + if kind == "file" and info.st_size <= MAX_SNAPSHOT_FILE_BYTES: + try: + content_hash = _digest_bytes(path.read_bytes()) + except OSError: + content_hash = None + resolved = str(path.resolve(strict=False)) + snapshot.records[resolved] = FileRecord( + path=resolved, + path_class="workspace", + kind=kind, + mode=stat.S_IMODE(info.st_mode), + size=info.st_size, + mtime_ns=info.st_mtime_ns, + link_target=os.readlink(path) if path.is_symlink() else None, + content_hash=content_hash, + ) + return snapshot + # Compatibility alias; deliberately workspace-only. def snapshot_files(self) -> dict[str, FileRecord]: - result = self._snapshot_root(self.boundaries.workspace) - for root in self.boundaries.private_paths: - result.update(self._snapshot_root(root)) - return result + return self.snapshot_workspace().records @staticmethod def _processes() -> list[int]: proc = Path("/proc") if not proc.exists(): return [] - return sorted(int(item.name) for item in proc.iterdir() if item.name.isdigit()) + try: + return sorted(int(item.name) for item in proc.iterdir() if item.name.isdigit()) + except OSError: + return [] @staticmethod def _open_ports() -> list[str]: @@ -433,9 +629,8 @@ def resolved_executables(self, command: str, env: Mapping[str, str]) -> list[str except ValueError: tokens = [] expect_command = True - separators = {";", "&&", "||", "|"} for token in tokens: - if token in separators: + if token in {";", "&&", "||", "|"}: expect_command = True continue if expect_command and "=" not in token: @@ -460,8 +655,12 @@ def _mutation_diff( common = before.keys() & after.keys() modified_keys = { key for key in common - if (before[key].mtime_ns, before[key].size, before[key].kind, before[key].link_target) - != (after[key].mtime_ns, after[key].size, after[key].kind, after[key].link_target) + if before[key].kind != "directory" + and ( + before[key].size, before[key].kind, before[key].link_target, before[key].content_hash + ) != ( + after[key].size, after[key].kind, after[key].link_target, after[key].content_hash + ) } permissions = sorted(key for key in common if before[key].mode != after[key].mode) return MutationSummary( @@ -470,41 +669,93 @@ def _mutation_diff( deleted=[before[key] for key in sorted(deleted_keys)], permissions_changed=permissions, symlinks_created=sorted(key for key in created_keys if after[key].kind == "symlink"), - directories_modified=sorted(key for key in modified_keys if after[key].kind == "directory"), + directories_modified=[], processes_started=sorted(set(after_fp.processes) - set(before_fp.processes)), ports_opened=sorted(set(after_fp.open_ports) - set(before_fp.open_ports)), ) - def run(self, command: str, cwd: Path, timeout: int) -> tuple[subprocess.CompletedProcess[str], CommandRecord]: + @staticmethod + def _kill_process_tree(proc: subprocess.Popen[str]) -> None: + if proc.poll() is not None: + return + if os.name == "posix": + try: + os.killpg(proc.pid, signal.SIGKILL) + return + except (OSError, ProcessLookupError): + pass + try: + proc.kill() + except OSError: + pass + + def _run_process( + self, command: str, cwd: Path, env: Mapping[str, str], timeout: int + ) -> tuple[int, str, str, bool]: + popen_kwargs: dict[str, Any] = { + "shell": True, + "cwd": str(cwd), + "env": dict(env), + "stdout": subprocess.PIPE, + "stderr": subprocess.PIPE, + "text": True, + } + if os.name == "posix": + popen_kwargs["start_new_session"] = True + proc = subprocess.Popen(command, **popen_kwargs) + try: + stdout, stderr = proc.communicate(timeout=timeout) + return int(proc.returncode or 0), stdout or "", stderr or "", False + except subprocess.TimeoutExpired as exc: + partial_stdout = _decode_partial(exc.stdout) + partial_stderr = _decode_partial(exc.stderr) + self._kill_process_tree(proc) + try: + remaining_stdout, remaining_stderr = proc.communicate(timeout=1) + except subprocess.TimeoutExpired: + self._kill_process_tree(proc) + remaining_stdout, remaining_stderr = "", "" + stdout = partial_stdout + _decode_partial(remaining_stdout) + stderr = partial_stderr + _decode_partial(remaining_stderr) + return 124, stdout, stderr, True + + def run( + self, command: str, cwd: Path, timeout: int + ) -> tuple[subprocess.CompletedProcess[str], CommandRecord]: env = dict(self.environment) before_fp = self.fingerprint(cwd, env) - before_files = self.snapshot_files() + before_snapshot = self.snapshot_workspace() executables = self.resolved_executables(command, env) started = time.monotonic() - proc = subprocess.run( - command, shell=True, cwd=str(cwd), env=env, capture_output=True, text=True, timeout=timeout - ) + exit_code, stdout, stderr, timed_out = self._run_process(command, cwd, env, timeout) duration = time.monotonic() - started after_fp = self.fingerprint(cwd, env) - mutations = self._mutation_diff(before_files, self.snapshot_files(), before_fp, after_fp) + after_snapshot = self.snapshot_workspace() + mutations = self._mutation_diff( + before_snapshot.records, after_snapshot.records, before_fp, after_fp + ) try: command_tokens = shlex.split(command, posix=os.name != "nt") except ValueError: command_tokens = [] - private_dependency = any( - self.boundaries.classify(path) == "private-runtime" and not self._allowed_private(path) - for path in executables - ) or any( - self.boundaries.classify(piece) == "private-runtime" and not self._allowed_private(piece) - for piece in command_tokens - if piece.startswith(("/", "~")) + explicit_paths = [token for token in command_tokens if token.startswith(("/", "~"))] + private_dependency = ( + self.boundaries.classify(cwd) == "private-runtime" + or any( + self.boundaries.classify(path) == "private-runtime" and not self._allowed_private(path) + for path in executables + ) + or any( + self.boundaries.classify(path) == "private-runtime" and not self._allowed_private(path) + for path in explicit_paths + ) + or any(self.boundaries.contains_private(value) for value in env.values()) ) - private_mutation = "private-runtime" in mutations.path_classes - warnings = [PRIVATE_WARNING] if private_dependency or private_mutation else [] + warnings = [PRIVATE_WARNING] if private_dependency else [] + if timed_out: + warnings.append(TIMEOUT_MESSAGE) classes = set(mutations.path_classes) - for token in command_tokens: - if token.startswith(("/", "~")): - classes.add(self.boundaries.classify(token)) + classes.update(self.boundaries.classify(path) for path in explicit_paths) if mutations.processes_started or mutations.ports_opened: classes.add("external/system") record = CommandRecord( @@ -512,7 +763,8 @@ def run(self, command: str, cwd: Path, timeout: int) -> tuple[subprocess.Complet cwd=str(cwd.resolve()), environment_hash=before_fp.environment_hash, resolved_executables=executables, - exit_code=proc.returncode, + exit_code=exit_code, + timed_out=timed_out, duration_seconds=round(duration, 6), before=before_fp, after=after_fp, @@ -520,17 +772,52 @@ def run(self, command: str, cwd: Path, timeout: int) -> tuple[subprocess.Complet path_classes=sorted(classes), depended_on_private_runtime=private_dependency, used_clean_task_context=not private_dependency, + snapshot_truncated=before_snapshot.truncated or after_snapshot.truncated, + external_or_private_state_may_have_changed=True, warnings=warnings, ) self.attempt.add_command(record) - return proc, record + completed = subprocess.CompletedProcess(command, exit_code, stdout, stderr) + return completed, record + + def record_tool_step( + self, + tool_name: str, + tool_input: Mapping[str, Any], + *, + is_error: bool, + ) -> tuple[bool, bool]: + signature = f"tool:{tool_name}:{json.dumps(dict(tool_input), sort_keys=True, default=str)}" + count = self.attempt.repeated_commands.get(signature, 0) + 1 + self.attempt.repeated_commands[signature] = count + self.attempt.tool_steps.append( + {"tool": tool_name, "input_hash": _digest(signature), "is_error": is_error} + ) + if is_error: + failure_signature = f"{tool_name}:{_digest(signature)}" + if failure_signature not in self.attempt.tool_failures: + self.attempt.tool_failures.append(failure_signature) + if count == 1: + self.attempt.no_progress_steps = 0 + return False, False + self.attempt.no_progress_steps += 1 + if ( + count < NO_PROGRESS_MAX_REPEATED_COMMANDS + and self.attempt.no_progress_steps < NO_PROGRESS_MAX_STEPS + ): + return False, False + self.attempt.no_progress_events += 1 + self.attempt.no_progress_steps = 0 + return True, self.attempt.no_progress_events >= 2 def record_final_result(self, summary: str, succeeded: bool) -> ValidationEvidence: evidence = ValidationEvidence( command=summary or "final validation", label="official/verifier result", strength=5, - context_hash=self.attempt.after.environment_hash if self.attempt.after else self.attempt.before.environment_hash, + context_hash=( + self.attempt.after.environment_hash if self.attempt.after else self.attempt.before.environment_hash + ), clean_task_context=True, depended_on_private_runtime=False, produced_artifacts=False, @@ -571,4 +858,83 @@ def record_validation( exit_code=record.exit_code, ) self.attempt.add_evidence(evidence) + warning, force = self.attempt.register_progress(record, evidence) + record.warnings = [ + item + for item in record.warnings + if item == TIMEOUT_MESSAGE or self.attempt.repeated_warnings.get(item, 0) <= NO_PROGRESS_MAX_REPEATED_WARNINGS + ] + if warning: + record.warnings.append(NO_PROGRESS_MESSAGE) + if NO_PROGRESS_MESSAGE not in self.attempt.warnings: + self.attempt.warnings.append(NO_PROGRESS_MESSAGE) + record.force_finalization = force return evidence + + +def compact_command_observation( + *, + command: str, + record: CommandRecord, + stdout: str, + stderr: str, + evidence: ValidationEvidence | None, +) -> dict[str, Any]: + warnings = list(dict.fromkeys(record.warnings))[:MAX_AGENT_WARNING_COUNT] + mutation_entries = record.mutations.compact() + observation: dict[str, Any] = { + "command": _cap_text(command, 2000), + "exit_code": record.exit_code, + "timed_out": record.timed_out, + "stdout": _cap_text(stdout, MAX_AGENT_STDOUT_CHARS), + "stderr": _cap_text(stderr, MAX_AGENT_STDERR_CHARS), + } + if warnings: + observation["warnings"] = _cap_text("\n".join(warnings), MAX_AGENT_WARNING_CHARS).splitlines() + if mutation_entries: + observation["mutation_summary"] = _cap_text( + "\n".join(mutation_entries), MAX_AGENT_MUTATION_SUMMARY_CHARS + ).splitlines() + if evidence is not None: + observation["evidence"] = evidence.label + if record.timed_out: + observation["message"] = TIMEOUT_MESSAGE + if warnings or record.exit_code != 0 or record.no_progress_warning: + if record.no_progress_warning: + observation["next_action"] = NO_PROGRESS_MESSAGE + elif record.timed_out: + observation["next_action"] = "Use a bounded command or inspect partial output before retrying." + elif record.depended_on_private_runtime: + observation["next_action"] = "Repeat the check in the clean task context." + elif record.exit_code != 0: + observation["next_action"] = "Use the failure output to make a materially different next step." + return _fit_agent_observation(observation) + + +def _fit_agent_observation(observation: dict[str, Any]) -> dict[str, Any]: + def encoded() -> str: + return json.dumps(observation, ensure_ascii=False) + + if len(encoded()) <= MAX_AGENT_TOOL_RESULT_CHARS: + return observation + if "mutation_summary" in observation: + observation["mutation_summary"] = [TRUNCATION_NOTICE] + if len(encoded()) <= MAX_AGENT_TOOL_RESULT_CHARS: + return observation + warnings = list(observation.get("warnings", [])) + if len(warnings) > 2: + observation["warnings"] = warnings[:2] + [TRUNCATION_NOTICE] + if len(encoded()) <= MAX_AGENT_TOOL_RESULT_CHARS: + return observation + for output_field in ("stderr", "stdout"): + value = str(observation.get(output_field, "")) + overflow = len(encoded()) - MAX_AGENT_TOOL_RESULT_CHARS + if overflow > 0 and value: + observation[output_field] = _cap_text(value, max(80, len(value) - overflow - 64)) + if len(encoded()) <= MAX_AGENT_TOOL_RESULT_CHARS: + return observation + # Preserve mandatory status fields even under unusual serialization overhead. + for output_field in ("stderr", "stdout"): + if len(encoded()) > MAX_AGENT_TOOL_RESULT_CHARS: + observation[output_field] = TRUNCATION_NOTICE + return observation diff --git a/villani_code/state.py b/villani_code/state.py index 33bc26a5..ae7969b1 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -21,7 +21,11 @@ from villani_code.context_governance import ContextGovernanceManager from villani_code.edits import ProposalStore from villani_code.execution import ExecutionBudget, ExecutionResult -from villani_code.execution_context import FailureMemory, TaskExecutionContext +from villani_code.execution_context import ( + MAX_AGENT_ATTEMPT_STATE_SUMMARY_CHARS, + FailureMemory, + TaskExecutionContext, +) from villani_code.hooks import HookRunner from villani_code.mcp import load_mcp_config from villani_code.permissions import Decision, PermissionConfig, PermissionEngine @@ -533,6 +537,7 @@ def __init__( private_paths=discovered_private_paths, task_environment=task_environment, allowed_private_paths=allowed_private_paths or [], + snapshot_excluded_paths=[resolve_debug_root(self._debug_config.debug_root)], ) self._failure_memory: FailureMemory | None = None self._debug_recorder: DebugRecorder | None = None @@ -697,6 +702,7 @@ def _debug_tool_callback(self, event_type: str, payload: dict[str, Any]) -> None truncated=bool(payload.get("truncated", False)), tool_call_id=str(payload.get("tool_call_id", "") or ""), turn_index=turn_index, + full_debug_record=dict(payload), ) @@ -814,7 +820,7 @@ def run( messages = messages or build_initial_messages(self.repo, instruction) if self._failure_memory is not None: messages.append( - {"role": "user", "content": [{"type": "text", "text": self._failure_memory.render()}]} + {"role": "user", "content": [{"type": "text", "text": self._failure_memory.render_compact()}]} ) if approved_plan is not None: if self._mission_dir is not None: @@ -1277,11 +1283,6 @@ def _budget_reason( reason = _budget_reason() if reason: return _finish_bounded(response, reason, reason == "completed") - if tool_name in {"Write", "Patch"} and not result.get("is_error"): - targets = self._extract_tool_targets(tool_name, tool_input) - if any(not _is_generated_or_runtime_artifact(target) for target in targets): - meaningful_repo_edit_made = True - prose_edit_intent_recovery_attempts = 0 continue if tool_uses or not empty: empty_turn_retries = 0 @@ -1513,38 +1514,11 @@ def _budget_reason( } ) continue - reason = _budget_reason(completed=True) - if reason: - return _finish_bounded(response, reason, reason == "completed") - transcript["final_assistant_content"] = response.get("content", []) - transcript_path = None - if not self._planning_read_only: - transcript_path = self._save_transcript_and_link(transcript) - self._save_session_snapshot(messages) - self._update_mission_state(status="completed", compact_summary=summarize_mission_state(self._mission_state) if self._mission_state else "") - if self._event_recorder is not None: - self._event_recorder.write_digest() - if self._debug_recorder is not None: - self._debug_recorder.write_final_summary( - status="completed", - termination_reason="completed", - total_turns=turns_used, - mission_id=self._mission_id, - ) - self._write_regular_trace_artifacts( - transcript=transcript, - messages=messages, - status="completed", - termination_reason="completed", - ) - return { - "response": response, - "messages": messages, - "transcript_path": str(transcript_path) if transcript_path is not None else "", - "transcript": transcript, - } + reason = _budget_reason(completed=True) or "completed" + return _finish_bounded(response, reason, reason == "completed") tool_results: list[dict[str, Any]] = [] + force_no_progress_finalization = False for block in tool_uses: tool_name = block.get("name", "") tool_input = dict(block.get("input", {})) @@ -1582,21 +1556,17 @@ def _budget_reason( tool_name, tool_input, tool_use_id, len(messages) ) tool_calls_used += 1 + force_no_progress_finalization = ( + force_no_progress_finalization or bool(result.get("force_finalization", False)) + ) if self.small_model: result = self._truncate_tool_result(tool_name, result) if tool_name == "Read" and not result.get("is_error"): self._files_read.add(str(tool_input.get("file_path", ""))) if tool_name in {"Write", "Patch"} and not result.get("is_error"): - self._pending_verification = self._run_post_edit_verification( - trigger=f"{tool_name} execution" - ) self._patch_effect_check_pending = True self._patch_effect_check_attempts = 0 - elif tool_name == "Bash": - self._pending_verification = self._run_verification( - trigger=f"{tool_name} execution" - ) if result.get("is_error"): result_text = str(result.get("content", "")) @@ -1723,6 +1693,8 @@ def _budget_reason( ) self._pending_verification = "" messages.append({"role": "user", "content": next_user_content}) + if force_no_progress_finalization: + return _finish_bounded(response, "no_progress", False) reason = _budget_reason() if reason: @@ -1790,32 +1762,28 @@ def _run_patch_effect_check(self, response: dict[str, Any], changed_files: list[ return "" file_effects: list[dict[str, Any]] = [] - for relative_path in candidates: + remaining_excerpt_chars = 600 + for relative_path in candidates[:10]: path = (self.repo / relative_path).resolve() + excerpt = "" + state = "deleted-or-missing" if path.exists() and path.is_file(): - try: - excerpt = path.read_text(encoding="utf-8", errors="replace")[:1200] - except OSError: - excerpt = "" - file_effects.append({"path": relative_path, "state": "present", "excerpt": excerpt}) - else: - file_effects.append({"path": relative_path, "state": "deleted-or-missing", "excerpt": ""}) + state = "present" + if remaining_excerpt_chars > 0: + try: + excerpt = path.read_text(encoding="utf-8", errors="replace")[:remaining_excerpt_chars] + except OSError: + excerpt = "" + remaining_excerpt_chars -= len(excerpt) + file_effects.append({"path": relative_path, "state": state, "excerpt": excerpt}) cumulative_effect = { + "attempt": json.loads(attempt.compact_summary()), "files": file_effects, - "commands": [ - { - "command": item.command, - "exit_code": item.exit_code, - "path_classes": item.path_classes, - "warnings": item.warnings, - } - for item in attempt.commands - ], - "side_effects": attempt.side_effects, - "validation_evidence": [item.to_dict() for item in attempt.validation_evidence], - "unresolved_warnings": [*attempt.warnings, *attempt.unresolved_failures], } + cumulative_text = json.dumps(cumulative_effect, indent=2) + if len(cumulative_text) > MAX_AGENT_ATTEMPT_STATE_SUMMARY_CHARS: + cumulative_text = cumulative_text[: MAX_AGENT_ATTEMPT_STATE_SUMMARY_CHARS - 16] + "\n[truncated]" intended_effect = self._derive_intended_effect(text, ", ".join(candidates), objective) legacy_syntax_result = "not_applicable" syntax_target = next((item for item in file_effects if item["path"].endswith(".py")), None) @@ -1831,14 +1799,14 @@ def _run_patch_effect_check(self, response: dict[str, Any], changed_files: list[ "deleted file, command, observable side effect, validation result, and unresolved warning.\n\n" f"Task objective:\n{objective}\n\n" f"Intended effect:\n{intended_effect}\n\n" - f"Cumulative attempt state:\n{json.dumps(cumulative_effect, indent=2)[:12000]}\n\n" + f"Cumulative attempt state:\n{cumulative_text}\n\n" "Answer exactly one of:\nYES\nNO: " ) self.event_callback( { "type": "patch_effect_critic_started", "canonical_modified_paths": candidates, - "attempt_state_summary": cumulative_effect, + "attempt_state_summary": attempt.compact_summary(), } ) critic_payload = { diff --git a/villani_code/state_tooling.py b/villani_code/state_tooling.py index a5074cd2..2aa58d6d 100644 --- a/villani_code/state_tooling.py +++ b/villani_code/state_tooling.py @@ -7,6 +7,11 @@ from pathlib import Path from typing import Any +from villani_code.execution_context import ( + MAX_AGENT_TOOL_RESULT_CHARS, + NO_PROGRESS_MESSAGE, + TRUNCATION_NOTICE, +) from villani_code.patch_apply import PatchApplyError, extract_unified_diff_targets, parse_unified_diff from villani_code.permissions import Decision from villani_code.repo_rules import classify_repo_path, is_ignored_repo_path @@ -174,13 +179,7 @@ def _analyze_patch_mutation( def _sanitize_tool_input_file_path(tool_input: dict[str, Any], repo: Path) -> None: - """Normalize and sanitize a `file_path` value in tool_input in-place. - - - Strip surrounding quotes - - Normalize backslashes to forward slashes - - If an absolute path points inside `repo`, convert to a repo-relative path - - Strip leading './' or leading '/' - """ + """Normalize a file path without remapping external absolute paths into the workspace.""" try: raw = tool_input.get("file_path") if not isinstance(raw, str): @@ -188,18 +187,16 @@ def _sanitize_tool_input_file_path(tool_input: dict[str, Any], repo: Path) -> No fp = raw.strip() if (fp.startswith('"') and fp.endswith('"')) or (fp.startswith("'") and fp.endswith("'")): fp = fp[1:-1].strip() - fp = fp.strip('"').strip("'") - fp = fp.replace("\\", "/") - p = Path(fp) - if p.is_absolute(): + fp = fp.strip('"').strip("'").replace("\\", "/") + path = Path(fp) + if path.is_absolute(): try: - rel = p.resolve().relative_to(repo.resolve()) - fp = str(rel).replace("\\", "/") - except Exception: - pass - fp = fp.lstrip("./") - if fp.startswith("/"): - fp = fp.lstrip("/") + fp = str(path.resolve().relative_to(repo.resolve())).replace("\\", "/") + except (OSError, ValueError): + tool_input["file_path"] = fp + return + while fp.startswith("./"): + fp = fp[2:] tool_input["file_path"] = fp except Exception: return @@ -667,6 +664,21 @@ def _debug_callback_with_turn(event_type: str, payload: dict[str, Any]) -> None: tool_call_id=stable_tool_use_id, execution_context=getattr(runner, "_task_execution_context", None), ) + execution_context = getattr(runner, "_task_execution_context", None) + if not result.get("progress_recorded", False) and execution_context is not None: + warning, force = execution_context.record_tool_step( + tool_name, tool_input, is_error=bool(result.get("is_error", False)) + ) + if warning: + content = str(result.get("content", "")) + suffix = ("\n" if content else "") + NO_PROGRESS_MESSAGE + combined = content + suffix + if len(combined) > MAX_AGENT_TOOL_RESULT_CHARS: + room = MAX_AGENT_TOOL_RESULT_CHARS - len(TRUNCATION_NOTICE) - 1 + combined = combined[:room] + "\n" + TRUNCATION_NOTICE + result["content"] = combined + result["no_progress_warning"] = True + result["force_finalization"] = force runner.event_callback( { "type": "tool_result", diff --git a/villani_code/tools.py b/villani_code/tools.py index fc361cc4..cc2b46f6 100644 --- a/villani_code/tools.py +++ b/villani_code/tools.py @@ -11,7 +11,12 @@ import httpx from pydantic import BaseModel, ConfigDict, Field -from villani_code.execution_context import TaskExecutionContext +from villani_code.execution_context import ( + MAX_AGENT_TOOL_RESULT_CHARS, + TRUNCATION_NOTICE, + TaskExecutionContext, + compact_command_observation, +) from villani_code.patch_apply import ( PatchApplyError, apply_unified_diff_with_diagnostics, @@ -119,11 +124,18 @@ class SubmitPlanInput(BaseModel): def _error(message: str) -> dict[str, Any]: - return {"content": message, "is_error": True} + return {"content": _cap_tool_content(message), "is_error": True} + + +def _cap_tool_content(content: str) -> str: + if len(content) <= MAX_AGENT_TOOL_RESULT_CHARS: + return content + room = max(0, MAX_AGENT_TOOL_RESULT_CHARS - len(TRUNCATION_NOTICE) - 1) + return content[:room] + "\n" + TRUNCATION_NOTICE -def _ok(content: str) -> dict[str, Any]: - return {"content": content, "is_error": False} +def _ok(content: str, **metadata: Any) -> dict[str, Any]: + return {"content": _cap_tool_content(content), "is_error": False, **metadata} def tool_specs() -> list[dict[str, Any]]: @@ -168,7 +180,15 @@ def execute_tool( if name == "Search": return _ok(_run_search(parsed, repo, execution_context=execution_context)) if name == "Bash": - return _ok(_run_bash(parsed, repo, unsafe=unsafe, debug_callback=debug_callback, tool_call_id=tool_call_id, execution_context=execution_context)) + content, metadata = _run_bash( + parsed, + repo, + unsafe=unsafe, + debug_callback=debug_callback, + tool_call_id=tool_call_id, + execution_context=execution_context, + ) + return _ok(content, **metadata) if name == "Write": return _ok(_run_write(parsed, repo, debug_callback=debug_callback, tool_call_id=tool_call_id)) if name == "Patch": @@ -184,6 +204,14 @@ def execute_tool( return _error("Unhandled tool") +def _is_within_workspace(path: Path, repo: Path) -> bool: + try: + path.resolve(strict=False).relative_to(repo.resolve(strict=False)) + return True + except (OSError, ValueError): + return False + + def _safe_path(repo: Path, raw: str) -> Path: path = (repo / raw).resolve() repo_resolved = repo.resolve() @@ -205,6 +233,11 @@ def _run_ls(data: LsInput, repo: Path) -> str: def _run_read(data: ReadInput, repo: Path, debug_callback: Any | None = None, tool_call_id: str = "") -> str: + requested = Path(data.file_path).expanduser() + if requested.is_absolute() and not _is_within_workspace(requested, repo): + raise ValueError( + "Read is workspace-only for this path. Use a shell command such as cat, sed, or head if you need to inspect system files." + ) path = _safe_path(repo, data.file_path) raw = path.read_bytes()[: data.max_bytes] if callable(debug_callback): @@ -260,7 +293,7 @@ def _run_bash( debug_callback: Any | None = None, tool_call_id: str = "", execution_context: TaskExecutionContext | None = None, -) -> str: +) -> tuple[str, dict[str, Any]]: lowered = data.command.lower() if not unsafe: for bad in DENYLIST: @@ -269,33 +302,42 @@ def _run_bash( cwd = _safe_path(repo, data.cwd) context = execution_context or TaskExecutionContext(repo) if callable(debug_callback): - debug_callback("command_started", {"command": data.command, "cwd": data.cwd, "tool_call_id": tool_call_id}) + debug_callback( + "command_started", + {"command": data.command, "cwd": data.cwd, "tool_call_id": tool_call_id}, + ) proc, record = context.run(data.command, cwd, data.timeout_sec) evidence = context.record_validation( record, kind=data.validation_kind if data.validation_kind in {"project", "smoke"} else "command", final_behavior=data.checks_final_behavior, ) - payload = { + compact = compact_command_observation( + command=data.command, + record=record, + stdout=proc.stdout, + stderr=proc.stderr, + evidence=evidence, + ) + full_debug_record = { "command": data.command, + "cwd": data.cwd, "exit_code": proc.returncode, + "timed_out": record.timed_out, "stdout": proc.stdout, "stderr": proc.stderr, "execution_context": record.to_dict(), - "warnings": record.warnings, "validation_evidence": evidence.to_dict(), + "tool_call_id": tool_call_id, } if callable(debug_callback): - debug_callback( - "command_finished", - { - **payload, - "cwd": data.cwd, - "truncated": False, - "tool_call_id": tool_call_id, - }, - ) - return json.dumps(payload, indent=2) + debug_callback("command_finished", full_debug_record) + return json.dumps(compact, ensure_ascii=False), { + "timed_out": record.timed_out, + "force_finalization": record.force_finalization, + "no_progress_warning": record.no_progress_warning, + "progress_recorded": True, + } def _run_write(data: WriteInput, repo: Path, debug_callback: Any | None = None, tool_call_id: str = "") -> str: From 4ca9f30a84d16e9ffd248b34653d14b26579c0d4 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Mon, 8 Jun 2026 08:50:22 +1000 Subject: [PATCH 35/37] Make no-progress detection failure-sensitive --- tests/test_execution_context_isolation.py | 119 ++++++++++++++++++++++ villani_code/execution_context.py | 88 ++++++++++++++-- 2 files changed, 200 insertions(+), 7 deletions(-) diff --git a/tests/test_execution_context_isolation.py b/tests/test_execution_context_isolation.py index 4a39d1c7..ba4b28fe 100644 --- a/tests/test_execution_context_isolation.py +++ b/tests/test_execution_context_isolation.py @@ -347,3 +347,122 @@ def test_repeated_reads_participate_in_no_progress_guard(tmp_path: Path) -> None assert NO_PROGRESS_MESSAGE in results[2]["content"] assert results[3]["force_finalization"] is True + + +def _run_repeated_failures( + tmp_path: Path, monkeypatch, errors: list[str], *, command: str = "run-validation" +) -> tuple[TaskExecutionContext, list[dict]]: + context = TaskExecutionContext(tmp_path) + remaining = iter(errors) + + def fake_run_process(_command, _cwd, _env, _timeout): + return 1, "", next(remaining), False + + monkeypatch.setattr(context, "_run_process", fake_run_process) + results = [ + execute_tool( + "Bash", + {"command": command, "cwd": ".", "timeout_sec": 5}, + tmp_path, + unsafe=True, + execution_context=context, + ) + for _ in errors + ] + return context, results + + +def test_same_failed_command_with_different_traceback_is_progress(tmp_path: Path, monkeypatch) -> None: + errors = [ + f'Traceback (most recent call last):\n File "/tmp/run-{index}/check.py", line {index + 10}, in \n{error}' + for index, error in enumerate( + [ + "ModuleNotFoundError: No module named 'widget_core'", + "AttributeError: module 'widget_core' has no attribute 'build'", + "RuntimeError: backend initialization failed", + "AssertionError: expected 4 results, got 3", + ] + ) + ] + + context, results = _run_repeated_failures(tmp_path, monkeypatch, errors) + + assert all(not result.get("no_progress_warning", False) for result in results) + assert all(not result.get("force_finalization", False) for result in results) + assert len({item.failure_fingerprint for item in context.attempt.validation_evidence}) == 4 + assert context.attempt.no_progress_events == 0 + + +def test_same_failed_command_and_traceback_still_triggers_no_progress( + tmp_path: Path, monkeypatch +) -> None: + error = ( + 'Traceback (most recent call last):\n' + ' File "/tmp/session-a/check.py", line 42, in \n' + "RuntimeError: validation remained broken" + ) + + context, results = _run_repeated_failures(tmp_path, monkeypatch, [error] * 4) + + assert results[2]["no_progress_warning"] is True + assert results[2]["force_finalization"] is False + assert results[3]["force_finalization"] is True + assert context.attempt.no_progress_events == 2 + + +def test_file_mutation_resets_matching_failure_pressure(tmp_path: Path, monkeypatch) -> None: + context = TaskExecutionContext(tmp_path) + error = "RuntimeError: validation remained broken" + real_run_process = context._run_process + + def fake_run_process(command, cwd, env, timeout): + if command == "run-validation": + return 1, "", error, False + return real_run_process(command, cwd, env, timeout) + + monkeypatch.setattr(context, "_run_process", fake_run_process) + first_results = [ + execute_tool( + "Bash", + {"command": "run-validation", "cwd": ".", "timeout_sec": 5}, + tmp_path, + unsafe=True, + execution_context=context, + ) + for _ in range(2) + ] + write_result = execute_tool( + "Bash", + {"command": "printf patched > implementation.py", "cwd": ".", "timeout_sec": 5}, + tmp_path, + unsafe=True, + execution_context=context, + ) + after_write = execute_tool( + "Bash", + {"command": "run-validation", "cwd": ".", "timeout_sec": 5}, + tmp_path, + unsafe=True, + execution_context=context, + ) + + assert all(not result.get("no_progress_warning", False) for result in first_results) + assert write_result["is_error"] is False + assert (tmp_path / "implementation.py").read_text(encoding="utf-8") == "patched" + assert after_write.get("no_progress_warning", False) is False + assert after_write.get("force_finalization", False) is False + assert context.attempt.no_progress_events == 0 + + +def test_failure_fingerprint_normalizes_volatile_traceback_details(tmp_path: Path, monkeypatch) -> None: + errors = [ + 'Traceback (most recent call last):\n File "/tmp/run-a/check.py", line 12, in \nRuntimeError: request 123e4567-e89b-12d3-a456-426614174000 failed at 0x7ffeeabc', + 'Traceback (most recent call last):\n File "/tmp/run-b/check.py", line 987, in \nRuntimeError: request 123e4567-e89b-12d3-a456-426614174111 failed at 0x1234abcd', + 'Traceback (most recent call last):\n File "/tmp/run-c/check.py", line 3, in \nRuntimeError: request 123e4567-e89b-12d3-a456-426614174222 failed at 0x9999aaaa', + ] + + context, results = _run_repeated_failures(tmp_path, monkeypatch, errors) + + fingerprints = [item.failure_fingerprint for item in context.attempt.validation_evidence] + assert len(set(fingerprints)) == 1 + assert results[2]["no_progress_warning"] is True diff --git a/villani_code/execution_context.py b/villani_code/execution_context.py index eb2b7ff6..cf6d8593 100644 --- a/villani_code/execution_context.py +++ b/villani_code/execution_context.py @@ -4,6 +4,7 @@ import hashlib import json import os +import re import shlex import shutil import signal @@ -83,6 +84,54 @@ def _cap_text(value: str, limit: int) -> str: return value[:room] + "\n" + TRUNCATION_NOTICE +_ANSI_ESCAPE_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]") +_UUID_RE = re.compile( + r"\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b", + re.IGNORECASE, +) +_TIMESTAMP_RE = re.compile( + r"\b\d{4}-\d{2}-\d{2}[T ][0-2]\d:[0-5]\d:[0-5]\d(?:[.,]\d+)?(?:Z|[+-]\d{2}:?\d{2})?\b" +) +_ABSOLUTE_PATH_RE = re.compile(r"(? str: + value = _ANSI_ESCAPE_RE.sub("", value).strip() + value = _UUID_RE.sub("", value) + value = _TIMESTAMP_RE.sub("", value) + value = re.sub(r"\b0x[0-9a-f]+\b", "

", value, flags=re.IGNORECASE) + value = re.sub(r"(?i)(?:/tmp|/var/tmp|/private/tmp)[^\s:\"'(),]*", "", value) + value = _ABSOLUTE_PATH_RE.sub("", value) + value = re.sub(r"(?i)\bline\s+\d+\b", "line ", value) + value = re.sub(r"(?<=\w):\d+(?::\d+)?\b", ":", value) + value = re.sub(r"\bpid[=: ]+\d+\b", "pid=", value, flags=re.IGNORECASE) + return " ".join(value.split()) + + +def failure_fingerprint(stdout: str, stderr: str, exit_code: int) -> str: + """Return a stable fingerprint for the most useful failure detail in command output.""" + if exit_code == 0: + return "success" + combined = "\n".join(part for part in (stderr, stdout) if part)[-12000:] + lines = [_normalize_failure_text(line) for line in combined.splitlines()] + meaningful = [line for line in lines if line and not line.startswith(("Traceback (", "During handling"))] + for line in reversed(meaningful): + if any(pattern.search(line) for pattern in _STRUCTURED_FAILURE_PATTERNS): + return "structured:" + _digest(line.lower()) + compact_tail = " | ".join(meaningful[-8:])[-2000:] + if compact_tail: + return "tail:" + _digest(compact_tail.lower()) + return f"exit:{exit_code}" + + @dataclass(frozen=True, slots=True) class PathBoundaries: workspace: Path @@ -219,6 +268,7 @@ class CommandRecord: warnings: list[str] = field(default_factory=list) no_progress_warning: bool = False force_finalization: bool = False + failure_fingerprint: str = "" def to_dict(self) -> dict[str, Any]: return asdict(self) @@ -235,6 +285,7 @@ class ValidationEvidence: produced_artifacts: bool scope: str exit_code: int + failure_fingerprint: str = "" suspicious: bool = False def to_dict(self) -> dict[str, Any]: @@ -302,6 +353,8 @@ class AttemptState: tool_steps: list[dict[str, Any]] = field(default_factory=list) tool_failures: list[str] = field(default_factory=list) _last_evidence_signatures: set[str] = field(default_factory=set, repr=False) + _evidence_repetitions: dict[str, tuple[int, int]] = field(default_factory=dict, repr=False) + _progress_epoch: int = field(default=0, repr=False) _last_command_exit: dict[str, int] = field(default_factory=dict, repr=False) _previous_command_had_warning: bool = field(default=False, repr=False) @@ -315,6 +368,8 @@ def add_command(self, record: CommandRecord) -> None: self.files_deleted.add(item.path) if record.mutations.has_effects(): self.side_effects.append({"command": record.command, **record.mutations.to_dict()}) + if "workspace" in record.mutations.path_classes: + self._progress_epoch += 1 if record.timed_out: self.timeouts += 1 self.snapshot_truncated = self.snapshot_truncated or record.snapshot_truncated @@ -325,10 +380,16 @@ def add_command(self, record: CommandRecord) -> None: def register_progress(self, record: CommandRecord, evidence: ValidationEvidence) -> tuple[bool, bool]: command_signature = " ".join(record.command.split()) - count = self.repeated_commands.get(command_signature, 0) + 1 - self.repeated_commands[command_signature] = count - evidence_signature = f"{command_signature}|{evidence.exit_code}|{evidence.label}" - new_evidence = evidence_signature not in self._last_evidence_signatures + command_count = self.repeated_commands.get(command_signature, 0) + 1 + self.repeated_commands[command_signature] = command_count + evidence_signature = "|".join( + (command_signature, str(evidence.exit_code), evidence.label, evidence.failure_fingerprint) + ) + previous_count, previous_epoch = self._evidence_repetitions.get( + evidence_signature, (0, -1) + ) + evidence_count = previous_count + 1 if previous_epoch == self._progress_epoch else 1 + new_evidence = evidence_count == 1 self._last_evidence_signatures.add(evidence_signature) previous_exit = self._last_command_exit.get(command_signature) outcome_changed = previous_exit is not None and previous_exit != evidence.exit_code @@ -337,16 +398,22 @@ def register_progress(self, record: CommandRecord, evidence: ValidationEvidence) self._previous_command_had_warning = bool(record.warnings) workspace_effect = "workspace" in record.mutations.path_classes and record.mutations.has_effects() process_effect = bool(record.mutations.processes_started or record.mutations.ports_opened) - changed_strategy = count == 1 + changed_strategy = command_count == 1 progress = ( workspace_effect or process_effect or new_evidence or changed_strategy or outcome_changed or warning_resolved ) + if progress: + # Invalidate stale repetition pressure. The current evidence starts a fresh epoch so + # the immediately following identical result can still be counted as a repeat. + self._progress_epoch += 1 + evidence_count = 1 + self._evidence_repetitions[evidence_signature] = (evidence_count, self._progress_epoch) repeated_warning = any( value >= NO_PROGRESS_MAX_REPEATED_WARNINGS for value in self.repeated_warnings.values() ) - repeated_command = count >= NO_PROGRESS_MAX_REPEATED_COMMANDS and not outcome_changed - if progress and not repeated_command and not repeated_warning: + repeated_command = evidence_count >= NO_PROGRESS_MAX_REPEATED_COMMANDS + if progress and not repeated_warning: self.no_progress_steps = 0 return False, False self.no_progress_steps += 1 @@ -775,6 +842,7 @@ def run( snapshot_truncated=before_snapshot.truncated or after_snapshot.truncated, external_or_private_state_may_have_changed=True, warnings=warnings, + failure_fingerprint=failure_fingerprint(stdout, stderr, exit_code), ) self.attempt.add_command(record) completed = subprocess.CompletedProcess(command, exit_code, stdout, stderr) @@ -798,6 +866,11 @@ def record_tool_step( if failure_signature not in self.attempt.tool_failures: self.attempt.tool_failures.append(failure_signature) if count == 1: + self.attempt._progress_epoch += 1 + self.attempt.no_progress_steps = 0 + return False, False + if not is_error and tool_name in {"Write", "Patch"}: + self.attempt._progress_epoch += 1 self.attempt.no_progress_steps = 0 return False, False self.attempt.no_progress_steps += 1 @@ -856,6 +929,7 @@ def record_validation( produced_artifacts=produced_artifacts, scope="final expected behaviour" if final_behavior else "partial behaviour", exit_code=record.exit_code, + failure_fingerprint=record.failure_fingerprint, ) self.attempt.add_evidence(evidence) warning, force = self.attempt.register_progress(record, evidence) From e7631f9895b8f4e48c49f31587fdebbc3f4e336c Mon Sep 17 00:00:00 2001 From: mmprotest Date: Mon, 8 Jun 2026 17:36:57 +1000 Subject: [PATCH 36/37] Update CHANGELOG.md --- CHANGELOG.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c60bcffb..85994ff3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,3 @@ # Changelog ## 0.1.0rc1 - -- Reduced runner telemetry regressions by separating compact model-visible command observations from full debug artifacts, bounding filesystem snapshots, handling command timeouts as tool results, fixing absolute Read path behaviour, and adding no-progress loop protection while preserving execution-context isolation. -- Hardened benchmark validation command resolution with explicit allowlisting and clear environment-failure classification. -- Added benchmark interpretation-status policy (`headline_comparable`, `informational_only`, `internal_only`) with blunt report banners. -- Expanded aggregate provenance reporting so environment/harness instability is separated from agent weakness in summaries. -- Added benchmark preflight checks for task packs, agent names, command structure, and likely executable-resolution issues. -- Curated benchmark starting packs with distinct task instructions and pack lint validation tests. -- Tightened CI release surface for Python 3.11 and Windows/core behavior, plus packaging smoke assertions. -- Updated benchmark documentation and added a practical release checklist. From c1e98b37474fa1f4984e35780602a0bbb39225b5 Mon Sep 17 00:00:00 2001 From: mmprotest Date: Tue, 9 Jun 2026 20:56:06 +1000 Subject: [PATCH 37/37] Harden validation evidence handling --- CHANGELOG.md | 2 + tests/test_validation_evidence_hygiene.py | 78 +++++++++++ villani_code/execution_context.py | 149 +++++++++++++++++++++- villani_code/state.py | 5 + 4 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 tests/test_validation_evidence_hygiene.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 85994ff3..c4bd0bc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ # Changelog ## 0.1.0rc1 + +- Added minimal validation evidence hygiene: shell pipefail execution, weak-evidence labeling for filtered commands, unresolved failed-validation warnings, and last-successful-validation drift warnings. diff --git a/tests/test_validation_evidence_hygiene.py b/tests/test_validation_evidence_hygiene.py new file mode 100644 index 00000000..bc8bf9e0 --- /dev/null +++ b/tests/test_validation_evidence_hygiene.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +import shutil +from pathlib import Path + +import pytest + +from villani_code.execution_context import ( + UNRESOLVED_VALIDATION_MESSAGE, + VALIDATION_DRIFT_MESSAGE, + TaskExecutionContext, + is_weakened_validation_command, +) + + +def _run_validation(context: TaskExecutionContext, workspace: Path, command: str): + _completed, record = context.run(command, workspace, 10) + evidence = context.record_validation(record, kind="command") + return record, evidence + + +def test_shell_executor_uses_pipefail_when_bash_is_available(tmp_path: Path) -> None: + if shutil.which("bash") is None: + pytest.skip("bash is not available") + context = TaskExecutionContext(tmp_path) + context.begin_attempt() + + completed, _record = context.run("false | tail", tmp_path, 10) + + assert completed.returncode != 0 + + +@pytest.mark.parametrize( + "command", + ["cmd | head", "cmd | tail", "cmd | grep value", "cmd || true"], +) +def test_filtered_commands_are_marked_as_weak_validation(command: str) -> None: + assert is_weakened_validation_command(command) + + +def test_failed_validation_is_retained_at_finalization(tmp_path: Path) -> None: + context = TaskExecutionContext(tmp_path) + context.begin_attempt() + + record, _evidence = _run_validation(context, tmp_path, "test -e missing-file") + context.finish_attempt() + warnings = context.attempt.finalization_warnings() + + assert record.exit_code != 0 + assert len(context.attempt.unresolved_validation_failures) == 1 + assert UNRESOLVED_VALIDATION_MESSAGE in warnings[0] + assert "test -e missing-file" in warnings[0] + + +def test_successful_validation_after_file_change_clears_failure(tmp_path: Path) -> None: + context = TaskExecutionContext(tmp_path) + context.begin_attempt() + _run_validation(context, tmp_path, "test -e marker") + + (tmp_path / "marker").write_text("ready", encoding="utf-8") + record, _evidence = _run_validation(context, tmp_path, "test -e marker") + + assert record.exit_code == 0 + assert context.attempt.unresolved_validation_failures == [] + + +def test_file_change_after_successful_validation_warns_at_finalization(tmp_path: Path) -> None: + marker = tmp_path / "marker" + marker.write_text("ready", encoding="utf-8") + context = TaskExecutionContext(tmp_path) + context.begin_attempt() + record, _evidence = _run_validation(context, tmp_path, "test -e marker") + assert record.exit_code == 0 + + marker.write_text("changed", encoding="utf-8") + context.finish_attempt() + + assert VALIDATION_DRIFT_MESSAGE in context.attempt.finalization_warnings() diff --git a/villani_code/execution_context.py b/villani_code/execution_context.py index cf6d8593..01a65b75 100644 --- a/villani_code/execution_context.py +++ b/villani_code/execution_context.py @@ -20,6 +20,24 @@ "task/workspace state. Success evidence from this context may not reflect final validation." ) TIMEOUT_MESSAGE = "Command timed out before completion." +WEAK_VALIDATION_MESSAGE = ( + "Validation evidence is weak because the command output or exit status may be filtered/masked." +) +UNRESOLVED_VALIDATION_MESSAGE = ( + "Unresolved failed validation remains. A previous check failed and has not been cleared by a " + "later successful equivalent or broader check." +) +VALIDATION_DRIFT_MESSAGE = ( + "Files changed after the last successful validation. Re-run validation or justify finalizing " + "with weaker evidence." +) + +_VALIDATION_INTENT_RE = re.compile( + r"(?i)(?:^|[^a-z0-9_])(test|pytest|make|check|build|eval|verify|validate|compare|diff|compile|run)(?:$|[^a-z0-9_])" +) +_WEAK_VALIDATION_RE = re.compile( + r"(?i)(?:\|\s*(?:head|tail|grep|awk|sed)\b|\bgrep\s+-v\b|\|\|\s*(?:true\b|echo\b)|;\s*echo\b)" +) NO_PROGRESS_MESSAGE = ( "No meaningful progress has been detected. Make a materially different change, run a " "materially different validation, or submit/stop." @@ -57,6 +75,27 @@ def _digest_bytes(value: bytes) -> str: return hashlib.sha256(value).hexdigest()[:16] +def is_validation_like(command: str) -> bool: + return bool(_VALIDATION_INTENT_RE.search(command or "")) + + +def is_weakened_validation_command(command: str) -> bool: + return bool(_WEAK_VALIDATION_RE.search(command or "")) + + +def _validation_intents(command: str) -> frozenset[str]: + return frozenset(match.lower() for match in _VALIDATION_INTENT_RE.findall(command or "")) + + +def _changed_files_fingerprint(mutations: "MutationSummary") -> str: + rows = [ + *(f"created:{item.path}:{item.content_hash or ''}" for item in mutations.created), + *(f"modified:{item.path}:{item.content_hash or ''}" for item in mutations.modified), + *(f"deleted:{item.path}:{item.content_hash or ''}" for item in mutations.deleted), + ] + return _digest("\n".join(sorted(rows))) + + def _is_within(path: Path, root: Path) -> bool: try: path.resolve(strict=False).relative_to(root.resolve(strict=False)) @@ -269,6 +308,10 @@ class CommandRecord: no_progress_warning: bool = False force_finalization: bool = False failure_fingerprint: str = "" + weakened_validation: bool = False + changed_files_fingerprint: str = "" + output_excerpt: str = "" + step: int = 0 def to_dict(self) -> dict[str, Any]: return asdict(self) @@ -287,6 +330,32 @@ class ValidationEvidence: exit_code: int failure_fingerprint: str = "" suspicious: bool = False + weakened: bool = False + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class UnresolvedValidationFailure: + command: str + exit_code: int + excerpt: str + step: int + changed_files_fingerprint: str + intents: frozenset[str] = field(default_factory=frozenset, repr=False) + + def to_dict(self) -> dict[str, Any]: + result = asdict(self) + result["intents"] = sorted(self.intents) + return result + + +@dataclass(slots=True) +class SuccessfulValidationState: + command: str + step: int + changed_files_fingerprint: str def to_dict(self) -> dict[str, Any]: return asdict(self) @@ -344,6 +413,9 @@ class AttemptState: validation_evidence: list[ValidationEvidence] = field(default_factory=list) warnings: list[str] = field(default_factory=list) unresolved_failures: list[str] = field(default_factory=list) + unresolved_validation_failures: list[UnresolvedValidationFailure] = field(default_factory=list) + best_successful_validation: SuccessfulValidationState | None = None + final_changed_files_fingerprint: str = "" timeouts: int = 0 snapshot_truncated: bool = False no_progress_steps: int = 0 @@ -428,6 +500,58 @@ def register_progress(self, record: CommandRecord, evidence: ValidationEvidence) record.force_finalization = self.no_progress_events >= 2 return True, record.force_finalization + def track_validation(self, record: CommandRecord, evidence: ValidationEvidence) -> None: + if not is_validation_like(record.command): + return + intents = _validation_intents(record.command) + if record.exit_code != 0: + self.unresolved_validation_failures.append( + UnresolvedValidationFailure( + command=record.command, + exit_code=record.exit_code, + excerpt=record.output_excerpt, + step=record.step, + changed_files_fingerprint=record.changed_files_fingerprint, + intents=intents, + ) + ) + return + if evidence.weakened: + return + self.unresolved_validation_failures = [ + failure + for failure in self.unresolved_validation_failures + if not ( + failure.command == record.command + or bool(failure.intents & intents) + or failure.changed_files_fingerprint != record.changed_files_fingerprint + ) + ] + self.best_successful_validation = SuccessfulValidationState( + command=record.command, + step=record.step, + changed_files_fingerprint=record.changed_files_fingerprint, + ) + + def finalization_warnings(self) -> list[str]: + warnings: list[str] = [] + if self.unresolved_validation_failures: + summaries = [] + for failure in self.unresolved_validation_failures[-3:]: + excerpt = f": {failure.excerpt}" if failure.excerpt else "" + summaries.append( + f"- {failure.command} (exit {failure.exit_code}, step {failure.step}){excerpt}" + ) + warnings.append(UNRESOLVED_VALIDATION_MESSAGE + "\n" + "\n".join(summaries)) + if ( + self.best_successful_validation is not None + and self.final_changed_files_fingerprint + and self.best_successful_validation.changed_files_fingerprint + != self.final_changed_files_fingerprint + ): + warnings.append(VALIDATION_DRIFT_MESSAGE) + return warnings + def add_evidence(self, evidence: ValidationEvidence) -> None: self.validation_evidence.append(evidence) successful = [item for item in self.validation_evidence if item.exit_code == 0] @@ -470,6 +594,9 @@ def to_dict(self) -> dict[str, Any]: "validation_evidence": [item.to_dict() for item in self.validation_evidence], "warnings": self.warnings, "unresolved_failures": self.unresolved_failures, + "unresolved_validation_failures": [item.to_dict() for item in self.unresolved_validation_failures], + "best_successful_validation": self.best_successful_validation.to_dict() if self.best_successful_validation else None, + "final_changed_files_fingerprint": self.final_changed_files_fingerprint, "timeouts": self.timeouts, "snapshot_truncated": self.snapshot_truncated, "no_progress_steps": self.no_progress_steps, @@ -596,6 +723,7 @@ def finish_attempt(self) -> AttemptState: self.attempt.files_modified.add(item.path) for item in cumulative.deleted: self.attempt.files_deleted.add(item.path) + self.attempt.final_changed_files_fingerprint = _changed_files_fingerprint(cumulative) if cumulative.has_effects(): self.attempt.side_effects.append({"scope": "cumulative-attempt", **cumulative.to_dict()}) return self.attempt @@ -759,8 +887,10 @@ def _kill_process_tree(proc: subprocess.Popen[str]) -> None: def _run_process( self, command: str, cwd: Path, env: Mapping[str, str], timeout: int ) -> tuple[int, str, str, bool]: + bash = shutil.which("bash", path=env.get("PATH")) + process_command: str | list[str] = [bash, "-o", "pipefail", "-c", command] if bash else command popen_kwargs: dict[str, Any] = { - "shell": True, + "shell": not bool(bash), "cwd": str(cwd), "env": dict(env), "stdout": subprocess.PIPE, @@ -769,7 +899,7 @@ def _run_process( } if os.name == "posix": popen_kwargs["start_new_session"] = True - proc = subprocess.Popen(command, **popen_kwargs) + proc = subprocess.Popen(process_command, **popen_kwargs) try: stdout, stderr = proc.communicate(timeout=timeout) return int(proc.returncode or 0), stdout or "", stderr or "", False @@ -843,6 +973,14 @@ def run( external_or_private_state_may_have_changed=True, warnings=warnings, failure_fingerprint=failure_fingerprint(stdout, stderr, exit_code), + weakened_validation=is_weakened_validation_command(command), + changed_files_fingerprint=_changed_files_fingerprint( + self._mutation_diff( + self._attempt_files_before.records, after_snapshot.records, self.attempt.before, after_fp + ) + ), + output_excerpt=_cap_text((stderr or stdout).strip(), 500), + step=len(self.attempt.commands) + 1, ) self.attempt.add_command(record) completed = subprocess.CompletedProcess(command, exit_code, stdout, stderr) @@ -930,8 +1068,13 @@ def record_validation( scope="final expected behaviour" if final_behavior else "partial behaviour", exit_code=record.exit_code, failure_fingerprint=record.failure_fingerprint, + weakened=record.weakened_validation, ) + if record.weakened_validation: + evidence.label = "weak " + evidence.label + evidence.strength = min(evidence.strength, 1) self.attempt.add_evidence(evidence) + self.attempt.track_validation(record, evidence) warning, force = self.attempt.register_progress(record, evidence) record.warnings = [ item @@ -971,6 +1114,8 @@ def compact_command_observation( ).splitlines() if evidence is not None: observation["evidence"] = evidence.label + if evidence.weakened: + observation["validation_warning"] = WEAK_VALIDATION_MESSAGE if record.timed_out: observation["message"] = TIMEOUT_MESSAGE if warnings or record.exit_code != 0 or record.no_progress_warning: diff --git a/villani_code/state.py b/villani_code/state.py index ae7969b1..99b238b4 100644 --- a/villani_code/state.py +++ b/villani_code/state.py @@ -1120,6 +1120,11 @@ def _finish_bounded( for command_record in attempt_state.commands: if not any(item.command == command_record.command for item in attempt_state.validation_evidence): self._task_execution_context.record_validation(command_record, kind="command") + validation_warnings = attempt_state.finalization_warnings() + if validation_warnings: + warning_text = "\n\n".join(validation_warnings) + response.setdefault("content", []).append({"type": "text", "text": warning_text}) + final_text = f"{final_text}\n\n{warning_text}" if final_text else warning_text if not completed: self._failure_memory = attempt_state.build_failure_memory(final_text, reason) execution = ExecutionResult(

AAf+8igy!Jpra62JCat= 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 literal 0 HcmV?d00001 diff --git a/docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.pdf b/docs/Villani_Code_9B_Terminal_Bench_Technical_Report_Leaderboard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a727716a842e3afe0fd21997e7a5e51fa238054 GIT binary patch literal 392266 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 z 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