@zaflun/lumio-agent-skill 0.6.2 → 0.6.5

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,126 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@zaflun/lumio-agent-skill` are documented here.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## 0.6.5
9
+
10
+ ### Added
11
+
12
+ - **`CHANGELOG.md` in the package** — the npm tarball ships this changelog.
13
+ - **Shopify events** — `SKILL.md` lists `shopify:order`,
14
+ `shopify:order_paid` and `shopify:product` (65 event types in total) and
15
+ describes their payloads: the store in `shop { domain, label }`, order
16
+ totals and line items only as the store's settings allow, and
17
+ `customer_display` only with the buyer's consent, to be rendered as text,
18
+ never as HTML.
19
+ - **Which URLs the host loads** — `components.md` explains that `<Image>`,
20
+ `<img src>` and `<a href>` load only from an `https` host in
21
+ `egress.allowHosts`, a `data:image/*` URL, the Lumio page, the extension's
22
+ runtime origin, or a platform avatar or emote URL served by Lumio's image
23
+ proxy. Any other URL renders an empty placeholder, and `style` values with
24
+ `url()` are dropped.
25
+
26
+ ## 0.6.2
27
+
28
+ ### Changed
29
+
30
+ - **No `interactive` surface** — the skill files describe two surfaces,
31
+ editor and layer. Viewer input (votes, games) goes through chat commands
32
+ and channel point rewards handled by a bot module, which writes `ctx.db`
33
+ and calls `ctx.realtime.push`; the layer and editor receive it with
34
+ `useRealtime(topic, cb)`. The `interactive` template and target are gone
35
+ from the CLI and auth docs.
36
+ - **`useExtensionStorage(key, initialValue)`** — every example uses the
37
+ one-key-per-call signature instead of a whole-storage object with spread
38
+ updates.
39
+ - **Server functions** — they run in a V8 isolate on the Bot Module Worker
40
+ with a 5-second limit per call. `ctx.realtime.push` and `useRealtime` are
41
+ documented, `ctx.fetch` refuses every host in server functions, and
42
+ `secret()` works only in `action()` handlers. `lumio build` writes
43
+ `dist/functions.json` from `server/functions.ts`; declarative queries take
44
+ `orderBy`, `orderDir`, `limit` and `offset`.
45
+ - **`lumio env` replaces `lumio secrets`** — set, list and delete extension
46
+ secrets, with the key and value rules. Bot-module handlers read them with
47
+ `await ctx.secrets.get("KEY")`; server functions and automation nodes get
48
+ `null`.
49
+ - **Event list** — 62 event types: `twitch:gift_sub` is `twitch:gift`, and
50
+ `twitch:reward_status`, `twitch:reward_add`, `twitch:reward_update` and
51
+ `twitch:reward_remove` are added. `useLumioEvent()` examples show the typed
52
+ payload.
53
+ - **Developer limits link** — points to
54
+ `/dashboard/settings/developer/limits`.
55
+
56
+ ## 0.5.3
57
+
58
+ ### Added
59
+
60
+ - **Bundled sounds** — the `sounds` array in `lumio.config.json`, supported
61
+ formats and default limits.
62
+
63
+ ### Changed
64
+
65
+ - **Per-extension runtime origin** — the skill files describe the Extension
66
+ Runtime on `<label>.runtime.ext.lumio.vision` (one origin per extension)
67
+ and the Supervisor on `supervisor.ext.lumio.vision`.
68
+ - **Extension actions** — the action list matches what the Lumio API
69
+ dispatches: chat send and delete, the OBS scene, source and stream
70
+ actions, `events:emit` and `overlay:update_layer`, each with its own
71
+ permission. Example parameters use the snake_case payloads
72
+ (`scene_name`, `event_type`, `layer_id`, …).
73
+ - **Event list** — 58 event types, including Kick resubs, KICKs, rewards and
74
+ stream updates, Twitch end and lock events, `streamelements:tip` and
75
+ `chat:message`.
76
+ - **`lumio build`** — documents the JS bundles, the bot-module server bundle,
77
+ Tailwind compilation and the pre-flight checks before upload.
78
+
79
+ ## 0.5.0
80
+
81
+ ### Added
82
+
83
+ - **Automation nodes** — `defineAutomationAction`, `defineAutomationTrigger`
84
+ and `defineAutomationLogic` handlers, the `lumio init` automation templates
85
+ and the `lumio dev` automation simulator.
86
+ - **Editor and picker components** — the 14 `Editor*` components with
87
+ `useEditorAction`, and `IconPicker`, `IconDisplay` and `useIconPicker`.
88
+ - **Config schema field types** — the extended field types, `visible_when`,
89
+ groups, and `designer_schema` for the full-page designer.
90
+
91
+ ## 0.4.0
92
+
93
+ ### Added
94
+
95
+ - **Bot modules** — the `command`, `keyword`, `pattern`, `event`, `timer`
96
+ and `moderate` handlers, their return actions and permissions, the handler
97
+ context (`ctx.user`, `ctx.cache`, `ctx.defer()`), and best practices for
98
+ rate limits, moderation escalation, overridable triggers and exempt roles.
99
+
100
+ ### Changed
101
+
102
+ - **OBS wording** — the layer is described as running in a Browser Source,
103
+ not specifically OBS.
104
+
105
+ ## 0.2.0
106
+
107
+ ### Changed
108
+
109
+ - **`config_schema` is an array** of fields with `default_value` and
110
+ `required` in every example, and the config example uses the
111
+ `https://lumio.vision/schemas/lumio.config.schema.json` schema URL.
112
+ - **`useLumioAction(action)`** — examples drop the second argument; the
113
+ action list adds `chat:delete` and the OBS source and stream actions.
114
+ - **`instance` storage scope** — filtered by install as well as account and
115
+ overlay.
116
+
117
+ ## 0.1.0
118
+
119
+ ### Added
120
+
121
+ - **Initial release** — `npx lumio-skills add` writes eight skill files to
122
+ `.lumio/skills/` (`SKILL.md`, components, server functions, CLI workflows,
123
+ auth, runtime scopes, best practices, troubleshooting) and pointer files
124
+ for AI assistants (`AGENTS.md`, `GEMINI.md`, `.windsurfrules`,
125
+ `.github/copilot-instructions.md`). `installSkillFiles`, `SKILL_FILES` and
126
+ `ROOT_FILES` are exported for programmatic use.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  installSkillFiles
4
- } from "../chunk-XJZ7H56F.js";
4
+ } from "../chunk-LKWF2Y7K.js";
5
5
 
6
6
  // src/bin/lumio-skills.ts
7
7
  import { resolve } from "path";
@@ -373,13 +373,13 @@ return <Text content={text} />;
373
373
 
374
374
  ### Live events
375
375
  \`\`\`tsx
376
- // eventType is LumioEventType \u2014 autocomplete shows all 62 valid event strings
376
+ // eventType is LumioEventType \u2014 autocomplete shows all 65 valid event strings
377
377
  const event = useLumioEvent("twitch:cheer");
378
378
  // event updates automatically when a new cheer arrives; it is typed
379
379
  // LumioEventPayloadMap["twitch:cheer"] | null, so event?.bits is a number
380
380
  \`\`\`
381
381
 
382
- **All 62 event types** (\`LumioEventType\`):
382
+ **All 65 event types** (\`LumioEventType\`):
383
383
 
384
384
  Twitch (27): \`twitch:follower\`, \`twitch:subscribe\`, \`twitch:gift\`, \`twitch:resub\`, \`twitch:cheer\`, \`twitch:raid\`, \`twitch:reward\`, \`twitch:reward_status\`, \`twitch:reward_add\`, \`twitch:reward_update\`, \`twitch:reward_remove\`, \`twitch:hype_train\`, \`twitch:hype_train_end\`, \`twitch:poll\`, \`twitch:poll_end\`, \`twitch:prediction\`, \`twitch:prediction_lock\`, \`twitch:prediction_end\`, \`twitch:goal\`, \`twitch:goal_end\`, \`twitch:ad_break\`, \`twitch:ban\`, \`twitch:unban\`, \`twitch:stream_online\`, \`twitch:stream_offline\`, \`twitch:stream_update\`, \`twitch:chat\`
385
385
 
@@ -391,9 +391,11 @@ Spotify (12): \`spotify:track\`, \`spotify:play\`, \`spotify:pause\`, \`spotify:
391
391
 
392
392
  StreamElements (1): \`streamelements:tip\`
393
393
 
394
+ Shopify (3): \`shopify:order\`, \`shopify:order_paid\`, \`shopify:product\`
395
+
394
396
  Cross-platform chat (1, fires for every platform): \`chat:message\`
395
397
 
396
- Kick events carry canonical top-level fields (\`user_id\`, \`user_login\`, \`user_name\`, \`avatarUrl\`, \`is_anonymous\`) plus the original Kick payload. \`kick:kicks\` has \`kicks\` (amount, like Twitch \`bits\`) and \`message\`; \`kick:reward\` / \`kick:reward_status\` have \`status\`, \`user_input\` and \`reward { id, title, cost, prompt }\`; \`kick:resub\` has \`cumulative_months\`. \`twitch:reward_status\` has the \`twitch:reward\` shape with \`status\` \`fulfilled\` / \`canceled\`. \`twitch:reward_add\` / \`_update\` / \`_remove\` carry the Twitch reward (\`id\`, \`title\`, \`cost\`, \`prompt\`, \`is_enabled\`, \`is_paused\`, \u2026); these three arrive live only (\`broadcast_only\`), never from the event history.
398
+ Kick events carry canonical top-level fields (\`user_id\`, \`user_login\`, \`user_name\`, \`avatarUrl\`, \`is_anonymous\`) plus the original Kick payload. \`kick:kicks\` has \`kicks\` (amount, like Twitch \`bits\`) and \`message\`; \`kick:reward\` / \`kick:reward_status\` have \`status\`, \`user_input\` and \`reward { id, title, cost, prompt }\`; \`kick:resub\` has \`cumulative_months\`. \`twitch:reward_status\` has the \`twitch:reward\` shape with \`status\` \`fulfilled\` / \`canceled\`. \`twitch:reward_add\` / \`_update\` / \`_remove\` carry the Twitch reward (\`id\`, \`title\`, \`cost\`, \`prompt\`, \`is_enabled\`, \`is_paused\`, \u2026); these three arrive live only (\`broadcast_only\`), never from the event history. Every \`shopify:*\` event names its store in \`shop { domain, label }\` (absent on events stored before stores carried it). \`shopify:order\` / \`shopify:order_paid\` carry \`order_number\`, \`name\`, \`financial_status\`, \`line_items\` and \`total_price\` / \`currency\` only as the store's settings allow, and \`customer_display\` only with the buyer's consent \u2014 untrusted buyer text, render it with \`<Text>\`, never as HTML. \`shopify:product\` has \`title\`, \`vendor\`, \`product_type\`, \`handle\`, \`image_url\`.
397
399
 
398
400
  ### Server queries
399
401
  \`\`\`tsx
@@ -622,6 +624,8 @@ import { Image } from "@zaflun/lumio-sdk";
622
624
  - \`height?: number | string\`
623
625
  - \`style?: VisionStyle\`
624
626
 
627
+ The host loads \`src\` only from an \`https\` host listed in \`egress.allowHosts\` (default port), a \`data:image/*\` URL, the Lumio page itself, the extension's runtime origin, or a Twitch/7TV/BTTV/FFZ/YouTube/Discord/Kick avatar or emote URL that Lumio's image proxy serves. Any other URL renders an empty placeholder. The same applies to \`<img src>\` and \`<a href>\`; \`style\` values with \`url()\` are dropped.
628
+
625
629
  ## Input Components
626
630
 
627
631
  **Important:** On the layer surface, all input components become read-only. Buttons are hidden, toggles show "On"/"Off" text, dropdowns show the selected value.
package/dist/index.d.ts CHANGED
@@ -13,4 +13,5 @@ declare const ROOT_FILES: SkillFile[];
13
13
  */
