The dashboard would hang indefinitely on the loading screen because:
1. `bls.mjs` used a raw `fetch()` without any timeout/AbortSignal —
if the BLS API was slow or unresponsive, it would block forever.
2. `runSource()` in `briefing.mjs` had no per-source timeout, so a
single hanging API could stall the entire sweep indefinitely.
3. `server.mjs` loaded cached `latest.json` via a fire-and-forget
promise (`.then()`) instead of `await`, meaning the dashboard
never received the cached data before the sweep started.
4. `loading.html` relied solely on SSE for redirect — if the SSE
connection missed the update event, the page would never redirect.
Changes:
- Add 15s AbortController timeout to BLS `getSeries()` fetch call
- Add 30s per-source timeout via `Promise.race()` in `runSource()`
- Await `synthesize()` when loading cached data so the dashboard
serves instantly on restart when `runs/latest.json` exists
- Add 5s fallback polling to loading page alongside SSE
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Call setMyCommands on startup for private and group chat scopes
- Parse /cmd@BotName in groups; reply to originating chat
- Allow sendMessage chatId override for command replies
Made-with: Cursor
- npm audit fix --force had silently installed discord.js@13 (deprecated)
despite package.json declaring ^14.25.0; restored to 14.25.1
- Added overrides.undici >=7.24.4 to patch GHSA-g9mf, GHSA-f269,
GHSA-2mjp, GHSA-vrm6, GHSA-v9p9, GHSA-4992 without breaking changes
- package-lock.json license field corrected ISC -> AGPL-3.0-only
to match package.json (lockfile was out of sync from project init)
Add MiniMax (api.minimax.io) as a fifth LLM provider option alongside
Anthropic, OpenAI, Gemini, and Codex. MiniMax offers an
OpenAI-compatible Chat Completions API with the M2.5 model (204K
context window).
Changes:
- lib/llm/minimax.mjs: new provider using raw fetch (no SDK)
- lib/llm/index.mjs: register MiniMax in the factory
- .env.example, crucix.config.mjs, README.md: document the new option
- test/llm-minimax.test.mjs: 10 unit tests (node:test)
- test/llm-minimax-integration.test.mjs: live API integration test
Usage:
LLM_PROVIDER=minimax
LLM_API_KEY=sk-...
LLM_MODEL=MiniMax-M2.5 # optional, this is the default
Docker's env_file does not support inline comments — everything after
the = is treated as the value. This caused LLM_MODEL to be set to the
comment text, resulting in Anthropic API 404 errors.
Move all comments to their own lines above each variable and add a
warning about this behavior.
RSS and GDELT ticker items now open the source article in a new tab
when clicked. Telegram/WHO items without URLs remain non-clickable.
Changes:
- Extract <link> from RSS feed items in inject.mjs
- Carry url field through fetchAllNews() and buildNewsFeed()
- Add data-url attribute and pointer cursor to clickable ticker cards
- Add delegated click listener to open articles in new tab
The isServer detection required location.hostname === 'localhost', which
fails in Docker containers where the hostname is the container ID.
Now any non-file: protocol correctly triggers API fetch and SSE.
Fixes#3
- Add interactive 3D globe (Globe.gl) with atmosphere, star field, and smooth rotation
- Add animated flight corridor arcs between air traffic hotspots and global hubs
- Add flat map toggle for classic D3 view
- Add CelesTrak as 27th intelligence source (satellite tracking, ISS, military constellations)
- Add Space Watch panel to dashboard
- Switch license from MIT to AGPL-3.0-only
- Update README with 3D globe screenshots, new source count, and license badge
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New source: apis/sources/space.mjs (no API key required)
- Tracks: recent launches, ISS, military sats, Starlink/OneWeb constellations
- Wired into briefing.mjs (27 sources), inject.mjs synthesis, and dashboard
- New Space Watch panel in left rail with military breakdown and signals
- New Satellites layer in Sensor Grid
26-source OSINT intelligence engine with live Jarvis dashboard,
auto-refresh via SSE, optional LLM layer (4 providers), delta/memory
system, and Telegram breaking news alerts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>