From 2349868e8e723a26a9f296d5046520b5b9bc20d3 Mon Sep 17 00:00:00 2001 From: Jiang Bohan Date: Mon, 9 Feb 2026 16:56:25 +0800 Subject: [PATCH 1/5] feat(desktop): add model switching to provider dropdown Add model selector section below the provider grid in the dropdown. Shows available models for the current provider with active model indicator. Clicking a model calls setProvider with the modelId. Co-Authored-By: Claude Opus 4.6 --- apps/desktop/src/pages/home.tsx | 89 ++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/apps/desktop/src/pages/home.tsx b/apps/desktop/src/pages/home.tsx index 0fc8417c..462ca32a 100644 --- a/apps/desktop/src/pages/home.tsx +++ b/apps/desktop/src/pages/home.tsx @@ -1,9 +1,9 @@ -import { useState, useEffect, useRef } from 'react' -import { useNavigate } from 'react-router-dom' -import { Button } from '@multica/ui/components/ui/button' -import { HugeiconsIcon } from '@hugeicons/react' -import { - Comment01Icon, +import { useState, useEffect, useRef } from 'react' +import { useNavigate } from 'react-router-dom' +import { Button } from '@multica/ui/components/ui/button' +import { HugeiconsIcon } from '@hugeicons/react' +import { + Comment01Icon, LinkSquare01Icon, Loading03Icon, AlertCircleIcon, @@ -15,17 +15,17 @@ import { import { ConnectionQRCode } from '../components/qr-code' import { DeviceList } from '../components/device-list' import { AgentSettingsDialog } from '../components/agent-settings-dialog' -import { ApiKeyDialog } from '../components/api-key-dialog' -import { OAuthDialog } from '../components/oauth-dialog' -import { useHub } from '../hooks/use-hub' -import { useProvider } from '../hooks/use-provider' - -export default function HomePage() { - const navigate = useNavigate() - const { hubInfo, agents, loading, error } = useHub() - const { providers, current, setProvider, refresh, loading: providerLoading } = useProvider() - const [settingsOpen, setSettingsOpen] = useState(false) - const [agentName, setAgentName] = useState() +import { ApiKeyDialog } from '../components/api-key-dialog' +import { OAuthDialog } from '../components/oauth-dialog' +import { useHub } from '../hooks/use-hub' +import { useProvider } from '../hooks/use-provider' + +export default function HomePage() { + const navigate = useNavigate() + const { hubInfo, agents, loading, error } = useHub() + const { providers, current, setProvider, refresh, loading: providerLoading } = useProvider() + const [settingsOpen, setSettingsOpen] = useState(false) + const [agentName, setAgentName] = useState() const [providerDropdownOpen, setProviderDropdownOpen] = useState(false) const [switching, setSwitching] = useState(false) const [apiKeyDialogOpen, setApiKeyDialogOpen] = useState(false) @@ -186,8 +186,8 @@ export default function HomePage() {

{agentName || 'Unnamed Agent'}

- {/* Provider Selector */} -
+ {/* Provider Selector */} +

LLM Provider

@@ -213,7 +213,7 @@ export default function HomePage() { /> - {/* Provider Dropdown - Compact Grid */} + {/* Provider Dropdown - Compact Grid + Model List */} {providerDropdownOpen && (
@@ -268,12 +268,53 @@ export default function HomePage() { ))}
+ + {/* Model List for current provider */} + {(() => { + const currentProvider = providers.find(p => p.id === current?.provider) + if (!currentProvider || currentProvider.models.length <= 1) return null + return ( +
+

+ Models — {currentProvider.name} +

+
+ {currentProvider.models.map((model) => ( + + ))} +
+
+ ) + })()}
)} -
- - {/* Stats Grid */} -
+
+ + {/* Stats Grid */} +

Gateway From 28a14a4beb74d5739979b06556532f1ca31ed505 Mon Sep 17 00:00:00 2001 From: Jiang Bohan Date: Mon, 9 Feb 2026 17:05:27 +0800 Subject: [PATCH 2/5] chore(providers): update model registry with latest valid models Update model lists against pi-ai 0.50.3 getModel() validation: - Anthropic: add claude-opus-4-1, claude-sonnet-4-0 - OpenAI: add gpt-5.2, gpt-5-mini, gpt-4.1, gpt-4.1-mini - Google: update to gemini-2.5-pro/flash/2.0-flash - xAI: add grok-4 as default - Groq: remove invalid mixtral-8x7b-32768 - OpenRouter: update to claude-sonnet-4-5 Note: pi-ai upgrade to 0.52.9 (for claude-opus-4-6, o3 etc.) requires separate effort due to breaking type changes. Co-Authored-By: Claude Opus 4.6 --- src/agent/providers/registry.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/agent/providers/registry.ts b/src/agent/providers/registry.ts index 2ea1f93a..36ec7d57 100644 --- a/src/agent/providers/registry.ts +++ b/src/agent/providers/registry.ts @@ -51,7 +51,7 @@ const PROVIDER_REGISTRY: Record = { name: "Claude Code (OAuth)", authMethod: "oauth", defaultModel: "claude-opus-4-5", - models: ["claude-opus-4-5", "claude-sonnet-4-5", "claude-haiku-4-5"], + models: ["claude-opus-4-5", "claude-opus-4-1", "claude-sonnet-4-5", "claude-sonnet-4-0", "claude-haiku-4-5"], loginCommand: "claude login", }, "openai-codex": { @@ -59,7 +59,7 @@ const PROVIDER_REGISTRY: Record = { name: "Codex (OAuth)", authMethod: "oauth", defaultModel: "gpt-5.2", - models: ["gpt-5.2", "gpt-5.2-codex", "gpt-5.1-codex", "gpt-5.1-codex-mini", "gpt-5.1-codex-max"], + models: ["gpt-5.2", "gpt-5.2-codex", "gpt-5.1-codex", "gpt-5.1-codex-mini", "gpt-5.1-codex-max", "gpt-5-mini"], loginCommand: "codex login", }, "anthropic": { @@ -67,7 +67,7 @@ const PROVIDER_REGISTRY: Record = { name: "Anthropic (API Key)", authMethod: "api-key", defaultModel: "claude-sonnet-4-5", - models: ["claude-opus-4-5", "claude-sonnet-4-5", "claude-haiku-4-5"], + models: ["claude-opus-4-5", "claude-opus-4-1", "claude-sonnet-4-5", "claude-sonnet-4-0", "claude-haiku-4-5"], loginUrl: "https://console.anthropic.com/", }, "openai": { @@ -75,7 +75,7 @@ const PROVIDER_REGISTRY: Record = { name: "OpenAI", authMethod: "api-key", defaultModel: "gpt-4o", - models: ["gpt-4o", "gpt-4o-mini", "o1", "o1-mini"], + models: ["gpt-5.2", "gpt-5-mini", "gpt-4.1", "gpt-4.1-mini", "gpt-4o", "gpt-4o-mini"], loginUrl: "https://platform.openai.com/api-keys", }, "kimi-coding": { @@ -90,8 +90,8 @@ const PROVIDER_REGISTRY: Record = { id: "google", name: "Google AI", authMethod: "api-key", - defaultModel: "gemini-2.0-flash", - models: ["gemini-2.0-flash", "gemini-1.5-pro"], + defaultModel: "gemini-2.5-flash", + models: ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.0-flash"], loginUrl: "https://aistudio.google.com/apikey", }, "groq": { @@ -99,7 +99,7 @@ const PROVIDER_REGISTRY: Record = { name: "Groq", authMethod: "api-key", defaultModel: "llama-3.3-70b-versatile", - models: ["llama-3.3-70b-versatile", "mixtral-8x7b-32768"], + models: ["llama-3.3-70b-versatile"], loginUrl: "https://console.groq.com/keys", }, "mistral": { @@ -114,16 +114,16 @@ const PROVIDER_REGISTRY: Record = { id: "xai", name: "xAI (Grok)", authMethod: "api-key", - defaultModel: "grok-beta", - models: ["grok-beta", "grok-vision-beta"], + defaultModel: "grok-4", + models: ["grok-4", "grok-beta"], loginUrl: "https://console.x.ai/", }, "openrouter": { id: "openrouter", name: "OpenRouter", authMethod: "api-key", - defaultModel: "anthropic/claude-3.5-sonnet", - models: ["anthropic/claude-3.5-sonnet", "openai/gpt-4o"], + defaultModel: "anthropic/claude-sonnet-4-5", + models: ["anthropic/claude-sonnet-4-5", "anthropic/claude-opus-4-5", "openai/gpt-4o"], loginUrl: "https://openrouter.ai/keys", }, }; From 5380b146b36e5b5b385536983aba35183d5491cb Mon Sep 17 00:00:00 2001 From: Jiang Bohan Date: Mon, 9 Feb 2026 19:13:38 +0800 Subject: [PATCH 3/5] chore(deps): upgrade pi-ai and pi-agent-core to 0.52.9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upgrade @mariozechner/pi-ai and @mariozechner/pi-agent-core from 0.50.3 to 0.52.9 to support latest models (claude-opus-4-6, o3, o3-mini). Breaking type changes addressed: - exactOptionalPropertyTypes: use conditional spread or `| undefined` - TOOL_PROFILES removed: strip all profile references from CLI - AgentMessage union requires timestamp: cast test fixtures - AsyncAgent.id → sessionId - Add explicit callback parameter types for SDK event handlers Co-Authored-By: Claude Opus 4.6 --- package.json | 6 +- pnpm-lock.yaml | 1022 +++++++++++++++-- src/agent/cli/commands/chat.ts | 14 +- src/agent/cli/commands/credentials.ts | 4 +- src/agent/cli/commands/run.ts | 31 +- src/agent/cli/commands/session.ts | 4 +- src/agent/cli/commands/skills.ts | 2 +- src/agent/cli/commands/tools.ts | 51 +- src/agent/cli/non-interactive.ts | 5 +- src/agent/cli/tools.ts | 51 +- .../context-window/token-estimation.test.ts | 30 +- src/agent/providers/registry.ts | 8 +- src/agent/session/compaction.test.ts | 2 +- .../session/session-manager.display.test.ts | 20 +- src/agent/session/session-manager.ts | 4 +- .../session/session-transcript-repair.test.ts | 16 +- .../session/session-transcript-repair.ts | 6 +- src/agent/session/storage.test.ts | 20 +- src/agent/tools.ts | 12 +- src/agent/tools/exec-approval-types.ts | 2 +- src/agent/tools/sessions-list.ts | 8 +- src/console/app.controller.ts | 2 +- src/gateway/test-client.ts | 28 +- src/hub/block-chunker.ts | 8 +- src/hub/device-store.ts | 2 +- src/hub/exec-approval-manager.test.ts | 2 +- src/hub/hub.ts | 20 +- src/hub/message-aggregator.test.ts | 42 +- 28 files changed, 1095 insertions(+), 327 deletions(-) diff --git a/package.json b/package.json index 72b0a54f..a6da1ff5 100644 --- a/package.json +++ b/package.json @@ -48,9 +48,9 @@ "vitest": "^4.0.18" }, "dependencies": { - "@mariozechner/pi-agent-core": "^0.50.3", - "@mariozechner/pi-ai": "^0.50.3", - "@mariozechner/pi-coding-agent": "^0.50.3", + "@mariozechner/pi-agent-core": "^0.52.9", + "@mariozechner/pi-ai": "^0.52.9", + "@mariozechner/pi-coding-agent": "^0.52.9", "@mozilla/readability": "^0.6.0", "@multica/sdk": "workspace:*", "@nestjs/common": "^11.1.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b2a30d9..84a3a2d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,14 +33,14 @@ importers: .: dependencies: '@mariozechner/pi-agent-core': - specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + specifier: ^0.52.9 + version: 0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) '@mariozechner/pi-ai': - specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + specifier: ^0.52.9 + version: 0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) '@mariozechner/pi-coding-agent': - specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + specifier: ^0.52.9 + version: 0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) '@mozilla/readability': specifier: ^0.6.0 version: 0.6.0 @@ -463,10 +463,10 @@ importers: devDependencies: '@mariozechner/pi-agent-core': specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) '@mariozechner/pi-ai': specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) '@types/uuid': specifier: ^11.0.0 version: 11.0.0 @@ -605,6 +605,15 @@ packages: zod: optional: true + '@anthropic-ai/sdk@0.73.0': + resolution: {integrity: sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -626,74 +635,146 @@ packages: resolution: {integrity: sha512-N5zRvcpq/brl46Mnn3J1N4RFDeiOKU4hFNISFVawt3eT+WBPc74hbbd5b7aky+sreapkfeZ+MAXrQLdevZyMBw==} engines: {node: '>=20.0.0'} + '@aws-sdk/client-bedrock-runtime@3.985.0': + resolution: {integrity: sha512-jkQ+G+b/6Z6gUsn8jNSjJsFVgxnA4HtyOjrpHfmp8nHWLRFTOIw3HfY2vAlDgg/uUJ7cezVG0/tmbwujFqX25A==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-sso@3.975.0': resolution: {integrity: sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/client-sso@3.985.0': + resolution: {integrity: sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/core@3.973.4': resolution: {integrity: sha512-8Rk+kPP74YiR47x54bxYlKZswsaSh0a4XvvRUMLvyS/koNawhsGu/+qSZxREqUeTO+GkKpFvSQIsAZR+deUP+g==} engines: {node: '>=20.0.0'} + '@aws-sdk/core@3.973.7': + resolution: {integrity: sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.972.2': resolution: {integrity: sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-env@3.972.5': + resolution: {integrity: sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.4': resolution: {integrity: sha512-OC7F3ipXV12QfDEWybQGHLzoeHBlAdx/nLzPfHP0Wsabu3JBffu5nlzSaJNf7to9HGtOW8Bpu8NX0ugmDrCbtw==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.972.7': + resolution: {integrity: sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.2': resolution: {integrity: sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-ini@3.972.5': + resolution: {integrity: sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.2': resolution: {integrity: sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-login@3.972.5': + resolution: {integrity: sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.2': resolution: {integrity: sha512-Lz1J5IZdTjLYTVIcDP5DVDgi1xlgsF3p1cnvmbfKbjCRhQpftN2e2J4NFfRRvPD54W9+bZ8l5VipPXtTYK7aEg==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-node@3.972.6': + resolution: {integrity: sha512-DZ3CnAAtSVtVz+G+ogqecaErMLgzph4JH5nYbHoBMgBkwTUV+SUcjsjOJwdBJTHu3Dm6l5LBYekZoU2nDqQk2A==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.2': resolution: {integrity: sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-process@3.972.5': + resolution: {integrity: sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.2': resolution: {integrity: sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-sso@3.972.5': + resolution: {integrity: sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.2': resolution: {integrity: sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==} engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.5': + resolution: {integrity: sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/eventstream-handler-node@3.972.2': resolution: {integrity: sha512-bYYftGahAQv90qJci/MvE/baqlxqUJ3urY0WpEux0Nd2bl2mh0t2M7mtnHa6pxU95UW2BeKSL6/LV6zLo00o4Q==} engines: {node: '>=20.0.0'} + '@aws-sdk/eventstream-handler-node@3.972.5': + resolution: {integrity: sha512-xEmd3dnyn83K6t4AJxBJA63wpEoCD45ERFG0XMTViD2E/Ohls9TLxjOWPb1PAxR9/46cKy/TImez1GoqP6xVNQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-eventstream@3.972.2': resolution: {integrity: sha512-cUxOy8hXPgNkKw0G0avq4nxJ2kyROTmBKaO8B4G84HguV3orxMMdwq7bdKkv4xV8RZr/Bd8lJDoVtgRjSBq83Q==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-eventstream@3.972.3': + resolution: {integrity: sha512-pbvZ6Ye/Ks6BAZPa3RhsNjHrvxU9li25PMhSdDpbX0jzdpKpAkIR65gXSNKmA/REnSdEMWSD4vKUW+5eMFzB6w==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-host-header@3.972.2': resolution: {integrity: sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-logger@3.972.2': resolution: {integrity: sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-recursion-detection@3.972.2': resolution: {integrity: sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.972.4': resolution: {integrity: sha512-6sU8jrSJvY/lqSnU6IYsa8SrCKwOZ4Enl6O4xVJo8RCq9Bdr5Giuw2eUaJAk9GPcpr4OFcmSFv3JOLhpKGeRZA==} engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-user-agent@3.972.7': + resolution: {integrity: sha512-HUD+geASjXSCyL/DHPQc/Ua7JhldTcIglVAoCV8kiVm99IaFSlAbTvEnyhZwdE6bdFyTL+uIaWLaCFSRsglZBQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-websocket@3.972.2': resolution: {integrity: sha512-D4fFifl48BJ7fSGz33zJPrbKQ4DFD5mR73xTEs1JoxgsyskV/bR7h+QidE+Kyeps5GX7D1E4TKHimpoGSqAlRg==} engines: {node: '>= 14.0.0'} + '@aws-sdk/middleware-websocket@3.972.5': + resolution: {integrity: sha512-BN4A9K71WRIlpQ3+IYGdBC2wVyobZ95g6ZomodmJ8Te772GWo0iDk2Mv6JIHdr842tOTgi1b3npLIFDUS4hl4g==} + engines: {node: '>= 14.0.0'} + '@aws-sdk/nested-clients@3.975.0': resolution: {integrity: sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==} engines: {node: '>=20.0.0'} @@ -702,10 +783,18 @@ packages: resolution: {integrity: sha512-FyFiPp1SPt2JnspHlPO0LJyRwfYLBA27ToAoJAsbJIcd/Ytt9mFkRQ4kqUJQwnSl5JpdYzotNRqoRFCmx3uUfA==} engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.985.0': + resolution: {integrity: sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==} + engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.2': resolution: {integrity: sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==} engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.975.0': resolution: {integrity: sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==} engines: {node: '>=20.0.0'} @@ -714,6 +803,10 @@ packages: resolution: {integrity: sha512-WASLAiZAzGCIsr9Yqf0RW8Jpuwfw9RP6Dpuev1J+ewLKl5nr6JL5Y9PIfnRi7asG0QUxgu5smadfSuPDMEbJjA==} engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.985.0': + resolution: {integrity: sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/types@3.972.0': resolution: {integrity: sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==} engines: {node: '>=20.0.0'} @@ -726,10 +819,18 @@ packages: resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} engines: {node: '>=20.0.0'} + '@aws-sdk/util-endpoints@3.985.0': + resolution: {integrity: sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-format-url@3.972.2': resolution: {integrity: sha512-RCd8eur5wzDLgFBvbBhoFQ1bw1wxHJiN88MQ82IiJBs6OGXTWaf0oFgLbK06qJvnVUqL13t3jEnlYPHPNdgBWw==} engines: {node: '>=20.0.0'} + '@aws-sdk/util-format-url@3.972.3': + resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-locate-window@3.965.4': resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} engines: {node: '>=20.0.0'} @@ -737,6 +838,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.2': resolution: {integrity: sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==} + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} + '@aws-sdk/util-user-agent-node@3.972.2': resolution: {integrity: sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==} engines: {node: '>=20.0.0'} @@ -746,10 +850,23 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.972.5': + resolution: {integrity: sha512-GsUDF+rXyxDZkkJxUsDxnA67FG+kc5W1dnloCFLl6fWzceevsCYzJpASBzT+BPjwUgREE6FngfJYYYMQUY5fZQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/xml-builder@3.972.2': resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} engines: {node: '>=20.0.0'} + '@aws-sdk/xml-builder@3.972.4': + resolution: {integrity: sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==} + engines: {node: '>=20.0.0'} + '@aws/lambda-invoke-store@0.2.3': resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} engines: {node: '>=18.0.0'} @@ -1835,6 +1952,15 @@ packages: '@modelcontextprotocol/sdk': optional: true + '@google/genai@1.40.0': + resolution: {integrity: sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.25.2 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + '@grammyjs/types@3.23.0': resolution: {integrity: sha512-D3jQ4UWERPsyR3op/YFudMMIPNTU47vy7L51uO9/73tMELmjO/+LX5N36/Y0CG5IQfIsz43MxiHI5rgsK0/k+g==} @@ -2080,6 +2206,10 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2155,65 +2285,72 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} - '@mariozechner/clipboard-darwin-arm64@0.3.0': - resolution: {integrity: sha512-7i4bitLzRSij0fj6q6tPmmf+JrwHqfBsBmf8mOcLVv0LVexD+4gEsyMait4i92exKYmCfna6uHKVS84G4nqehg==} + '@mariozechner/clipboard-darwin-arm64@0.3.2': + resolution: {integrity: sha512-uBf6K7Je1ihsgvmWxA8UCGCeI+nbRVRXoarZdLjl6slz94Zs1tNKFZqx7aCI5O1i3e0B6ja82zZ06BWrl0MCVw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@mariozechner/clipboard-darwin-universal@0.3.0': - resolution: {integrity: sha512-FVZLGdIkmvqtPQjD0GQwKLVheL+zV7DjA6I5NcsHGjBeWpG2nACS6COuelNf8ruMoPxJFw7RoB4fjw6mmjT+Nw==} + '@mariozechner/clipboard-darwin-universal@0.3.2': + resolution: {integrity: sha512-mxSheKTW2U9LsBdXy0SdmdCAE5HqNS9QUmpNHLnfJ+SsbFKALjEZc5oRrVMXxGQSirDvYf5bjmRyT0QYYonnlg==} engines: {node: '>= 10'} os: [darwin] - '@mariozechner/clipboard-darwin-x64@0.3.0': - resolution: {integrity: sha512-KuurQYEqRhalvBji3CH5xIq1Ts23IgVRE3rjanhqFDI77luOhCnlNbDtqv3No5OxJhEBLykQNrAzfgjqPsPWdA==} + '@mariozechner/clipboard-darwin-x64@0.3.2': + resolution: {integrity: sha512-U1BcVEoidvwIp95+HJswSW+xr28EQiHR7rZjH6pn8Sja5yO4Yoe3yCN0Zm8Lo72BbSOK/fTSq0je7CJpaPCspg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@mariozechner/clipboard-linux-arm64-gnu@0.3.0': - resolution: {integrity: sha512-nWpGMlk43bch7ztGfnALcSi5ZREVziPYzrFKjoJimbwaiULrfY0fGce0gWBynP9ak0nHgDLp0nSa7b4cCl+cIw==} + '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': + resolution: {integrity: sha512-BsinwG3yWTIjdgNCxsFlip7LkfwPk+ruw/aFCXHUg/fb5XC/Ksp+YMQ7u0LUtiKzIv/7LMXgZInJQH6gxbAaqQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@mariozechner/clipboard-linux-riscv64-gnu@0.3.0': - resolution: {integrity: sha512-4BC08CIaOXSSAGRZLEjqJmQfioED8ohAzwt0k2amZPEbH96YKoBNorq5EdwPf5VT+odS0DeyCwhwtxokRLZIvQ==} + '@mariozechner/clipboard-linux-arm64-musl@0.3.2': + resolution: {integrity: sha512-0/Gi5Xq2V6goXBop19ePoHvXsmJD9SzFlO3S+d6+T2b+BlPcpOu3Oa0wTjl+cZrLAAEzA86aPNBI+VVAFDFPKw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': + resolution: {integrity: sha512-2AFFiXB24qf0zOZsxI1GJGb9wQGlOJyN6UwoXqmKS3dpQi/l6ix30IzDDA4c4ZcCcx4D+9HLYXhC1w7Sov8pXA==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] - '@mariozechner/clipboard-linux-x64-gnu@0.3.0': - resolution: {integrity: sha512-GpNY5Y9nOzr0Vt0Qi5U88qwe6piiIHk44kSMexl8ns90LluN5UTNYmyfi7Xq3/lmPZCpnB2xvBTYbsXCxnopIA==} + '@mariozechner/clipboard-linux-x64-gnu@0.3.2': + resolution: {integrity: sha512-v6fVnsn7WMGg73Dab8QMwyFce7tzGfgEixKgzLP8f1GJqkJZi5zO4k4FOHzSgUufgLil63gnxvMpjWkgfeQN7A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@mariozechner/clipboard-linux-x64-musl@0.3.0': - resolution: {integrity: sha512-+PnR48/x9GMY5Kh8BLjzHMx6trOegMtxAuqTM9X/bhV3QuW6sLLd7nojDHSGj/ZueK6i0tcQxvOrgNLozVtNDA==} + '@mariozechner/clipboard-linux-x64-musl@0.3.2': + resolution: {integrity: sha512-xVUtnoMQ8v2JVyfJLKKXACA6avdnchdbBkTsZs8BgJQo29qwCp5NIHAUO8gbJ40iaEGToW5RlmVk2M9V0HsHEw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@mariozechner/clipboard-win32-arm64-msvc@0.3.0': - resolution: {integrity: sha512-+dy2vZ1Ph4EYj0cotB+bVUVk/uKl2bh9LOp/zlnFqoCCYDN6sm+L0VyIOPPo3hjoEVdGpHe1MUxp3qG/OLwXgg==} + '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': + resolution: {integrity: sha512-AEgg95TNi8TGgak2wSXZkXKCvAUTjWoU1Pqb0ON7JHrX78p616XUFNTJohtIon3e0w6k0pYPZeCuqRCza/Tqeg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@mariozechner/clipboard-win32-x64-msvc@0.3.0': - resolution: {integrity: sha512-dfpHrUpKHl7ad3xVGE1+gIN3cEnjjPZa4I0BIYMuj2OKq07Gf1FKTXMypB41rDFv6XNzcfhYQnY+ZNgIu9FB8A==} + '@mariozechner/clipboard-win32-x64-msvc@0.3.2': + resolution: {integrity: sha512-tGRuYpZwDOD7HBrCpyRuhGnHHSCknELvqwKKUG4JSfSB7JIU7LKRh6zx6fMUOQd8uISK35TjFg5UcNih+vJhFA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@mariozechner/clipboard@0.3.0': - resolution: {integrity: sha512-tQrCRAtr58BLmWcvwCqlJo5GJgqBGb3zwOBFFBKCEKvRgD8y/EawhCyXsfOh9XOOde1NTAYsYuYyVOYw2tLnoQ==} + '@mariozechner/clipboard@0.3.2': + resolution: {integrity: sha512-IHQpksNjo7EAtGuHFU+tbWDp5LarH3HU/8WiB9O70ZEoBPHOg0/6afwSLK0QyNMMmx4Bpi/zl6+DcBXe95nWYA==} engines: {node: '>= 10'} '@mariozechner/jiti@2.6.5': @@ -2224,13 +2361,27 @@ packages: resolution: {integrity: sha512-OogyXMlnWse/r6Bvlou4SDY178LDzcVkG6KrqzPh5d89cyOoirnwFn7H3slSn/+0FIZEzHYfO6RaBPRwjtg5qg==} engines: {node: '>=20.0.0'} + '@mariozechner/pi-agent-core@0.52.9': + resolution: {integrity: sha512-x6OxWN5QnZGfK5TU822Xgcy5QeN3ZGIBaZiZISRI64BZYj5ENc40j4T+fbeRnAsrEkJoMC1Him8ixw68PRTovQ==} + engines: {node: '>=20.0.0'} + '@mariozechner/pi-ai@0.50.3': resolution: {integrity: sha512-IfA/rn+RuBHxZ1PMlH+pqMr3D7X/r6ArSS9TWprNQ/BEypH1aNXvr5u44/Nzs1X3hKyhWiLCcwbx7Hvl3s5qWg==} engines: {node: '>=20.0.0'} hasBin: true - '@mariozechner/pi-coding-agent@0.50.3': - resolution: {integrity: sha512-Bu4Qwdu2NbU6GFqI2TCQyr7u91TMA8g9ynSqzr5EvJSI1qxdDz8VWnN3uh+noKI9NtAX/YG8vmsSHuvLVXr3Tw==} + '@mariozechner/pi-ai@0.50.9': + resolution: {integrity: sha512-a6sLIHLH+wo5zTFoo/0AE/P6GPyJzaXnE86z89t6tINzeSdKMApZZ+B4Cy4U3GpsYfxuZ9gBJlcKbfj+oKP3wg==} + engines: {node: '>=20.0.0'} + hasBin: true + + '@mariozechner/pi-ai@0.52.9': + resolution: {integrity: sha512-sCdIVw7iomWcaEnVUFwq9e69Dat0ZCy/+XGkTtroY8H+GxHmDKUCrJV/yMpu8Jq9Oof11yCo7F/Vco7dvYCLZg==} + engines: {node: '>=20.0.0'} + hasBin: true + + '@mariozechner/pi-coding-agent@0.52.9': + resolution: {integrity: sha512-XZ0z2k8awEzKVj83Vwj64aO1rTaHe7xk3GppHVdjkvaDDXRWwUtTdm9benH3kuYQ9Po+vuGc9plcApTV9LXpZw==} engines: {node: '>=20.0.0'} hasBin: true @@ -2238,6 +2389,10 @@ packages: resolution: {integrity: sha512-kfigzWQtCKXTXlwdA7aMwhS6w8MqdLFUSOi3DoPOFaVQrphlMW0NF97zDq+kQgaQVEI6l0GF9HW/kyMoDh4OhA==} engines: {node: '>=20.0.0'} + '@mariozechner/pi-tui@0.52.9': + resolution: {integrity: sha512-YHVZLRz9ULVlubRi51P1AQj7oOb+caiTv/HsNa7r587ale8kLNBx2Sa99fRWuFhNPu+SniwVi4pgqvkrWAcd/w==} + engines: {node: '>=20.0.0'} + '@mistralai/mistralai@1.10.0': resolution: {integrity: sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg==} @@ -2444,6 +2599,36 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} @@ -3011,6 +3196,10 @@ packages: resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} engines: {node: '>=18.0.0'} + '@smithy/core@3.22.1': + resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.8': resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} engines: {node: '>=18.0.0'} @@ -3063,10 +3252,18 @@ packages: resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.4.13': + resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.4.29': resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.4.30': + resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.9': resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} engines: {node: '>=18.0.0'} @@ -3083,6 +3280,10 @@ packages: resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.4.9': + resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.8': resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} engines: {node: '>=18.0.0'} @@ -3115,6 +3316,10 @@ packages: resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.11.2': + resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.12.0': resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} engines: {node: '>=18.0.0'} @@ -3151,10 +3356,18 @@ packages: resolution: {integrity: sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.29': + resolution: {integrity: sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.31': resolution: {integrity: sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.32': + resolution: {integrity: sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.2.8': resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} engines: {node: '>=18.0.0'} @@ -3175,6 +3388,10 @@ packages: resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.11': + resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.0': resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} @@ -4263,6 +4480,9 @@ packages: bowser@2.13.1: resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + bplist-creator@0.1.0: resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} @@ -5491,6 +5711,10 @@ packages: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} + hasBin: true + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -5742,16 +5966,14 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@11.1.0: - resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} - engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - glob@13.0.0: resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} + glob@13.0.1: + resolution: {integrity: sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -5915,6 +6137,10 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -6286,10 +6512,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} @@ -6675,6 +6897,9 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -7019,6 +7244,10 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.1.2: + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7696,6 +7925,10 @@ packages: prosemirror-view@1.41.5: resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -9313,6 +9546,18 @@ packages: utf-8-validate: optional: true + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} @@ -9456,6 +9701,12 @@ snapshots: optionalDependencies: zod: 4.3.6 + '@anthropic-ai/sdk@0.73.0(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -9540,6 +9791,58 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-bedrock-runtime@3.985.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/credential-provider-node': 3.972.6 + '@aws-sdk/eventstream-handler-node': 3.972.5 + '@aws-sdk/middleware-eventstream': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/middleware-websocket': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/token-providers': 3.985.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.985.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.5 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.1 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.11 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-sso@3.975.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -9583,6 +9886,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sso@3.985.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.985.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.5 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/core@3.973.4': dependencies: '@aws-sdk/types': 3.973.1 @@ -9599,6 +9945,22 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 + '@aws-sdk/core@3.973.7': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.4 + '@smithy/core': 3.22.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.972.2': dependencies: '@aws-sdk/core': 3.973.4 @@ -9607,6 +9969,14 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.972.4': dependencies: '@aws-sdk/core': 3.973.4 @@ -9620,6 +9990,19 @@ snapshots: '@smithy/util-stream': 4.5.10 tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.972.7': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.9 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.11 + tslib: 2.8.1 + '@aws-sdk/credential-provider-ini@3.972.2': dependencies: '@aws-sdk/core': 3.973.4 @@ -9639,6 +10022,25 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/credential-provider-env': 3.972.5 + '@aws-sdk/credential-provider-http': 3.972.7 + '@aws-sdk/credential-provider-login': 3.972.5 + '@aws-sdk/credential-provider-process': 3.972.5 + '@aws-sdk/credential-provider-sso': 3.972.5 + '@aws-sdk/credential-provider-web-identity': 3.972.5 + '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-login@3.972.2': dependencies: '@aws-sdk/core': 3.973.4 @@ -9652,6 +10054,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-login@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.972.2': dependencies: '@aws-sdk/credential-provider-env': 3.972.2 @@ -9669,6 +10084,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.972.6': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.5 + '@aws-sdk/credential-provider-http': 3.972.7 + '@aws-sdk/credential-provider-ini': 3.972.5 + '@aws-sdk/credential-provider-process': 3.972.5 + '@aws-sdk/credential-provider-sso': 3.972.5 + '@aws-sdk/credential-provider-web-identity': 3.972.5 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-process@3.972.2': dependencies: '@aws-sdk/core': 3.973.4 @@ -9678,6 +10110,15 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-process@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-sso@3.972.2': dependencies: '@aws-sdk/client-sso': 3.975.0 @@ -9691,6 +10132,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-sso@3.972.5': + dependencies: + '@aws-sdk/client-sso': 3.985.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/token-providers': 3.985.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-web-identity@3.972.2': dependencies: '@aws-sdk/core': 3.973.4 @@ -9703,6 +10157,18 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/eventstream-handler-node@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9710,6 +10176,13 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/eventstream-handler-node@3.972.5': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/middleware-eventstream@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9717,6 +10190,13 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/middleware-eventstream@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9724,12 +10204,25 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9738,6 +10231,14 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.972.4': dependencies: '@aws-sdk/core': 3.973.4 @@ -9748,6 +10249,16 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.972.7': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.985.0 + '@smithy/core': 3.22.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/middleware-websocket@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9761,6 +10272,21 @@ snapshots: '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 + '@aws-sdk/middleware-websocket@3.972.5': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-format-url': 3.972.3 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/nested-clients@3.975.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -9847,6 +10373,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.985.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.985.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.5 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/region-config-resolver@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9855,6 +10424,14 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/region-config-resolver@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/token-providers@3.975.0': dependencies: '@aws-sdk/core': 3.973.4 @@ -9879,6 +10456,18 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.985.0': + dependencies: + '@aws-sdk/core': 3.973.7 + '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.972.0': dependencies: '@smithy/types': 4.12.0 @@ -9897,6 +10486,14 @@ snapshots: '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.985.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + '@aws-sdk/util-format-url@3.972.2': dependencies: '@aws-sdk/types': 3.973.1 @@ -9904,6 +10501,13 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/util-format-url@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/util-locate-window@3.965.4': dependencies: tslib: 2.8.1 @@ -9915,6 +10519,13 @@ snapshots: bowser: 2.13.1 tslib: 2.8.1 + '@aws-sdk/util-user-agent-browser@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + bowser: 2.14.1 + tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.972.2': dependencies: '@aws-sdk/middleware-user-agent': 3.972.4 @@ -9923,12 +10534,26 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.972.5': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@aws-sdk/xml-builder@3.972.2': dependencies: '@smithy/types': 4.12.0 fast-xml-parser: 5.2.5 tslib: 2.8.1 + '@aws-sdk/xml-builder@3.972.4': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.3.4 + tslib: 2.8.1 + '@aws/lambda-invoke-store@0.2.3': {} '@babel/code-frame@7.10.4': @@ -11238,6 +11863,18 @@ snapshots: - supports-color - utf-8-validate + '@google/genai@1.40.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))': + dependencies: + google-auth-library: 10.5.0 + protobufjs: 7.5.4 + ws: 8.19.0 + optionalDependencies: + '@modelcontextprotocol/sdk': 1.25.3(hono@4.11.7)(zod@4.3.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@grammyjs/types@3.23.0': {} '@hono/node-server@1.19.9(hono@4.11.7)': @@ -11408,6 +12045,10 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11525,53 +12166,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@mariozechner/clipboard-darwin-arm64@0.3.0': + '@mariozechner/clipboard-darwin-arm64@0.3.2': optional: true - '@mariozechner/clipboard-darwin-universal@0.3.0': + '@mariozechner/clipboard-darwin-universal@0.3.2': optional: true - '@mariozechner/clipboard-darwin-x64@0.3.0': + '@mariozechner/clipboard-darwin-x64@0.3.2': optional: true - '@mariozechner/clipboard-linux-arm64-gnu@0.3.0': + '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': optional: true - '@mariozechner/clipboard-linux-riscv64-gnu@0.3.0': + '@mariozechner/clipboard-linux-arm64-musl@0.3.2': optional: true - '@mariozechner/clipboard-linux-x64-gnu@0.3.0': + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': optional: true - '@mariozechner/clipboard-linux-x64-musl@0.3.0': + '@mariozechner/clipboard-linux-x64-gnu@0.3.2': optional: true - '@mariozechner/clipboard-win32-arm64-msvc@0.3.0': + '@mariozechner/clipboard-linux-x64-musl@0.3.2': optional: true - '@mariozechner/clipboard-win32-x64-msvc@0.3.0': + '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': optional: true - '@mariozechner/clipboard@0.3.0': + '@mariozechner/clipboard-win32-x64-msvc@0.3.2': + optional: true + + '@mariozechner/clipboard@0.3.2': optionalDependencies: - '@mariozechner/clipboard-darwin-arm64': 0.3.0 - '@mariozechner/clipboard-darwin-universal': 0.3.0 - '@mariozechner/clipboard-darwin-x64': 0.3.0 - '@mariozechner/clipboard-linux-arm64-gnu': 0.3.0 - '@mariozechner/clipboard-linux-riscv64-gnu': 0.3.0 - '@mariozechner/clipboard-linux-x64-gnu': 0.3.0 - '@mariozechner/clipboard-linux-x64-musl': 0.3.0 - '@mariozechner/clipboard-win32-arm64-msvc': 0.3.0 - '@mariozechner/clipboard-win32-x64-msvc': 0.3.0 + '@mariozechner/clipboard-darwin-arm64': 0.3.2 + '@mariozechner/clipboard-darwin-universal': 0.3.2 + '@mariozechner/clipboard-darwin-x64': 0.3.2 + '@mariozechner/clipboard-linux-arm64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-arm64-musl': 0.3.2 + '@mariozechner/clipboard-linux-riscv64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-x64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-x64-musl': 0.3.2 + '@mariozechner/clipboard-win32-arm64-msvc': 0.3.2 + '@mariozechner/clipboard-win32-x64-msvc': 0.3.2 + optional: true '@mariozechner/jiti@2.6.5': dependencies: std-env: 3.10.0 yoctocolors: 2.1.2 - '@mariozechner/pi-agent-core@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6)': + '@mariozechner/pi-agent-core@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6)': dependencies: - '@mariozechner/pi-ai': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + '@mariozechner/pi-ai': 0.50.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) '@mariozechner/pi-tui': 0.50.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -11582,7 +12228,19 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6)': + '@mariozechner/pi-agent-core@0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6)': + dependencies: + '@mariozechner/pi-ai': 0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-ai@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6)': dependencies: '@anthropic-ai/sdk': 0.71.2(zod@4.3.6) '@aws-sdk/client-bedrock-runtime': 3.978.0 @@ -11592,7 +12250,7 @@ snapshots: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) chalk: 5.6.2 - openai: 6.10.0(ws@8.18.3)(zod@4.3.6) + openai: 6.10.0(ws@8.19.0)(zod@4.3.6) partial-json: 0.1.7 proxy-agent: 6.5.0 undici: 7.19.2 @@ -11606,23 +12264,74 @@ snapshots: - ws - zod - '@mariozechner/pi-coding-agent@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6)': + '@mariozechner/pi-ai@0.50.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.71.2(zod@4.3.6) + '@aws-sdk/client-bedrock-runtime': 3.978.0 + '@google/genai': 1.34.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6)) + '@mistralai/mistralai': 1.10.0 + '@sinclair/typebox': 0.34.48 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + chalk: 5.6.2 + openai: 6.10.0(ws@8.19.0)(zod@4.3.6) + partial-json: 0.1.7 + proxy-agent: 6.5.0 + undici: 7.19.2 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-ai@0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) + '@aws-sdk/client-bedrock-runtime': 3.985.0 + '@google/genai': 1.40.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6)) + '@mistralai/mistralai': 1.10.0 + '@sinclair/typebox': 0.34.48 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + chalk: 5.6.2 + openai: 6.10.0(ws@8.19.0)(zod@4.3.6) + partial-json: 0.1.7 + proxy-agent: 6.5.0 + undici: 7.19.2 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-coding-agent@0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6)': dependencies: - '@mariozechner/clipboard': 0.3.0 '@mariozechner/jiti': 2.6.5 - '@mariozechner/pi-agent-core': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) - '@mariozechner/pi-ai': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) - '@mariozechner/pi-tui': 0.50.3 + '@mariozechner/pi-agent-core': 0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) + '@mariozechner/pi-ai': 0.52.9(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.19.0)(zod@4.3.6) + '@mariozechner/pi-tui': 0.52.9 '@silvia-odwyer/photon-node': 0.3.4 chalk: 5.6.2 cli-highlight: 2.1.11 diff: 8.0.3 file-type: 21.3.0 - glob: 11.1.0 + glob: 13.0.1 + hosted-git-info: 9.0.2 + ignore: 7.0.5 marked: 15.0.12 - minimatch: 10.1.1 + minimatch: 10.1.2 proper-lockfile: 4.1.2 yaml: 2.8.2 + optionalDependencies: + '@mariozechner/clipboard': 0.3.2 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - aws-crt @@ -11640,6 +12349,14 @@ snapshots: marked: 15.0.12 mime-types: 3.0.2 + '@mariozechner/pi-tui@0.52.9': + dependencies: + '@types/mime-types': 2.1.4 + chalk: 5.6.2 + get-east-asian-width: 1.4.0 + marked: 15.0.12 + mime-types: 3.0.2 + '@mistralai/mistralai@1.10.0': dependencies: zod: 3.25.76 @@ -11851,6 +12568,29 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@radix-ui/primitive@1.1.3': {} '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': @@ -12416,6 +13156,19 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 + '@smithy/core@3.22.1': + dependencies: + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.11 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.8': dependencies: '@smithy/node-config-provider': 4.3.8 @@ -12499,6 +13252,17 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.4.13': + dependencies: + '@smithy/core': 3.22.1 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + '@smithy/middleware-retry@4.4.29': dependencies: '@smithy/node-config-provider': 4.3.8 @@ -12511,6 +13275,18 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 + '@smithy/middleware-retry@4.4.30': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + '@smithy/middleware-serde@4.2.9': dependencies: '@smithy/protocol-http': 5.3.8 @@ -12537,6 +13313,14 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@smithy/node-http-handler@4.4.9': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@smithy/property-provider@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -12588,6 +13372,16 @@ snapshots: '@smithy/util-stream': 4.5.10 tslib: 2.8.1 + '@smithy/smithy-client@4.11.2': + dependencies: + '@smithy/core': 3.22.1 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.11 + tslib: 2.8.1 + '@smithy/types@4.12.0': dependencies: tslib: 2.8.1 @@ -12633,6 +13427,13 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.3.29': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.2.31': dependencies: '@smithy/config-resolver': 4.4.6 @@ -12643,6 +13444,16 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.2.32': + dependencies: + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@smithy/util-endpoints@3.2.8': dependencies: '@smithy/node-config-provider': 4.3.8 @@ -12675,6 +13486,17 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 + '@smithy/util-stream@4.5.11': + dependencies: + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.9 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 @@ -13931,6 +14753,8 @@ snapshots: bowser@2.13.1: {} + bowser@2.14.1: {} + bplist-creator@0.1.0: dependencies: stream-buffers: 2.2.0 @@ -14959,7 +15783,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: @@ -14990,7 +15814,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15518,6 +16342,10 @@ snapshots: dependencies: strnum: 2.1.2 + fast-xml-parser@5.3.4: + dependencies: + strnum: 2.1.2 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -15813,21 +16641,18 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.1.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.1.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 - glob@13.0.0: dependencies: minimatch: 10.1.1 minipass: 7.1.2 path-scurry: 2.0.1 + glob@13.0.1: + dependencies: + minimatch: 10.1.2 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -16075,6 +16900,10 @@ snapshots: dependencies: lru-cache: 10.4.3 + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.5 + html-escaper@2.0.2: {} html-escaper@3.0.3: {} @@ -16429,10 +17258,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - jake@10.9.4: dependencies: async: 3.2.6 @@ -16781,6 +17606,8 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + long@5.3.2: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -17421,6 +18248,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.1.2: + dependencies: + '@isaacs/brace-expansion': 5.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -17727,9 +18558,9 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@6.10.0(ws@8.18.3)(zod@4.3.6): + openai@6.10.0(ws@8.19.0)(zod@4.3.6): optionalDependencies: - ws: 8.18.3 + ws: 8.19.0 zod: 4.3.6 optionator@0.9.4: @@ -18169,6 +19000,21 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-transform: 1.11.0 + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 25.0.10 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -20055,6 +20901,8 @@ snapshots: ws@8.18.3: {} + ws@8.19.0: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.0 diff --git a/src/agent/cli/commands/chat.ts b/src/agent/cli/commands/chat.ts index e083175c..0f26b528 100644 --- a/src/agent/cli/commands/chat.ts +++ b/src/agent/cli/commands/chat.ts @@ -21,13 +21,13 @@ import { } from "../../providers/index.js"; type ChatOptions = { - profile?: string; - provider?: string; - model?: string; - system?: string; - thinking?: string; - cwd?: string; - session?: string; + profile?: string | undefined; + provider?: string | undefined; + model?: string | undefined; + system?: string | undefined; + thinking?: string | undefined; + cwd?: string | undefined; + session?: string | undefined; help?: boolean; }; diff --git a/src/agent/cli/commands/credentials.ts b/src/agent/cli/commands/credentials.ts index 62a2b69f..71122a06 100644 --- a/src/agent/cli/commands/credentials.ts +++ b/src/agent/cli/commands/credentials.ts @@ -19,8 +19,8 @@ interface CredentialsOptions { force: boolean; coreOnly: boolean; skillsOnly: boolean; - pathOverride?: string; - skillsPathOverride?: string; + pathOverride?: string | undefined; + skillsPathOverride?: string | undefined; } function printHelp() { diff --git a/src/agent/cli/commands/run.ts b/src/agent/cli/commands/run.ts index df7127ab..2595de56 100644 --- a/src/agent/cli/commands/run.ts +++ b/src/agent/cli/commands/run.ts @@ -12,18 +12,17 @@ import type { ToolsConfig } from "../../tools/policy.js"; import { cyan, yellow, dim } from "../colors.js"; type RunOptions = { - profile?: string; - provider?: string; - model?: string; - apiKey?: string; - baseUrl?: string; - system?: string; - thinking?: string; - reasoning?: string; - cwd?: string; - session?: string; + profile?: string | undefined; + provider?: string | undefined; + model?: string | undefined; + apiKey?: string | undefined; + baseUrl?: string | undefined; + system?: string | undefined; + thinking?: string | undefined; + reasoning?: string | undefined; + cwd?: string | undefined; + session?: string | undefined; debug?: boolean; - toolsProfile?: string; toolsAllow?: string[]; toolsDeny?: string[]; help?: boolean; @@ -49,7 +48,6 @@ ${cyan("Options:")} ${yellow("--help")}, -h Show this help ${cyan("Tools Configuration:")} - ${yellow("--tools-profile")} P Tool profile (minimal, coding, web, full) ${yellow("--tools-allow")} T Allow specific tools (comma-separated) ${yellow("--tools-deny")} T Deny specific tools (comma-separated) @@ -125,10 +123,6 @@ function parseArgs(argv: string[]): { opts: RunOptions; prompt: string } { opts.debug = true; continue; } - if (arg === "--tools-profile") { - opts.toolsProfile = args.shift(); - continue; - } if (arg === "--tools-allow") { const value = args.shift(); opts.toolsAllow = value?.split(",").map((s) => s.trim()) ?? []; @@ -178,11 +172,8 @@ export async function runCommand(args: string[]): Promise { // Build tools config if any tools options are set let toolsConfig: ToolsConfig | undefined; - if (opts.toolsProfile || opts.toolsAllow || opts.toolsDeny) { + if (opts.toolsAllow || opts.toolsDeny) { toolsConfig = {}; - if (opts.toolsProfile) { - toolsConfig.profile = opts.toolsProfile as ToolsConfig["profile"]; - } if (opts.toolsAllow) { toolsConfig.allow = opts.toolsAllow; } diff --git a/src/agent/cli/commands/session.ts b/src/agent/cli/commands/session.ts index 149143c7..6f56dc66 100644 --- a/src/agent/cli/commands/session.ts +++ b/src/agent/cli/commands/session.ts @@ -147,7 +147,7 @@ function cmdShow(sessionId: string | undefined, showInternal = false) { process.exit(1); } - const session = matches[0]; + const session = matches[0]!; const content = readFileSync(session.path, "utf8"); const lines = content.trim().split("\n").filter(Boolean); @@ -235,7 +235,7 @@ function cmdDelete(sessionId: string | undefined) { process.exit(1); } - const session = matches[0]; + const session = matches[0]!; try { unlinkSync(session.path); diff --git a/src/agent/cli/commands/skills.ts b/src/agent/cli/commands/skills.ts index 34cea252..837fae67 100644 --- a/src/agent/cli/commands/skills.ts +++ b/src/agent/cli/commands/skills.ts @@ -29,7 +29,7 @@ interface ParsedArgs { args: string[]; verbose: boolean; force: boolean; - profile?: string; + profile?: string | undefined; } function printHelp() { diff --git a/src/agent/cli/commands/tools.ts b/src/agent/cli/commands/tools.ts index 2b8c998d..f5485d06 100644 --- a/src/agent/cli/commands/tools.ts +++ b/src/agent/cli/commands/tools.ts @@ -4,22 +4,20 @@ * Usage: * multica tools list [options] List available tools * multica tools groups Show all tool groups - * multica tools profiles Show all tool profiles */ import { createAllTools } from "../../tools.js"; import { filterTools, type ToolsConfig } from "../../tools/policy.js"; -import { TOOL_GROUPS, TOOL_PROFILES, expandToolGroups } from "../../tools/groups.js"; +import { TOOL_GROUPS, expandToolGroups } from "../../tools/groups.js"; import { cyan, yellow, green, dim } from "../colors.js"; -type Command = "list" | "groups" | "profiles" | "help"; +type Command = "list" | "groups" | "help"; interface ToolsOptions { command: Command; - profile?: string; allow?: string[]; deny?: string[]; - provider?: string; + provider?: string | undefined; isSubagent?: boolean; } @@ -30,11 +28,9 @@ ${cyan("Usage:")} multica tools [options] ${cyan("Commands:")} ${yellow("list")} List available tools (with optional filtering) ${yellow("groups")} Show all tool groups - ${yellow("profiles")} Show all tool profiles ${yellow("help")} Show this help ${cyan("Options for 'list':")} - ${yellow("--profile")} PROFILE Apply profile filter (minimal, coding, web, full) ${yellow("--allow")} TOOLS Allow specific tools (comma-separated) ${yellow("--deny")} TOOLS Deny specific tools (comma-separated) ${yellow("--provider")} NAME Apply provider-specific rules @@ -44,11 +40,8 @@ ${cyan("Examples:")} ${dim("# List all tools")} multica tools list - ${dim("# List tools with profile")} - multica tools list --profile coding - ${dim("# List tools with allow/deny")} - multica tools list --profile coding --deny exec + multica tools list --deny exec multica tools list --allow group:fs,web_fetch ${dim("# Show tool groups")} @@ -58,12 +51,13 @@ ${cyan("Examples:")} function parseArgs(argv: string[]): ToolsOptions { const args = [...argv]; - const command = (args.shift() || "help") as Command; + const raw = args.shift() || "help"; - if (command === "--help" || command === "-h") { + if (raw === "--help" || raw === "-h") { return { command: "help" }; } + const command = raw as Command; const opts: ToolsOptions = { command }; while (args.length > 0) { @@ -73,10 +67,6 @@ function parseArgs(argv: string[]): ToolsOptions { if (arg === "--help" || arg === "-h") { return { command: "help" }; } - if (arg === "--profile") { - opts.profile = args.shift(); - continue; - } if (arg === "--allow") { const value = args.shift(); opts.allow = value?.split(",").map((s) => s.trim()) ?? []; @@ -108,11 +98,8 @@ function cmdList(opts: ToolsOptions) { // Build config let config: ToolsConfig | undefined; - if (opts.profile || opts.allow || opts.deny) { + if (opts.allow || opts.deny) { config = {}; - if (opts.profile) { - config.profile = opts.profile as ToolsConfig["profile"]; - } if (opts.allow) { config.allow = opts.allow; } @@ -136,7 +123,6 @@ function cmdList(opts: ToolsOptions) { if (config || opts.provider || opts.isSubagent) { console.log("Applied filters:"); - if (opts.profile) console.log(` ${dim("Profile:")} ${yellow(opts.profile)}`); if (opts.allow) console.log(` ${dim("Allow:")} ${opts.allow.join(", ")}`); if (opts.deny) console.log(` ${dim("Deny:")} ${opts.deny.join(", ")}`); if (opts.provider) console.log(` ${dim("Provider:")} ${opts.provider}`); @@ -171,24 +157,6 @@ function cmdGroups() { } } -function cmdProfiles() { - console.log(`\n${cyan("Tool Profiles:")}\n`); - for (const [name, policy] of Object.entries(TOOL_PROFILES)) { - console.log(` ${yellow(name)}:`); - if (policy.allow) { - const expanded = expandToolGroups(policy.allow); - console.log(` ${dim("Allow:")} ${policy.allow.join(", ")}`); - console.log(` ${dim("Expands to:")} ${expanded.join(", ")}`); - } else { - console.log(` ${dim("Allow:")} (all tools)`); - } - if (policy.deny) { - console.log(` ${dim("Deny:")} ${policy.deny.join(", ")}`); - } - console.log(""); - } -} - export async function toolsCommand(args: string[]): Promise { const opts = parseArgs(args); @@ -199,9 +167,6 @@ export async function toolsCommand(args: string[]): Promise { case "groups": cmdGroups(); break; - case "profiles": - cmdProfiles(); - break; case "help": default: printHelp(); diff --git a/src/agent/cli/non-interactive.ts b/src/agent/cli/non-interactive.ts index 2cff5c4f..7284bf20 100644 --- a/src/agent/cli/non-interactive.ts +++ b/src/agent/cli/non-interactive.ts @@ -156,11 +156,8 @@ async function main() { // Build tools config if any tools options are set let toolsConfig: import("../tools/policy.js").ToolsConfig | undefined; - if (opts.toolsProfile || opts.toolsAllow || opts.toolsDeny) { + if (opts.toolsAllow || opts.toolsDeny) { toolsConfig = {}; - if (opts.toolsProfile) { - toolsConfig.profile = opts.toolsProfile as any; - } if (opts.toolsAllow) { toolsConfig.allow = opts.toolsAllow; } diff --git a/src/agent/cli/tools.ts b/src/agent/cli/tools.ts index d0301a5e..727f5c59 100644 --- a/src/agent/cli/tools.ts +++ b/src/agent/cli/tools.ts @@ -4,24 +4,22 @@ * * Usage: * pnpm tools:cli list # List all available tools - * pnpm tools:cli list --profile coding # List tools after applying profile + * pnpm tools:cli list --allow group:fs # List tools after allowing fs group * pnpm tools:cli list --deny exec # List tools after denying exec * pnpm tools:cli groups # Show all tool groups - * pnpm tools:cli profiles # Show all profiles */ import { createAllTools } from "../tools.js"; import { filterTools, type ToolsConfig } from "../tools/policy.js"; -import { TOOL_GROUPS, TOOL_PROFILES, expandToolGroups } from "../tools/groups.js"; +import { TOOL_GROUPS, expandToolGroups } from "../tools/groups.js"; -type Command = "list" | "groups" | "profiles" | "help"; +type Command = "list" | "groups" | "help"; interface CliOptions { command: Command; - profile?: string; allow?: string[]; deny?: string[]; - provider?: string; + provider?: string | undefined; isSubagent?: boolean; } @@ -31,11 +29,9 @@ function printUsage() { console.log("Commands:"); console.log(" list List available tools (with optional filtering)"); console.log(" groups Show all tool groups"); - console.log(" profiles Show all profiles"); console.log(" help Show this help"); console.log(""); console.log("Options for 'list':"); - console.log(" --profile PROFILE Apply profile filter (minimal, coding, web, full)"); console.log(" --allow TOOLS Allow specific tools (comma-separated)"); console.log(" --deny TOOLS Deny specific tools (comma-separated)"); console.log(" --provider NAME Apply provider-specific rules"); @@ -43,8 +39,7 @@ function printUsage() { console.log(""); console.log("Examples:"); console.log(" pnpm tools:cli list"); - console.log(" pnpm tools:cli list --profile coding"); - console.log(" pnpm tools:cli list --profile coding --deny exec"); + console.log(" pnpm tools:cli list --deny exec"); console.log(" pnpm tools:cli list --allow group:fs,web_fetch"); console.log(" pnpm tools:cli groups"); } @@ -59,11 +54,6 @@ function parseArgs(argv: string[]): CliOptions { const arg = args.shift(); if (!arg) break; - if (arg === "--profile") { - const value = args.shift(); - if (value) opts.profile = value; - continue; - } if (arg === "--allow") { const value = args.shift(); opts.allow = value?.split(",").map((s) => s.trim()) ?? []; @@ -75,8 +65,7 @@ function parseArgs(argv: string[]): CliOptions { continue; } if (arg === "--provider") { - const value = args.shift(); - if (value) opts.provider = value; + opts.provider = args.shift(); continue; } if (arg === "--subagent") { @@ -96,11 +85,8 @@ function listTools(opts: CliOptions) { // Build config let config: ToolsConfig | undefined; - if (opts.profile || opts.allow || opts.deny) { + if (opts.allow || opts.deny) { config = {}; - if (opts.profile) { - config.profile = opts.profile as any; - } if (opts.allow) { config.allow = opts.allow; } @@ -124,7 +110,6 @@ function listTools(opts: CliOptions) { if (config || opts.provider || opts.isSubagent) { console.log("Applied filters:"); - if (opts.profile) console.log(` Profile: ${opts.profile}`); if (opts.allow) console.log(` Allow: ${opts.allow.join(", ")}`); if (opts.deny) console.log(` Deny: ${opts.deny.join(", ")}`); if (opts.provider) console.log(` Provider: ${opts.provider}`); @@ -160,25 +145,6 @@ function showGroups() { } } -function showProfiles() { - console.log("Tool Profiles:"); - console.log(""); - for (const [name, policy] of Object.entries(TOOL_PROFILES)) { - console.log(` ${name}:`); - if (policy.allow) { - const expanded = expandToolGroups(policy.allow); - console.log(` Allow: ${policy.allow.join(", ")}`); - console.log(` Expands to: ${expanded.join(", ")}`); - } else { - console.log(` Allow: (all tools)`); - } - if (policy.deny) { - console.log(` Deny: ${policy.deny.join(", ")}`); - } - console.log(""); - } -} - async function main() { const opts = parseArgs(process.argv.slice(2)); @@ -189,9 +155,6 @@ async function main() { case "groups": showGroups(); break; - case "profiles": - showProfiles(); - break; case "help": default: printUsage(); diff --git a/src/agent/context-window/token-estimation.test.ts b/src/agent/context-window/token-estimation.test.ts index aa6bb652..cef9c54c 100644 --- a/src/agent/context-window/token-estimation.test.ts +++ b/src/agent/context-window/token-estimation.test.ts @@ -82,10 +82,10 @@ describe("token-estimation", () => { describe("estimateTokenUsage", () => { it("should calculate token usage correctly", () => { - const messages: AgentMessage[] = [ + const messages = [ { role: "user", content: "Hello world" }, // ~3 tokens { role: "assistant", content: "Hi there!" }, // ~3 tokens - ]; + ] as AgentMessage[]; const result = estimateTokenUsage({ messages, @@ -130,9 +130,9 @@ describe("token-estimation", () => { }); it("should calculate utilization ratio with safety margin", () => { - const messages: AgentMessage[] = [ + const messages = [ { role: "user", content: "a".repeat(400) }, // ~100 tokens - ]; + ] as AgentMessage[]; const result = estimateTokenUsage({ messages, @@ -184,7 +184,7 @@ describe("token-estimation", () => { return Array.from({ length: count }, (_, i) => ({ role: "user" as const, content: `Message ${i}: ${"x".repeat(100)}`, // Each ~28 tokens - })); + })) as AgentMessage[]; } it("should return null if too few messages", () => { @@ -228,7 +228,7 @@ describe("token-estimation", () => { }); it("should keep newest messages (from the end)", () => { - const messages: AgentMessage[] = [ + const messages = [ { role: "user", content: "Old message 1" }, { role: "user", content: "Old message 2" }, { role: "user", content: "Old message 3" }, @@ -242,7 +242,7 @@ describe("token-estimation", () => { { role: "user", content: "Old message 11" }, { role: "user", content: "Newer message 12" }, { role: "user", content: "Newest message 13" }, - ]; + ] as AgentMessage[]; const result = compactMessagesTokenAware(messages, 50, { targetRatio: 0.5, @@ -268,29 +268,29 @@ describe("token-estimation", () => { describe("isMessageOversized", () => { it("should return true for oversized message", () => { - const message: AgentMessage = { + const message = { role: "user", content: "x".repeat(4000), // ~1000 tokens - }; + } as AgentMessage; // With default maxRatio 0.5, 1000 tokens in 1000 context = 100% > 50% expect(isMessageOversized(message, 1000)).toBe(true); }); it("should return false for small message", () => { - const message: AgentMessage = { + const message = { role: "user", content: "Hello", // ~2 tokens - }; + } as AgentMessage; expect(isMessageOversized(message, 10000)).toBe(false); }); it("should use custom maxRatio", () => { - const message: AgentMessage = { + const message = { role: "user", content: "x".repeat(400), // ~100 tokens - }; + } as AgentMessage; // With safety margin 1.2, 100 * 1.2 = 120 tokens // 120 > 1000 * 0.1 = 100, so oversized @@ -301,10 +301,10 @@ describe("token-estimation", () => { }); it("should apply safety margin to token count", () => { - const message: AgentMessage = { + const message = { role: "user", content: "x".repeat(400), // ~100 tokens, with margin ~120 - }; + } as AgentMessage; // Without margin: 100 < 250 (50% of 500) // With margin: 120 < 250, still ok diff --git a/src/agent/providers/registry.ts b/src/agent/providers/registry.ts index 36ec7d57..ce9e58bb 100644 --- a/src/agent/providers/registry.ts +++ b/src/agent/providers/registry.ts @@ -50,8 +50,8 @@ const PROVIDER_REGISTRY: Record = { id: "claude-code", name: "Claude Code (OAuth)", authMethod: "oauth", - defaultModel: "claude-opus-4-5", - models: ["claude-opus-4-5", "claude-opus-4-1", "claude-sonnet-4-5", "claude-sonnet-4-0", "claude-haiku-4-5"], + defaultModel: "claude-opus-4-6", + models: ["claude-opus-4-6", "claude-opus-4-5", "claude-sonnet-4-5", "claude-sonnet-4-0", "claude-haiku-4-5"], loginCommand: "claude login", }, "openai-codex": { @@ -67,7 +67,7 @@ const PROVIDER_REGISTRY: Record = { name: "Anthropic (API Key)", authMethod: "api-key", defaultModel: "claude-sonnet-4-5", - models: ["claude-opus-4-5", "claude-opus-4-1", "claude-sonnet-4-5", "claude-sonnet-4-0", "claude-haiku-4-5"], + models: ["claude-opus-4-6", "claude-opus-4-5", "claude-sonnet-4-5", "claude-sonnet-4-0", "claude-haiku-4-5"], loginUrl: "https://console.anthropic.com/", }, "openai": { @@ -75,7 +75,7 @@ const PROVIDER_REGISTRY: Record = { name: "OpenAI", authMethod: "api-key", defaultModel: "gpt-4o", - models: ["gpt-5.2", "gpt-5-mini", "gpt-4.1", "gpt-4.1-mini", "gpt-4o", "gpt-4o-mini"], + models: ["gpt-5.2", "gpt-5-mini", "gpt-4.1", "gpt-4.1-mini", "gpt-4o", "gpt-4o-mini", "o3", "o3-mini"], loginUrl: "https://platform.openai.com/api-keys", }, "kimi-coding": { diff --git a/src/agent/session/compaction.test.ts b/src/agent/session/compaction.test.ts index 3956ec3e..124b649f 100644 --- a/src/agent/session/compaction.test.ts +++ b/src/agent/session/compaction.test.ts @@ -66,7 +66,7 @@ describe("compaction", () => { return Array.from({ length: count }, (_, i) => ({ role: (i % 2 === 0 ? "user" : "assistant") as "user" | "assistant", content: `${prefix} ${i}`, - })); + })) as AgentMessage[]; } function createMessagesWithToolUse(): AgentMessage[] { diff --git a/src/agent/session/session-manager.display.test.ts b/src/agent/session/session-manager.display.test.ts index 759c461d..b95a4fc0 100644 --- a/src/agent/session/session-manager.display.test.ts +++ b/src/agent/session/session-manager.display.test.ts @@ -28,13 +28,13 @@ describe("SessionManager display content view", () => { const entries: SessionEntry[] = [ { type: "message", - message: { role: "user", content: "[Mon 2026-02-09 14:37 GMT+8] hi" }, + message: { role: "user", content: "[Mon 2026-02-09 14:37 GMT+8] hi" } as any, displayContent: "hi", timestamp: 1, }, { type: "message", - message: { role: "assistant", content: "hello there" }, + message: { role: "assistant", content: "hello there" } as any, timestamp: 2, }, ]; @@ -43,9 +43,9 @@ describe("SessionManager display content view", () => { const raw = session.loadMessages(); const display = session.loadMessagesForDisplay(); - expect(raw[0]?.content).toBe("[Mon 2026-02-09 14:37 GMT+8] hi"); - expect(display[0]?.content).toBe("hi"); - expect(display[1]?.content).toBe("hello there"); + expect((raw[0] as any)?.content).toBe("[Mon 2026-02-09 14:37 GMT+8] hi"); + expect((display[0] as any)?.content).toBe("hi"); + expect((display[1] as any)?.content).toBe("hello there"); }); it("keeps internal filtering behavior in display view", async () => { @@ -54,14 +54,14 @@ describe("SessionManager display content view", () => { const entries: SessionEntry[] = [ { type: "message", - message: { role: "user", content: "[Mon 2026-02-09 14:37 GMT+8] hidden" }, + message: { role: "user", content: "[Mon 2026-02-09 14:37 GMT+8] hidden" } as any, displayContent: "hidden", internal: true, timestamp: 1, }, { type: "message", - message: { role: "user", content: "[Mon 2026-02-09 14:38 GMT+8] visible" }, + message: { role: "user", content: "[Mon 2026-02-09 14:38 GMT+8] visible" } as any, displayContent: "visible", timestamp: 2, }, @@ -72,9 +72,9 @@ describe("SessionManager display content view", () => { const includeInternalView = session.loadMessagesForDisplay({ includeInternal: true }); expect(defaultView).toHaveLength(1); - expect(defaultView[0]?.content).toBe("visible"); + expect((defaultView[0] as any)?.content).toBe("visible"); expect(includeInternalView).toHaveLength(2); - expect(includeInternalView[0]?.content).toBe("hidden"); + expect((includeInternalView[0] as any)?.content).toBe("hidden"); }); it("persists displayContent on saveMessage", async () => { @@ -82,7 +82,7 @@ describe("SessionManager display content view", () => { const session = new SessionManager({ sessionId, baseDir: testBaseDir }); session.saveMessage( - { role: "user", content: "[Mon 2026-02-09 14:39 GMT+8] save me" }, + { role: "user", content: "[Mon 2026-02-09 14:39 GMT+8] save me" } as any, { displayContent: "save me" }, ); await session.flush(); diff --git a/src/agent/session/session-manager.ts b/src/agent/session/session-manager.ts index 8ca825dd..9abeaf99 100644 --- a/src/agent/session/session-manager.ts +++ b/src/agent/session/session-manager.ts @@ -164,7 +164,7 @@ export class SessionManager { async repairIfNeeded(warn?: (message: string) => void): Promise { const filePath = resolveSessionPath(this.sessionId, { baseDir: this.baseDir }); - return repairSessionFileIfNeeded({ sessionFile: filePath, warn }); + return repairSessionFileIfNeeded({ sessionFile: filePath, ...(warn !== undefined ? { warn } : {}) }); } loadMessages(options?: { includeInternal?: boolean }): AgentMessage[] { @@ -274,7 +274,7 @@ export class SessionManager { const pruneResult = pruneToolResults({ messages: workingMessages, contextWindowTokens: this.contextWindowTokens, - settings: this.toolResultPruning, + ...(this.toolResultPruning !== undefined ? { settings: this.toolResultPruning } : {}), }); if (pruneResult.changed) { diff --git a/src/agent/session/session-transcript-repair.test.ts b/src/agent/session/session-transcript-repair.test.ts index 7607f86f..d162dbd4 100644 --- a/src/agent/session/session-transcript-repair.test.ts +++ b/src/agent/session/session-transcript-repair.test.ts @@ -23,7 +23,7 @@ describe("sanitizeToolUseResultPairing", () => { content: [{ type: "text", text: "ok" }], isError: false, }, - ] satisfies AgentMessage[]; + ] as AgentMessage[]; const out = sanitizeToolUseResultPairing(input); expect(out[0]?.role).toBe("assistant"); @@ -55,7 +55,7 @@ describe("sanitizeToolUseResultPairing", () => { isError: false, }, { role: "user", content: "ok" }, - ] satisfies AgentMessage[]; + ] as AgentMessage[]; const out = sanitizeToolUseResultPairing(input); expect(out.filter((m) => m.role === "toolResult")).toHaveLength(1); @@ -82,7 +82,7 @@ describe("sanitizeToolUseResultPairing", () => { content: [{ type: "text", text: "second (duplicate)" }], isError: false, }, - ] satisfies AgentMessage[]; + ] as AgentMessage[]; const out = sanitizeToolUseResultPairing(input); const results = out.filter((m) => m.role === "toolResult") as Array<{ @@ -106,7 +106,7 @@ describe("sanitizeToolUseResultPairing", () => { role: "assistant", content: [{ type: "text", text: "ok" }], }, - ] satisfies AgentMessage[]; + ] as AgentMessage[]; const out = sanitizeToolUseResultPairing(input); expect(out.some((m) => m.role === "toolResult")).toBe(false); @@ -116,20 +116,20 @@ describe("sanitizeToolUseResultPairing", () => { describe("sanitizeToolCallInputs", () => { it("drops tool calls missing input or arguments", () => { - const input: AgentMessage[] = [ + const input = [ { role: "assistant", content: [{ type: "toolCall", id: "call_1", name: "read" }], }, { role: "user", content: "hello" }, - ]; + ] as AgentMessage[]; const out = sanitizeToolCallInputs(input); expect(out.map((m) => m.role)).toEqual(["user"]); }); it("keeps valid tool calls and preserves text blocks", () => { - const input: AgentMessage[] = [ + const input = [ { role: "assistant", content: [ @@ -138,7 +138,7 @@ describe("sanitizeToolCallInputs", () => { { type: "toolCall", id: "call_drop", name: "read" }, ], }, - ]; + ] as AgentMessage[]; const out = sanitizeToolCallInputs(input); const assistant = out[0] as Extract; diff --git a/src/agent/session/session-transcript-repair.ts b/src/agent/session/session-transcript-repair.ts index aa43071e..956653b2 100644 --- a/src/agent/session/session-transcript-repair.ts +++ b/src/agent/session/session-transcript-repair.ts @@ -2,7 +2,7 @@ import type { AgentMessage } from "@mariozechner/pi-agent-core"; type ToolCallLike = { id: string; - name?: string; + name?: string | undefined; }; const TOOL_CALL_TYPES = new Set(["toolCall", "toolUse", "functionCall"]); @@ -72,7 +72,7 @@ function extractToolResultId(msg: Extract) function makeMissingToolResult(params: { toolCallId: string; - toolName?: string; + toolName?: string | undefined; }): Extract { return { role: "toolResult", @@ -188,7 +188,6 @@ export function repairToolUseResultPairing(messages: AgentMessage[]): ToolUseRep for (let i = 0; i < messages.length; i += 1) { const msg = messages[i]; if (!msg || typeof msg !== "object") { - out.push(msg); continue; } @@ -219,7 +218,6 @@ export function repairToolUseResultPairing(messages: AgentMessage[]): ToolUseRep for (; j < messages.length; j += 1) { const next = messages[j]; if (!next || typeof next !== "object") { - remainder.push(next); continue; } diff --git a/src/agent/session/storage.test.ts b/src/agent/session/storage.test.ts index ee0f9765..6f9498c9 100644 --- a/src/agent/session/storage.test.ts +++ b/src/agent/session/storage.test.ts @@ -108,12 +108,12 @@ describe("session/storage", () => { const entry1: SessionEntry = { type: "message", - message: { role: "user", content: "Hello" }, + message: { role: "user", content: "Hello" } as any, timestamp: 1000, }; const entry2: SessionEntry = { type: "message", - message: { role: "assistant", content: "Hi there" }, + message: { role: "assistant", content: "Hi there" } as any, timestamp: 2000, }; @@ -135,7 +135,7 @@ describe("session/storage", () => { const validEntry: SessionEntry = { type: "message", - message: { role: "user", content: "Valid" }, + message: { role: "user", content: "Valid" } as any, timestamp: 1000, }; @@ -195,7 +195,7 @@ describe("session/storage", () => { const sessionId = "append-session"; const entry: SessionEntry = { type: "message", - message: { role: "user", content: "Hello" }, + message: { role: "user", content: "Hello" } as any, timestamp: 1000, }; @@ -212,12 +212,12 @@ describe("session/storage", () => { const sessionId = "append-existing"; const entry1: SessionEntry = { type: "message", - message: { role: "user", content: "First" }, + message: { role: "user", content: "First" } as any, timestamp: 1000, }; const entry2: SessionEntry = { type: "message", - message: { role: "assistant", content: "Second" }, + message: { role: "assistant", content: "Second" } as any, timestamp: 2000, }; @@ -235,8 +235,8 @@ describe("session/storage", () => { it("should write all entries to file", async () => { const sessionId = "write-session"; const entries: SessionEntry[] = [ - { type: "message", message: { role: "user", content: "One" }, timestamp: 1000 }, - { type: "message", message: { role: "assistant", content: "Two" }, timestamp: 2000 }, + { type: "message", message: { role: "user", content: "One" } as any, timestamp: 1000 }, + { type: "message", message: { role: "assistant", content: "Two" } as any, timestamp: 2000 }, ]; await writeEntries(sessionId, entries, { baseDir: testBaseDir }); @@ -251,12 +251,12 @@ describe("session/storage", () => { await writeEntries( sessionId, - [{ type: "message", message: { role: "user", content: "Old" }, timestamp: 1000 }], + [{ type: "message", message: { role: "user", content: "Old" } as any, timestamp: 1000 }], { baseDir: testBaseDir } ); const newEntries: SessionEntry[] = [ - { type: "message", message: { role: "user", content: "New" }, timestamp: 2000 }, + { type: "message", message: { role: "user", content: "New" } as any, timestamp: 2000 }, ]; await writeEntries(sessionId, newEntries, { baseDir: testBaseDir }); diff --git a/src/agent/tools.ts b/src/agent/tools.ts index fdb7ad1f..2edebb5e 100644 --- a/src/agent/tools.ts +++ b/src/agent/tools.ts @@ -33,10 +33,10 @@ export interface CreateToolsOptions { type ToolErrorPayload = { error: true; message: string; - name?: string; - code?: string; - retryable?: boolean; - details?: Record; + name?: string | undefined; + code?: string | undefined; + retryable?: boolean | undefined; + details?: Record | undefined; }; function toToolErrorPayload(error: unknown): ToolErrorPayload { @@ -130,12 +130,12 @@ export function createAllTools(options: CreateToolsOptions | string): AgentTool< // Add sessions_spawn tool (will be filtered by policy for subagents) const sessionsSpawnTool = createSessionsSpawnTool({ isSubagent: isSubagent ?? false, - sessionId, + ...(sessionId !== undefined ? { sessionId } : {}), }); tools.push(sessionsSpawnTool as AgentTool); // Add sessions_list tool - const sessionsListTool = createSessionsListTool({ sessionId }); + const sessionsListTool = createSessionsListTool({ ...(sessionId !== undefined ? { sessionId } : {}) }); tools.push(sessionsListTool as AgentTool); return tools; diff --git a/src/agent/tools/exec-approval-types.ts b/src/agent/tools/exec-approval-types.ts index 51685dbc..9c32b3da 100644 --- a/src/agent/tools/exec-approval-types.ts +++ b/src/agent/tools/exec-approval-types.ts @@ -27,7 +27,7 @@ export interface ExecApprovalRequest { /** Shell command to execute */ command: string; /** Working directory */ - cwd?: string; + cwd?: string | undefined; /** Evaluated risk level */ riskLevel: "safe" | "needs-review" | "dangerous"; /** Reasons for the risk assessment */ diff --git a/src/agent/tools/sessions-list.ts b/src/agent/tools/sessions-list.ts index 1106b21e..19a0809e 100644 --- a/src/agent/tools/sessions-list.ts +++ b/src/agent/tools/sessions-list.ts @@ -23,12 +23,12 @@ type SessionsListArgs = { export type SessionsListResult = { runs: Array<{ runId: string; - label?: string; + label?: string | undefined; task: string; status: "running" | "ok" | "error" | "timeout" | "unknown"; - startedAt?: number; - endedAt?: number; - findings?: string; + startedAt?: number | undefined; + endedAt?: number | undefined; + findings?: string | undefined; }>; }; diff --git a/src/console/app.controller.ts b/src/console/app.controller.ts index 0fbf2e2d..bf4ee28a 100644 --- a/src/console/app.controller.ts +++ b/src/console/app.controller.ts @@ -44,7 +44,7 @@ export class AppController { @Post("agents") createAgent(@Body() body?: { id?: string }) { const agent = this.hub.createAgent(body?.id); - return { id: agent.id }; + return { id: agent.sessionId }; } @Delete("agents/:id") diff --git a/src/gateway/test-client.ts b/src/gateway/test-client.ts index 5125541c..7f70b67d 100644 --- a/src/gateway/test-client.ts +++ b/src/gateway/test-client.ts @@ -1,11 +1,15 @@ import { GatewayClient, - HelloAction, - HelloResponseAction, - type HelloPayload, - type HelloResponsePayload, + type ConnectionState, + type RoutedMessage, + type SendErrorResponse, } from "@multica/sdk"; +const HelloAction = "hello"; +const HelloResponseAction = "hello:response"; +type HelloPayload = { greeting: string }; +type HelloResponsePayload = { reply: string }; + // 模拟一个 Client const client = new GatewayClient({ url: "http://localhost:3000", @@ -22,11 +26,11 @@ const agent = new GatewayClient({ // Agent 监听消息 agent - .onStateChange((state) => console.log("[Agent] State:", state)) - .onRegistered((deviceId) => { + .onStateChange((state: ConnectionState) => console.log("[Agent] State:", state)) + .onRegistered((deviceId: string) => { console.log("[Agent] Registered as:", deviceId); }) - .onMessage((message) => { + .onMessage((message: RoutedMessage) => { console.log("[Agent] Received message:", message); // 回复消息 @@ -38,13 +42,13 @@ agent }); } }) - .onSendError((error) => console.error("[Agent] Send error:", error)) + .onSendError((error: SendErrorResponse) => console.error("[Agent] Send error:", error)) .connect(); // Client 监听消息 client - .onStateChange((state) => console.log("[Client] State:", state)) - .onRegistered((deviceId) => { + .onStateChange((state: ConnectionState) => console.log("[Client] State:", state)) + .onRegistered((deviceId: string) => { console.log("[Client] Registered as:", deviceId); // 注册后发送消息给 Agent @@ -55,10 +59,10 @@ client }); }, 500); }) - .onMessage((message) => { + .onMessage((message: RoutedMessage) => { console.log("[Client] Received message:", message); }) - .onSendError((error) => console.error("[Client] Send error:", error)) + .onSendError((error: SendErrorResponse) => console.error("[Client] Send error:", error)) .connect(); // 5秒后断开 diff --git a/src/hub/block-chunker.ts b/src/hub/block-chunker.ts index 0595442a..61e8c7d4 100644 --- a/src/hub/block-chunker.ts +++ b/src/hub/block-chunker.ts @@ -44,9 +44,9 @@ function detectFenceAt(text: string, upTo: number): FenceInfo | null { for (const line of lines) { const match = line.match(/^(`{3,}|~{3,})(\S*)\s*$/); if (!match) continue; - const marker = match[1]; + const marker = match[1]!; const lang = match[2] ?? ""; - const markerChar = marker[0]; + const markerChar = marker[0]!; if (openFence === null) { // Opening a new fence @@ -242,7 +242,7 @@ function findSentenceBreak(buffer: string, start: number, end: number, bufLen: n const ch = buffer[i]; if (ch === "." || ch === "!" || ch === "?") { const next = i + 1; - if (next < bufLen && /\s/.test(buffer[next])) { + if (next < bufLen && /\s/.test(buffer[next]!)) { // Break after the whitespace const idx = next + 1; if (idx < bufLen) return idx; @@ -261,7 +261,7 @@ function findSentenceBreak(buffer: string, start: number, end: number, bufLen: n */ function findWordBreak(buffer: string, start: number, end: number, bufLen: number): number { for (let i = end - 1; i >= start; i--) { - if (/\s/.test(buffer[i])) { + if (/\s/.test(buffer[i]!)) { const idx = i + 1; if (idx < bufLen) return idx; } diff --git a/src/hub/device-store.ts b/src/hub/device-store.ts index 1519b812..97f54aff 100644 --- a/src/hub/device-store.ts +++ b/src/hub/device-store.ts @@ -20,7 +20,7 @@ export interface DeviceEntry { deviceId: string; agentId: string; addedAt: number; - meta?: DeviceMeta; + meta?: DeviceMeta | undefined; } // ============ Persistence ============ diff --git a/src/hub/exec-approval-manager.test.ts b/src/hub/exec-approval-manager.test.ts index 27033022..fa38c902 100644 --- a/src/hub/exec-approval-manager.test.ts +++ b/src/hub/exec-approval-manager.test.ts @@ -8,7 +8,7 @@ describe("ExecApprovalManager", () => { beforeEach(() => { vi.useFakeTimers(); sendToClient = vi.fn(); - manager = new ExecApprovalManager(sendToClient, 5000); // 5s timeout for tests + manager = new ExecApprovalManager(sendToClient as any, 5000); // 5s timeout for tests }); afterEach(() => { diff --git a/src/hub/hub.ts b/src/hub/hub.ts index ef619228..df3b3daa 100644 --- a/src/hub/hub.ts +++ b/src/hub/hub.ts @@ -2,6 +2,8 @@ import { v7 as uuidv7 } from "uuid"; import { GatewayClient, type ConnectionState, + type RoutedMessage, + type SendErrorResponse, RequestAction, ResponseAction, StreamAction, @@ -204,22 +206,22 @@ export class Hub { reconnectDelay: 1000, }); - client.onStateChange((state) => { + client.onStateChange((state: ConnectionState) => { console.log(`[Hub] Connection state: ${state}`); for (const listener of this._stateChangeListeners) { listener(state); } }); - client.onRegistered((deviceId) => { + client.onRegistered((deviceId: string) => { console.log(`[Hub] Registered as: ${deviceId}`); }); - client.onError((err) => { + client.onError((err: Error) => { console.error(`[Hub] Connection error:`, err.message); }); - client.onMessage((msg) => { + client.onMessage((msg: RoutedMessage) => { console.log(`[Hub] Received message: id=${msg.id} from=${msg.from} to=${msg.to} action=${msg.action} payload=${JSON.stringify(msg.payload)}`); // RPC request @@ -272,7 +274,7 @@ export class Hub { } }); - client.onSendError((err) => { + client.onSendError((err: SendErrorResponse) => { console.error(`[Hub] Send error: messageId=${err.messageId} code=${err.code} error=${err.error}`); }); @@ -592,12 +594,12 @@ export class Hub { const result = await this.approvalManager.requestApproval({ agentId: sessionId, command, - cwd, + ...(cwd !== undefined ? { cwd } : {}), riskLevel: evaluation.riskLevel, riskReasons: evaluation.reasons, - timeoutMs: config.timeoutMs, - askFallback: config.askFallback, - allowlistSatisfied: evaluation.allowlistSatisfied, + ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}), + ...(config.askFallback !== undefined ? { askFallback: config.askFallback } : {}), + ...(evaluation.allowlistSatisfied !== undefined ? { allowlistSatisfied: evaluation.allowlistSatisfied } : {}), }); // Handle allow-always: persist to profile allowlist diff --git a/src/hub/message-aggregator.test.ts b/src/hub/message-aggregator.test.ts index 52516648..c8e983ed 100644 --- a/src/hub/message-aggregator.test.ts +++ b/src/hub/message-aggregator.test.ts @@ -85,8 +85,8 @@ function smallConfig(overrides?: Partial): BlockChunkerConfi describe("MessageAggregator", () => { let blocks: BlockReply[]; let passedThrough: Array; - let onBlock: ReturnType; - let onPassthrough: ReturnType; + let onBlock: any; + let onPassthrough: any; beforeEach(() => { blocks = []; @@ -154,8 +154,8 @@ describe("MessageAggregator", () => { agg.handleEvent(endEvent); expect(blocks).toHaveLength(1); - expect(blocks[0].text).toBe("Hello world"); - expect(blocks[0].isFinal).toBe(true); + expect(blocks[0]!.text).toBe("Hello world"); + expect(blocks[0]!.isFinal).toBe(true); // message_start + message_end both passed through const passthroughTypes = passedThrough.map((e) => e.type); @@ -178,7 +178,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("Hello world")); expect(blocks).toHaveLength(1); - expect(blocks[0].text).toBe("Hello world"); + expect(blocks[0]!.text).toBe("Hello world"); }); it("ignores ThinkingContent blocks, only extracts text", () => { @@ -190,8 +190,8 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("visible text")); expect(blocks).toHaveLength(1); - expect(blocks[0].text).toBe("visible text"); - expect(blocks[0].text).not.toContain("internal thinking"); + expect(blocks[0]!.text).toBe("visible text"); + expect(blocks[0]!.text).not.toContain("internal thinking"); }); it("handles empty delta (duplicate event) gracefully", () => { @@ -205,7 +205,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("Hello")); expect(blocks).toHaveLength(1); - expect(blocks[0].text).toBe("Hello"); + expect(blocks[0]!.text).toBe("Hello"); }); it("handles monotonically growing text correctly", () => { @@ -221,7 +221,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("Hello")); expect(blocks).toHaveLength(1); - expect(blocks[0].text).toBe("Hello"); + expect(blocks[0]!.text).toBe("Hello"); }); }); @@ -241,8 +241,8 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageUpdate(text)); expect(blocks.length).toBeGreaterThanOrEqual(1); - expect(blocks[0].text).toContain("first paragraph"); - expect(blocks[0].isFinal).toBe(false); + expect(blocks[0]!.text).toContain("first paragraph"); + expect(blocks[0]!.isFinal).toBe(false); }); it("emits multiple blocks for very long text", () => { @@ -255,7 +255,7 @@ describe("MessageAggregator", () => { expect(blocks.length).toBeGreaterThanOrEqual(2); // All blocks except the last should have isFinal=false for (let i = 0; i < blocks.length; i++) { - expect(blocks[i].isFinal).toBe(false); + expect(blocks[i]!.isFinal).toBe(false); } }); @@ -268,7 +268,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd(text)); const finalBlock = blocks[blocks.length - 1]; - expect(finalBlock.isFinal).toBe(true); + expect(finalBlock!.isFinal).toBe(true); }); it("increments block index for each emitted block", () => { @@ -280,7 +280,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd(text)); for (let i = 0; i < blocks.length; i++) { - expect(blocks[i].index).toBe(i); + expect(blocks[i]!.index).toBe(i); } }); @@ -293,7 +293,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("First message text.")); expect(blocks).toHaveLength(1); - expect(blocks[0].index).toBe(0); + expect(blocks[0]!.index).toBe(0); // Second message cycle — index should reset agg.handleEvent(makeMessageStart("msg-2")); @@ -301,7 +301,7 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("Second message text.")); expect(blocks).toHaveLength(2); - expect(blocks[1].index).toBe(0); // Reset after new message_start + expect(blocks[1]!.index).toBe(0); // Reset after new message_start }); it("does not emit empty block on message_end with no content", () => { @@ -335,7 +335,7 @@ describe("MessageAggregator", () => { // Final block should contain all text expect(blocks).toHaveLength(1); - expect(blocks[0].text).toBe("Before tool call. After tool result."); + expect(blocks[0]!.text).toBe("Before tool call. After tool result."); }); it("handles multiple message cycles (reset between)", () => { @@ -352,11 +352,11 @@ describe("MessageAggregator", () => { agg.handleEvent(makeMessageEnd("Second response.")); expect(blocks).toHaveLength(2); - expect(blocks[0].text).toBe("First response."); - expect(blocks[1].text).toBe("Second response."); + expect(blocks[0]!.text).toBe("First response."); + expect(blocks[1]!.text).toBe("Second response."); // Both should be final (flushed on message_end) - expect(blocks[0].isFinal).toBe(true); - expect(blocks[1].isFinal).toBe(true); + expect(blocks[0]!.isFinal).toBe(true); + expect(blocks[1]!.isFinal).toBe(true); }); it("handles compaction events between messages", () => { From a61e29469e209b2114a41ed05d6a6973092adec6 Mon Sep 17 00:00:00 2001 From: Jiang Bohan Date: Mon, 9 Feb 2026 19:20:16 +0800 Subject: [PATCH 4/5] fix(desktop): add overflow-y scroll to provider dropdown The provider & model dropdown now scrolls internally instead of causing the whole page to scroll when content exceeds viewport. Co-Authored-By: Claude Opus 4.6 --- apps/desktop/src/pages/home.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src/pages/home.tsx b/apps/desktop/src/pages/home.tsx index 462ca32a..8865a866 100644 --- a/apps/desktop/src/pages/home.tsx +++ b/apps/desktop/src/pages/home.tsx @@ -215,7 +215,7 @@ export default function HomePage() { {/* Provider Dropdown - Compact Grid + Model List */} {providerDropdownOpen && ( -

+
{providers.map((p) => (