Skip to content

Beta#879

Open
steveseguin wants to merge 143 commits into
mainfrom
beta
Open

Beta#879
steveseguin wants to merge 143 commits into
mainfrom
beta

Conversation

@steveseguin

Copy link
Copy Markdown
Owner

No description provided.

- Add forceNinjaSDKFromUrl parameter to enable SDK via URL
- Implement fallback SDK loading from sources/grabvideo.js
- Fix background tab query to filter by exact URL with query/hash
- Sanitize donation, membership, subtitle, and title fields in bot.html
- Add stripHtmlToPlainText, escapeHtml, safePlainText helpers in chathistory.js
- Remove Google Fonts import and update font stack to system fonts in actions/styles.css
- Update AGENTS.md with donation event and meta object guidance

[auto-enhanced]
…imeout

- Add `SOCKET_CONNECT_TIMEOUT_MS` (8000ms) to trigger SSE fallback if socket.io fails to connect within that window.
- Call `startSocketConnectTimeout` immediately after creating the socket, preventing indefinite waiting on stalled connections.
- Handle SSE HTTP 200 at readyState 2 as an early connected event, reducing unnecessary delays and improving responsiveness.
- Continue refining Velora integration and fallback logic following recent auth and SDK changes.

[auto-enhanced]
- Updates six YouTube event handlers (gift, membership, sticker) in `sources/websocket/youtube.html` to respect `settings.textonlymode`
- Conditionally sets `chatmessage` as plain text (without HTML escaping) when text-only mode is active
- Sets the `textonly` flag on each payload to match the current mode
- Ensures consistency with the websocket and source text-only metadata alignment from recent commits

[auto-enhanced]
Clarify that the `textonly` field applies only to `chatmessage`, not to other text fields like `chatname`, `membership`, or `hasDonation`. Other normal fields are expected to be plain text except media fields such as `chatimg` and `contentimg`.

Updates documentation in AGENTS.md, api.md, adding-a-source.md, and event-reference.html to reflect this contract, aligning with recent source provider changes for text-only mode.

[auto-enhanced]
When `settings.textonlymode` is enabled, chat messages should be passed through as raw text without HTML entity escaping. This change introduces a `formatChatMessageText` helper that respects the setting, replacing direct calls to `escapeHtml` in the `getAllContentNodes` function across all source providers.

Affected files: cozy.js, megaphonetv.js, mixlr.js, pilled.js, riverside.js, and three additional source files. This completes the alignment of text-only message contracts documented in prior commits.

[auto-enhanced]
- Introduce FLEX TV (flextv.co.kr) as a new chat source, with DOM-based capture from rendered `.chat-item` rows.
- Document FLEX TV in README (supported platforms list), sites list (`docs/js/sites.js`), and event reference (`docs/event-reference.html`).
- Add `dataAttributeSelector()` helper to safely construct CSS attribute selector strings, replacing direct string interpolation in `querySelector` calls across `dock.html`.
- Add `escapeAttributeValue()` in `featured.html` to sanitize values used in HTML attribute interpolation.
- Replace raw `data.id`, `data.type` usage with escaped/safe versions (`safeDataId`, `safeDataType`) in message creation and DOM lookup paths to mitigate potential injection issues.
- Refactor `deleteMessages`, `flushMissedLiveBuffer`, reload handler, viewer count updates, and Twitch avatar loading to use the new selector helper.

[auto-enhanced]
…mages

Updated the Premium TTS Options section in README.md to clarify browser/provider TTS capture and reference the Local AI TTS Guide for self-hosted endpoints. Added supporting screenshots to the local TTS documentation.

[auto-enhanced]
…add test suite

- Rework DOM extraction logic to handle IMG alt text and structured content correctly
- Introduce `findNameElement` and `findMessageNode` helpers for more reliable node targeting
- Add `getMessageSignature` to centralize duplicate detection and enable re-processing when signature changes
- Add characterData mutation observation to detect text updates in existing messages
- Optimize duplicate detection: skip if same signature already processed, but re-fire on signature change
- Add `test:flextv` script to `package.json`
- Include comprehensive Playwright test suite covering backlog suppression, empty rows, dynamic text updates, duplicate prevention, soak tests, and reuse scenarios

[auto-enhanced]
docs(chzzk): update documentation to support iframe chat URL and add event reference

