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:
Teknium
2026-06-05 20:23:54 -07:00
committed by GitHub
parent 150687447b
commit 50f9ad70fc
8 changed files with 259 additions and 31 deletions
+28
View File
@@ -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