opencode

package
v0.0.0-...-f0e47c8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 11, 2026 License: MIT Imports: 33 Imported by: 0

README

OpenCode Bridge

The OpenCode bridge connects a self-hosted OpenCode server to Beeper through AgentRemote.

It is built for setups where OpenCode is already running on a machine you trust and you want Beeper to become the front end. That can be a local development machine, a lab box, or an office server that you reach from your phone.

What It Does

  • Connects to an OpenCode server over HTTP
  • Subscribes to the OpenCode event stream for live updates
  • Maps OpenCode sessions into Beeper rooms
  • Streams responses, titles, and session events into chat
  • Keeps the bridge usable even when the remote instance temporarily disconnects

Login Model

The bridge asks for:

  • Server URL
  • Optional username
  • Optional password for HTTP basic auth

Multiple OpenCode instances can be tracked per login, which is useful if you talk to different machines or environments.

Best Fit

Use this bridge when:

  • You run OpenCode yourself and want Beeper access from anywhere
  • You want a simple remote interface for agent sessions without exposing a separate UI
  • You want to keep the runtime and credentials on the host machine

Run It

From the repo root:

./tools/bridges run opencode

Or:

./run.sh opencode

Notes

  • OpenCode uses an HTTP API plus event streaming rather than the local Codex app-server flow.
  • In AgentRemote terms, this is the bridge for turning a private OpenCode deployment into a Beeper-accessible agent endpoint.

Documentation

Index

Constants

View Source
const (
	FlowOpenCodeRemote  = "opencode_remote"
	FlowOpenCodeManaged = "opencode_managed"
)
View Source
const ProviderOpenCode = "opencode"

Variables

This section is empty.

Functions

This section is empty.

Types

type Config

type Config struct {
	Bridge   bridgeconfig.BridgeConfig `yaml:"bridge"`
	OpenCode OpenCode                  `yaml:"opencode"`
}

type GhostMetadata

type GhostMetadata struct{}

type MessageMetadata

type MessageMetadata = opencodebridge.MessageMetadata

type OpenCode

type OpenCode struct {
	Enabled *bool `yaml:"enabled"`
}

type OpenCodeClient

type OpenCodeClient struct {
	bridgeadapter.BaseReactionHandler
	bridgeadapter.BaseStreamState
	UserLogin *bridgev2.UserLogin
	// contains filtered or unexported fields
}

func (*OpenCodeClient) BackgroundContext

func (oc *OpenCodeClient) BackgroundContext(ctx context.Context) context.Context

func (*OpenCodeClient) CleanupPortal

func (oc *OpenCodeClient) CleanupPortal(ctx context.Context, portal *bridgev2.Portal, reason string)

func (*OpenCodeClient) Connect

func (oc *OpenCodeClient) Connect(ctx context.Context)

func (*OpenCodeClient) DefaultAgentID

func (oc *OpenCodeClient) DefaultAgentID() string

func (*OpenCodeClient) Disconnect

func (oc *OpenCodeClient) Disconnect()

func (*OpenCodeClient) DownloadAndEncodeMedia

func (oc *OpenCodeClient) DownloadAndEncodeMedia(ctx context.Context, mediaURL string, file *event.EncryptedFileInfo, maxMB int) (string, string, error)

func (*OpenCodeClient) EmitOpenCodeStreamEvent

func (oc *OpenCodeClient) EmitOpenCodeStreamEvent(ctx context.Context, portal *bridgev2.Portal, turnID, agentID, targetEventID string, part map[string]any)

func (*OpenCodeClient) FetchMessages

func (*OpenCodeClient) FinishOpenCodeStream

func (oc *OpenCodeClient) FinishOpenCodeStream(turnID string)

func (*OpenCodeClient) GetApprovalHandler

func (oc *OpenCodeClient) GetApprovalHandler() bridgeadapter.ApprovalReactionHandler

func (*OpenCodeClient) GetCapabilities

func (oc *OpenCodeClient) GetCapabilities(_ context.Context, _ *bridgev2.Portal) *event.RoomFeatures

func (*OpenCodeClient) GetChatInfo

func (oc *OpenCodeClient) GetChatInfo(_ context.Context, portal *bridgev2.Portal) (*bridgev2.ChatInfo, error)

func (*OpenCodeClient) GetContactList

func (oc *OpenCodeClient) GetContactList(ctx context.Context) ([]*bridgev2.ResolveIdentifierResponse, error)

func (*OpenCodeClient) GetUserInfo

func (oc *OpenCodeClient) GetUserInfo(_ context.Context, ghost *bridgev2.Ghost) (*bridgev2.UserInfo, error)

func (*OpenCodeClient) GetUserLogin

func (oc *OpenCodeClient) GetUserLogin() *bridgev2.UserLogin

func (*OpenCodeClient) HandleMatrixDeleteChat

func (oc *OpenCodeClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2.MatrixDeleteChat) error

func (*OpenCodeClient) HandleMatrixMessage

func (*OpenCodeClient) HumanUserID

func (oc *OpenCodeClient) HumanUserID(loginID networkid.UserLoginID) networkid.UserID

func (*OpenCodeClient) IsLoggedIn

func (oc *OpenCodeClient) IsLoggedIn() bool

func (*OpenCodeClient) IsThisUser

func (oc *OpenCodeClient) IsThisUser(_ context.Context, userID networkid.UserID) bool

func (*OpenCodeClient) Log

func (oc *OpenCodeClient) Log() *zerolog.Logger

func (*OpenCodeClient) Login