- Add `https://chzzk.naver.com/iframe/live/*/chat` URL to manifest row and related docs
- Set version to 2 and all frames flag in manifest-row-matrix.md
- Document iframe route and viewer count polling in popout-chat-only-sources.md
- Update supported-sites-lookup.md to include both live and iframe patterns
- Add CHZZK platform card in event-reference.html with message, donation, and viewer_update events
- Update sites.js instructions to include iframe URL
```

[auto-enhanced]
Consolidate pre-beta cleanup changes across documentation and source
handling:

- Fix YouTube WebSocket source OAuth logic: clears failed OAuth state on
  error and only treats active session/callback state as pending. This
  prevents stale/stuck authentication state from masking
  `signin_required` conditions.

- Normalize hardcoded absolute developer paths in AI agent documentation
  (e.g., `C:\Users\steve\Code\social_stream`) across multiple markdown
  files under `docs/agents/`, replacing them with portable placeholders
  (e.g., `<social_stream repo>`, `docs/agents`, `<ssapp repo>`). This
  improves clarity for external contributors and downstream AI processing.

[auto-enhanced]
…iagnostic imagery

Rework the OBS setup documentation to eliminate ambiguous guidance and provide users with a structured, visual onboarding experience:

- Replace vague instructions ("Make sure messages appear") with concrete, sequential actions ("Send or wait for one chat message so you know the source is working").
- Introduce a debugging-first workflow by repositioning the dock as the primary health check. The guide now explicitly states: "If the dock is empty, OBS is not the problem yet," helping users isolate issues before adjusting OBS.
- Add three contextual screenshots (dock message check, featured overlay preview, and platform setup) enclosed in semantic `<figure>`/`<figcaption>` elements. Each caption explains the expected visual state and why it confirms the step is functioning correctly.
- Refactor the `.guide-image` / `.guide-figure` CSS to enforce a full-width responsive layout with consistent spacing and properly styled captions, establishing a reusable pattern for all future guide imagery across the docs site.

[auto-enhanced]
- Added `.guides-page` wrapper class to scope CSS and style hero section
- Restructured guide directory header with responsive `grid-template-columns` layout
- Enhanced guide tree items with icons and improved internal link structure
- Refined `.guide-details` summary styling for better open/close visual feedback
- Adjusted spacing, padding, and font sizes for consistency across breakpoints
- Improved mobile responsiveness with stacked grid and reduced gaps
- Updated filter component layout to align with new header design
- Fixed minor alignment issues in troubleshooting grid and navigation links

[auto-enhanced]
Remove the `open` attribute from the `#detailed-guides` `<details>` block.
The detailed guide sections now start collapsed, providing a cleaner view
of the directory page. Users can expand the "Detailed guide sections"
summary to reveal the full guide bodies when needed.

[auto-enhanced]
- Add "TikTok quick start" guide link to Getting Started and Platform Guides sections
- Add "Template quick start" guide link to Overlays And Customization section
- Include supporting screenshots for both guides
- Adjust CSS grid and spacing for new navigation items

[auto-enhanced]
Reflect the recent template gallery UI changes following the addition of the template quick start feature entries.

[auto-enhanced]
The active filter mode (all, onlydonors, onlysupporters) selected via URL
parameters was not stored in the persisted credits data in localStorage.
On page reload without the original query parameters, the filter state
would revert, breaking consistency with the recently introduced persisted
user data and the hasDonationActivity flags tied to the filter context.

This fix stores the filter mode alongside the user data in the localStorage
schema (version bumped to 2). The load function now restores the saved
filter mode and uses it to determine the hasDonationActivity flag,
ensuring the cached credit state remains self-consistent across page
sessions regardless of the current URL.

[auto-enhanced]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6492e47030

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread sources/websocket/youtube.html Outdated
Comment on lines +314 to +315
const tokenAccessLevel = localStorage.getItem(YT_TOKEN_ACCESS_LEVEL_KEY);
return tokenAccessLevel !== null && normalizeYouTubeAccessLevel(tokenAccessLevel) === 'admin';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve write access for existing YouTube tokens

Existing signed-in YouTube users have no youtubeOAuthTokenAccessLevel because that key is newly introduced and old tokens were stored without it; this function therefore returns false for every migrated session and disables sending chat, moderation, and metadata controls until the user manually signs out and completes OAuth again. Infer the token's prior access level (or migrate it) when this key is absent rather than treating all existing tokens as read-only.

Useful? React with 👍 / 👎.

