@stage5/lumine 0.2.35 → 0.2.36

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/admin.js CHANGED
@@ -401,6 +401,17 @@ export function parseAdminOperation(options) {
401
401
  }
402
402
 
403
403
  if (namespace === "ai-bucket" || namespace === "ai-buckets") {
404
+ if (action === "create") {
405
+ return writeOperation(
406
+ "ai-bucket.create",
407
+ "POST",
408
+ "/cli/admin/ai-buckets",
409
+ {
410
+ label: parseAiBucketLabel(options.adminLabel),
411
+ note: parseAiBucketNote(options.note),
412
+ },
413
+ );
414
+ }
404
415
  const bucketId = parseRequiredInteger(
405
416
  options.adminBucketId,
406
417
  "AI bucket ID",
@@ -424,22 +435,11 @@ export function parseAdminOperation(options) {
424
435
  );
425
436
  }
426
437
  if (action === "note" && target === "set") {
427
- const note = String(options.note || "").trim();
428
- if (!note) {
429
- throw cliValidationError(
430
- "Pass the quota-only context with --note <text>.",
431
- );
432
- }
433
- if (note.length > 255) {
434
- throw cliValidationError(
435
- "An AI bucket note can be at most 255 characters.",
436
- );
437
- }
438
438
  return writeOperation(
439
439
  "ai-bucket.note.set",
440
440
  "PUT",
441
441
  `/cli/admin/ai-buckets/${bucketId}/note`,
442
- { note },
442
+ { note: parseAiBucketNote(options.note) },
443
443
  );
444
444
  }
445
445
  }
@@ -1181,6 +1181,32 @@ function parseOrderedIds(value) {
1181
1181
  return ids;
1182
1182
  }
1183
1183
 
1184
+ function parseAiBucketLabel(value) {
1185
+ const label = String(value || "").trim();
1186
+ if (!label) {
1187
+ throw cliValidationError("Pass the bucket name with --label <name>.");
1188
+ }
1189
+ if (label.length > 120) {
1190
+ throw cliValidationError("An AI bucket name can be at most 120 characters.");
1191
+ }
1192
+ return label;
1193
+ }
1194
+
1195
+ function parseAiBucketNote(value) {
1196
+ const note = String(value || "").trim();
1197
+ if (!note) {
1198
+ throw cliValidationError(
1199
+ "Pass the quota-only context with --note <text>.",
1200
+ );
1201
+ }
1202
+ if (note.length > 255) {
1203
+ throw cliValidationError(
1204
+ "An AI bucket note can be at most 255 characters.",
1205
+ );
1206
+ }
1207
+ return note;
1208
+ }
1209
+
1184
1210
  function parseAiBucketUserIds(value) {
1185
1211
  const raw = String(value || "").trim();
1186
1212
  if (!raw) {
package/lib/commands.js CHANGED
@@ -2173,6 +2173,7 @@ export function parseArgs(args) {
2173
2173
  ? String(raw.ids)
2174
2174
  : "",
2175
2175
  adminBucketId: raw.bucketId ? String(raw.bucketId) : "",
2176
+ adminLabel: raw.label ? String(raw.label) : "",
2176
2177
  adminUserIds: raw.userIds ? String(raw.userIds) : "",
2177
2178
  adminType: raw.type ? String(raw.type) : "",
2178
2179
  adminKind: raw.kind ? String(raw.kind) : "",
@@ -2513,6 +2514,7 @@ export function printHelp() {
2513
2514
  lumine thumbnail generate ["<prompt>"] --model <gpt-image-2|nano-banana>
2514
2515
  lumine doctor runtime-assets
2515
2516
  lumine admin identity list|status|use <zero|ciel|auto> [--json]
2517
+ lumine admin ai-bucket create --label <name> --note <text> [--json]
2516
2518
  lumine admin ai-bucket get --bucket-id <id> [--json]
2517
2519
  lumine admin ai-bucket accounts add --bucket-id <id> --user-ids <id,id,...> [--note <text>] [--json]
2518
2520
  lumine admin ai-bucket note set --bucket-id <id> --note <text> [--json]
@@ -2616,6 +2618,7 @@ Options:
2616
2618
  --level <1|2|3> Admin subject effort level
2617
2619
  --subject-ids <ids> Complete ordered Featured subject IDs
2618
2620
  --bucket-id <id> Unbanned AI identity bucket for account consolidation
2621
+ --label <name> Name for a new unbanned AI identity bucket
2619
2622
  --user-ids <ids> Explicit user IDs for an AI bucket batch (up to 500)
2620
2623
  --type <type> Admin target: subject, comment, build, aiStory, or dailyReflection
2621
2624
  --kind recommend Admin recommendation queue kind
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stage5/lumine",
3
- "version": "0.2.35",
3
+ "version": "0.2.36",
4
4
  "description": "Command line tools for launching Lumine builds on Twinkle.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Version: 1.32.0
4
4
  Updated: 2026-08-02
5
- Generated: 2026-08-11T04:29:29.082Z
5
+ Generated: 2026-08-13T00:13:49.827Z
6
6
 
7
7
  ## Notes
8
8
  - This SDK is injected into Build iframes via the Build preview/runtime.
@@ -287,7 +287,7 @@ console.log(analysis.bestMove, analysis.evaluation, analysis.mate);
287
287
  - Returns: { text, response, model, webSearch, aiUsagePolicy }
288
288
  - Generate text with the default Lumine text model, optionally using live web search and streaming text updates through onText.
289
289
  - Signed-in viewers only.
290
- - Uses Grok 4.5 by default.
290
+ - Uses Grok 4.6 by default.
291
291
  - Each successful text generation consumes AI Energy from the signed-in viewer.
292
292
  - history must be an array of { role: 'user' | 'assistant', content: string }. Twinkle.ai.chat does not read a text field.
293
293
  - The server keeps the latest 12 valid history entries.
@@ -307,7 +307,7 @@ const result = await Twinkle.ai.chat({ message, history: chatHistory, systemProm
307
307
  - expectedStructure must be a JSON object that describes the exact returned object shape.
308
308
  - mode is accepted as an alias for thinkingMode, and mid is accepted as an alias for medium.
309
309
  - thinkingMode low uses GPT-5.6 Luna and consumes the viewer's AI Energy from confirmed provider usage; its smaller model is usually cheaper than Medium or High.
310
- - thinkingMode medium uses Grok 4.5 with medium reasoning and consumes normal AI Energy.
310
+ - thinkingMode medium uses Grok 4.6 with medium reasoning and consumes normal AI Energy.
311
311
  - thinkingMode high uses GPT-5.6 Sol with high reasoning and consumes high AI Energy.
312
312
  - When AI Energy is empty, Low, Medium, and High all reject before new provider work; there is no free fallback mode.
313
313
  - Live web search is enabled by default in Medium and High modes. Pass webSearch: false to disable it for the app. Low/Lite Mode remains tool-free; explicitly forcing webSearch: true in Low Mode returns an error.
@@ -353,7 +353,7 @@ const result = await Twinkle.ai.chat({ message, history: chatHistory, systemProm
353
353
  - Pass onText/onStatus for streaming dialogue. Omit callbacks for non-streaming dialogue where the promise resolves with the final response.
354
354
  - Inside Build character chat, thinkingMode low uses Lite Mode: Zero and Ciel both use GPT-5.6 Luna with reasoning disabled; confirmed provider usage consumes the viewer's AI Energy and is usually cheaper than High.
355
355
  - Inside Build character chat, thinkingMode medium uses the same normal chat model routing: Zero and Ciel both use GPT-5.6 Luna with reasoning disabled and normal AI Energy.
356
- - Inside Build character chat, thinkingMode high uses Think Hard chat routing and high AI Energy: Zero uses Grok 4.5 with high reasoning and Ciel uses GPT-5.6 Terra with high reasoning.
356
+ - Inside Build character chat, thinkingMode high uses Think Hard chat routing and high AI Energy: Zero uses Grok 4.6 with high reasoning and Ciel uses GPT-5.6 Terra with high reasoning.
357
357
  - When AI Energy is empty, Low, Medium, and High all reject before new provider work; there is no free fallback mode.
358
358
  - Pass roomContext as a short shared scene transcript so Zero and Ciel can know what happened in the same room.
359
359
  - includeWebsiteContext defaults to true. Set includeWebsiteContext: false for in-world NPC dialogue that should only use Zero/Ciel's basic character identity plus your scene/instructions.
@@ -55,6 +55,8 @@ AI identity buckets are private operator bookkeeping, not a Zero/Ciel public
55
55
  action. They therefore do not require or attach to a delegated daily run:
56
56
 
57
57
  ```bash
58
+ lumine admin ai-bucket create --label Lemon \
59
+ --note "Quota accounting only; not a moderation flag." --json
58
60
  lumine admin ai-bucket get --bucket-id 10 --json
59
61
  lumine admin ai-bucket accounts add --bucket-id 10 \
60
62
  --user-ids 3127,13037,15410,16288 \
@@ -63,6 +65,13 @@ lumine admin ai-bucket note set --bucket-id 10 \
63
65
  --note "Quota accounting only; not a moderation flag." --json
64
66
  ```
65
67
 
68
+ `create` inserts a new unbanned quota bucket through the same helper the
69
+ management page uses. `--label` is required (at most 120 characters). `--note`
70
+ is required and follows the same 255-character quota-context rule as
71
+ `note set`. It cannot create a banned bucket, copy an existing one, or infer
72
+ members. The response returns the canonical bucket, including its id for
73
+ later `get` / `accounts add` / `note set` calls.
74
+
66
75
  `accounts add` accepts 1-500 unique positive user IDs, preflights the complete
67
76
  batch before writing, adds the canonical user and durable verified-email rules,
68
77
  re-attributes current-day AI usage, and returns the canonical bucket members.
@@ -73,11 +82,12 @@ Lumine audit log; no public bot identity is involved.
73
82
  canonical bucket. Use it to distinguish quota bookkeeping from moderation;
74
83
  the note itself changes no access, ban, or identity rules.
75
84
 
76
- This surface intentionally accepts only an existing **unbanned** bucket. It
77
- cannot ban accounts, block signup, add IP/device/risk-key rules, or infer an
78
- account family. Identification remains a human/LLM evidence judgment and must
79
- be explicitly requested by Mikey; routine administrator runs still escalate
80
- suspected alternate accounts and never auto-enforce.
85
+ This surface is quota bookkeeping only. It cannot ban accounts, block signup,
86
+ add IP/device/risk-key rules, or infer an account family. Identification
87
+ remains a human/LLM evidence judgment and must be explicitly requested by
88
+ Mikey; routine administrator runs still escalate suspected alternate accounts
89
+ and never auto-enforce. `accounts add` and `note set` still accept only an
90
+ existing **unbanned** bucket.
81
91
 
82
92
  ## Editorial priorities
83
93