@stage5/lumine 0.2.86 → 0.2.87

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/lib/sdk.js CHANGED
@@ -22,6 +22,12 @@ export const SDK_CLI_METHODS = {
22
22
  "aiCards.get": { path: "api/content/ai-card", scopes: ["content:read"] },
23
23
  "grammarbles.listQuestions": { path: "api/content/grammarbles/questions", scopes: ["content:read"] },
24
24
  "grammarbles.getMyQuestionHistory": { path: "api/content/grammarbles/history", scopes: ["content:read"] },
25
+ "minecraft.getWorlds": { path: "api/minecraft/worlds", scopes: ["content:read"] },
26
+ "minecraft.getOnlinePlayers": { path: "api/minecraft/players", scopes: ["content:read"] },
27
+ "minecraft.getZero": { path: "api/minecraft/zero", scopes: ["content:read"] },
28
+ "minecraft.getZeroBuilds": { path: "api/minecraft/zero/builds", scopes: ["content:read"] },
29
+ "minecraft.getPeople": { path: "api/minecraft/people", scopes: ["content:read"] },
30
+ "minecraft.setPlayerRole": { path: "api/minecraft/people/role", scopes: ["content:write"], write: true },
25
31
  "subjects.getMySubjects": { path: "api/content/my-subjects", scopes: ["content:read"] },
26
32
  "subjects.search": { path: "api/content/subjects/search", scopes: ["content:read"] },
27
33
  "subjects.getSubject": { path: "api/content/subject", scopes: ["content:read"] },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stage5/lumine",
3
- "version": "0.2.86",
3
+ "version": "0.2.87",
4
4
  "description": "Command line tools for launching Lumine builds on Twinkle.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,8 +1,8 @@
1
1
  # Build SDK Index
2
2
 
3
- Version: 1.47.0
4
- Updated: 2026-09-21
5
- Generated: 2026-09-23T02:44:06.901Z
3
+ Version: 1.49.0
4
+ Updated: 2026-09-23
5
+ Generated: 2026-09-23T16:01:40.924Z
6
6
 
7
7
  ## Notes
8
8
  - This SDK is injected into Build iframes via the Build preview/runtime.
@@ -761,6 +761,47 @@ const result = await Twinkle.characters.chat({ character: 'zero', thinkingMode:
761
761
  - A quiet edition with no editorial events does not call an AI provider and does not consume AI Energy.
762
762
  - A failed attempt may be queued again on the same day. A ready edition is immutable for ordinary viewers.
763
763
 
764
+ ### Twinkle.minecraft
765
+ - async getWorlds() | scopes: content:read
766
+ - Returns: { worlds: [{ id, name, dimension, spawn: { x, z } | null, map: { tileUrlTemplate, minZoom, maxZoom, tilePixels, blocksPerTileAtMaxZoom, renderedAt } | null }], stale }
767
+ - List the server's worlds (world, world1, world2, world_nether, world_the_end) with squaremap tile info for drawing a top-down map.
768
+ - Tiles are 512x512 PNGs over HTTPS from www.twinklemc.site. At maxZoom one pixel is one block; blocksPerTile = blocksPerTileAtMaxZoom * 2 ** (maxZoom - z); tile x/y = floor(block x/z / blocksPerTile). Fill {z}, {x}, {y}. map.renderedAt tells how fresh the tiles are.
769
+ - Limited rollout: apps not enabled yet get 403 with code minecraft_sdk_not_enabled.
770
+ - stale: true means the Minecraft server was briefly unreachable and the data is a recent cached copy.
771
+ - Example: const { worlds } = await Twinkle.minecraft.getWorlds(); const w = worlds.find((x) => x.id === 'world'); const z = w.map.maxZoom; const blocksPerTile = w.map.blocksPerTileAtMaxZoom * 2 ** (w.map.maxZoom - z); const tx = Math.floor(blockX / blocksPerTile), ty = Math.floor(blockZ / blocksPerTile); const url = w.map.tileUrlTemplate.replace('{z}', z).replace('{x}', tx).replace('{y}', ty);
772
+ - async getOnlinePlayers() | scopes: content:read
773
+ - Returns: { players: [{ name, world, x, y, z, isZero }], count, stale }
774
+ - List players currently online with their world and block coordinates. Zero appears with isZero: true and is not counted in count.
775
+ - Cached for about 5 seconds; poll no faster than every 5 seconds.
776
+ - Names are Minecraft usernames, not Twinkle usernames.
777
+ - Example: const { players, count } = await Twinkle.minecraft.getOnlinePlayers();
778
+ - async getZero() | scopes: content:read
779
+ - Returns: { zero: { online, world, position: { x, y, z } | null, activity: 'idle'|'thinking'|'building'|'workshop', currentBuild: { id, title, status, placed, total, requester, world, bounds } | null, queue: [build], workshop: { world, min, max } | null, updatedAt }, stale }
780
+ - Where Zero is and what he is doing right now, including the build in progress and its progress.
781
+ - Cached for about 3 seconds.
782
+ - bounds are { min: [x, y, z], max: [x, y, z] } in world block coordinates.
783
+ - Example: const { zero } = await Twinkle.minecraft.getZero(); if (zero.currentBuild) console.log(zero.currentBuild.title, zero.currentBuild.placed + '/' + zero.currentBuild.total);
784
+ - async getZeroBuilds({ limit, kind } = {}) | scopes: content:read
785
+ - Returns: { builds: [{ id, kind: 'helper'|'workshop', title, status, placed, total, requester, world, bounds, createdAt }], stale }
786
+ - Zero's recent builds, newest first: builds for players (helper) and his own workshop projects (workshop).
787
+ - limit is 1-50 (default 10). kind filters to helper or workshop builds.
788
+ - Example: const { builds } = await Twinkle.minecraft.getZeroBuilds({ limit: 10, kind: 'workshop' });
789
+ - async getPeople() | scopes: content:read
790
+ - Returns: { canManage, people: [{ uuid, name, role: 'visitor'|'member'|'builder'|'moderator', groups, op, online, banned, protected, firstSeenAt, lastSeenAt, isZero }], roles }
791
+ - Everyone who has joined the server with their in-game role, for the server owner's role management screen.
792
+ - Only the server owner, in an app they own, gets the list; everyone else gets { canManage: false, people: [] } without an error, so hide the feature when canManage is false.
793
+ - Roles: visitor (play and chat), member (/tpa, /home, /back, may ask Zero to build), builder (member + /fly and creative/survival), moderator (builder + teleport others, CoreProtect rollback, /kick). op: true players are server operators and have every power regardless of role.
794
+ - protected: true players (the owner and Zero's account) can't be changed from the app. Sorted online first, then most recently seen.
795
+ - Not cached; call on screen open or after a change, not on a timer.
796
+ - Example: const { canManage, people } = await Twinkle.minecraft.getPeople(); if (!canManage) hidePeopleTab();
797
+ - async setPlayerRole({ uuid, role }) | scopes: content:write
798
+ - Returns: { player: { uuid, name, role, op } }
799
+ - Change a player's in-game role; it applies immediately, even while they are online.
800
+ - Server owner only, in an app they own; others get 403 with code minecraft_roles_forbidden.
801
+ - role is visitor, member, builder or moderator. 400 codes: minecraft_bad_uuid, minecraft_bad_role, minecraft_protected_player, minecraft_unknown_player. 503 minecraft_unavailable while the server restarts.
802
+ - Every change is logged on the server and emailed to the owner; the player is told in game.
803
+ - Example: await Twinkle.minecraft.setPlayerRole({ uuid: person.uuid, role: 'builder' });
804
+
764
805
  ### Twinkle.leaderboards
765
806
  - async get({ boardKey = 'default', limit, cursor } = {}) | scopes: none
766
807
  - Returns: { entries: [{ rank, id, buildId, boardKey, viewerKind, userId, displayName, score, meta, achievedAt, createdAt, updatedAt }], scores, cursor, hasMore, personalBest: { id, buildId, boardKey, viewerKind, userId, displayName, score, meta, achievedAt, createdAt, updatedAt } | null }
@@ -3008,7 +3008,10 @@ disagreements and the `jev_reply_gate_audit`, `jev_chat_routing_audit` and
3008
3008
  missing evidence. Report fallback rates and reasons instead. Auto rows served
3009
3009
  without a comparison carry `baselineStatus: not_run`; its fallback LLM spend is
3010
3010
  `lumine_model_fallback`. The eight comparison-only routing families below are
3011
- unchanged. The rest of this section describes the pre-September-23 pilot.
3011
+ unchanged. Chat routing is also off since September 23
3012
+ (`JEV_CHAT_ROUTING_ENABLED`, default off; Jev served ~1% of chats and could not
3013
+ judge when a reply needs older history), so zero chat serving rows is expected.
3014
+ The rest of this section describes the pre-September-23 pilot.
3012
3015
 
3013
3016
  Read `data.jevPilot` from `lumine admin brief --json` and carry it into
3014
3017
  the full report for Mikey. The active `daily-run report --json` also includes