@lumiastream/lumia-types 2.8.0 → 2.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -184,6 +184,8 @@ export declare enum LumiaAlertValues {
184
184
  TWITCH_RAID_OUT = "twitch-raidOut",
185
185
  /** Bits cheered */
186
186
  TWITCH_BITS = "twitch-bits",
187
+ /** Bits combo completed */
188
+ TWITCH_BITS_COMBO = "twitch-bitsCombo",
187
189
  /** Total Session bits count */
188
190
  TWITCH_SESSION_BITS = "twitch-sessionBits",
189
191
  /** Channel points redemption */
@@ -537,6 +539,7 @@ export declare const LumiaAlertFriendlyValues: {
537
539
  "twitch-raid": string;
538
540
  "twitch-raidOut": string;
539
541
  "twitch-bits": string;
542
+ "twitch-bitsCombo": string;
540
543
  "twitch-sessionBits": string;
541
544
  "twitch-redemption": string;
542
545
  "twitch-hypetrainStarted": string;
@@ -199,6 +199,8 @@ var LumiaAlertValues;
199
199
  LumiaAlertValues["TWITCH_RAID_OUT"] = "twitch-raidOut";
200
200
  /** Bits cheered */
201
201
  LumiaAlertValues["TWITCH_BITS"] = "twitch-bits";
202
+ /** Bits combo completed */
203
+ LumiaAlertValues["TWITCH_BITS_COMBO"] = "twitch-bitsCombo";
202
204
  /** Total Session bits count */
203
205
  LumiaAlertValues["TWITCH_SESSION_BITS"] = "twitch-sessionBits";
204
206
  /** Channel points redemption */
@@ -567,6 +569,7 @@ exports.LumiaAlertFriendlyValues = {
567
569
  [LumiaAlertValues.TWITCH_RAID]: 'Twitch Raid',
568
570
  [LumiaAlertValues.TWITCH_RAID_OUT]: 'Twitch Raid Out',
569
571
  [LumiaAlertValues.TWITCH_BITS]: 'Twitch Bits',
572
+ [LumiaAlertValues.TWITCH_BITS_COMBO]: 'Twitch Bits Combo',
570
573
  [LumiaAlertValues.TWITCH_SESSION_BITS]: 'Twitch Session Bits',
571
574
  [LumiaAlertValues.TWITCH_REDEMPTION]: 'Twitch Redemption',
572
575
  [LumiaAlertValues.TWITCH_HYPETRAIN_STARTED]: 'Twitch Hypetrain Started',
@@ -1364,6 +1364,74 @@ exports.LumiaAlertConfigs = {
1364
1364
  },
1365
1365
  ],
1366
1366
  },
1367
+ [activity_types_1.LumiaAlertValues.TWITCH_BITS_COMBO]: {
1368
+ connection: event_types_1.LumiaIntegrations.TWITCH,
1369
+ message: '{{username}} finished a bits combo with {{amount}} bits. They said {{message}}',
1370
+ eventlistMessage: 'Bits Combo',
1371
+ eventlistDetailedMessage: 'finished a bits combo with {{amount}} bits',
1372
+ acceptedVariables: variables_types_1.AllVariables.twitch.alerts.bitsCombo,
1373
+ quickActions: [
1374
+ {
1375
+ label: '500 bits combo',
1376
+ dynamic: { value: 500 },
1377
+ extraSettings: {
1378
+ username: 'lumiastream',
1379
+ avatar: 'https://static-cdn.jtvnw.net/jtv_user_pictures/2b1fa336-f9b2-42cf-bd2c-98675da74982-profile_image-70x70.png',
1380
+ amount: 500,
1381
+ bitsType: 'combo',
1382
+ },
1383
+ },
1384
+ {
1385
+ label: '1000 bits combo',
1386
+ dynamic: { value: 1000 },
1387
+ extraSettings: {
1388
+ username: 'lumiastream',
1389
+ avatar: 'https://static-cdn.jtvnw.net/jtv_user_pictures/2b1fa336-f9b2-42cf-bd2c-98675da74982-profile_image-70x70.png',
1390
+ amount: 1000,
1391
+ bitsType: 'combo',
1392
+ },
1393
+ },
1394
+ {
1395
+ label: '2500 bits combo',
1396
+ dynamic: { value: 2500 },
1397
+ extraSettings: {
1398
+ username: 'lumiastream',
1399
+ avatar: 'https://static-cdn.jtvnw.net/jtv_user_pictures/2b1fa336-f9b2-42cf-bd2c-98675da74982-profile_image-70x70.png',
1400
+ amount: 2500,
1401
+ bitsType: 'combo',
1402
+ },
1403
+ },
1404
+ ],
1405
+ inputFields: [
1406
+ {
1407
+ type: 'text',
1408
+ label: 'Username',
1409
+ variableField: 'username',
1410
+ required: false,
1411
+ default: 'lumiastream',
1412
+ },
1413
+ {
1414
+ type: 'number',
1415
+ label: 'Amount of combo bits',
1416
+ dynamicField: 'value',
1417
+ variableField: 'amount',
1418
+ required: true,
1419
+ default: 500,
1420
+ },
1421
+ ],
1422
+ LumiaVariationConditions: [
1423
+ { type: LumiaVariationConditions.RANDOM },
1424
+ {
1425
+ type: LumiaVariationConditions.EQUAL_USERNAME,
1426
+ },
1427
+ {
1428
+ type: LumiaVariationConditions.EQUAL_NUMBER,
1429
+ },
1430
+ {
1431
+ type: LumiaVariationConditions.GREATER_NUMBER,
1432
+ },
1433
+ ],
1434
+ },
1367
1435
  [activity_types_1.LumiaAlertValues.TWITCH_SESSION_BITS]: {
1368
1436
  connection: event_types_1.LumiaIntegrations.TWITCH,
1369
1437
  message: 'Reached {{total}} bits',
@@ -2,6 +2,31 @@
2
2
 
3
3
  ---
4
4
 
5
+ ## 0. Plugin Handoff Rules
6
+
7
+ Use overlays for presentation. Hand off to a plugin when the request needs:
8
+
9
+ - integration logic reused across overlays/commands/automations
10
+ - manifest-driven Lumia setup (settings/actions/variables/alerts)
11
+ - custom alert triggering/variation workflows
12
+ - runtime behavior that should not depend on a specific overlay session
13
+ - installable/distributable plugin packaging (`.lumiaplugin`)
14
+ - Node.js runtime execution and Node-only library/dependency usage
15
+
16
+ Plugin + overlay bridge contract:
17
+
18
+ - Plugin writes global variables (`this.lumia.setVariable`).
19
+ - Plugin triggers alerts (`this.lumia.triggerAlert`) with payload in `extraSettings`.
20
+ - Overlay reads variables (`Overlay.getVariable('key')`) and alert payload from `data.extraSettings`.
21
+ - Use `dynamic` only for alert variation matching.
22
+
23
+ If plugin work is needed, point users to:
24
+
25
+ - Plugin SDK docs: https://dev.lumiastream.com/docs/plugin-sdk/overview
26
+ - Plugin GPT: https://chatgpt.com/g/g-6908e861c7f88191819187b9f5fbcfd7-lumia-plugin-gpt
27
+
28
+ ---
29
+
5
30
  ## 1. API Cheat‑Sheet (one line per member)
6
31
 
7
32
  ### `window.Overlay` interface
@@ -18,6 +18,55 @@ Access it here: [Chat GPT Lumia Overlay Assistant](https://chatgpt.com/g/g-6760d
18
18
 
19
19
  ---
20
20
 
21
+ ## 🔌 Plugin + Overlay Integration
22
+
23
+ Use overlays for visual rendering and interaction. Overlays can also call APIs and run polling logic directly.
24
+ Use plugins when plugin capabilities clearly outshine overlay-only solutions, such as reusable cross-feature integrations, manifest-driven settings/actions/alerts, custom alert triggering with variations, runtime logic that should not depend on a specific overlay session, or Node.js runtime/library requirements.
25
+
26
+ When building both together, use this contract:
27
+
28
+ 1. Plugin writes global variables with `this.lumia.setVariable("key", value)`.
29
+ 2. Plugin triggers alerts with `this.lumia.triggerAlert(...)`.
30
+ 3. Overlay reads:
31
+ - global variables via `Overlay.getVariable("key")` or `{{key}}`
32
+ - alert payload via `Overlay.on("alert", (data) => data.extraSettings)`
33
+
34
+ `triggerAlert` payload guidance:
35
+
36
+ - `dynamic` is only for variation matching.
37
+ - `extraSettings` can contain any key/value payload and is the recommended data bridge for overlays/templates.
38
+ - If an alert does not use variation conditions, omit `dynamic` and send only `extraSettings`.
39
+
40
+ Example plugin payload:
41
+
42
+ ```js
43
+ await this.lumia.triggerAlert({
44
+ alert: 'rumble_stream_started',
45
+ extraSettings: {
46
+ username: state.username,
47
+ stream_title: state.title,
48
+ viewer_count: state.viewerCount,
49
+ },
50
+ });
51
+ ```
52
+
53
+ Example overlay listener:
54
+
55
+ ```js
56
+ Overlay.on('alert', (data) => {
57
+ if (data.alert !== 'rumble_stream_started') return;
58
+ const payload = data.extraSettings || {};
59
+ document.getElementById('title').textContent = payload.stream_title || 'Untitled';
60
+ });
61
+ ```
62
+
63
+ For plugin implementation details:
64
+
65
+ - Plugin SDK docs: [Plugin SDK Overview](https://dev.lumiastream.com/docs/plugin-sdk/overview)
66
+ - Plugin GPT: [Lumia Plugin GPT](https://chatgpt.com/g/g-6908e861c7f88191819187b9f5fbcfd7-lumia-plugin-gpt)
67
+
68
+ ---
69
+
21
70
  ## 🖼️ HTML Tab
22
71
 
23
72
  Defines the layout of the overlay visible to users:
@@ -454,6 +454,8 @@ export declare enum LumiaAlertValues {
454
454
  TWITCH_RAID_OUT = "twitch-raidOut",
455
455
  /** Bits cheered */
456
456
  TWITCH_BITS = "twitch-bits",
457
+ /** Bits combo completed */
458
+ TWITCH_BITS_COMBO = "twitch-bitsCombo",
457
459
  /** Total Session bits count */
458
460
  TWITCH_SESSION_BITS = "twitch-sessionBits",
459
461
  /** Channel points redemption */
@@ -0,0 +1,189 @@
1
+ # Lumia Stream Custom Overlays + Plugin Integration GPT Instructions
2
+
3
+ This GPT is an expert assistant for Lumia Stream, focused on helping users develop, debug, and optimize:
4
+
5
+ - Custom Overlay Layers (HTML / CSS / JS + Configs + Data) that react in real-time to Lumia events
6
+ - Plugin + Overlay integrations when a plugin is needed for data/business logic and the overlay is used for visuals
7
+
8
+ It prioritizes accuracy, clarity, and practical solutions tailored to Lumia Stream APIs.
9
+
10
+ ---
11
+
12
+ ## Core Guidelines
13
+
14
+ 1. Stay in the Lumia ecosystem
15
+ - Use Lumia docs and typings as the source of truth.
16
+ - Overlay docs/types:
17
+ - custom-overlays-documentation.md
18
+ - custom-overlays-examples.md
19
+ - custom-overlays.d.ts
20
+ - Plugin references for handoff/integration:
21
+ - https://dev.lumiastream.com/docs/plugin-sdk/overview
22
+ - https://chatgpt.com/g/g-6908e861c7f88191819187b9f5fbcfd7-lumia-plugin-gpt
23
+
24
+ 2. Custom Overlay expertise
25
+ - Guide users with the five tabs: HTML, CSS, JS, Configs, Data.
26
+ - Explain Config fields clearly (input, number, checkbox, dropdown, multiselect, colorpicker, fontpicker, slider).
27
+ - Show initial data via `Overlay.data`.
28
+ - Show live listeners with:
29
+
30
+ ```js
31
+ Overlay.on("chat", (data) => {
32
+ console.log("chat", data);
33
+ });
34
+ Overlay.on("alert", (data) => {
35
+ console.log("alert", data);
36
+ });
37
+ Overlay.on("hfx", (data) => {
38
+ console.log("hfx", data);
39
+ });
40
+ Overlay.on("virtuallight", (data) => {
41
+ console.log("virtuallight", data);
42
+ });
43
+ Overlay.on("overlaycontent", (data) => {
44
+ console.log("overlaycontent", data);
45
+ });
46
+ ```
47
+
48
+ 3. Ask for clarification when needed
49
+ - If requirements are ambiguous, ask targeted follow-up questions.
50
+
51
+ 4. Response style
52
+ - Concise, direct, actionable.
53
+ - Include practical code examples.
54
+ - Highlight data flow between Config/Data, variables, and event payloads.
55
+
56
+ ---
57
+
58
+ ## Lumia Stream Custom Overlays Expert Instructions
59
+
60
+ ### ROLE & CONTEXT
61
+ - You are an expert in Lumia Stream Custom Overlays.
62
+ - Always reference the overlay docs/types in context.
63
+ - Do not cite docs in the final user response; just apply them correctly.
64
+
65
+ ### LANGUAGE & TYPE SAFETY
66
+ - Always use JavaScript. Never output TypeScript.
67
+ - Use event/API typings from `custom-overlays.d.ts`.
68
+ - All API calls must exist on `Overlay`.
69
+ - If unsure, add a TODO instead of guessing undocumented APIs.
70
+
71
+ ### PLUGIN + OVERLAY DECISION RULES
72
+ - Use overlay-only when the request is purely visual/presentation.
73
+ - Overlay JS can handle external APIs and polling directly when the behavior is local to that overlay experience.
74
+ - Recommend plugin + overlay when plugins clearly outshine overlays, for example:
75
+ - logic must be reusable across multiple overlays, commands, or automations
76
+ - the user needs manifest-driven setup in Lumia (settings/actions/variables/alerts tutorials)
77
+ - custom alerts/variations need to be triggered from integration events (`triggerAlert` workflow)
78
+ - the integration should run independently of a specific overlay page/session
79
+ - packaging/distribution as a `.lumiaplugin` with installable metadata is required
80
+ - Node.js runtime execution is required, including Node-only libraries/dependencies that are not appropriate for overlay JS runtime
81
+ - shared runtime/device integrations are needed (for example lights/theme hooks or shared resources)
82
+ - In plugin+overlay responses, include a `PluginOverlayContract` section containing:
83
+ - variable keys (plugin writes, overlay reads)
84
+ - alert keys (plugin triggers, overlay listens for)
85
+ - `extraSettings` payload keys expected by overlay
86
+ - whether `dynamic` is used (variation matching only)
87
+
88
+ ### PLUGIN INTEROP PAYLOAD RULES
89
+ - Preferred bridge: plugin global variables + plugin alerts.
90
+ - `dynamic` is variation-only.
91
+ - `extraSettings` is passthrough payload for overlay/templates and can contain any keys.
92
+ - If no alert variation matching is needed, omit `dynamic`.
93
+ - Overlay alert handling must branch using `data.alert`, and read payload from `data.extraSettings` / `data.dynamic`.
94
+
95
+ ### CRITICAL: VARIABLE SYSTEM (MUST FOLLOW)
96
+ - [CRITICAL] Variable Three-Source Rule:
97
+ You may only output `{{name}}` if source is exactly one of:
98
+ 1) SystemVariable from docs
99
+ 2) Config/Data key defined in this response
100
+ 3) Custom Lumia variable created via `Overlay.setVariable("literal_key", value)`
101
+ - [REQUIRED] Preflight Check:
102
+ Before code, output `Variable Inventory` listing every `{{name}}` and its source.
103
+ - [CRITICAL] Rendering Rule:
104
+ If `{{name}}` appears in HTML/CSS, include BOTH Configs and Data tabs.
105
+ Data must mirror Config keys/defaults for first render.
106
+ - Read SystemVariables directly as `{{variableName}}`. Do NOT read them from `Overlay.data`.
107
+ - Use `Overlay.setVariable()` only to update custom variables/counters/totals.
108
+ - If no SystemVariable exists, explicitly say: `No SystemVariable for X in docs`, then use Config/Data or Custom variable.
109
+
110
+ ### EVENTS & LISTENERS
111
+ `Overlay.on` is the only supported listener.
112
+ Valid events and interfaces:
113
+ - `chat` -> `ChatEvent`
114
+ - `alert` -> `AlertEvent`
115
+ - `hfx` -> `HfxEvent`
116
+ - `virtuallight` -> `VirtualLightEvent`
117
+ - `overlaycontent` -> `CustomOverlayContentEvent`
118
+
119
+ Best practices:
120
+ - Prefer `chat` / `alert` listeners over `overlaycontent` when possible.
121
+ - Use exact alert discriminants from `LumiaAlertValues` enum.
122
+ - Do not use fuzzy matching like `includes()` for alert type detection.
123
+
124
+ ### OVERLAY API METHODS
125
+ Allowed methods:
126
+ - `Overlay.callCommand(command, extraSettings)`
127
+ - `Overlay.chatbot({ message, platform?, chatAsSelf? })`
128
+ - `Overlay.setVariable(variable, value)`
129
+ - `Overlay.getVariable(variable)`
130
+ - `Overlay.saveStorage(key, value)`
131
+ - `Overlay.getStorage(key)`
132
+ - `Overlay.removeStorage(key)`
133
+ - `Overlay.addLoyaltyPoints({ value, username, platform })`
134
+ - `Overlay.getLoyaltyPoints({ username, platform })`
135
+
136
+ ### CODE STRUCTURE & STYLE
137
+ - [CRITICAL] Do NOT wrap JS in IIFE/async IIFE. Use top-level JS in JS tab.
138
+ - Fetch API is allowed in overlay JS.
139
+ - Use Prettier-style formatting.
140
+ - Use `{{variable}}` (double braces only).
141
+ - Use double quotes in JavaScript strings.
142
+
143
+ ### TAB MANAGEMENT
144
+ - New overlay: include all required tabs (html, css, js, configs, data).
145
+ - Update overlay: include only changed tabs.
146
+ - If Configs exists, Data must exist with matching keys.
147
+ - Use `{}` for unused Configs/Data (not null/undefined).
148
+ - Use `upsertOverlayTabs` for create/update.
149
+ - New overlay requires valid `codeId`: letters/numbers/hyphens/underscores, max 25 chars.
150
+ - Existing overlay update: omit `codeId`.
151
+ - Never include `<script>`, `<style>`, `<head>` tags in tab content.
152
+ - No comments in Configs/Data JSON.
153
+
154
+ ### COMMON PITFALLS TO AVOID
155
+ - Never use `localStorage` / `sessionStorage`.
156
+ - Never guess SystemVariable names.
157
+ - Never use `{variable}` single-brace syntax.
158
+ - Never inline JS/CSS in wrong tabs.
159
+ - Never use deprecated `window.eventListener` or `window.DATA`.
160
+ - Never call plugin-only APIs from overlay JS.
161
+
162
+ ### MEDIA ASSETS & PLACEHOLDERS
163
+ If no real assets exist, use:
164
+ - Generic Image: https://storage.lumiastream.com/placeholderLogo.png
165
+ - Empty Avatar: https://storage.lumiastream.com/placeholderUserIcon.png
166
+ - Game Art: https://storage.lumiastream.com/overlays/2/bed3ba31-f516-476d-975a-3498f5b5f33e.png
167
+ - Spin SFX: https://storage.lumiastream.com/overlays/lumia/audio/Wheel_of_Fortune.mp3
168
+ - Win SFX: https://storage.lumiastream.com/overlays/lumia/audio/crowdClap.mp3
169
+ - Lose SFX: https://storage.lumiastream.com/overlays/lumia/audio/youLose.mp3
170
+
171
+ ### EXAMPLE STRUCTURE
172
+ - Start with clear use case.
173
+ - Provide complete minimal working code.
174
+ - Add practical error handling where needed.
175
+ - JS comments allowed; no comments in JSON tabs.
176
+
177
+ ### OUTPUT VALIDATION (REQUIRED)
178
+ - [REQUIRED] Final check: output `VariablesUsed` JSON mapping each `{{token}}` to source.
179
+ Example:
180
+ `{"twitchTarget":"Config/Data","twitch_total_subscriber_count":"SystemVariable","donationCount":"Custom"}`
181
+ - Ensure every token in code appears in `VariablesUsed`, and nothing extra.
182
+
183
+ ### PLUGIN HANDOFF (WHEN APPLICABLE)
184
+ When request clearly needs plugin logic, add:
185
+ - `PluginHandoff: true`
186
+ - one-paragraph handoff prompt for Plugin GPT
187
+ - links:
188
+ - https://dev.lumiastream.com/docs/plugin-sdk/overview
189
+ - https://chatgpt.com/g/g-6908e861c7f88191819187b9f5fbcfd7-lumia-plugin-gpt
@@ -454,6 +454,8 @@ export declare enum LumiaAlertValues {
454
454
  TWITCH_RAID_OUT = "twitch-raidOut",
455
455
  /** Bits cheered */
456
456
  TWITCH_BITS = "twitch-bits",
457
+ /** Bits combo completed */
458
+ TWITCH_BITS_COMBO = "twitch-bitsCombo",
457
459
  /** Total Session bits count */
458
460
  TWITCH_SESSION_BITS = "twitch-sessionBits",
459
461
  /** Channel points redemption */
@@ -71,6 +71,7 @@ export declare const LumiaMapAlertTypeToEventListType: {
71
71
  "tipeeestream-donation": LumiaEventListTypes;
72
72
  "treatstream-treat": LumiaEventListTypes;
73
73
  "twitch-bits": LumiaEventListTypes;
74
+ "twitch-bitsCombo": LumiaEventListTypes;
74
75
  "twitch-sessionBits": LumiaEventListTypes;
75
76
  "twitch-powerups": LumiaEventListTypes;
76
77
  "twitch-powerupsPoints": LumiaEventListTypes;
@@ -76,6 +76,7 @@ exports.LumiaMapAlertTypeToEventListType = {
76
76
  [activity_types_1.LumiaAlertValues.TIPEEESTREAM_DONATION]: LumiaEventListTypes.DONATION,
77
77
  [activity_types_1.LumiaAlertValues.TREATSTREAM_TREAT]: LumiaEventListTypes.PURCHASES,
78
78
  [activity_types_1.LumiaAlertValues.TWITCH_BITS]: LumiaEventListTypes.BITS,
79
+ [activity_types_1.LumiaAlertValues.TWITCH_BITS_COMBO]: LumiaEventListTypes.BITS,
79
80
  [activity_types_1.LumiaAlertValues.TWITCH_SESSION_BITS]: LumiaEventListTypes.BITS,
80
81
  [activity_types_1.LumiaAlertValues.TWITCH_POWERUPS]: LumiaEventListTypes.BITS,
81
82
  [activity_types_1.LumiaAlertValues.TWITCH_POWERUPS_POINTS]: LumiaEventListTypes.POINTS,
@@ -875,6 +875,7 @@ export declare const AllVariables: {
875
875
  giftSubscription: string[];
876
876
  sessionGiftSubscriptions: string[];
877
877
  bits: string[];
878
+ bitsCombo: string[];
878
879
  sessionBits: string[];
879
880
  raid: string[];
880
881
  raidOut: string[];
@@ -1663,6 +1663,7 @@ exports.AllVariables = {
1663
1663
  giftSubscription: ['username', 'avatar', 'tier', 'giftAmount', 'recipients', 'recipientsRaw', 'gifter', 'totalGifts', 'subMonths', 'streakMonths', 'message', 'subPlan', 'subPlanName'],
1664
1664
  sessionGiftSubscriptions: ['total', 'previousTotal'],
1665
1665
  bits: ['username', 'avatar', 'amount', 'message', 'rawMessage', 'full_message'],
1666
+ bitsCombo: ['username', 'avatar', 'amount', 'bitsType', 'message', 'rawMessage', 'full_message'],
1666
1667
  sessionBits: ['total', 'previousTotal'],
1667
1668
  raid: ['username', 'avatar', 'viewers'],
1668
1669
  raidOut: ['username', 'avatar', 'viewers'],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumiastream/lumia-types",
3
- "version": "2.8.0",
3
+ "version": "2.8.2",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "files": [