diff --git a/package-lock.json b/package-lock.json index 2fd6a7df..0dcce1dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6159,11 +6159,11 @@ }, "packages/agent": { "name": "@mariozechner/pi-agent-core", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-tui": "^0.23.1" + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-tui": "^0.23.2" }, "devDependencies": { "@types/node": "^24.3.0", @@ -6193,7 +6193,7 @@ }, "packages/ai": { "name": "@mariozechner/pi-ai", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { "@anthropic-ai/sdk": "0.71.2", @@ -6235,12 +6235,12 @@ }, "packages/coding-agent": { "name": "@mariozechner/pi-coding-agent", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { - "@mariozechner/pi-agent-core": "^0.23.1", - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-tui": "^0.23.1", + "@mariozechner/pi-agent-core": "^0.23.2", + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-tui": "^0.23.2", "chalk": "^5.5.0", "diff": "^8.0.2", "file-type": "^21.1.1", @@ -6279,13 +6279,13 @@ }, "packages/mom": { "name": "@mariozechner/pi-mom", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { "@anthropic-ai/sandbox-runtime": "^0.0.16", - "@mariozechner/pi-agent-core": "^0.23.1", - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-coding-agent": "^0.23.1", + "@mariozechner/pi-agent-core": "^0.23.2", + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-coding-agent": "^0.23.2", "@sinclair/typebox": "^0.34.0", "@slack/socket-mode": "^2.0.0", "@slack/web-api": "^7.0.0", @@ -6324,10 +6324,10 @@ }, "packages/pods": { "name": "@mariozechner/pi", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { - "@mariozechner/pi-agent-core": "^0.23.1", + "@mariozechner/pi-agent-core": "^0.23.2", "chalk": "^5.5.0" }, "bin": { @@ -6340,7 +6340,7 @@ }, "packages/proxy": { "name": "@mariozechner/pi-proxy", - "version": "0.23.1", + "version": "0.23.2", "dependencies": { "@hono/node-server": "^1.14.0", "hono": "^4.6.16" @@ -6356,7 +6356,7 @@ }, "packages/tui": { "name": "@mariozechner/pi-tui", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { "@types/mime-types": "^2.1.4", @@ -6400,12 +6400,12 @@ }, "packages/web-ui": { "name": "@mariozechner/pi-web-ui", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { "@lmstudio/sdk": "^1.5.0", - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-tui": "^0.23.1", + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-tui": "^0.23.2", "docx-preview": "^0.3.7", "jszip": "^3.10.1", "lucide": "^0.544.0", @@ -6426,7 +6426,7 @@ }, "packages/web-ui/example": { "name": "pi-web-ui-example", - "version": "1.11.1", + "version": "1.11.2", "dependencies": { "@mariozechner/mini-lit": "^0.2.0", "@mariozechner/pi-ai": "file:../../ai", diff --git a/packages/agent/package.json b/packages/agent/package.json index f1dae67e..04bddcfb 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-agent-core", - "version": "0.23.1", + "version": "0.23.2", "description": "General-purpose agent with transport abstraction, state management, and attachment support", "type": "module", "main": "./dist/index.js", @@ -18,8 +18,8 @@ "prepublishOnly": "npm run clean && npm run build" }, "dependencies": { - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-tui": "^0.23.1" + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-tui": "^0.23.2" }, "keywords": [ "ai", diff --git a/packages/ai/package.json b/packages/ai/package.json index 828f662c..9f86d4c0 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-ai", - "version": "0.23.1", + "version": "0.23.2", "description": "Unified LLM API with automatic model discovery and provider configuration", "type": "module", "main": "./dist/index.js", diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index f5a0c9b8..0be47021 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -364,6 +364,23 @@ export const MODELS = { } satisfies Model<"anthropic-messages">, }, "google": { + "gemini-3-flash-preview": { + id: "gemini-3-flash-preview", + name: "Gemini 3 Flash Preview", + api: "google-generative-ai", + provider: "google", + baseUrl: "https://generativelanguage.googleapis.com/v1beta", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0.15, + output: 0.6, + cacheRead: 0.0375, + cacheWrite: 0, + }, + contextWindow: 1048576, + maxTokens: 65536, + } satisfies Model<"google-generative-ai">, "gemini-2.5-flash-preview-05-20": { id: "gemini-2.5-flash-preview-05-20", name: "Gemini 2.5 Flash Preview 05-20", @@ -2805,6 +2822,23 @@ export const MODELS = { } satisfies Model<"openai-completions">, }, "openrouter": { + "google/gemini-3-flash-preview": { + id: "google/gemini-3-flash-preview", + name: "Google: Gemini 3 Flash Preview", + api: "openai-completions", + provider: "openrouter", + baseUrl: "https://openrouter.ai/api/v1", + reasoning: true, + input: ["text", "image"], + cost: { + input: 0.5, + output: 3, + cacheRead: 0.049999999999999996, + cacheWrite: 0, + }, + contextWindow: 1048576, + maxTokens: 65535, + } satisfies Model<"openai-completions">, "mistralai/mistral-small-creative": { id: "mistralai/mistral-small-creative", name: "Mistral: Mistral Small Creative", diff --git a/packages/ai/src/providers/openai-completions.ts b/packages/ai/src/providers/openai-completions.ts index beb1b010..3b99b86e 100644 --- a/packages/ai/src/providers/openai-completions.ts +++ b/packages/ai/src/providers/openai-completions.ts @@ -302,13 +302,11 @@ function createClient(model: Model<"openai-completions">, context: Context, apiK const headers = { ...model.headers }; if (model.provider === "github-copilot") { // Copilot expects X-Initiator to indicate whether the request is user-initiated - // or agent-initiated (e.g. follow-up after assistant/tool messages). If there is - // no prior message, default to user-initiated. + // or agent-initiated. It's an agent call if ANY message in history has assistant/tool role. const messages = context.messages || []; - const lastMessage = messages[messages.length - 1]; - const isAgentCall = lastMessage ? lastMessage.role !== "user" : false; - const initiatorValue = isAgentCall ? "agent" : "user"; - headers["X-Initiator"] = initiatorValue; + const isAgentCall = messages.some((msg) => msg.role === "assistant" || msg.role === "toolResult"); + headers["X-Initiator"] = isAgentCall ? "agent" : "user"; + headers["Openai-Intent"] = "conversation-edits"; } return new OpenAI({ @@ -431,9 +429,15 @@ function convertMessages( const textBlocks = msg.content.filter((b) => b.type === "text") as TextContent[]; if (textBlocks.length > 0) { - assistantMsg.content = textBlocks.map((b) => { - return { type: "text", text: sanitizeSurrogates(b.text) }; - }); + // GitHub Copilot requires assistant content as a string, not an array. + // Sending as array causes Claude models to re-answer all previous prompts. + if (model.provider === "github-copilot") { + assistantMsg.content = textBlocks.map((b) => sanitizeSurrogates(b.text)).join(""); + } else { + assistantMsg.content = textBlocks.map((b) => { + return { type: "text", text: sanitizeSurrogates(b.text) }; + }); + } } // Handle thinking blocks diff --git a/packages/ai/src/providers/openai-responses.ts b/packages/ai/src/providers/openai-responses.ts index a52f8e7e..b10ad93d 100644 --- a/packages/ai/src/providers/openai-responses.ts +++ b/packages/ai/src/providers/openai-responses.ts @@ -310,13 +310,11 @@ function createClient(model: Model<"openai-responses">, context: Context, apiKey const headers = { ...model.headers }; if (model.provider === "github-copilot") { // Copilot expects X-Initiator to indicate whether the request is user-initiated - // or agent-initiated (e.g. follow-up after assistant/tool messages). If there is - // no prior message, default to user-initiated. + // or agent-initiated. It's an agent call if ANY message in history has assistant/tool role. const messages = context.messages || []; - const lastMessage = messages[messages.length - 1]; - const isAgentCall = lastMessage ? lastMessage.role !== "user" : false; - const initiatorValue = isAgentCall ? "agent" : "user"; - headers["X-Initiator"] = initiatorValue; + const isAgentCall = messages.some((msg) => msg.role === "assistant" || msg.role === "toolResult"); + headers["X-Initiator"] = isAgentCall ? "agent" : "user"; + headers["Openai-Intent"] = "conversation-edits"; } return new OpenAI({ diff --git a/packages/ai/test/.temp-images/size-1mb.png b/packages/ai/test/.temp-images/size-1mb.png new file mode 100644 index 00000000..b6cda334 Binary files /dev/null and b/packages/ai/test/.temp-images/size-1mb.png differ diff --git a/packages/ai/test/.temp-images/size-2mb.png b/packages/ai/test/.temp-images/size-2mb.png new file mode 100644 index 00000000..8051b400 Binary files /dev/null and b/packages/ai/test/.temp-images/size-2mb.png differ diff --git a/packages/ai/test/.temp-images/small.png b/packages/ai/test/.temp-images/small.png new file mode 100644 index 00000000..4443fcc9 Binary files /dev/null and b/packages/ai/test/.temp-images/small.png differ diff --git a/packages/ai/test/copilot-initiator.test.ts b/packages/ai/test/copilot-initiator.test.ts index 3c91351f..4098f640 100644 --- a/packages/ai/test/copilot-initiator.test.ts +++ b/packages/ai/test/copilot-initiator.test.ts @@ -93,7 +93,7 @@ async function consumeStream(stream: AsyncIterable): Promise { } } -describe("GitHub Copilot X-Initiator Header", () => { +describe("GitHub Copilot Headers", () => { beforeEach(() => { lastOpenAIConfig = undefined; }); @@ -136,171 +136,201 @@ describe("GitHub Copilot X-Initiator Header", () => { provider: "openai", }; - it("completions: sets X-Initiator: user when last message is from user (Copilot)", async () => { - const context: Context = { - messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], - }; + const assistantMessage = { + role: "assistant" as const, + content: [], + api: "openai-completions" as const, + provider: "github-copilot" as const, + model: "gpt-4", + usage: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 0, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, + }, + stopReason: "stop" as const, + timestamp: Date.now(), + }; - const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const toolResultMessage = { + role: "toolResult" as const, + content: [], + toolCallId: "1", + toolName: "test", + isError: false, + timestamp: Date.now(), + }; - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); + describe("completions API", () => { + it("sets X-Initiator: user for first message (no history)", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], + }; + + const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); + }); + + it("sets X-Initiator: agent when assistant message exists in history", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }, assistantMessage], + }; + + const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); + }); + + it("sets X-Initiator: agent when toolResult exists in history", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }, toolResultMessage], + }; + + const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); + }); + + it("sets X-Initiator: agent for multi-turn conversation (last is user, but assistant in history)", async () => { + const context: Context = { + messages: [ + { role: "user", content: "Hello", timestamp: Date.now() }, + assistantMessage, + { role: "user", content: "Tell me a joke", timestamp: Date.now() }, + ], + }; + + const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); + }); + + it("sets X-Initiator: user when there are no messages", async () => { + const context: Context = { + messages: [], + }; + + const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); + }); + + it("sets Openai-Intent: conversation-edits", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], + }; + + const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["Openai-Intent"]).toBe("conversation-edits"); + }); + + it("does NOT set Copilot headers for non-Copilot providers", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], + }; + + const stream = streamOpenAICompletions(otherCompletionsModel, context, { apiKey: "test-key" }); + await consumeStream(stream); + + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBeUndefined(); + expect(lastOpenAIConfig?.defaultHeaders?.["Openai-Intent"]).toBeUndefined(); + }); }); - it("completions: sets X-Initiator: agent when last message is from assistant (Copilot)", async () => { - const context: Context = { - messages: [ - { role: "user", content: "Hello", timestamp: Date.now() }, - { - role: "assistant", - content: [], - api: "openai-completions", - provider: "github-copilot", - model: "gpt-4", - usage: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - totalTokens: 0, - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, - }, - stopReason: "stop", - timestamp: Date.now(), - }, - ], - }; + describe("responses API", () => { + it("sets X-Initiator: user for first message (no history)", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], + }; - const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); - }); + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); + }); - it("completions: sets X-Initiator: agent when last message is from toolResult (Copilot)", async () => { - const context: Context = { - messages: [ - { role: "user", content: "Hello", timestamp: Date.now() }, - { - role: "toolResult", - content: [], - toolCallId: "1", - toolName: "test", - isError: false, - timestamp: Date.now(), - }, - ], - }; + it("sets X-Initiator: agent when assistant message exists in history", async () => { + const context: Context = { + messages: [ + { role: "user", content: "Hello", timestamp: Date.now() }, + { ...assistantMessage, api: "openai-responses" as const, model: "gpt-5.1-codex" }, + ], + }; - const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); - }); + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); + }); - it("completions: defaults to X-Initiator: user when there are no messages (Copilot)", async () => { - const context: Context = { - messages: [], - }; + it("sets X-Initiator: agent when toolResult exists in history", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }, toolResultMessage], + }; - const stream = streamOpenAICompletions(copilotCompletionsModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); - }); + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); + }); - it("completions: does NOT set X-Initiator for non-Copilot providers", async () => { - const context: Context = { - messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], - }; + it("sets X-Initiator: agent for multi-turn conversation (last is user, but assistant in history)", async () => { + const context: Context = { + messages: [ + { role: "user", content: "Hello", timestamp: Date.now() }, + { ...assistantMessage, api: "openai-responses" as const, model: "gpt-5.1-codex" }, + { role: "user", content: "Tell me a joke", timestamp: Date.now() }, + ], + }; - const stream = streamOpenAICompletions(otherCompletionsModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBeUndefined(); - }); + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); + }); - it("responses: sets X-Initiator: user when last message is from user (Copilot)", async () => { - const context: Context = { - messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], - }; + it("sets X-Initiator: user when there are no messages", async () => { + const context: Context = { + messages: [], + }; - const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); - }); + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); + }); - it("responses: sets X-Initiator: agent when last message is from assistant (Copilot)", async () => { - const context: Context = { - messages: [ - { role: "user", content: "Hello", timestamp: Date.now() }, - { - role: "assistant", - content: [], - api: "openai-responses", - provider: "github-copilot", - model: "gpt-5.1-codex", - usage: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - totalTokens: 0, - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, - }, - stopReason: "stop", - timestamp: Date.now(), - }, - ], - }; + it("sets Openai-Intent: conversation-edits", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], + }; - const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); - }); + expect(lastOpenAIConfig?.defaultHeaders?.["Openai-Intent"]).toBe("conversation-edits"); + }); - it("responses: sets X-Initiator: agent when last message is from toolResult (Copilot)", async () => { - const context: Context = { - messages: [ - { role: "user", content: "Hello", timestamp: Date.now() }, - { - role: "toolResult", - content: [], - toolCallId: "1", - toolName: "test", - isError: false, - timestamp: Date.now(), - }, - ], - }; + it("does NOT set Copilot headers for non-Copilot providers", async () => { + const context: Context = { + messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], + }; - const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); - await consumeStream(stream); + const stream = streamOpenAIResponses(otherResponsesModel, context, { apiKey: "test-key" }); + await consumeStream(stream); - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("agent"); - }); - - it("responses: defaults to X-Initiator: user when there are no messages (Copilot)", async () => { - const context: Context = { - messages: [], - }; - - const stream = streamOpenAIResponses(copilotResponsesModel, context, { apiKey: "test-key" }); - await consumeStream(stream); - - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBe("user"); - }); - - it("responses: does NOT set X-Initiator for non-Copilot providers", async () => { - const context: Context = { - messages: [{ role: "user", content: "Hello", timestamp: Date.now() }], - }; - - const stream = streamOpenAIResponses(otherResponsesModel, context, { apiKey: "test-key" }); - await consumeStream(stream); - - expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBeUndefined(); + expect(lastOpenAIConfig?.defaultHeaders?.["X-Initiator"]).toBeUndefined(); + expect(lastOpenAIConfig?.defaultHeaders?.["Openai-Intent"]).toBeUndefined(); + }); }); }); diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index e0ab21b4..2f56e413 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,8 +2,12 @@ ## [Unreleased] +## [0.23.2] - 2025-12-17 + ### Fixed +- Fixed Claude models via GitHub Copilot re-answering all previous prompts in multi-turn conversations. The issue was that assistant message content was sent as an array instead of a string, which Copilot's Claude adapter misinterpreted. Also added missing `Openai-Intent: conversation-edits` header and fixed `X-Initiator` logic to check for any assistant/tool message in history. ([#209](https://github.com/badlogic/pi-mono/issues/209)) + - Detect image MIME type via file magic (read tool and `@file` attachments), not filename extension. - Fixed markdown tables overflowing terminal width. Tables now wrap cell contents to fit available width instead of breaking borders mid-row. ([#206](https://github.com/badlogic/pi-mono/pull/206) by [@kim0](https://github.com/kim0)) diff --git a/packages/coding-agent/package.json b/packages/coding-agent/package.json index b59bf1aa..46a63e5c 100644 --- a/packages/coding-agent/package.json +++ b/packages/coding-agent/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-coding-agent", - "version": "0.23.1", + "version": "0.23.2", "description": "Coding agent CLI with read, bash, edit, write tools and session management", "type": "module", "piConfig": { @@ -40,9 +40,9 @@ "prepublishOnly": "npm run clean && npm run build" }, "dependencies": { - "@mariozechner/pi-agent-core": "^0.23.1", - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-tui": "^0.23.1", + "@mariozechner/pi-agent-core": "^0.23.2", + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-tui": "^0.23.2", "chalk": "^5.5.0", "diff": "^8.0.2", "file-type": "^21.1.1", diff --git a/packages/mom/package.json b/packages/mom/package.json index 1991850e..ba0a4273 100644 --- a/packages/mom/package.json +++ b/packages/mom/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-mom", - "version": "0.23.1", + "version": "0.23.2", "description": "Slack bot that delegates messages to the pi coding agent", "type": "module", "bin": { @@ -21,9 +21,9 @@ }, "dependencies": { "@anthropic-ai/sandbox-runtime": "^0.0.16", - "@mariozechner/pi-agent-core": "^0.23.1", - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-coding-agent": "^0.23.1", + "@mariozechner/pi-agent-core": "^0.23.2", + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-coding-agent": "^0.23.2", "@sinclair/typebox": "^0.34.0", "@slack/socket-mode": "^2.0.0", "@slack/web-api": "^7.0.0", diff --git a/packages/pods/package.json b/packages/pods/package.json index 463550c2..f8410927 100644 --- a/packages/pods/package.json +++ b/packages/pods/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi", - "version": "0.23.1", + "version": "0.23.2", "description": "CLI tool for managing vLLM deployments on GPU pods", "type": "module", "bin": { @@ -34,7 +34,7 @@ "node": ">=20.0.0" }, "dependencies": { - "@mariozechner/pi-agent-core": "^0.23.1", + "@mariozechner/pi-agent-core": "^0.23.2", "chalk": "^5.5.0" }, "devDependencies": {} diff --git a/packages/proxy/package.json b/packages/proxy/package.json index 0b936c6b..e3830610 100644 --- a/packages/proxy/package.json +++ b/packages/proxy/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-proxy", - "version": "0.23.1", + "version": "0.23.2", "type": "module", "description": "CORS and authentication proxy for pi-ai", "main": "dist/index.js", diff --git a/packages/tui/package.json b/packages/tui/package.json index 615c2a7b..9180bc15 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-tui", - "version": "0.23.1", + "version": "0.23.2", "description": "Terminal User Interface library with differential rendering for efficient text-based applications", "type": "module", "main": "dist/index.js", diff --git a/packages/web-ui/example/package.json b/packages/web-ui/example/package.json index 3878a562..a7303188 100644 --- a/packages/web-ui/example/package.json +++ b/packages/web-ui/example/package.json @@ -1,6 +1,6 @@ { "name": "pi-web-ui-example", - "version": "1.11.1", + "version": "1.11.2", "private": true, "type": "module", "scripts": { diff --git a/packages/web-ui/package.json b/packages/web-ui/package.json index b2f0b517..9b7306e9 100644 --- a/packages/web-ui/package.json +++ b/packages/web-ui/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-web-ui", - "version": "0.23.1", + "version": "0.23.2", "description": "Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai", "type": "module", "main": "dist/index.js", @@ -18,8 +18,8 @@ }, "dependencies": { "@lmstudio/sdk": "^1.5.0", - "@mariozechner/pi-ai": "^0.23.1", - "@mariozechner/pi-tui": "^0.23.1", + "@mariozechner/pi-ai": "^0.23.2", + "@mariozechner/pi-tui": "^0.23.2", "docx-preview": "^0.3.7", "jszip": "^3.10.1", "lucide": "^0.544.0",