Skip to content

1.0.0

Choose a tag to compare

@MattFalahe MattFalahe released this 29 May 18:56
· 3 commits to main since this release

Manager Core 1.0.0

The Foundation Release. First stable Manager Core. Every plugin in the MattFalahe SeAT suite can now route through one shared infrastructure layer: cross-plugin events, centralized market pricing across 5 providers, ESI fast-poll for ~2 minute notification detection, capability registry for plugin-to-plugin calls, REST API, Watchdog meta-monitoring, and a 10-tab diagnostics dashboard.

Mental model: Plugins work standalone. Manager Core gives extras.

Mining Manager calculates tax with or without Manager Core. Structure Manager alerts on fuel with or without Manager Core. Install Manager Core alongside, and Structure Manager's fuel-critical events reach Mining Manager (warning miners their extraction sits at a fuel-starved structure), and both plugins read prices from the same citadel market your alliance trades at instead of Jita.


🎉 What's New

💰 Pricing Orchestrator

Per-market provider routing across 5 sources. Operators pick which upstream powers each market.

Provider Covers Auth
MCPraisal (ESI) Public hubs (Jita / Amarr / Dodixie / Hek / Rens) None
Goonpraisal 7 Imperium nullsec hubs (C-J6MT, GB-6X5, UALX-3, HY-RWO, O4T-Z5, R-ARKN, GM-0K7) None
Janice Jita + Amarr API key
Fuzzwork 5 hub regions, default for hubs None
SeAT Price Provider Whatever seat-prices-core sub-provider you have installed None

4-layer resolution chain:

  1. Per-appraisal override (Appraisal form dropdown)
  2. Per-plugin provider_override on manager_core_pricing_preferences (lets Mining Manager route Jita through Janice while Structure Manager keeps Jita on Fuzzwork)
  3. Per-market provider field on manager_core_markets
  4. Hardcoded fuzzwork fail-safe

12 markets ship pre-seeded (5 hubs enabled by default, 7 Goonpraisal-tracked nullsec hubs disabled by default for operator opt-in).

📡 EventBus + Topics

Pub/sub event router with idempotency dedup, visibility scoping, Discord-injection sanitization, queued or synchronous delivery, wildcard subscription patterns. One-line cross-plugin publishing via the \ManagerCore\Topics::publish() facade.

25 ecosystem events registered across 4 plugin families:

  • mining.* (13 topics) Mining Manager
  • structure.alert.* (9 topics) Structure Manager (reinforcement timer ladder, fuel state transitions, tactical planning)
  • wallet.transaction_detected Corp Wallet Manager
  • buyback.completed Buyback Manager
  • pricing.preference_changed Manager Core itself (cache invalidation for subscribers)

Subscribers honor visibility hints (corporation_id, role_id) baked into every payload.

🔌 Plugin Bridge

Capability registry with runtime registration. Plugins advertise functions, others discover and call them. Worker-registry snapshots for queue-worker debugging (the registry is a per-process singleton so HTTP-context and worker-context state can diverge).

Visual ecosystem map with version badges showing each plugin's state at a glance:

  • ✓ Current (green)
  • ⚠ Outdated (amber, with current to latest arrow)
  • 🚀 Pre-release (info blue)
  • 🌱 Dev branch (grey)
  • 🚀 Coming soon (purple) for plugins not yet released on Packagist
  • — Unable to check (grey) when Packagist is unreachable

Refresh Versions button flushes the 6h Packagist cache on demand.

⚡ ESI Fast-Poll

Shared key-holder pool for character_notifications polling. About 2 minute detection per corp vs SeAT's native 20 to 30 minute sweep cadence. Adaptive per-corp fair LRU rotation, cascade retry on CCP 5xx bursts, auto-recovery on transient token failures, 10-minute SeAT-native sweep as belt-and-braces safety net.

🛡️ Watchdog (meta-monitoring)

