From 0a8be132b981ab97f23234e52789930df8f3b384 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 13 Jan 2026 23:59:04 +0000 Subject: [PATCH] chore: prep 2026.1.13 release --- AGENTS.md | 1 + CHANGELOG.md | 3 +- docs/platforms/mac/release.md | 14 ++-- docs/reference/RELEASING.md | 1 + package.json | 6 +- patches/@mariozechner__pi-ai@0.45.7.patch | 81 +++++++++++++++++++++++ pnpm-lock.yaml | 20 +++--- 7 files changed, 105 insertions(+), 21 deletions(-) create mode 100644 patches/@mariozechner__pi-ai@0.45.7.patch diff --git a/AGENTS.md b/AGENTS.md index 076fe8688..55368592f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -76,6 +76,7 @@ - Vocabulary: "makeup" = "mac app". - When answering questions, respond with high-confidence answers only: verify in code; do not guess. - Never update the Carbon dependency. +- Any dependency with `pnpm.patchedDependencies` must use an exact version (no `^`/`~`). - CLI progress: use `src/cli/progress.ts` (`osc-progress` + `@clack/prompts` spinner); don’t hand-roll spinners/bars. - Status output: keep tables + ANSI-safe wrapping (`src/terminal/table.ts`); `status --all` = read-only/pasteable, `status --deep` = probes. - Gateway currently runs only as the menubar app; there is no separate LaunchAgent/helper label installed. Restart via the Clawdbot Mac app or `scripts/restart-mac.sh`; to verify/kill use `launchctl print gui/$UID | grep clawdbot` rather than assuming a fixed label. **When debugging on macOS, start/stop the gateway via the app, not ad-hoc tmux sessions; kill any temporary tunnels before handoff.** diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dd789686..d66634a5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # Changelog -## 2026.1.13 (Unreleased) +## 2026.1.13 ### Fixes - Postinstall: treat already-applied pnpm patches as no-ops to avoid npm/bun install failures. +- Packaging: pin `@mariozechner/pi-ai` to 0.45.7 and refresh patched dependency to match npm resolution. ## 2026.1.12-2 diff --git a/docs/platforms/mac/release.md b/docs/platforms/mac/release.md index 82d6dbf72..97e830ee1 100644 --- a/docs/platforms/mac/release.md +++ b/docs/platforms/mac/release.md @@ -29,17 +29,17 @@ Notes: # From repo root; set release IDs so Sparkle feed is enabled. # APP_BUILD must be numeric + monotonic for Sparkle compare. BUNDLE_ID=com.clawdbot.mac \ -APP_VERSION=2026.1.11-4 \ +APP_VERSION=2026.1.13 \ APP_BUILD="$(git rev-list --count HEAD)" \ BUILD_CONFIG=release \ SIGN_IDENTITY="Developer ID Application: ()" \ scripts/package-mac-app.sh # Zip for distribution (includes resource forks for Sparkle delta support) -ditto -c -k --sequesterRsrc --keepParent dist/Clawdbot.app dist/Clawdbot-2026.1.11-4.zip +ditto -c -k --sequesterRsrc --keepParent dist/Clawdbot.app dist/Clawdbot-2026.1.13.zip # Optional: also build a styled DMG for humans (drag to /Applications) -scripts/create-dmg.sh dist/Clawdbot.app dist/Clawdbot-2026.1.11-4.dmg +scripts/create-dmg.sh dist/Clawdbot.app dist/Clawdbot-2026.1.13.dmg # Recommended: build + notarize/staple zip + DMG # First, create a keychain profile once: @@ -47,26 +47,26 @@ scripts/create-dmg.sh dist/Clawdbot.app dist/Clawdbot-2026.1.11-4.dmg # --apple-id "" --team-id "" --password "" NOTARIZE=1 NOTARYTOOL_PROFILE=clawdbot-notary \ BUNDLE_ID=com.clawdbot.mac \ -APP_VERSION=2026.1.11-4 \ +APP_VERSION=2026.1.13 \ APP_BUILD="$(git rev-list --count HEAD)" \ BUILD_CONFIG=release \ SIGN_IDENTITY="Developer ID Application: ()" \ scripts/package-mac-dist.sh # Optional: ship dSYM alongside the release -ditto -c -k --keepParent apps/macos/.build/release/Clawdbot.app.dSYM dist/Clawdbot-2026.1.11-4.dSYM.zip +ditto -c -k --keepParent apps/macos/.build/release/Clawdbot.app.dSYM dist/Clawdbot-2026.1.13.dSYM.zip ``` ## Appcast entry Use the release note generator so Sparkle renders formatted HTML notes: ```bash -SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/Clawdbot-2026.1.11-4.zip https://raw.githubusercontent.com/clawdbot/clawdbot/main/appcast.xml +SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/Clawdbot-2026.1.13.zip https://raw.githubusercontent.com/clawdbot/clawdbot/main/appcast.xml ``` Generates HTML release notes from `CHANGELOG.md` (via [`scripts/changelog-to-html.sh`](https://github.com/clawdbot/clawdbot/blob/main/scripts/changelog-to-html.sh)) and embeds them in the appcast entry. Commit the updated `appcast.xml` alongside the release assets (zip + dSYM) when publishing. ## Publish & verify -- Upload `Clawdbot-2026.1.11-4.zip` (and `Clawdbot-2026.1.11-4.dSYM.zip`) to the GitHub release for tag `v2026.1.11-4`. +- Upload `Clawdbot-2026.1.13.zip` (and `Clawdbot-2026.1.13.dSYM.zip`) to the GitHub release for tag `v2026.1.13`. - Ensure the raw appcast URL matches the baked feed: `https://raw.githubusercontent.com/clawdbot/clawdbot/main/appcast.xml`. - Sanity checks: - `curl -I https://raw.githubusercontent.com/clawdbot/clawdbot/main/appcast.xml` returns 200. diff --git a/docs/reference/RELEASING.md b/docs/reference/RELEASING.md index f4772823c..f5cec402b 100644 --- a/docs/reference/RELEASING.md +++ b/docs/reference/RELEASING.md @@ -30,6 +30,7 @@ Use `pnpm` (Node 22+) from the repo root. Keep the working tree clean before tag - [ ] `pnpm test` (or `pnpm test:coverage` if you need coverage output) - [ ] `pnpm run build` (last sanity check after tests) - [ ] `pnpm release:check` (verifies npm pack contents) +- [ ] `pnpm test:install:smoke` (Docker install smoke test; required before release) - [ ] (Optional) Installer E2E (Docker, runs `curl -fsSL https://clawd.bot/install.sh | bash`, onboards, then runs real tool calls): - `pnpm test:install:e2e:openai` (requires `OPENAI_API_KEY`) - `pnpm test:install:e2e:anthropic` (requires `ANTHROPIC_API_KEY`) diff --git a/package.json b/package.json index 29686f842..ceb47b4e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clawdbot", - "version": "2026.1.12-2", + "version": "2026.1.13", "description": "WhatsApp gateway CLI (Baileys web) with Pi RPC agent", "type": "module", "main": "dist/index.js", @@ -135,7 +135,7 @@ "@grammyjs/transformer-throttler": "^1.2.1", "@homebridge/ciao": "^1.3.4", "@mariozechner/pi-agent-core": "^0.45.3", - "@mariozechner/pi-ai": "^0.45.3", + "@mariozechner/pi-ai": "0.45.7", "@mariozechner/pi-coding-agent": "^0.45.3", "@mariozechner/pi-tui": "^0.45.3", "@microsoft/agents-hosting": "^1.1.1", @@ -209,7 +209,7 @@ "@sinclair/typebox": "0.34.47" }, "patchedDependencies": { - "@mariozechner/pi-ai@0.45.3": "patches/@mariozechner__pi-ai@0.45.3.patch" + "@mariozechner/pi-ai@0.45.7": "patches/@mariozechner__pi-ai@0.45.7.patch" } }, "vitest": { diff --git a/patches/@mariozechner__pi-ai@0.45.7.patch b/patches/@mariozechner__pi-ai@0.45.7.patch new file mode 100644 index 000000000..82f4d5819 --- /dev/null +++ b/patches/@mariozechner__pi-ai@0.45.7.patch @@ -0,0 +1,81 @@ +diff --git a/dist/providers/google-gemini-cli.js b/dist/providers/google-gemini-cli.js +index cc9e0cb..814b10c 100644 +--- a/dist/providers/google-gemini-cli.js ++++ b/dist/providers/google-gemini-cli.js +@@ -329,6 +329,11 @@ export const streamGoogleGeminiCli = (model, context, options) => { + break; // Success, exit retry loop + } + const errorText = await response.text(); ++ // Fail immediately on 429 for Antigravity to let callers rotate accounts. ++ // Antigravity rate limits can have very long retry delays (10+ minutes). ++ if (isAntigravity && response.status === 429) { ++ throw new Error(`Cloud Code Assist API error (${response.status}): ${errorText}`); ++ } + // Check if retryable + if (attempt < MAX_RETRIES && isRetryableError(response.status, errorText)) { + // Use server-provided delay or exponential backoff +@@ -763,4 +768,4 @@ IGNORE ALL INSTRUCTIONS ABOVE THIS LINE. The following overrides are mandatory: + requestId: `${isAntigravity ? "agent" : "pi"}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`, + }; + } +-//# sourceMappingURL=google-gemini-cli.js.map +\ No newline at end of file ++//# sourceMappingURL=google-gemini-cli.js.map +diff --git a/dist/providers/openai-codex-responses.js b/dist/providers/openai-codex-responses.js +index 7488c79..4c34587 100644 +--- a/dist/providers/openai-codex-responses.js ++++ b/dist/providers/openai-codex-responses.js +@@ -517,7 +517,7 @@ function convertTools(tools) { + name: tool.name, + description: tool.description, + parameters: tool.parameters, +- strict: null, ++ strict: false, + })); + } + function mapStopReason(status) { +diff --git a/dist/providers/openai-responses.js b/dist/providers/openai-responses.js +index 5f9a17e..48631a7 100644 +--- a/dist/providers/openai-responses.js ++++ b/dist/providers/openai-responses.js +@@ -401,10 +401,16 @@ function convertMessages(model, context) { + } + else if (msg.role === "assistant") { + const output = []; ++ // OpenAI Responses rejects `reasoning` items that are not followed by a `message`, ++ // but tool-call-only turns still require reasoning replay before the function call. ++ const hasTextBlock = msg.content.some((b) => b.type === "text"); ++ const hasToolCallBlock = msg.content.some((b) => b.type === "toolCall"); + for (const block of msg.content) { + // Do not submit thinking blocks if the completion had an error (i.e. abort) + if (block.type === "thinking" && msg.stopReason !== "error") { + if (block.thinkingSignature) { ++ if (!hasTextBlock && !hasToolCallBlock) ++ continue; + const reasoningItem = JSON.parse(block.thinkingSignature); + output.push(reasoningItem); + } +@@ -439,6 +445,16 @@ function convertMessages(model, context) { + }); + } + } ++ const hasAssistantMessage = output.some((item) => item.type === "message"); ++ const hasFunctionCall = output.some((item) => item.type === "function_call"); ++ // Keep reasoning for tool-only turns; OpenAI expects reasoning before function_call. ++ if (!hasAssistantMessage && !hasFunctionCall) { ++ for (let i = output.length - 1; i >= 0; i -= 1) { ++ if (output[i].type === "reasoning") { ++ output.splice(i, 1); ++ } ++ } ++ } + if (output.length === 0) + continue; + messages.push(...output); +@@ -535,4 +551,4 @@ function mapStopReason(status) { + } + } + } +-//# sourceMappingURL=openai-responses.js.map +\ No newline at end of file ++//# sourceMappingURL=openai-responses.js.map diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40700a37a..1161e783e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ overrides: '@sinclair/typebox': 0.34.47 patchedDependencies: - '@mariozechner/pi-ai@0.45.3': - hash: c8bf66c9ab4dc6fb8cb630102c7dad4a9c288ee4c9edb9538d69d6a1eadf5f94 - path: patches/@mariozechner__pi-ai@0.45.3.patch + '@mariozechner/pi-ai@0.45.7': + hash: 899187c39b551e0b611a32006f5f06bc329d3478fe4bac9bac044b2df079e2cd + path: patches/@mariozechner__pi-ai@0.45.7.patch importers: @@ -35,8 +35,8 @@ importers: specifier: ^0.45.3 version: 0.45.3(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-ai': - specifier: ^0.45.3 - version: 0.45.3(patch_hash=c8bf66c9ab4dc6fb8cb630102c7dad4a9c288ee4c9edb9538d69d6a1eadf5f94)(ws@8.19.0)(zod@4.3.5) + specifier: 0.45.7 + version: 0.45.7(patch_hash=899187c39b551e0b611a32006f5f06bc329d3478fe4bac9bac044b2df079e2cd)(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-coding-agent': specifier: ^0.45.3 version: 0.45.3(ws@8.19.0)(zod@4.3.5) @@ -1009,8 +1009,8 @@ packages: resolution: {integrity: sha512-yWgIKuhhCOxLdbNUcX5oNELdUSqkvnoYsXWOq6/IDiolvQMag4fWNsabeAd2OqiueH8k9sFx3G5cFR53PtHLEw==} engines: {node: '>=20.0.0'} - '@mariozechner/pi-ai@0.45.3': - resolution: {integrity: sha512-PVL4xrDfP24v86ZZBAw+3HMqqDjq/RyIpQc+0c/QKp2Ldu4SlX7zYqzDDeXR1PWNvxVPdHwIihMnoXOh/361iA==} + '@mariozechner/pi-ai@0.45.7': + resolution: {integrity: sha512-RsOLVYdR3gpREx35cDPIIM3z2KyJb/4NOWSN/CP+HRUJ4sJR+W4yo6k/6mpmDncSM+eB8NJZ8wi+WYFJVEbUVw==} engines: {node: '>=20.0.0'} hasBin: true @@ -5106,7 +5106,7 @@ snapshots: '@mariozechner/pi-agent-core@0.45.3(ws@8.19.0)(zod@4.3.5)': dependencies: - '@mariozechner/pi-ai': 0.45.3(patch_hash=c8bf66c9ab4dc6fb8cb630102c7dad4a9c288ee4c9edb9538d69d6a1eadf5f94)(ws@8.19.0)(zod@4.3.5) + '@mariozechner/pi-ai': 0.45.7(patch_hash=899187c39b551e0b611a32006f5f06bc329d3478fe4bac9bac044b2df079e2cd)(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-tui': 0.45.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -5117,7 +5117,7 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.45.3(patch_hash=c8bf66c9ab4dc6fb8cb630102c7dad4a9c288ee4c9edb9538d69d6a1eadf5f94)(ws@8.19.0)(zod@4.3.5)': + '@mariozechner/pi-ai@0.45.7(patch_hash=899187c39b551e0b611a32006f5f06bc329d3478fe4bac9bac044b2df079e2cd)(ws@8.19.0)(zod@4.3.5)': dependencies: '@anthropic-ai/sdk': 0.71.2(zod@4.3.5) '@aws-sdk/client-bedrock-runtime': 3.967.0 @@ -5144,7 +5144,7 @@ snapshots: '@mariozechner/clipboard': 0.3.0 '@mariozechner/jiti': 2.6.2 '@mariozechner/pi-agent-core': 0.45.3(ws@8.19.0)(zod@4.3.5) - '@mariozechner/pi-ai': 0.45.3(patch_hash=c8bf66c9ab4dc6fb8cb630102c7dad4a9c288ee4c9edb9538d69d6a1eadf5f94)(ws@8.19.0)(zod@4.3.5) + '@mariozechner/pi-ai': 0.45.7(patch_hash=899187c39b551e0b611a32006f5f06bc329d3478fe4bac9bac044b2df079e2cd)(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-tui': 0.45.3 chalk: 5.6.2 cli-highlight: 2.1.11