From 5ece9fd7f3c6db8f7f9a3b531982ff1d5efe2168 Mon Sep 17 00:00:00 2001 From: Bill Leoutsakos Date: Fri, 2 Oct 2026 13:36:13 -0700 Subject: [PATCH 1/2] chore(pi): upgrade agent to 1.0.0 --- .../handlers/pi/cloud/cli-runtime.test.ts | 88 +++++ .../handlers/pi/cloud/event-filter-source.ts | 7 +- .../handlers/pi/cloud/installed-cli.test.ts | 109 ++++++ .../handlers/pi/cloud/review/backend.test.ts | 1 + .../handlers/pi/cloud/review/backend.ts | 2 +- apps/sim/executor/handlers/pi/cloud/shared.ts | 17 +- .../handlers/pi/core/__fixtures__/provider.ts | 119 ++++++ apps/sim/executor/handlers/pi/core/pi-sdk.ts | 9 +- .../handlers/pi/core/sdk-runtime.test.ts | 159 ++++++++ .../handlers/pi/local/backend.test.ts | 2 + .../sim/executor/handlers/pi/local/backend.ts | 1 + .../executor/handlers/pi/pi-handler.test.ts | 8 +- apps/sim/executor/handlers/pi/pi-handler.ts | 2 +- apps/sim/package.json | 4 +- .../providers/pi-model-catalog.generated.ts | 338 ++++++++++++------ apps/sim/providers/pi-providers.test.ts | 10 +- apps/sim/scripts/build-pi-e2b-template.ts | 2 +- apps/sim/scripts/pi-sandbox-packages.ts | 4 +- bun.lock | 252 +++++++------ 19 files changed, 895 insertions(+), 239 deletions(-) create mode 100644 apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts create mode 100644 apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts create mode 100644 apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts create mode 100644 apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts diff --git a/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts b/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts new file mode 100644 index 00000000000..8292b435c14 --- /dev/null +++ b/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts @@ -0,0 +1,88 @@ +import { execFile } from 'node:child_process' +import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { promisify } from 'node:util' +import { describe, expect, it } from 'vitest' +import { PI_EVENT_FILTER_SOURCE } from '@/executor/handlers/pi/cloud/event-filter-source' +import { buildPiScript } from '@/executor/handlers/pi/cloud/shared' +import { PI_PACKAGE_VERSION } from '@/scripts/pi-sandbox-packages' + +const exec = promisify(execFile) + +async function invokeSandbox(version: string, exitCode = 0) { + const root = await mkdtemp(join(tmpdir(), 'sim-pi-cli-')) + const workspace = join(root, 'workspace') + const repo = join(workspace, 'repo') + const bin = join(root, 'bin') + await mkdir(repo, { recursive: true }) + await mkdir(bin) + await writeFile(join(workspace, 'pi-prompt.txt'), 'fixture prompt') + await writeFile(join(workspace, 'sim-pi-event-filter.mjs'), PI_EVENT_FILTER_SOURCE) + await writeFile( + join(bin, 'pi'), + `#!/bin/bash +if [ "$1" = "--version" ]; then + printf "%s\\n" "${version}" + exit 0 +fi +printf "%s" "$PI_CODING_AGENT_DIR" > "${root}/invoked" +printf "%s\\n" '{"type":"message_update","assistantMessageEvent":{"type":"text_delta","delta":"ok"}}' +exit ${exitCode} +`, + { mode: 0o700 } + ) + const script = buildPiScript().replaceAll('/workspace', workspace) + try { + const result = await exec('/bin/bash', ['-c', script], { + env: { + ...process.env, + PATH: `${bin}:${process.env.PATH}`, + PI_PROVIDER: 'fixture', + PI_MODEL: 'fixture', + PI_THINKING: 'off', + }, + }).then( + ({ stdout, stderr }) => ({ code: 0, stdout, stderr }), + (error: { code: number; stdout: string; stderr: string }) => error + ) + const invoked = await readFile(join(root, 'invoked'), 'utf8').catch(() => null) + const settings = invoked + ? await readFile(join(invoked, 'settings.json'), 'utf8').catch(() => null) + : null + const storedFiles = invoked ? await readdir(invoked).catch(() => []) : [] + return { ...result, invoked, settings, storedFiles, repo } + } finally { + await rm(root, { recursive: true, force: true }) + } +} + +describe('sandbox Pi runtime boundary', () => { + it.each(['0.80.10', 'unexpected-version'])( + 'rejects %s before starting the agent', + async (version) => { + const result = await invokeSandbox(version) + expect(result.code).not.toBe(0) + expect(result.invoked).toBeNull() + expect(result.stderr).toMatch(/rebuild|update/i) + expect(result.stderr).toContain(PI_PACKAGE_VERSION) + } + ) + + it('uses private settings outside the repository with warming off and no saved credentials', async () => { + const result = await invokeSandbox(PI_PACKAGE_VERSION) + expect(result.code).toBe(0) + expect(result.invoked).toBeTruthy() + expect(result.invoked?.startsWith(result.repo)).toBe(false) + expect(JSON.parse(result.settings ?? '{}')).toEqual({ cacheWarming: 'off' }) + expect(result.storedFiles).toEqual(['settings.json']) + expect(JSON.parse(result.stdout.trim())).toEqual({ + type: 'message_update', + assistantMessageEvent: { type: 'text_delta', delta: 'ok' }, + }) + }) + + it('propagates a failing CLI even when the stdout filter succeeds', async () => { + expect((await invokeSandbox(PI_PACKAGE_VERSION, 42)).code).toBe(42) + }) +}) diff --git a/apps/sim/executor/handlers/pi/cloud/event-filter-source.ts b/apps/sim/executor/handlers/pi/cloud/event-filter-source.ts index 5456607eb78..6e2edb602c9 100644 --- a/apps/sim/executor/handlers/pi/cloud/event-filter-source.ts +++ b/apps/sim/executor/handlers/pi/cloud/event-filter-source.ts @@ -2,10 +2,9 @@ * The stdout filter the sandbox modes pipe the Pi CLI through, written at runtime like the search * extension and the review tools script next to it. * - * Pi's `--mode json` writes `JSON.stringify(event)` for every session event with no filtering, and - * `message_update` repeats the whole assistant message alongside each delta — so raw stdout grows - * with the square of the response length, and `tool_execution_end`, `turn_end`, and `agent_end` - * each add a full tool result, turn transcript, or run transcript on top of that. + * Pi 1.0 emits delta-only `message_update` events, but `tool_execution_end`, `turn_end`, and + * `agent_end` still include tool results and transcripts. The filter preserves Sim's event + * contract without retaining those cumulative payloads. * * The reduction has to happen in the sandbox because by the time Sim could drop the bytes they are * already retained: E2B's SDK accumulates every callback-delivered chunk internally, so its adapter diff --git a/apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts b/apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts new file mode 100644 index 00000000000..4cb361f0f01 --- /dev/null +++ b/apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts @@ -0,0 +1,109 @@ +import { execFile } from 'node:child_process' +import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import * as http from 'node:http' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { promisify } from 'node:util' +import { describe, expect, it } from 'vitest' +import { PI_EVENT_FILTER_SOURCE } from '@/executor/handlers/pi/cloud/event-filter-source' +import { buildPiScript } from '@/executor/handlers/pi/cloud/shared' +import { + FIXTURE_KEY, + startPiProviderFixture, +} from '@/executor/handlers/pi/core/__fixtures__/provider' +import { applyPiEvent, createPiTotals, parseJsonLine } from '@/executor/handlers/pi/core/events' +import { PI_SEARCH_EXTENSION_SOURCE } from '@/executor/handlers/pi/search/extension-source' + +const exec = promisify(execFile) + +describe('installed Pi CLI wire', () => { + it('loads explicit Sim search with --no-extensions and keeps warming disabled', async () => { + const root = await mkdtemp(join(tmpdir(), 'sim-pi-installed-cli-')) + const workspace = join(root, 'workspace') + const fixture = await startPiProviderFixture(http) + try { + const repo = join(workspace, 'repo') + const bin = join(root, 'bin') + const providerPath = join(root, 'provider.ts') + const searchPath = join(workspace, 'sim-search-extension.ts') + const preload = join(root, 'preload.mjs') + await mkdir(join(repo, '.pi', 'extensions'), { recursive: true }) + await mkdir(bin) + await writeFile( + join(repo, '.pi', 'extensions', 'poison.ts'), + 'throw new Error("repository extension loaded")' + ) + await writeFile(join(workspace, 'pi-prompt.txt'), 'search-fixture') + await writeFile(join(workspace, 'sim-pi-event-filter.mjs'), PI_EVENT_FILTER_SOURCE) + await writeFile(searchPath, PI_SEARCH_EXTENSION_SOURCE) + await writeFile( + providerPath, + `export default function(pi) { pi.registerProvider("fixture", ${JSON.stringify({ ...fixture.provider, apiKey: FIXTURE_KEY })}) }` + ) + await writeFile( + preload, + `const guard = (originalFetch) => (input, init) => { + const url = new URL(typeof input === "string" ? input : input instanceof URL ? input.href : input.url); + if (url.origin === "https://api.exa.ai" && url.pathname === "/search") return originalFetch(${JSON.stringify(`${fixture.baseUrl}/exa`)}, init); + if (url.origin === ${JSON.stringify(fixture.baseUrl)}) return originalFetch(input, init); + throw new Error("Unexpected external fixture traffic: " + url.origin); +}; +let guardedFetch = guard(globalThis.fetch); +Object.defineProperty(globalThis, "fetch", { configurable: true, get: () => guardedFetch, set: (fetch) => { guardedFetch = guard(fetch); } });` + ) + const cli = join( + dirname(fileURLToPath(import.meta.resolve('@earendil-works/pi-coding-agent'))), + 'bundle', + 'cli.js' + ) + await writeFile(join(bin, 'pi'), `#!/bin/bash\nexec node "${cli}" "$@"\n`, { mode: 0o700 }) + const script = buildPiScript('/workspace/sim-search-extension.ts', { + disableRepositoryResources: true, + }) + .replaceAll('/workspace', workspace) + .replace(' < ', ` -e ${providerPath} < `) + const { stdout } = await exec('/bin/bash', ['-c', script], { + env: { + ...process.env, + PATH: `${bin}:${process.env.PATH}`, + NODE_OPTIONS: `--import ${preload}`, + PI_OFFLINE: '1', + PI_PROVIDER: 'fixture', + PI_MODEL: 'fixture-model', + PI_THINKING: 'medium', + SIM_SEARCH_PROVIDER: 'exa', + SIM_SEARCH_API_KEY: FIXTURE_KEY, + }, + timeout: 15_000, + }) + const totals = createPiTotals() + for (const line of stdout.split('\n')) { + const event = parseJsonLine(line) + if (event) applyPiEvent(totals, event) + } + expect(JSON.stringify(fixture.requests.at(-1)?.body.messages)).toContain( + 'Offline search evidence' + ) + expect(totals).toEqual({ + finalText: 'fixture complete', + inputTokens: 14, + outputTokens: 6, + toolCalls: [{ name: 'web_search', isError: false }], + }) + expect(fixture.requests.map(({ path }) => path)).toEqual([ + '/v1/chat/completions', + '/exa', + '/v1/chat/completions', + ]) + const agentDir = join(workspace, 'sim-pi-agent') + expect(JSON.parse(await readFile(join(agentDir, 'settings.json'), 'utf8'))).toEqual({ + cacheWarming: 'off', + }) + expect(JSON.parse(await readFile(join(agentDir, 'auth.json'), 'utf8'))).toEqual({}) + } finally { + await fixture.close() + await rm(root, { recursive: true, force: true }) + } + }, 30_000) +}) diff --git a/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts b/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts index 2e7abe911df..8c14bbc25eb 100644 --- a/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts +++ b/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts @@ -201,6 +201,7 @@ describe('runCloudReviewPi', () => { expect(mockSetRuntimeApiKey).toHaveBeenCalledWith('anthropic', 'sk-byok') expect(mockRemoveRuntimeApiKey).toHaveBeenCalledWith('anthropic') + expect(mockSdk.SettingsManager.inMemory).toHaveBeenCalledWith({ cacheWarming: 'off' }) expect(mockCreateSealedResourceLoader).toHaveBeenCalledTimes(1) expect(mockCreateAgentSession).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/apps/sim/executor/handlers/pi/cloud/review/backend.ts b/apps/sim/executor/handlers/pi/cloud/review/backend.ts index 289416ce96b..f648700b33e 100644 --- a/apps/sim/executor/handlers/pi/cloud/review/backend.ts +++ b/apps/sim/executor/handlers/pi/cloud/review/backend.ts @@ -300,7 +300,7 @@ export const runCloudReviewPi: PiBackendRun = async (par ) } - const settingsManager = sdk.SettingsManager.inMemory() + const settingsManager = sdk.SettingsManager.inMemory({ cacheWarming: 'off' }) const resourceLoader = createSealedPiResourceLoader( sdk, buildReviewSystemPrompt(Boolean(searchTool)) diff --git a/apps/sim/executor/handlers/pi/cloud/shared.ts b/apps/sim/executor/handlers/pi/cloud/shared.ts index 6dcdbaf6ea3..a1bf348d2ae 100644 --- a/apps/sim/executor/handlers/pi/cloud/shared.ts +++ b/apps/sim/executor/handlers/pi/cloud/shared.ts @@ -9,6 +9,7 @@ import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' import { resolvePiSandboxLifetimeMs } from '@/lib/execution/remote-sandbox/pi-lifetime' import { PI_EVENT_FILTER_PATH } from '@/executor/handlers/pi/cloud/event-filter-source' import { scrubPiSecrets } from '@/executor/handlers/pi/core/redaction' +import { PI_PACKAGE_VERSION } from '@/scripts/pi-sandbox-packages' export const REPO_DIR = '/workspace/repo' export const PROMPT_PATH = '/workspace/pi-prompt.txt' @@ -141,6 +142,10 @@ export const PUSH_SCRIPT = `cd ${REPO_DIR} * there first — skipping that write does not fall back to the raw stream, it fails the run on the * missing module. * + * Rejects stale images before starting the agent. Each invocation resets Sim's private agent + * directory outside the clone, so neither stored credentials nor cache-warming settings can leak + * between rounds. Model credentials remain environment-only. + * * Selects `/bin/bash` explicitly because `pipefail` is not portable to `/bin/sh`, and without it * the pipeline reports the filter's exit code rather than Pi's, so an upstream crash would read as * a clean run. Both dedicated Pi images are Debian-based and provide Bash, so provider @@ -165,7 +170,17 @@ export function buildPiScript( ? ' --no-extensions' : '' const extensionArgs = extensionPath ? ` -e ${extensionPath}` : '' - return `/bin/bash -o pipefail -c 'cd ${REPO_DIR} + return `/bin/bash -o pipefail -c 'set -e +if ! PI_INSTALLED_VERSION="$(pi --version 2>/dev/null)" || [ "$PI_INSTALLED_VERSION" != "${PI_PACKAGE_VERSION}" ]; then + printf "%s\\n" "Pi sandbox runtime must be ${PI_PACKAGE_VERSION}. Rebuild or update the configured Pi sandbox image before running this workflow." >&2 + exit 1 +fi +export PI_CODING_AGENT_DIR=/workspace/sim-pi-agent +(umask 077 +rm -rf "$PI_CODING_AGENT_DIR" +mkdir -p "$PI_CODING_AGENT_DIR" +printf "%s\\n" "{\\"cacheWarming\\":\\"off\\"}" > "$PI_CODING_AGENT_DIR/settings.json") +cd ${REPO_DIR} pi -p --mode json --provider "$PI_PROVIDER" --model "$PI_MODEL" --thinking "$PI_THINKING"${repositoryArgs}${extensionArgs} < ${PROMPT_PATH} | node ${PI_EVENT_FILTER_PATH}'` } diff --git a/apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts b/apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts new file mode 100644 index 00000000000..a3ecd200fe0 --- /dev/null +++ b/apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts @@ -0,0 +1,119 @@ +import { once } from 'node:events' +import type * as NodeHTTP from 'node:http' +import type { AddressInfo } from 'node:net' +import type { ProviderConfig } from '@earendil-works/pi-coding-agent' + +export const FIXTURE_KEY = 'pi-offline-fixture-key' + +export async function startPiProviderFixture(http: typeof NodeHTTP) { + const requests: Array<{ path: string; body: Record; authorization?: string }> = + [] + let onRequest: (() => void) | undefined + const requested = new Promise((resolve) => { + onRequest = resolve + }) + const server = http.createServer(async (request, response) => { + let raw = '' + for await (const chunk of request) raw += chunk + const body = JSON.parse(raw || '{}') as Record + requests.push({ path: request.url ?? '', body, authorization: request.headers.authorization }) + onRequest?.() + if (request.url === '/exa') { + response.setHeader('content-type', 'application/json') + response.end( + JSON.stringify({ + results: [ + { + title: 'Fixture result', + url: 'https://example.com/fixture', + text: 'Offline search evidence', + }, + ], + }) + ) + return + } + const messages = Array.isArray(body.messages) ? body.messages : [] + const prompt = JSON.stringify(messages) + if (prompt.includes('provider-error')) { + response.writeHead(400, { 'content-type': 'application/json' }) + response.end( + JSON.stringify({ + error: { message: `provider failed ${FIXTURE_KEY}`, type: 'invalid_request_error' }, + }) + ) + return + } + response.writeHead(200, { 'content-type': 'text/event-stream', 'cache-control': 'no-cache' }) + const chunk = (delta: Record, finish: string | null = null) => { + response.write( + `data: ${JSON.stringify({ id: 'fixture', object: 'chat.completion.chunk', model: 'fixture-model', choices: [{ index: 0, delta, finish_reason: finish }] })}\n\n` + ) + } + chunk({ role: 'assistant' }) + if (prompt.includes('cancel-fixture')) return + const hasToolResult = messages.some((message: { role?: string }) => message.role === 'tool') + if (!hasToolResult) { + chunk({ reasoning_content: 'checking fixture' }) + const search = prompt.includes('search-fixture') + chunk({ + tool_calls: [ + { + index: 0, + id: 'call-fixture', + type: 'function', + function: { + name: search ? 'web_search' : 'fixture_tool', + arguments: JSON.stringify( + search ? { query: 'fixture query' } : { value: 'fixture input' } + ), + }, + }, + ], + }) + chunk({}, 'tool_calls') + } else { + chunk({ content: 'fixture complete' }) + chunk({}, 'stop') + } + response.write( + `data: ${JSON.stringify({ id: 'fixture', choices: [], usage: { prompt_tokens: 7, completion_tokens: 3, total_tokens: 10 } })}\n\ndata: [DONE]\n\n` + ) + response.end() + }) + server.listen(0, '127.0.0.1') + await once(server, 'listening') + const baseUrl = `http://127.0.0.1:${(server.address() as AddressInfo).port}` + const provider: ProviderConfig = { + baseUrl: `${baseUrl}/v1`, + api: 'openai-completions', + models: [ + { + id: 'fixture-model', + name: 'Offline fixture', + reasoning: true, + input: ['text'], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 100_000, + maxTokens: 1000, + compat: { + supportsDeveloperRole: false, + supportsStore: false, + supportsReasoningEffort: false, + }, + }, + ], + } + return { + baseUrl, + provider, + requests, + requested, + async close() { + server.closeAllConnections() + await new Promise((resolve, reject) => + server.close((error) => (error ? reject(error) : resolve())) + ) + }, + } +} diff --git a/apps/sim/executor/handlers/pi/core/pi-sdk.ts b/apps/sim/executor/handlers/pi/core/pi-sdk.ts index 30e43c61b54..251f4212a36 100644 --- a/apps/sim/executor/handlers/pi/core/pi-sdk.ts +++ b/apps/sim/executor/handlers/pi/core/pi-sdk.ts @@ -29,10 +29,9 @@ function isToolArguments(value: unknown): value is Record { * credentials from thrown and reported tool errors. Successful tool output is ordinary model * content and stays verbatim; Sim-secret projection is owned by the tool adapter's provenance. * - * A spec's `isError` is rethrown rather than reported in the result: Pi derives a call's error state - * solely from whether `execute` threw, so a resolved failure would reach the model as a successful - * tool call whose text happens to describe a failure. Throwing also matches Pi's own `bash`, which - * throws on a non-zero exit with the output appended, so the failure text survives either way. + * A spec's `isError` is rethrown with scrubbed text, preserving Sim's existing failure semantics. + * Pi 1.0 also accepts an explicit error result, but throwing keeps the same diagnostic boundary + * for reported failures and exceptions. * * Shared by both host-side backends: Local Dev converts its SSH, Sim, and search tools here, and * Review Code converts its search tool here alongside the review tools it builds directly. @@ -90,7 +89,9 @@ export function createSealedPiResourceLoader(sdk: PiSdk, systemPrompt: string): getThemes: () => ({ themes: [], diagnostics: [] }), getAgentsFiles: () => ({ agentsFiles: [] }), getSystemPrompt: () => systemPrompt, + getSystemPromptSource: () => undefined, getAppendSystemPrompt: () => [], + getAppendSystemPromptSources: () => [], extendResources: () => {}, reload: async () => {}, } diff --git a/apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts b/apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts new file mode 100644 index 00000000000..5f86c6e33e5 --- /dev/null +++ b/apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts @@ -0,0 +1,159 @@ +import { mkdir, mkdtemp, readdir, rm, writeFile } from 'node:fs/promises' +import * as http from 'node:http' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { Type } from 'typebox' +import { describe, expect, it } from 'vitest' +import { + FIXTURE_KEY, + startPiProviderFixture, +} from '@/executor/handlers/pi/core/__fixtures__/provider' +import { applyPiEvent, createPiTotals, normalizePiEvent } from '@/executor/handlers/pi/core/events' +import { + createPiModelRuntime, + createSealedPiResourceLoader, + loadPiSdk, + toPiTool, +} from '@/executor/handlers/pi/core/pi-sdk' +import { scrubPiEvent } from '@/executor/handlers/pi/core/redaction' + +async function createFixtureSession(toolError = false) { + const directory = await mkdtemp(join(tmpdir(), 'sim-pi-sdk-')) + const fixture = await startPiProviderFixture(http) + const sdk = await loadPiSdk() + const modelRuntime = await createPiModelRuntime(sdk) + modelRuntime.registerProvider('fixture', fixture.provider) + await modelRuntime.setRuntimeApiKey('fixture', FIXTURE_KEY) + await mkdir(join(directory, '.pi', 'extensions'), { recursive: true }) + await writeFile(join(directory, 'AGENTS.md'), 'poisoned repository instructions') + await writeFile( + join(directory, '.pi', 'extensions', 'poison.ts'), + 'throw new Error("poisoned extension")' + ) + await writeFile( + join(directory, 'auth.json'), + JSON.stringify({ fixture: { type: 'api_key', key: 'poisoned credential' } }) + ) + const model = modelRuntime.getModel('fixture', 'fixture-model') + if (!model) throw new Error('Fixture model missing') + const toolArguments: Array> = [] + const { session } = await sdk.createAgentSession({ + cwd: directory, + agentDir: directory, + modelRuntime, + model, + noTools: 'builtin', + customTools: [ + toPiTool( + sdk, + { + name: 'fixture_tool', + description: 'Offline fixture tool', + parameters: Type.Object({ value: Type.String() }), + execute: async (args) => { + toolArguments.push(args) + return { + text: toolError ? `tool failed ${FIXTURE_KEY}` : 'fixture output', + isError: toolError, + } + }, + }, + [FIXTURE_KEY] + ), + ], + resourceLoader: createSealedPiResourceLoader(sdk, 'sealed fixture prompt'), + settingsManager: sdk.SettingsManager.inMemory({ + cacheWarming: 'off', + retry: { enabled: false }, + }), + sessionManager: sdk.SessionManager.inMemory(directory), + }) + const totals = createPiTotals() + const events: unknown[] = [] + const unsubscribe = session.subscribe((raw) => { + events.push(raw) + const event = scrubPiEvent(normalizePiEvent(raw), [FIXTURE_KEY]) + if (event) applyPiEvent(totals, event) + }) + return { + session, + fixture, + totals, + events, + toolArguments, + directory, + async close() { + unsubscribe() + session.dispose() + await modelRuntime.removeRuntimeApiKey('fixture') + await fixture.close() + await rm(directory, { recursive: true, force: true }) + }, + } +} + +describe('installed Pi SDK wire', () => { + it.each([false, true])( + 'normalizes a real tool cycle (tool failure: %s) without discovering disk resources', + async (toolError) => { + const run = await createFixtureSession(toolError) + try { + await run.session.prompt('tool-cycle-fixture') + expect(run.toolArguments).toEqual([{ value: 'fixture input' }]) + expect(run.totals).toEqual({ + finalText: 'fixture complete', + inputTokens: 14, + outputTokens: 6, + toolCalls: [{ name: 'fixture_tool', isError: toolError }], + }) + expect(run.events.map(normalizePiEvent)).toContainEqual({ + type: 'thinking', + text: 'checking fixture', + }) + expect(run.fixture.requests).toHaveLength(2) + expect( + run.fixture.requests.every( + ({ authorization }) => authorization === `Bearer ${FIXTURE_KEY}` + ) + ).toBe(true) + const sent = JSON.stringify(run.fixture.requests) + expect(sent).toContain('sealed fixture prompt') + expect(sent).not.toContain('poisoned') + if (toolError) + expect(JSON.stringify(run.fixture.requests[1].body.messages)).not.toContain(FIXTURE_KEY) + expect(await readdir(run.directory)).not.toContain('settings.json') + expect(run.session.isStreaming).toBe(false) + } finally { + await run.close() + } + } + ) + + it('reports a real provider failure as a redacted terminal error', async () => { + const run = await createFixtureSession() + try { + await run.session.prompt('provider-error') + expect(run.totals.errorMessage).toContain('provider failed') + expect(run.totals.errorMessage).not.toContain(FIXTURE_KEY) + expect(run.fixture.requests).toHaveLength(1) + expect(run.session.isStreaming).toBe(false) + } finally { + await run.close() + } + }) + + it('cancels an open provider stream and finishes the session', async () => { + const run = await createFixtureSession() + try { + const prompted = run.session.prompt('cancel-fixture') + await run.fixture.requested + await run.session.abort() + await prompted + expect(run.session.isStreaming).toBe(false) + expect(run.totals.errorMessage).toMatch(/abort/i) + expect(run.fixture.requests).toHaveLength(1) + } finally { + await run.close() + } + }) +}) diff --git a/apps/sim/executor/handlers/pi/local/backend.test.ts b/apps/sim/executor/handlers/pi/local/backend.test.ts index bc52090b63e..681be601c33 100644 --- a/apps/sim/executor/handlers/pi/local/backend.test.ts +++ b/apps/sim/executor/handlers/pi/local/backend.test.ts @@ -39,6 +39,7 @@ const mockAgentSession = { } const mockSdk = { defineTool: vi.fn((tool) => tool), + SettingsManager: { inMemory: vi.fn(() => ({})) }, SessionManager: { inMemory: vi.fn(() => ({})) }, createAgentSession: mockCreateAgentSession, } @@ -142,6 +143,7 @@ describe('runLocalPi secret boundaries', () => { expect(toolResult.content).toEqual([{ type: 'text', text: 'read a file' }]) expect(mockSetRuntimeApiKey).toHaveBeenCalledWith('anthropic', 'a') expect(mockRemoveRuntimeApiKey).toHaveBeenCalledWith('anthropic') + expect(mockSdk.SettingsManager.inMemory).toHaveBeenCalledWith({ cacheWarming: 'off' }) }) it('scrubs SDK exceptions before they leave Local Dev', async () => { diff --git a/apps/sim/executor/handlers/pi/local/backend.ts b/apps/sim/executor/handlers/pi/local/backend.ts index e9fc2541c20..c27af12822b 100644 --- a/apps/sim/executor/handlers/pi/local/backend.ts +++ b/apps/sim/executor/handlers/pi/local/backend.ts @@ -93,6 +93,7 @@ async function runLocalAgent( noTools: 'builtin', customTools, modelRuntime, + settingsManager: sdk.SettingsManager.inMemory({ cacheWarming: 'off' }), sessionManager: sdk.SessionManager.inMemory(isolatedDir), }) diff --git a/apps/sim/executor/handlers/pi/pi-handler.test.ts b/apps/sim/executor/handlers/pi/pi-handler.test.ts index fd5b41fd8f2..3261a760d6c 100644 --- a/apps/sim/executor/handlers/pi/pi-handler.test.ts +++ b/apps/sim/executor/handlers/pi/pi-handler.test.ts @@ -213,13 +213,17 @@ describe('PiBlockHandler', () => { expect(mockRunLocal).not.toHaveBeenCalled() }) - it('rejects an unavailable model before resolving credentials', async () => { + it('rejects an unavailable model with replacement guidance before credentials or remote setup', async () => { mockResolvePiModelId.mockReturnValue(undefined) await expect(handler.execute(ctx(), block, localInputs())).rejects.toThrow( - /not available.*installed Pi catalog/ + /not available.*Choose a supported Pi model/ ) expect(mockResolveKey).not.toHaveBeenCalled() + expect(mockRunLocal).not.toHaveBeenCalled() + expect(mockRunCloud).not.toHaveBeenCalled() + expect(mockRunCloudPlan).not.toHaveBeenCalled() + expect(mockRunCloudReview).not.toHaveBeenCalled() }) it('adds successful Function tool cost once to a non-streaming Local Dev result', async () => { diff --git a/apps/sim/executor/handlers/pi/pi-handler.ts b/apps/sim/executor/handlers/pi/pi-handler.ts index 97f674ed1c8..84e3e7527b2 100644 --- a/apps/sim/executor/handlers/pi/pi-handler.ts +++ b/apps/sim/executor/handlers/pi/pi-handler.ts @@ -222,7 +222,7 @@ export class PiBlockHandler implements BlockHandler { const piModel = resolvePiModelId(providerId, model) if (!piModel) { throw new Error( - `Pi model "${model}" is not available for provider "${providerId}" in the installed Pi catalog` + `Pi model "${model}" is not available for provider "${providerId}" in the installed Pi catalog. Choose a supported Pi model in the block settings.` ) } diff --git a/apps/sim/package.json b/apps/sim/package.json index 3bd7ed252be..f537910f724 100644 --- a/apps/sim/package.json +++ b/apps/sim/package.json @@ -77,8 +77,8 @@ "@cerebras/cerebras_cloud_sdk": "^1.23.0", "@daytona/sdk": "0.207.0", "@e2b/code-interpreter": "2.7.1", - "@earendil-works/pi-ai": "0.80.10", - "@earendil-works/pi-coding-agent": "0.80.10", + "@earendil-works/pi-ai": "1.0.0", + "@earendil-works/pi-coding-agent": "1.0.0", "@floating-ui/dom": "1.7.6", "@google-cloud/storage": "7.21.0", "@google/genai": "2.13.0", diff --git a/apps/sim/providers/pi-model-catalog.generated.ts b/apps/sim/providers/pi-model-catalog.generated.ts index e08acce2e65..3468c93e70c 100644 --- a/apps/sim/providers/pi-model-catalog.generated.ts +++ b/apps/sim/providers/pi-model-catalog.generated.ts @@ -5,19 +5,21 @@ export const PI_MODEL_IDS_BY_PROVIDER = { anthropic: [ 'claude-fable-5', + 'claude-fable-5-1', 'claude-haiku-4-5', 'claude-haiku-4-5-20251001', - 'claude-opus-4-1', - 'claude-opus-4-1-20250805', 'claude-opus-4-5', 'claude-opus-4-5-20251101', 'claude-opus-4-6', 'claude-opus-4-7', 'claude-opus-4-8', + 'claude-opus-5', + 'claude-opus-5-5', 'claude-sonnet-4-5', 'claude-sonnet-4-5-20250929', 'claude-sonnet-4-6', 'claude-sonnet-5', + 'claude-sonnet-5-5', ], openai: [ 'gpt-4', @@ -32,18 +34,12 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'gpt-4o-mini', 'gpt-5', 'gpt-5-chat-latest', - 'gpt-5-codex', 'gpt-5-mini', 'gpt-5-nano', 'gpt-5-pro', 'gpt-5.1', - 'gpt-5.1-chat-latest', - 'gpt-5.1-codex', - 'gpt-5.1-codex-max', - 'gpt-5.1-codex-mini', 'gpt-5.2', 'gpt-5.2-chat-latest', - 'gpt-5.2-codex', 'gpt-5.2-pro', 'gpt-5.3-chat-latest', 'gpt-5.3-codex', @@ -57,36 +53,46 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'gpt-5.6-luna', 'gpt-5.6-sol', 'gpt-5.6-terra', + 'gpt-6-astra', + 'gpt-6-luna', + 'gpt-6-sol', + 'gpt-6.1-sol', + 'gpt-daybreak-blue-latest', + 'gpt-daybreak-red-latest', 'gpt-realtime-2.1', 'o1', 'o1-pro', 'o3', - 'o3-deep-research', 'o3-mini', 'o3-pro', 'o4-mini', - 'o4-mini-deep-research', ], google: [ - 'gemini-2.0-flash', - 'gemini-2.0-flash-lite', + 'deep-research-max-preview-04-2026', + 'deep-research-preview-04-2026', + 'gemini-2.5-computer-use-preview-10-2025', 'gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.5-pro', 'gemini-3-flash-preview', - 'gemini-3-pro-preview', 'gemini-3.1-flash-lite', + 'gemini-3.1-flash-lite-image', 'gemini-3.1-flash-lite-preview', + 'gemini-3.1-flash-live-preview', 'gemini-3.1-pro-preview', 'gemini-3.1-pro-preview-customtools', 'gemini-3.5-flash', + 'gemini-3.5-flash-lite', + 'gemini-3.6-flash', + 'gemini-3.7-flash', + 'gemini-3.8-flash', 'gemini-flash-latest', 'gemini-flash-lite-latest', 'gemma-4-26b-a4b-it', 'gemma-4-31b-it', ], - xai: ['grok-4.3', 'grok-4.5', 'grok-build-0.1'], - deepseek: ['deepseek-v4-flash', 'deepseek-v4-pro'], + xai: ['grok-4.3', 'grok-4.5', 'grok-4.6', 'grok-4.7'], + deepseek: ['deepseek-flash', 'deepseek-v4-pro'], mistral: [ 'codestral-latest', 'devstral-2512', @@ -97,7 +103,6 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'devstral-small-2507', 'labs-devstral-small-2512', 'magistral-medium-latest', - 'magistral-small', 'ministral-3b-latest', 'ministral-8b-latest', 'mistral-large-2411', @@ -118,49 +123,70 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'open-mixtral-8x7b', 'pixtral-12b', 'pixtral-large-latest', + 'voxtral-small-latest', + 'zai-glm-5-2', + 'zai-glm-5-3', ], groq: [ 'llama-3.1-8b-instant', 'llama-3.3-70b-versatile', - 'meta-llama/llama-4-scout-17b-16e-instruct', 'openai/gpt-oss-120b', 'openai/gpt-oss-20b', 'openai/gpt-oss-safeguard-20b', - 'qwen/qwen3-32b', + 'qwen/qwen3.6-27b', + 'qwen/qwen3.8-27b', ], - cerebras: ['gemma-4-31b', 'gpt-oss-120b', 'zai-glm-4.7'], + cerebras: ['gpt-oss-120b', 'qwen-3.8-27b'], openrouter: [ - 'ai21/jamba-large-1.7', 'aion-labs/aion-2.0', 'aion-labs/aion-3.0', 'aion-labs/aion-3.0-mini', + 'aion-labs/aion-3.5', + 'aion-labs/aion-3.5-mini', 'amazon/nova-2-lite-v1', 'amazon/nova-lite-v1', 'amazon/nova-micro-v1', 'amazon/nova-premier-v1', 'amazon/nova-pro-v1', - 'anthropic/claude-3-haiku', 'anthropic/claude-fable-5', + 'anthropic/claude-fable-5.1', + 'anthropic/claude-fable-5.1:batch', + 'anthropic/claude-fable-5:batch', 'anthropic/claude-haiku-4.5', - 'anthropic/claude-opus-4', + 'anthropic/claude-haiku-4.5:batch', 'anthropic/claude-opus-4.1', + 'anthropic/claude-opus-4.1:batch', 'anthropic/claude-opus-4.5', + 'anthropic/claude-opus-4.5:batch', 'anthropic/claude-opus-4.6', + 'anthropic/claude-opus-4.6:batch', 'anthropic/claude-opus-4.7', - 'anthropic/claude-opus-4.7-fast', + 'anthropic/claude-opus-4.7:batch', 'anthropic/claude-opus-4.8', - 'anthropic/claude-opus-4.8-fast', + 'anthropic/claude-opus-4.8:batch', + 'anthropic/claude-opus-5', + 'anthropic/claude-opus-5.5', + 'anthropic/claude-opus-5.5:batch', + 'anthropic/claude-opus-5:batch', 'anthropic/claude-sonnet-4', 'anthropic/claude-sonnet-4.5', + 'anthropic/claude-sonnet-4.5:batch', 'anthropic/claude-sonnet-4.6', + 'anthropic/claude-sonnet-4.6:batch', 'anthropic/claude-sonnet-5', + 'anthropic/claude-sonnet-5.5', + 'anthropic/claude-sonnet-5.5:batch', + 'anthropic/claude-sonnet-5:batch', + 'apodex/apodex-1.1-mini:free', 'arcee-ai/trinity-large-thinking', - 'arcee-ai/virtuoso-large', 'auto', 'bytedance-seed/seed-1.6', 'bytedance-seed/seed-1.6-flash', + 'bytedance-seed/seed-2-1-turbo', + 'bytedance-seed/seed-2.0-code', 'bytedance-seed/seed-2.0-lite', 'bytedance-seed/seed-2.0-mini', + 'cohere/command-a-plus', 'cohere/command-r-08-2024', 'cohere/command-r-plus-08-2024', 'cohere/north-mini-code:free', @@ -173,40 +199,67 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'deepseek/deepseek-v3.2', 'deepseek/deepseek-v3.2-exp', 'deepseek/deepseek-v4-flash', + 'deepseek/deepseek-v4-flash-0731', + 'deepseek/deepseek-v4-flash-vision-exp', 'deepseek/deepseek-v4-pro', + 'deepseek/deepseek-v4-pro-0813', + 'deepseek/deepseek-v4.1-flash', + 'deepseek/deepseek-v4.1-flash:batch', + 'dots-studio/dots-3-note-preview:free', + 'fireworks/ember-1', 'google/gemini-2.5-flash', 'google/gemini-2.5-flash-lite', + 'google/gemini-2.5-flash-lite:batch', + 'google/gemini-2.5-flash:batch', 'google/gemini-2.5-pro', 'google/gemini-2.5-pro-preview', - 'google/gemini-2.5-pro-preview-05-06', + 'google/gemini-2.5-pro:batch', 'google/gemini-3-flash-preview', + 'google/gemini-3-flash-preview:batch', 'google/gemini-3-pro-image', 'google/gemini-3.1-flash-lite', 'google/gemini-3.1-flash-lite-preview', + 'google/gemini-3.1-flash-lite:batch', 'google/gemini-3.1-pro-preview', 'google/gemini-3.1-pro-preview-customtools', + 'google/gemini-3.1-pro-preview:batch', 'google/gemini-3.5-flash', + 'google/gemini-3.5-flash-lite', + 'google/gemini-3.5-flash-lite:batch', + 'google/gemini-3.5-flash:batch', + 'google/gemini-3.6-flash', + 'google/gemini-3.6-flash:batch', + 'google/gemini-3.7-flash', + 'google/gemini-3.7-flash:batch', + 'google/gemini-3.8-flash', + 'google/gemini-3.8-flash:batch', 'google/gemma-3-12b-it', 'google/gemma-3-27b-it', 'google/gemma-4-26b-a4b-it', 'google/gemma-4-26b-a4b-it:free', 'google/gemma-4-31b-it', 'google/gemma-4-31b-it:free', - 'ibm-granite/granite-4.1-8b', + 'ibm-granite/granite-4.2-8b', 'inception/mercury-2', - 'inclusionai/ling-2.6-1t', - 'inclusionai/ling-2.6-flash', - 'inclusionai/ring-2.6-1t', - 'kwaipilot/kat-coder-air-v2.5', - 'kwaipilot/kat-coder-pro-v2', + 'inception/mercury-2.5', + 'inclusionai/ling-3.0-flash', + 'inclusionai/ling-3.0-flash-fin', + 'inclusionai/ling-3.0-flash-sante:free', + 'inclusionai/ling-3.0-flash-vl', 'kwaipilot/kat-coder-pro-v2.5', + 'liquid/lfm-2.5-2.6b:free', + 'meituan/longcat-2.0', 'meta-llama/llama-3.1-70b-instruct', 'meta-llama/llama-3.1-8b-instruct', 'meta-llama/llama-3.3-70b-instruct', - 'meta-llama/llama-3.3-70b-instruct:free', 'meta-llama/llama-4-maverick', 'meta-llama/llama-4-scout', + 'meta/muse-glimmer-30b', 'meta/muse-spark-1.1', + 'meta/muse-spark-1.2', + 'meta/muse-spark-1.2-contributor', + 'meta/muse-spark-1.3', + 'meta/muse-spark-1.3-contributor', 'minimax/minimax-m1', 'minimax/minimax-m2', 'minimax/minimax-m2.1', @@ -214,19 +267,26 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'minimax/minimax-m2.7', 'minimax/minimax-m3', 'mistralai/codestral-2508', + 'mistralai/codestral-2508:batch', 'mistralai/devstral-2512', 'mistralai/ministral-14b-2512', 'mistralai/ministral-3b-2512', 'mistralai/ministral-8b-2512', + 'mistralai/ministral-8b-2512:batch', 'mistralai/mistral-large', 'mistralai/mistral-large-2407', 'mistralai/mistral-large-2512', + 'mistralai/mistral-large-2512:batch', 'mistralai/mistral-medium-3', 'mistralai/mistral-medium-3-5', + 'mistralai/mistral-medium-3-5:batch', 'mistralai/mistral-medium-3.1', + 'mistralai/mistral-medium-3.1:batch', 'mistralai/mistral-nemo', 'mistralai/mistral-saba', 'mistralai/mistral-small-2603', + 'mistralai/mistral-small-2603:batch', + 'mistralai/mistral-small-3.1-24b-instruct', 'mistralai/mistral-small-3.2-24b-instruct', 'mistralai/mixtral-8x22b-instruct', 'mistralai/voxtral-small-24b-2507', @@ -237,89 +297,127 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'moonshotai/kimi-k2.6', 'moonshotai/kimi-k2.7-code', 'moonshotai/kimi-k3', - 'nex-agi/nex-n2-mini', - 'nex-agi/nex-n2-pro', - 'nvidia/llama-3.3-nemotron-super-49b-v1.5', + 'moonshotai/kimi-k3:batch', + 'nex-agi/nex-n2.5-pro', 'nvidia/nemotron-3-nano-30b-a3b', - 'nvidia/nemotron-3-nano-30b-a3b:free', 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'nvidia/nemotron-3-super-120b-a12b', 'nvidia/nemotron-3-super-120b-a12b:free', 'nvidia/nemotron-3-ultra-550b-a55b', 'nvidia/nemotron-3-ultra-550b-a55b:free', - 'nvidia/nemotron-nano-12b-v2-vl:free', - 'nvidia/nemotron-nano-9b-v2:free', + 'nvidia/nemotron-3.5-lightning', + 'nvidia/nemotron-3.5-lightning:free', 'openai/gpt-3.5-turbo', 'openai/gpt-3.5-turbo-0613', 'openai/gpt-3.5-turbo-16k', + 'openai/gpt-3.5-turbo:batch', 'openai/gpt-4', 'openai/gpt-4-turbo', - 'openai/gpt-4-turbo-preview', + 'openai/gpt-4-turbo:batch', 'openai/gpt-4.1', 'openai/gpt-4.1-mini', + 'openai/gpt-4.1-mini:batch', 'openai/gpt-4.1-nano', + 'openai/gpt-4.1-nano:batch', + 'openai/gpt-4.1:batch', 'openai/gpt-4o', 'openai/gpt-4o-2024-05-13', 'openai/gpt-4o-2024-08-06', 'openai/gpt-4o-2024-11-20', 'openai/gpt-4o-mini', 'openai/gpt-4o-mini-2024-07-18', + 'openai/gpt-4o-mini:batch', + 'openai/gpt-4o:batch', 'openai/gpt-5', - 'openai/gpt-5-codex', 'openai/gpt-5-mini', + 'openai/gpt-5-mini:batch', 'openai/gpt-5-nano', + 'openai/gpt-5-nano:batch', 'openai/gpt-5-pro', + 'openai/gpt-5-pro:batch', 'openai/gpt-5.1', - 'openai/gpt-5.1-chat', 'openai/gpt-5.1-codex', 'openai/gpt-5.1-codex-max', 'openai/gpt-5.1-codex-mini', + 'openai/gpt-5.1:batch', 'openai/gpt-5.2', 'openai/gpt-5.2-chat', 'openai/gpt-5.2-codex', 'openai/gpt-5.2-pro', - 'openai/gpt-5.3-chat', + 'openai/gpt-5.2-pro:batch', + 'openai/gpt-5.2:batch', 'openai/gpt-5.3-codex', 'openai/gpt-5.4', 'openai/gpt-5.4-mini', + 'openai/gpt-5.4-mini:batch', 'openai/gpt-5.4-nano', + 'openai/gpt-5.4-nano:batch', 'openai/gpt-5.4-pro', + 'openai/gpt-5.4-pro:batch', + 'openai/gpt-5.4:batch', 'openai/gpt-5.5', 'openai/gpt-5.5-pro', + 'openai/gpt-5.5-pro:batch', + 'openai/gpt-5.5:batch', 'openai/gpt-5.6-luna', 'openai/gpt-5.6-luna-pro', + 'openai/gpt-5.6-luna-pro:batch', + 'openai/gpt-5.6-luna:batch', 'openai/gpt-5.6-sol', 'openai/gpt-5.6-sol-pro', + 'openai/gpt-5.6-sol-pro:batch', + 'openai/gpt-5.6-sol:batch', 'openai/gpt-5.6-terra', 'openai/gpt-5.6-terra-pro', + 'openai/gpt-5.6-terra-pro:batch', + 'openai/gpt-5.6-terra:batch', + 'openai/gpt-5:batch', + 'openai/gpt-6-astra', + 'openai/gpt-6-astra-pro', + 'openai/gpt-6-astra-pro:batch', + 'openai/gpt-6-astra:batch', + 'openai/gpt-6-luna', + 'openai/gpt-6-luna-pro', + 'openai/gpt-6-luna-pro:batch', + 'openai/gpt-6-luna:batch', + 'openai/gpt-6-sol', + 'openai/gpt-6-sol-pro', + 'openai/gpt-6-sol-pro:batch', + 'openai/gpt-6-sol:batch', + 'openai/gpt-6.1-sol', + 'openai/gpt-6.1-sol-pro', 'openai/gpt-audio', 'openai/gpt-audio-mini', 'openai/gpt-chat-latest', 'openai/gpt-oss-120b', + 'openai/gpt-oss-120b:batch', 'openai/gpt-oss-20b', - 'openai/gpt-oss-20b:free', + 'openai/gpt-oss-20b:batch', 'openai/gpt-oss-safeguard-20b', 'openai/o1', 'openai/o3', - 'openai/o3-deep-research', 'openai/o3-mini', 'openai/o3-mini-high', + 'openai/o3-mini:batch', 'openai/o3-pro', + 'openai/o3:batch', 'openai/o4-mini', - 'openai/o4-mini-deep-research', 'openai/o4-mini-high', + 'openai/o4-mini:batch', 'openrouter/auto', + 'openrouter/auto-beta', 'openrouter/free', 'openrouter/fusion', - 'poolside/laguna-m.1', - 'poolside/laguna-m.1:free', + 'perceptron/perceptron-mk1.5', + 'poolside/laguna-s-2.1', + 'poolside/laguna-s-2.1:free', 'poolside/laguna-xs-2.1', 'poolside/laguna-xs-2.1:free', + 'prism-ml/ternary-bonsai-2-27b', 'qwen/qwen-2.5-72b-instruct', 'qwen/qwen-2.5-7b-instruct', 'qwen/qwen-plus', 'qwen/qwen-plus-2025-07-28', - 'qwen/qwen-plus-2025-07-28:thinking', 'qwen/qwen3-14b', 'qwen/qwen3-235b-a22b', 'qwen/qwen3-235b-a22b-2507', @@ -334,11 +432,9 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'qwen/qwen3-coder-flash', 'qwen/qwen3-coder-next', 'qwen/qwen3-coder-plus', - 'qwen/qwen3-coder:free', 'qwen/qwen3-max', 'qwen/qwen3-max-thinking', 'qwen/qwen3-next-80b-a3b-instruct', - 'qwen/qwen3-next-80b-a3b-instruct:free', 'qwen/qwen3-next-80b-a3b-thinking', 'qwen/qwen3-vl-235b-a22b-instruct', 'qwen/qwen3-vl-235b-a22b-thinking', @@ -360,25 +456,51 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'qwen/qwen3.6-flash', 'qwen/qwen3.6-max-preview', 'qwen/qwen3.6-plus', + 'qwen/qwen3.7-flash', 'qwen/qwen3.7-max', 'qwen/qwen3.7-plus', + 'qwen/qwen3.8-2.4t-a95b', + 'qwen/qwen3.8-27b', + 'qwen/qwen3.8-27b:free', + 'qwen/qwen3.8-flash', + 'qwen/qwen3.8-max-0902', + 'qwen/qwen3.8-max-prime', + 'qwen/qwen3.8-omni-flash', 'rekaai/reka-edge', 'relace/relace-search', + 'sakana/fugu-max', 'sakana/fugu-ultra', + 'sakana/fugu-ultra-v2', + 'sakana/sakana-namazu', 'sao10k/l3.1-euryale-70b', + 'stealth/space-bunny-alpha', 'stepfun/step-3.5-flash', 'stepfun/step-3.7-flash', 'tencent/hy3', 'tencent/hy3-preview', - 'tencent/hy3:free', - 'thedrummer/unslopnemo-12b', + 'tencent/hy4-preview', + 'thinkingmachines/inkling', + 'thinkingmachines/inkling-small', + 'thinkingmachines/inkling-small:free', + 'thinkingmachines/inkling:free', + 'typesafe/jev-router', + 'unbiased/pareto', + 'unbiased/pareto-26.10-preview', + 'upstage/solar-mini4', 'upstage/solar-pro-3', + 'upstage/solar-pro4', 'x-ai/grok-4.20', 'x-ai/grok-4.3', + 'x-ai/grok-4.3:batch', 'x-ai/grok-4.5', + 'x-ai/grok-4.6', + 'x-ai/grok-4.7', 'x-ai/grok-build-0.1', 'xiaomi/mimo-v2.5', 'xiaomi/mimo-v2.5-pro', + 'xiaomi/mimo-v2.6-flash', + 'xiaomi/mimo-v2.6-pro', + 'xiaomi/mimo-v2.6-pro-ultraspeed', 'z-ai/glm-4.5', 'z-ai/glm-4.5-air', 'z-ai/glm-4.5v', @@ -390,91 +512,107 @@ export const PI_MODEL_IDS_BY_PROVIDER = { 'z-ai/glm-5-turbo', 'z-ai/glm-5.1', 'z-ai/glm-5.2', + 'z-ai/glm-5.3', + 'z-ai/glm-5.3-flash', + 'z-ai/glm-5.3-flash:batch', + 'z-ai/glm-5.3-flashx', + 'z-ai/glm-5.3-prime', + 'z-ai/glm-5.3:batch', 'z-ai/glm-5v-turbo', '~anthropic/claude-fable-latest', '~anthropic/claude-haiku-latest', '~anthropic/claude-opus-latest', '~anthropic/claude-sonnet-latest', + '~deepseek/deepseek-flash-latest', + '~deepseek/deepseek-pro-latest', + '~deepseek/deepseek-v4-flash-latest', '~google/gemini-flash-latest', '~google/gemini-pro-latest', '~moonshotai/kimi-latest', - '~openai/gpt-latest', + '~openai/gpt-astra-latest', + '~openai/gpt-luna-latest', '~openai/gpt-mini-latest', + '~openai/gpt-sol-latest', + '~openai/gpt-terra-latest', '~x-ai/grok-latest', + '~z-ai/glm-flash-latest', + '~z-ai/glm-latest', ], fireworks: [ - 'accounts/fireworks/models/deepseek-v4-flash', - 'accounts/fireworks/models/deepseek-v4-pro', - 'accounts/fireworks/models/glm-5p1', - 'accounts/fireworks/models/glm-5p2', + 'accounts/fireworks/models/deepseek-v4p1-flash', + 'accounts/fireworks/models/ember-1', + 'accounts/fireworks/models/glm-5p3', + 'accounts/fireworks/models/glm-5p3-flash', 'accounts/fireworks/models/gpt-oss-120b', - 'accounts/fireworks/models/gpt-oss-20b', - 'accounts/fireworks/models/kimi-k2p6', - 'accounts/fireworks/models/kimi-k2p7-code', - 'accounts/fireworks/models/minimax-m2p7', + 'accounts/fireworks/models/inkling', + 'accounts/fireworks/models/kimi-k3', 'accounts/fireworks/models/minimax-m3', - 'accounts/fireworks/models/qwen3p7-plus', - 'accounts/fireworks/routers/glm-5p1-fast', - 'accounts/fireworks/routers/glm-5p2-fast', - 'accounts/fireworks/routers/kimi-k2p6-fast', - 'accounts/fireworks/routers/kimi-k2p6-turbo', - 'accounts/fireworks/routers/kimi-k2p7-code-fast', + 'accounts/fireworks/models/nemotron-3-ultra-nvfp4', + 'accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b', + 'accounts/fireworks/models/qwen3p8-2p4t-a95b', + 'accounts/fireworks/models/qwen3p8-max', + 'accounts/fireworks/routers/deepseek-flash-latest', + 'accounts/fireworks/routers/glm-5p3-fast', + 'accounts/fireworks/routers/glm-fast-latest', + 'accounts/fireworks/routers/glm-flash-latest', + 'accounts/fireworks/routers/glm-latest', + 'accounts/fireworks/routers/kimi-fast-latest', + 'accounts/fireworks/routers/kimi-k3-fast', + 'accounts/fireworks/routers/kimi-latest', + 'accounts/fireworks/routers/minimax-latest', + 'accounts/fireworks/routers/qwen-max-latest', ], together: [ 'MiniMaxAI/MiniMax-M2.7', 'MiniMaxAI/MiniMax-M3', 'Qwen/Qwen2.5-7B-Instruct-Turbo', - 'Qwen/Qwen3-235B-A22B-Instruct-2507-tput', - 'Qwen/Qwen3.5-397B-A17B', 'Qwen/Qwen3.5-9B', 'Qwen/Qwen3.6-Plus', 'Qwen/Qwen3.7-Max', + 'deepseek-ai/DeepSeek-V4-Flash-0731', 'deepseek-ai/DeepSeek-V4-Pro', - 'essentialai/Rnj-1-Instruct', + 'deepseek-ai/DeepSeek-V4-Pro-0813', + 'deepseek-ai/DeepSeek-V4.1-Flash', 'google/gemma-4-31B-it', 'meta-llama/Llama-3.3-70B-Instruct-Turbo', - 'moonshotai/Kimi-K2.6', - 'moonshotai/Kimi-K2.7-Code', + 'moonshotai/Kimi-K3', 'nvidia/nemotron-3-ultra-550b-a55b', 'openai/gpt-oss-120b', 'openai/gpt-oss-20b', - 'zai-org/GLM-5', - 'zai-org/GLM-5.1', + 'thinkingmachines/Inkling', 'zai-org/GLM-5.2', + 'zai-org/GLM-5.3', + 'zai-org/GLM-5.3-Flash', ], nvidia: [ - 'meta/llama-3.1-70b-instruct', - 'meta/llama-3.1-8b-instruct', + 'google/gemma-3-12b-it', + 'google/gemma-3-4b-it', 'meta/llama-3.2-11b-vision-instruct', 'meta/llama-3.2-90b-vision-instruct', - 'meta/llama-3.3-70b-instruct', - 'minimaxai/minimax-m3', - 'mistralai/mistral-large-3-675b-instruct-2512', - 'mistralai/mistral-small-4-119b-2603', + 'meta/muse-glimmer-30b', + 'mistralai/mistral-7b-instruct-v0.3', 'moonshotai/kimi-k2.6', - 'nvidia/nemotron-3-nano-30b-a3b', + 'moonshotai/kimi-k3', + 'nvidia/cosmos-reason2-8b', + 'nvidia/llama-3.1-nemotron-70b-instruct', + 'nvidia/llama-3.1-nemotron-ultra-253b-v1', 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning', 'nvidia/nemotron-3-super-120b-a12b', 'nvidia/nemotron-3-ultra-550b-a55b', - 'nvidia/nvidia-nemotron-nano-9b-v2', - 'openai/gpt-oss-120b', + 'nvidia/nemotron-3.5-lightning-30b-a3b', 'openai/gpt-oss-20b', - 'qwen/qwen3.5-122b-a10b', - 'stepfun-ai/step-3.5-flash', - 'stepfun-ai/step-3.7-flash', - 'z-ai/glm-5.2', + 'poolside/laguna-xs-2.1', + 'z-ai/glm-5.3', + 'z-ai/glm-5.3-flash', ], - zai: ['glm-4.5-air', 'glm-4.7', 'glm-5-turbo', 'glm-5.1', 'glm-5.2', 'glm-5v-turbo'], - kimi: [ - 'kimi-k2-0711-preview', - 'kimi-k2-0905-preview', - 'kimi-k2-thinking', - 'kimi-k2-thinking-turbo', - 'kimi-k2-turbo-preview', - 'kimi-k2.5', - 'kimi-k2.6', - 'kimi-k2.7-code', - 'kimi-k2.7-code-highspeed', - 'kimi-k3', + zai: [ + 'glm-4.7', + 'glm-5-turbo', + 'glm-5.2', + 'glm-5.2-highspeed', + 'glm-5.3', + 'glm-5.3-flash', + 'glm-5.3-highspeed', ], + kimi: ['kimi-k2.6', 'kimi-k2.7-code', 'kimi-k2.7-code-highspeed', 'kimi-k3'], } as const diff --git a/apps/sim/providers/pi-providers.test.ts b/apps/sim/providers/pi-providers.test.ts index c2bf73bbf80..3d12c9ceb42 100644 --- a/apps/sim/providers/pi-providers.test.ts +++ b/apps/sim/providers/pi-providers.test.ts @@ -32,11 +32,11 @@ describe('Pi provider catalog', () => { ) }) - it('keeps persisted and selectable Sim models in the pinned Pi catalog', () => { - expect(resolvePiModelId('anthropic', 'claude-opus-4-1')).toBe('claude-opus-4-1') - expect(resolvePiModelId('cerebras', 'cerebras/zai-glm-4.7')).toBe('zai-glm-4.7') - expect(resolvePiModelId('zai', 'glm-5.1')).toBe('glm-5.1') - expect(resolvePiModelId('zai', 'glm-4.5-air')).toBe('glm-4.5-air') + it('rejects saved model IDs removed by Pi 1.0 without substituting another model', () => { + expect(resolvePiModelId('anthropic', 'claude-opus-4-1')).toBeUndefined() + expect(resolvePiModelId('cerebras', 'cerebras/zai-glm-4.7')).toBeUndefined() + expect(resolvePiModelId('zai', 'glm-5.1')).toBeUndefined() + expect(resolvePiModelId('zai', 'glm-4.5-air')).toBeUndefined() }) it('rejects provider/model pairs absent from the installed Pi catalog', () => { diff --git a/apps/sim/scripts/build-pi-e2b-template.ts b/apps/sim/scripts/build-pi-e2b-template.ts index c31a14e0925..2f88a7ae287 100644 --- a/apps/sim/scripts/build-pi-e2b-template.ts +++ b/apps/sim/scripts/build-pi-e2b-template.ts @@ -29,7 +29,7 @@ import { const DEFAULT_TEMPLATE_NAME = 'sim-pi' -/** Pi 0.84 requires Node >=22.19; E2B's code-interpreter base currently ships Node 20. */ +/** Pi 1.0 requires Node >=22.19; E2B's code-interpreter base currently ships Node 20. */ const INSTALL_NODE_COMMAND = `curl -fsSL https://deb.nodesource.com/setup_${PI_NODE_MAJOR}.x | bash - && apt-get install -y nodejs && ${PI_NODE_VERSION_ASSERT}` /** Pi uses the command and filesystem APIs, so the inherited Jupyter service is unnecessary. */ diff --git a/apps/sim/scripts/pi-sandbox-packages.ts b/apps/sim/scripts/pi-sandbox-packages.ts index e74b2b464a9..1a99a4920c7 100644 --- a/apps/sim/scripts/pi-sandbox-packages.ts +++ b/apps/sim/scripts/pi-sandbox-packages.ts @@ -17,7 +17,7 @@ export const PI_BUN_VERSION = '1.4.2' /** Exact Pi version mirrored from the app dependencies and lockfile. */ -export const PI_PACKAGE_VERSION = '0.80.10' +export const PI_PACKAGE_VERSION = '1.0.0' /** Exact global package versions mirrored from package.json and bun.lock. */ export const PI_GLOBAL_NPM_PACKAGES = [ @@ -49,7 +49,7 @@ export const PI_APT = [ ] as const /** - * Pi 0.80 requires Node >= 22.19 — higher than the Node 20 both the E2B base and + * Pi 1.0 requires Node >= 22.19 — higher than the Node 20 both the E2B base and * the other two sandbox images carry, so this image installs its own. */ export const PI_NODE_MAJOR = 22 diff --git a/bun.lock b/bun.lock index d1862eaf6d0..26b986ecb4b 100644 --- a/bun.lock +++ b/bun.lock @@ -204,8 +204,8 @@ "@cerebras/cerebras_cloud_sdk": "^1.23.0", "@daytona/sdk": "0.207.0", "@e2b/code-interpreter": "2.7.1", - "@earendil-works/pi-ai": "0.80.10", - "@earendil-works/pi-coding-agent": "0.80.10", + "@earendil-works/pi-ai": "1.0.0", + "@earendil-works/pi-coding-agent": "1.0.0", "@floating-ui/dom": "1.7.6", "@google-cloud/storage": "7.21.0", "@google/genai": "2.13.0", @@ -922,12 +922,6 @@ "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], - "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.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" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], - - "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], - - "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], - "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], "@aws-sdk/checksums": ["@aws-sdk/checksums@3.1000.29", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Dtu0gr4dnATZAPwEYbpCsG+MpLM7OAliy2gTepEFQwl1vZ6DL3QMH2FveMa3HLvPsOdhJsPRB3KtxVhph9T75A=="], @@ -1038,8 +1032,6 @@ "@aws-sdk/util-dynamodb": ["@aws-sdk/util-dynamodb@3.996.9", "", { "dependencies": { "tslib": "^2.6.2" }, "peerDependencies": { "@aws-sdk/client-dynamodb": "^3.1111.0" } }, "sha512-16x2tRvl7OYpZ0W/DdFJieFriD13+RvuRBDbe5sj/tCEfK86HSGd7I2s5j0ivz8p6KWGkS+5wKRO9OliJkjUOQ=="], - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.8", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.40", "", { "dependencies": { "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA=="], "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.3.0", "", {}, "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ=="], @@ -1222,13 +1214,21 @@ "@e2b/code-interpreter": ["@e2b/code-interpreter@2.7.1", "", { "dependencies": { "e2b": "^2.39.0" } }, "sha512-1M4YhyWOWZzZyt1XessPbMwkVOsfpsWTiOgPKbA60CtDQasUQA8bRdN7HxsajYMrNxF5tk8J0fwrY7oa2oTK4g=="], - "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@0.80.10", "", { "dependencies": { "@earendil-works/pi-ai": "^0.80.10", "ignore": "7.0.5", "typebox": "1.1.38", "yaml": "2.9.0" } }, "sha512-nwnOR3SuLYGRFfyQm8ri4Nj5VGVAvAM9GuqQd3u7BUQj0d6hmD2F8w7OHAAjThE3CuySIdM+v8E22QJG6/RfCg=="], + "@earendil-works/chord": ["@earendil-works/chord@1.0.0", "", { "dependencies": { "esbuild": "0.28.2" } }, "sha512-BIfWfrByM0pKq6tfKYXuwx0ed2CvaqIM3EDA7Dps+fP+d3CiPWdlHi1cDsJC05llqKJoRz5//G0hz0yQwwjISQ=="], + + "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@1.0.0", "", { "dependencies": { "@earendil-works/pi-ai": "^1.0.0", "typebox": "1.3.27" } }, "sha512-bHFONjtEBDqiV+g1DmmtkSlfAaqHELr+XO+6I5Nah4gswwZrLJO4yZB/JjsnlI4AKWTayBLfgS6DCbeBBz9e2Q=="], - "@earendil-works/pi-ai": ["@earendil-works/pi-ai@0.80.10", "", { "dependencies": { "@anthropic-ai/sdk": "0.91.1", "@aws-sdk/client-bedrock-runtime": "3.1048.0", "@google/genai": "1.52.0", "@mistralai/mistralai": "2.2.6", "@opentelemetry/api": "1.9.0", "@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" } }, "sha512-Moe/H8c87yacDGK9dPbWphZNjVsrb3nTrIHycOQJAkFEnY9PYxOOd74+ny44kATfPU9Dm7aTHefar3pZF+UKUA=="], + "@earendil-works/pi-ai": ["@earendil-works/pi-ai@1.0.0", "", { "dependencies": { "@anthropic-ai/sdk": "0.124.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "^1.0.0", "@google/genai": "2.21.0", "@smithy/node-http-handler": "4.12.1", "http-proxy-agent": "9.1.0", "https-proxy-agent": "9.1.0", "openai": "7.19.0", "partial-json": "0.1.7", "typebox": "1.3.27" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-3/W1vdDaVtpeMd23ElvJC12HLA5yS/BGqqcXF+0SK082dN7cbgNcCwguTBRBC258Ke8SzSvUW1B75iAf8w8IxA=="], - "@earendil-works/pi-coding-agent": ["@earendil-works/pi-coding-agent@0.80.10", "", { "dependencies": { "@earendil-works/pi-agent-core": "^0.80.10", "@earendil-works/pi-ai": "^0.80.10", "@earendil-works/pi-tui": "^0.80.10", "@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", "semver": "7.8.0", "typebox": "1.1.38", "undici": "8.5.0", "yaml": "2.9.0" }, "optionalDependencies": { "@mariozechner/clipboard": "0.3.9" }, "bin": { "pi": "dist/cli.js" } }, "sha512-aL4apbupCHiVLSXASXvRzH4Q2vmtfrDa+0s909CJuVu/GgGylbDzr7oyF1mPmip5E+VxYYxKWmph4hV04wUcQg=="], + "@earendil-works/pi-codemode": ["@earendil-works/pi-codemode@1.0.0", "", { "dependencies": { "quickjs-wasi": "3.6.2" } }, "sha512-LPpFI4+T9NzDnhBDs15izWAolaoM8xnwqdziRd6Zx8BQeoEPvzefD2vMMzSyF0rOtq34TfQqkZ0ki16f6cGdMg=="], - "@earendil-works/pi-tui": ["@earendil-works/pi-tui@0.80.10", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.5" } }, "sha512-c2JO29PbhKPEQ6fgHQKAl0WhwuFqzWfzspMmP+8B5tpDuP+0mvarRbKKg8gq4b+pQx/QX+6aVS4ko7deoyjQjg=="], + "@earendil-works/pi-coding-agent": ["@earendil-works/pi-coding-agent@1.0.0", "", { "dependencies": { "@earendil-works/chord": "^1.0.0", "@earendil-works/pi-agent-core": "^1.0.0", "@earendil-works/pi-ai": "^1.0.0", "@earendil-works/pi-codemode": "^1.0.0", "@earendil-works/pi-mcp": "^1.0.0", "@earendil-works/pi-tui": "^1.0.0", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "6.0.0", "cross-spawn": "7.0.6", "diff": "8.0.4", "grok-mermaid": "0.2.3", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.8", "jiti": "2.7.0", "minimatch": "10.2.6", "proper-lockfile": "4.1.2", "quickjs-wasi": "3.6.2", "semver": "7.8.5", "typebox": "1.3.27", "undici": "8.10.2", "yaml": "2.9.0" }, "bin": { "pi": "dist/bundle/cli.js" } }, "sha512-/FtbxoSQU/mEv1QnichJjRjqteqaIaMWxmhB4G367+MwZfX7/DI5B9YAg5lqbN7nztFskBEtUSZ+FlmMBECtMw=="], + + "@earendil-works/pi-mcp": ["@earendil-works/pi-mcp@1.0.0", "", { "dependencies": { "cross-spawn": "7.0.6" } }, "sha512-rYra0aF5iPmJd+fsB+VBuqxWNABGJ3Iiyhg0CqIc/91ta2n7IvQmCp0Cac/YkUTNnvRsVZnjgAiBkRi6+ouWuw=="], + + "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@1.0.0", "", {}, "sha512-WjNBj5TYIiPZFQEz2WlULcDwPLaKwIlmsKjVeYM+LJSbnSp38kWsHUJysIDGnu23IcLbKoPtywsvYfUJCeZePA=="], + + "@earendil-works/pi-tui": ["@earendil-works/pi-tui@1.0.0", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.11" } }, "sha512-JsT7kXnpZA2YOtQu6RyriyxEO0eJIzPyfiH09bH+OLN5+s18HYkwaUD/tBkjhnSfMu6/50CQPRYJagzSP6HdPw=="], "@electric-sql/client": ["@electric-sql/client@1.0.14", "", { "dependencies": { "@microsoft/fetch-event-source": "^2.0.1" }, "optionalDependencies": { "@rollup/rollup-darwin-arm64": "^4.18.1" } }, "sha512-LtPAfeMxXRiYS0hyDQ5hue2PjljUiK9stvzsVyVb4nwxWQxfOWTSF42bHTs/o5i3x1T4kAQ7mwHpxa4A+f8X7Q=="], @@ -1496,28 +1496,6 @@ "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="], - "@mariozechner/clipboard": ["@mariozechner/clipboard@0.3.9", "", { "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" } }, "sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA=="], - - "@mariozechner/clipboard-darwin-arm64": ["@mariozechner/clipboard-darwin-arm64@0.3.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BfgV7vCEWZwJwZJw03r6bP5+tf0iI/ANuQYCxi9RNn7FrWB3yzGuMKCrNLRl6V761vXRdL8+OqZ0wd4TqlsNOQ=="], - - "@mariozechner/clipboard-darwin-universal": ["@mariozechner/clipboard-darwin-universal@0.3.9", "", { "os": "darwin" }, "sha512-BGGR4iA9Z2shAjI65eI5xtyb3LYNlDW9X3gxKxDbqtbnREohsrqznov6zpKoIrsRWpzlYVEdKphS7ksJ0/ndSQ=="], - - "@mariozechner/clipboard-darwin-x64": ["@mariozechner/clipboard-darwin-x64@0.3.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-4kURmCbS6nt8uYhtmWpUcJWyPHfmAr5dTpXD1nO3pIfa+TSQ9DbrGOYCKH+aEFW47XhQ4Vp8ZTszie+wfFvDKg=="], - - "@mariozechner/clipboard-linux-arm64-gnu": ["@mariozechner/clipboard-linux-arm64-gnu@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-g59OkUGP2DDfCOIKypHeYgv2M55u/cKvXa5dSxFbEJ34XvIQMdcVmpKCkGUro3ZgefXiGVdwguvTMQGpHWzIXw=="], - - "@mariozechner/clipboard-linux-arm64-musl": ["@mariozechner/clipboard-linux-arm64-musl@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-AGuJdgKsmJdm4Pych7kv3sqe591ERRaAHW3xjLooiFzn8J+PxUyof++7YZrB5Y5tpnTO+K18Og3taj2NpluCRQ=="], - - "@mariozechner/clipboard-linux-riscv64-gnu": ["@mariozechner/clipboard-linux-riscv64-gnu@0.3.9", "", { "os": "linux", "cpu": "none" }, "sha512-DXBEAiuMpk7dhS1a9NzNxVAFi1vaKoPu7rQNgY8LIDLGrK3lnIp3nT10DUum+PKVJoJppIP+NAA8IZe4DMNDPw=="], - - "@mariozechner/clipboard-linux-x64-gnu": ["@mariozechner/clipboard-linux-x64-gnu@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-WORrMLd6EpElEME7JRKfSaY34nW1P5LbdgK5YNCS1ncG2LqmITsSMEJ8nh2mpvxb3TxqbOOKgY7k9eMJYlW9Mw=="], - - "@mariozechner/clipboard-linux-x64-musl": ["@mariozechner/clipboard-linux-x64-musl@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-/DHn+1DrfL6oRaPPWXaOKvonFFrni666fxd+zFqiQEfvBH0tsHVWjq9iqBk0oDp0qaPA72lIMy5BptxISBEhZQ=="], - - "@mariozechner/clipboard-win32-arm64-msvc": ["@mariozechner/clipboard-win32-arm64-msvc@0.3.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-O5FHD3ErkMwMhNzAfu3ggy0ug4z7btZuoQgwwxlzPrwV2bxlD6WDpqBY4NCgICAgZdDKdp+loUEKVAVt8aYnhQ=="], - - "@mariozechner/clipboard-win32-x64-msvc": ["@mariozechner/clipboard-win32-x64-msvc@0.3.9", "", { "os": "win32", "cpu": "x64" }, "sha512-ihQC3EufqEY81vhXBgVBtK4prL+wc62zJsSvxrgz7K1hsdt6OObz6v9p3Rn1OG3GJksTTKMJF0u/guMISHPhSA=="], - "@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.4.2", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-xs1qOuyeMOz6t9BXXCXWiukC0/0+48vR08B7uwNdG05wCMnbcNgxiFmdFKDOFbM76qFYFRYlGeRfhfq1U/iZmA=="], "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], @@ -1528,8 +1506,6 @@ "@microsoft/fetch-event-source": ["@microsoft/fetch-event-source@2.0.1", "", {}, "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="], - "@mistralai/mistralai": ["@mistralai/mistralai@2.2.6", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.40.0", "ws": "^8.18.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], "@monaco-editor/loader": ["@monaco-editor/loader@1.7.0", "", { "dependencies": { "state-local": "^1.0.6" } }, "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA=="], @@ -2088,7 +2064,7 @@ "@smithy/node-http-handler": ["@smithy/node-http-handler@4.11.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-2jY1tSpERfPfWqyBV2pH+iGFaghVsIJszJNsT7hxtQYhVJpWDyc0LqOWI+nXOxOAHaEfZ4PXXtp1wW1TGpHhkA=="], - "@smithy/signature-v4": ["@smithy/signature-v4@5.5.0", "", { "dependencies": { "@smithy/core": "^3.25.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-vW6UdK7e7gV2wU/tXRsPq4pMQMusb8VymdVOyIFNA1FtyRmEClRFkYDtYI8UcO/HM0wK3qqjvvQs3HOlbgMbdg=="], + "@smithy/signature-v4": ["@smithy/signature-v4@5.7.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow=="], "@smithy/types": ["@smithy/types@4.17.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-FOKpVZob9MPTn2znRzGrnsMHv7BOsKVw3XiP/cOyYLDVZ9qKp4nifIiSCuUU/fIj5Vu0UOAxCFr+qRAtG0NUkA=="], @@ -3332,6 +3308,8 @@ "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + "grok-mermaid": ["grok-mermaid@0.2.3", "", {}, "sha512-/4KopAbsjvuRP9MdPtlDjOHUmUVEohOX73JNcsWpzAtFxh+bq5+Dhb6gzvRieLDwIPQIR3/vy8V1NNTuz4Zsmg=="], + "groq-sdk": ["groq-sdk@0.15.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-aYDEdr4qczx3cLCRRe+Beb37I7g/9bD5kHF+EEDxcrREWw1vKoRcfP3vHEkJB7Ud/8oOuF0scRwDpwWostTWuQ=="], "gtoken": ["gtoken@8.0.0", "", { "dependencies": { "gaxios": "^7.0.0", "jws": "^4.0.0" } }, "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw=="], @@ -3434,7 +3412,7 @@ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "ignore": ["ignore@7.0.8", "", {}, "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q=="], "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], @@ -4188,6 +4166,8 @@ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "proxy-agent-negotiate": ["proxy-agent-negotiate@1.1.0", "", { "peerDependencies": { "kerberos": "^2.0.0" }, "optionalPeers": ["kerberos"] }, "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ=="], + "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], @@ -4212,6 +4192,8 @@ "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + "quickjs-wasi": ["quickjs-wasi@3.6.2", "", {}, "sha512-FCqGtGOrMgzUiIrMNMA2YnsOxCNwo31dzqXvclXUC6xeT35NJLKXQJsvbeCTjvoFAwZgEAPg8U6+KAPDGXn8Mg=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], @@ -4882,18 +4864,6 @@ "@aws-crypto/crc32/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-crypto/sha256-browser/@aws-sdk/types": ["@aws-sdk/types@3.973.13", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@aws-crypto/sha256-browser/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "@aws-crypto/sha256-js/@aws-sdk/types": ["@aws-sdk/types@3.973.13", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg=="], - - "@aws-crypto/sha256-js/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "@aws-crypto/supports-web-crypto/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-crypto/util/@aws-sdk/types": ["@aws-sdk/types@3.973.13", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg=="], "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], @@ -4952,8 +4922,6 @@ "@aws-sdk/client-textract/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-sdk/core/@smithy/signature-v4": ["@smithy/signature-v4@5.7.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow=="], - "@aws-sdk/core/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@aws-sdk/credential-provider-cognito-identity/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -4992,24 +4960,18 @@ "@aws-sdk/middleware-eventstream/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-sdk/middleware-sdk-ec2/@smithy/signature-v4": ["@smithy/signature-v4@5.7.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow=="], - "@aws-sdk/middleware-sdk-ec2/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@aws-sdk/middleware-sdk-s3/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@aws-sdk/middleware-sdk-sqs/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-sdk/middleware-websocket/@smithy/signature-v4": ["@smithy/signature-v4@5.7.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow=="], - "@aws-sdk/middleware-websocket/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@aws-sdk/nested-clients/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@aws-sdk/s3-request-presigner/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-sdk/signature-v4-multi-region/@smithy/signature-v4": ["@smithy/signature-v4@5.7.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow=="], - "@aws-sdk/signature-v4-multi-region/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@aws-sdk/token-providers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -5018,8 +4980,6 @@ "@aws-sdk/util-dynamodb/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-sdk/util-locate-window/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@aws-sdk/xml-builder/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@azure-rest/core-client/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -5106,25 +5066,31 @@ "@daytona/sdk/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@earendil-works/pi-agent-core/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "@earendil-works/chord/esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="], + + "@earendil-works/pi-agent-core/typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="], - "@earendil-works/pi-ai/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.91.1", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw=="], + "@earendil-works/pi-ai/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.124.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1", "standardwebhooks": "^1.0.0" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-cN5O8i9UVxHeOQAzj/XjshWXG8KiibJDw9OGpH2Z/eR3n/RBxdoLxDJOcfqAJWvjaMDFfHTBADU04hWRJVkDyA=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1048.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" } }, "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1127.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/credential-provider-node": "^3.972.82", "@aws-sdk/eventstream-handler-node": "^3.972.34", "@aws-sdk/middleware-eventstream": "^3.972.29", "@aws-sdk/middleware-websocket": "^3.972.52", "@aws-sdk/token-providers": "3.1127.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-IDl/lrPb90aH+pZFHGNDmgH9nAUQj5PlZH1sJ3w7RikctyjHSnY3oNjZhrLoaBoQn/rNK0zsP6OHEqEhj2tdLA=="], - "@earendil-works/pi-ai/@google/genai": ["@google/genai@1.52.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q=="], + "@earendil-works/pi-ai/@google/genai": ["@google/genai@2.21.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-+PDtco2/Z0ONdzCGekCoCT+O1VJS9xJQNN4XzQpXG/t3El/SWWMkCWlFRO1KmivOHPa4Q0VjUYu1HBKCZ/v33Q=="], - "@earendil-works/pi-ai/@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + "@earendil-works/pi-ai/@smithy/node-http-handler": ["@smithy/node-http-handler@4.12.1", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw=="], - "@earendil-works/pi-ai/@smithy/node-http-handler": ["@smithy/node-http-handler@4.7.3", "", { "dependencies": { "@smithy/core": "^3.24.3", "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA=="], + "@earendil-works/pi-ai/http-proxy-agent": ["http-proxy-agent@9.1.0", "", { "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", "proxy-agent-negotiate": "1.1.0" } }, "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig=="], - "@earendil-works/pi-ai/openai": ["openai@6.26.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA=="], + "@earendil-works/pi-ai/https-proxy-agent": ["https-proxy-agent@9.1.0", "", { "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", "proxy-agent-negotiate": "1.1.0" } }, "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA=="], - "@earendil-works/pi-coding-agent/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + "@earendil-works/pi-ai/openai": ["openai@7.19.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", "@smithy/hash-node": ">=4.3.0 <5", "@smithy/signature-v4": ">=5.4.0 <6", "undici": ">=5 <9", "ws": "^8.21.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@aws-sdk/credential-provider-node", "@smithy/hash-node", "@smithy/signature-v4", "undici", "ws", "zod"] }, "sha512-MX2s3u2L5racTO0CC/SWpCOasJQBCJrqLKXK+l82cAhdeF8mPMBEe/gxMm0ZFa2xpKpOFLRjxv5afYEZbBXmbQ=="], - "@earendil-works/pi-coding-agent/semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="], + "@earendil-works/pi-ai/typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="], - "@earendil-works/pi-coding-agent/undici": ["undici@8.5.0", "", {}, "sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg=="], + "@earendil-works/pi-coding-agent/chalk": ["chalk@6.0.0", "", {}, "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg=="], + + "@earendil-works/pi-coding-agent/typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="], + + "@earendil-works/pi-coding-agent/undici": ["undici@8.10.2", "", {}, "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ=="], "@earendil-works/pi-coding-agent/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], @@ -5308,10 +5274,6 @@ "@smithy/node-http-handler/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@smithy/signature-v4/@smithy/core": ["@smithy/core@3.25.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-TTD6el7tvKyafkXBf7XO3jLOE+qVxOTrLjp/fEGiV3BMfUHK/LfdYlQO9YgZvzxC7kqA3H/IhJXNqQgnbgjb7A=="], - - "@smithy/signature-v4/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], - "@smithy/signature-v4/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@smithy/types/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -5858,10 +5820,6 @@ "@aws-crypto/crc32/@aws-sdk/types/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], - "@aws-crypto/sha256-browser/@aws-sdk/types/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], - - "@aws-crypto/sha256-js/@aws-sdk/types/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], - "@aws-crypto/util/@aws-sdk/types/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], "@better-auth/sso/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="], @@ -5876,36 +5834,74 @@ "@datadog/datadog-api-client/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/core": ["@aws-sdk/core@3.974.21", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@aws-sdk/xml-builder": "^3.972.30", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/core": "^3.24.6", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-P5JAHvn4dTi96UsAGS67LVOqqpUNNRhnfFXqzCYtdBIGZtqBue4CXvRr9YenOO7PALj/Pn8uuyw53FBCiCYw8w=="], + "@earendil-works/chord/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.56", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.47", "@aws-sdk/credential-provider-http": "^3.972.49", "@aws-sdk/credential-provider-ini": "^3.972.54", "@aws-sdk/credential-provider-process": "^3.972.47", "@aws-sdk/credential-provider-sso": "^3.972.53", "@aws-sdk/credential-provider-web-identity": "^3.972.53", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/credential-provider-imds": "^4.3.7", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-iI+4o0dvQQ4NHel4FMDiFy5q2gaU/ryLK3niOsoPccAt9WLFRkV4XTYPWRr9XvmBUqEzXG73S4p/8gm0Lu/W3A=="], + "@earendil-works/chord/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.2", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.22", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-tqPJv0dz4+O0hWGm1a6YekcMZyPhDFs/zH73Von7icaVT5n0Jqvm86typ3jRrG+qoUdPhALOnboRLTmnWQTlYQ=="], + "@earendil-works/chord/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.18", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-OHpk8YoZi3yexPq8aFt1vN1IxA2zLKvsIR5GpWYylX/ve6kQmY7wxHNSFy/D3t2apMZ16rs76Co4dJWcDyIk3A=="], + "@earendil-works/chord/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.2", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.29", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-Agv95NCgYyvuYUXt2PcFcOMrKCkhBFPhoH+nVMQh85RcXSCQrhAa4475plBOeomCihP26vKHT5KinVQT3iD14w=="], + "@earendil-works/chord/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1048.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" } }, "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA=="], + "@earendil-works/chord/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/types": ["@aws-sdk/types@3.973.13", "", { "dependencies": { "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pEHZqRkAlHfnfAU9tK+WpKv/gBNjGJrHMgA3A0iYRGyswBS2t0pfez+lWlwktb3Bqa0ovh7w/QJTFwp3fDxLNg=="], + "@earendil-works/chord/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@smithy/core": ["@smithy/core@3.25.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-TTD6el7tvKyafkXBf7XO3jLOE+qVxOTrLjp/fEGiV3BMfUHK/LfdYlQO9YgZvzxC7kqA3H/IhJXNqQgnbgjb7A=="], + "@earendil-works/chord/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.5.0", "", { "dependencies": { "@smithy/core": "^3.25.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-OG8kBYAgX7lf32+xLzgirvuLffn1KNoszaSiButt45i2cRa5irk8LQXLYQ5Smij1SBTN4KMNcBsRwRrLPfIGyA=="], + "@earendil-works/chord/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.2", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@smithy/node-http-handler": ["@smithy/node-http-handler@4.8.0", "", { "dependencies": { "@smithy/core": "^3.25.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-Mq7TNt/VhlEWiYRLQGpzUWeUxh899UGpjKh7Ru0WVIDIjnE+cTRAn0NYlFQ6bWfsQnKnpCbWJj86HzmcG0qEdg=="], + "@earendil-works/chord/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], + "@earendil-works/chord/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@earendil-works/chord/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="], + + "@earendil-works/chord/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="], + + "@earendil-works/chord/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="], + + "@earendil-works/chord/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="], + + "@earendil-works/chord/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="], + + "@earendil-works/chord/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="], + + "@earendil-works/chord/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="], + + "@earendil-works/chord/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.2", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="], - "@earendil-works/pi-ai/@smithy/node-http-handler/@smithy/core": ["@smithy/core@3.25.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-TTD6el7tvKyafkXBf7XO3jLOE+qVxOTrLjp/fEGiV3BMfUHK/LfdYlQO9YgZvzxC7kqA3H/IhJXNqQgnbgjb7A=="], + "@earendil-works/chord/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="], - "@earendil-works/pi-ai/@smithy/node-http-handler/@smithy/types": ["@smithy/types@4.15.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Z5TAOxygoFvybJV3igo5SloFflSokHx2hu1eFA+DxDTcn+FtKxUSui+rbTRG1pAafMA888Z3MVvCWUuvCrTXjg=="], + "@earendil-works/chord/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="], + + "@earendil-works/chord/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="], + + "@earendil-works/chord/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="], + + "@earendil-works/chord/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="], + + "@earendil-works/chord/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="], + + "@earendil-works/chord/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.84", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.72", "@aws-sdk/credential-provider-http": "^3.972.74", "@aws-sdk/credential-provider-ini": "^3.973.17", "@aws-sdk/credential-provider-process": "^3.972.72", "@aws-sdk/credential-provider-sso": "^3.973.16", "@aws-sdk/credential-provider-web-identity": "^3.972.78", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/credential-provider-imds": "^4.5.2", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-oHt854odINVwzwsh+c5x69j0ajm4DbqqqVJ+O1ECsCIZeMDAbzFpXItaqP7UZstJj/ATdTk/KFSH0LaNAgV+kA=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1127.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/nested-clients": "^3.997.44", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Dv2TMWBshJ+tF6ahs2Sy5bh4Iabsd4GAQqVvE9XZmYmnoaVbpS2QKIKE/HRacc7bTtbjEEvP+laGzHvHlf1CiQ=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@smithy/types": ["@smithy/types@4.19.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@earendil-works/pi-ai/@smithy/node-http-handler/@smithy/types": ["@smithy/types@4.19.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q=="], "@earendil-works/pi-ai/@smithy/node-http-handler/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@earendil-works/pi-ai/http-proxy-agent/agent-base": ["agent-base@9.0.0", "", {}, "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA=="], + + "@earendil-works/pi-ai/https-proxy-agent/agent-base": ["agent-base@9.0.0", "", {}, "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA=="], + "@electron/fuses/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -6454,25 +6450,21 @@ "@browserbasehq/stagehand/openai/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.30", "", { "dependencies": { "@smithy/types": "^4.14.3", "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" } }, "sha512-StElZPEoBquWwNqw1AcfpzEyZqJvFxouG+mpDNYlcH6ZOrqd2CuIryv+8LV8gNHZUOyKyJF3Dq9vxaXEmDR9TQ=="], - - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/core/@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], - - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.47", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-3YoPwJczcc+MtX2xxXaYaOOWO6xKUJr1ZIIDIFuninr51BYONVVcF/CP8K2xfVRC/PztJjqKWxNGFH7BWQAw1Q=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.72", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-xTKO/FWJPozTIXbozVnVGoNBhaGba8TBcx+KyUjRVeOlXE+dUc7GTR1cLvu0uTdIdmemzaFbqqCshXeZA1fZew=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.49", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-2UtGUPy+x3lqyceHrtC1uEuVxBZbDalPF6KAFqBwYgm4edWdBrZKNnCqzDs7KynWUvEC6mrR+ojRk+ZgQz9C2w=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.74", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/node-http-handler": "^4.12.1", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-u91E/hT8f4d1xy0Jl7VG4nVKJ3lxbrZkoBTeSVoJdWBiSEUMwMS/9+e0H/aJVQV//Lt5wuzP+E69v4aRSsNTmw=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.54", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/credential-provider-env": "^3.972.47", "@aws-sdk/credential-provider-http": "^3.972.49", "@aws-sdk/credential-provider-login": "^3.972.53", "@aws-sdk/credential-provider-process": "^3.972.47", "@aws-sdk/credential-provider-sso": "^3.972.53", "@aws-sdk/credential-provider-web-identity": "^3.972.53", "@aws-sdk/nested-clients": "^3.997.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/credential-provider-imds": "^4.3.7", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-Hx4gO4YRjFwitf3MVl3cDwYe1aryJthC4txVl9b+JAURovA50M2ywf9r8j1E/Q6SCTPT4qQpjOAbKYIC9CG+Vw=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.17", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/credential-provider-env": "^3.972.72", "@aws-sdk/credential-provider-http": "^3.972.74", "@aws-sdk/credential-provider-login": "^3.972.79", "@aws-sdk/credential-provider-process": "^3.972.72", "@aws-sdk/credential-provider-sso": "^3.973.16", "@aws-sdk/credential-provider-web-identity": "^3.972.78", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/credential-provider-imds": "^4.5.2", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ged4KXdBkvIC81bLvNHHuQKdKak/VXhQTR1NWYTTqW0474nlmsxy9O/vlgTIohDDWH3xpBdtVMZRyjb+DnocDA=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.47", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-tAizPm9IFo/PHn06c+LQJlzfY2AGOlyF0CUljFejrU6LcZBjnk8pmbZK3/xoIDdnIzjEdbClfvY3mXfr818ZEg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.72", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-rLIp2xbMjX/k9/od7APpqq1ZgXXnV0pOL1Th3ZsL8Wu0TRtBsDTVS8iPqcfRFcHakFxPvR04OSTv2ka2qOb/2A=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.53", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/nested-clients": "^3.997.21", "@aws-sdk/token-providers": "3.1069.0", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-pUXE3fu4tfEDV8BksIgf4dXvuIH10FhwHMl/wu8rBD5T1sMpryQWFVitH3kdPS90wlgrGYJQ/meQTSPacyZfeg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.16", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/token-providers": "3.1138.0", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-IGihaJfFZYacJJr/odqILCoK7W/mvrZ7cuK7ECn3sAu4vLC6u0V8bS7mCGbdugJ8Aum2tnvqmx0F2MRFp2rn9g=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.53", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/nested-clients": "^3.997.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-JmMGlhVvSj8uSG9CpeDkJAXT35H89tc6v84iMgEIE75q4yp1MKVVKvopv6Gg28HJIR7hMNkojRF8H2m5W44wyg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.78", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.4.0", "", { "dependencies": { "@smithy/core": "^3.25.0", "@smithy/types": "^4.15.0", "tslib": "^2.6.2" } }, "sha512-pPQmNdEvMJttv9z2kdYxoui83p/nr32zjMf0aMfmzmGmFEgKXUfy0vXiNg0fx4R5XLQzmJBLM9Wg0guEq2/q8A=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/types": ["@aws-sdk/types@3.974.6", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.21", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.21", "@aws-sdk/signature-v4-multi-region": "^3.996.35", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-eC7Vl7Qom/BGhZjG9GEqPwdQ/fk45hg1t5LP4EUxG5d1fdshLbaxCiwh/tszUzDX/4mW40mu2QsbeJJRPBbqUw=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@smithy/core": ["@smithy/core@3.35.0", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-zRMhfkByhT2snNdr1si24vJitU6Cr9ix2MikUfWmkAgp4jrNP0GcKSP5YvwQ+TlI8AZXER5QOGJn3JsVtSD9/A=="], "@google-cloud/storage/google-auth-library/gcp-metadata/google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], @@ -6620,19 +6612,29 @@ "rimraf/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.7.3", "", { "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" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env/@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http/@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.8.0", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.79", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.46", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/signature-v4-multi-region": "^3.996.47", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/node-http-handler": "^4.12.1", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.53", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/nested-clients": "^3.997.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-+71sluhkgPqdhbbD3UDwUpj24GCkng9HQx6z7qoBFb8dwkF4ktpOcVKDeHpgg8PvBgLYwAnUYLTEGRC/PniCiQ=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process/@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.21", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.21", "@aws-sdk/signature-v4-multi-region": "^3.996.35", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-eC7Vl7Qom/BGhZjG9GEqPwdQ/fk45hg1t5LP4EUxG5d1fdshLbaxCiwh/tszUzDX/4mW40mu2QsbeJJRPBbqUw=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.21", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.21", "@aws-sdk/signature-v4-multi-region": "^3.996.35", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-eC7Vl7Qom/BGhZjG9GEqPwdQ/fk45hg1t5LP4EUxG5d1fdshLbaxCiwh/tszUzDX/4mW40mu2QsbeJJRPBbqUw=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.46", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/signature-v4-multi-region": "^3.996.47", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/node-http-handler": "^4.12.1", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1069.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.21", "@aws-sdk/nested-clients": "^3.997.21", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-ks4X+kngC3PA5howV7Qu1TgG4bfC4jPykKdvw3nmBSXR9yZxRJouBholFSNQ5kY3L+Fgwyw+LCjzQmNi+KR91g=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1138.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.21", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.21", "@aws-sdk/signature-v4-multi-region": "^3.996.35", "@aws-sdk/types": "^3.973.13", "@smithy/core": "^3.24.6", "@smithy/fetch-http-handler": "^5.4.6", "@smithy/node-http-handler": "^4.7.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-eC7Vl7Qom/BGhZjG9GEqPwdQ/fk45hg1t5LP4EUxG5d1fdshLbaxCiwh/tszUzDX/4mW40mu2QsbeJJRPBbqUw=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/token-providers/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.35", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.46", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/signature-v4-multi-region": "^3.996.47", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/node-http-handler": "^4.12.1", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ=="], "@sim/emcn/@radix-ui/react-avatar/@radix-ui/react-primitive/@radix-ui/react-slot/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], @@ -6646,11 +6648,29 @@ "ora/log-symbols/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.35", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.47", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.8.0", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.47", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.8.0", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA=="], + + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/core/@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.35", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.47", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g=="], - "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients/@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.35", "", { "dependencies": { "@aws-sdk/types": "^3.973.13", "@smithy/signature-v4": "^5.4.6", "@smithy/types": "^4.14.3", "tslib": "^2.6.2" } }, "sha512-6L/VWs+Wch2stHemCGTmUNqKLMzURxQDK5boNG3Jn3kAOp71meDUuS5sbObpEvFxHDq0uWeSLFDNSYsjNt+Dlg=="], + "@earendil-works/pi-ai/@aws-sdk/client-bedrock-runtime/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.8.0", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA=="], "ora/log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], } From d553acd3fb108131fa43eb77c0e6ec5f5d0bbfd3 Mon Sep 17 00:00:00 2001 From: Bill Leoutsakos Date: Fri, 2 Oct 2026 13:55:27 -0700 Subject: [PATCH 2/2] chore(pi): narrow upgrade regression coverage --- .../handlers/pi/cloud/cli-runtime.test.ts | 8 +- .../handlers/pi/cloud/installed-cli.test.ts | 109 ------------ .../handlers/pi/cloud/review/backend.test.ts | 3 +- .../handlers/pi/core/__fixtures__/provider.ts | 119 ------------- .../handlers/pi/core/sdk-runtime.test.ts | 159 ------------------ .../handlers/pi/local/backend.test.ts | 3 +- 6 files changed, 4 insertions(+), 397 deletions(-) delete mode 100644 apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts delete mode 100644 apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts delete mode 100644 apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts diff --git a/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts b/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts index 8292b435c14..08fb344da10 100644 --- a/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts +++ b/apps/sim/executor/handlers/pi/cloud/cli-runtime.test.ts @@ -10,7 +10,7 @@ import { PI_PACKAGE_VERSION } from '@/scripts/pi-sandbox-packages' const exec = promisify(execFile) -async function invokeSandbox(version: string, exitCode = 0) { +async function invokeSandbox(version: string) { const root = await mkdtemp(join(tmpdir(), 'sim-pi-cli-')) const workspace = join(root, 'workspace') const repo = join(workspace, 'repo') @@ -28,7 +28,7 @@ if [ "$1" = "--version" ]; then fi printf "%s" "$PI_CODING_AGENT_DIR" > "${root}/invoked" printf "%s\\n" '{"type":"message_update","assistantMessageEvent":{"type":"text_delta","delta":"ok"}}' -exit ${exitCode} +exit 0 `, { mode: 0o700 } ) @@ -81,8 +81,4 @@ describe('sandbox Pi runtime boundary', () => { assistantMessageEvent: { type: 'text_delta', delta: 'ok' }, }) }) - - it('propagates a failing CLI even when the stdout filter succeeds', async () => { - expect((await invokeSandbox(PI_PACKAGE_VERSION, 42)).code).toBe(42) - }) }) diff --git a/apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts b/apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts deleted file mode 100644 index 4cb361f0f01..00000000000 --- a/apps/sim/executor/handlers/pi/cloud/installed-cli.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { execFile } from 'node:child_process' -import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' -import * as http from 'node:http' -import { tmpdir } from 'node:os' -import { dirname, join } from 'node:path' -import { fileURLToPath } from 'node:url' -import { promisify } from 'node:util' -import { describe, expect, it } from 'vitest' -import { PI_EVENT_FILTER_SOURCE } from '@/executor/handlers/pi/cloud/event-filter-source' -import { buildPiScript } from '@/executor/handlers/pi/cloud/shared' -import { - FIXTURE_KEY, - startPiProviderFixture, -} from '@/executor/handlers/pi/core/__fixtures__/provider' -import { applyPiEvent, createPiTotals, parseJsonLine } from '@/executor/handlers/pi/core/events' -import { PI_SEARCH_EXTENSION_SOURCE } from '@/executor/handlers/pi/search/extension-source' - -const exec = promisify(execFile) - -describe('installed Pi CLI wire', () => { - it('loads explicit Sim search with --no-extensions and keeps warming disabled', async () => { - const root = await mkdtemp(join(tmpdir(), 'sim-pi-installed-cli-')) - const workspace = join(root, 'workspace') - const fixture = await startPiProviderFixture(http) - try { - const repo = join(workspace, 'repo') - const bin = join(root, 'bin') - const providerPath = join(root, 'provider.ts') - const searchPath = join(workspace, 'sim-search-extension.ts') - const preload = join(root, 'preload.mjs') - await mkdir(join(repo, '.pi', 'extensions'), { recursive: true }) - await mkdir(bin) - await writeFile( - join(repo, '.pi', 'extensions', 'poison.ts'), - 'throw new Error("repository extension loaded")' - ) - await writeFile(join(workspace, 'pi-prompt.txt'), 'search-fixture') - await writeFile(join(workspace, 'sim-pi-event-filter.mjs'), PI_EVENT_FILTER_SOURCE) - await writeFile(searchPath, PI_SEARCH_EXTENSION_SOURCE) - await writeFile( - providerPath, - `export default function(pi) { pi.registerProvider("fixture", ${JSON.stringify({ ...fixture.provider, apiKey: FIXTURE_KEY })}) }` - ) - await writeFile( - preload, - `const guard = (originalFetch) => (input, init) => { - const url = new URL(typeof input === "string" ? input : input instanceof URL ? input.href : input.url); - if (url.origin === "https://api.exa.ai" && url.pathname === "/search") return originalFetch(${JSON.stringify(`${fixture.baseUrl}/exa`)}, init); - if (url.origin === ${JSON.stringify(fixture.baseUrl)}) return originalFetch(input, init); - throw new Error("Unexpected external fixture traffic: " + url.origin); -}; -let guardedFetch = guard(globalThis.fetch); -Object.defineProperty(globalThis, "fetch", { configurable: true, get: () => guardedFetch, set: (fetch) => { guardedFetch = guard(fetch); } });` - ) - const cli = join( - dirname(fileURLToPath(import.meta.resolve('@earendil-works/pi-coding-agent'))), - 'bundle', - 'cli.js' - ) - await writeFile(join(bin, 'pi'), `#!/bin/bash\nexec node "${cli}" "$@"\n`, { mode: 0o700 }) - const script = buildPiScript('/workspace/sim-search-extension.ts', { - disableRepositoryResources: true, - }) - .replaceAll('/workspace', workspace) - .replace(' < ', ` -e ${providerPath} < `) - const { stdout } = await exec('/bin/bash', ['-c', script], { - env: { - ...process.env, - PATH: `${bin}:${process.env.PATH}`, - NODE_OPTIONS: `--import ${preload}`, - PI_OFFLINE: '1', - PI_PROVIDER: 'fixture', - PI_MODEL: 'fixture-model', - PI_THINKING: 'medium', - SIM_SEARCH_PROVIDER: 'exa', - SIM_SEARCH_API_KEY: FIXTURE_KEY, - }, - timeout: 15_000, - }) - const totals = createPiTotals() - for (const line of stdout.split('\n')) { - const event = parseJsonLine(line) - if (event) applyPiEvent(totals, event) - } - expect(JSON.stringify(fixture.requests.at(-1)?.body.messages)).toContain( - 'Offline search evidence' - ) - expect(totals).toEqual({ - finalText: 'fixture complete', - inputTokens: 14, - outputTokens: 6, - toolCalls: [{ name: 'web_search', isError: false }], - }) - expect(fixture.requests.map(({ path }) => path)).toEqual([ - '/v1/chat/completions', - '/exa', - '/v1/chat/completions', - ]) - const agentDir = join(workspace, 'sim-pi-agent') - expect(JSON.parse(await readFile(join(agentDir, 'settings.json'), 'utf8'))).toEqual({ - cacheWarming: 'off', - }) - expect(JSON.parse(await readFile(join(agentDir, 'auth.json'), 'utf8'))).toEqual({}) - } finally { - await fixture.close() - await rm(root, { recursive: true, force: true }) - } - }, 30_000) -}) diff --git a/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts b/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts index 8c14bbc25eb..1a9c63757fe 100644 --- a/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts +++ b/apps/sim/executor/handlers/pi/cloud/review/backend.test.ts @@ -45,7 +45,7 @@ const mockAgentSession = { const sealedResourceLoader = { kind: 'sealed' } const mockSdk = { - SettingsManager: { inMemory: vi.fn(() => ({})) }, + SettingsManager: { inMemory: () => ({}) }, SessionManager: { inMemory: vi.fn(() => ({})) }, createAgentSession: mockCreateAgentSession, defineTool: vi.fn((tool) => tool), @@ -201,7 +201,6 @@ describe('runCloudReviewPi', () => { expect(mockSetRuntimeApiKey).toHaveBeenCalledWith('anthropic', 'sk-byok') expect(mockRemoveRuntimeApiKey).toHaveBeenCalledWith('anthropic') - expect(mockSdk.SettingsManager.inMemory).toHaveBeenCalledWith({ cacheWarming: 'off' }) expect(mockCreateSealedResourceLoader).toHaveBeenCalledTimes(1) expect(mockCreateAgentSession).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts b/apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts deleted file mode 100644 index a3ecd200fe0..00000000000 --- a/apps/sim/executor/handlers/pi/core/__fixtures__/provider.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { once } from 'node:events' -import type * as NodeHTTP from 'node:http' -import type { AddressInfo } from 'node:net' -import type { ProviderConfig } from '@earendil-works/pi-coding-agent' - -export const FIXTURE_KEY = 'pi-offline-fixture-key' - -export async function startPiProviderFixture(http: typeof NodeHTTP) { - const requests: Array<{ path: string; body: Record; authorization?: string }> = - [] - let onRequest: (() => void) | undefined - const requested = new Promise((resolve) => { - onRequest = resolve - }) - const server = http.createServer(async (request, response) => { - let raw = '' - for await (const chunk of request) raw += chunk - const body = JSON.parse(raw || '{}') as Record - requests.push({ path: request.url ?? '', body, authorization: request.headers.authorization }) - onRequest?.() - if (request.url === '/exa') { - response.setHeader('content-type', 'application/json') - response.end( - JSON.stringify({ - results: [ - { - title: 'Fixture result', - url: 'https://example.com/fixture', - text: 'Offline search evidence', - }, - ], - }) - ) - return - } - const messages = Array.isArray(body.messages) ? body.messages : [] - const prompt = JSON.stringify(messages) - if (prompt.includes('provider-error')) { - response.writeHead(400, { 'content-type': 'application/json' }) - response.end( - JSON.stringify({ - error: { message: `provider failed ${FIXTURE_KEY}`, type: 'invalid_request_error' }, - }) - ) - return - } - response.writeHead(200, { 'content-type': 'text/event-stream', 'cache-control': 'no-cache' }) - const chunk = (delta: Record, finish: string | null = null) => { - response.write( - `data: ${JSON.stringify({ id: 'fixture', object: 'chat.completion.chunk', model: 'fixture-model', choices: [{ index: 0, delta, finish_reason: finish }] })}\n\n` - ) - } - chunk({ role: 'assistant' }) - if (prompt.includes('cancel-fixture')) return - const hasToolResult = messages.some((message: { role?: string }) => message.role === 'tool') - if (!hasToolResult) { - chunk({ reasoning_content: 'checking fixture' }) - const search = prompt.includes('search-fixture') - chunk({ - tool_calls: [ - { - index: 0, - id: 'call-fixture', - type: 'function', - function: { - name: search ? 'web_search' : 'fixture_tool', - arguments: JSON.stringify( - search ? { query: 'fixture query' } : { value: 'fixture input' } - ), - }, - }, - ], - }) - chunk({}, 'tool_calls') - } else { - chunk({ content: 'fixture complete' }) - chunk({}, 'stop') - } - response.write( - `data: ${JSON.stringify({ id: 'fixture', choices: [], usage: { prompt_tokens: 7, completion_tokens: 3, total_tokens: 10 } })}\n\ndata: [DONE]\n\n` - ) - response.end() - }) - server.listen(0, '127.0.0.1') - await once(server, 'listening') - const baseUrl = `http://127.0.0.1:${(server.address() as AddressInfo).port}` - const provider: ProviderConfig = { - baseUrl: `${baseUrl}/v1`, - api: 'openai-completions', - models: [ - { - id: 'fixture-model', - name: 'Offline fixture', - reasoning: true, - input: ['text'], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 100_000, - maxTokens: 1000, - compat: { - supportsDeveloperRole: false, - supportsStore: false, - supportsReasoningEffort: false, - }, - }, - ], - } - return { - baseUrl, - provider, - requests, - requested, - async close() { - server.closeAllConnections() - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())) - ) - }, - } -} diff --git a/apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts b/apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts deleted file mode 100644 index 5f86c6e33e5..00000000000 --- a/apps/sim/executor/handlers/pi/core/sdk-runtime.test.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { mkdir, mkdtemp, readdir, rm, writeFile } from 'node:fs/promises' -import * as http from 'node:http' -import { tmpdir } from 'node:os' -import { join } from 'node:path' -import { Type } from 'typebox' -import { describe, expect, it } from 'vitest' -import { - FIXTURE_KEY, - startPiProviderFixture, -} from '@/executor/handlers/pi/core/__fixtures__/provider' -import { applyPiEvent, createPiTotals, normalizePiEvent } from '@/executor/handlers/pi/core/events' -import { - createPiModelRuntime, - createSealedPiResourceLoader, - loadPiSdk, - toPiTool, -} from '@/executor/handlers/pi/core/pi-sdk' -import { scrubPiEvent } from '@/executor/handlers/pi/core/redaction' - -async function createFixtureSession(toolError = false) { - const directory = await mkdtemp(join(tmpdir(), 'sim-pi-sdk-')) - const fixture = await startPiProviderFixture(http) - const sdk = await loadPiSdk() - const modelRuntime = await createPiModelRuntime(sdk) - modelRuntime.registerProvider('fixture', fixture.provider) - await modelRuntime.setRuntimeApiKey('fixture', FIXTURE_KEY) - await mkdir(join(directory, '.pi', 'extensions'), { recursive: true }) - await writeFile(join(directory, 'AGENTS.md'), 'poisoned repository instructions') - await writeFile( - join(directory, '.pi', 'extensions', 'poison.ts'), - 'throw new Error("poisoned extension")' - ) - await writeFile( - join(directory, 'auth.json'), - JSON.stringify({ fixture: { type: 'api_key', key: 'poisoned credential' } }) - ) - const model = modelRuntime.getModel('fixture', 'fixture-model') - if (!model) throw new Error('Fixture model missing') - const toolArguments: Array> = [] - const { session } = await sdk.createAgentSession({ - cwd: directory, - agentDir: directory, - modelRuntime, - model, - noTools: 'builtin', - customTools: [ - toPiTool( - sdk, - { - name: 'fixture_tool', - description: 'Offline fixture tool', - parameters: Type.Object({ value: Type.String() }), - execute: async (args) => { - toolArguments.push(args) - return { - text: toolError ? `tool failed ${FIXTURE_KEY}` : 'fixture output', - isError: toolError, - } - }, - }, - [FIXTURE_KEY] - ), - ], - resourceLoader: createSealedPiResourceLoader(sdk, 'sealed fixture prompt'), - settingsManager: sdk.SettingsManager.inMemory({ - cacheWarming: 'off', - retry: { enabled: false }, - }), - sessionManager: sdk.SessionManager.inMemory(directory), - }) - const totals = createPiTotals() - const events: unknown[] = [] - const unsubscribe = session.subscribe((raw) => { - events.push(raw) - const event = scrubPiEvent(normalizePiEvent(raw), [FIXTURE_KEY]) - if (event) applyPiEvent(totals, event) - }) - return { - session, - fixture, - totals, - events, - toolArguments, - directory, - async close() { - unsubscribe() - session.dispose() - await modelRuntime.removeRuntimeApiKey('fixture') - await fixture.close() - await rm(directory, { recursive: true, force: true }) - }, - } -} - -describe('installed Pi SDK wire', () => { - it.each([false, true])( - 'normalizes a real tool cycle (tool failure: %s) without discovering disk resources', - async (toolError) => { - const run = await createFixtureSession(toolError) - try { - await run.session.prompt('tool-cycle-fixture') - expect(run.toolArguments).toEqual([{ value: 'fixture input' }]) - expect(run.totals).toEqual({ - finalText: 'fixture complete', - inputTokens: 14, - outputTokens: 6, - toolCalls: [{ name: 'fixture_tool', isError: toolError }], - }) - expect(run.events.map(normalizePiEvent)).toContainEqual({ - type: 'thinking', - text: 'checking fixture', - }) - expect(run.fixture.requests).toHaveLength(2) - expect( - run.fixture.requests.every( - ({ authorization }) => authorization === `Bearer ${FIXTURE_KEY}` - ) - ).toBe(true) - const sent = JSON.stringify(run.fixture.requests) - expect(sent).toContain('sealed fixture prompt') - expect(sent).not.toContain('poisoned') - if (toolError) - expect(JSON.stringify(run.fixture.requests[1].body.messages)).not.toContain(FIXTURE_KEY) - expect(await readdir(run.directory)).not.toContain('settings.json') - expect(run.session.isStreaming).toBe(false) - } finally { - await run.close() - } - } - ) - - it('reports a real provider failure as a redacted terminal error', async () => { - const run = await createFixtureSession() - try { - await run.session.prompt('provider-error') - expect(run.totals.errorMessage).toContain('provider failed') - expect(run.totals.errorMessage).not.toContain(FIXTURE_KEY) - expect(run.fixture.requests).toHaveLength(1) - expect(run.session.isStreaming).toBe(false) - } finally { - await run.close() - } - }) - - it('cancels an open provider stream and finishes the session', async () => { - const run = await createFixtureSession() - try { - const prompted = run.session.prompt('cancel-fixture') - await run.fixture.requested - await run.session.abort() - await prompted - expect(run.session.isStreaming).toBe(false) - expect(run.totals.errorMessage).toMatch(/abort/i) - expect(run.fixture.requests).toHaveLength(1) - } finally { - await run.close() - } - }) -}) diff --git a/apps/sim/executor/handlers/pi/local/backend.test.ts b/apps/sim/executor/handlers/pi/local/backend.test.ts index 681be601c33..3dadd0c714d 100644 --- a/apps/sim/executor/handlers/pi/local/backend.test.ts +++ b/apps/sim/executor/handlers/pi/local/backend.test.ts @@ -39,7 +39,7 @@ const mockAgentSession = { } const mockSdk = { defineTool: vi.fn((tool) => tool), - SettingsManager: { inMemory: vi.fn(() => ({})) }, + SettingsManager: { inMemory: () => ({}) }, SessionManager: { inMemory: vi.fn(() => ({})) }, createAgentSession: mockCreateAgentSession, } @@ -143,7 +143,6 @@ describe('runLocalPi secret boundaries', () => { expect(toolResult.content).toEqual([{ type: 'text', text: 'read a file' }]) expect(mockSetRuntimeApiKey).toHaveBeenCalledWith('anthropic', 'a') expect(mockRemoveRuntimeApiKey).toHaveBeenCalledWith('anthropic') - expect(mockSdk.SettingsManager.inMemory).toHaveBeenCalledWith({ cacheWarming: 'off' }) }) it('scrubs SDK exceptions before they leave Local Dev', async () => {