15 Commits

Author SHA1 Message Date
f79214bb22
fix: address pr_reviewer findings (data loss, memory, prompt injection)
- CI/CD: stop deleting the steward namespace on every deploy; use
  kubectl apply (dry-run -> apply) so the PVC and conversation memory
  survive deployments.
- core: bound _histories with an LRU eviction (max 1000 active threads)
  to prevent unbounded memory growth.
- core: wrap knowledge-base context in KB START/END delimiters and
  instruct the LLM to treat it as data, mitigating indirect prompt
  injection.
- matrix: wrap message processing in try/except so failures are logged
  instead of silently dropped.
- telegram: remove now-dead flush/tags prompt constants (centralized in
  core).

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-08-18 22:01:59 +10:00
76777c98eb
feat: add Matrix appservice bot and platform-agnostic conversation core
Introduce a shared ConversationService (steward/bot/core.py) that owns the
LLM call, history, knowledge-base search, and thread-memory keying behind a
normalized ThreadKey, so both Telegram and Matrix drive the same pipeline.

- Add steward/bot/matrix.py: a mautrix-python appservice bot that receives
  Synapse transactions and replies via the client-server API.
- Refactor telegram.py handlers into thin wrappers over ConversationService.
- Generalize ThreadMemoryStore/ThreadSummary to platform-scoped keys with
  legacy chat_id:thread_id migration.
- Add a matrix config section (homeserver, tokens, room/user allowlists).
- Rewrite main.py as async, starting Telegram and/or Matrix on one event loop.
- Add mautrix>=0.21.0 dependency.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-08-18 21:38:01 +10:00
Daniel
cf65198825
fix: accept CSV telegram ID config (#27)
Co-authored-by: openhands <openhands@all-hands.dev>
2026-07-27 09:21:52 +10:00
Daniel
293591e48a
feat: improve Telegram conversation heuristics (#14)
Co-authored-by: openhands <openhands@all-hands.dev>
2026-07-26 21:39:59 +10:00
Daniel
4099d4aa82
feat: add MCP tool integration via MCPO (#11) 2026-07-26 14:11:07 +10:00
Daniel Wagner
15b595456a fix: modernize pydantic config to remove deprecation warning
- Replace deprecated class Config pattern with model_config = ConfigDict(...)
- Add ConfigDict import from pydantic
- Fixes PydanticDeprecatedSince20 warning in test output
- Maintains all existing functionality

All 73 tests pass without warnings.
2026-07-26 12:54:54 +10:00
Daniel Wagner
d5eac108f8 feat: implement OmegaConf-based configuration management with uv
Configuration changes:
- Replace pydantic-settings with OmegaConf for flexible config management
- Support YAML config files via CONFIG_FILE environment variable
- Support environment variables with STEWARD__SECTION__KEY format
- Add config_schema.yaml as default configuration schema
- Create pydantic models for each configuration section for type safety
- Maintain backward compatibility via properties on Settings class
- Add CONFIGURATION.md with comprehensive setup and usage guide
- Update pyproject.toml to include config_schema.yaml in package data

Build/deployment changes:
- Replace pip with uv in Dockerfile for faster dependency installation
- Create docker-compose.dev.yml for local development (build .)
- Keep docker-compose.yml for production (uses ghcr.io/djw4/steward:latest)
- Update .env.example with new STEWARD__* variable format

This setup is designed for Kubernetes deployment:
- Non-sensitive config goes in ConfigMap (config.yaml)
- Secrets go in Secret resources (environment variables)
- Single unified configuration system for all environments
2026-07-26 12:34:23 +10:00
Daniel Wagner
669b57a317 feat: add group/channel support for Telegram bot
- Add TELEGRAM_GROUP_IDS configuration setting to enable optional group/channel filtering
- Add _is_group_enabled() authorization check to all command handlers
- Add group/channel authorization check to message_handler
- All handlers now verify both user authorization and group authorization
- If TELEGRAM_GROUP_IDS is not configured, bot accepts messages from any group
- If TELEGRAM_GROUP_IDS is configured, bot only processes messages from those groups

This enables the bot to be used in group chats and channels with Topics/Threads support.
2026-07-26 12:26:57 +10:00
copilot-swe-agent[bot]
47bae80f47 fix: use PTB JobQueue instead of AsyncIOScheduler to fix startup RuntimeError 2026-07-25 14:31:51 +00:00
copilot-swe-agent[bot]
51188fe3bd refactor: address code review feedback on MCP tool calling 2026-07-25 12:52:42 +00:00
copilot-swe-agent[bot]
76c6086db3 feat: MCP/OpenAPI tool calling support 2026-07-25 12:50:39 +00:00
copilot-swe-agent[bot]
a5037aa808 fix: align tag slice limit with prompt upper bound (5-8 tags) 2026-07-25 12:30:49 +00:00
copilot-swe-agent[bot]
867542dd49 feat: knowledge-base memory, Dockerfile, docker-compose, CI/release workflows, PR template 2026-07-25 12:29:21 +00:00
copilot-swe-agent[bot]
c74c8b0d8b feat: thread-aware memory with /flush and /recall commands 2026-07-25 12:09:38 +00:00
copilot-swe-agent[bot]
6862c7d0b8 feat: add NORTH_STAR.md and MVP core loop (Telegram bot + LLM + proposal generator) 2026-07-25 11:47:52 +00:00