@matthias-hausberger/beige 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/README.md +183 -0
- package/dist/channels/registry.d.ts +14 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +14 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/telegram.d.ts +92 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +469 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/tui.d.ts +8 -0
- package/dist/channels/tui.d.ts.map +1 -0
- package/dist/channels/tui.js +574 -0
- package/dist/channels/tui.js.map +1 -0
- package/dist/cli.d.ts +23 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +571 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +6 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +103 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.spec.d.ts +2 -0
- package/dist/config/loader.spec.d.ts.map +1 -0
- package/dist/config/loader.spec.js +195 -0
- package/dist/config/loader.spec.js.map +1 -0
- package/dist/config/schema.d.ts +107 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/schema.spec.d.ts +2 -0
- package/dist/config/schema.spec.d.ts.map +1 -0
- package/dist/config/schema.spec.js +180 -0
- package/dist/config/schema.spec.js.map +1 -0
- package/dist/gateway/agent-manager.d.ts +138 -0
- package/dist/gateway/agent-manager.d.ts.map +1 -0
- package/dist/gateway/agent-manager.js +532 -0
- package/dist/gateway/agent-manager.js.map +1 -0
- package/dist/gateway/api.d.ts +43 -0
- package/dist/gateway/api.d.ts.map +1 -0
- package/dist/gateway/api.js +256 -0
- package/dist/gateway/api.js.map +1 -0
- package/dist/gateway/api.spec.d.ts +2 -0
- package/dist/gateway/api.spec.d.ts.map +1 -0
- package/dist/gateway/api.spec.js +256 -0
- package/dist/gateway/api.spec.js.map +1 -0
- package/dist/gateway/audit.d.ts +38 -0
- package/dist/gateway/audit.d.ts.map +1 -0
- package/dist/gateway/audit.js +82 -0
- package/dist/gateway/audit.js.map +1 -0
- package/dist/gateway/audit.spec.d.ts +2 -0
- package/dist/gateway/audit.spec.d.ts.map +1 -0
- package/dist/gateway/audit.spec.js +212 -0
- package/dist/gateway/audit.spec.js.map +1 -0
- package/dist/gateway/gateway.d.ts +27 -0
- package/dist/gateway/gateway.d.ts.map +1 -0
- package/dist/gateway/gateway.js +158 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/policy.d.ts +27 -0
- package/dist/gateway/policy.d.ts.map +1 -0
- package/dist/gateway/policy.js +40 -0
- package/dist/gateway/policy.js.map +1 -0
- package/dist/gateway/policy.spec.d.ts +2 -0
- package/dist/gateway/policy.spec.d.ts.map +1 -0
- package/dist/gateway/policy.spec.js +121 -0
- package/dist/gateway/policy.spec.js.map +1 -0
- package/dist/gateway/provider-health.d.ts +83 -0
- package/dist/gateway/provider-health.d.ts.map +1 -0
- package/dist/gateway/provider-health.js +219 -0
- package/dist/gateway/provider-health.js.map +1 -0
- package/dist/gateway/provider-health.spec.d.ts +2 -0
- package/dist/gateway/provider-health.spec.d.ts.map +1 -0
- package/dist/gateway/provider-health.spec.js +278 -0
- package/dist/gateway/provider-health.spec.js.map +1 -0
- package/dist/gateway/session-settings.d.ts +62 -0
- package/dist/gateway/session-settings.d.ts.map +1 -0
- package/dist/gateway/session-settings.js +91 -0
- package/dist/gateway/session-settings.js.map +1 -0
- package/dist/gateway/session-settings.spec.d.ts +2 -0
- package/dist/gateway/session-settings.spec.d.ts.map +1 -0
- package/dist/gateway/session-settings.spec.js +141 -0
- package/dist/gateway/session-settings.spec.js.map +1 -0
- package/dist/gateway/sessions.d.ts +68 -0
- package/dist/gateway/sessions.d.ts.map +1 -0
- package/dist/gateway/sessions.js +177 -0
- package/dist/gateway/sessions.js.map +1 -0
- package/dist/gateway/sessions.spec.d.ts +2 -0
- package/dist/gateway/sessions.spec.d.ts.map +1 -0
- package/dist/gateway/sessions.spec.js +190 -0
- package/dist/gateway/sessions.spec.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +39 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +144 -0
- package/dist/install.js.map +1 -0
- package/dist/sandbox/manager.d.ts +63 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +294 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +11 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +86 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/registry.spec.d.ts +2 -0
- package/dist/skills/registry.spec.d.ts.map +1 -0
- package/dist/skills/registry.spec.js +220 -0
- package/dist/skills/registry.spec.js.map +1 -0
- package/dist/socket/protocol.d.ts +21 -0
- package/dist/socket/protocol.d.ts.map +1 -0
- package/dist/socket/protocol.js +7 -0
- package/dist/socket/protocol.js.map +1 -0
- package/dist/socket/protocol.spec.d.ts +2 -0
- package/dist/socket/protocol.spec.d.ts.map +1 -0
- package/dist/socket/protocol.spec.js +135 -0
- package/dist/socket/protocol.spec.js.map +1 -0
- package/dist/socket/server.d.ts +21 -0
- package/dist/socket/server.d.ts.map +1 -0
- package/dist/socket/server.js +133 -0
- package/dist/socket/server.js.map +1 -0
- package/dist/socket/server.spec.d.ts +2 -0
- package/dist/socket/server.spec.d.ts.map +1 -0
- package/dist/socket/server.spec.js +333 -0
- package/dist/socket/server.spec.js.map +1 -0
- package/dist/test/fixtures.d.ts +47 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +144 -0
- package/dist/test/fixtures.js.map +1 -0
- package/dist/toolkit/index.d.ts +4 -0
- package/dist/toolkit/index.d.ts.map +1 -0
- package/dist/toolkit/index.js +4 -0
- package/dist/toolkit/index.js.map +1 -0
- package/dist/toolkit/installer.d.ts +26 -0
- package/dist/toolkit/installer.d.ts.map +1 -0
- package/dist/toolkit/installer.js +247 -0
- package/dist/toolkit/installer.js.map +1 -0
- package/dist/toolkit/registry.d.ts +19 -0
- package/dist/toolkit/registry.d.ts.map +1 -0
- package/dist/toolkit/registry.js +119 -0
- package/dist/toolkit/registry.js.map +1 -0
- package/dist/toolkit/registry.spec.d.ts +2 -0
- package/dist/toolkit/registry.spec.d.ts.map +1 -0
- package/dist/toolkit/registry.spec.js +194 -0
- package/dist/toolkit/registry.spec.js.map +1 -0
- package/dist/toolkit/schema.d.ts +61 -0
- package/dist/toolkit/schema.d.ts.map +1 -0
- package/dist/toolkit/schema.js +116 -0
- package/dist/toolkit/schema.js.map +1 -0
- package/dist/toolkit/schema.spec.d.ts +2 -0
- package/dist/toolkit/schema.spec.d.ts.map +1 -0
- package/dist/toolkit/schema.spec.js +202 -0
- package/dist/toolkit/schema.spec.js.map +1 -0
- package/dist/tools/core.d.ts +10 -0
- package/dist/tools/core.d.ts.map +1 -0
- package/dist/tools/core.js +246 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/core.spec.d.ts +2 -0
- package/dist/tools/core.spec.d.ts.map +1 -0
- package/dist/tools/core.spec.js +315 -0
- package/dist/tools/core.spec.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +62 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/registry.spec.d.ts +2 -0
- package/dist/tools/registry.spec.d.ts.map +1 -0
- package/dist/tools/registry.spec.js +228 -0
- package/dist/tools/registry.spec.js.map +1 -0
- package/dist/tools/runner.d.ts +25 -0
- package/dist/tools/runner.d.ts.map +1 -0
- package/dist/tools/runner.js +35 -0
- package/dist/tools/runner.js.map +1 -0
- package/dist/tools/runner.spec.d.ts +2 -0
- package/dist/tools/runner.spec.d.ts.map +1 -0
- package/dist/tools/runner.spec.js +129 -0
- package/dist/tools/runner.spec.js.map +1 -0
- package/dist/types/session.d.ts +8 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +23 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +76 -0
- package/tools/README.md +1 -0
- package/tools/kv/README.md +150 -0
- package/tools/kv/index.ts +149 -0
- package/tools/kv/tool.json +23 -0
- package/tools/message/README.md +53 -0
- package/tools/message/index.ts +183 -0
- package/tools/message/tool.json +11 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Copyright 2026 Matthias Hausberger
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
8
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Beige
|
|
2
|
+
|
|
3
|
+
Secure, sandboxed agent system. Let agents write and execute code — safely.
|
|
4
|
+
|
|
5
|
+
## What is Beige?
|
|
6
|
+
|
|
7
|
+
Beige is an open-source agent gateway that runs AI agents inside Docker sandboxes. Agents have 4 core tools (`read`, `write`, `patch`, `exec`) and can use additional tools exposed as executables. All tool calls route through the gateway for policy enforcement and audit logging.
|
|
8
|
+
|
|
9
|
+
**Key principles:**
|
|
10
|
+
- 🔒 **Sandboxed** — Every agent runs in its own Docker container. No access to host env vars, secrets, or files.
|
|
11
|
+
- 📋 **Audited** — Every tool call is logged with agent identity, args, timing, and permission decision.
|
|
12
|
+
- 🛡️ **Policy-enforced** — Deny by default. Agents can only use tools explicitly granted in config.
|
|
13
|
+
- 🔌 **Extensible** — Add tools as simple packages. They mount into sandboxes read-only.
|
|
14
|
+
- 🤖 **LLM-agnostic** — Uses [pi SDK](https://pi.dev) for LLM interaction. Supports Anthropic, OpenAI, ZAI, and more.
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
Beige has two install modes. Pick the one that fits you.
|
|
19
|
+
|
|
20
|
+
### Option A — npm global (recommended for most users)
|
|
21
|
+
|
|
22
|
+
**Prerequisites:** Node.js 22+, Docker
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g matthias-hausberger/beige
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
On first run, beige automatically creates `~/.beige/` with a default config and the bundled KV tool:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
32
|
+
|
|
33
|
+
# Shell 1 — start the gateway
|
|
34
|
+
beige gateway start
|
|
35
|
+
|
|
36
|
+
# Shell 2 — open the TUI
|
|
37
|
+
beige tui
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
You can also run setup explicitly:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
beige setup
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Option B — Source install (contributors / power users)
|
|
47
|
+
|
|
48
|
+
**Prerequisites:** Node.js 22+, Docker
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git clone https://github.com/matthias-hausberger/beige.git
|
|
52
|
+
cd beige
|
|
53
|
+
npm install
|
|
54
|
+
npm run build:sandbox # build the sandbox Docker image
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
No files are written outside the repo. Configure manually:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cp examples/config.json5 ~/.beige/config.json5
|
|
61
|
+
# Edit ~/.beige/config.json5: set your API key and adjust tool paths
|
|
62
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
63
|
+
|
|
64
|
+
# Shell 1
|
|
65
|
+
npx tsx src/cli.ts gateway start --foreground
|
|
66
|
+
|
|
67
|
+
# Shell 2
|
|
68
|
+
npx tsx src/cli.ts tui
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
See [docs/installation.md](docs/installation.md) for a full comparison of both modes.
|
|
72
|
+
|
|
73
|
+
### TUI Commands
|
|
74
|
+
|
|
75
|
+
Once inside the TUI, these slash commands are available:
|
|
76
|
+
|
|
77
|
+
| Command | Description |
|
|
78
|
+
|---------|-------------|
|
|
79
|
+
| `/new` | Start a fresh conversation session |
|
|
80
|
+
| `/resume` | Pick a previous session to continue |
|
|
81
|
+
| `/sessions` | List saved sessions for the current agent |
|
|
82
|
+
| `/agent [name]` | Switch to a different beige agent (with tab-completion) |
|
|
83
|
+
|
|
84
|
+
## Architecture
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
Channels
|
|
88
|
+
├── TUI (pi interactive mode)
|
|
89
|
+
└── Telegram bot
|
|
90
|
+
│
|
|
91
|
+
▼
|
|
92
|
+
Gateway (always running)
|
|
93
|
+
├── Agent Manager → LLM (via pi SDK) → Core Tools
|
|
94
|
+
│ │
|
|
95
|
+
│ ▼
|
|
96
|
+
│ Docker Sandbox
|
|
97
|
+
│ ├── /workspace (rw)
|
|
98
|
+
│ ├── /tools/bin (ro)
|
|
99
|
+
│ └── /tools/packages (ro)
|
|
100
|
+
│
|
|
101
|
+
└── Unix Socket ← Tool launchers call back to gateway
|
|
102
|
+
│
|
|
103
|
+
▼
|
|
104
|
+
Policy Engine → Audit Logger → Tool Runner
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
See [docs/](docs/) for full documentation:
|
|
108
|
+
- [Installation](docs/installation.md) — npm vs source install, setup flow, detection logic
|
|
109
|
+
- [System Overview](docs/system-overview.md) — architecture diagrams
|
|
110
|
+
- [Request Flows](docs/request-flows.md) — sequence diagrams for every request type
|
|
111
|
+
- [Security Model](docs/security-model.md) — sandboxing, identity, threat model
|
|
112
|
+
- [Tools](docs/tools.md) — how to write and use tools
|
|
113
|
+
- [Configuration](docs/configuration.md) — full config reference
|
|
114
|
+
|
|
115
|
+
## Configuration
|
|
116
|
+
|
|
117
|
+
Config is a single JSON5 file (JSON with comments) at `~/.beige/config.json5`. See [examples/config.json5](examples/config.json5) for a template.
|
|
118
|
+
|
|
119
|
+
```json5
|
|
120
|
+
{
|
|
121
|
+
llm: {
|
|
122
|
+
providers: {
|
|
123
|
+
anthropic: { apiKey: "${ANTHROPIC_API_KEY}" },
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
tools: {
|
|
127
|
+
kv: { path: "./tools/kv", target: "gateway" },
|
|
128
|
+
},
|
|
129
|
+
agents: {
|
|
130
|
+
assistant: {
|
|
131
|
+
model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
|
|
132
|
+
tools: ["kv"],
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
channels: {
|
|
136
|
+
telegram: {
|
|
137
|
+
enabled: true,
|
|
138
|
+
token: "${TELEGRAM_BOT_TOKEN}",
|
|
139
|
+
allowedUsers: [123456789],
|
|
140
|
+
agentMapping: { default: "assistant" },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Tools
|
|
147
|
+
|
|
148
|
+
Tools are simple packages:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
tools/my-tool/
|
|
152
|
+
├── tool.json # Name, description, commands
|
|
153
|
+
├── index.ts # Handler (gateway-targeted) or logic (sandbox-targeted)
|
|
154
|
+
└── README.md # Documentation (mounted into sandbox for agent context)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
The agent calls tools via `exec /tools/bin/my-tool <args>`. The launcher routes through the gateway socket for policy checks and execution.
|
|
158
|
+
|
|
159
|
+
## Security Model
|
|
160
|
+
|
|
161
|
+
1. **Sandbox isolation**: Agents run in Docker containers with no host env access
|
|
162
|
+
2. **Read-only mounts**: Tool code and launchers are mounted read-only
|
|
163
|
+
3. **Socket identity**: Agent identity derived from Unix socket (not payload)
|
|
164
|
+
4. **Policy engine**: Deny by default, explicit allow per agent per tool
|
|
165
|
+
5. **Audit log**: Every tool invocation logged as JSONL
|
|
166
|
+
|
|
167
|
+
## Project Status
|
|
168
|
+
|
|
169
|
+
**Phase 1 (current):** Core gateway + KV tool MVP
|
|
170
|
+
- [x] Config system
|
|
171
|
+
- [x] Docker sandbox manager
|
|
172
|
+
- [x] Core tools (read, write, patch, exec)
|
|
173
|
+
- [x] Unix socket server for tool routing
|
|
174
|
+
- [x] Policy engine
|
|
175
|
+
- [x] Audit logging
|
|
176
|
+
- [x] KV tool (gateway-hosted)
|
|
177
|
+
- [x] Telegram channel (GrammY)
|
|
178
|
+
- [x] Interactive TUI (via pi SDK InteractiveMode)
|
|
179
|
+
- [x] LLM integration via pi SDK
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SendMessageOptions {
|
|
2
|
+
parseMode?: "html" | "markdown";
|
|
3
|
+
}
|
|
4
|
+
export interface ChannelAdapter {
|
|
5
|
+
sendMessage(chatId: string, threadId: string | undefined, text: string, options?: SendMessageOptions): Promise<void>;
|
|
6
|
+
supportsMessaging(): boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class ChannelRegistry {
|
|
9
|
+
private channels;
|
|
10
|
+
register(channel: string, adapter: ChannelAdapter): void;
|
|
11
|
+
get(channel: string): ChannelAdapter | undefined;
|
|
12
|
+
has(channel: string): boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,iBAAiB,IAAI,OAAO,CAAC;CAC9B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAqC;IAErD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAKxD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIhD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAG9B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class ChannelRegistry {
|
|
2
|
+
channels = new Map();
|
|
3
|
+
register(channel, adapter) {
|
|
4
|
+
this.channels.set(channel, adapter);
|
|
5
|
+
console.log(`[CHANNELS] Registered channel adapter: ${channel}`);
|
|
6
|
+
}
|
|
7
|
+
get(channel) {
|
|
8
|
+
return this.channels.get(channel);
|
|
9
|
+
}
|
|
10
|
+
has(channel) {
|
|
11
|
+
return this.channels.has(channel);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAErD,QAAQ,CAAC,OAAe,EAAE,OAAuB;QAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,0CAA0C,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { TelegramChannelConfig } from "../config/schema.js";
|
|
2
|
+
import type { AgentManager } from "../gateway/agent-manager.js";
|
|
3
|
+
import { BeigeSessionStore } from "../gateway/sessions.js";
|
|
4
|
+
import type { SessionSettingsStore } from "../gateway/session-settings.js";
|
|
5
|
+
import type { ChannelRegistry, ChannelAdapter, SendMessageOptions } from "./registry.js";
|
|
6
|
+
/**
|
|
7
|
+
* Telegram channel adapter using GrammY.
|
|
8
|
+
*
|
|
9
|
+
* Session model:
|
|
10
|
+
* - Each chat gets a persistent session (survives gateway restarts).
|
|
11
|
+
* - If a chat has threads (forum topics), each thread gets its own session.
|
|
12
|
+
* - /new starts a fresh session in the current chat/thread.
|
|
13
|
+
* - /start shows a welcome message.
|
|
14
|
+
*
|
|
15
|
+
* Channel commands (handled locally, NOT forwarded to the LLM):
|
|
16
|
+
* - /start — welcome message + command overview
|
|
17
|
+
* - /new — start a new conversation session
|
|
18
|
+
* - /status — show session info + current settings
|
|
19
|
+
* - /v on|off — toggle verbose mode for this session (shorthand)
|
|
20
|
+
* - /verbose on|off — toggle verbose mode for this session
|
|
21
|
+
* - /s on|off — toggle streaming mode for this session (shorthand)
|
|
22
|
+
* - /streaming on|off — toggle streaming mode for this session
|
|
23
|
+
*
|
|
24
|
+
* Verbose mode:
|
|
25
|
+
* - When ON, the bot sends a small notification whenever the agent calls a tool.
|
|
26
|
+
* - Default is OFF (configurable via channels.telegram.defaults.verbose in config.json5).
|
|
27
|
+
* - Persisted per-session in ~/.beige/sessions/session-settings.json.
|
|
28
|
+
*
|
|
29
|
+
* Streaming mode:
|
|
30
|
+
* - When ON (default), responses are streamed in real-time (message edits as LLM generates).
|
|
31
|
+
* - When OFF, the full response is sent once the LLM finishes.
|
|
32
|
+
* - Default is ON (configurable via channels.telegram.defaults.streaming in config.json5).
|
|
33
|
+
* - Persisted per-session in ~/.beige/sessions/session-settings.json.
|
|
34
|
+
*
|
|
35
|
+
* Bot command registration:
|
|
36
|
+
* - On startup, the bot deletes all old commands and registers the current set.
|
|
37
|
+
*/
|
|
38
|
+
export declare class TelegramChannel implements ChannelAdapter {
|
|
39
|
+
private agentManager;
|
|
40
|
+
private sessionStore;
|
|
41
|
+
private settingsStore;
|
|
42
|
+
private channelRegistry?;
|
|
43
|
+
private bot;
|
|
44
|
+
private config;
|
|
45
|
+
constructor(telegramConfig: TelegramChannelConfig, agentManager: AgentManager, sessionStore: BeigeSessionStore, settingsStore: SessionSettingsStore, channelRegistry?: ChannelRegistry | undefined);
|
|
46
|
+
private setupHandlers;
|
|
47
|
+
/**
|
|
48
|
+
* Handle /verbose and /v commands.
|
|
49
|
+
* Parses "on"/"off" argument and persists the setting for this session.
|
|
50
|
+
*/
|
|
51
|
+
private handleVerboseCommand;
|
|
52
|
+
/**
|
|
53
|
+
* Resolve the effective verbose setting for a session (layered: default → config → override).
|
|
54
|
+
*/
|
|
55
|
+
private resolveVerbose;
|
|
56
|
+
/**
|
|
57
|
+
* Handle /streaming and /s commands.
|
|
58
|
+
* Parses "on"/"off" argument and persists the setting for this session.
|
|
59
|
+
*/
|
|
60
|
+
private handleStreamingCommand;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve the effective streaming setting for a session (layered: default → config → override).
|
|
63
|
+
*/
|
|
64
|
+
private resolveStreaming;
|
|
65
|
+
/**
|
|
66
|
+
* Create an OnToolStart callback that sends a Telegram notification.
|
|
67
|
+
* Uses a GrammY context for thread-aware replies.
|
|
68
|
+
*/
|
|
69
|
+
private makeToolStartHandler;
|
|
70
|
+
/**
|
|
71
|
+
* Create an OnToolStart callback using raw chat/thread IDs.
|
|
72
|
+
* Used when toggling verbose on mid-session (no fresh ctx available).
|
|
73
|
+
*/
|
|
74
|
+
private makeToolStartHandlerForKey;
|
|
75
|
+
private buildToolStartHandler;
|
|
76
|
+
/**
|
|
77
|
+
* Resolve which agent to use for a given user.
|
|
78
|
+
*/
|
|
79
|
+
private resolveAgent;
|
|
80
|
+
private sessionKeyFromCtx;
|
|
81
|
+
supportsMessaging(): boolean;
|
|
82
|
+
sendMessage(chatId: string, threadId: string | undefined, text: string, options?: SendMessageOptions): Promise<void>;
|
|
83
|
+
start(): Promise<void>;
|
|
84
|
+
stop(): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Register the bot's command list with Telegram.
|
|
87
|
+
* First deletes all existing commands, then sets the current ones.
|
|
88
|
+
* This ensures stale commands from old bot versions are removed.
|
|
89
|
+
*/
|
|
90
|
+
private registerBotCommands;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=telegram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,eAAgB,YAAW,cAAc;IAMlD,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,eAAe,CAAC;IAR1B,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAAwB;gBAGpC,cAAc,EAAE,qBAAqB,EAC7B,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,iBAAiB,EAC/B,aAAa,EAAE,oBAAoB,EACnC,eAAe,CAAC,EAAE,eAAe,YAAA;IAQ3C,OAAO,CAAC,aAAa;IAiMrB;;;OAGG;YACW,oBAAoB;IA0ClC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;YACW,sBAAsB;IAgCpC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,iBAAiB;IAQzB,iBAAiB,IAAI,OAAO;IAItB,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC;IA2BV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;OAIG;YACW,mBAAmB;CAmClC"}
|