func (oc *OpenCodeClient) Login() *bridgev2.UserLogin

func (*OpenCodeClient) LogoutRemote

func (oc *OpenCodeClient) LogoutRemote(_ context.Context)

func (*OpenCodeClient) OpenCodeInstances

func (oc *OpenCodeClient) OpenCodeInstances() map[string]*opencodebridge.OpenCodeInstance

func (*OpenCodeClient) PortalMeta

func (oc *OpenCodeClient) PortalMeta(portal *bridgev2.Portal) *opencodebridge.PortalMeta

func (*OpenCodeClient) ResolveIdentifier

func (oc *OpenCodeClient) ResolveIdentifier(ctx context.Context, identifier string, createChat bool) (*bridgev2.ResolveIdentifierResponse, error)

func (*OpenCodeClient) RoomCapabilitiesEventType

func (oc *OpenCodeClient) RoomCapabilitiesEventType() event.Type

func (*OpenCodeClient) RoomSettingsEventType

func (oc *OpenCodeClient) RoomSettingsEventType() event.Type

func (*OpenCodeClient) SaveOpenCodeInstances

func (oc *OpenCodeClient) SaveOpenCodeInstances(ctx context.Context, instances map[string]*opencodebridge.OpenCodeInstance) error

func (*OpenCodeClient) SavePortal

func (oc *OpenCodeClient) SavePortal(ctx context.Context, portal *bridgev2.Portal) error

func (*OpenCodeClient) SendSystemNotice

func (oc *OpenCodeClient) SendSystemNotice(ctx context.Context, portal *bridgev2.Portal, msg string)

func (*OpenCodeClient) SenderForOpenCode

func (oc *OpenCodeClient) SenderForOpenCode(instanceID string, fromMe bool) bridgev2.EventSender

func (*OpenCodeClient) SetPortalMeta

func (oc *OpenCodeClient) SetPortalMeta(portal *bridgev2.Portal, meta *opencodebridge.PortalMeta)

func (*OpenCodeClient) SetRoomName

func (oc *OpenCodeClient) SetRoomName(_ context.Context, _ *bridgev2.Portal, _ string) error

type OpenCodeConnector

type OpenCodeConnector struct {
	bridgeadapter.BaseConnectorMethods

	Config Config
	// contains filtered or unexported fields
}

func NewConnector

func NewConnector() *OpenCodeConnector

func (*OpenCodeConnector) CreateLogin

func (oc *OpenCodeConnector) CreateLogin(_ context.Context, user *bridgev2.User, flowID string) (bridgev2.LoginProcess, error)

func (*OpenCodeConnector) GetConfig

func (oc *OpenCodeConnector) GetConfig() (example string, data any, upgrader configupgrade.Upgrader)

func (*OpenCodeConnector) GetDBMetaTypes

func (oc *OpenCodeConnector) GetDBMetaTypes() database.MetaTypes

func (*OpenCodeConnector) GetLoginFlows

func (oc *OpenCodeConnector) GetLoginFlows() []bridgev2.LoginFlow

func (*OpenCodeConnector) GetName

func (oc *OpenCodeConnector) GetName() bridgev2.BridgeName

func (*OpenCodeConnector) Init

func (oc *OpenCodeConnector) Init(bridge *bridgev2.Bridge)

func (*OpenCodeConnector) LoadUserLogin

func (oc *OpenCodeConnector) LoadUserLogin(_ context.Context, login *bridgev2.UserLogin) error

func (*OpenCodeConnector) Start

func (oc *OpenCodeConnector) Start(_ context.Context) error

func (*OpenCodeConnector) Stop

func (oc *OpenCodeConnector) Stop(_ context.Context)

type OpenCodeLogin

type OpenCodeLogin struct {
	bridgeadapter.BaseLoginProcess
	User      *bridgev2.User
	Connector *OpenCodeConnector
	FlowID    string
}

func (*OpenCodeLogin) Start

func (*OpenCodeLogin) SubmitUserInput

func (ol *OpenCodeLogin) SubmitUserInput(ctx context.Context, input map[string]string) (*bridgev2.LoginStep, error)

type OpenCodeRemoteEdit

type OpenCodeRemoteEdit = bridgeadapter.RemoteEdit

OpenCodeRemoteEdit is a type alias for the shared RemoteEdit.

type OpenCodeRemoteMessage

type OpenCodeRemoteMessage = bridgeadapter.RemoteMessage

OpenCodeRemoteMessage is a type alias for the shared RemoteMessage.

type PortalMetadata

type PortalMetadata struct {
	Title                string `json:"title,omitempty"`
	TitleGenerated       bool   `json:"title_generated,omitempty"`
	IsOpenCodeRoom       bool   `json:"is_opencode_room,omitempty"`
	OpenCodeInstanceID   string `json:"opencode_instance_id,omitempty"`
	OpenCodeSessionID    string `json:"opencode_session_id,omitempty"`
	OpenCodeReadOnly     bool   `json:"opencode_read_only,omitempty"`
	OpenCodeTitlePending bool   `json:"opencode_title_pending,omitempty"`
	OpenCodeAwaitingPath bool   `json:"opencode_awaiting_path,omitempty"`
	AgentID              string `json:"agent_id,omitempty"`
	VerboseLevel         string `json:"verbose_level,omitempty"`
}

type UserLoginMetadata

type UserLoginMetadata struct {
	Provider          string                                      `json:"provider,omitempty"`
	OpenCodeInstances map[string]*opencodebridge.OpenCodeInstance `json:"opencode_instances,omitempty"`
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL