## DAVE Conversational Telegram Delivery And Web Search
- Issue #82 tracks operator feedback from 2026-07-07: proactive DAVE messages were too report-like, used visible Markdown markers, arrived as large text blocks, and needed a way to start web searches from chat.
- Implementation branch in progress: `codex/issue-dave-conversation-web-search`.
- DAVE persona now explicitly prefers live chat style, short natural paragraphs, no visible Markdown syntax, and compact first proactive/presence messages.
- Telegram transport has `sendConversation(...)`, which strips visible Markdown syntax for plain-text AI chat and splits large AI/proactive responses into smaller Telegram messages. Handler responses can set `conversation: true`.
- Proactive sweep alerts and dynamic presence now use the conversation transport. The DAVE answer, evidence, and tool trace are sent as separate short messages where possible.
- The terminal agent has a new read-only `web_search` tool backed by GDELT DOC search. It is bounded by query length, result limit, and time window; it does not provide arbitrary shell/filesystem/secret/network access.
- The implementation deliberately uses no fixed daily schedule. It evaluates at randomized intervals, is pulled forward by material/critical sweep deltas, delays itself after operator chat activity, and lengthens quiet periods.
- Hard controls: profile quiet hours, daily cap, minimum message gap, bounded evaluation interval, persisted state in `runs/dave-presence-state.json`, and agent-core rejection of mutating tools outside operator-initiated chat.
- Presence can produce a grounded warning, update, all-clear, practical suggestion, or one useful question; it stays silent when another message would add noise. It never claims consciousness or continuous observation.
- Local lightweight verification passed: Node syntax checks, `package.json` parse, Compose config, and `git diff --check`. Heavy tests/build were not run locally per kit policy.
- PR runs 915-916 and production runs 917-919 passed, including unit tests, Compose validation, Docker build/publish, release dry-run, and template compliance.
- Dockge was updated from the Gitea Registry and explicitly configured with `DAVE_PRESENCE_ENABLED=true`, max 4 messages/day, 75-minute minimum gap, randomized 45-180 minute evaluation bounds, 60-minute post-interaction idle delay, and a 5-minute timer resolution.
- Live `/api/health` reported `davePresence.enabled=true`, `running=true`, `dynamic=true`, `sentToday=0`, a variable `nextEvaluationAt`, the existing encrypted profile preserved, and no sweep error. The container reported `running/healthy`.
- Live verification then exposed issue #73: an invalid optional profile timezone caused `lastReason=invalid_timezone`. PR #74 fixed runtime resolution to fall back to `DAVE_PRESENCE_TIMEZONE` without logging or modifying encrypted profile data. Merge commit: `f0a8162202bfe0a0a8ed2a00dc4f0f7092677eea`.
- PR runs 925-926 and production runs 927-929 passed. After redeployment and the startup timer, live health reported `lastReason=not_due` instead of `invalid_timezone`, with dynamic presence running, the profile preserved, the container healthy, and no sweep error.
- Issue #79 / PR #80 fixed proactive DAVE alerts ignoring the onboarding profile language. The screenshot showed German dynamic presence followed by an English `[AGENT PRIORITY]` alert. Merge commit: `59b496aee19b446a7cdeae74d119778cfbd92d8f`.
- The validated profile language is now an explicit required runtime parameter for direct provider chat, multi-tool reasoning, final-only synthesis, dynamic presence, and proactive sweep analysis. This no longer depends on the model choosing to call `get_security_profile`.
- Server-generated wrappers are localized (`DAVE // PRIORITÄT`, `Belege`, `Werkzeuge`, `AKTIV`). Provider, tool-finalization, and presence language tests were added. PR runs 959-960 and production runs 961-963 passed.
- The registry image was redeployed to Dockge. Live verification read only the encrypted profile language code and confirmed `de`; the container was `running/healthy`, profile persisted, agent and presence enabled, and no sweep error was present.
- Issue #76 / PR #77 fixed a second local-model protocol leak: ChatML-style output such as `<|tool_call>call:get_evidence{query:"...",limit:5}<tool_call|>` was previously treated as user-facing text. Merge commit: `7f140021f037cbc351c9a3b39a5eb3610bfc4939`.
- The controlled agent now parses bounded tagged calls into the normal allowlisted tool path without `eval`, recognizes tagged JSON envelopes, and treats malformed protocol-like output as a repairable protocol error. Tool tags are never accepted as final Telegram text.
- The exact observed Russia-query format and a malformed-tag variant are regression fixtures. PR runs 935-936 and production runs 937-939 passed.
- The registry image was redeployed to Dockge. Live health reported `running/healthy`, Telegram agent enabled with 14 tools, dynamic DAVE presence enabled, encrypted profile preserved, and no sweep error.
- LiteLLM is implemented through the OpenAI-compatible `/chat/completions` API and requires `LLM_BASE_URL`, `LLM_API_KEY`, and `LLM_MODEL`.
- The build workflow now targets `git.wilkensxl.de/code-inc/intelligence-terminal` and publishes only from the production branch, not from pull requests.
- Gitea Actions runs 231-235 passed for the PR and production merge, including unit tests, Compose validation, Docker build, release dry-run, and template compliance.
- The first `code-inc` registry publication was verified through the Gitea Package API on 2026-07-03.
- PR #52 / issue #51 removed the hard-coded 90-second/4096-token idea-generation override. LLM ideas now respect `LLM_TIMEOUT_MS` and `LLM_MAX_TOKENS`.
- PR #54 / issue #53 fixed prediction persistence after successful LLM generation and added a SQLite-backed regression test.
- Live Dockge verification on 2026-07-04 used `LLM_TIMEOUT_MS=300000` and `LLM_MAX_TOKENS=4096` with the `heim-llm` LiteLLM alias. The completed sweep produced six parsed ideas, reported `ideasSource=llm`, persisted memory, and had no `lastSweepError`.
- Production implementation commit: `14d9276c30e06cafcaee8177ba7377fdf5f26277`.
- Issues #47, #51, and #53 are complete. Issue #21 tracks the failing security scan and #45 tracks the dependency workflow.
- PR #57 / issue #56 added conversational Telegram AI chat for normal text plus `/ask` and `/reset`, bounded in-memory history, current intelligence grounding, typing activity, strict chat allowlisting, and plain-text replies.
- Private Telegram chat messages are excluded from OSINT ingestion, and polling is serialized while a model response is running.
- Gitea Actions runs 263-267 passed for the feature and production merge.
- Live Dockge verification on 2026-07-05 reported `telegramAiChat.enabled=true`. A real `heim-llm` question using current dashboard context completed in 34 seconds and the answer was delivered successfully through the configured Telegram bot.
- Current Telegram-chat implementation commit: `c86407d4f8bfb8a445bb7f4685ff545b479244a1`.
- PR validation runs 883-886 passed. Production merge commit `c0afc6d2e88b7602148d786dd249351323885ac2` passed build/publish run 887, release dry-run 888, and template compliance 889.
- Registry tags `latest`, `20260705`, and `c0afc6d2e88b7602148d786dd249351323885ac2` were verified through the Gitea Package API on 2026-07-05.
- The Dockge stack at `C:\docker\intelligence-terminal` was updated from the registry image. A cryptographically random `SECURITY_PROFILE_ENCRYPTION_KEY` was added without printing it. Live health reported the container healthy, LiteLLM configured, Telegram AI and the 14-tool agent enabled, and the encrypted profile store configured/available with no profile yet.
- Issue #64 fixed a local-model protocol leak where an exhausted tool loop could expose a raw `tool_call` JSON object as the Telegram answer. PR #65 merged as `e47c23e685d833d5f7433dc27b0834854c8c6152`.
- Exhausted loops now switch to a separate tool-free finalization prompt, allow one bounded repair attempt, and fail closed with a localized user-facing message if the model still requests tools. Internal protocol JSON is never returned as the answer.
- PR runs 895-896 and production runs 897-899 passed. The registry `latest` image was deployed to Dockge; live health reported `running/healthy`, 14 tools enabled, no sweep error, and the encrypted Security Manager profile preserved (`profileExists=true`).
- Issue #67 / PR #68 added DAVE as the consistent synthetic Security Manager identity across the tool agent, tool-free finalizer, provider-only chat, and first-start language prompt. Production merge: `c07a65231ffc6b4d2f0c823b91aaf2eb13900e05`.
- DAVE adapts language, formality, directness, verbosity, sentence length, formatting, and technical depth from the newest message plus bounded chat history. It does not imitate errors, hostility, panic, discriminatory language, or unsupported certainty, and it never claims human consciousness, emotions, a body, or access beyond allowlisted tools.
- PR runs 905-906 and production runs 907-909 passed. The new registry image was deployed to Dockge; live health remained `running/healthy`, the 14-tool agent was enabled, no sweep error was present, and the encrypted profile persisted.
Run `git rev-parse HEAD` after clone/pull. The production branch contains Security Manager merge commit `c0afc6d2e88b7602148d786dd249351323885ac2` plus this release handoff update.
- Use only lightweight local checks (`node --check`, JSON parsing, Compose config, `git diff --check`). Run unit tests, builds, audits, and image publication on the Gitea Ubuntu runners.
### Security Manager
- First startup asks for `Deutsch` or `English` before any profile question.
- Consent offers full, minimal, or cancelled setup; `/skip` is available for profile inputs.
- Exact addresses, identity documents, passwords/API keys, accounts, detailed diagnoses, booking data, and private contacts are explicitly excluded.
-`SECURITY_PROFILE_ENCRYPTION_KEY` must be a unique secret of at least 32 characters. It must be preserved across deployments or the encrypted profile cannot be read.
Open upstream GitHub issues were reviewed on 2026-05-17 from:
```text
https://github.com/calesthio/Crucix/issues
```
The upstream list contained 24 open issues. Issues already handled by this fork were not copied as open work, including the Docker stale-dashboard incident (#105), map label redraw (#70), Sensor Grid controls (#72), space display toggle (#51), source docs (#52), Dockge/CasaOS docs (#78), LLM timeout (#87), inject/static helper confusion (#100), network metrics (#101), Telegram polling backoff (#104), and briefing/evidence context (#75).
Issues not relevant to this fork were also not copied, including the Wallpaper Engine redesign (#41), the fork-inflation discussion (#107), empty/unclear placeholders (#79/#80), and the general use-case discussion (#93).
The following Gitea issues were created for real remaining work:
```text
#1 Reddit source must stop unauthenticated .json scraping
Docker build and smoke test were performed locally earlier against the now-legacy `mrsphay` image namespace. Current deployments must use the `code-inc` image documented above:
6. Start with Dockge/Pangolin using the README compose example and a `.env` based on `.env.example`.
## Remaining Risks And Follow-Ups
- Some sources will report `degraded` until optional keys are set, especially ACLED, FRED, EIA, and Cloudflare Radar.
- OpenSky can rate-limit with HTTP 429; this is now visible in health instead of hidden.
- GDELT/OFAC can time out under runner/network conditions; health reports this explicitly.
- Browser-level visual verification of the full dashboard should be repeated after any future UI change.
- The project still inherits the original Crucix broad source surface. Future work should prefer focused source-by-source tests over broad refactors.
- If a new Codex environment sees non-fast-forward branch pushes, fetch first and preserve remote commits. Do not force-push without explicit approval.
- A production deployment must add `SECURITY_PROFILE_ENCRYPTION_KEY` before expecting first-start onboarding. A changed or lost key intentionally fails closed and does not overwrite existing ciphertext.
- Security Manager first-start onboarding remains intentionally incomplete until the operator answers the language and consent prompts in Telegram; no personal profile is created automatically.
- The operator completed Security Manager onboarding before the #64 live deployment; the encrypted profile survived the container recreation. Never log or copy its contents into issues or handoff files.