Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
202 commits
Select commit Hold shift + click to select a range
eeef7cc
wip
batuhan Mar 11, 2026
7ac9178
Update approval_prompt.go
batuhan Mar 11, 2026
0b24c62
w
batuhan Mar 11, 2026
5e6305d
wip
batuhan Mar 11, 2026
3ad4926
sync
batuhan Mar 11, 2026
ae325c2
sync
batuhan Mar 11, 2026
5fcf659
sync
batuhan Mar 11, 2026
21a16e7
sync
batuhan Mar 11, 2026
613074b
sync
batuhan Mar 11, 2026
437e0dc
Create agentremote bridge wrapper
batuhan Mar 12, 2026
f900e74
sync
batuhan Mar 12, 2026
c1a5b60
Run full CI and deadcode checks
batuhan Mar 12, 2026
17bcacf
Run all CI checks and fix issues
batuhan Mar 12, 2026
41111b7
sync
batuhan Mar 12, 2026
36b8dd7
sync
batuhan Mar 12, 2026
30e18d9
sync
batuhan Mar 12, 2026
3913e8f
Update connector_builder_test.go
batuhan Mar 12, 2026
6ec022c
sync
batuhan Mar 12, 2026
9adcecf
sync
batuhan Mar 12, 2026
232234e
sync
batuhan Mar 13, 2026
74465e3
add cli
batuhan Mar 13, 2026
f9c3f47
sync
batuhan Mar 13, 2026
1b5cb3a
wip
batuhan Mar 13, 2026
033ea37
sdk
batuhan Mar 13, 2026
7266ba7
sync
batuhan Mar 13, 2026
1f95b39
sync
batuhan Mar 13, 2026
dbeabce
wip
batuhan Mar 13, 2026
26b5222
wip
batuhan Mar 13, 2026
558c11a
sync
batuhan Mar 13, 2026
4334be1
sync
batuhan Mar 13, 2026
051c583
sync
batuhan Mar 13, 2026
98cd62d
wip
batuhan Mar 13, 2026
9e742c7
sync
batuhan Mar 13, 2026
153ffc4
sync
batuhan Mar 13, 2026
76bf331
sync
batuhan Mar 13, 2026
2108452
sync
batuhan Mar 13, 2026
50d99ee
sync
batuhan Mar 13, 2026
e63fa79
sync
batuhan Mar 13, 2026
3ad4b6f
sync
batuhan Mar 13, 2026
0245da0
sync
batuhan Mar 13, 2026
38994f5
sync
batuhan Mar 13, 2026
b43f003
sync
batuhan Mar 13, 2026
3a5e0cb
sync
batuhan Mar 13, 2026
c55ab63
sync
batuhan Mar 13, 2026
142819b
sync
batuhan Mar 13, 2026
16c7c86
sync
batuhan Mar 13, 2026
4dbbf92
sync
batuhan Mar 13, 2026
210b32d
sync
batuhan Mar 13, 2026
00efcfc
sync
batuhan Mar 13, 2026
d302cff
sync
batuhan Mar 13, 2026
f9d8b23
sync
batuhan Mar 13, 2026
5d3501e
sync
batuhan Mar 13, 2026
8b9dda7
sync
batuhan Mar 13, 2026
ac5955a
sync
batuhan Mar 13, 2026
2fc550f
sync
batuhan Mar 13, 2026
2e7df53
sync
batuhan Mar 13, 2026
f53b15a
sync
batuhan Mar 13, 2026
60bc340
sync
batuhan Mar 13, 2026
33f9175
sync
batuhan Mar 13, 2026
d2e1df9
sync
batuhan Mar 13, 2026
71c5489
sync
batuhan Mar 13, 2026
ac28e71
sync
batuhan Mar 13, 2026
f586ba9
sync
batuhan Mar 13, 2026
c83625c
sync
batuhan Mar 13, 2026
8820ccb
sync
batuhan Mar 13, 2026
a8a993f
sync
batuhan Mar 13, 2026
68c3377
sync
batuhan Mar 13, 2026
b48046d
sync
batuhan Mar 13, 2026
5859066
Update system_prompt_openclaw.go
batuhan Mar 13, 2026
04f273a
sync
batuhan Mar 13, 2026
4dcf412
sync
batuhan Mar 13, 2026
1692472
sync
batuhan Mar 13, 2026
2093178
sync
batuhan Mar 13, 2026
7eb8caf
sync
batuhan Mar 13, 2026
979a2da
Remove unused sdk wrapper functions and consolidate code
batuhan Mar 13, 2026
d3aba68
Deduplicate display name resolution and simplify login flow check in …
batuhan Mar 13, 2026
10b5c4f
Simplify fetch and search modules by removing redundant abstractions
batuhan Mar 13, 2026
7ce9303
sync
batuhan Mar 13, 2026
7afce24
Simplify codex bridge client by removing unnecessary type wrapper casts
batuhan Mar 13, 2026
3c28fc9
sync
batuhan Mar 13, 2026
8e3ce87
sync
batuhan Mar 13, 2026
cfbcadc
Update path.go
batuhan Mar 13, 2026
3d5348d
Update overflow_exec.go
batuhan Mar 13, 2026
3aded5e
sync
batuhan Mar 13, 2026
1b21ff4
Update typing_mode.go
batuhan Mar 13, 2026
a026d32
sync
batuhan Mar 13, 2026
4fea434
sync
batuhan Mar 13, 2026
48d8171
sync
batuhan Mar 13, 2026
b4ee5ed
syn
batuhan Mar 14, 2026
9a3cb77
sync
batuhan Mar 14, 2026
59e6eb2
sync
batuhan Mar 14, 2026
db72fb3
sync
batuhan Mar 14, 2026
5ad860b
sync
batuhan Mar 14, 2026
ab70b5a
sync
batuhan Mar 14, 2026
9828c52
sync
batuhan Mar 14, 2026
332a24e
sync
batuhan Mar 14, 2026
fb92696
sync
batuhan Mar 14, 2026
a4eaa36
sync
batuhan Mar 14, 2026
3836eef
sync
batuhan Mar 14, 2026
e4edece
sync
batuhan Mar 14, 2026
5d7a433
sync
batuhan Mar 14, 2026
780a32a
sync
batuhan Mar 14, 2026
9b3c1e0
sync
batuhan Mar 14, 2026
7151e98
sync
batuhan Mar 14, 2026
958fc7b
sync
batuhan Mar 14, 2026
80073fa
sync
batuhan Mar 14, 2026
d2fe614
sync
batuhan Mar 14, 2026
b1309db
sync
batuhan Mar 14, 2026
459c0a7
sync
batuhan Mar 14, 2026
f8c1da3
sync
batuhan Mar 14, 2026
5624b26
sync
batuhan Mar 14, 2026
539def1
sync
batuhan Mar 14, 2026
5eee6d8
sync
batuhan Mar 14, 2026
459f302
cleanup
batuhan Mar 14, 2026
ec52934
sync
batuhan Mar 14, 2026
a62fd6e
Simplify and deduplicate sdk/ package
batuhan Mar 14, 2026
53391bb
Remove dead code and unnecessary cliutil auth wrapper layer
batuhan Mar 14, 2026
7dbbbf9
Deduplicate silent-reply detection and token estimation in pkg/runtime
batuhan Mar 14, 2026
c4d755e
Simplify codex, openclaw, and opencode bridge code
batuhan Mar 14, 2026
9603d2e
Deduplicate DebouncedEditContent by reusing RenderedMarkdownContent
batuhan Mar 14, 2026
128118f
Deduplicate and simplify pkg/agents/ tool definitions
batuhan Mar 14, 2026
79f01bf
Simplify and deduplicate pkg/shared/ utilities
batuhan Mar 14, 2026
78bba2d
Deduplicate hash/regex utilities across pkg/memory and pkg/integratio…
batuhan Mar 14, 2026
662be24
Deduplicate and simplify bridges/ai/ code
batuhan Mar 14, 2026
3ccce1d
Simplify and refine pkg/fetch, pkg/memory, and pkg/textfs code
batuhan Mar 14, 2026
19e8300
Simplify and refine pkg/shared/ utilities for clarity and consistency
batuhan Mar 14, 2026
c7a8877
Simplify cmd/ and managedruntime/ code for clarity and consistency
batuhan Mar 14, 2026
b3b51df
Simplify and refine store/ and turns/ code
batuhan Mar 14, 2026
b329244
Simplify and refine root-level Go files for clarity and consistency
batuhan Mar 14, 2026
9213bb7
Simplify and refine pkg/agents/ and pkg/runtime/ code
batuhan Mar 14, 2026
c399257
Simplify and refine bridges/ai/ code for clarity and consistency
batuhan Mar 14, 2026
55f6ded
Simplify and deduplicate pkg/integrations/ code
batuhan Mar 14, 2026
7408b6f
Create host_types.go
batuhan Mar 14, 2026
fe7a6ef
sync
batuhan Mar 14, 2026
0c208f6
syncsync
batuhan Mar 14, 2026
102ad8d
sync
batuhan Mar 14, 2026
485353c
Remove tracing and unused helper code
batuhan Mar 14, 2026
5d9ac3d
implement coderabbit review fixes
batuhan Mar 14, 2026
34f514e
Remove trailing blank lines in files
batuhan Mar 14, 2026
4088344
Improve streaming finish handling and reason mapping
batuhan Mar 14, 2026
af53712
Fix approval flow, AI tools, and memory cache
batuhan Mar 14, 2026
02fc7d1
Update model defaults and improve streaming logic
batuhan Mar 14, 2026
5f0bf99
Refactor portal send, streaming tools, and helpers
batuhan Mar 14, 2026
1a76d8b
Add path expansion helpers and use them
batuhan Mar 14, 2026
20699a4
Refactor tools API and use agentremote DM helpers
batuhan Mar 14, 2026
35d13c5
Add Tools/Approvals controllers to SemanticStream
batuhan Mar 14, 2026
fd0cfd9
Replace SemanticStream with Writer and update SDK
batuhan Mar 14, 2026
869a553
Use writer/context and citations in ApplyStreamPart
batuhan Mar 14, 2026
387ab68
Refactor streaming tool lifecycle and writer usage
batuhan Mar 14, 2026
4213fb0
Update part_apply.go
batuhan Mar 14, 2026
d838f18
Use SDK writer API and add ReplayBuilder
batuhan Mar 14, 2026
0a37fdc
Use SDK writer API and add ReplayBuilder
batuhan Mar 14, 2026
18c6299
Adopt SDK connector config & agent catalog
batuhan Mar 14, 2026
1f5126b
Remove requestApproval and cleanup imports
batuhan Mar 14, 2026
934b375
Inline tool approval registration and emit request
batuhan Mar 14, 2026
fd4c750
Refactor proxy URL handling and tool APIs
batuhan Mar 14, 2026
cc8b5ef
Move PromptContext to SDK; refactor approvals
batuhan Mar 14, 2026
3847089
Use bridgesdk prompt types and helpers
batuhan Mar 14, 2026
560d0a6
Use SDK BuildDataURL and PromptContext helpers
batuhan Mar 14, 2026
93dfa2f
Inline tool input/error and approval writer calls
batuhan Mar 14, 2026
c227207
Update config_merge_test.go
batuhan Mar 14, 2026
9df92e4
Add MergeUIMessageMetadata; remove valid()
batuhan Mar 14, 2026
4ac9d26
Use SDK Turn writer for streaming UI
batuhan Mar 14, 2026
2dcbc29
Use Turn for streaming message IDs
batuhan Mar 14, 2026
a1e1565
Refactor streaming approvals, persistence, and tools
batuhan Mar 14, 2026
1bbd9b4
Remove UI emit helpers and update approvals
batuhan Mar 14, 2026
9373af7
Refactor streaming turn/state and tool registry
batuhan Mar 14, 2026
fa6d59e
Refactor streaming actions and tool handling
batuhan Mar 14, 2026
114f7de
Remove unused helpers, stores, and tests
batuhan Mar 14, 2026
890948a
Remove legacy AI message helpers and tests
batuhan Mar 14, 2026
9075c0f
Remove unused imports and redundant handler
batuhan Mar 15, 2026
c57d37f
ai: validations, streaming/tool fixes, tests
batuhan Mar 15, 2026
424bc28
Add auto-approved reason and remove TurnManager
batuhan Mar 15, 2026
f09639c
Use displayStreamingText and remove unused files
batuhan Mar 15, 2026
22ccf4c
Add portal lifecycle, backfill & command login
batuhan Mar 15, 2026
72f9b96
Initialize created flag explicitly
batuhan Mar 15, 2026
54f4203
Use Turn SourceRef for streaming state
batuhan Mar 15, 2026
5acb348
Update turn_test.go
batuhan Mar 15, 2026
97edfbf
Refactor AI client/approvals and improve Codex handling
batuhan Mar 15, 2026
40c2eb5
sync
batuhan Mar 15, 2026
fe2f046
sync
batuhan Mar 15, 2026
597ff2e
Refactor agent loop tools and steering
batuhan Mar 15, 2026
bb741b0
Improve AI client validation and tool handling
batuhan Mar 15, 2026
a01e74a
Finalize agent loop on error and guard nil state
batuhan Mar 15, 2026
404e89c
Use canonical TurnData snapshots
batuhan Mar 15, 2026
f1cf874
Remove CanonicalTurnSchema and rely on data presence
batuhan Mar 15, 2026
710fd85
Unify canonical UI message naming to UIMessage
batuhan Mar 15, 2026
e42e0b9
Invoke procCancel when RPC creation fails
batuhan Mar 15, 2026
b12fa25
Refactor AI events, client base, and auth helpers
batuhan Mar 15, 2026
628d921
Handle wrong-target approvals; improve AI errors
batuhan Mar 15, 2026
d4208a3
Persist debounced checkpoint for approval responses
batuhan Mar 15, 2026
68d1b72
Reject reaction changes for resolved approvals
batuhan Mar 15, 2026
7999b42
Add event timing, unify reactions, and Codex fixes
batuhan Mar 15, 2026
554268e
Add Codex commands; refactor OpenClaw events
batuhan Mar 16, 2026
b85c071
Rename AI bridge to AI Chats and normalize configs
batuhan Mar 16, 2026
c25e20b
Make agent Temperature optional and related fixes
batuhan Mar 16, 2026
3553344
Remove OpenCode removal APIs and stream state
batuhan Mar 16, 2026
d2f42b0
Approval expiry, AI client, and provisioning fixes
batuhan Mar 16, 2026
2432b33
ai: add nil checks, refactor DB & system events
batuhan Mar 16, 2026
30fe1a8
Update turn_primitives.go
batuhan Mar 16, 2026
803416b
Consume queue summaries when dispatching
batuhan Mar 16, 2026
fd28c5e
Update pending_queue.go
batuhan Mar 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@ logs/
.cache
.gocache
.conductor

.tmp-go/
.claude/worktrees/
49 changes: 49 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
version: 2

builds:
- id: agentremote
main: ./cmd/agentremote
binary: agentremote
env:
- CGO_ENABLED=1
goos:
- darwin
- linux
goarch:
- amd64
- arm64
ldflags:
- -s -w
- -X main.Tag={{.Tag}}
- -X main.Commit={{.Commit}}
- -X main.BuildTime={{.Date}}

archives:
- id: agentremote
builds:
- agentremote
format: tar.gz
name_template: "agentremote_{{ .Os }}_{{ .Arch }}"

brews:
- name: agentremote
ids:
- agentremote
repository:
owner: beeper
name: homebrew-tap
homepage: https://github.com/beeper/agentremote
description: Unified AI bridge manager for Beeper
license: Apache-2.0
install: |
bin.install "agentremote"

checksum:
name_template: "checksums.txt"

changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
126 changes: 124 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,135 @@ That means:

There is a broader product direction around richer AI chats and more opinionated agent experiences. Open source here is focused on making the bridge layer for private deployments easy to run and hard to break.

## AgentRemote SDK

If you want to build your own bridge, start with the SDK in [`sdk/`](./sdk).

The SDK handles the Matrix and Beeper side of the bridge for you:

- bridge bootstrapping and registration
- room and conversation wrappers
- streaming turn lifecycle
- tool approval UI
- agent identity and capability metadata

