@homie-rocks/studio 0.21.0 → 0.23.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +68 -1
  2. package/README.md +92 -0
  3. package/assets/assets.ts +500 -0
  4. package/assets/render-page.ts +629 -0
  5. package/assets/safety.mjs +194 -0
  6. package/bin/homie-studio.mjs +81 -2
  7. package/chat/CHAT.md +101 -0
  8. package/chat/OWNERS.md +78 -0
  9. package/lib/art-cli.mjs +296 -0
  10. package/lib/art-tools.mjs +331 -0
  11. package/lib/asset-check.mjs +189 -0
  12. package/lib/asset-import.mjs +136 -0
  13. package/lib/asset-manifest.mjs +318 -0
  14. package/lib/build.mjs +32 -2
  15. package/lib/chat-cli.mjs +89 -0
  16. package/lib/cloudflare.mjs +5 -2
  17. package/lib/codex.mjs +43 -1
  18. package/lib/colour.mjs +160 -0
  19. package/lib/decisions.mjs +800 -0
  20. package/lib/directory.mjs +9 -1
  21. package/lib/library.mjs +169 -0
  22. package/lib/mcp-tools.mjs +22 -4
  23. package/lib/mcp.mjs +6 -3
  24. package/lib/optimise.mjs +380 -0
  25. package/lib/remix-assets.mjs +84 -0
  26. package/lib/render3d.mjs +81 -0
  27. package/lib/scaffold.mjs +39 -2
  28. package/lib/site.mjs +6 -1
  29. package/lib/studio.mjs +136 -9
  30. package/lib/style-board.mjs +227 -0
  31. package/lib/style-presets.mjs +121 -0
  32. package/lib/template-history.json +76 -0
  33. package/mcp/ui/card.css +15 -0
  34. package/mcp/ui/cast.js +62 -0
  35. package/mcp/ui/decision.js +61 -0
  36. package/mcp/ui/lineup.js +68 -0
  37. package/mcp/ui/rights.js +30 -0
  38. package/mcp/ui/style.js +154 -0
  39. package/netplay/NETPLAY.md +191 -3
  40. package/netplay/netplay.ts +150 -3
  41. package/package.json +15 -2
  42. package/port/index.ts +3 -2
  43. package/port/view.ts +238 -0
  44. package/site/SITE.md +11 -1
  45. package/starters/ember-vale/src/main.ts +22 -2
  46. package/starters/gem-rush/src/main.ts +21 -1
  47. package/starters/gem-rush-3d/assets/RIGHTS.md +203 -0
  48. package/starters/gem-rush-3d/assets/manifest.json +2318 -0
  49. package/starters/gem-rush-3d/credits.json +31 -0
  50. package/starters/gem-rush-3d/game.json +11 -0
  51. package/starters/gem-rush-3d/index.html +20 -0
  52. package/starters/gem-rush-3d/lab.json +19 -0
  53. package/starters/gem-rush-3d/src/main.ts +2107 -0
  54. package/starters/gem-rush-3d/style.json +66 -0
  55. package/starters/gem-rush-3d/tunables.json +13 -0
  56. package/worker/agents.mjs +3 -3
  57. package/worker/chat-page.mjs +556 -0
  58. package/worker/chat-store.mjs +161 -0
  59. package/worker/chat-words.mjs +46 -0
  60. package/worker/chat.mjs +419 -0
  61. package/worker/index.mjs +153 -8
  62. package/worker/office-page.mjs +115 -0
  63. package/worker/office.mjs +137 -6
  64. package/worker/pages.mjs +32 -9
  65. package/worker/qr.mjs +11 -0
  66. package/worker/room.mjs +288 -10
  67. package/worker/servers.mjs +5 -1
  68. package/worker/site.mjs +9 -4
  69. package/worker/stats.mjs +4 -1
  70. package/worker/version.mjs +1 -1
@@ -0,0 +1,66 @@
1
+ {
2
+ "v": 1,
3
+ "palette": {
4
+ "bg": "#cfe8f5",
5
+ "ink": "#1d2b3a",
6
+ "accent": "#ff8a5b",
7
+ "accent2": "#5cbf8a",
8
+ "danger": "#e2553f",
9
+ "good": "#45b36b",
10
+ "gold": "#ffd25a",
11
+ "ramp": [
12
+ "#9fd3ef",
13
+ "#cfe8f5",
14
+ "#f8f3e6",
15
+ "#8fd06a",
16
+ "#5cbf8a",
17
+ "#3f8f5a",
18
+ "#ffd25a",
19
+ "#ffb347",
20
+ "#ff8a5b",
21
+ "#e86a6a",
22
+ "#b07ad9",
23
+ "#8a6a4a",
24
+ "#5a4a3a",
25
+ "#ffffff"
26
+ ]
27
+ },
28
+ "fonts": {
29
+ "display": "Fredoka",
30
+ "body": "Nunito"
31
+ },
32
+ "light": {
33
+ "time": "morning",
34
+ "key": [
35
+ -0.5,
36
+ -1,
37
+ -0.35
38
+ ],
39
+ "intensity": 2.2,
40
+ "hardness": 0.35,
41
+ "sky": "#e0f0f9",
42
+ "ground": "#79c9a5",
43
+ "fog": 0.35,
44
+ "bloom": 0.1
45
+ },
46
+ "camera": {
47
+ "angle": "low-3/4",
48
+ "projection": "perspective",
49
+ "pitch": 34,
50
+ "distance": 20,
51
+ "fov": 42
52
+ },
53
+ "render": "lowpoly-flat",
54
+ "materials": {
55
+ "model": "flat",
56
+ "outline": false,
57
+ "texelDensity": null,
58
+ "atlas": true
59
+ },
60
+ "rev": {
61
+ "style.palette": 1,
62
+ "style.ui": 1,
63
+ "style.light": 1,
64
+ "style.camera": 1
65
+ }
66
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "knockRange": { "value": 2.2, "min": 1.2, "max": 4, "step": 0.02, "unit": "m", "group": "Knock", "note": "How near a body must be for a wave to bump it" },
3
+ "hitStopMs": { "value": 70, "min": 0, "max": 200, "step": 5, "unit": "ms", "group": "Knock", "note": "The hit lands: the bumped body holds, squashed and shaking, before it flies" },
4
+ "knockDistance": { "value": 3.7, "min": 0.8, "max": 8, "step": 0.1, "unit": "m", "group": "Knock", "note": "How far a bump sends a body, the same at any frame rate" },
5
+ "knockMs": { "value": 420, "min": 120, "max": 1000, "step": 10, "unit": "ms", "group": "Knock", "note": "How long the slide takes" },
6
+ "knockEase": { "value": 4, "min": 1, "max": 6, "step": 0.1, "group": "Knock", "note": "1 slides at one speed; higher leaves faster and eases into the stop" },
7
+ "squash": { "value": 0.35, "min": 0, "max": 0.8, "step": 0.01, "group": "Body", "note": "How much a flying body stretches along the hit, and squashes when it stops" },
8
+ "settleMs": { "value": 260, "min": 0, "max": 700, "step": 10, "unit": "ms", "group": "Body", "note": "The wobble after the stop (overlap)" },
9
+ "flashMs": { "value": 110, "min": 0, "max": 300, "step": 5, "unit": "ms", "group": "Hit", "note": "How long the bumped body flashes white" },
10
+ "shake": { "value": 0.16, "min": 0, "max": 0.6, "step": 0.01, "unit": "m", "group": "Hit", "note": "The camera's kick when you bump or are bumped" },
11
+ "sparks": { "value": 9, "min": 0, "max": 24, "step": 1, "group": "Hit", "note": "Sparks thrown off the hit" },
12
+ "ringMs": { "value": 900, "min": 200, "max": 2000, "step": 10, "unit": "ms", "group": "Wave", "note": "How long a wave's ring lasts" }
13
+ }
package/worker/agents.mjs CHANGED
@@ -74,10 +74,10 @@ export function encodeFacts(value) {
74
74
  for (const b of bytes) s += String.fromCharCode(b);
75
75
  return btoa(s).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
76
76
  }
77
- /** The reverse, or null for anything that is not one (at most 4 KB). */
78
- export function decodeFacts(text) {
77
+ /** The reverse, or null for anything that is not one (at most 4 KB, or `max`: a room's chat rules may be longer). */
78
+ export function decodeFacts(text, max = 4096) {
79
79
  const t = String(text ?? '');
80
- if (!t || t.length > 4096 || !/^[A-Za-z0-9_-]+$/.test(t)) return null;
80
+ if (!t || t.length > max || !/^[A-Za-z0-9_-]+$/.test(t)) return null;
81
81
  try {
82
82
  const s = atob(t.replace(/-/g, '+').replace(/_/g, '/'));
83
83
  const bytes = Uint8Array.from(s, (c) => c.charCodeAt(0));