New self-monitoring layer. Deliberately decoupled from EventBus (when the bus is broken, the bus can't reliably alert about its own failure), so Watchdog uses a direct HTTP path to a Discord or Slack webhook (auto-detected from URL pattern).

Check Fires when
eventbus_failures 10+ EventBus deliveries failed in the last 60 minutes
price_cron_overdue Newest cached price older than 2x the scheduled cron interval
esi_fast_poll_failing 80%+ of enabled ESI key holders have a non-success last_poll_status
provider_unavailable Any price provider routing an enabled market reports isAvailable=false

Cron-driven (every 5 min), 1-hour per-check dedup, configurable exclusion windows (default 11:00-11:10 UTC for EVE daily downtime). Disabled by default. Opt in at Settings → Watchdog.

🩺 10-tab Diagnostics

Web dashboard at /manager-core/diagnostic:

Overview · Master Test · Plugin Connections · Price Providers · Subscriptions · Event Bus · Event Trace · Capabilities · API Status · Cache · Settings · Notification Testing

The last tab is dedicated to previewing every Watchdog alert format directly in your Discord/Slack channel. Bypasses dedup and exclusion windows so you can iterate through all four sample alerts back-to-back without manufacturing real failures. One generic Test alert button at the top, one Send Sample button per check.

🔑 REST API

Token-authenticated endpoints for Discord bots, dashboards, spreadsheets. Per-token rate limits, append-only audit log, pepper-rotation support via hash_version.


⚠️ Breaking Changes

None. First stable release.


🚀 Upgrade Instructions

# Add mattfalahe/manager-core to the SEAT_PLUGINS list in your SeAT-Docker .env

# Then from /opt/seat-docker, take the stack down + back up:
docker compose -f docker-compose.yml -f docker-compose.mariadb.yml -f docker-compose.traefik.yml down
docker compose -f docker-compose.yml -f docker-compose.mariadb.yml -f docker-compose.traefik.yml up -d

Container boot pulls the plugin via composer, runs all 17 migrations, and re-seeds schedules automatically.

Recommended after first install

  1. Manager Core → Diagnostics → Master Test to confirm everything's healthy
  2. Manager Core → Markets to enable any nullsec citadel markets your alliance trades at
  3. Manager Core → Pricing Preferences to point each consumer plugin at its preferred market
  4. Manager Core → Settings → Watchdog (optional) to enable infrastructure alerts to Discord or Slack

📦 New Commands

Command Schedule Purpose
manager-core:update-prices Every 4 hours Refresh market prices via configured per-market providers
manager-core:poll-esi-notifications Every 2 minutes ESI fast-poll for shared notification pool
manager-core:sweep-seat-notifications Every minute Fallback sweep of SeAT's character_notifications table
manager-core:cleanup Daily 03:00 Old appraisals + price history retention
manager-core:cleanup-events Daily 04:00 Forensic event-log retention
manager-core:cleanup-stale-subscriptions Daily 05:00 Prune type subscriptions for absent plugins
manager-core:watchdog Every 5 minutes Meta-monitoring infrastructure health checks
manager-core:diagnose-bridge Manual Per-plugin integration breakdown for CLI debugging

📊 Statistics

  • 135 files in the release
  • ~28,400 insertions, ~1,000 deletions
  • 17 database tables with forward-only migrations
  • 25 ecosystem events registered in Topics
  • 23 PluginBridge capabilities for cross-plugin calls
  • 10 diagnostic tabs in the web UI
  • 5 price providers + per-appraisal override
  • 12 pre-seeded markets (5 hubs + 7 Goonpraisal citadels)
  • 4 Watchdog checks (EventBus failures, price cron overdue, ESI fast-poll failing, provider unavailable)
  • 8 compatible plugins detected at boot
  • 80+ dev commits squashed into one release commit

⚠️ Known Limitations

  • English only. UI strings and help docs live in src/Resources/lang/en/help.php. PRs adding other locales welcome.
  • Custom markets disabled in 1.0.0. Operators with hubs Goonpraisal does not track currently have no automatic pricing path. Janice slug expansion and Adam4EVE integration are on the roadmap.
  • Janice provider needs an API key from janice.e-351.com. Without it, the provider stays dormant.
  • Goonpraisal asks for an identifying User-Agent. Defaults to the plugin maintainer's email; operators are encouraged to override with their own contact via Settings so Goonpraisal can reach the actual person if their queries cause issues.
  • Watchdog supports Discord and Slack only (auto-detected from webhook URL pattern). Custom webhooks (Mattermost, generic JSON receivers) not supported in 1.0.0.
  • Help editor is filesystem-only. Admins who want to customize help text need filesystem access and a container rebuild.

🆘 Support


Full Changelog: https://github.com/MattFalahe/Manager-Core/blob/main/CHANGELOG.MD