Commit Graph

4292 Commits

Author SHA1 Message Date
Ian Hildebrand
a8f4b0a076 fix: support direct token and provider in auth apply commands (#1485) 2026-01-23 07:27:52 +00:00
Peter Steinberger
bc34d22972 test: streamline slow suites 2026-01-23 07:26:19 +00:00
Peter Steinberger
e98f97b5ee fix: log config update in copilot auth 2026-01-23 07:23:52 +00:00
Hiren Patel
2cf551b153 [AI Assisted] Usage: add Google Antigravity usage tracking (#1490)
* Usage: add Google Antigravity usage tracking

- Add dedicated fetcher for google-antigravity provider
- Fetch credits and per-model quotas from Cloud Code API
- Report individual model IDs sorted by usage (top 10)
- Include comprehensive debug logging with [antigravity] prefix

* fix: refine antigravity usage tracking (#1490) (thanks @patelhiren)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-23 07:17:59 +00:00
Peter Steinberger
6272315b69 fix: stop gateway before uninstall 2026-01-23 07:17:42 +00:00
Peter Steinberger
de455683af Revert "fix: improve GitHub Copilot integration"
This reverts commit b69e70668d.
2026-01-23 07:14:00 +00:00
Peter Steinberger
fb4bbfe6ec Revert "fix: set Copilot user agent header"
This reverts commit 86c40e5dca.
2026-01-23 07:14:00 +00:00
Peter Steinberger
2473ea5e94 Revert "fix: treat copilot oauth tokens as non-expiring"
This reverts commit 486dd8e071.
2026-01-23 07:14:00 +00:00
Peter Steinberger
0d63f0879a fix: stabilize cron log wait 2026-01-23 07:11:01 +00:00
Peter Steinberger
9c9bd7bfdc fix: sanitize assistant session text (#1456) (thanks @zerone0x) 2026-01-23 07:05:31 +00:00
Peter Steinberger
09f78e2066 fix: prioritize Anthropic token auth option 2026-01-23 07:04:18 +00:00
zerone0x
668f8a1f29 fix: sanitize tool call text in sessions-helpers extractAssistantText
Adds sanitization to extractAssistantText in sessions-helpers.ts to
prevent tool call text from leaking to users. Previously, messages
retrieved from chat history via sessions-helpers.ts could expose:

- Minimax XML tool calls (<invoke>...</invoke>)
- Downgraded tool call markers ([Tool Call: name (ID: ...)])
- Thinking tags (<think>...</think>)

This fix:
- Exports the stripping functions from pi-embedded-utils.ts
- Adds a new sanitizeTextContent helper in sessions-helpers.ts
- Updates extractAssistantText to sanitize before returning
- Updates extractMessageText in commands-subagents.ts to sanitize

Fixes #1269

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-23 07:03:26 +00:00
Peter Steinberger
981cf00d19 fix(tui): hide off think/verbose in footer 2026-01-23 07:02:56 +00:00
Peter Steinberger
4134a0e457 test: avoid double cron finish wait 2026-01-23 06:40:14 +00:00
Peter Steinberger
0598561c63 test: harden onboarding/discord/telegram test setup 2026-01-23 06:38:16 +00:00
Peter Steinberger
80f03adc9c test: stabilize cron + async search timings 2026-01-23 06:38:16 +00:00
Dave Lauer
0c045bf135 feat(compaction): add adaptive chunk sizing, progressive fallback, and UI indicator (#1466)
* fix(ui): allow relative URLs in avatar validation

The isAvatarUrl check only accepted http://, https://, or data: URLs,
but the /avatar/{agentId} endpoint returns relative paths like /avatar/main.
This caused local file avatars to display as text instead of images.

Fixes avatar display for locally configured avatar files.

* fix(gateway): resolve local avatars to URL in HTML injection and RPC

The frontend fix alone wasn't enough because:
1. serveIndexHtml() was injecting the raw avatar filename into HTML
2. agent.identity.get RPC was returning raw filename, overwriting the
   HTML-injected value

Now both paths resolve local file avatars (*.png, *.jpg, etc.) to the
/avatar/{agentId} endpoint URL.

* feat(compaction): add adaptive chunk sizing and progressive fallback

- Add computeAdaptiveChunkRatio() to reduce chunk size for large messages
- Add isOversizedForSummary() to detect messages too large to summarize
- Add summarizeWithFallback() with progressive fallback:
  - Tries full summarization first
  - Falls back to partial summarization excluding oversized messages
  - Notes oversized messages in the summary output
- Add SAFETY_MARGIN (1.2x) buffer for token estimation inaccuracy
- Reduce MIN_CHUNK_RATIO to 0.15 for very large messages

This prevents compaction failures when conversations contain
unusually large tool outputs or responses that exceed the
summarization model's context window.

* feat(ui): add compaction indicator and improve event error handling

Compaction indicator:
- Add CompactionStatus type and handleCompactionEvent() in app-tool-stream.ts
- Show '🧹 Compacting context...' toast while active (with pulse animation)
- Show '🧹 Context compacted' briefly after completion
- Auto-clear toast after 5 seconds
- Add CSS styles for .callout.info, .callout.success, .compaction-indicator

Error handling improvements:
- Wrap onEvent callback in try/catch in gateway.ts to prevent errors
  from breaking the WebSocket message handler
- Wrap handleGatewayEvent in try/catch with console.error logging
  to isolate errors and make them visible in devtools

These changes address UI freezes during heavy agent activity by:
1. Showing users when compaction is happening
2. Preventing uncaught errors from silently breaking the event loop

* fix(control-ui): add agentId to DEFAULT_ASSISTANT_IDENTITY

TypeScript inferred the union type without agentId when falling back to
DEFAULT_ASSISTANT_IDENTITY, causing build errors at control-ui.ts:222-223.
2026-01-23 06:32:30 +00:00
Peter Steinberger
0d725a3588 fix: reduce Slack WebClient retries 2026-01-23 06:31:53 +00:00
Peter Steinberger
ea165b6fac fix: fall back to non-PTY exec 2026-01-23 06:27:26 +00:00
Peter Steinberger
12700696f8 test: trim plugin + telegram test setup 2026-01-23 06:22:09 +00:00
Peter Steinberger
9c5a339d0e test(memory): speed up batch coverage 2026-01-23 06:22:09 +00:00
Peter Steinberger
35e20753e7 test(agents): merge sessions_spawn group announce coverage 2026-01-23 06:22:09 +00:00
Peter Steinberger
e2a98bc69c test(commands): streamline onboarding tests 2026-01-23 06:22:09 +00:00
Peter Steinberger
9513dec35f test(gateway): consolidate server suites for speed 2026-01-23 06:22:09 +00:00
ganghyun kim
d72a8a5cd6 fix: clarify Discord onboarding hint (#1487)
Thanks @kyleok.

Co-authored-by: Ganghyun Kim <58307870+kyleok@users.noreply.github.com>
2026-01-23 06:11:41 +00:00
Peter Steinberger
cf2d0645fb fix: always skip browser opens in tests 2026-01-23 06:00:21 +00:00
Peter Steinberger
389cafd078 fix: extend gateway chat test timeout on windows 2026-01-23 05:55:35 +00:00
Peter Steinberger
a9b0f99d48 fix: gateway summary lookup + test browser opens 2026-01-23 05:54:51 +00:00
Peter Steinberger
436cb68861 test: add media auto-detect coverage 2026-01-23 05:47:13 +00:00
Peter Steinberger
09933a74cc feat: improve media auto-detect 2026-01-23 05:47:09 +00:00
Peter Steinberger
a1878d0d3c feat: add slack replyToModeByChatType overrides 2026-01-23 05:38:28 +00:00
Stefan Galescu
aa3972d93d feat(slack): add dm-specific replyToMode configuration (#1442)
Adds support for separate replyToMode settings for DMs vs channels:

- Add channels.slack.dm.replyToMode for DM-specific threading
- Keep channels.slack.replyToMode as default for channels
- Add resolveSlackReplyToMode helper to centralize logic
- Pass chatType through threading resolution chain

Usage:
```json5
{
  channels: {
    slack: {
      replyToMode: "off",     // channels
      dm: {
        replyToMode: "all"    // DMs always thread
      }
    }
  }
}
```

When dm.replyToMode is set, DMs use that mode; channels use the
top-level replyToMode. Backward compatible when not configured.
2026-01-23 05:13:23 +00:00
Travis Irby
f653b57aee hydrate files from thread root message on replies
When replying to a Slack thread, files attached to the root message were
  not being fetched. The existing `resolveSlackThreadStarter()` fetched the
  root message text via `conversations.replies` but ignored the `files[]`
  array in the response.

  Changes:
  - Add `files` to `SlackThreadStarter` type and extract from API response
  - Download thread starter files when the reply message has no attachments
  - Add verbose log for thread starter file hydration

  Fixes issue where asking about a PDF in a thread reply would fail because
  the model never received the file content from the root message.
2026-01-23 05:10:36 +00:00
Neo
e1f68407fb fix: follow soul.md more closely (#1434)
* Agents: honor SOUL.md persona guidance

* fix: harden SOUL.md detection (#1434) (thanks @neooriginal)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-23 05:00:13 +00:00
Tak hoffman
bf4a5b3987 CLI: fix Windows gateway startup 2026-01-23 04:47:01 +00:00
Peter Steinberger
aada663f26 feat: refine onboarding hatch flow 2026-01-23 04:32:23 +00:00
Peter Steinberger
1fce0abe13 test: speed up gateway suite setup 2026-01-23 04:28:02 +00:00
Rodrigo Uroz
b5bf4716c7 fix: read Slack thread replies for message reads (#1450) (#1450)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Rodrigo Uroz <rodrigouroz@users.noreply.github.com>
2026-01-23 04:17:45 +00:00
Peter Steinberger
fc24be2173 refactor: add config logging helpers 2026-01-23 04:16:39 +00:00
Peter Steinberger
04bc47cb9a fix: put plugin descriptions under source 2026-01-23 04:02:42 +00:00
Peter Steinberger
a93fbf4af0 refactor: centralize config update logging 2026-01-23 04:01:26 +00:00
Peter Steinberger
3ad48d3786 fix: prefer ~ for home paths in output 2026-01-23 03:44:31 +00:00
Peter Steinberger
c23ecdc487 docs: add changelog entry for #1432 2026-01-23 03:31:42 +00:00
Peter Steinberger
7a745840e1 fix: honor user-pinned profiles and search ranking 2026-01-23 03:28:47 +00:00
Tobias Bischoff
ad554a8fd2 perf(tui): optimize searchable select list filtering
- Add regex caching to avoid creating new RegExp objects on each render
- Optimize smartFilter to use single array with tier-based scoring
- Replace non-existent fuzzyFilter import with local fuzzyFilterLower
- Reduces from 4 array allocations and 4 sorts to 1 array and 1 sort

Fixes pre-existing bug where fuzzyFilter was imported from pi-tui but not exported.
2026-01-23 03:28:18 +00:00
Tobias Bischoff
e6f9333275 fix(auth): skip auth profiles in cooldown during selection and rotation
Auth profiles in cooldown (due to rate limiting) were being attempted,
causing unnecessary retries and delays. This fix ensures:

1. Initial profile selection skips profiles in cooldown
2. Profile rotation (after failures) skips cooldown profiles
3. Clear error message when all profiles are unavailable

Tests added:
- Skips profiles in cooldown during initial selection
- Skips profiles in cooldown when rotating after failure

Fixes #1316
2026-01-23 03:28:18 +00:00
Peter Steinberger
8f0de26e26 fix: honor gateway env token for doctor/security
Co-authored-by: azade-c <azade-c@users.noreply.github.com>
2026-01-23 03:16:52 +00:00
Peter Steinberger
975ec0015c fix: normalize Windows exec allowlist paths 2026-01-23 03:11:41 +00:00
Peter Steinberger
6228985f9d test: speed up test suite 2026-01-23 02:55:38 +00:00
Peter Steinberger
486dd8e071 fix: treat copilot oauth tokens as non-expiring 2026-01-23 02:51:33 +00:00
Peter Steinberger
86c40e5dca fix: set Copilot user agent header 2026-01-23 02:51:33 +00:00
Peter Steinberger
b69e70668d fix: improve GitHub Copilot integration 2026-01-23 02:51:33 +00:00
Peter Steinberger
8e702290f2 fix: honor send path/filePath inputs (#1444) (thanks @hopyky) 2026-01-23 02:27:47 +00:00
Peter Steinberger
04122e4440 test: speed up test suite 2026-01-23 02:22:02 +00:00
Peter Steinberger
7851ce8582 Merge pull request #1444 from hopyky/fix-message-path-parameter
Fix: Support path and filePath parameters in message send action
2026-01-23 02:10:54 +00:00
Peter Steinberger
ce39823185 fix: resolve heartbeat sender and Slack thread_ts 2026-01-23 02:05:34 +00:00
Peter Steinberger
cc34fe86e9 docs: note transcript hygiene sync 2026-01-23 01:38:05 +00:00
Peter Steinberger
6cad20222c refactor: remove transcript sanitize extension 2026-01-23 01:34:33 +00:00
Peter Steinberger
ea95941c40 docs: add transcript hygiene reference 2026-01-23 01:34:21 +00:00
Peter Steinberger
d0c88955d1 Merge pull request #1472 from czekaj/fix/logs-follow-spinner
fix: suppress spinner in logs --follow mode
2026-01-23 01:29:30 +00:00
Peter Steinberger
3b9dfac62f fix: harden Mattermost plugin gating (#1428) (thanks @damoahdominic) 2026-01-23 01:23:23 +00:00
Peter Steinberger
2576cb47c1 fix: improve tool summaries 2026-01-23 01:00:24 +00:00
Lucas Czekaj
8b3a573ccf fix: suppress spinner in logs --follow mode
The progress spinner was being shown for each gateway RPC call during
log tailing, causing repeated spinner frames (◇ │) to appear every
polling interval.

Add a `progress` option to `callGatewayFromCli` and disable the spinner
during follow mode polling to keep output clean.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 16:58:42 -08:00
Peter Steinberger
deb6581c08 feat: add OpenProse plugin skills 2026-01-23 00:49:40 +00:00
Peter Steinberger
828d3f140b fix: gate transcript sanitization by provider 2026-01-23 00:42:45 +00:00
Peter Steinberger
b5c7918620 Merge pull request #1428 from bestparents/feat/mattermost-channel
feat: add Mattermost channel support
2026-01-23 00:24:47 +00:00
Peter Steinberger
2e76f35026 fix: allow chained exec allowlists
Co-authored-by: Lucas Czekaj <1464539+czekaj@users.noreply.github.com>
2026-01-23 00:11:58 +00:00
Peter Steinberger
3dc404530d Merge pull request #1440 from robbyczgw-cla/fix/token-count-after-compaction
fix: update token count display after compaction
2026-01-23 00:10:46 +00:00
Peter Steinberger
497597a302 fix: skip tool id sanitization for openai responses 2026-01-22 23:51:59 +00:00
Peter Steinberger
206fcb6412 refactor: centralize control ui avatar helpers 2026-01-22 23:41:36 +00:00
Peter Steinberger
eaf9cfed3c fix: tui local shell consent UX (#1463)
- add local shell runner + denial notice + tests
- docs: describe ! local shell usage
- lint: drop unused Slack upload contentType
- cleanup: remove stray Swabble pins

Thanks @vignesh07.
Co-authored-by: Vignesh Natarajan <vigneshnatarajan92@gmail.com>
2026-01-22 23:38:44 +00:00
Vignesh Natarajan
56d2910332 tui: clarify local shell exec consent prompt 2026-01-22 23:26:01 +00:00
Vignesh Natarajan
9b4a847fac tui: keep trimming for normal submits; only raw ! triggers bash 2026-01-22 23:26:01 +00:00
Vignesh Natarajan
4fb4a4e1db tui: add local shell execution for !-prefixed lines 2026-01-22 23:26:01 +00:00
Dominic Damoah
d3a0acd8b1 Merge branch 'main' into feat/mattermost-channel 2026-01-22 18:17:40 -05:00
Peter Steinberger
340b338fe5 Merge pull request #1447 from jdrhyne/fix/slack-filetype-deprecation
fix(slack): remove deprecated filetype field from files.uploadV2 [AI]
2026-01-22 23:16:26 +00:00
Peter Steinberger
fb42de9070 feat: add manual onboarding flow alias 2026-01-22 23:09:28 +00:00
Peter Steinberger
fa2bcd3ab7 refactor: require session state for directive handling 2026-01-22 22:42:46 +00:00
Peter Steinberger
ec0cfe0771 fix: clarify session_status model-use guidance 2026-01-22 22:42:37 +00:00
Peter Steinberger
126b3922c0 fix: surface concrete ai error details 2026-01-22 22:24:25 +00:00
Peter Steinberger
462957ce8d Merge pull request #1461 from ameno-/fix/node-daemon-run
Fix node daemon command
2026-01-22 22:02:19 +00:00
Peter Steinberger
fa271cc9d4 fix: resolve control UI avatar URLs (#1457) (thanks @dlauer) 2026-01-22 21:58:46 +00:00
Peter Steinberger
fcedb30f48 Merge pull request #1457 from dlauer/fix/avatar-relative-url-validation
fix(ui): allow relative URLs in avatar validation
2026-01-22 21:57:27 +00:00
Peter Steinberger
3d8a360bbd fix: cover missing session key model switch persist (#1465) (thanks @robbyczgw-cla) 2026-01-22 21:41:05 +00:00
Peter Steinberger
fe784f4944 Merge pull request #1464 from alfranli123/fix/session-memory-suppress-confirmation
fix(session-memory): suppress user-visible confirmation message
2026-01-22 21:40:15 +00:00
Robby
aefe12da3c test: add unit tests for model switch persist behavior
Tests verify:
- Success message shown when session state available
- Error message shown when sessionEntry missing
- Error message shown when sessionStore missing
- No model message when no /model directive

Covers edge cases for #1435 fix.
2026-01-22 20:40:41 +00:00
Robby
bb30a670c8 fix: only show model switch success when persist succeeds (fixes #1435)
Previously, the /model command would display 'Model set to X' even when
the session state wasn't actually persisted (when sessionEntry, sessionStore,
or sessionKey were missing). This caused confusion as users saw success
messages but the model didn't actually change.

This fix:
- Tracks whether the model override was actually persisted
- Only shows success message when persist happened
- Shows a clear error message when persist fails

AI-assisted: Claude Opus 4.5 via Clawdbot
Testing: lightly tested (code review, no runtime test)
2026-01-22 20:31:06 +00:00
Al
f3af9be1af fix(session-memory): suppress user-visible confirmation message
The session-memory hook saves session context to memory files when /new is run,
which is useful internal housekeeping. However, the confirmation message that
was displayed to users (showing the file path) leaked implementation details.

This change removes the user-visible message while keeping the console.log
for debugging purposes. The hook continues to save session context silently.
2026-01-22 15:22:20 -05:00
Dave Lauer
5daa7f8ee8 fix(gateway): resolve local avatars to URL in HTML injection and RPC
The frontend fix alone wasn't enough because:
1. serveIndexHtml() was injecting the raw avatar filename into HTML
2. agent.identity.get RPC was returning raw filename, overwriting the
   HTML-injected value

Now both paths resolve local file avatars (*.png, *.jpg, etc.) to the
/avatar/{agentId} endpoint URL.
2026-01-22 15:16:31 -05:00
Ameno Osman
52503fa237 fix(node): use node run for node daemon 2026-01-22 11:15:51 -08:00
Robby
ef0c75d58c style: fix formatting 2026-01-22 17:47:52 +00:00
Dominic Damoah
622555a77e fix: remove unused originatingChannel variable
Remove unused originatingChannel variable from runPreparedReply function that was assigned but never referenced.
2026-01-22 12:11:05 -05:00
Dominic Damoah
a84766c37e refactor: extract mattermost channel plugin to extension
Move mattermost channel implementation from core to extensions/mattermost plugin. Extract config schema, group mentions, normalize utilities, and all mattermost-specific logic (accounts, client, monitor, probe, send) into the extension. Update imports to use plugin SDK and local modules. Add channel metadata directly in plugin definition instead of using getChatChannelMeta. Update package.json with channel and install configuration.
2026-01-22 12:02:30 -05:00
Jonathan Rhyne
5ae8af7d9b fix(slack): remove deprecated filetype field from files.uploadV2
Slack's files.uploadV2 API no longer supports the filetype field and logs
deprecation warnings when it's included. Slack auto-detects the file type
from the file content, so this field is unnecessary.

This removes the warning:
[WARN] web-api:WebClient filetype is no longer a supported field in files.uploadV2.
2026-01-22 08:33:13 -05:00
Matt mini
b3907f37f6 Fix: Support path and filePath parameters in message send action
The message tool accepts path and filePath parameters in its schema,
but these were never converted to mediaUrl, causing local files to
be ignored when sending messages.

Changes:
- src/agents/tools/message-tool.ts: Convert path/filePath to media with file:// URL
- src/infra/outbound/message-action-runner.ts: Allow hydrateSendAttachmentParams for "send" action

Fixes issue where local audio files (and other media) couldn't be sent
via the message tool with the path parameter.

Users can now use:
  message({ path: "/tmp/file.ogg" })
  message({ filePath: "/tmp/file.ogg" })
2026-01-22 13:15:48 +01:00
Peter Steinberger
ce53ade247 fix: guard invalid avatar bootstrap text 2026-01-22 11:37:29 +00:00
Peter Steinberger
d91e811b0a fix: allowlist match without local exec resolution 2026-01-22 10:29:36 +00:00
Peter Steinberger
4c5068fe81 feat: add sessions preview rpc and menu prewarm 2026-01-22 10:21:50 +00:00
Peter Steinberger
1d5d8c1808 fix: keep backslashes in quoted exec paths 2026-01-22 09:58:24 +00:00
Robby
8722e446c4 fix: update token count display after compaction (#1299) 2026-01-22 09:58:07 +00:00
Peter Steinberger
931709359d fix: omit skills section in minimal prompt 2026-01-22 09:32:49 +00:00
Peter Steinberger
9b4550fc37 test: use absolute exec path for allowlist 2026-01-22 09:20:38 +00:00
Peter Steinberger
99312fd3a1 Merge pull request #1431 from robbyczgw-cla/fix/subagent-skills-inheritance
fix: include skills in minimal prompt mode for subagents
2026-01-22 09:02:28 +00:00
Peter Steinberger
3732b00c5a test: isolate exec allowlist env 2026-01-22 08:58:55 +00:00
Peter Steinberger
6bf574f609 fix: cache usage cost summary 2026-01-22 08:51:22 +00:00
Peter Steinberger
6edd70b7aa fix: wrap cli banner tagline 2026-01-22 08:50:06 +00:00
Peter Steinberger
1682cf15ab chore: update a2ui bundle hash 2026-01-22 08:48:09 +00:00
Peter Steinberger
ce34f00ee9 fix: honor Windows Path casing 2026-01-22 08:33:52 +00:00
Peter Steinberger
086adc003b fix: preserve antigravity thinking block types 2026-01-22 08:31:07 +00:00
Robby
fc0082041b fix: include skills in minimal prompt mode for subagents 2026-01-22 08:28:55 +00:00
Peter Steinberger
b5bd4df7df fix: detect antigravity claude by provider 2026-01-22 08:26:08 +00:00
Peter Steinberger
ae14204f41 fix: sanitize antigravity thinking signatures 2026-01-22 08:17:49 +00:00
Dominic Damoah
8af1af5802 Merge branch 'main' into feat/mattermost-channel 2026-01-22 03:11:53 -05:00
Peter Steinberger
da2540c92a fix: canonicalize allowlist paths on Windows 2026-01-22 08:07:55 +00:00
Peter Steinberger
2adc1533c1 style: format agent workspace and prompts 2026-01-22 08:05:55 +00:00
Peter Steinberger
92ff93d424 fix: carry reply tags across streamed chunks 2026-01-22 08:01:34 +00:00
Peter Steinberger
d7f45900aa fix: allow MEDIA local paths with spaces 2026-01-22 07:51:09 +00:00
Dominic Damoah
f873523e1b Merge branch 'main' into feat/mattermost-channel 2026-01-22 02:49:17 -05:00
Peter Steinberger
76a30fe5ce fix: resolve Windows exec paths with extensions 2026-01-22 07:46:50 +00:00
Peter Steinberger
47a0de8821 test: cover unpaired telegram dm native commands 2026-01-22 07:44:35 +00:00
Peter Steinberger
9ac47ca07a fix: stabilize avatar tests on Windows 2026-01-22 07:24:12 +00:00
Lucas Czekaj
d1b9b8c800 fix(exec): align node exec approvals (#1425)
Thanks @czekaj.

Co-authored-by: Lucas Czekaj <lukasz@czekaj.us>
2026-01-22 07:22:43 +00:00
Peter Steinberger
a71b78c53a fix: remove duplicate loadConfig import 2026-01-22 07:08:13 +00:00
Peter Steinberger
c5e29f395f feat: extend Control UI assistant identity 2026-01-22 07:08:13 +00:00
Robby
f5efb460d0 feat(webui): add custom assistant identity support
Adds the ability to customize the assistant's name and avatar in the Web UI.

Configuration options:
- config.ui.assistant.name: Custom name (replaces 'Assistant')
- config.ui.assistant.avatar: Emoji or letter for avatar (replaces 'A')

Also reads from workspace IDENTITY.md as fallback:
- Name: field sets the assistant name
- Emoji: field sets the avatar

Priority: config > IDENTITY.md > defaults

Closes #1383
2026-01-22 07:07:53 +00:00
Peter Steinberger
d8706307c9 feat: add update wizard and guard elevated defaults 2026-01-22 07:06:19 +00:00
Peter Steinberger
4b26ba61a7 fix: align rolling logs to local time 2026-01-22 07:02:52 +00:00
Peter Steinberger
02861491dd fix: prevent exec approval resolve race 2026-01-22 07:01:27 +00:00
AJ
cdcccd3b7c fix: read account_id from Codex CLI auth for workspace billing 2026-01-22 07:01:10 +00:00
Peter Steinberger
cc9668589a fix: improve gateway ssh auth handling 2026-01-22 06:54:08 +00:00
Peter Steinberger
ab304395bb chore: update a2ui bundle hash 2026-01-22 06:40:02 +00:00
Peter Steinberger
3fa4c10240 fix: load workspace templates from docs 2026-01-22 06:39:28 +00:00
Peter Steinberger
0b0d0cdda9 Merge remote-tracking branch 'origin/main' into feature/agent-avatar-support 2026-01-22 06:27:45 +00:00
Peter Steinberger
2d2a040795 Merge remote-tracking branch 'origin/main' into feature/agent-avatar-support 2026-01-22 06:03:56 +00:00
Peter Steinberger
2862116526 fix: skip elevated defaults when not allowed 2026-01-22 06:03:23 +00:00
Peter Steinberger
11f6f2ec07 fix: inherit model overrides for thread sessions 2026-01-22 06:03:23 +00:00
Peter Steinberger
f7e4e77c02 test: relax canvas host reload timing 2026-01-22 05:54:00 +00:00
Peter Steinberger
7e0bde7dfe test: align envelope timestamp expectations (#1329) (thanks @dlauer) 2026-01-22 05:51:42 +00:00
Peter Steinberger
80b1e09be0 fix: subagents list uses command session 2026-01-22 05:43:50 +00:00
Peter Steinberger
c260b5d585 feat: add elevated ask/full modes 2026-01-22 05:41:11 +00:00
Peter Steinberger
5bc4841918 feat: add agent identity avatars (#1329) (thanks @dlauer) 2026-01-22 05:37:15 +00:00
Peter Steinberger
be0e067e24 fix: restore daemon subcommand alias 2026-01-22 05:33:47 +00:00
Peter Steinberger
c5025bd120 feat: surface repo root in runtime prompt 2026-01-22 05:20:42 +00:00
Peter Steinberger
3b8a999c94 Merge pull request #1419 from jamesgroat/fix/chrome-restore-prompt
Browser: suppress Chrome restore prompt
2026-01-22 05:17:01 +00:00
Peter Steinberger
61a73172ec chore(canvas): update a2ui bundle hash 2026-01-22 04:51:39 +00:00
Peter Steinberger
5c8259f3d3 fix: avoid whatsapp config resurrection 2026-01-22 04:49:56 +00:00
Peter Steinberger
26f568a77e test: align envelope timestamps with local tz 2026-01-22 04:49:41 +00:00
Peter Steinberger
75f274b21f fix: retry lobster spawn on windows 2026-01-22 04:31:25 +00:00
James Groat
6c0dc43c87 Browser: suppress Chrome restore prompt 2026-01-21 21:27:34 -07:00
Peter Steinberger
b8122ba647 feat: preflight update runner before rebase 2026-01-22 04:19:33 +00:00
Peter Steinberger
54d667f194 fix: localize system event timestamps 2026-01-22 04:15:39 +00:00
Peter Steinberger
69aad2d1b2 fix: default envelope timestamps to local 2026-01-22 04:10:06 +00:00
Peter Steinberger
b1e3eafc0d Merge pull request #1329 from dlauer/feature/agent-avatar-support
feat: add avatar support for agent identity
2026-01-22 04:09:00 +00:00
Peter Steinberger
a283afbde9 Merge pull request #1204 from cpojer/reminders
Improve `cron` reminder tool description.
2026-01-22 04:06:50 +00:00
Peter Steinberger
82cec75f25 fix: align exec approvals default agent 2026-01-22 04:05:54 +00:00
Peter Steinberger
311c02c88d fix: map OpenCode Zen models to correct APIs 2026-01-22 04:02:53 +00:00
Peter Steinberger
2c28fca67d feat: add agent avatar support (#1329) (thanks @dlauer) 2026-01-22 04:00:07 +00:00
Peter Steinberger
1d1ee40d6e fix: default exec approvals to main agent (#1417) (thanks @czekaj) 2026-01-22 03:58:53 +00:00
Lucas Czekaj
0d6fb4c841 fix(exec): derive agentId from sessionKey for allowlist lookup
When creating exec tools via chat/Discord, agentId was not passed,
causing allowlist lookup to use 'default' key instead of 'main'.
User's allowlist entries in agents.main were never matched.

Now derives agentId from sessionKey if not explicitly provided,
ensuring correct allowlist lookup for all exec paths.
2026-01-22 03:58:53 +00:00
Dave Lauer
1d3ef2d1f1 chore: fix formatting 2026-01-22 03:56:54 +00:00
Dave Lauer
137e43df3c feat: add avatar support for agent identity
- Add avatar field to IdentityConfig type
- Add avatar parsing in AgentIdentity from IDENTITY.md
- Add renderAvatar support for image avatars in webchat
- Add CSS styling for image avatars

Users can now configure a custom avatar for the assistant in the webchat
by setting 'identity.avatar' in the agent config or adding 'Avatar: path'
to IDENTITY.md. The avatar can be served from the assets folder.

Closes #TBD
2026-01-22 03:56:54 +00:00
Peter Steinberger
08803015bd Merge pull request #1103 from mkbehr/feat/cron-context-messages
feat(cron): Add parameter to control context messages
2026-01-22 03:52:34 +00:00
Peter Steinberger
0eba1aefd4 fix: cap cron context messages (#1103) (thanks @mkbehr) 2026-01-22 03:52:03 +00:00
Peter Steinberger
c2b25dac8e fix: msteams attachments + plugin prompt hints
Co-authored-by: Christof <10854026+Evizero@users.noreply.github.com>
2026-01-22 03:37:29 +00:00
Michael Behr
2fa222f550 update description 2026-01-22 03:37:20 +00:00
Michael Behr
40363547fa feat(cron): add contextMessages param to control reminder context 2026-01-22 03:37:20 +00:00
Peter Steinberger
1e143239a4 fix: prevent memory CLI hangs 2026-01-22 03:14:59 +00:00
Peter Steinberger
16a5fcd629 Merge pull request #1414 from czekaj/fix/discord-exec-resolvedpath-validation
fix(exec): pass undefined instead of null for optional approval params
2026-01-22 03:11:26 +00:00
Peter Steinberger
668f1454fb fix: reduce invalid config log noise 2026-01-22 02:48:01 +00:00
Peter Steinberger
2f9b614678 test: avoid downgrade prompt in update fallback 2026-01-22 02:44:13 +00:00
Peter Steinberger
9ac8f0521d Merge pull request #1373 from yazinsai/main
Add auto-refresh polling for debug view
2026-01-22 02:25:24 +00:00
Peter Steinberger
a55e0ad311 fix: sync debug polling with route changes (#1373) (thanks @yazinsai) 2026-01-22 02:24:19 +00:00
Peter Steinberger
6c347f39d2 test: fix await-thenable in signal typing test 2026-01-22 02:20:42 +00:00
Lucas Czekaj
698e8f4c0c fix(exec): pass undefined instead of null for optional approval params
TypeBox Type.Optional(Type.String()) accepts string|undefined but NOT null.
Discord exec was failing with 'resolvedPath must be string' because callers
passed null explicitly. Web UI worked because it skipped the approval request.

Fixes exec approval validation error in Discord-triggered sessions.
2026-01-21 18:14:51 -08:00
Peter Steinberger
2828d59782 test: stabilize exec approvals path resolution 2026-01-22 02:07:40 +00:00
Peter Steinberger
ca67b686ac feat(signal): add typing + read receipts 2026-01-22 02:04:59 +00:00
Peter Steinberger
aa877337cb test: avoid hardcoded version strings 2026-01-22 02:01:11 +00:00
Peter Steinberger
567415d38f chore: bump version to 2026.1.21 2026-01-22 01:59:16 +00:00
Peter Steinberger
258fe35d5b fix: finish model list alias + heartbeat session (#1256) (thanks @zknicker) 2026-01-22 01:36:58 +00:00
Zach Knickerbocker
66810207e2 feat: configurable heartbeat session 2026-01-22 01:36:28 +00:00
Peter Steinberger
9e96b74a13 fix: handle Windows safe-bin exe names 2026-01-22 01:30:06 +00:00
Peter Steinberger
4d39cba023 Merge pull request #1372 from zerone0x/fix/openrouter-tool-call-id-alphanumeric
fix(agents): use alphanumeric-only tool call IDs for OpenRouter compatibility
2026-01-22 01:17:16 +00:00
Peter Steinberger
ca5b9edbdf test: update fuzzy model selection expectations (#1372) (thanks @zerone0x) 2026-01-22 01:16:59 +00:00
Peter Steinberger
e16601b92c fix: unify exec approval ids 2026-01-22 00:59:29 +00:00
Peter Steinberger
ee4e9b0758 fix: enforce Mistral tool call ids (#1372) (thanks @zerone0x) 2026-01-22 00:43:15 +00:00
Peter Steinberger
8dbf803b1b fix: remove setup-token run option in onboarding 2026-01-22 00:42:04 +00:00
zerone0x
ecb8997da0 fix(agents): make tool call ID sanitization conditional with standard/strict modes
- Add ToolCallIdMode type ('standard' | 'strict') for provider compatibility
- Standard mode (default): allows [a-zA-Z0-9_-] for readable session logs
- Strict mode: only [a-zA-Z0-9] for Mistral via OpenRouter
- Update sanitizeSessionMessagesImages to accept toolCallIdMode option
- Export ToolCallIdMode from pi-embedded-helpers barrel

Addresses review feedback on PR #1372 about readability.
2026-01-22 00:41:22 +00:00
zerone0x
923f28a128 fix(agents): use alphanumeric-only tool call IDs for OpenRouter compatibility
Some providers like Mistral via OpenRouter require strictly alphanumeric
tool call IDs. The error message indicates: "Tool call id was
whatsapp_login_1768799841527_1 but must be a-z, A-Z, 0-9, with a length
of 9."

Changes:
- Update sanitizeToolCallId to strip all non-alphanumeric characters
  (previously allowed underscores and hyphens)
- Update makeUniqueToolId to use alphanumeric suffixes (x2, x3, etc.)
  instead of underscores
- Update isValidCloudCodeAssistToolId to validate alphanumeric-only IDs
- Update tests to reflect stricter sanitization

Fixes #1359

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-22 00:41:22 +00:00
Peter Steinberger
cf3666c416 fix: refine model directive handling 2026-01-22 00:29:27 +00:00
Peter Steinberger
e49887e1d0 fix: warn on unset gateway.mode 2026-01-22 00:21:08 +00:00
Peter Steinberger
e9245837ea fix: enforce secure control ui auth 2026-01-21 23:58:42 +00:00
Dominic Damoah
1d34352691 feat: add Mattermost channel support
Add Mattermost as a supported messaging channel with bot API and WebSocket integration. Includes channel state tracking (tint, summary, details), multi-account support, and delivery target routing. Update documentation and tests to include Mattermost alongside existing channels.
2026-01-21 18:40:56 -05:00
Peter Steinberger
c8442c572d fix: type gateway lock handle 2026-01-21 23:05:11 +00:00
Peter Steinberger
6b7bcc9e8e fix: stabilize ci 2026-01-21 22:59:11 +00:00
Peter Steinberger
1ee83caed4 fix(gateway): enforce singleton lock 2026-01-21 22:47:18 +00:00
Peter Steinberger
147e28ba95 Merge pull request #1398 from vignesh07/feat/models-command
fix(chat): add /models and stop /model from dumping full model list
2026-01-21 21:54:16 +00:00
Peter Steinberger
3161a0ea0a feat: tighten exec allowlist gating 2026-01-21 21:45:50 +00:00
Vignesh Natarajan
71a2cf71ad fix(models): include configured providers/models + ignore page with all 2026-01-21 13:14:18 -08:00
Vignesh Natarajan
8cfa2a6728 fix(models): handle out-of-range pages 2026-01-21 12:54:02 -08:00
Peter Steinberger
7efa487150 fix: add explicit tailnet gateway bind 2026-01-21 20:36:09 +00:00
Peter Steinberger
d3647b2c65 refactor: unify threading contexts 2026-01-21 20:35:12 +00:00
Peter Steinberger
55ef663003 fix: correct nodes exec config typing 2026-01-21 20:32:43 +00:00
Peter Steinberger
b0b96fe731 feat: add heartbeat active hours 2026-01-21 20:30:37 +00:00
Peter Steinberger
3cbd187a13 feat: make nodes run exec-style 2026-01-21 20:25:12 +00:00
Peter Steinberger
112ba5de4b feat: add auth-aware cache defaults 2026-01-21 20:23:39 +00:00
Peter Steinberger
c363dedceb chore(canvas): update a2ui bundle 2026-01-21 20:10:38 +00:00
Peter Steinberger
6357718dad tmp 2026-01-21 20:10:37 +00:00
Peter Steinberger
d89894365d fix: restore 1h cache ttl option 2026-01-21 20:00:32 +00:00
Peter Steinberger
d6af9fd67f fix: drop obsolete pi-mono workarounds 2026-01-21 19:58:19 +00:00
Vignesh Natarajan
71be660bbb feat(commands): add /models and fix /model listing UX 2026-01-21 11:53:29 -08:00
Peter Steinberger
856e758752 fix: reset cache-ttl pruning window 2026-01-21 19:53:00 +00:00
Peter Steinberger
b47d8624ff feat: add cache-ttl pruning mode 2026-01-21 19:46:24 +00:00
Echo
ba1f1f1e5d feat(sessions): add channelIdleMinutes config for per-channel session idle durations (#1353)
* feat(sessions): add channelIdleMinutes config for per-channel session idle durations

Add new `channelIdleMinutes` config option to allow different session idle
timeouts per channel. For example, Discord sessions can now be configured
to last 7 days (10080 minutes) while other channels use shorter defaults.

Config example:
  sessions:
    channelIdleMinutes:
      discord: 10080  # 7 days

The channel-specific idle is passed as idleMinutesOverride to the existing
resolveSessionResetPolicy, integrating cleanly with the new reset policy
architecture.

* fix

* feat: add per-channel session reset overrides (#1353) (thanks @cash-echo-bot)

---------

Co-authored-by: Cash Williams <cashwilliams@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-21 19:10:31 +00:00
Peter Steinberger
f3f65c6fbf fix: harden port listener detection 2026-01-21 18:52:55 +00:00
Peter Steinberger
f5ffaf0117 feat(queue): add per-channel debounce overrides 2026-01-21 18:50:55 +00:00
Peter Steinberger
b81901a3a0 test: cover history image injection 2026-01-21 18:45:23 +00:00
Peter Steinberger
e81d9c977b fix: persist history image injections 2026-01-21 18:45:23 +00:00
Peter Steinberger
4a219c39bc refactor(channels): centralize match metadata 2026-01-21 18:21:19 +00:00
Peter Steinberger
74d5c65d32 fix(discord): align wildcard channel matching 2026-01-21 17:56:01 +00:00
Wimmie
31c0b0ba50 feat(discord): add wildcard channel config support
Add support for '*' wildcard in Discord channel configuration,
matching the existing guild-level wildcard behavior.

This allows applying default channel settings (like autoThread)
to all channels without listing each one explicitly:

  guilds:
    '*':
      channels:
        '*': { autoThread: true }

Specific channel configs still take precedence over the wildcard.
2026-01-21 17:56:01 +00:00
Peter Steinberger
475c94227e chore: rename gateway daemon prompts 2026-01-21 17:46:30 +00:00
Peter Steinberger
bfcb6bc1fe fix: preserve fetch preconnect in abort wrapper 2026-01-21 17:45:58 +00:00
Peter Steinberger
1eeba6ae10 feat: fold gateway service commands into gateway 2026-01-21 17:45:26 +00:00
Peter Steinberger
2fe0342fd3 fix: normalize abort signals for fetch 2026-01-21 17:29:46 +00:00
Peter Steinberger
70172800c5 test: align NO_REPLY typing expectations 2026-01-21 17:12:50 +00:00
Peter Steinberger
d9b07b5e76 fix: start instant typing at run start 2026-01-21 17:12:50 +00:00
Peter Steinberger
fcff0604c7 fix: harden bluebubbles short ids and fetch wrapper (#1369) (thanks @tyler6204) 2026-01-21 17:09:15 +00:00
Peter Steinberger
cad71dfd3b Merge pull request #1369 from tyler6204/fix/bluebubbles-gc-guid-resolution
BlueBubbles: short ID mapping, action resolution, and threading/typing fixes
2026-01-21 17:06:09 +00:00
Peter Steinberger
16a15e0bf5 feat: flatten node CLI commands 2026-01-21 16:48:42 +00:00
Peter Steinberger
fa06c2c1be fix: normalize abort signals for telegram fetch 2026-01-21 16:46:58 +00:00
Peter Steinberger
f02e4200b1 fix: model picker allowlist fallbacks 2026-01-21 11:22:33 +00:00
Peter Steinberger
952d89ef65 feat: render approvals tables on write 2026-01-21 11:10:03 +00:00
Peter Steinberger
054d492165 feat: show node PATH and bootstrap node host env 2026-01-21 11:06:56 +00:00
Peter Steinberger
330f61968a fix: narrow configure model allowlist for Anthropic OAuth 2026-01-21 11:00:28 +00:00
Peter Steinberger
dfdec2687d test: stabilize exec approvals homedir 2026-01-21 10:49:12 +00:00
Peter Steinberger
177d14ce35 fix: limit /model list output 2026-01-21 10:47:37 +00:00
Peter Steinberger
8ad322c145 fix: make session memory indexing async 2026-01-21 10:39:00 +00:00
Peter Steinberger
aeb4bd7315 fix: add diagnostics cache trace config (#1370) (thanks @parubets) 2026-01-21 10:23:30 +00:00
Andrii
72a68edbf1 cache trace mvp
Added a standalone cache tracing module and wired it into the embedded
runner so you can capture message flow and the exact context sent to
  Anthropic in a separate JSONL file.

  What changed

  - New tracing module: src/agents/cache-trace.ts (self‑contained,
env‑gated, writes JSONL, computes per‑message digests).
  - Hook points in src/agents/pi-embedded-runner/run/attempt.ts: logs
stage snapshots (loaded/sanitized/limited/prompt/stream/after) and wraps
the
    stream fn to record the real context.messages at send time.

  How to enable

  - CLAWDBOT_CACHE_TRACE=1 enables tracing.
  - CLAWDBOT_CACHE_TRACE_FILE=~/.clawdbot/logs/cache-trace.jsonl
overrides output (default is
$CLAWDBOT_STATE_DIR/logs/cache-trace.jsonl).
  - Optional filters:
      - CLAWDBOT_CACHE_TRACE_MESSAGES=0 to omit full messages (still
logs digests).
      - CLAWDBOT_CACHE_TRACE_PROMPT=0 to omit prompt text.
      - CLAWDBOT_CACHE_TRACE_SYSTEM=0 to omit system prompt.

  What you’ll see

  - One JSON object per line with stage, messagesDigest, per‑message
messageFingerprints, and the actual messages if enabled.
  - The most important line is stage: "stream:context" — that is the
exact payload pi‑mono is sending. If this diverges from earlier stages,
you’ve
    found the mutation point.
2026-01-21 10:23:30 +00:00
Peter Steinberger
9a41d1698a fix: add node tool failure context 2026-01-21 09:55:10 +00:00
Peter Steinberger
1b207ed6c4 feat: improve exec approvals defaults and wildcard 2026-01-21 09:55:10 +00:00
Peter Steinberger
60df6fe037 test: skip plugin tools in sessions tools test 2026-01-21 09:17:27 +00:00
Peter Steinberger
12e7b3a571 refactor: centralize sandbox runtime label 2026-01-21 09:07:21 +00:00
Peter Steinberger
37619c2e0e fix: use plugin-sdk exports in bluebubbles 2026-01-21 09:03:09 +00:00
Peter Steinberger
b72917c8a2 fix: report sandboxed runtime in status 2026-01-21 08:59:32 +00:00
Tyler Yust
1291588784 feat: enhance message context with full ID support for replies and caching
- Updated message processing to include full message IDs alongside short IDs for better context resolution.
- Improved reply handling by caching inbound messages, allowing for accurate sender and body resolution without exposing dropped content.
- Adjusted tests to validate the new full ID properties and their integration into the message handling workflow.
2026-01-21 00:45:01 -08:00
Tyler Yust
b7fcc1045c feat: implement short ID mapping for BlueBubbles messages and enhance reply context caching
- Added functionality to resolve short message IDs to full UUIDs and vice versa, optimizing token usage.
- Introduced a reply cache to store message context for replies when metadata is omitted in webhook payloads.
- Updated message handling to utilize short IDs for outbound messages and replies, improving efficiency.
- Enhanced error messages to clarify required parameters for actions like react, edit, and unsend.
- Added tests to ensure correct behavior of new features and maintain existing functionality.
2026-01-21 00:45:01 -08:00
Peter Steinberger
df2d8f1da7 fix: quiet update banner and skip duplicate plugin CLI 2026-01-21 07:37:22 +00:00
Peter Steinberger
d75432bfd1 fix: guard anthropic refusal trigger 2026-01-21 07:28:49 +00:00
Peter Steinberger
043f75c74d fix: clean up slack threading landings (#1360) (thanks @SocialNerd42069) 2026-01-21 06:29:36 +00:00