The main entrypoint is `sdk.New(sdk.Config{...})`.

In practice, most custom bridges only need three things:

- an `sdk.Agent` that represents the remote assistant in Beeper
- an `OnConnect` hook that builds whatever runtime client you need
- an `OnMessage` hook that turns an incoming Beeper message into model output

### Minimal SDK Shape

This is the smallest useful shape of a bridge:

```go
bridge := sdk.New(sdk.Config{
Name: "my-bridge",
Agent: &sdk.Agent{
ID: "my-agent",
Name: "My Agent",
Description: "A custom agent exposed through Beeper",
ModelKey: "openai/gpt-5-mini",
Capabilities: sdk.BaseAgentCapabilities(),
},
OnConnect: func(ctx context.Context, login *sdk.LoginInfo) (any, error) {
return newRuntimeClient(), nil
},
OnMessage: func(session any, conv *sdk.Conversation, msg *sdk.Message, turn *sdk.Turn) error {
turn.WriteText("hello from my bridge")
turn.End("stop")
return nil
},
})

bridge.Run()
```

`turn` is the important piece here. You can write text and reasoning deltas into it, request approvals, attach sources/files, and then finalize the message with `turn.End(...)` or `turn.EndWithError(...)`.

### Simple OpenAI SDK Bridge

The example below is intentionally minimal. It uses the Go OpenAI SDK directly and lets AgentRemote handle the chat room, sender identity, and message lifecycle.

