@moku-labs/game 0.13.1 → 0.13.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.
Files changed (37) hide show
  1. package/dist/app/page.d.mts +1 -1
  2. package/dist/app/system.d.mts +3 -3
  3. package/dist/app.d.mts +2 -2
  4. package/dist/app.mjs +1 -1
  5. package/dist/assets.d.mts +1 -1
  6. package/dist/assets.mjs +1 -1
  7. package/dist/cli.d.mts +7 -5
  8. package/dist/cli.mjs +74 -36
  9. package/dist/{commands-DvFr8Uwp.d.mts → commands-BrgeMP5y.d.mts} +5 -5
  10. package/dist/control.d.mts +4 -4
  11. package/dist/{define-CCc0ozKe.d.mts → define-ZmWbWxon.d.mts} +2 -2
  12. package/dist/{headless-G4nuZ-xz.d.mts → headless-Dgxvp6Ym.d.mts} +1 -1
  13. package/dist/hot.d.mts +3 -3
  14. package/dist/hot.mjs +11 -9
  15. package/dist/{index-rnOYAriI.d.mts → index-CdbE_jGs.d.mts} +12 -4
  16. package/dist/index.d.mts +5 -5
  17. package/dist/index.mjs +1 -1
  18. package/dist/inspect.d.mts +7 -7
  19. package/dist/jsx-dev-runtime.d.mts +1 -1
  20. package/dist/jsx-runtime.d.mts +1 -1
  21. package/dist/{memory-DwDhfFWK.d.mts → memory-DJ2sPExv.d.mts} +1 -1
  22. package/dist/project.mjs +1 -1
  23. package/dist/{runtime-B276Gg0s.d.mts → runtime-6qakboTm.d.mts} +1 -1
  24. package/dist/{src-SmT-XxVf.mjs → src-CltFFKtc.mjs} +955 -108
  25. package/dist/testing.d.mts +4 -4
  26. package/dist/testing.mjs +1 -1
  27. package/dist/{types-D_2G6Q68.d.mts → types-B3T2X6To.d.mts} +8 -4
  28. package/dist/{types-ZQLYXo5X.d.mts → types-C6y8EfEB.d.mts} +54 -5
  29. package/dist/{types-BrTpz9oL.d.mts → types-CmuwAjkV.d.mts} +19 -6
  30. package/dist/{types-DAdwEJMp.d.mts → types-D57SntUt.d.mts} +2 -2
  31. package/dist/{types-DLghaGEy.d.mts → types-DGIkfZB7.d.mts} +4 -4
  32. package/dist/{types-Bcdo5-2w.d.mts → types-zRGJdFGX.d.mts} +7 -3
  33. package/dist/visual.d.mts +6 -6
  34. package/llms.txt +6 -4
  35. package/package.json +4 -2
  36. package/dist/{assets-DYiKxPBX.mjs → assets-BrKSg1O6.mjs} +1 -1
  37. package/dist/{watch-CB8IWDBi.mjs → watch-CWI_on4T.mjs} +1 -1
@@ -1,4 +1,4 @@
1
- import { m as StartedPage, r as GameConfig, t as AnyGameApp, u as PageOptions } from "../types-DLghaGEy.mjs";
1
+ import { m as StartedPage, r as GameConfig, t as AnyGameApp, u as PageOptions } from "../types-DGIkfZB7.mjs";
2
2
 
3
3
  //#region src/app/page.d.ts
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { tn as PlayerStateProvider } from "../types-ZQLYXo5X.mjs";
2
- import { ct as PlatformProvider } from "../index-rnOYAriI.mjs";
3
- import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-DLghaGEy.mjs";
1
+ import { tn as PlayerStateProvider } from "../types-C6y8EfEB.mjs";
2
+ import { ct as PlatformProvider } from "../index-CdbE_jGs.mjs";
3
+ import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-DGIkfZB7.mjs";
4
4
  import { Back, Haptics, KeepAwake, Lifecycle, Store } from "@moku-labs/system";
5
5
 
6
6
  //#region src/app/system.d.ts
package/dist/app.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { Xt as Json } from "./types-ZQLYXo5X.mjs";
2
- import { a as GameHandle, c as MemoryProvider, d as SaveKind, f as Scenario, g as SystemName, i as GameDefinition, l as PageAgent, n as GameApp, o as GamePluginConfigs, p as ScreenSeams, r as GameConfig, s as HeadlessSeams } from "./types-DLghaGEy.mjs";
1
+ import { Xt as Json } from "./types-C6y8EfEB.mjs";
2
+ import { a as GameHandle, c as MemoryProvider, d as SaveKind, f as Scenario, g as SystemName, i as GameDefinition, l as PageAgent, n as GameApp, o as GamePluginConfigs, p as ScreenSeams, r as GameConfig, s as HeadlessSeams } from "./types-DGIkfZB7.mjs";
3
3
  import { AnyPluginInstance } from "@moku-labs/core";
4
4
 
5
5
  //#region src/app/define.d.ts
package/dist/app.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { Ct as effectsPlugin, H as platformPlugin, Nt as audioPlugin, i as screen, t as createApp } from "./src-SmT-XxVf.mjs";
1
+ import { Ct as effectsPlugin, H as platformPlugin, Nt as audioPlugin, i as screen, t as createApp } from "./src-CltFFKtc.mjs";
2
2
  import { t as memory } from "./memory-CWlqhS7l.mjs";
3
3
  import { t as fakeClock } from "./fake-MpzwZhIZ.mjs";
4
4
  //#region src/app/define.ts
package/dist/assets.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { u as Manifest } from "./types-ZQLYXo5X.mjs";
1
+ import { u as Manifest } from "./types-C6y8EfEB.mjs";
2
2
 
3
3
  //#region src/plugins/assets/scan/cli.d.ts
4
4
  /**
package/dist/assets.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as runCli, c as emitKeys, i as compileStrings, l as emitManifest, n as importStrings, o as scanAssets, r as checkStrings, s as packAssets, t as exportStrings } from "./assets-DYiKxPBX.mjs";
1
+ import { a as runCli, c as emitKeys, i as compileStrings, l as emitManifest, n as importStrings, o as scanAssets, r as checkStrings, s as packAssets, t as exportStrings } from "./assets-BrKSg1O6.mjs";
2
2
  export { checkStrings, compileStrings, emitKeys, emitManifest, exportStrings, importStrings, packAssets, runCli, scanAssets };
package/dist/cli.d.mts CHANGED
@@ -87,8 +87,9 @@ declare function runCli(argv: readonly string[]): Promise<number>;
87
87
  * `dev.ts`, `main.ts` with the scenarios of `tests/scenarios/` (and, with agents, the agents and
88
88
  * the game's `.dev` modules), and `bunfig.toml` with the engine's hot plugin. It also writes the
89
89
  * first `assets-stamp.ts`, the empty one, when the game has none: `main.ts` imports it, and
90
- * `watchKeys` rewrites it when an asset file changes. It starts no server and no watcher, and
91
- * throws the `[game]` errors of `moku-game dev`.
90
+ * `watchKeys` rewrites it when an asset file changes. The page accepts the new stamp: new bytes
91
+ * of a file swap in place, a new or removed file reloads the page. It starts no server and no
92
+ * watcher, and throws the `[game]` errors of `moku-game dev`.
92
93
  *
93
94
  * @param root - The game folder, relative to the cwd or absolute.
94
95
  * @param options - The agents, the preloads and the extra bundler plugins.
@@ -112,9 +113,10 @@ declare function preparePage(root: string, options?: PreparePageOptions): Promis
112
113
  * `strings/<locale>.json` scans again, with the same flags, outputs and layers; an output that
113
114
  * did not change is not rewritten. On the page a rewritten `generated/strings.<locale>.ts` hot
114
115
  * swaps. An asset file that is new, gone or saved again rewrites `.moku/assets-stamp.ts`, which
115
- * the page imports, so the page reloads and shows the new image or the new bytes of an old one. A
116
- * failed scan goes to `onError` and the watch goes on, the first scan too. The layers of
117
- * `config.ts` are read once: a changed layer needs a new `watchKeys`.
116
+ * the page imports and accepts as a hot swap: the new bytes of a file swap in place in the loaded
117
+ * bundles, with no reload, and a new or removed file reloads the page. A failed scan goes to
118
+ * `onError` and the watch goes on, the first scan too. The layers of `config.ts` are read once:
119
+ * a changed layer needs a new `watchKeys`.
118
120
  *
119
121
  * @param root - The game folder, relative to the cwd or absolute.
120
122
  * @param options - Where the message of a failed scan goes.
package/dist/cli.mjs CHANGED
@@ -1,12 +1,11 @@
1
1
  import { t as resolveConfig } from "./config-CdARrrhU.mjs";
2
- import { r as watchTree, t as createBatcher, x as isSkippedFolder$1 } from "./watch-CB8IWDBi.mjs";
3
- import { a as runCli$1, i as compileStrings, n as importStrings, t as exportStrings } from "./assets-DYiKxPBX.mjs";
2
+ import { r as watchTree, t as createBatcher, x as isSkippedFolder$1 } from "./watch-CWI_on4T.mjs";
3
+ import { a as runCli$1, i as compileStrings, n as importStrings, t as exportStrings } from "./assets-BrKSg1O6.mjs";
4
4
  import { constants, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, watch, writeFileSync } from "node:fs";
5
5
  import path from "node:path";
6
6
  import { createBrandConsole } from "@moku-labs/common/cli";
7
7
  import { parseArgs } from "node:util";
8
8
  import { pathToFileURL } from "node:url";
9
- import { createHash } from "node:crypto";
10
9
  //#region src/app/generate.ts
11
10
  /** The first line of a generated file a person may open. */
12
11
  const WRITTEN = "// Written by moku-game dev. Do not edit.";
@@ -230,6 +229,21 @@ function importLine(binding, specifier) {
230
229
  return `import ${binding} from ${JSON.stringify(specifier)};`;
231
230
  }
232
231
  /**
232
+ * Orders two texts by their code units, as `toSorted()` does without a comparer.
233
+ *
234
+ * @param first - One text.
235
+ * @param second - The other text.
236
+ * @returns A negative number, zero or a positive number.
237
+ * @example
238
+ * ```ts
239
+ * compareText("a/b.png", "a/c.png"); // -1
240
+ * ```
241
+ */
242
+ function compareText(first, second) {
243
+ if (first === second) return 0;
244
+ return first < second ? -1 : 1;
245
+ }
246
+ /**
233
247
  * The path from a page under `.moku/` to `.moku/` itself, where the one stamp of a game lives.
234
248
  *
235
249
  * @param toRoot - The path from the page to the game folder.
@@ -246,8 +260,9 @@ function toStampFolder(toRoot) {
246
260
  * The `main.ts` of the dev page: the dev flag first, then the assets stamp, the page entry, the
247
261
  * game, its config, one import per scenario, and, with agents, one per `.dev` module and one per
248
262
  * agent. It calls `startPage` with the scenarios by file stem, the shell with the loaders of the
249
- * named plugins when the game needs it, the agents and the `.dev` modules. The stamp import makes
250
- * the page reload when the keys watch writes a new stamp: an asset file changed.
263
+ * named plugins when the game needs it, the agents and the `.dev` modules. The stamp import puts
264
+ * the stamp module on the page: when the keys watch writes a new stamp, the hot plugin hands it to
265
+ * the running game.
251
266
  *
252
267
  * @param settings - The resolved `config.ts`.
253
268
  * @param sources - The scenario files, the `.dev` modules and the agents.
@@ -324,20 +339,34 @@ function devFlag() {
324
339
  return `${WRITTEN}\nglobalThis.__MOKU_GAME_DEV__ = true;\n`;
325
340
  }
326
341
  /**
327
- * The `assets-stamp.ts` module the dev `main.ts` imports: one string that changes when an asset
328
- * file of the game changes. The hot plugin takes it for a logic module, so a new stamp reloads the
329
- * page, and the page shows the new bytes of an image whose key stayed the same. The page starts
330
- * with the empty stamp; the keys watch writes the hash of the asset files.
342
+ * The `assets-stamp.ts` module the dev `main.ts` imports: the asset files of the game with their
343
+ * stamps, and the ones the last save changed. The hot plugin takes it for a module that swaps, so
344
+ * a new stamp reaches the running game, which reads the changed files again. The page starts with
345
+ * the empty stamp; the keys watch writes the files. Both lists are sorted here, and every path
346
+ * and stamp is written by `JSON.stringify`: a file name may hold a quote or a backslash.
331
347
  *
332
- * @param hash - The hash of the asset files, `""` before the first watch.
348
+ * @param files - Every watched asset file: its path relative to the game with `/`, and its stamp
349
+ * `<size>:<mtimeMs>`. None before the first watch.
350
+ * @param changed - The paths whose stamp differs from the batch before, the new ones too. None in
351
+ * the first stamp of a run.
333
352
  * @returns The text of `.moku/assets-stamp.ts`.
334
353
  * @example
335
354
  * ```ts
336
- * assetsStamp(""); // '// Written by moku-game dev. Do not edit.\nexport default "";\n'
355
+ * assetsStamp([], []); // '// Written by moku-game dev. Do not edit.\nexport default {\n files: {},\n changed: []\n};\n'
337
356
  * ```
338
357
  */
339
- function assetsStamp(hash) {
340
- return `${WRITTEN}\nexport default ${JSON.stringify(hash)};\n`;
358
+ function assetsStamp(files, changed) {
359
+ const entries = files.toSorted(([first], [second]) => compareText(first, second)).map(([file, stamp]) => ` ${JSON.stringify(file)}: ${JSON.stringify(stamp)}`);
360
+ const map = entries.length === 0 ? "{}" : `{\n${entries.join(",\n")}\n }`;
361
+ const list = changed.toSorted(compareText).map((file) => JSON.stringify(file)).join(", ");
362
+ return [
363
+ WRITTEN,
364
+ "export default {",
365
+ ` files: ${map},`,
366
+ ` changed: [${list}]`,
367
+ "};",
368
+ ""
369
+ ].join("\n");
341
370
  }
342
371
  /**
343
372
  * A TOML array of strings. `JSON.stringify` of a path is a valid TOML basic string, also for a
@@ -623,7 +652,7 @@ function writePage(root, settings, options, resolve, page = ".moku") {
623
652
  ];
624
653
  const stamp = path.join(root, ".moku", ASSETS_STAMP);
625
654
  for (const [file, text] of texts) writeIfChanged(file, text);
626
- if (!existsSync(stamp)) writeIfChanged(stamp, assetsStamp(""));
655
+ if (!existsSync(stamp)) writeIfChanged(stamp, assetsStamp([], []));
627
656
  return {
628
657
  html,
629
658
  bunfig
@@ -1797,11 +1826,12 @@ async function runCommand(argv, deps) {
1797
1826
  * events stop for a quiet period, a batch walks the game and reads the size and the time stamp of
1798
1827
  * every asset file and every `strings/<locale>.json`; it runs the scan of `moku-game keys` only
1799
1828
  * when they differ from the batch before. After a scan it writes `.moku/assets-stamp.ts` from the
1800
- * asset files, so the dev page reloads and shows the new bytes of an image. One scan runs at a
1801
- * time, and a failed scan never stops the watch. A batch that scanned is followed by one more
1802
- * walk: the platform reports only the first path of a burst of writes, so a save made in the same
1803
- * instant as the scan's own writes under `generated/` may never be reported. The scan, `fs.watch`
1804
- * and the console come in as seams, so a test drives it. Node and Bun only: the bin bundles it.
1829
+ * asset files: every file with its stamp, and the ones this batch found changed, so the dev page
1830
+ * reads only those again. One scan runs at a time, and a failed scan never stops the watch. A
1831
+ * batch that scanned is followed by one more walk: the platform reports only the first path of a
1832
+ * burst of writes, so a save made in the same instant as the scan's own writes under `generated/`
1833
+ * may never be reported. The scan, `fs.watch` and the console come in as seams, so a test drives
1834
+ * it. Node and Bun only: the bin bundles it.
1805
1835
  */
1806
1836
  /** The quiet period that closes a batch of file events. */
1807
1837
  const QUIET_MS = 100;
@@ -1882,19 +1912,24 @@ function changedPaths(before, after) {
1882
1912
  return [.../* @__PURE__ */ new Set([...before.keys(), ...after.keys()])].filter((file) => before.get(file) !== after.get(file)).toSorted();
1883
1913
  }
1884
1914
  /**
1885
- * Hashes the asset files of a walk: their paths, sizes and time stamps. The strings files stay
1886
- * out, so a strings save leaves the hash as it is.
1915
+ * The text of the stamp module after one batch: every asset file of the walk with its stamp, and
1916
+ * the asset files that differ from the batch before. The strings files stay out, so a batch that
1917
+ * saved only strings has no stamp to write. A removed file is not listed as changed: it shows by
1918
+ * its absence from the files. The first batch of a run has no batch before it, so it lists none.
1887
1919
  *
1888
- * @param inputs - The stamps of a walk.
1889
- * @returns The SHA-1 as 40 hex digits.
1920
+ * @param inputs - The stamps of this walk.
1921
+ * @param changed - The inputs that differ from the batch before: added, removed, or saved again.
1922
+ * @param first - True for the first batch of the watch.
1923
+ * @returns The text, or `undefined` when no asset file changed in a later batch.
1890
1924
  * @example
1891
1925
  * ```ts
1892
- * assetsHash(new Map([["features/home/strings/en.json", "9:1"]])); // "da39a3ee5e6b4b0d3255bfef95601890afd80709": no asset file
1926
+ * stampText(new Map([["a.png", "4:2"], ["strings/en.json", "9:1"]]), ["a.png", "strings/en.json"], false); // '// Written by moku-game dev. Do not edit.\nexport default {\n files: {\n "a.png": "4:2"\n },\n changed: ["a.png"]\n};\n'
1893
1927
  * ```
1894
1928
  */
1895
- function assetsHash(inputs) {
1896
- const assets = [...inputs].filter(([file]) => ASSET_FILE.test(file)).map(([file, stamp]) => `${file}:${stamp}`).toSorted();
1897
- return createHash("sha1").update(assets.join("\n")).digest("hex");
1929
+ function stampText(inputs, changed, first) {
1930
+ const moved = changed.filter((file) => ASSET_FILE.test(file));
1931
+ if (!first && moved.length === 0) return void 0;
1932
+ return assetsStamp([...inputs].filter(([file]) => ASSET_FILE.test(file)), first ? [] : moved.filter((file) => inputs.has(file)));
1898
1933
  }
1899
1934
  /**
1900
1935
  * The line of a later scan that worked: the first changed input, and how many more.
@@ -1984,9 +2019,9 @@ async function scanAndReport(watch, changed, first) {
1984
2019
  }
1985
2020
  /**
1986
2021
  * One batch: walks the game, and scans when an input differs from the batch before; the first
1987
- * batch always scans. Then it writes the stamp of the asset files, asks for one trailing batch,
1988
- * and arms the folder watchers with the folders of the walk. A batch that did not scan asks for
1989
- * nothing, so the trailing batch of a quiet game ends the chain.
2022
+ * batch always scans. Then it writes the stamp when an asset file changed, asks for one trailing
2023
+ * batch, and arms the folder watchers with the folders of the walk. A batch that did not scan
2024
+ * asks for nothing, so the trailing batch of a quiet game ends the chain.
1990
2025
  *
1991
2026
  * @param watch - The watch.
1992
2027
  */
@@ -1997,7 +2032,8 @@ async function runBatch(watch) {
1997
2032
  watch.inputs = walk.inputs;
1998
2033
  if (first || changed.length > 0) {
1999
2034
  await scanAndReport(watch, changed, first);
2000
- writeIfChanged(path.join(watch.root, ".moku", ASSETS_STAMP), assetsStamp(assetsHash(walk.inputs)));
2035
+ const stamp = stampText(walk.inputs, changed, first);
2036
+ if (stamp !== void 0) writeIfChanged(path.join(watch.root, ".moku", ASSETS_STAMP), stamp);
2001
2037
  watch.again();
2002
2038
  }
2003
2039
  if (!watch.closed) watch.tree.rearm(walk.folders);
@@ -2303,8 +2339,9 @@ async function runCli(argv) {
2303
2339
  * `dev.ts`, `main.ts` with the scenarios of `tests/scenarios/` (and, with agents, the agents and
2304
2340
  * the game's `.dev` modules), and `bunfig.toml` with the engine's hot plugin. It also writes the
2305
2341
  * first `assets-stamp.ts`, the empty one, when the game has none: `main.ts` imports it, and
2306
- * `watchKeys` rewrites it when an asset file changes. It starts no server and no watcher, and
2307
- * throws the `[game]` errors of `moku-game dev`.
2342
+ * `watchKeys` rewrites it when an asset file changes. The page accepts the new stamp: new bytes
2343
+ * of a file swap in place, a new or removed file reloads the page. It starts no server and no
2344
+ * watcher, and throws the `[game]` errors of `moku-game dev`.
2308
2345
  *
2309
2346
  * @param root - The game folder, relative to the cwd or absolute.
2310
2347
  * @param options - The agents, the preloads and the extra bundler plugins.
@@ -2335,9 +2372,10 @@ async function preparePage(root, options = {}) {
2335
2372
  * `strings/<locale>.json` scans again, with the same flags, outputs and layers; an output that
2336
2373
  * did not change is not rewritten. On the page a rewritten `generated/strings.<locale>.ts` hot
2337
2374
  * swaps. An asset file that is new, gone or saved again rewrites `.moku/assets-stamp.ts`, which
2338
- * the page imports, so the page reloads and shows the new image or the new bytes of an old one. A
2339
- * failed scan goes to `onError` and the watch goes on, the first scan too. The layers of
2340
- * `config.ts` are read once: a changed layer needs a new `watchKeys`.
2375
+ * the page imports and accepts as a hot swap: the new bytes of a file swap in place in the loaded
2376
+ * bundles, with no reload, and a new or removed file reloads the page. A failed scan goes to
2377
+ * `onError` and the watch goes on, the first scan too. The layers of `config.ts` are read once:
2378
+ * a changed layer needs a new `watchKeys`.
2341
2379
  *
2342
2380
  * @param root - The game folder, relative to the cwd or absolute.
2343
2381
  * @param options - Where the message of a failed scan goes.
@@ -1,8 +1,8 @@
1
- import { A as Api$2, E as DebugSwitches, Ot as Bookmark, h as Api$1, jt as FlowState, ln as Api, vn as Time, w as Captured } from "./types-ZQLYXo5X.mjs";
2
- import { a as AudioApi, r as UiApi, v as ScenesApi, x as AnimApi } from "./types-D_2G6Q68.mjs";
3
- import { A as InputApi } from "./types-BrTpz9oL.mjs";
4
- import { t as HeadlessApp } from "./headless-G4nuZ-xz.mjs";
5
- import { n as Command, r as ControlApp } from "./types-DAdwEJMp.mjs";
1
+ import { A as Api$2, E as DebugSwitches, Ot as Bookmark, h as Api$1, jt as FlowState, ln as Api, vn as Time, w as Captured } from "./types-C6y8EfEB.mjs";
2
+ import { a as AudioApi, r as UiApi, v as ScenesApi, x as AnimApi } from "./types-B3T2X6To.mjs";
3
+ import { A as InputApi } from "./types-CmuwAjkV.mjs";
4
+ import { t as HeadlessApp } from "./headless-Dgxvp6Ym.mjs";
5
+ import { n as Command, r as ControlApp } from "./types-D57SntUt.mjs";
6
6
 
7
7
  //#region src/plugins/flow/doors/commands.d.ts
8
8
  /**
@@ -1,7 +1,7 @@
1
- import { t as HeadlessApp } from "./headless-G4nuZ-xz.mjs";
2
- import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-DAdwEJMp.mjs";
3
- import { t as commands } from "./commands-DvFr8Uwp.mjs";
4
- import { t as defineCommand } from "./define-CCc0ozKe.mjs";
1
+ import { t as HeadlessApp } from "./headless-Dgxvp6Ym.mjs";
2
+ import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-D57SntUt.mjs";
3
+ import { t as commands } from "./commands-BrgeMP5y.mjs";
4
+ import { t as defineCommand } from "./define-ZmWbWxon.mjs";
5
5
 
6
6
  //#region src/plugins/flow/doors/dev.d.ts
7
7
  /**
@@ -1,5 +1,5 @@
1
- import { t as HeadlessApp } from "./headless-G4nuZ-xz.mjs";
2
- import { c as Source, n as Command, o as InputSchema } from "./types-DAdwEJMp.mjs";
1
+ import { t as HeadlessApp } from "./headless-Dgxvp6Ym.mjs";
2
+ import { c as Source, n as Command, o as InputSchema } from "./types-D57SntUt.mjs";
3
3
 
4
4
  //#region src/plugins/flow/doors/define.d.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { Bt as Answer, Mt as JournalEntry, Pt as RouteStep, Xt as Json, cn as RngState, dt as Api$1, hn as Api, jt as FlowState } from "./types-ZQLYXo5X.mjs";
1
+ import { Bt as Answer, Mt as JournalEntry, Pt as RouteStep, Xt as Json, cn as RngState, dt as Api$1, hn as Api, jt as FlowState } from "./types-C6y8EfEB.mjs";
2
2
 
3
3
  //#region src/plugins/flow/headless.d.ts
4
4
  /**
package/dist/hot.d.mts CHANGED
@@ -15,9 +15,9 @@ type HotOptions = {
15
15
  /**
16
16
  * The files that get the footer. Default: `.tsx` files, `styles.ts`, `view.ts`,
17
17
  * `animations.ts`, `effects.ts`, any `.ts` directly in a `styles/`, `motion/`, `effects/` or
18
- * `views/` folder, and in `world/projections/` or `world/layout/`, and
19
- * `generated/strings.<locale>.ts`. Bun runs it as the load filter on the absolute path, so it
20
- * should not anchor at the start.
18
+ * `views/` folder, and in `world/projections/` or `world/layout/`,
19
+ * `generated/strings.<locale>.ts`, and the stamp module `.moku/assets-stamp.ts`. Bun runs it as
20
+ * the load filter on the absolute path, so it should not anchor at the start.
21
21
  */
22
22
  include?: RegExp;
23
23
  /**
package/dist/hot.mjs CHANGED
@@ -6,20 +6,22 @@ import { readFile } from "node:fs/promises";
6
6
  * a running game. It appends a footer to every view module it loads: the module accepts its own
7
7
  * update and hands the new exports to the running game through `globalThis.__moku_hot`. The `ui`
8
8
  * plugin installs that handler in dev builds only. What swaps: styles, components, projections,
9
- * animations, text styles, emitters and generated strings. A view module is a `.tsx` file, a
10
- * `styles.ts`, a `view.ts`, an `animations.ts`, an `effects.ts`, any `.ts` directly in a
11
- * `styles/`, `motion/`, `effects/` or `views/` folder, any `.ts` directly in `world/projections/`
12
- * or `world/layout/`, or a generated `generated/strings.<locale>.ts`; a logic module never gets
13
- * the footer (`world/components/` and `world/systems/` included: they are registered at start), so
14
- * its save reaches the root and the page reloads and restores its state. `moku-game dev` lists the
9
+ * animations, text styles, emitters, generated strings, and the asset files the stamp module of
10
+ * the keys watch names. A view module is a `.tsx` file, a `styles.ts`, a `view.ts`, an
11
+ * `animations.ts`, an `effects.ts`, any `.ts` directly in a `styles/`, `motion/`, `effects/` or
12
+ * `views/` folder, any `.ts` directly in `world/projections/` or `world/layout/`, or a generated
13
+ * `generated/strings.<locale>.ts`. The stamp module `.moku/assets-stamp.ts` gets the footer too:
14
+ * its new exports say which asset files changed. A logic module never gets the footer
15
+ * (`world/components/` and `world/systems/` included: they are registered at start, and
16
+ * `.moku/main.ts` too), so its save reaches the root and the page reloads and restores its state. `moku-game dev` lists the
15
17
  * plugin first in `[serve.static]` of the bunfig it writes, `.moku/bunfig.toml`; a game without the
16
18
  * shell lists it in its own `bunfig.toml`. The dev server only: `moku-game build` never loads it.
17
19
  */
18
20
  /**
19
- * The default view modules: the view files by name or by kind folder. Two literals joined, so
20
- * each stays readable.
21
+ * The default modules that swap: the view files by name or by kind folder, and the stamp module.
22
+ * Three literals joined, so each stays readable.
21
23
  */
22
- const DEFAULT_INCLUDE = new RegExp(`(${/\.tsx|\/styles\.ts|\/view\.ts|\/animations\.ts|\/effects\.ts|\/generated\/strings\.[\w-]+\.ts/.source}|${/\/(?:styles|motion|effects|views)\/[^/]+\.ts|\/world\/(?:projections|layout)\/[^/]+\.ts/.source})$`);
24
+ const DEFAULT_INCLUDE = new RegExp(`(${/\.tsx|\/styles\.ts|\/view\.ts|\/animations\.ts|\/effects\.ts|\/generated\/strings\.[\w-]+\.ts/.source}|${/\/(?:styles|motion|effects|views)\/[^/]+\.ts|\/world\/(?:projections|layout)\/[^/]+\.ts/.source}|${/\/\.moku\/assets-stamp\.ts/.source})$`);
23
25
  /** The generated strings of one locale, the one file under `generated/` that swaps. */
24
26
  const STRINGS = /\/generated\/strings\.[\w-]+\.ts$/;
25
27
  /** The default folders and test files that never hot swap. The outer group only scopes the `$`. */
@@ -1,7 +1,7 @@
1
- import { $ as DescriptionNode, A as Api$6, B as ComponentType, Et as FeatureDescription, Ft as SceneIdOf, G as Mut, Gt as State$2, J as QueryTerm, Jt as Config$5, K as Narrowed, Lt as Descriptor, N as State$8, Qt as State$5, R as ComponentHandle, Rt as GuideOptions, Sn as Require, Ut as Config$2, V as ComponentValue, Vt as Api$1, X as SystemDefinition, Xt as Json, Y as ResourceType, Z as TagType, Zt as Root, _n as State$7, a as Config$1, at as NumericFields, bn as Config$9, c as LoadBundles, d as State$1, dn as Events, dt as Api$2, en as Patch, et as Ease, f as Tier, fn as PauseReason, ft as BundlesOf, g as Config$6, gn as Config$7, gt as GameTypes, h as Api$4, hn as Api$5, ht as FeaturePlugin, i as BundleSpec, j as Config$8, k as ViewportSize, kt as DefineNode, l as LoadReason, ln as Api$3, mt as EmitterIdOf, o as DefineBundles, on as StoreApi, ot as ProjectionMotion, pn as State$4, pt as Config$3, r as BundleMap, sn as RngApi, st as ProjectionSpec, t as Api, un as Config$4, vt as State$3, x as State$6, xn as Events$1, xt as defineFlow, yt as TextStylesOf, zt as Hint } from "./types-ZQLYXo5X.mjs";
2
- import { A as SfxDescriptor, C as Config$10, D as Target, E as State$9, N as defineAnimation, S as AnimPlayerValue, T as MotionKeyframe, _ as SceneSpec, a as AudioApi, c as MusicDescriptor, d as State$10, g as SceneDefinition, h as LayerMap, j as Step, k as HapticKind, l as MusicOptions, m as DefineScene, n as State$12, p as AnySceneProjection, r as UiApi, s as Config$11, t as Config$12, v as ScenesApi, w as FramesValue, x as AnimApi, y as State$11, z as play } from "./types-D_2G6Q68.mjs";
3
- import { _ as NoiseValue, c as EmitterValue, d as ColorMatrixValue, f as DisplacementValue, g as GlowValue, h as FilterValueOf, i as State$13, l as AlphaValue, m as FilterSpec, n as EffectsApi, o as EmitterConfig, p as FilterComponent, s as EmitterDefinition, t as Config$13, u as BlurValue, v as OutlineValue, y as UniformDeclaration } from "./types-Bcdo5-2w.mjs";
4
- import { A as InputApi, B as SpriteOptions, E as TextValue, F as NineSliceValue, G as Argument, J as IntlKit, K as Config$14, O as defineComponent, Q as TypedTr, R as ShapeValue, S as TextBind, T as TextStyles, U as TransformValue, V as SpriteValue, W as sprite, X as Part, Y as Message, Z as State$14, _ as Config$16, b as State$16, et as IsFlags, f as defineTokens, g as BindOptions, h as BindField, it as WhenFlags, j as State$15, k as Config$15, nt as Style, p as IntrinsicElementsFor, q as I18nApi, s as PopupComponent, tt as ResolvedStyle, v as CountdownValue, w as TextStyleInput, x as TextApi, y as Point } from "./types-BrTpz9oL.mjs";
1
+ import { $ as DescriptionNode, A as Api$6, B as ComponentType, Et as FeatureDescription, Ft as SceneIdOf, G as Mut, Gt as State$2, J as QueryTerm, Jt as Config$5, K as Narrowed, Lt as Descriptor, N as State$8, Qt as State$5, R as ComponentHandle, Rt as GuideOptions, Sn as Require, Ut as Config$2, V as ComponentValue, Vt as Api$1, X as SystemDefinition, Xt as Json, Y as ResourceType, Z as TagType, Zt as Root, _n as State$7, a as Config$1, at as NumericFields, bn as Config$9, c as LoadBundles, d as State$1, dn as Events, dt as Api$2, en as Patch, et as Ease, f as Tier, fn as PauseReason, ft as BundlesOf, g as Config$6, gn as Config$7, gt as GameTypes, h as Api$4, hn as Api$5, ht as FeaturePlugin, i as BundleSpec, j as Config$8, k as ViewportSize, kt as DefineNode, l as LoadReason, ln as Api$3, mt as EmitterIdOf, o as DefineBundles, on as StoreApi, ot as ProjectionMotion, pn as State$4, pt as Config$3, r as BundleMap, sn as RngApi, st as ProjectionSpec, t as Api, un as Config$4, vt as State$3, x as State$6, xn as Events$1, xt as defineFlow, yt as TextStylesOf, zt as Hint } from "./types-C6y8EfEB.mjs";
2
+ import { A as SfxDescriptor, C as Config$10, D as Target, E as State$9, N as defineAnimation, S as AnimPlayerValue, T as MotionKeyframe, _ as SceneSpec, a as AudioApi, c as MusicDescriptor, d as State$10, g as SceneDefinition, h as LayerMap, j as Step, k as HapticKind, l as MusicOptions, m as DefineScene, n as State$12, p as AnySceneProjection, r as UiApi, s as Config$11, t as Config$12, v as ScenesApi, w as FramesValue, x as AnimApi, y as State$11, z as play } from "./types-B3T2X6To.mjs";
3
+ import { _ as NoiseValue, c as EmitterValue, d as ColorMatrixValue, f as DisplacementValue, g as GlowValue, h as FilterValueOf, i as State$13, l as AlphaValue, m as FilterSpec, n as EffectsApi, o as EmitterConfig, p as FilterComponent, s as EmitterDefinition, t as Config$13, u as BlurValue, v as OutlineValue, y as UniformDeclaration } from "./types-zRGJdFGX.mjs";
4
+ import { A as InputApi, B as SpriteOptions, E as TextValue, F as NineSliceValue, G as Argument, J as IntlKit, K as Config$14, O as defineComponent, Q as TypedTr, R as ShapeValue, S as TextBind, T as TextStyles, U as TransformValue, V as SpriteValue, W as sprite, X as Part, Y as Message, Z as State$14, _ as Config$16, b as State$16, et as IsFlags, f as defineTokens, g as BindOptions, h as BindField, it as WhenFlags, j as State$15, k as Config$15, nt as Style, p as IntrinsicElementsFor, q as I18nApi, s as PopupComponent, tt as ResolvedStyle, v as CountdownValue, w as TextStyleInput, x as TextApi, y as Point } from "./types-CmuwAjkV.mjs";
5
5
  import { Log } from "@moku-labs/common/browser";
6
6
  import { PluginCtx } from "@moku-labs/core";
7
7
 
@@ -196,6 +196,10 @@ declare const assetsPlugin: import("@moku-labs/core").PluginInstance<"assets", C
196
196
  reason: "budget" | "request";
197
197
  keys: readonly string[];
198
198
  };
199
+ "assets:replaced": {
200
+ bundle: string;
201
+ keys: readonly string[];
202
+ };
199
203
  }> & Record<never, never>;
200
204
  //#endregion
201
205
  //#region src/plugins/audio/index.d.ts
@@ -1641,6 +1645,10 @@ declare const screen: readonly [import("@moku-labs/core").PluginInstance<"world"
1641
1645
  reason: "budget" | "request";
1642
1646
  keys: readonly string[];
1643
1647
  };
1648
+ "assets:replaced": {
1649
+ bundle: string;
1650
+ keys: readonly string[];
1651
+ };
1644
1652
  }> & Record<never, never>, import("@moku-labs/core").PluginInstance<"scenes", Record<string, never>, State$11, ScenesApi, {
1645
1653
  "scenes:changed": {
1646
1654
  from: string | undefined;
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { $ as DescriptionNode, $t as types_d_exports$9, C as types_d_exports$11, Ct as slot, Kt as types_d_exports$3, P as types_d_exports$16, St as exit, Tt as type, bt as types_d_exports$5, in as SaveUnreadableError, m as types_d_exports$1, mn as types_d_exports$8, wt as to, yn as types_d_exports$14 } from "./types-ZQLYXo5X.mjs";
2
- import { B as sequence, F as frames, G as stagger, H as sfx, I as haptic, J as wait, K as tween, L as mark, M as HAPTIC_KINDS, N as defineAnimation, O as types_d_exports, P as external, R as parallel, U as spawn, V as set, W as spawned, b as types_d_exports$12, f as types_d_exports$2, i as types_d_exports$15, k as HapticKind, q as use, z as play } from "./types-D_2G6Q68.mjs";
3
- import { a as types_d_exports$4 } from "./types-Bcdo5-2w.mjs";
4
- import { $ as types_d_exports$6, C as TextFormat, D as types_d_exports$13, H as Transform, I as Parent, L as Shape, M as types_d_exports$7, N as Display, O as defineComponent, P as NineSlice, W as sprite, d as popup, f as defineTokens, g as BindOptions, l as Box, u as LocalWrite, v as CountdownValue, z as Sprite } from "./types-BrTpz9oL.mjs";
5
- import { $ as defineFeature, A as Held, B as Traced, C as Animation, Ct as bind, D as load, E as defineBundles, F as Pressed, G as component, H as Layer, I as Swipeable, J as system, K as mut, L as Tappable, M as Pointer, N as PointerOver, O as Draggable, P as Pressable, Q as schedule, R as Touchable, S as AnimPlayer, St as Text, T as defineScene, Tt as label, U as Order, V as Exiting, W as Tree, X as guide, Y as tag, Z as hint, _ as defineStyle, _t as audioPlugin, a as defineEmitter, at as rendererPlugin, b as messageDuration, bt as projection, c as Alpha, ct as PlatformProvider, d as Displacement, dt as lifecyclePlugin, et as worldPlugin, f as Glow, ft as inputPlugin, g as resolve, gt as clockPlugin, h as music, ht as effectsPlugin, i as screen, it as scenesPlugin, j as Hovered, k as DropTarget, l as Blur, lt as types_d_exports$10, m as Outline, mt as flowPlugin, n as createPlugin, nt as timePlugin, o as Emitter, ot as platformPlugin, p as Noise, pt as i18nPlugin, q as resource, r as defineGame, rt as textPlugin, s as defineFilter, st as BackResult, t as createApp, tt as uiPlugin, u as ColorMatrix, ut as modelPlugin, v as tr, vt as assetsPlugin, w as Frames, wt as defineTextStyles, x as defineMotion, xt as Countdown, y as messageArgument, yt as animPlugin, z as Traceable } from "./index-rnOYAriI.mjs";
1
+ import { $ as DescriptionNode, $t as types_d_exports$9, C as types_d_exports$11, Ct as slot, Kt as types_d_exports$3, P as types_d_exports$16, St as exit, Tt as type, bt as types_d_exports$5, in as SaveUnreadableError, m as types_d_exports$1, mn as types_d_exports$8, wt as to, yn as types_d_exports$14 } from "./types-C6y8EfEB.mjs";
2
+ import { B as sequence, F as frames, G as stagger, H as sfx, I as haptic, J as wait, K as tween, L as mark, M as HAPTIC_KINDS, N as defineAnimation, O as types_d_exports, P as external, R as parallel, U as spawn, V as set, W as spawned, b as types_d_exports$12, f as types_d_exports$2, i as types_d_exports$15, k as HapticKind, q as use, z as play } from "./types-B3T2X6To.mjs";
3
+ import { a as types_d_exports$4 } from "./types-zRGJdFGX.mjs";
4
+ import { $ as types_d_exports$6, C as TextFormat, D as types_d_exports$13, H as Transform, I as Parent, L as Shape, M as types_d_exports$7, N as Display, O as defineComponent, P as NineSlice, W as sprite, d as popup, f as defineTokens, g as BindOptions, l as Box, u as LocalWrite, v as CountdownValue, z as Sprite } from "./types-CmuwAjkV.mjs";
5
+ import { $ as defineFeature, A as Held, B as Traced, C as Animation, Ct as bind, D as load, E as defineBundles, F as Pressed, G as component, H as Layer, I as Swipeable, J as system, K as mut, L as Tappable, M as Pointer, N as PointerOver, O as Draggable, P as Pressable, Q as schedule, R as Touchable, S as AnimPlayer, St as Text, T as defineScene, Tt as label, U as Order, V as Exiting, W as Tree, X as guide, Y as tag, Z as hint, _ as defineStyle, _t as audioPlugin, a as defineEmitter, at as rendererPlugin, b as messageDuration, bt as projection, c as Alpha, ct as PlatformProvider, d as Displacement, dt as lifecyclePlugin, et as worldPlugin, f as Glow, ft as inputPlugin, g as resolve, gt as clockPlugin, h as music, ht as effectsPlugin, i as screen, it as scenesPlugin, j as Hovered, k as DropTarget, l as Blur, lt as types_d_exports$10, m as Outline, mt as flowPlugin, n as createPlugin, nt as timePlugin, o as Emitter, ot as platformPlugin, p as Noise, pt as i18nPlugin, q as resource, r as defineGame, rt as textPlugin, s as defineFilter, st as BackResult, t as createApp, tt as uiPlugin, u as ColorMatrix, ut as modelPlugin, v as tr, vt as assetsPlugin, w as Frames, wt as defineTextStyles, x as defineMotion, xt as Countdown, y as messageArgument, yt as animPlugin, z as Traceable } from "./index-CdbE_jGs.mjs";
6
6
  export { Alpha, types_d_exports as Anim, AnimPlayer, Animation, types_d_exports$1 as Assets, types_d_exports$2 as Audio, type BackResult, type BindOptions, Blur, Box, types_d_exports$3 as Clock, ColorMatrix, Countdown, type CountdownValue, type DescriptionNode, Displacement, Display, Draggable, DropTarget, types_d_exports$4 as Effects, Emitter, Exiting, types_d_exports$5 as Flow, Frames, Glow, HAPTIC_KINDS, type HapticKind, Held, Hovered, types_d_exports$6 as I18n, types_d_exports$7 as Input, Layer, types_d_exports$8 as Lifecycle, LocalWrite, types_d_exports$9 as Model, NineSlice, Noise, Order, Outline, Parent, types_d_exports$10 as Platform, type PlatformProvider, Pointer, PointerOver, Pressable, Pressed, types_d_exports$11 as Renderer, SaveUnreadableError, types_d_exports$12 as Scenes, Shape, Sprite, Swipeable, Tappable, Text, type TextFormat, types_d_exports$13 as TextTypes, types_d_exports$14 as Time, Touchable, Traceable, Traced, Transform, Tree, types_d_exports$15 as Ui, types_d_exports$16 as World, animPlugin, assetsPlugin, audioPlugin, bind, clockPlugin, component, createApp, createPlugin, defineAnimation, defineBundles, defineComponent, defineEmitter, defineFeature, defineFilter, defineGame, defineMotion, defineScene, defineStyle, defineTextStyles, defineTokens, effectsPlugin, exit, external, flowPlugin, frames, guide, haptic, hint, i18nPlugin, inputPlugin, label, lifecyclePlugin, load, mark, messageArgument, messageDuration, modelPlugin, music, mut, parallel, platformPlugin, play, popup, projection, rendererPlugin, resolve, resource, scenesPlugin, schedule, screen, sequence, set, sfx, slot, spawn, spawned, sprite, stagger, system, tag, textPlugin, timePlugin, to, tr, tween, type, uiPlugin, use, wait, worldPlugin };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as sfx, A as types_exports$3, At as Noise, B as defineStyle, Bt as rendererPlugin, C as types_exports$10, Ct as effectsPlugin, D as types_exports$6, Dt as ColorMatrix, E as types_exports$7, Et as Blur, F as resolve, Ft as assetsPlugin, G as external, Gt as to, H as platformPlugin, Ht as flowPlugin, I as Box, It as animPlugin, J as mark, Jt as SaveUnreadableError, K as frames, Kt as type, L as LocalWrite, Lt as AnimPlayer, M as types_exports$1, Mt as defineFilter, N as types_exports, Nt as audioPlugin, O as types_exports$5, Ot as Displacement, P as uiPlugin, Pt as scenesPlugin, Q as set, R as popup, Rt as Animation, S as types_exports$11, St as messageDuration, T as types_exports$8, Tt as Alpha, U as HAPTIC_KINDS, Ut as exit, V as textPlugin, Vt as worldPlugin, W as defineAnimation, Wt as slot, X as play, Xt as timePlugin, Y as parallel, Yt as lifecyclePlugin, Z as sequence, Zt as clockPlugin, _ as types_exports$16, _t as Touchable, a as defineMotion, at as wait, b as types_exports$13, bt as i18nPlugin, c as schedule, ct as DropTarget, d as tr, dt as Pointer, et as spawn, f as defineFeature, ft as PointerOver, g as load, gt as Tappable, h as defineBundles, ht as Swipeable, i as screen, it as use, j as types_exports$2, jt as Outline, k as types_exports$4, kt as Glow, l as projection, lt as Held, m as music, mt as Pressed, n as createPlugin, nt as stagger, o as guide, ot as inputPlugin, p as defineEmitter, pt as Pressable, q as haptic, qt as modelPlugin, r as defineGame, rt as tween, s as hint, st as Draggable, t as createApp, tt as spawned, u as defineScene, ut as Hovered, v as types_exports$15, vt as Traceable, w as types_exports$9, wt as Emitter, x as types_exports$12, xt as messageArgument, y as types_exports$14, yt as Traced, z as defineTokens, zt as Frames } from "./src-SmT-XxVf.mjs";
1
+ import { $ as sfx, A as types_exports$3, At as Noise, B as defineStyle, Bt as rendererPlugin, C as types_exports$10, Ct as effectsPlugin, D as types_exports$6, Dt as ColorMatrix, E as types_exports$7, Et as Blur, F as resolve, Ft as assetsPlugin, G as external, Gt as to, H as platformPlugin, Ht as flowPlugin, I as Box, It as animPlugin, J as mark, Jt as SaveUnreadableError, K as frames, Kt as type, L as LocalWrite, Lt as AnimPlayer, M as types_exports$1, Mt as defineFilter, N as types_exports, Nt as audioPlugin, O as types_exports$5, Ot as Displacement, P as uiPlugin, Pt as scenesPlugin, Q as set, R as popup, Rt as Animation, S as types_exports$11, St as messageDuration, T as types_exports$8, Tt as Alpha, U as HAPTIC_KINDS, Ut as exit, V as textPlugin, Vt as worldPlugin, W as defineAnimation, Wt as slot, X as play, Xt as timePlugin, Y as parallel, Yt as lifecyclePlugin, Z as sequence, Zt as clockPlugin, _ as types_exports$16, _t as Touchable, a as defineMotion, at as wait, b as types_exports$13, bt as i18nPlugin, c as schedule, ct as DropTarget, d as tr, dt as Pointer, et as spawn, f as defineFeature, ft as PointerOver, g as load, gt as Tappable, h as defineBundles, ht as Swipeable, i as screen, it as use, j as types_exports$2, jt as Outline, k as types_exports$4, kt as Glow, l as projection, lt as Held, m as music, mt as Pressed, n as createPlugin, nt as stagger, o as guide, ot as inputPlugin, p as defineEmitter, pt as Pressable, q as haptic, qt as modelPlugin, r as defineGame, rt as tween, s as hint, st as Draggable, t as createApp, tt as spawned, u as defineScene, ut as Hovered, v as types_exports$15, vt as Traceable, w as types_exports$9, wt as Emitter, x as types_exports$12, xt as messageArgument, y as types_exports$14, yt as Traced, z as defineTokens, zt as Frames } from "./src-CltFFKtc.mjs";
2
2
  import { A as system, C as Exiting, D as component, E as Tree, O as mut, S as sprite, T as Order, _ as Parent, b as Transform, c as Text, d as defineTextStyles, f as label, g as NineSlice, h as Display, j as tag, k as resource, l as bind, s as Countdown, v as Shape, w as Layer, y as Sprite } from "./visual-dMW8iqAE.mjs";
3
3
  import { r as defineComponent } from "./flatten-BkXuscAV.mjs";
4
4
  export { Alpha, types_exports as Anim, AnimPlayer, Animation, types_exports$1 as Assets, types_exports$2 as Audio, Blur, Box, types_exports$3 as Clock, ColorMatrix, Countdown, Displacement, Display, Draggable, DropTarget, types_exports$4 as Effects, Emitter, Exiting, types_exports$5 as Flow, Frames, Glow, HAPTIC_KINDS, Held, Hovered, types_exports$6 as I18n, types_exports$7 as Input, Layer, types_exports$8 as Lifecycle, LocalWrite, types_exports$9 as Model, NineSlice, Noise, Order, Outline, Parent, types_exports$10 as Platform, Pointer, PointerOver, Pressable, Pressed, types_exports$11 as Renderer, SaveUnreadableError, types_exports$12 as Scenes, Shape, Sprite, Swipeable, Tappable, Text, types_exports$13 as TextTypes, types_exports$14 as Time, Touchable, Traceable, Traced, Transform, Tree, types_exports$15 as Ui, types_exports$16 as World, animPlugin, assetsPlugin, audioPlugin, bind, clockPlugin, component, createApp, createPlugin, defineAnimation, defineBundles, defineComponent, defineEmitter, defineFeature, defineFilter, defineGame, defineMotion, defineScene, defineStyle, defineTextStyles, defineTokens, effectsPlugin, exit, external, flowPlugin, frames, guide, haptic, hint, i18nPlugin, inputPlugin, label, lifecyclePlugin, load, mark, messageArgument, messageDuration, modelPlugin, music, mut, parallel, platformPlugin, play, popup, projection, rendererPlugin, resolve, resource, scenesPlugin, schedule, screen, sequence, set, sfx, slot, spawn, spawned, sprite, stagger, system, tag, textPlugin, timePlugin, to, tr, tween, type, uiPlugin, use, wait, worldPlugin };
@@ -1,10 +1,10 @@
1
- import { A as Api$1, At as FlowGraph, M as Explained, Mt as JournalEntry, S as Under, T as RenderStats, U as EntitySnapshot, W as FrameDiff, _t as Position, an as Snapshot, h as Api$2, p as Usage, qt as Api, t as Api$3, z as ComponentSchema } from "./types-ZQLYXo5X.mjs";
2
- import { a as AudioApi, r as UiApi, u as SoundEntry } from "./types-D_2G6Q68.mjs";
3
- import { n as EffectsApi, r as EffectsStats } from "./types-Bcdo5-2w.mjs";
4
- import { c as UiNode } from "./types-BrTpz9oL.mjs";
5
- import { t as HeadlessApp } from "./headless-G4nuZ-xz.mjs";
6
- import { a as InputOf, c as Source, i as InputArguments, l as WatchApp, o as InputSchema, t as CheatEntry, u as WatchInput } from "./types-DAdwEJMp.mjs";
7
- import { n as defineSource } from "./define-CCc0ozKe.mjs";
1
+ import { A as Api$1, At as FlowGraph, M as Explained, Mt as JournalEntry, S as Under, T as RenderStats, U as EntitySnapshot, W as FrameDiff, _t as Position, an as Snapshot, h as Api$2, p as Usage, qt as Api, t as Api$3, z as ComponentSchema } from "./types-C6y8EfEB.mjs";
2
+ import { a as AudioApi, r as UiApi, u as SoundEntry } from "./types-B3T2X6To.mjs";
3
+ import { n as EffectsApi, r as EffectsStats } from "./types-zRGJdFGX.mjs";
4
+ import { c as UiNode } from "./types-CmuwAjkV.mjs";
5
+ import { t as HeadlessApp } from "./headless-Dgxvp6Ym.mjs";
6
+ import { a as InputOf, c as Source, i as InputArguments, l as WatchApp, o as InputSchema, t as CheatEntry, u as WatchInput } from "./types-D57SntUt.mjs";
7
+ import { n as defineSource } from "./define-ZmWbWxon.mjs";
8
8
 
9
9
  //#region src/plugins/flow/doors/read.d.ts
10
10
  /**
@@ -1,2 +1,2 @@
1
- import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-B276Gg0s.mjs";
1
+ import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-6qakboTm.mjs";
2
2
  export { Fragment, type JSX, jsx, jsxDEV, jsxs };
@@ -1,2 +1,2 @@
1
- import { a as jsxs, n as JSX, r as jsx, t as Fragment } from "./runtime-B276Gg0s.mjs";
1
+ import { a as jsxs, n as JSX, r as jsx, t as Fragment } from "./runtime-6qakboTm.mjs";
2
2
  export { Fragment, type JSX, jsx, jsxs };
@@ -1,4 +1,4 @@
1
- import { Xt as Json, nn as ProviderCall, rn as SaveDoc, tn as PlayerStateProvider } from "./types-ZQLYXo5X.mjs";
1
+ import { Xt as Json, nn as ProviderCall, rn as SaveDoc, tn as PlayerStateProvider } from "./types-C6y8EfEB.mjs";
2
2
 
3
3
  //#region src/plugins/model/store/providers/memory.d.ts
4
4
  /**
package/dist/project.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { S as readInside, _ as declaredFunctions, a as reindexPath, b as unwrap, c as definerOfCall, d as sha1, f as definersOf, g as holeOf, h as hasHole, i as openSession, l as JSX, m as HOLE, n as createHub, o as serialize, p as collectJsx, s as parseCached, u as jsxShapes, v as propertyNameOf, y as propertyOfValue } from "./watch-CB8IWDBi.mjs";
1
+ import { S as readInside, _ as declaredFunctions, a as reindexPath, b as unwrap, c as definerOfCall, d as sha1, f as definersOf, g as holeOf, h as hasHole, i as openSession, l as JSX, m as HOLE, n as createHub, o as serialize, p as collectJsx, s as parseCached, u as jsxShapes, v as propertyNameOf, y as propertyOfValue } from "./watch-CWI_on4T.mjs";
2
2
  import { createBrandConsole } from "@moku-labs/common/cli";
3
3
  //#region src/project/locate.ts
4
4
  /** The kind of a style key. */
@@ -1,4 +1,4 @@
1
- import { a as JsxChild, m as UiIntrinsicElements, t as DescriptionNode } from "./types-BrTpz9oL.mjs";
1
+ import { a as JsxChild, m as UiIntrinsicElements, t as DescriptionNode } from "./types-CmuwAjkV.mjs";
2
2
 
3
3
  //#region src/plugins/ui/jsx/runtime.d.ts
4
4
  /** What the compiler passes as props: the children plus whatever the tag declared. */