Commit 614d33b
committed
Bot foundations + Telegram connector Add classical bot runtime (springtale-bot) with deterministic command routing and first chat connector (connector-telegram). No AI in the critical path — the entire bot operates with NoopAdapter. springtale-bot crate (new): - Command router: prefix, pattern, alias, fallback (longest-match for multi-word commands like /github create_issue) - 6 builtin handlers: /help, /status, /rules, /connectors, /prefs, /alias
- Connector auto-registration: installed connector actions become commands
- Session state per (user_id, channel_id) with SQLite isolation
- Conversation memory with provenance tracking (author, source, trust_score) and random XChaCha20 nonces for Phase 2 encryption readiness
- Truncation compaction (drop oldest beyond context window)
- Bot identity: Ed25519 keypair stored in vault
- Event loop: tokio::select! over connector + rule channels, never crashes on bad messages, dispatches actions with chain depth limits
- HeadlessBot test harness for testing without Telegram
- Alias runtime reload after /alias set/remove connector-telegram (new):
- Hand-rolled Telegram Bot API client (no teloxide dependency)
- 5 actions: send_message, send_photo, edit_message, delete_message, send_inline_keyboard
- 2 triggers: message_received, command_received
- Long-polling loop with offset tracking (at-most-once delivery)
- Webhook secret verification via subtle::ConstantTimeEq
- Handles Telegram ok:false responses and 429 rate limiting springtale-store extensions:
- Migration 002: bot_sessions, user_prefs, bot_memory, bot_aliases tables
- 12 new StorageBackend trait methods (sessions, prefs, memory, aliases)
- Memory compaction with deterministic tie-breaking (created_at DESC, id DESC)
springtaled integration:
- Bot runtime initialized between job queue and API server in boot sequence
- Optional [telegram] config section for connector instantiation
- Polling dispatcher bridges sync callback to async bot channel via tokio::spawn
- Response dispatcher routes bot replies through connector registry Security:
- #![forbid(unsafe_code)] on both new crates
- All credentials in Secret<T> with SECURITY-annotated expose_secret() calls
- Notifications default OFF (IPV safety — docs/current-arch/SECURITY.md §2.8)
- Parameterized SQL throughout (no injection vectors)
- Empty alias validation, chain depth limits (MAX_CHAIN_DEPTH)
- Response channel failures logged (no silent drops)1 parent c0b5eb7 commit 614d33b
119 files changed
Lines changed: 5887 additions & 527 deletions
File tree
- apps
- springtale-cli/src
- commands
- springtaled
- src
- api
- runtime
- tests
- connectors
- connector-bluesky/src
- actions
- client
- firehose
- triggers
- connector-filesystem/src
- actions
- triggers
- watcher
- connector-github/src
- actions
- client
- triggers
- webhook
- connector-http/src
- actions
- client
- connector-kick/src
- actions
- auth
- client
- triggers
- webhook
- connector-presearch/src
- actions
- client
- connector-shell/src
- actions
- sandbox
- connector-telegram
- src
- actions
- auth
- client
- polling
- triggers
- webhook
- crates
- springtale-bot
- src
- handler
- identity
- memory
- router
- runtime
- state
- springtale-connector/src
- springtale-core/src
- router
- rule
- springtale-crypto/src/token
- springtale-scheduler/src/cron
- springtale-store/src
- backend
- migrations
- schema
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| |||
141 | 141 | | |
142 | 142 | | |
143 | 143 | | |
| 144 | + | |
144 | 145 | | |
| 146 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
60 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
61 | 62 | | |
62 | 63 | | |
63 | 64 | | |
| |||
66 | 67 | | |
67 | 68 | | |
68 | 69 | | |
69 | | - | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
70 | 73 | | |
71 | 74 | | |
72 | 75 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
37 | | - | |
| 36 | + | |
| 37 | + | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
| 44 | + | |
48 | 45 | | |
49 | 46 | | |
50 | 47 | | |
| |||
56 | 53 | | |
57 | 54 | | |
58 | 55 | | |
59 | | - | |
60 | | - | |
| 56 | + | |
61 | 57 | | |
62 | 58 | | |
63 | 59 | | |
| |||
87 | 83 | | |
88 | 84 | | |
89 | 85 | | |
90 | | - | |
91 | | - | |
| 86 | + | |
92 | 87 | | |
93 | 88 | | |
94 | 89 | | |
95 | 90 | | |
96 | 91 | | |
97 | 92 | | |
98 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
52 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
| |||
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| |||
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
74 | | - | |
75 | | - | |
| 74 | + | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| |||
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
105 | | - | |
106 | | - | |
| 105 | + | |
| 106 | + | |
107 | 107 | | |
108 | 108 | | |
109 | 109 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
24 | 27 | | |
25 | 28 | | |
26 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
55 | | - | |
56 | | - | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
57 | 58 | | |
58 | 59 | | |
59 | 60 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
| 34 | + | |
34 | 35 | | |
| 36 | + | |
| 37 | + | |
35 | 38 | | |
36 | 39 | | |
37 | 40 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
3 | 4 | | |
4 | | - | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
35 | | - | |
36 | | - | |
| 34 | + | |
37 | 35 | | |
38 | 36 | | |
39 | 37 | | |
| |||
45 | 43 | | |
46 | 44 | | |
47 | 45 | | |
48 | | - | |
49 | | - | |
50 | | - | |
| 46 | + | |
51 | 47 | | |
52 | 48 | | |
53 | 49 | | |
| |||
59 | 55 | | |
60 | 56 | | |
61 | 57 | | |
62 | | - | |
63 | | - | |
64 | | - | |
| 58 | + | |
65 | 59 | | |
66 | | - | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
67 | 64 | | |
68 | 65 | | |
69 | 66 | | |
| |||
77 | 74 | | |
78 | 75 | | |
79 | 76 | | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
85 | 81 | | |
86 | 82 | | |
87 | 83 | | |
| |||
92 | 88 | | |
93 | 89 | | |
94 | 90 | | |
95 | | - | |
96 | | - | |
| 91 | + | |
| 92 | + | |
97 | 93 | | |
98 | 94 | | |
99 | 95 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
3 | | - | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | | - | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
42 | 46 | | |
43 | 47 | | |
44 | 48 | | |
| |||
0 commit comments