```go
package main

import (
"context"
"fmt"
"log"
"os"

"github.com/beeper/agentremote/sdk"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
)

func main() {
if os.Getenv("OPENAI_API_KEY") == "" {
log.Fatal("OPENAI_API_KEY is required")
}

bridge := sdk.New(sdk.Config{
Name: "openai-simple",
Description: "A minimal OpenAI-backed AgentRemote bridge",
Agent: &sdk.Agent{
ID: "openai-simple-agent",
Name: "OpenAI Simple",
Description: "Minimal bridge example using openai-go",
ModelKey: "openai/gpt-4o-mini",
Capabilities: sdk.BaseAgentCapabilities(),
},
OnConnect: func(ctx context.Context, login *sdk.LoginInfo) (any, error) {
return openai.NewClient(option.WithAPIKey(os.Getenv("OPENAI_API_KEY"))), nil
},
OnMessage: func(session any, conv *sdk.Conversation, msg *sdk.Message, turn *sdk.Turn) error {
client := session.(*openai.Client)

resp, err := client.Chat.Completions.New(turn.Context(), openai.ChatCompletionNewParams{
Model: "gpt-4o-mini",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.SystemMessage("You are a helpful assistant replying through Beeper."),
openai.UserMessage(msg.Text),
},
})
if err != nil {
turn.EndWithError(err.Error())
return err
}
if len(resp.Choices) == 0 {
err := fmt.Errorf("openai returned no choices")
turn.EndWithError(err.Error())
return err
}

turn.WriteText(resp.Choices[0].Message.Content)
turn.End(resp.Choices[0].FinishReason)
return nil
},
})

bridge.Run()
}
```

