Skip to content

AI Updates & Player Enhancements#118

Merged
SkyeRangerDelta merged 4 commits into
Experimentalfrom
AI-Updates
Jun 25, 2026
Merged

AI Updates & Player Enhancements#118
SkyeRangerDelta merged 4 commits into
Experimentalfrom
AI-Updates

Conversation

@SkyeRangerDelta

Copy link
Copy Markdown
Owner

This pull request introduces two major new features to the bot: an interactive music search command and a lyrics display command. Additionally, the README.md has been significantly rewritten to better describe the bot's capabilities, features, and intended audience.

New Features:

Music System Enhancements

  • Added /search command for interactive music selection. Users can search Jellyfin (and fall back to YouTube), see up to 5 results (tracks, albums, or playlists), and queue selections directly via numbered buttons. The system caches search results for a short period to handle user interactions efficiently.
  • Added /lyrics command to display lyrics for the currently playing track. The command fetches lyrics from the Jellyfin library when available, falling back to lrclib.net for other sources, and paginates long lyrics to fit Discord's message limits.

Documentation Improvements:

README Overhaul

  • Rewrote README.md with a new banner, badges, and a detailed, themed description of the bot's features. The new documentation provides a clearer overview of the bot's music, AI, operations, astronomy, and crew service capabilities, and clarifies its source-available status and intended audience.

@SkyeRangerDelta SkyeRangerDelta self-assigned this Jun 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Unit Test Report (Node 24.x)

99/99 tests passed

Details

> lcars47@7.1.0-E.2 test
> vitest run 2>&1 | tee logs/tests/vitest-output.log


�[1m�[30m�[46m RUN �[49m�[39m�[22m �[36mv4.1.7 �[39m�[90m/home/runner/work/LCARS47/LCARS47�[39m

 �[32m✓�[39m Src/Subsystems/RemoteDS/Beszel_Utilities.test.ts �[2m(�[22m�[2m22 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mreturns no-match when no providers are registered
�[22m�[39m[RESOLVER] Query "anything" — enabled providers: [none], expand=false

�[90mstderr�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mreturns no-match when no providers are registered
�[22m�[39m[RESOLVER] No provider matched "anything".

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mfalls back to the next provider when first returns confidence:none
�[22m�[39m[RESOLVER] Query "query" — enabled providers: [jellyfin, youtube], expand=false

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mfalls back to the next provider when first returns confidence:none
�[22m�[39m[RESOLVER] jellyfin returned 0 track(s) confidence=none.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mfalls back to the next provider when first returns confidence:none
�[22m�[39m[RESOLVER] youtube returned 1 track(s) confidence=fuzzy.
[RESOLVER] Winner: youtube.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mprefers the first provider that returns a confident match
�[22m�[39m[RESOLVER] Query "q" — enabled providers: [jellyfin, youtube], expand=false

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mprefers the first provider that returns a confident match
�[22m�[39m[RESOLVER] jellyfin returned 1 track(s) confidence=exact.
[RESOLVER] Winner: jellyfin.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mroutes URL-shaped queries deterministically to the owner provider
�[22m�[39m[RESOLVER] Query "https://youtu.be/abc" — enabled providers: [jellyfin, youtube], expand=false
[RESOLVER] URL routing to youtube.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mroutes URL-shaped queries deterministically to the owner provider
�[22m�[39m[RESOLVER] youtube returned 1 track(s) confidence=exact.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mskips disabled providers
�[22m�[39m[RESOLVER] Query "q" — enabled providers: [youtube], expand=false

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mskips disabled providers
�[22m�[39m[RESOLVER] youtube returned 1 track(s) confidence=fuzzy.
[RESOLVER] Winner: youtube.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mtreats a thrown error as no-match for that provider
�[22m�[39m[RESOLVER] Query "q" — enabled providers: [jellyfin, youtube], expand=false

�[90mstderr�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mtreats a thrown error as no-match for that provider
�[22m�[39m[RESOLVER] jellyfin.search threw: Error: boom

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mtreats a thrown error as no-match for that provider
�[22m�[39m[RESOLVER] jellyfin returned 0 track(s) confidence=none.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/ProviderResolver.test.ts�[2m > �[22m�[2mProviderResolver�[2m > �[22m�[2mtreats a thrown error as no-match for that provider
�[22m�[39m[RESOLVER] youtube returned 1 track(s) confidence=fuzzy.
[RESOLVER] Winner: youtube.

 �[32m✓�[39m Src/Subsystems/MediaPlayer/ProviderResolver.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 19�[2mms�[22m�[39m
�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.isEnabled�[2m > �[22m�[2mreturns confidence:none when the client is not ready
�[22m�[39m[JELLYFIN] search() called while not ready; skipping.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mconverts a single audio hit into a Track
�[22m�[39m[JELLYFIN] Searching: "hello" (limit=5, expandContainers=false).

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mconverts a single audio hit into a Track
�[22m�[39m[JELLYFIN] 1 hit(s): audio:Hello

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mexpands an album hit into its tracks (playlist queuing)
�[22m�[39m[JELLYFIN] Searching: "best of" (limit=5, expandContainers=true).

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mexpands an album hit into its tracks (playlist queuing)
�[22m�[39m[JELLYFIN] 1 hit(s): album:Best of
[JELLYFIN] Expanding album "Best of"...

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mexpands an album hit into its tracks (playlist queuing)
�[22m�[39m[JELLYFIN] Container yielded 2 track(s).

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mdoes NOT expand container hits when expandContainers is unset
�[22m�[39m[JELLYFIN] Searching: "best of" (limit=5, expandContainers=false).

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.search�[2m > �[22m�[2mdoes NOT expand container hits when expandContainers is unset
�[22m�[39m[JELLYFIN] 1 hit(s): album:Best of
[JELLYFIN] Hits present but no audio tracks after filtering.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts�[2m > �[22m�[2mJellyfinProvider.getStream�[2m > �[22m�[2mfalls back to HTTP when local is unreachable
�[22m�[39m[JELLYFIN] NAS path unreachable, falling back to HTTP: /no/where

 �[32m✓�[39m Src/Subsystems/MediaPlayer/Providers/JellyfinProvider.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 25�[2mms�[22m�[39m
�[90mstdout�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns false for non-existent feature group
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns false for non-existent feature group
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 74dcf763-1d7a-4b6f-868d-f908b60408f4

�[90mstdout�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns false when beszel feature group vars are missing
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns false when beszel feature group vars are missing
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 4efcb40a-b92d-46e7-bf22-21c50f5df9f9

�[90mstdout�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns true when beszel feature group is fully configured
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns true when beszel feature group is fully configured
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 8f9710aa-8bb3-4d1c-9ce1-a9f02c73eaff

�[90mstdout�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns false when jellyfin feature group is partially configured
�[22m�[39m[ENV] Starting environment validation...
==================================================
[ENV] Environment Variable Validation Report
==================================================

[ENV] WARNING - Incomplete feature groups:
  jellyfin: Jellyfin media server integration
    Missing: JELLYFIN_KEY, JELLYFIN_USER, JELLYFIN_PASS
    (Feature will be disabled)

==================================================
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns false when jellyfin feature group is partially configured
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 14be68c2-8608-47bf-8104-35d838c93bbd

�[90mstdout�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns true when jellyfin is fully configured (with defaults)
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/EnvUtils.test.ts�[2m > �[22m�[2misFeatureEnabled�[2m > �[22m�[2mreturns true when jellyfin is fully configured (with defaults)
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 37205ae2-3843-45d7-9bec-252e6443b5d0

 �[32m✓�[39m Src/Subsystems/Utilities/EnvUtils.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 66�[2mms�[22m�[39m
 �[32m✓�[39m Src/Subsystems/Utilities/SysUtils.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 227�[2mms�[22m�[39m
�[90mstdout�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns no-results when no provider produces a track
�[22m�[39m[RESOLVER] Query "a query that finds nothing" — enabled providers: [youtube], expand=false

�[90mstderr�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns no-results when no provider produces a track
�[22m�[39m[RESOLVER] No provider matched "a query that finds nothing".

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns no-results when no provider produces a track
�[22m�[39m[RESOLVER] youtube returned 0 track(s) confidence=none.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns the resolved track on successful enqueue
�[22m�[39m[RESOLVER] Query "q1" — enabled providers: [youtube], expand=false

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns the resolved track on successful enqueue
�[22m�[39m[RESOLVER] youtube returned 1 track(s) confidence=fuzzy.
[RESOLVER] Winner: youtube.

�[90mstderr�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns the resolved track on successful enqueue
�[22m�[39m[MEDIA-PLAYER] joinVoiceChannel threw: Error: voice not exercised

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns the resolved track on successful enqueue
�[22m�[39m[MEDIA-PLAYER] Queued 1 track(s) from youtube; head: First
[MEDIA-PLAYER] Re/setting voice connection: Test VC

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns the resolved track on successful enqueue
�[22m�[39m[MEDIA-PLAYER] Queue drained.

�[90mstderr�[2m | Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts�[2m > �[22m�[2mMediaPlayerService — enqueue resolution�[2m > �[22m�[2mreturns the resolved track on successful enqueue
�[22m�[39m[MEDIA-PLAYER] No connection; abandoning track.

 �[32m✓�[39m Src/Subsystems/MediaPlayer/MediaPlayerService.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mcalls helpers.downloadYtDlp with the binary directory (not the file)
�[22m�[39m[YT-DLP] Refreshing yt-dlp binary...

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mcalls helpers.downloadYtDlp with the binary directory (not the file)
�[22m�[39m[YT-DLP] yt-dlp binary refreshed at /tmp/yt-dlp.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mdedupes concurrent updates (one download serves multiple callers)
�[22m�[39m[YT-DLP] Refreshing yt-dlp binary...

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mdedupes concurrent updates (one download serves multiple callers)
�[22m�[39m[YT-DLP] yt-dlp binary refreshed at undefined.

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mclears the in-flight lock on failure so a retry can proceed
�[22m�[39m[YT-DLP] Refreshing yt-dlp binary...

�[90mstderr�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mclears the in-flight lock on failure so a retry can proceed
�[22m�[39m[YT-DLP] Binary refresh failed: Error: network down

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mclears the in-flight lock on failure so a retry can proceed
�[22m�[39m[YT-DLP] Refreshing yt-dlp binary...

�[90mstdout�[2m | Src/Subsystems/MediaPlayer/YtDlpManager.test.ts�[2m > �[22m�[2mYtDlpManager.update�[2m > �[22m�[2mclears the in-flight lock on failure so a retry can proceed
�[22m�[39m[YT-DLP] yt-dlp binary refreshed at undefined.

 �[32m✓�[39m Src/Subsystems/MediaPlayer/YtDlpManager.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
�[90mstderr�[2m | Src/Subsystems/MediaPlayer/Providers/LocalFileProvider.test.ts
�[22m�[39m[LOCAL-PROVIDER] Read stream error on /tmp/lcars-test-1782356553950.opus: Error: ENOENT: no such file or directory, open '/tmp/lcars-test-1782356553950.opus'

 �[32m✓�[39m Src/Subsystems/MediaPlayer/Providers/LocalFileProvider.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
 �[32m✓�[39m Src/Subsystems/Utilities/MediaUtils.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m Src/Subsystems/Jellyfin/JellyfinClient.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
�[90mstdout�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for SIMLAB channel
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for SIMLAB channel
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: f8fc300b-e02a-4b79-9f2f-f5ba747555de

�[90mstdout�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for ENGINEERING channel
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for ENGINEERING channel
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 14acdf55-1848-43d0-801e-61d1baa2916b

�[90mstdout�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for MEDIALOG channel
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for MEDIALOG channel
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: b0cb9610-0f78-462f-ad07-d1abafb0cf33

�[90mstdout�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for DEVLAB channel
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns channel info for DEVLAB channel
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 276ccfb0-8546-421f-8800-72dffc358ab8

�[90mstdout�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns null for non-special channel
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns null for non-special channel
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 9b46aa77-57ba-464f-b9d6-fce2ba5ea273

�[90mstdout�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns null for empty string
�[22m�[39m[ENV] Starting environment validation...
[ENV] Environment validation complete. All required variables present.

�[90mstderr�[2m | Src/Subsystems/Utilities/GuildUtilities.test.ts�[2m > �[22m�[2mGuildUtilities�[2m > �[22m�[2misSpecChannel�[2m > �[22m�[2mreturns null for empty string
�[22m�[39m[ENV] API_AUTH_TOKEN not set. Generated session token: 632e420e-bbd2-4777-9d71-bd569efe62b3

 �[32m✓�[39m Src/Subsystems/Utilities/GuildUtilities.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 510�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m returns channel info for SIMLAB channel �[33m 492�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m11 passed�[39m�[22m�[90m (11)�[39m
�[2m      Tests �[22m �[1m�[32m99 passed�[39m�[22m�[90m (99)�[39m
�[2m   Start at �[22m 03:02:32
�[2m   Duration �[22m 1.55s�[2m (transform 382ms, setup 0ms, import 1.39s, tests 920ms, environment 2ms)�[22m

@github-actions

Copy link
Copy Markdown
Contributor

✅ Type Coverage Report (Node 24.x)

Coverage: 99.91% (threshold: 90%)

Details
(12420 / 12431) 99.91%
type-coverage success.

@SkyeRangerDelta SkyeRangerDelta merged commit 2d89547 into Experimental Jun 25, 2026
5 checks passed
@SkyeRangerDelta SkyeRangerDelta deleted the AI-Updates branch June 25, 2026 03:05
@SkyeRangerDelta SkyeRangerDelta mentioned this pull request Jun 25, 2026
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant