GitHub Actions Bot
deploy: automated sync from github main
985f3ee
|
Raw
History Blame Contribute Delete
6.58 kB
# πŸ“š Understanding Each Folder β€” ArunCore Technical Guides
> Walkthrough files for every major folder. Read this BEFORE modifying code.
> Architecture version: ❄️ v1.0 (decoupled services backend).
---
## 🧭 Fast Path (5-minute overview)
```
ArunVisitor ─▢ core/api.py (thin FastAPI) ─▢ services/agent_runner.py
β”‚ running)
β”œβ–Ά services/prompt_builder.py (system prompt + templates)
β”œβ–Ά services/memory_manager.py (RollingMemory compression)
β”œβ–Ά services/tool_executor.py (real tools: search/github/notify)
β”œβ–Ά services/knowledge_service.py(READMEs, LinkedIn, static, Q&A)
β”œβ–Ά services/notification_service.py (Telegram + background queue)
β””β–Ά services/session_store.py (thread-safe live state)
```
**Golden rule**: Tools/chat/branding logic MUST live in `services/` modules and resolve
dynamically. `backend/app/core/` only composes (agent.py) and wires HTTP (api.py).
Zero `if client == "..."` anywhere.
---
## πŸ“‚ backend/app/core/ β€” Composition & Channels (thin)
- **agent.py** β€” The only *allowed* place that imports everything. Exposes `init_agent()` (returns `(main_llm, chat_prompt, memory, tools)`) plus backward-compat re-exports (`queue_*`, `save_unknown_question_answer`, `RollingMemory`, tools, admin tokens) so scripts/tests/bot keep working. Also applies the IPv4-only DNS patch once.
- **api.py** β€” FastAPI wiring only: CORS, models, `/chat` (delegates to `AgentRunner.stream_chat`), `/config`, `/tts`, `/chat/human-message`, `/chat/history`, `/chat/human-messages`, `/chat/verify-admin-token`, `/health`, static frontend mount. **No business logic.**
- **bot.py** β€” Telegram bot entrypoint. Reuses `AgentRunner.sync_reply` for the agent loop and `knowledge_service.save_verified_answer` for the reply-to-save active-learning flow.
- **ingest.py** β€” Standalone ChromaDB ingestion (`data/` β†’ `db/`), idempotent via `db/ingestion_state.json`.
## πŸ“‚ backend/app/services/ (Single-Responsibility β€” the real brains)
| Service | Owns |
|---|---|
| `agent_runner.py` | Streaming agent loop, `run_pre_escalation`, `trigger_ai_answer` (`/answer`), `sync_reply` (Telegram). |
| `prompt_builder.py` | Static-context 5-tuple, tutor (legacy demos) vs default persona prompt, chat template, 3-way live human notice. |
| `memory_manager.py` | `RollingMemory` (every-N-turn summary compression) + `MemoryManager` alias. |
| `tool_executor.py` | Tool registry: real `search_arun_knowledge`, `get_github_live_data`, `notify_arun` + tenant placeholder tools. |
| `knowledge_service.py` | All on-disk knowledge reads + `fetch_live_github` + `save_verified_answer` (active-learning write + re-ingest trigger). `search()` section-chunks READMEs/LinkedIn/profile docs, strips YAML+GitHub boilerplate, relevance-scores every chunk and caps output β†’ returns clean ranked chunks instead of raw whole files. |
| `rag_service.py` | Hybrid retrieval coordinator β†’ normalizes to scored chunks; `add_knowledge_entry` persists via KnowledgeService. |
| `tenant_service.py` | Split `tenants/<id>/config/*.json` (Pydantic validated) + legacy `demos/*.json` loader. |
| `notification_service.py` | Every Telegram send (relay→direct→plain fallback), alert dedup, chat-log/debug/automated alerts, `notify_arun` escalation. |
| `session_store.py` | Thread-safe message history, human-messages, human-control flags, rolling memory per session. |
| `auth_service.py` | `generate_admin_token` / `verify_admin_token` (3-way live takeover). |
| `background.py` | One shared background worker queue used by notification/knowledge tasks. |
| `active_learning_service.py` | Owner-reply ingestion (webhook β†’ RAGService β†’ unknown_questions.json + ChromaDB). |
| `voice_service.py` | OpenAI TTS audio generation. |
## πŸ“‚ backend/app/schemas/ β€” Pydantic contracts
`tenant.py` (6 split configs + `TenantFullConfig.to_legacy_dict`), `chat.py` (`ChatRequest`, history, NDJSON chunk), `webhook.py` (active-learning payload), `voice.py` (`TTSRequest`).
## πŸ“‚ backend/app/db/ β€” Interface adapters
`interfaces.py` β€” abstract `VectorStoreInterface`, `StateStoreInterface`, `NotificationProviderInterface`.
`state_store.py` β€” the in-memory `StateStore` implementation (session message log used by legacy paths).
## πŸ“‚ backend/app/api/v1/ β€” Versioned routers
`config.py` (`/api/v1/config` β†’ split tenants), `voice.py` (`/tts`), `webhook.py`, `router.py` aggregator.
## πŸ“‚ frontend/ β€” Next.js 16 UI (100% PRESERVED)
`page.tsx` fetches `/api/config/tutor` config, streams NDJSON, polls `/chat/history` (1.5s), admin/3-way mode via join-link token. Files under `components/` are the luxury UI: `ChatPanel`, `Header`, `Sidebar`, `ProjectsView`, `ManifestoView`, `HandoffModal`, `MobileBottomNav`, `TelemetryPanel`, `ArchitectureView`.
## πŸ“‚ data/ (knowledge base)
`github/<repo>/README.md` (21 repos) Β· `linkedin/posts.md` Β· `raw/personal_background.md` Β· `raw/unknown_questions.json` (active learning) Β· `static/*.md` (public_profile, rules_of_engagement).
## πŸ“‚ tenants/ β€” Split-config tenant packages (OUTSIDE apt / S3)
`tenants/<id>/config/{brand,agent,chat,voice,seo,social}.json`. `tenant_starter/` is the fallback template.
## πŸ“‚ demos/ & data/leads/ β€” legacy 238-key dictionaries
`demos/*_enterprise_dictionary.json` + `demos/general.json` (master template). Resolved via `tenant_service.load_legacy_tutor_config`.
## πŸ§ͺ tests/
`unittest discover -s tests` β†’ 9 passing tests (schemas, v1 config, tenants, API endpoints). `tests/test_system.py` is a manual 5-part integration script (uses network/LLM/Telegram).
## πŸ“œ scripts/
`evaluate.py`, `evaluate_30_questions.py` (agent stress tests), `ingest.py`, `sync_github.py`, `sync_linkedin.py`, `sync_all.py`.
---
## πŸ”„ Decoupling rules of thumb
- Want to change how alerts deliver? Touch `notification_service.py` only.
- Want to add a tool? Register it in `tool_executor.py` (`AVAILABLE_TOOLS`).
- Want a new KB source? Update `knowledge_service.py` search fan-out.
- Want to change memory strategy? Swap logic in `memory_manager.py` β€” keep `RollingMemory` name for compat.
- Never import `core/api.py` symbols into a service; services are the dependency root underneath `core/*`.