fix(dashboard): populate cron delivery dropdown from configured platforms (#40218)
* fix: respect disabled auto-compaction on context overflow Port from anomalyco/opencode#30749. When compression.enabled is false, NO automatic compaction trigger may fire. The proactive token-threshold paths (preflight + post-response should_compress gate) already honoured the setting, but the three provider-overflow recovery paths in the agent loop — long-context-tier 429, 413 payload-too-large, and context-overflow — called _compress_context() unconditionally, silently compressing and rotating the session against the user's explicit choice. Add a single guard at the top of the overflow-recovery dispatch: when compression is disabled and the error is one of those three overflow classes, surface a terminal error (compaction_disabled: True) telling the user to /compress manually, /new, switch to a larger-context model, or reduce attachments. Manual /compress (force=True) is unaffected — it never enters this loop. Tests: new TestOverflowWithCompactionDisabled (413 + 400 overflow don't compress when disabled; control case still compresses when enabled). Existing overflow-recovery tests updated to enable compaction explicitly (they verify the recovery fires); fixture defaults flipped to True to match production (compression.enabled defaults to True). * fix(dashboard): populate cron delivery dropdown from configured platforms The dashboard cron-create/edit dropdown hardcoded five delivery options (local, telegram, discord, slack, email), so users on Matrix — or any other backend-supported platform — had no way to pick their channel even though the cron scheduler delivers to all of them. It also offered Telegram/Discord/etc. to users who never set those up. - cron/scheduler.py: add cron_delivery_targets() — the single source of truth. Intersects gateway-configured platforms with cron-deliverable ones and reports whether each platform's home channel is set. - web_server.py: GET /api/cron/delivery-targets exposes that list (+ the implicit local option) to the dashboard. - CronPage.tsx: both modals render options from the endpoint. Configured platforms missing a home channel still appear, annotated "set a home channel first" (option B), so the user knows what to fix. Edit modal preserves a job's current target even if it's no longer configured. Local-only state shows a "configure a platform under Channels" hint. Validation: scheduler + endpoint E2E'd with a Matrix gateway (home set and unset); 5 new tests; tests/cron + tests/hermes_cli/test_web_server green (366 passed).
This commit is contained in:
@@ -775,6 +775,34 @@ class TestWebServerEndpoints:
|
||||
assert resp.json()["gateway_state"] == "startup_failed"
|
||||
assert resp.json()["gateway_platforms"] == {}
|
||||
|
||||
def test_cron_delivery_targets_lists_configured_platforms(self, monkeypatch):
|
||||
"""The cron dropdown endpoint returns Local + configured platforms dynamically."""
|
||||
import gateway.config as gateway_config
|
||||
|
||||
class _Platform:
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
class _GatewayConfig:
|
||||
def get_connected_platforms(self):
|
||||
return [_Platform("matrix")]
|
||||
|
||||
monkeypatch.setattr(
|
||||
gateway_config, "load_gateway_config", lambda: _GatewayConfig()
|
||||
)
|
||||
monkeypatch.setenv("MATRIX_HOME_ROOM", "!room:matrix.org")
|
||||
|
||||
resp = self.client.get("/api/cron/delivery-targets")
|
||||
|
||||
assert resp.status_code == 200
|
||||
targets = {t["id"]: t for t in resp.json()["targets"]}
|
||||
# Local is always offered; matrix appears because its gateway is configured.
|
||||
assert "local" in targets
|
||||
assert "matrix" in targets
|
||||
assert targets["matrix"]["home_target_set"] is True
|
||||
# No hardcoded telegram/discord/slack/email when they aren't configured.
|
||||
assert "telegram" not in targets
|
||||
|
||||
def test_get_config_schema(self):
|
||||
resp = self.client.get("/api/config/schema")
|
||||
assert resp.status_code == 200
|
||||
|
||||
Reference in New Issue
Block a user