Commit Graph

1523 Commits

Author SHA1 Message Date
Peter Steinberger
e8420bd047 fix: refine bootstrap injections 2026-01-07 10:04:23 +00:00
Tobias Bischoff
412990a139 Reduce prompt token overhead with leaner context injections 2026-01-07 10:04:23 +00:00
Tim Krase
e58e13708d Agents: add weekday to user time 2026-01-07 11:02:39 +01:00
Peter Steinberger
7a917602c5 feat(auth): sync OAuth from Claude/Codex CLIs
Add source profiles anthropic:claude-cli and openai-codex:codex-cli; surface them in onboarding/configure.

Co-authored-by: pepicrft <pepicrft@users.noreply.github.com>
2026-01-07 10:47:57 +01:00
Peter Steinberger
0914517ee3 feat(sandbox): add workspace access mode 2026-01-07 09:33:38 +00:00
Peter Steinberger
94d3a9742b fix: clean agents lint warnings 2026-01-07 10:13:03 +01:00
Peter Steinberger
7973fd4caf feat: add agents command 2026-01-07 10:03:53 +01:00
Peter Steinberger
a50ffa69b0 fix(discord): handle multi-attachment inbound media 2026-01-07 09:01:57 +01:00
Peter Steinberger
e5dbe1db9d fix: ensure output for non-streaming models (#369)
Co-authored-by: mneves75 <mneves75@users.noreply.github.com>
2026-01-07 07:47:18 +00:00
Peter Steinberger
34cac1beb0 fix: land PR #350 2026-01-07 07:19:48 +00:00
Peter Steinberger
1b81805d63 fix: align heartbeat session store with default agent 2026-01-07 07:14:24 +00:00
Peter Steinberger
7176b114da fix(auth): harden legacy auth.json cleanup 2026-01-07 06:51:17 +00:00
Peter Steinberger
0707b1e487 Merge PR #368: delete legacy auth.json after migration 2026-01-07 06:47:46 +00:00
Peter Steinberger
2937c4861f fix(auth): doctor-migrate anthropic oauth profiles 2026-01-07 06:31:02 +00:00
Randy Torres
ff79db0a99 fix(auth): use anthropic oauth email profile
Use Anthropic OAuth profile email as the profile identifier when available. This fixes cases where Anthropic returns an email-based profile id rather than an explicit id field.
2026-01-07 06:31:02 +00:00
Peter Steinberger
8b1263ce11 fix: split status activation line 2026-01-07 07:26:52 +01:00
Peter Steinberger
dc941b7e57 fix: refresh status output 2026-01-07 07:22:06 +01:00
Matthew Dicembrino
4f10279ac3 fix: delete legacy auth.json after migration to prevent stale token overwrites (#363) 2026-01-07 01:15:38 -05:00
Peter Steinberger
50dec39d13 fix: honor sandboxed built-in tools 2026-01-07 06:12:56 +00:00
Peter Steinberger
03928106c7 fix: order reasoning before reply text 2026-01-07 07:05:07 +01:00
Peter Steinberger
75c66acfd8 feat: update subagent announce + archive 2026-01-07 06:53:01 +01:00
Peter Steinberger
1673a221f8 feat: add /reasoning reasoning visibility 2026-01-07 06:17:31 +01:00
Peter Steinberger
cb2a72f8a9 test(routing): add route-reply coverage 2026-01-07 05:07:53 +00:00
Peter Steinberger
3668388912 fix(routing): harden originating reply routing 2026-01-07 05:02:34 +00:00
Josh Lehman
5414da9fd4 fix(routing): handle cross-provider messages in collect mode
When queued messages come from different providers (Slack + Telegram),
process them individually instead of collecting into a single prompt.
This ensures each reply routes back to its originating provider.

- Add hasCrossProviderItems() to detect multi-provider queues
- Skip collect mode when cross-provider detected
- Preserve originatingChannel/originatingTo when collecting same-provider
2026-01-07 04:51:33 +00:00
Josh Lehman
2d67ec5bfa fix(routing): only route to originating channel when cross-provider
When OriginatingChannel matches Surface (same provider), use normal
dispatcher. Only route via routeReply() when they differ, ensuring
cross-provider messages (e.g., Telegram queued while Slack active)
get routed back to their origin.
2026-01-07 04:51:33 +00:00
Josh Lehman
9d50ebad7d feat(routing): route replies to originating channel
Implement reply routing based on OriginatingChannel/OriginatingTo fields.
This ensures replies go back to the provider where the message originated
instead of using the session's lastChannel.

Changes:
- Add OriginatingChannel/OriginatingTo fields to MsgContext (templating.ts)
- Add originatingChannel/originatingTo fields to FollowupRun (queue.ts)
- Create route-reply.ts with provider-agnostic router
- Update all providers (Telegram, Slack, Discord, Signal, iMessage)
  to pass originating channel info
- Update reply.ts to pass originating channel to followupRun
- Update followup-runner.ts to use route-reply for originating channels

This addresses the issue where messages from one provider (e.g., Slack)
would receive replies on a different provider (e.g., Telegram) because
the queue used the last active dispatcher instead of the originating one.
2026-01-07 04:51:33 +00:00
Peter Steinberger
514fcfe77e fix: harden sub-agent model overrides 2026-01-07 04:48:37 +00:00
Peter Steinberger
12d57da53a fix: normalize provider aliases in auth order 2026-01-07 05:43:32 +01:00
mneves75
8187baab18 test: format models list alias coverage 2026-01-07 05:31:01 +01:00
mneves75
3550dc294d fix: normalize z.ai provider ids in auth profiles 2026-01-07 05:31:01 +01:00
mneves75
8954f7719c Test: cover z.ai normalization 2026-01-07 05:30:06 +01:00
mneves75
0ddfbf5534 Feat: normalize z.ai provider ids 2026-01-07 05:30:06 +01:00
Peter Steinberger
42ae2341aa fix: harden pairing flow 2026-01-07 05:06:04 +01:00
Peter Steinberger
6ffece68b0 fix(doctor): add headless flags + auto-migrate sessions 2026-01-07 04:43:24 +01:00
Peter Steinberger
9c9ae5aa54 fix(imessage): harden abort shutdown 2026-01-07 03:41:23 +00:00
Anton Sotkov
08fc0b3809 fix: imsg unhandled promises 2026-01-07 03:41:23 +00:00
Peter Steinberger
8ef0609f8e refactor: share reaction schemas and notes 2026-01-07 04:24:11 +01:00
Peter Steinberger
073b16a3a0 fix: clean up reaction tooling 2026-01-07 04:16:39 +01:00
Peter Steinberger
3afef2d504 feat: unify provider reaction tools 2026-01-07 04:16:39 +01:00
Sash Zats
551a8d5683 Add WhatsApp reactions support
Summary:

Test Plan:
2026-01-07 04:16:39 +01:00
Peter Steinberger
aa87d6cee8 refactor(relay): add --smoke entrypoint 2026-01-07 03:12:30 +00:00
Peter Steinberger
59cc15f3cc fix(relay): guard QR smoke mode 2026-01-07 02:42:55 +00:00
Peter Steinberger
ff102e2afa Merge PR #358 2026-01-07 02:42:53 +00:00
Peter Steinberger
aa635af6d0 refactor: unify outbound result envelopes 2026-01-07 02:36:05 +00:00
DB Hurley
9d820a628f fix(relay): implement CLAWDBOT_SMOKE_QR handler for packaging 2026-01-06 21:32:04 -05:00
Peter Steinberger
4bf5f37a44 refactor: streamline outbound payload handling 2026-01-07 02:30:42 +00:00
Peter Steinberger
3fedd0d1d5 fix(outbound): guard optional delivery fields 2026-01-07 02:19:42 +00:00
Peter Steinberger
59502552ae fix(telegram): import native reply helper 2026-01-07 02:19:42 +00:00
Peter Steinberger
d7bc5b58fc refactor(telegram): polish topic threading 2026-01-07 02:19:42 +00:00
Peter Steinberger
80112433a5 fix(telegram): support forum topics
Co-authored-by: Daniel Griesser <HazAT@users.noreply.github.com>
Co-authored-by: Nacho Iacovino <nachoiacovino@users.noreply.github.com>
Co-authored-by: Randy Ventures <RandyVentures@users.noreply.github.com>
2026-01-07 02:19:42 +00:00
Peter Steinberger
023a124312 test: cover gmail tailscale error formatting 2026-01-07 03:16:52 +01:00
Peter Steinberger
2986447935 fix: improve gmail tailscale errors 2026-01-07 03:10:35 +01:00
Peter Steinberger
467d4e17fe feat: add sandbox scope default 2026-01-07 02:52:41 +01:00
Peter Steinberger
15b7560a9b refactor: reuse gateway output helpers 2026-01-07 01:43:02 +00:00
Peter Steinberger
b88c4e9d20 chore: clean up lint and scratchpad 2026-01-07 01:28:46 +00:00
Peter Steinberger
bc9a3ce32a refactor: unify outbound delivery formatting 2026-01-07 01:26:09 +00:00
Peter Steinberger
3fbe2963b3 test: align outbound normalization 2026-01-07 01:22:55 +00:00
Peter Steinberger
8ba6473462 style: fix send json indent 2026-01-07 01:21:29 +00:00
Peter Steinberger
dd78c26e6d style: format direct send json 2026-01-07 01:21:03 +00:00
Peter Steinberger
2ce5df3efc style: align outbound delivery formatting 2026-01-07 01:20:40 +00:00
Peter Steinberger
aefaed159b refactor: normalize outbound payload delivery 2026-01-07 01:19:47 +00:00
Peter Steinberger
f171d509bb refactor: centralize outbound target validation 2026-01-07 01:16:39 +00:00
Sash Zats
f1643a5b8d Heartbeat: resolve main session key for session store 2026-01-06 20:14:30 -05:00
Peter Steinberger
f5938f8114 refactor: unify outbound delivery 2026-01-07 01:13:04 +00:00
Peter Steinberger
1ae5e9a26b feat: add docs search command 2026-01-07 02:03:06 +01:00
Sash Zats
eb8d7a19af Cron: enqueue system events in main session 2026-01-06 19:55:03 -05:00
Erik
cd4e2023ab fix(agent): capture compaction retry AbortError for model fallback
Wrap waitForCompactionRetry() in try/catch to capture AbortError
that was escaping and bypassing the model fallback mechanism.

When a timeout fires, session.abort() causes both session.prompt()
and waitForCompactionRetry() to throw AbortError. Previously only
the prompt error was captured, allowing the compaction error to
escape to model-fallback.ts where it was immediately re-thrown
(line 199: isAbortError check), bypassing fallback model attempts.

Fixes #313
2026-01-07 01:44:37 +01:00
Peter Steinberger
0116184b1c docs: recommend WSL2 for Windows installs 2026-01-07 01:21:36 +01:00
Peter Steinberger
62112d9978 feat: add onboarding doc links 2026-01-07 01:19:31 +01:00
Peter Steinberger
19c95d0ff7 fix(auth): serialize profile stats updates 2026-01-07 01:06:51 +01:00
Peter Steinberger
96d72ff91e fix(auth): lock auth profile updates 2026-01-07 01:00:47 +01:00
Muhammed Mukhthar CM
eb5f758f6b fix(auth): improve multi-account round-robin rotation and 429 handling
This commit fixes several issues with multi-account OAuth rotation that
were causing slow responses and inefficient account cycling.

## Changes

### 1. Fix usageStats race condition (auth-profiles.ts)

The `markAuthProfileUsed`, `markAuthProfileCooldown`, `markAuthProfileGood`,
and `clearAuthProfileCooldown` functions were using a stale in-memory store
passed as a parameter. Long-running sessions would overwrite usageStats
updates from concurrent sessions when saving.

**Fix:** Re-read the store from disk before each update to get fresh
usageStats from other sessions, then merge the update.

### 2. Capture AbortError from waitForCompactionRetry (pi-embedded-runner.ts)

When a request timed out, `session.abort()` was called which throws an
`AbortError`. The code structure was:

```javascript
try {
  await session.prompt(params.prompt);
} catch (err) {
  promptError = err;  // Catches AbortError here
}
await waitForCompactionRetry();  // But THIS also throws AbortError!
```

The second `AbortError` from `waitForCompactionRetry()` escaped and
bypassed the rotation/fallback logic entirely.

**Fix:** Wrap `waitForCompactionRetry()` in its own try/catch to capture
the error as `promptError`, enabling proper timeout handling.

Root cause analysis and fix proposed by @erikpr1994 in #313.

Fixes #313

### 3. Fail fast on 429 rate limits (pi-ai patch)

The pi-ai library was retrying 429 errors up to 3 times with exponential
backoff before throwing. This meant a rate-limited account would waste
30+ seconds retrying before our rotation code could try the next account.

**Fix:** Patch google-gemini-cli.js to:
- Throw immediately on first 429 (no retries)
- Not catch and retry 429 errors in the network error handler

This allows the caller to rotate to the next account instantly on rate limit.

Note: We submitted this fix upstream (https://github.com/badlogic/pi-mono/pull/504)
but it was closed without merging. Keeping as a local patch for now.

## Testing

With 6 Antigravity accounts configured:
- Accounts rotate properly based on lastUsed (round-robin)
- 429s trigger immediate rotation to next account
- usageStats persist correctly across concurrent sessions
- Cooldown tracking works as expected

## Before/After

**Before:** Multiple 429 retries on same account, 30-90s delays
**After:** Instant rotation on 429, responses in seconds
2026-01-07 00:56:32 +01:00
VAC
ff200e3993 fix(discord): handle voice messages with empty content
Discord voice messages have empty `content` with the audio in attachments.
The nullish coalescing operator (`??`) doesn't fall through on empty strings,
so voice messages were being dropped as 'empty content'.

Changed to logical OR (`||`) so empty string falls through to media placeholder.
2026-01-06 23:35:30 +00:00
Peter Steinberger
7214cf39ec fix: prefer home linuxbrew paths 2026-01-07 00:18:07 +01:00
Peter Steinberger
b57d36f49c fix(sessions_spawn): hard-fail invalid model overrides 2026-01-06 23:17:35 +00:00
Azade
0429a4b63b test(sessions_spawn): add test for model parameter 2026-01-06 23:17:35 +00:00
Azade
274f408e6f feat(sessions_spawn): add model parameter for sub-agent model override 2026-01-06 23:17:35 +00:00
Peter Steinberger
02c9cf0ff4 chore: remove duplicate daemon runtime imports 2026-01-07 00:14:08 +01:00
Peter Steinberger
dd0d23cd96 test(commands): add /stop native regression 2026-01-06 23:11:57 +00:00
Peter Steinberger
e0efcda77f fix(commands): wire /stop across chat commands 2026-01-06 23:11:57 +00:00
Nacho Iacovino
0df7c3addf feat(telegram): add /stop command to abort running agent
Adds a /stop command that:
- Can interrupt a running agent session mid-execution
- Works in both DMs and group chats (including forum topics)
- Uses grammy's bot.command() to run before the main message handler
- Returns status: stopped, stop requested, or nothing running

Also fixes session key lookup in pi-embedded-runner to use sessionKey
instead of sessionId, ensuring /stop finds the correct active run.
2026-01-06 23:11:57 +00:00
Peter Steinberger
5bc3f13b46 feat: colorize models auth key labels 2026-01-07 00:10:01 +01:00
Peter Steinberger
b357746e1c feat: add richer color to models output 2026-01-07 00:07:50 +01:00
Peter Steinberger
79f813e18e style: format lint offenders 2026-01-07 00:04:44 +01:00
Peter Steinberger
0ad74ee941 test: mock select prompt in doctor tests 2026-01-07 00:01:50 +01:00
Peter Steinberger
55278c1c71 feat: add daemon runtime prompts 2026-01-06 23:51:00 +01:00
Peter Steinberger
c920ee1166 Merge branch 'pr-335-merge' 2026-01-06 23:45:35 +01:00
Peter Steinberger
5939363eed fix: include telegram group sender in envelope headers 2026-01-06 22:34:02 +00:00
Peter Steinberger
8d50d08936 style: format daemon runtime changes 2026-01-06 23:29:38 +01:00
Peter Steinberger
8911a79d7f docs: rewrite cron jobs guide and heartbeat notes 2026-01-06 22:28:42 +00:00
Peter Steinberger
707f7918bc feat: add gateway daemon runtime selector 2026-01-06 23:27:58 +01:00
Peter Steinberger
18c43fe462 fix: bootstrap linuxbrew for skills 2026-01-06 23:27:38 +01:00
Peter Steinberger
39d2ba78b7 fix(cli): harden pairing provider parse 2026-01-06 22:17:18 +00:00
Peter Steinberger
0931a65ab2
fix: auto-recover from Gemini session corruption
Auto-merge after checks.
2026-01-06 22:12:05 +00:00
Peter Steinberger
fec7f37271 merge upstream/main 2026-01-06 23:09:01 +01:00
Peter Steinberger
86b56b2308 fix: harden gemini session reset 2026-01-06 23:06:01 +01:00
Peter Steinberger
2771001720 fix(state): auto-migrate legacy agent dir 2026-01-06 22:04:23 +00:00
Peter Steinberger
7aa7fa79d0 feat: update heartbeat defaults 2026-01-06 21:54:42 +00:00
Peter Steinberger
dba09058f5 fix(agents): default agent dir to multi-agent path 2026-01-06 21:54:42 +00:00