Rephrase the "YouTube Shorts and Event Flow" section to use
generic "Destination" terminology instead of specific cross-
platform examples (e.g., "A TikTok → youtube Relay Chat
action..." becomes "Destination youtube sends...").

This makes the routing logic platform-agnostic and focuses
on the general behavior of the feature.

Structural improvements:
- Extract legacy grouping behavior into a dedicated
  "Troubleshooting Older Versions" sub-section.
- Clarify the distinction between exact destination matching
  and YouTube-wide controls that handle both variants.
- Simplify the reflection filter explanation.

Aligns the documentation with the relay fix (ff9e0e4) that
properly separated YouTube and YouTube Shorts as distinct
relay destinations.

[auto-enhanced]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f2eebfe9b9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

--include='docs/css/event-reference.css' \
--include='docs/css/styles.css' \
--include='docs/js/main.js' \
--exclude='docs/***' \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Package all linked Event Flow guides

The new selective docs/ staging still omits guides linked from the packaged Event Flow Guide: actions/event-flow-guide.html links to ../docs/media-hosting-event-flow.html and ../docs/source-types-guide.html, but both are excluded by this rule. I ran scripts/prepare-firefox.sh and confirmed those paths are absent from firefox-build, so Firefox users opening those help links receive 404s despite the Event Flow Guide itself being shipped.

Useful? React with 👍 / 👎.

When additive API delivery is enabled, the extension sends each chat message over both the channel-4 websocket and the VDO.Ninja bridge. Docks opened with &server2 previously processed both copies, rendering every message twice.

- Implement a temporary deduplication map with a 12-second TTL to drop duplicate feed payloads by tracking id and content at the two transport entry points.
- Exclude commands, callbacks, dock-sync payloads, and idless meta events from deduplication.
- Guard remains inactive when the server2 URL parameter is not set.
- Add regression tests (scripts/transport-dedupe-regression.test.cjs) to validate deduplication logic.

[auto-enhanced]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9f7babf879

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

{ value: 'viewer_update', label: 'Viewer Count Update' },
{ value: 'follower_update', label: 'Follower Count Update' },
{ value: 'viewer_update', label: 'Viewer Count Update' },
{ value: 'likes_update', label: 'Video Like Count Update (YouTube)' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allow likes updates to reach Event Flow

When captureyoutubelikes is enabled, the new YouTube source emits { type, event: "likes_update", meta } without chat fields, but EventFlowSystem.isMetaOnlyPayload() returns true for exactly that shape and processMessage() returns before evaluating any triggers. Thus selecting this newly exposed trigger can never run a flow; exempt likes_update (or route supported counter events through Event Flow) before the meta-only early return.

Useful? React with 👍 / 👎.

…ver2-capable pages**

Extend the `isDuplicateTransportDelivery` guard from the dock to all overlay pages that consume the channel-4 feed in server2 mode. This prevents duplicate rendering of messages arriving via both websocket relay and the VDO.Ninja bridge, addressing issues with additive API delivery and legacy `&v` parameters in saved URLs.

**Key changes:**
- Added the deduplication guard to the top of each page's feed processing funnel (e.g., `processInput`, `processData`, `addMessageToOverlay`).
- Guard remains inactive without server params (`server`, `server2`, `server3`), preserving local demo/preview behavior.
- Commands, callbacks, and idless meta events (e.g., without `id`) bypass deduplication.

**Pages intentionally excluded:**
- `cohost`: Socket and bridge transports are mutually exclusive.
- `multi-alerts`: Already uses 2.5s signature dedupe.
- `tipjar`: Has contribution-specific dedupe.
- `confetti`: Handles only idless waitlist state.
- `featured`: Does not consume the channel-4 feed.
- `simple_api_client`: Serves as a diagnostic raw feed.

**Additional fix:**
- Resolved `emotes.html` receiving the feed twice with `&server2` alone, as both legacy and extension-relay sockets joined channel 4.

This change builds on commit 77b9ad9 (dock dedupe) and targets pages from the games, scripts, and themes areas (e.g., `battle.html`, `content.html`, `credits.html`, `emotes.html`, `events.html`).

[auto-enhanced]
…提交涉及的多个方面变更。改进后的提交信息应更全面地概括主要工作及附带修改。

以下是改进后的提交消息:

```
docs: add transport migration roadmap and minor feature/maintenance updates

- Introduce a comprehensive TODO.md outlining the multi-phase
  migration plan from legacy bridge to server2 transport.
- Update Firefox signing workflow to conditionally apply linting flags.
- Add a new supported platform (sealteamsloth.com) to README.
- Enhance TTS action to accept voice parameter override (actions.html).
- Add TikTok Team Member role to EventFlowEditor user role conditions
  and improve role label display.
```

**说明:**
1.  **主体明确**:保留了原始消息的核心“transport migration roadmap”,并将其设为首要提及项。
2.  **概括其他变更**:使用“and minor feature/maintenance updates”作为引子,将其他文件(`firefox-sign.yml`, `README.md`, `actions.html`, `EventFlowEditor.js`)的修改归类为次要的功能增强和维护工作。
3.  **详细列表**:在正文中使用列表格式,清晰地逐项说明了主要贡献(路线图文档)以及每一个其他的具体改动,使审查者能快速把握变更全貌。
4.  **作用域与格式**:采用标准的“`类型(范围): 主题`”格式,但将范围从单一的`docs`扩展为更广义的描述,因为修改超出了纯文档范畴。正文提供了必要的细节。

[auto-enhanced]
- treasurehunt: point compass red tip at nearest treasure (gradient halves were inverted)
- phraseguess: track endRound 5s auto-advance in pendingRoundTimeout so skip/stop can cancel it; clear winner banner on cancel; drop dead intentionalClose flag
- colorwars: detect ties between equal nonzero team scores, not just zero
- emojitower: remove orphaned falling class and keyframes
- pixelbattle: flood fill now uses one full-canvas readback, batches stats, and fires one collab check/effect/display update per fill
- youtube: apply stored access-level fallback to the auth-code exchange path too
- dock: snapshot the emoji-strip fallback after striphtml so an all-emoji name can't resurrect stripped HTML markup
- parameters.md: document stripnameemoji; add youtubechannelname/youtubechanneltitle so the live feature survives regeneration (it was only ever hand-added to the generated file)
- regenerate shared/config/urlParameters.js
The io server's HTTP bridge holds the webhook sender's response open until a
client answers the callback pid or a 5s timeout fires. The stripe/kofi/bmac/
fourthwall branches never answered it: early returns skip the generic tail ack,
and the success paths reassign data, dropping data.get before it is checked.
Every delivery therefore took the full 5 seconds to be acknowledged, which is
the likely trigger for sender-side retries (the duplicate deliveries the
message_id dedup absorbs).

Ack at the top of each webhook branch so senders get a sub-second response;
data.get is cleared to keep the tail ack from double-answering. The server's
resolveCallback is guarded, so a late ack after its timeout is a no-op.
```
feat(event-flow): implement user memory system with editor integration

- Add new 'User Memory' node type for persistent user state management
- Introduce triggers and actions for user memory workflows:
  - Triggers: `userMemoryContains` (User Is Remembered)
  - Actions: `rememberUser`, `forgetUser`, `clearUserMemory`, `pickRandomUser`
- Implement real-time state synchronization via BroadcastChannel
- Enhance editor UI with memory controls and state visualization
- Improve node rendering security by using textContent instead of innerHTML

fix(tts): correct system voice configuration in TTS module

Related to component changes in: TTS Module
```

This improved message:
1. Separates features and fixes clearly
2. Provides specific details about the user memory system implementation
3. Mentions security improvements
4. Maintains conventional commit format
5. References the component summary
6. Gives context about the scope of changes beyond what's visible in the truncated diff

[auto-enhanced]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a54d233edf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tts.js Outdated
settled = true;
if (TTS.resolveCurrentAudioPlayback === cleanup) {
TTS.resolveCurrentAudioPlayback = null;
TTS.premiumSerial = 0;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Initialize premiumSerial before starting premium TTS

For the first premium-provider utterance, ++TTS.premiumSerial runs while this field is still undefined, producing NaN; every completion guard such as premiumSerial === TTS.premiumSerial then remains false. As a result, ElevenLabs/Kokoro/Piper/etc. do not call finishedAudio() after that first item, leave premiumQueueActive set, and all later TTS messages are queued indefinitely. Initialize this once with the other TTS state fields rather than only during blob-playback cleanup.

Useful? React with 👍 / 👎.

docs(event-flow): enhance user memory documentation, validate functionality, update example
```

[auto-enhanced]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f05168f421

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread background.js
Comment on lines +9306 to +9307
function getStreamDeckRemoteControlRouter() {
return typeof window !== "undefined" ? window.StreamDeckRemoteControl : null;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Load the Stream Deck router in the background page

background.html never includes js/streamdeck-remote-control.js, and no runtime loader references it, so window.StreamDeckRemoteControl is always absent in the extension/Electron background page. Consequently the new capability requests return the empty fallback and SSApp Stream Deck actions never reach their router; include the packaged router before background.js is loaded.

Useful? React with 👍 / 👎.

```
fix(eventflow): allow counter events to match explicit triggers

- Add isCounterEventPayload() to identify viewer_update, likes_update,
  follower_update, subscriber_update events
- Permit counter payloads to reach explicit Event Type triggers while
  blocking them from generic triggers (Any Message, chat-oriented)
- Preserve exclusion of other meta-only payloads from Event Flow

feat(ai): bump local browser worker version to 18

feat(cohost): upgrade local Gemma 4 E2B to multimodal

- Add required files list for localgemma provider
- Update model class from Gemma4ForCausalLM to Gemma4ForConditionalGeneration
- Enable vision and audio encoder support (q4 quantized)
- Change label from "text-only" to "self-hosted"

docs: add standalone app sitemap and control API/MCP reference
```

---

### Rationale

| Aspect | Original | Improved |
|--------|----------|----------|
| Specificity | Vague "PR review issues" | Names the actual logic change (counter event filtering) |
| Scope | Single line | Separates eventflow fix, version bump, Gemma multimodal upgrade, and docs |
| Conventions | No scope/type | Uses `fix()`/`feat()`/`docs()` matching branch patterns |
| Verifiability | "validation coverage" | Lists exact event types and class name changes |

[auto-enhanced]
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.

2 participants