Useful details from that example:

- `OnConnect` returns the session object that will be passed back into every `OnMessage` call.
- `sdk.Message` already gives you the normalized incoming Beeper message text.
- `sdk.Turn` is where you stream or finalize the assistant reply.
- If you want live token streaming later, switch the OpenAI call to `client.Chat.Completions.NewStreaming(...)` or `client.Responses.NewStreaming(...)` and forward deltas with `turn.WriteText(...)`.

## Included Bridges

Each bridge has its own README with setup details and scope:

| Bridge | Purpose |
| --- | --- |
| `ai` | General Matrix-to-AI bridge surface used by the project |
| `ai` | AI Chats bridge surface used by the project |
| [`codex`](./bridges/codex/README.md) | Connect the Codex CLI app-server to Beeper |
| [`openclaw`](./bridges/openclaw/README.md) | Connect a self-hosted OpenClaw gateway to Beeper |
| [`opencode`](./bridges/opencode/README.md) | Connect a self-hosted OpenCode server to Beeper |
Expand All @@ -59,7 +181,7 @@ For a local Beeper environment:
./tools/bridges run codex
```

Configured instances in `bridges.manifest.yml`:
Configured instances live under `~/.config/agentremote/profiles/<profile>/instances/`:

- `ai`
- `codex`
Expand Down
2 changes: 1 addition & 1 deletion bridgectl.sh → agentremote.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
go run ./cmd/bridgectl "$@"
go run ./cmd/agentremote "$@"
14 changes: 13 additions & 1 deletion pkg/bridgeadapter/approval_decision.go → approval_decision.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
package bridgeadapter
package agentremote

import (
"errors"
"strings"
)

// Approval decision reason constants.
const (
ApprovalReasonAllowOnce = "allow_once"
ApprovalReasonAllowAlways = "allow_always"
ApprovalReasonAutoApproved = "auto_approved"
ApprovalReasonDeny = "deny"
ApprovalReasonTimeout = "timeout"
ApprovalReasonExpired = "expired"
ApprovalReasonCancelled = "cancelled"
ApprovalReasonDeliveryError = "delivery_error"
)

// ApprovalDecisionPayload is the standardized decision type for all approval flows.
type ApprovalDecisionPayload struct {
ApprovalID string
Expand Down
Loading
Loading