diff --git a/apps/cli/package.json b/apps/cli/package.json index 893bbce4..2a36ee76 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -15,7 +15,7 @@ "LICENSE" ], "engines": { - "node": ">=20" + "node": ">=22.19.0" }, "publishConfig": { "access": "public" @@ -48,8 +48,8 @@ "dependencies": { "@fastify/multipart": "^10.0.0", "@fastify/static": "^9.1.3", - "@earendil-works/pi-agent-core": "0.74.2", - "@earendil-works/pi-ai": "0.74.2", + "@earendil-works/pi-agent-core": "0.83.0", + "@earendil-works/pi-ai": "0.83.0", "@modelcontextprotocol/sdk": "^1.12.1", "better-sqlite3": "^12.4.6", "commander": "^13.1.0", diff --git a/apps/cli/src/ai/agent.ts b/apps/cli/src/ai/agent.ts index d8a03269..c713213c 100644 --- a/apps/cli/src/ai/agent.ts +++ b/apps/cli/src/ai/agent.ts @@ -251,6 +251,7 @@ export async function runServerAgent(options: RunAgentOptions): Promise { userMessage, maxToolRounds: DEFAULT_MAX_TOOL_ROUNDS, abortSignal, + providerSessionId: aiChatId, steerMessage, thinkingLevel: thinkingLevel as import('@openchatlab/core').ThinkingLevel | undefined, onConvertToLlm: (filteredMessages) => { diff --git a/apps/cli/src/ai/tool-adapter.test.ts b/apps/cli/src/ai/tool-adapter.test.ts index 40ee3460..0be16d85 100644 --- a/apps/cli/src/ai/tool-adapter.test.ts +++ b/apps/cli/src/ai/tool-adapter.test.ts @@ -37,6 +37,7 @@ describe('adaptToolsForAgent', () => { name: 'render_chart', description: 'Render a chart', inputSchema: { type: 'object', properties: {} }, + executionMode: 'sequential', async handler() { chartCalls += 1 return { content: 'Generated chart.' } @@ -51,6 +52,7 @@ describe('adaptToolsForAgent', () => { const result = await agentTool.execute('call-1', {}) + assert.equal(agentTool.executionMode, 'sequential') assert.equal(chartCalls, 0) assert.deepEqual(result.content, [{ type: 'text', text: CHART_SCHEMA_REQUIRED_MESSAGE }]) assert.equal(result.details, null) diff --git a/apps/cli/src/ai/tool-adapter.ts b/apps/cli/src/ai/tool-adapter.ts index 189fec1b..913845df 100644 --- a/apps/cli/src/ai/tool-adapter.ts +++ b/apps/cli/src/ai/tool-adapter.ts @@ -73,6 +73,7 @@ export function adaptToolsForAgent( label: tool.name, description: tool.description, parameters: toAgentToolParameters(tool.inputSchema) as any, + executionMode: tool.executionMode, async execute(_toolCallId: string, params: unknown) { const ctx = getContext() const execCtx: ToolExecutionContext = { diff --git a/apps/cli/tsup.config.ts b/apps/cli/tsup.config.ts index 2f112a10..34f557e5 100644 --- a/apps/cli/tsup.config.ts +++ b/apps/cli/tsup.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ splitting: true, sourcemap: true, clean: true, - target: 'node20', + target: 'node22', platform: 'node', define: { 'process.env.UMAMI_ENDPOINT': JSON.stringify(process.env.UMAMI_ENDPOINT || ''), diff --git a/apps/desktop/main/ai/agent/index.ts b/apps/desktop/main/ai/agent/index.ts index fb2d03a1..8d948d96 100644 --- a/apps/desktop/main/ai/agent/index.ts +++ b/apps/desktop/main/ai/agent/index.ts @@ -231,6 +231,7 @@ export class Agent { userMessage, maxToolRounds, abortSignal: this.abortSignal, + providerSessionId: this.context.aiChatId, steerMessage: answerWithoutToolsPrompt, thinkingLevel: this.config.thinkingLevel, streamFn: errorCapturingStreamFn, diff --git a/apps/desktop/main/ai/tools/shared-tool-adapter.ts b/apps/desktop/main/ai/tools/shared-tool-adapter.ts index 256e0eb7..7fc8336f 100644 --- a/apps/desktop/main/ai/tools/shared-tool-adapter.ts +++ b/apps/desktop/main/ai/tools/shared-tool-adapter.ts @@ -58,6 +58,7 @@ export function adaptSharedTool(tool: ToolDefinition): ToolRegistryEntry { // 缺 key 时回退到此英文描述,避免把裸 i18n key 当作工具描述传给 LLM。 description: tool.description, parameters: toAgentToolParameters(tool.inputSchema) as any, + executionMode: tool.executionMode, async execute(_toolCallId: string, params: unknown) { return executeToolForAgent(tool, params, buildExecutionContext(context)) }, diff --git a/docs/cn/ai/external-agent.md b/docs/cn/ai/external-agent.md index c231b2ba..62835163 100644 --- a/docs/cn/ai/external-agent.md +++ b/docs/cn/ai/external-agent.md @@ -8,7 +8,7 @@ ChatLab 可以让 Codex、Claude Code、HermesAgent 等 AI Agent 在本地查询 ## 开始使用 -需要 Node.js 20 或更高版本,并已在 ChatLab 中导入聊天记录。安装 ChatLab CLI 和中文 Skill: +需要 Node.js 22.19 或更高版本,并已在 ChatLab 中导入聊天记录。安装 ChatLab CLI 和中文 Skill: ```bash npm install -g chatlab-cli diff --git a/docs/cn/usage/how-to-import.md b/docs/cn/usage/how-to-import.md index c433b3d4..90d7699f 100644 --- a/docs/cn/usage/how-to-import.md +++ b/docs/cn/usage/how-to-import.md @@ -19,7 +19,7 @@ ChatLab 支持多种方式导入聊天记录。 适合已经使用 Codex、Claude Code 等各类 AI Agent,希望让 Agent 代为执行导入的用户。 -需要 Node.js 20 或更高版本。安装 ChatLab CLI 和中文 Skill: +需要 Node.js 22.19 或更高版本。安装 ChatLab CLI 和中文 Skill: ```bash npm install -g chatlab-cli diff --git a/docs/cn/usage/installation.md b/docs/cn/usage/installation.md index e317d681..8dc1b4f8 100644 --- a/docs/cn/usage/installation.md +++ b/docs/cn/usage/installation.md @@ -14,7 +14,7 @@ macOS Desktop 目前仅支持搭载 Apple 芯片(M 系列)的 Mac。Intel Ma ## CLI -CLI 需要 Node.js 20 或更高版本: +CLI 需要 Node.js 22.19 或更高版本: ```bash npm install --global chatlab-cli diff --git a/docs/en/ai/external-agent.md b/docs/en/ai/external-agent.md index 739b81f1..84323cb7 100644 --- a/docs/en/ai/external-agent.md +++ b/docs/en/ai/external-agent.md @@ -8,7 +8,7 @@ ChatLab lets AI agents such as Codex, Claude Code, and HermesAgent query and ana ## Get started -Node.js 20 or newer is required, and chat records must already be imported into ChatLab. Install ChatLab CLI and the English Skill: +Node.js 22.19 or newer is required, and chat records must already be imported into ChatLab. Install ChatLab CLI and the English Skill: ```bash npm install -g chatlab-cli diff --git a/docs/en/usage/how-to-import.md b/docs/en/usage/how-to-import.md index c161a4da..3bd707c8 100644 --- a/docs/en/usage/how-to-import.md +++ b/docs/en/usage/how-to-import.md @@ -19,7 +19,7 @@ The homepage also supports incremental imports. When a new file matches an impor Use this when you already work with Codex, Claude Code, or another AI agent and want the agent to handle the import for you. -Node.js 20 or newer is required. Install ChatLab CLI and the English skill: +Node.js 22.19 or newer is required. Install ChatLab CLI and the English skill: ```bash npm install -g chatlab-cli diff --git a/docs/en/usage/installation.md b/docs/en/usage/installation.md index cdc3c120..1c1e75c9 100644 --- a/docs/en/usage/installation.md +++ b/docs/en/usage/installation.md @@ -14,7 +14,7 @@ The macOS Desktop app currently supports Apple Silicon Macs only. Intel Mac user ## CLI -The CLI requires Node.js 20 or newer: +The CLI requires Node.js 22.19 or newer: ```bash npm install --global chatlab-cli diff --git a/docs/tw/usage/how-to-import.md b/docs/tw/usage/how-to-import.md index 4f0c2ae4..3c5f2720 100644 --- a/docs/tw/usage/how-to-import.md +++ b/docs/tw/usage/how-to-import.md @@ -19,7 +19,7 @@ ChatLab 支援多種方式匯入聊天記錄。 適合已經使用 Codex、Claude Code 等各類 AI Agent,希望讓 Agent 代為執行匯入的使用者。 -需要 Node.js 20 或更高版本。安裝 ChatLab CLI 和中文 Skill: +需要 Node.js 22.19 或更高版本。安裝 ChatLab CLI 和中文 Skill: ```bash npm install -g chatlab-cli diff --git a/docs/tw/usage/installation.md b/docs/tw/usage/installation.md index f3179983..6507693b 100644 --- a/docs/tw/usage/installation.md +++ b/docs/tw/usage/installation.md @@ -14,7 +14,7 @@ macOS Desktop 目前僅支援搭載 Apple 晶片(M 系列)的 Mac。Intel Ma ## CLI -CLI 需要 Node.js 20 或更新版本: +CLI 需要 Node.js 22.19 或更新版本: ```bash npm install --global chatlab-cli diff --git a/packages/mcp-server/README.md b/packages/mcp-server/README.md index ad0307ce..d23d096c 100644 --- a/packages/mcp-server/README.md +++ b/packages/mcp-server/README.md @@ -68,7 +68,7 @@ The server registers ChatLab tools for: ## Requirements -- Node.js 20 or later +- Node.js 22.19 or later - Existing ChatLab data under `~/.chatlab/` `better-sqlite3` is installed as a runtime dependency. On platforms without a matching prebuilt binary, npm may need local build tools for native modules. diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index c81d90bd..7f69e469 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -12,7 +12,7 @@ "dist/" ], "engines": { - "node": ">=20" + "node": ">=22.19.0" }, "publishConfig": { "access": "public" diff --git a/packages/mcp-server/tsup.config.ts b/packages/mcp-server/tsup.config.ts index a819d486..4923149d 100644 --- a/packages/mcp-server/tsup.config.ts +++ b/packages/mcp-server/tsup.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ splitting: true, sourcemap: true, clean: true, - target: 'node20', + target: 'node22', platform: 'node', define: { __MCP_PACKAGE_VERSION__: JSON.stringify(pkg.version), diff --git a/packages/node-runtime/package.json b/packages/node-runtime/package.json index ef06c2ef..6e76da08 100644 --- a/packages/node-runtime/package.json +++ b/packages/node-runtime/package.json @@ -15,8 +15,8 @@ "./src/*": "./src/*.ts" }, "dependencies": { - "@earendil-works/pi-agent-core": "0.74.2", - "@earendil-works/pi-ai": "0.74.2", + "@earendil-works/pi-agent-core": "0.83.0", + "@earendil-works/pi-ai": "0.83.0", "@huggingface/transformers": "^4.2.0", "@openchatlab/config": "workspace:*", "@openchatlab/core": "workspace:*", diff --git a/packages/node-runtime/src/ai/__tests__/activate-skill-tool.test.ts b/packages/node-runtime/src/ai/__tests__/activate-skill-tool.test.ts index d8007d9a..37bd30f2 100644 --- a/packages/node-runtime/src/ai/__tests__/activate-skill-tool.test.ts +++ b/packages/node-runtime/src/ai/__tests__/activate-skill-tool.test.ts @@ -23,6 +23,7 @@ describe('createActivateSkillTool', () => { const result = await tool.execute('call_1', { skill_id: 'tool_skill' }) + assert.equal(tool.executionMode, 'sequential') assert.equal(result.details.applicable, false) assert.deepEqual(result.details.missingTools, ['keyword_frequency']) }) diff --git a/packages/node-runtime/src/ai/__tests__/pi-runtime.test.ts b/packages/node-runtime/src/ai/__tests__/pi-runtime.test.ts new file mode 100644 index 00000000..425bfd2f --- /dev/null +++ b/packages/node-runtime/src/ai/__tests__/pi-runtime.test.ts @@ -0,0 +1,25 @@ +import assert from 'node:assert/strict' +import { it } from 'node:test' +import type { Model } from '@earendil-works/pi-ai' + +import { streamSimple } from '../pi-runtime' + +it('returns a protocol error for API formats ChatLab does not expose', async () => { + const model: Model<'unsupported-api'> = { + id: 'unsupported-model', + name: 'Unsupported Model', + api: 'unsupported-api', + provider: 'custom', + baseUrl: 'http://localhost.invalid', + reasoning: false, + input: ['text'], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 8_192, + maxTokens: 1_024, + } + + const result = await streamSimple(model, { messages: [] }).result() + + assert.equal(result.stopReason, 'error') + assert.equal(result.errorMessage, 'Unsupported ChatLab AI API format: unsupported-api') +}) diff --git a/packages/node-runtime/src/ai/activate-skill-tool.ts b/packages/node-runtime/src/ai/activate-skill-tool.ts index 4b7aac88..7ab2e2c4 100644 --- a/packages/node-runtime/src/ai/activate-skill-tool.ts +++ b/packages/node-runtime/src/ai/activate-skill-tool.ts @@ -25,6 +25,7 @@ export interface ActivateSkillTool { label: string description: string parameters: Record + executionMode: 'sequential' execute: ( toolCallId: string, params: unknown, @@ -53,6 +54,7 @@ export function createActivateSkillTool(options: ActivateSkillToolOptions): Acti }, required: ['skill_id'], }, + executionMode: 'sequential', execute: async (_toolCallId: string, params: unknown) => { const toolParams = (params && typeof params === 'object' ? params : {}) as { skill_id?: string } const skillId = toolParams.skill_id || '' diff --git a/packages/node-runtime/src/ai/agent/__tests__/core.test.ts b/packages/node-runtime/src/ai/agent/__tests__/core.test.ts index a78ba69c..49d96f14 100644 --- a/packages/node-runtime/src/ai/agent/__tests__/core.test.ts +++ b/packages/node-runtime/src/ai/agent/__tests__/core.test.ts @@ -285,4 +285,64 @@ describe('runAgentCore runtime contract', () => { true ) }) + + it('forwards the stable AI conversation id as the provider session id', async () => { + let capturedOptions: SimpleStreamOptions | undefined + + await runAgentCore( + createOptions({ + providerSessionId: 'ai-chat-1', + streamFn: createScriptedStream([ + (_context, options) => { + capturedOptions = options + return assistantMessage([{ type: 'text', text: 'Done' }]) + }, + ]), + }) + ) + + assert.equal(capturedOptions?.sessionId, 'ai-chat-1') + }) + + for (const testCase of [ + { name: 'runs independent tools in parallel', executionMode: undefined, expectedMaxActive: 2 }, + { + name: 'runs a batch sequentially when one tool requires ordering', + executionMode: 'sequential', + expectedMaxActive: 1, + }, + ] as const) { + it(testCase.name, async () => { + let active = 0 + let maxActive = 0 + const execute = async () => { + active += 1 + maxActive = Math.max(maxActive, active) + await new Promise((resolve) => setTimeout(resolve, 10)) + active -= 1 + return { content: [{ type: 'text' as const, text: 'ok' }], details: null } + } + const firstTool = createTool('first_tool', execute) + firstTool.executionMode = testCase.executionMode + const secondTool = createTool('second_tool', execute) + + await runAgentCore( + createOptions({ + tools: [firstTool, secondTool], + streamFn: createScriptedStream([ + assistantMessage( + [ + { type: 'toolCall', id: 'first-call', name: 'first_tool', arguments: {} }, + { type: 'toolCall', id: 'second-call', name: 'second_tool', arguments: {} }, + ], + { stopReason: 'toolUse' } + ), + assistantMessage([{ type: 'text', text: 'Done' }]), + ]), + }) + ) + + assert.equal(maxActive, testCase.expectedMaxActive) + }) + } }) diff --git a/packages/node-runtime/src/ai/agent/core.ts b/packages/node-runtime/src/ai/agent/core.ts index 762bc9f0..8d34ad19 100644 --- a/packages/node-runtime/src/ai/agent/core.ts +++ b/packages/node-runtime/src/ai/agent/core.ts @@ -7,16 +7,12 @@ import { Agent as PiAgentCore } from '@earendil-works/pi-agent-core' import type { AgentEvent as PiAgentEvent, AgentMessage as PiAgentMessage } from '@earendil-works/pi-agent-core' -import { - type Message as PiMessage, - type Usage as PiUsage, - streamSimple as defaultStreamSimple, - clampThinkingLevel, -} from '@earendil-works/pi-ai' +import { type Message as PiMessage, type Usage as PiUsage, clampThinkingLevel } from '@earendil-works/pi-ai' import { StreamingThinkTagParser, needsStreamingThinkParsing } from '@openchatlab/core' import type { AgentCoreOptions, AgentCoreResult, AgentTokenUsage } from './types' import { initTokenizer } from '../tokenizer' +import { streamSimple as defaultStreamSimple } from '../pi-runtime' import { DEFAULT_MAX_TOOL_ROUNDS } from './constants' import { toPiHistoryMessages, type ReplayOptions } from './history' @@ -140,6 +136,8 @@ export async function runAgentCore(options: AgentCoreOptions): Promise() diff --git a/packages/node-runtime/src/ai/agent/planner.ts b/packages/node-runtime/src/ai/agent/planner.ts index e1ca824d..b2b89b2a 100644 --- a/packages/node-runtime/src/ai/agent/planner.ts +++ b/packages/node-runtime/src/ai/agent/planner.ts @@ -1,10 +1,5 @@ -import { - completeSimple, - streamSimple, - type Api as PiApi, - type Model as PiModel, - type TextContent as PiTextContent, -} from '@earendil-works/pi-ai' +import { type Api as PiApi, type Model as PiModel, type TextContent as PiTextContent } from '@earendil-works/pi-ai' +import { completeSimple, streamSimple } from '../pi-runtime' import type { AnalysisPlanIntent, AnalysisPlanSummary, diff --git a/packages/node-runtime/src/ai/agent/router.ts b/packages/node-runtime/src/ai/agent/router.ts index 00df70c6..4c4947d5 100644 --- a/packages/node-runtime/src/ai/agent/router.ts +++ b/packages/node-runtime/src/ai/agent/router.ts @@ -1,11 +1,7 @@ import type { LlmRouteDecider, RouteDecision, RouterInput } from './routing-types' import { formatDataSnapshotForRouter } from './data-snapshot' -import { - completeSimple, - type Api as PiApi, - type Model as PiModel, - type TextContent as PiTextContent, -} from '@earendil-works/pi-ai' +import { type Api as PiApi, type Model as PiModel, type TextContent as PiTextContent } from '@earendil-works/pi-ai' +import { completeSimple } from '../pi-runtime' export interface DecideRequestRouteOptions { llmRouter?: LlmRouteDecider diff --git a/packages/node-runtime/src/ai/agent/types.ts b/packages/node-runtime/src/ai/agent/types.ts index a4aeae35..19f06f32 100644 --- a/packages/node-runtime/src/ai/agent/types.ts +++ b/packages/node-runtime/src/ai/agent/types.ts @@ -44,6 +44,8 @@ export interface AgentCoreOptions { userMessage: string maxToolRounds?: number abortSignal?: AbortSignal + /** Stable AI conversation identifier forwarded to providers that support session affinity. */ + providerSessionId?: string steerMessage?: string /** Override the thinking level for this request. Clamped to what the model supports. */ thinkingLevel?: ThinkingLevel diff --git a/packages/node-runtime/src/ai/compression/adapter-factory.ts b/packages/node-runtime/src/ai/compression/adapter-factory.ts index 25eff5ab..9d5e839d 100644 --- a/packages/node-runtime/src/ai/compression/adapter-factory.ts +++ b/packages/node-runtime/src/ai/compression/adapter-factory.ts @@ -1,9 +1,5 @@ -import { - completeSimple, - type Model as PiModel, - type Api as PiApi, - type TextContent as PiTextContent, -} from '@earendil-works/pi-ai' +import { type Model as PiModel, type Api as PiApi, type TextContent as PiTextContent } from '@earendil-works/pi-ai' +import { completeSimple } from '../pi-runtime' import type { CompressionLlmAdapter } from './types' export interface CreateCompressionLlmAdapterOptions { diff --git a/packages/node-runtime/src/ai/index.ts b/packages/node-runtime/src/ai/index.ts index 686959b4..c7a41902 100644 --- a/packages/node-runtime/src/ai/index.ts +++ b/packages/node-runtime/src/ai/index.ts @@ -203,8 +203,9 @@ export type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core' export { runSimpleLlmStream } from './llm-stream' export type { LlmStreamChunk, RunSimpleLlmStreamOptions } from './llm-stream' -// Re-exports from @earendil-works/pi-ai -export { Type, completeSimple, streamSimple } from '@earendil-works/pi-ai' +// Pi primitives and ChatLab's stable API dispatch +export { Type } from '@earendil-works/pi-ai' +export { completeSimple, streamSimple } from './pi-runtime' export type { Model as PiModel, Api as PiApi, diff --git a/packages/node-runtime/src/ai/llm-stream.ts b/packages/node-runtime/src/ai/llm-stream.ts index f4a479d3..3ad43381 100644 --- a/packages/node-runtime/src/ai/llm-stream.ts +++ b/packages/node-runtime/src/ai/llm-stream.ts @@ -5,8 +5,8 @@ * event mapping, and error handling. */ -import { streamSimple } from '@earendil-works/pi-ai' import type { Model as PiModel, Api as PiApi, Message as PiMessage } from '@earendil-works/pi-ai' +import { streamSimple } from './pi-runtime' export interface LlmStreamChunk { content: string diff --git a/packages/node-runtime/src/ai/pi-runtime.ts b/packages/node-runtime/src/ai/pi-runtime.ts new file mode 100644 index 00000000..6903b01d --- /dev/null +++ b/packages/node-runtime/src/ai/pi-runtime.ts @@ -0,0 +1,50 @@ +import { + lazyApi, + lazyStream, + type Api, + type AssistantMessage, + type AssistantMessageEventStream, + type Context, + type Model, + type ProviderStreams, + type SimpleStreamOptions, +} from '@earendil-works/pi-ai' + +const apiStreams = { + 'openai-completions': lazyApi(() => import('@earendil-works/pi-ai/api/openai-completions')), + 'openai-responses': lazyApi(() => import('@earendil-works/pi-ai/api/openai-responses')), + 'anthropic-messages': lazyApi(() => import('@earendil-works/pi-ai/api/anthropic-messages')), + 'google-generative-ai': lazyApi(() => import('@earendil-works/pi-ai/api/google-generative-ai')), +} satisfies Record + +type SupportedApi = keyof typeof apiStreams + +function isSupportedApi(api: Api): api is SupportedApi { + return Object.hasOwn(apiStreams, api) +} + +/** + * Dispatch a ChatLab model to the stable Pi API implementation selected by its api field. + * ChatLab intentionally supports only the four formats exposed in the model settings UI. + */ +export function streamSimple( + model: Model, + context: Context, + options?: SimpleStreamOptions +): AssistantMessageEventStream { + if (!isSupportedApi(model.api)) { + return lazyStream(model, async () => { + throw new Error(`Unsupported ChatLab AI API format: ${model.api}`) + }) + } + + return apiStreams[model.api].streamSimple(model, context, options) +} + +export function completeSimple( + model: Model, + context: Context, + options?: SimpleStreamOptions +): Promise { + return streamSimple(model, context, options).result() +} diff --git a/packages/node-runtime/src/ai/remote-api.ts b/packages/node-runtime/src/ai/remote-api.ts index b6a7e03d..19591516 100644 --- a/packages/node-runtime/src/ai/remote-api.ts +++ b/packages/node-runtime/src/ai/remote-api.ts @@ -6,8 +6,8 @@ */ import { BUILTIN_PROVIDERS } from '@openchatlab/core' -import { completeSimple } from '@earendil-works/pi-ai' import { buildPiModel, normalizeOpenAICompatibleBaseUrl, type PiModelConfig } from './llm-builder' +import { completeSimple } from './pi-runtime' import type { Model as PiModel, Api as PiApi } from '@earendil-works/pi-ai' export interface RemoteModel { diff --git a/packages/tools/src/definitions/render-chart.test.ts b/packages/tools/src/definitions/render-chart.test.ts index 89b7523f..ab30e7f9 100644 --- a/packages/tools/src/definitions/render-chart.test.ts +++ b/packages/tools/src/definitions/render-chart.test.ts @@ -29,6 +29,10 @@ function createContext( } describe('renderChartTool', () => { + it('requires sequential execution because it depends on the schema gate', () => { + assert.equal(renderChartTool.executionMode, 'sequential') + }) + it('runs parameterized read-only SQL and returns a normalized chart payload', async () => { const calls: Array<{ query: string; params: Record }> = [] const context = createContext( diff --git a/packages/tools/src/definitions/render-chart.ts b/packages/tools/src/definitions/render-chart.ts index bb74d132..dd5e7e81 100644 --- a/packages/tools/src/definitions/render-chart.ts +++ b/packages/tools/src/definitions/render-chart.ts @@ -163,4 +163,5 @@ export const renderChartTool: ToolDefinition = { inputSchema, handler, category: 'analysis', + executionMode: 'sequential', } diff --git a/packages/tools/src/types.ts b/packages/tools/src/types.ts index 7b37e24e..0212eb91 100644 --- a/packages/tools/src/types.ts +++ b/packages/tools/src/types.ts @@ -365,6 +365,7 @@ export interface ToolResult { export type ToolCategory = 'core' | 'analysis' export type TruncationStrategy = 'keep_first' | 'keep_last' +export type ToolExecutionMode = 'parallel' | 'sequential' /** * 平台无关的工具定义 @@ -378,4 +379,6 @@ export interface ToolDefinition { handler: (params: Record, context: ToolExecutionContext) => ToolResult | Promise category?: ToolCategory truncationStrategy?: TruncationStrategy + /** Override the Agent's parallel default when this tool has an ordering dependency. */ + executionMode?: ToolExecutionMode } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4478a5e8..67966b6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,10 +59,10 @@ importers: version: 5.0.1(vue@3.5.27(typescript@6.0.3)) '@nuxt/icon': specifier: 2.3.1 - version: 2.3.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3)) + version: 2.3.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3)) '@nuxt/ui': specifier: ^4.9.0 - version: 4.9.0(3f9cda6f0cb3ad58d8572c25ffaffe79) + version: 4.9.0(9a4bfa61820672fc57117cde58084b68) '@openchatlab/ai-runtime': specifier: workspace:* version: link:packages/ai-runtime @@ -89,13 +89,13 @@ importers: version: link:packages/web-runtime '@tailwindcss/vite': specifier: ^4.0.0 - version: 4.1.18(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@types/markdown-it': specifier: ^14.1.2 version: 14.1.2 '@vitejs/plugin-vue': specifier: ^6.0.0 - version: 6.0.7(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3)) + version: 6.0.7(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 version: 10.2.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.8.1) @@ -134,7 +134,7 @@ importers: version: 6.0.3 vite: specifier: ^7.0.0 - version: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) vue: specifier: ^3.5.25 version: 3.5.27(typescript@6.0.3) @@ -151,11 +151,11 @@ importers: apps/cli: dependencies: '@earendil-works/pi-agent-core': - specifier: 0.74.2 - version: 0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) + specifier: 0.83.0 + version: 0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) '@earendil-works/pi-ai': - specifier: 0.74.2 - version: 0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) + specifier: 0.83.0 + version: 0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) '@fastify/multipart': specifier: ^10.0.0 version: 10.0.0 @@ -225,7 +225,7 @@ importers: version: link:../../packages/mcp-server tsup: specifier: ^8.5.0 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.19)(supports-color@7.2.0)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.7.0)(postcss@8.5.19)(supports-color@7.2.0)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -320,7 +320,7 @@ importers: version: 26.15.7(electron-builder-squirrel-windows@26.15.7)(supports-color@7.2.0) electron-vite: specifier: ^5.0.0 - version: 5.0.0(supports-color@7.2.0)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.0.0(supports-color@7.2.0)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) docs: devDependencies: @@ -411,7 +411,7 @@ importers: version: link:../tools tsup: specifier: ^8.5.0 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.19)(supports-color@7.2.0)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.7.0)(postcss@8.5.19)(supports-color@7.2.0)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0) optionalDependencies: '@node-rs/jieba': specifier: ^2.0.1 @@ -420,11 +420,11 @@ importers: packages/node-runtime: dependencies: '@earendil-works/pi-agent-core': - specifier: 0.74.2 - version: 0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) + specifier: 0.83.0 + version: 0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) '@earendil-works/pi-ai': - specifier: 0.74.2 - version: 0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) + specifier: 0.83.0 + version: 0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) '@huggingface/transformers': specifier: ^4.2.0 version: 4.2.0 @@ -695,8 +695,8 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-bedrock-runtime@3.1053.0': - resolution: {integrity: sha512-I5dua8y1logE+Mx6r5kvI1tjM+XyC3H42KDCpEqmhrJfanor/x/AdOavyv3HnS4sBqUxx2IrjLP3ouEumjeTzA==} + '@aws-sdk/client-bedrock-runtime@3.1048.0': + resolution: {integrity: sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==} engines: {node: '>=20.0.0'} '@aws-sdk/core@3.974.13': @@ -755,12 +755,12 @@ packages: resolution: {integrity: sha512-qs9z5LqXO/CZC2Lg9SGKpoLU8Rhi+m2pFKZqfO9pytX1clc0katqtsDNupJxFy0xT9wsZSPzM2v1y+/H/zfp5Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1052.0': - resolution: {integrity: sha512-QqZNB3so7UIDxZtroc85TQaLVxdZRFm0eWM1CSR2N+b06as9TOrilvrlTZuj3guYlxMs6yLOgGxnklJ5qMYtTw==} + '@aws-sdk/token-providers@3.1048.0': + resolution: {integrity: sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1053.0': - resolution: {integrity: sha512-laSwHLYMMrXQRl2mFDXszF43m/F4pKWyGr7hCLfJmV8rn8c6CnI/hp/bf/Gn7gLcjz0SY4evd7SBpqtnIhzA/A==} + '@aws-sdk/token-providers@3.1052.0': + resolution: {integrity: sha512-QqZNB3so7UIDxZtroc85TQaLVxdZRFm0eWM1CSR2N+b06as9TOrilvrlTZuj3guYlxMs6yLOgGxnklJ5qMYtTw==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.9': @@ -887,13 +887,13 @@ packages: search-insights: optional: true - '@earendil-works/pi-agent-core@0.74.2': - resolution: {integrity: sha512-RPlB3bi2z+VQK0HRhBK73kXOQI1fFmRgWzzT6+ihB7JYfh29jb7eAfYvpx8rlf248gUAYaLQ8JYa+43l09rPmQ==} - engines: {node: '>=20.0.0'} + '@earendil-works/pi-agent-core@0.83.0': + resolution: {integrity: sha512-RorGp9OH5l3ElpuC5a5ZQ2eWcchZGXflXRzVGkV99y3y6tT+LLNyxoYIdVKvTKWEObwhExeQbTH0fI2tE4iX4g==} + engines: {node: '>=22.19.0'} - '@earendil-works/pi-ai@0.74.2': - resolution: {integrity: sha512-ukQBHGDm20k9ZUS2cGjNN9vDJp/48r35xmvgSx3paCaC06r2N/PLuRZoJmwQ1ZM7f8T3072odv9YPWn+77w0LA==} - engines: {node: '>=20.0.0'} + '@earendil-works/pi-ai@0.83.0': + resolution: {integrity: sha512-m3IZD4g3er0V8TC9+Vpgw/sjTKqcJlkcIBy/JvsgRubuuik3tAVzyugUg4rVrShIkkOT69mEd34NEqKUIsl6JQ==} + engines: {node: '>=22.19.0'} hasBin: true '@electron-toolkit/preload@3.0.2': @@ -1499,8 +1499,8 @@ packages: '@floating-ui/vue@1.1.10': resolution: {integrity: sha512-vdf8f6rHnFPPLRsmL4p12wYl+Ux4mOJOkjzKEMYVnwdf7UFdvBtHlLvQyx8iKG5vhPRbDRgZxdtpmyigDPjzYg==} - '@google/genai@1.42.0': - resolution: {integrity: sha512-+3nlMTcrQufbQ8IumGkOphxD5Pd5kKyJOzLcnY0/1IuE8upJk5aLmoexZ2BJhBp1zAjRJMEB4a2CJwKI9e2EYw==} + '@google/genai@1.52.0': + resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -1904,8 +1904,13 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} - '@mistralai/mistralai@2.2.1': - resolution: {integrity: sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==} + '@mistralai/mistralai@2.2.6': + resolution: {integrity: sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ==} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true '@modelcontextprotocol/sdk@1.29.0': resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} @@ -2517,6 +2522,14 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@peculiar/asn1-schema@2.9.0': resolution: {integrity: sha512-AKvPMOM7LfK0uFe1m7o7+veOa8xQGPqsqOrKi3QKgCElzwjGp39mbhr2g7mt/v/mXQHiIvJmDj5cJS173x8Q9Q==} @@ -2766,6 +2779,10 @@ packages: resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} + '@smithy/node-http-handler@4.7.3': + resolution: {integrity: sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.7.4': resolution: {integrity: sha512-HIeF+1vrDGzPkkv39Hj2vlHSXHY3p958jd/8ZnePIY6+ZOsQX8coyEUKO5yQu4r0bQIVsbpotVIrXXwyycMStQ==} engines: {node: '>=18.0.0'} @@ -4148,6 +4165,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dir-compare@4.2.0: resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} @@ -6748,8 +6769,8 @@ packages: type-level-regexp@0.1.17: resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} - typebox@1.1.38: - resolution: {integrity: sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==} + typebox@1.3.7: + resolution: {integrity: sha512-meKuifc33Pccx0O6PdIzYMq3Og8zvP4TIi/a+Bw3AEMZMxOD0+RHGQvpglEe6Zdy3wZ8nqn/j95h8LUZLk/6Hg==} typescript-eslint@8.64.0: resolution: {integrity: sha512-0qg+pDNMnqYzqH9AnNK+39tejHvsShUOUUoRUgtnTGE7QuMZhiFDnozq8nHJVq+Wae6NMLKNWLg5WmkcC/ndyQ==} @@ -7219,8 +7240,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -7451,7 +7472,7 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-bedrock-runtime@3.1053.0': + '@aws-sdk/client-bedrock-runtime@3.1048.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -7460,7 +7481,7 @@ snapshots: '@aws-sdk/eventstream-handler-node': 3.972.17 '@aws-sdk/middleware-eventstream': 3.972.13 '@aws-sdk/middleware-websocket': 3.972.21 - '@aws-sdk/token-providers': 3.1053.0 + '@aws-sdk/token-providers': 3.1048.0 '@aws-sdk/types': 3.973.9 '@smithy/core': 3.24.4 '@smithy/fetch-http-handler': 5.4.4 @@ -7608,7 +7629,7 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1052.0': + '@aws-sdk/token-providers@3.1048.0': dependencies: '@aws-sdk/core': 3.974.13 '@aws-sdk/nested-clients': 3.997.11 @@ -7617,7 +7638,7 @@ snapshots: '@smithy/types': 4.14.2 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1053.0': + '@aws-sdk/token-providers@3.1052.0': dependencies: '@aws-sdk/core': 3.974.13 '@aws-sdk/nested-clients': 3.997.11 @@ -7781,12 +7802,13 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@earendil-works/pi-agent-core@0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76)': + '@earendil-works/pi-agent-core@0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76)': dependencies: - '@earendil-works/pi-ai': 0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) + '@earendil-works/pi-ai': 0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76) + diff: 8.0.4 ignore: 7.0.5 - typebox: 1.1.38 - yaml: 2.8.2 + typebox: 1.3.7 + yaml: 2.9.0 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil @@ -7795,17 +7817,19 @@ snapshots: - ws - zod - '@earendil-works/pi-ai@0.74.2(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76)': + '@earendil-works/pi-ai@0.83.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)(ws@8.19.0)(zod@3.25.76)': dependencies: '@anthropic-ai/sdk': 0.91.1(zod@3.25.76) - '@aws-sdk/client-bedrock-runtime': 3.1053.0 - '@google/genai': 1.42.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0) - '@mistralai/mistralai': 2.2.1 + '@aws-sdk/client-bedrock-runtime': 3.1048.0 + '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0) + '@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.0 + '@smithy/node-http-handler': 4.7.3 http-proxy-agent: 7.0.2(supports-color@7.2.0) https-proxy-agent: 7.0.6(supports-color@7.2.0) openai: 6.26.0(ws@8.19.0)(zod@3.25.76) partial-json: 0.1.7 - typebox: 1.1.38 + typebox: 1.3.7 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil @@ -8282,7 +8306,7 @@ snapshots: - '@vue/composition-api' - vue - '@google/genai@1.42.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)': + '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@3.25.76))(supports-color@7.2.0)': dependencies: google-auth-library: 10.5.0(supports-color@7.2.0) p-retry: 4.6.2 @@ -8633,11 +8657,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@mistralai/mistralai@2.2.1': + '@mistralai/mistralai@2.2.6(@opentelemetry/api@1.9.0)': dependencies: + '@opentelemetry/semantic-conventions': 1.43.0 ws: 8.19.0 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + '@opentelemetry/api': 1.9.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -9016,21 +9043,21 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nuxt/devtools-kit@3.2.4(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': + '@nuxt/devtools-kit@3.2.4(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@nuxt/kit': 4.4.8 execa: 8.0.1 - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - magicast - '@nuxt/fonts@0.14.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': + '@nuxt/fonts@0.14.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: - '@nuxt/devtools-kit': 3.2.4(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + '@nuxt/devtools-kit': 3.2.4(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@nuxt/kit': 4.4.8 consola: 3.4.2 defu: 6.1.7 - fontless: 0.2.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + fontless: 0.2.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) h3: 1.15.5 magic-regexp: 0.10.0 ofetch: 1.5.1 @@ -9039,7 +9066,7 @@ snapshots: tinyglobby: 0.2.17 ufo: 1.6.4 unifont: 0.7.4 - unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) unstorage: 1.17.4 transitivePeerDependencies: - '@azure/app-configuration' @@ -9072,13 +9099,13 @@ snapshots: - vite - webpack - '@nuxt/icon@2.3.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3))': + '@nuxt/icon@2.3.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3))': dependencies: '@iconify/collections': 1.0.710 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.4 '@iconify/vue': 5.0.1(vue@3.5.27(typescript@6.0.3)) - '@nuxt/devtools-kit': 3.2.4(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + '@nuxt/devtools-kit': 3.2.4(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@nuxt/kit': 4.4.8 consola: 3.4.2 local-pkg: 1.2.1 @@ -9126,18 +9153,18 @@ snapshots: pkg-types: 2.3.1 std-env: 4.2.0 - '@nuxt/ui@4.9.0(3f9cda6f0cb3ad58d8572c25ffaffe79)': + '@nuxt/ui@4.9.0(9a4bfa61820672fc57117cde58084b68)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.27(typescript@6.0.3)) - '@nuxt/fonts': 0.14.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) - '@nuxt/icon': 2.3.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3)) + '@nuxt/fonts': 0.14.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + '@nuxt/icon': 2.3.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3)) '@nuxt/kit': 4.4.8 '@nuxt/schema': 4.4.8 '@nuxtjs/color-mode': 4.0.1 '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.2 - '@tailwindcss/vite': 4.3.2(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + '@tailwindcss/vite': 4.3.2(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/vue-table': 8.21.3(vue@3.5.27(typescript@6.0.3)) '@tanstack/vue-virtual': 3.13.32(vue@3.5.27(typescript@6.0.3)) '@tiptap/core': 3.19.0(@tiptap/pm@3.19.0) @@ -9187,9 +9214,9 @@ snapshots: tinyglobby: 0.2.17 typescript: 6.0.3 ufo: 1.6.4 - unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8)(@vueuse/core@14.3.0(vue@3.5.27(typescript@6.0.3))) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8)(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3)) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8)(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.9.10(vue@3.5.27(typescript@6.0.3)))(vue@3.5.27(typescript@6.0.3)) vue-component-type-helpers: 3.3.7 optionalDependencies: @@ -9317,6 +9344,10 @@ snapshots: dependencies: '@octokit/openapi-types': 27.0.0 + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@peculiar/asn1-schema@2.9.0': dependencies: '@peculiar/utils': 2.0.3 @@ -9516,6 +9547,12 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/node-http-handler@4.7.3': + dependencies: + '@smithy/core': 3.24.4 + '@smithy/types': 4.14.2 + tslib: 2.8.1 + '@smithy/node-http-handler@4.7.4': dependencies: '@smithy/core': 3.24.4 @@ -9684,19 +9721,19 @@ snapshots: postcss: 8.5.19 tailwindcss: 4.3.2 - '@tailwindcss/vite@4.1.18(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.18(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) - '@tailwindcss/vite@4.3.2(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.3.2(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.2 '@tailwindcss/oxide': 4.3.2 tailwindcss: 4.3.2 - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) '@tanstack/table-core@8.21.3': {} @@ -10153,10 +10190,10 @@ snapshots: vite: 5.4.21(@types/node@25.2.2)(lightningcss@1.32.0) vue: 3.5.27(typescript@6.0.3) - '@vitejs/plugin-vue@6.0.7(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.7(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) vue: 3.5.27(typescript@6.0.3) '@volar/language-core@2.4.28': @@ -10906,6 +10943,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@8.0.4: {} + dir-compare@4.2.0: dependencies: minimatch: 3.1.2 @@ -11016,7 +11055,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@5.0.0(supports-color@7.2.0)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)): + electron-vite@5.0.0(supports-color@7.2.0)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.0(supports-color@7.2.0) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0(supports-color@7.2.0)) @@ -11024,7 +11063,7 @@ snapshots: esbuild: 0.25.12 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -11598,7 +11637,7 @@ snapshots: dependencies: tiny-inflate: 1.0.3 - fontless@0.2.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)): + fontless@0.2.1(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: consola: 3.4.2 css-tree: 3.1.0 @@ -11614,7 +11653,7 @@ snapshots: unifont: 0.7.4 unstorage: 1.17.4 optionalDependencies: - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12839,14 +12878,14 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.19)(tsx@4.21.0)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.19)(tsx@4.21.0)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.7.0 postcss: 8.5.19 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 postcss-selector-parser@6.1.2: dependencies: @@ -13676,7 +13715,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.7.0)(postcss@8.5.19)(supports-color@7.2.0)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.2): + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.19)(supports-color@7.2.0)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 @@ -13687,7 +13726,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.19)(tsx@4.21.0)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.19)(tsx@4.21.0)(yaml@2.9.0) resolve-from: 5.0.0 rollup: 4.57.1 source-map: 0.7.6 @@ -13733,7 +13772,7 @@ snapshots: type-level-regexp@0.1.17: {} - typebox@1.1.38: {} + typebox@1.3.7: {} typescript-eslint@8.64.0(eslint@9.39.2(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: @@ -13844,7 +13883,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.5 - unplugin-vue-components@32.1.0(@nuxt/kit@4.4.8)(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.27(typescript@6.0.3)): + unplugin-vue-components@32.1.0(@nuxt/kit@4.4.8)(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.27(typescript@6.0.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.2.1 @@ -13853,7 +13892,7 @@ snapshots: obug: 2.1.3 picomatch: 4.0.5 tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)) + unplugin: 3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) unplugin-utils: 0.3.1 vue: 3.5.27(typescript@6.0.3) optionalDependencies: @@ -13876,7 +13915,7 @@ snapshots: picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 - unplugin@3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2)): + unplugin@3.3.0(esbuild@0.27.7)(rollup@4.57.1)(vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.5 @@ -13884,7 +13923,7 @@ snapshots: optionalDependencies: esbuild: 0.27.7 rollup: 4.57.1 - vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) unstorage@1.17.4: dependencies: @@ -13957,7 +13996,7 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.32.0 - vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.3(@types/node@25.2.2)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.3) @@ -13971,7 +14010,7 @@ snapshots: jiti: 2.7.0 lightningcss: 1.32.0 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 vitepress@1.6.4(@algolia/client-search@5.52.1)(@types/node@25.2.2)(axios@1.13.5(debug@4.4.3(supports-color@7.2.0)))(fuse.js@7.5.0)(lightningcss@1.32.0)(postcss@8.5.19)(search-insights@2.17.3)(typescript@6.0.3): dependencies: @@ -14148,7 +14187,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.2: {} + yaml@2.9.0: {} yargs-parser@21.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7e2d088f..072f4d7d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,6 +8,7 @@ resolutionMode: highest shamefullyHoist: true allowBuilds: + '@google/genai': false better-sqlite3: true electron: true electron-winstaller: false