14
14
  declare function installSkillFiles(targetDir: string): void;
15
15
 
16
- export { ROOT_FILES, SKILL_FILES, type SkillFile, installSkillFiles };
16
+ export { ROOT_FILES, SKILL_FILES, installSkillFiles };
17
+ export type { SkillFile };
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  ROOT_FILES,
3
3
  SKILL_FILES,
4
4
  installSkillFiles
5
- } from "./chunk-XJZ7H56F.js";
5
+ } from "./chunk-LKWF2Y7K.js";
6
6
  export {
7
7
  ROOT_FILES,
8
8
  SKILL_FILES,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaflun/lumio-agent-skill",
3
- "version": "0.6.2",
3
+ "version": "0.6.5",
4
4
  "description": "AI agent skill files for building Lumio Extensions",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,7 +9,8 @@
9
9
  "lumio-skills": "dist/bin/lumio-skills.js"
10
10
  },
11
11
  "files": [
12
- "dist"
12
+ "dist",
13
+ "CHANGELOG.md"
13
14
  ],
14
15
  "keywords": [
15
16
  "lumio",
@@ -28,9 +29,9 @@
28
29
  "license": "MIT",
29
30
  "devDependencies": {
30
31
  "@types/node": "^26.1.2",
31
- "tsup": "^8.4.0",
32
+ "tsup": "^9.0.0",
32
33
  "typescript": "^6.0.3",
33
- "vitest": "^4.1.10"
34
+ "vitest": "^5.0.5"
34
35
  },
35
36
  "repository": {
36
37
  "type": "git",