@descix/frqtl-node 0.6.0-p4.1 → 0.6.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 (63) hide show
  1. package/CLAUDE.md +2 -2
  2. package/README.md +5 -3
  3. package/dist/dist-manifest.json +58 -54
  4. package/dist/fat/pkg-node/package.json +2 -10
  5. package/dist/frqtl/compat/providers/wasm-engine.js +3 -4
  6. package/dist/frqtl/compat/renderer/providers/p5-provider.js +1 -1
  7. package/dist/frqtl/objects/FrqtlApp.js +5 -5
  8. package/dist/frqtl/objects/RecipeContext.js +106 -1
  9. package/dist/frqtl/objects/constants/WallBehaviors.js +1 -1
  10. package/dist/frqtl/objects/instruments/capture.js +1 -24
  11. package/dist/frqtl/objects/instruments/hosted-eyes.js +17 -1
  12. package/dist/frqtl/objects/objects/makeControlsForObject.js +5 -5
  13. package/dist/frqtl/objects/record/Record.js +25 -5
  14. package/dist/frqtl/objects/schema/engine-scopes.js +2 -2
  15. package/dist/frqtl/objects/schema/scopes.js +2 -2
  16. package/dist/frqtl/objects/setup/_worldInit.js +1 -2
  17. package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +1 -2
  18. package/dist/frqtl/parts/CameraControls.js +8 -0
  19. package/dist/frqtl/parts/DetectorWall.js +1 -1
  20. package/dist/frqtl/parts/GraphingDetectorWall.js +7 -7
  21. package/dist/frqtl/parts/LargeObject.js +2 -2
  22. package/dist/frqtl/parts/LiveChart.js +2 -2
  23. package/dist/frqtl/parts/LogicGate.js +3 -3
  24. package/dist/frqtl/parts/OvenBox.js +1 -1
  25. package/dist/frqtl/parts/PointSource.js +1 -1
  26. package/dist/frqtl/parts/SlitLightSource.js +1 -1
  27. package/dist/frqtl/parts/SlitScreen.js +1 -1
  28. package/dist/frqtl/parts/SphereEmitter.js +12 -12
  29. package/dist/frqtl/parts/Trace.js +1 -1
  30. package/dist/frqtl/parts/Tunnel.js +11 -11
  31. package/dist/frqtl/parts/Wall.js +20 -10
  32. package/dist/frqtl/scenes/circuit-sat.js +1 -0
  33. package/dist/frqtl/scenes/dse-one-emitter.js +32 -34
  34. package/dist/frqtl/scenes/dse-two-emitters.js +33 -34
  35. package/dist/frqtl/scenes/mirror-route.js +96 -79
  36. package/dist/shim/bundle/index.js +6 -0
  37. package/dist/shim/controls/index.js +1 -1
  38. package/dist/shim/engine/artifact-shell.js +1 -1
  39. package/dist/shim/engine/router.js +3 -3
  40. package/dist/shim/host/host-view.js +228 -0
  41. package/dist/shim/host/index.js +18 -0
  42. package/dist/shim/index.js +2 -4
  43. package/dist/shim/notebook/kernel.js +1 -1
  44. package/dist/shim/notebook/setup-builder.js +2 -2
  45. package/dist/shim/package.json +1 -0
  46. package/dist/shim/page-params/index.js +2 -30
  47. package/dist/shim/project/fork.js +293 -0
  48. package/dist/shim/project/identity.js +3 -1
  49. package/dist/shim/project/link.js +43 -3
  50. package/dist/shim/project/parts-writer.js +62 -5
  51. package/dist/shim/project/read-text.js +43 -0
  52. package/dist/shim/project/specifiers.js +104 -15
  53. package/dist/shim/registry/exhibits.js +15 -34
  54. package/dist/shim/registry/index.js +2 -2
  55. package/dist/shim/registry/scene-roster.js +35 -0
  56. package/dist/shim/registry/scene-source.js +6 -36
  57. package/dist/shim/registry/walkthrough.js +2 -3
  58. package/dist/shim/render-state/apply.js +66 -31
  59. package/dist/shim/render-state/index.js +6 -2
  60. package/dist/shim/runtime/index.js +4 -4
  61. package/llms.txt +4 -3
  62. package/package.json +19 -1
  63. package/dist/shim/registry/experiments.js +0 -215
package/CLAUDE.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  A discrete cellular-automata physics engine (compiled Rust → WASM) for node: the same modules as
4
4
  `@descix/frqtl-web` (one source, built twice), plus the node engine door `bootNode` and the hosted eyes.
5
- Pre-release `0.6.0-p4.1` (npm dist-tag `next`). Node ≥ 22.12.
5
+ `0.6.0` (npm dist-tag `latest`). Node ≥ 22.12.
6
6
 
7
7
  ## Install
8
- npm install @descix/frqtl-node@next
8
+ npm install @descix/frqtl-node
9
9
 
10
10
  ## Rung 0 — the seven primitives
11
11
  ```js
package/README.md CHANGED
@@ -4,11 +4,11 @@ FRQTL for node: a discrete cellular-automata physics engine (compiled Rust → W
4
4
  local per-pixel rules — a frame moves one pixel per tick, single occupancy, momentum — rather than force
5
5
  equations. Interference, blackbody spectra and atom-like binding emerge from the automaton.
6
6
 
7
- Pre-release `0.6.0-p4.1` (npm dist-tag `next`). Node ≥ 22.12.
7
+ `0.6.0` (npm dist-tag `latest`). Node ≥ 22.12.
8
8
 
9
9
  ## Install
10
10
 
11
- npm install @descix/frqtl-node@next
11
+ npm install @descix/frqtl-node
12
12
 
13
13
  ## Rung 0 — the seven primitives
14
14
 
@@ -32,10 +32,12 @@ const tick = u.doTick(); // TickData: fr
32
32
  | `./eyes` | `openHostedEyes` — a `composite` still through the REAL renderer, in a managed headless browser (pulls the pinned `playwright`) |
33
33
  | `./parts`, `./parts/*` | the parts barrel; one part = one file |
34
34
  | `./project` | `FRQTL_WEB_SPECIFIERS`, `libPathOf`, `importMapFor`, `pageImportMapFor`, `FRQTL_WEB_HOST_SPECIFIERS`, `linkProject`, `sketchProject`, `SKETCH_ENTRY`, `projectIdentity`, `MANIFEST_FILE`, `MANIFEST_KEYS`, `normalizeManifest`, `parseManifest`, `serializeManifest`, `manifestFor`, `RECORD_FILES`, `RECORD_KEYS`, `CHANGE_KEYS`, `OPS`, `BY`, `CLIP_SECONDS`, `CLIP_NAME`, `clipName`, `jsonText`, `recordFolderFaults` |
35
- | `./registry` | the walk-through rungs, the showcase roster, the experiment registry, `projectOf` |
35
+ | `./registry` | the walk-through rungs, the showcase roster, the scene list (`sceneGroups`), `projectOf` |
36
36
  | `./kinds` | `registerKind`, `kindNamed`, `kindOf`, `registeredKinds` |
37
+ | `./host-view` | `declareHostView`, `HOST_VIEW_OUTCOMES`, `CONTRACT_VIOLATIONS`, `HOST_SDK_SCRIPT` — the DeSciX host-view declarer (pure: a node test can drive a call site with a stub SDK) |
37
38
  | `./register` | installs the resolve hook for a sketch's `@descix/frqtl-web/...` imports (`node --import @descix/frqtl-node/register`) |
38
39
  | `./shim/controls/registry.js`, `./shim/render/sun-look.js`, `./compat/renderer/display-slot.js`, `./compat/renderer/orbit-bag.js`, `./objects/setup/_collisionMatrixLanes.js`, `./compat/engine.js` | the six non-part modules a scene may import (the rows of `FRQTL_WEB_SPECIFIERS`) |
40
+ | `./objects/objects/tagger.js`, `./objects/schema/index.js`, `./shim/render/heat-colormap.js`, `./objects/schema/valueNormalizer.js`, `./objects/objects/Box.js`, `./objects/objects/QuantumEmitter.js`, `./shim/expr/ast-schema.js`, `./objects/objects/actionCompiler.js`, `./objects/v1-replacements.js`, `./objects/objects/slitLinerScatter.js`, `./objects/setup/setupSphereEmitter3D.js`, `./objects/objects/directedRedirectProgram.js`, `./compat/renderer/lo-drawn-center.js`, `./objects/setup/setupTunnelPointExit.js`, `./objects/constants/WallBehaviors.js`, `./objects/objects/absorbRadiation.js`, `./objects/geometry/SlabFace.js` | the 17 part-internal modules a forked part file imports (the `tier: 'part-internal'` rows of `FRQTL_WEB_SPECIFIERS`): not a scene API — the linker admits them only from a `parts/*.js` file — and they move with the parts |
39
41
  | `./dist-manifest.json` | sha256 of every dist file |
40
42
 
41
43
  These modules are the same files `@descix/frqtl-web` ships (one source, built twice).
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@descix/frqtl-node",
3
- "version": "0.6.0-p4.1",
3
+ "version": "0.6.0",
4
4
  "files": {
5
5
  "eyes/index.js": "b3563421030bb7fdd277eb697959fbe9107463cbb5478160edc7d887daa67be3",
6
6
  "fat/pkg-node/egpt_wasm.js": "5e6af1f6725c93c0e9ad7386f1785cbe639ce596a4caa19ca85729c1f2bea04d",
7
7
  "fat/pkg-node/egpt_wasm_bg.wasm": "e204498ac7439c294653476c0d214345713e6170819281b27bbbcba217a5a5e9",
8
- "fat/pkg-node/package.json": "a0c04cd40b60be10e9ddd6e1d4763fd578808321d663c6d4201530e2a4ebdba4",
8
+ "fat/pkg-node/package.json": "82d346be94b2d9f7e30b1b679c8a5e795cec838764d28727919f85a982d9911f",
9
9
  "frqtl/assets/vendor/acorn.LICENSE": "76a876cf886ff9be2a8b5e2e86514fed06223c8c9f0c1e9ee9606e93841e00b7",
10
10
  "frqtl/assets/vendor/acorn.PINNED.json": "52d5c4cf628a586aec54f780ab6b8d22ae7c22cfb290d0d86c2f589f3106b101",
11
11
  "frqtl/assets/vendor/acorn.mjs": "efb0124a960b34d53f9928c4926bfcfd300bb6a3d7ab64ee949b3a8bed1c7e5f",
@@ -13,7 +13,7 @@
13
13
  "frqtl/compat/boot-node.js": "7cfd4645f965fa3e3d3072688b268a8aa5b8b4d727c7d842d3bad841dacd1194",
14
14
  "frqtl/compat/engine.js": "a849144e80f93694290f4567fa78d09c88b277162be9f1c15ab820328690c3a4",
15
15
  "frqtl/compat/package-root.js": "9ff4b6bc958c524b5084f849c811f1491a788afc99cab81cd281add02316ff83",
16
- "frqtl/compat/providers/wasm-engine.js": "020b36623a66a6298fd1b7b7a3db549f6ab957c91526dbe99f4069e4583dd757",
16
+ "frqtl/compat/providers/wasm-engine.js": "37c91b5a42c14ad82c0cf10d46e4a10bb8d1e2e553aee59052b6267d1b03fe79",
17
17
  "frqtl/compat/providers/wasm-load-browser.js": "990a8e22f365f3d32ee8d448965a23cc85ebf62b321ee55417e500bfd5ad7f2d",
18
18
  "frqtl/compat/providers/wasm-load-node.js": "0ec1d50e204bf073caac5218b3007eff65c480a94c8d87ad567a6d80b6b6c435",
19
19
  "frqtl/compat/renderer/FieldBuilder.js": "af30df8b04ee05a006882eb8cb56ff84e76142348339d039296304877770c519",
@@ -28,7 +28,7 @@
28
28
  "frqtl/compat/renderer/orbit-bag.js": "b6671d3b35fcf5f79e228934a8032e729309e62b66920602f34c834f3f911681",
29
29
  "frqtl/compat/renderer/providers/godrays-layer.js": "be76fb8e69c74dd9bd0fb9aa6189a816d0ed29b9f4e04b60277be375b93d606c",
30
30
  "frqtl/compat/renderer/providers/index.js": "fa669158a082a0081125c81694ca79962639caf86a575ee198a815f3e13a19e7",
31
- "frqtl/compat/renderer/providers/p5-provider.js": "16d93e087643547f778b5455c2be71f48324d9d281a2a162a201a1a71d2bb703",
31
+ "frqtl/compat/renderer/providers/p5-provider.js": "39aa68c2232b123ed52ca235f264cfb57993f46a41d4b0ed8139bffbac2f64ac",
32
32
  "frqtl/compat/renderer/providers/three-camera-contract.js": "644c1cc5e381cd2af897e69762216f84716808eeb5948efb989f48c47696bc60",
33
33
  "frqtl/compat/renderer/providers/three-camera-geometry.js": "a741f72c34005fc47fb4d53cc7ef2d2df4bfa7e8eecc9a0252b1083b3d5e301a",
34
34
  "frqtl/compat/renderer/providers/three-provider.js": "08410c488dcf3290d0a950331f33d8ba6882a391308d4d4598d9cb9aa96a4c9a",
@@ -38,15 +38,15 @@
38
38
  "frqtl/compat/vendor.js": "2393ada71cdbe750d409174e1ba9b098148796efdff746b315d706a0b32e58e8",
39
39
  "frqtl/experiments/_shared/boot-failure.js": "1a92e85b06acdefede5613f2fac7cd4e61d2aba590820f1bfa92f6829fcbbdd4",
40
40
  "frqtl/node-entry.js": "a401039b4fcf53ac620edbd80985aa4448122f2e3caaeaf4d5595f5e9d512b60",
41
- "frqtl/objects/FrqtlApp.js": "0537a6e6b71fc763e92404952263d3bef4dbf273c86d45c5609ee72e69a30a56",
41
+ "frqtl/objects/FrqtlApp.js": "e3232b09eb576427df2a52393a5603b4c084d6edba5667b03afb161fd6d76b9b",
42
42
  "frqtl/objects/ObjectFactory.js": "a8f050ce61b7ab9c9b4f81e9eeaebf05c3cc0b532c741ce93d6e952489772b11",
43
- "frqtl/objects/RecipeContext.js": "b21ca03f799a28848b190834274c061f6dde7fa7f3d17e5eac015550db90d8d7",
43
+ "frqtl/objects/RecipeContext.js": "c8614d30b785b333c44a59f0a6bdd15a595dd0023f85ef9385f40eda5802eba8",
44
44
  "frqtl/objects/collectors/DataCollector.js": "8736d6cb77eec36ce2adcf2bc3b0d2436eeb70a73b77182ff053efdc6ca071df",
45
- "frqtl/objects/constants/WallBehaviors.js": "8a9cbdb96eadf84f1d61d215f6921124ec5dbf9e2938c09894a0aa083ddcaea0",
45
+ "frqtl/objects/constants/WallBehaviors.js": "a05c6e06923962e2cc2cf7204131e5d20bf83c5c8e85fbb13867872040345e40",
46
46
  "frqtl/objects/geometry/SlabFace.js": "847921b124d3bc1692e88c363c087d392a1baa7c652a3a61e381d0f8a8342e57",
47
47
  "frqtl/objects/instruments/capture-host.js": "ba5001afa2d8f4e438c5eacb2a5456d903401de8584d170c0b02ff3014794edd",
48
- "frqtl/objects/instruments/capture.js": "53a746cb51e1c83326eebaa98083861c7ee593f2bcb2317473446a1a02b59b5c",
49
- "frqtl/objects/instruments/hosted-eyes.js": "0d70708546f2e5917deb0a5638a535d7822f2141d69595db406cb0e074225883",
48
+ "frqtl/objects/instruments/capture.js": "6bee2bc3928f0c12d1c87b30ce461ca5ba74cbedb4c36d43f0a3061021753f83",
49
+ "frqtl/objects/instruments/hosted-eyes.js": "fc99fa3f5f1780b7f2fe66a2a3f1f6db35d5d60f1c0a5a8b36a56e49c2b4efac",
50
50
  "frqtl/objects/kinds-entry.js": "a7818357864dc900bd93350635016f938c3dca8dcb665a62df802ba5cd0b3c93",
51
51
  "frqtl/objects/kinds.js": "107b166c96c93fd517f173fdbe7006d6f0b2694d5f799f7ec9d4f695313f1832",
52
52
  "frqtl/objects/objects/Box.js": "0c08fa4753b78ef56d07aae3393a6268647b550ead58e409cff13eabc8b34b5d",
@@ -68,22 +68,22 @@
68
68
  "frqtl/objects/objects/frqtl-control-sync.js": "88de12d2ec1643b4afc2ef56ea8cc44e1213e4a73a0ad6876d59e988125c3789",
69
69
  "frqtl/objects/objects/frqtl-control-widgets.js": "73dd1e4481af66430601a105d375749c6db0bc9d736e47bd0edea9a4f9e6871c",
70
70
  "frqtl/objects/objects/frqtl-control-write-queue.js": "994d0e736f240c453fd8ab52ea6d1eed05ac27a160806037d751f4a6a6ce6295",
71
- "frqtl/objects/objects/makeControlsForObject.js": "f565f16e6c29b931e2a4625a68fec3f49bbceee73ea0d76573dd3e33fdffe066",
71
+ "frqtl/objects/objects/makeControlsForObject.js": "a3e51c526228f99ddfd10f7902fbb4dc67979726257bff131bb1d061425dbf51",
72
72
  "frqtl/objects/objects/makeControlsForRenderSurface.js": "0ba99a4106ad92c0fe9366d6610c31d60ebfa232b3552c05f68f9c5aa56c03a0",
73
73
  "frqtl/objects/objects/slitLinerScatter.js": "9413cc7efa2132c68d7b4d5030af28d92e8d085e127d5c8e1568d0028da2fc13",
74
74
  "frqtl/objects/objects/sustainedSource.js": "0c324cef1583226d090b4d1014c2576ef8237f1bad47c1511bed3c3f81e04206",
75
75
  "frqtl/objects/objects/tagger.js": "e2a5ef9ae68466afb6b157ca6d7ce03a6f126d8c91c9f9d4be6dba8e928535eb",
76
- "frqtl/objects/record/Record.js": "7dce4e1ac5b5ab842fac9f6c9d754322b3696afb7b774e8c2ac018f803a780a6",
76
+ "frqtl/objects/record/Record.js": "5555c62e278654d1d54e2e3d89da4100de2d0ccae9563e62dfe4082ec7b543ba",
77
77
  "frqtl/objects/record/open-record.js": "2da2abcccd3ad5bc39eb7fcfb764601cd031dd0afa9b3c9cb96b0669621827df",
78
- "frqtl/objects/schema/engine-scopes.js": "1777dd3d2443df7c7d7fbcd25974bcb758606bdf3efa5c21408009167d00e3e6",
78
+ "frqtl/objects/schema/engine-scopes.js": "d9d07914f748f9e7f86cc68e4d49da3b07d2bce37fea5280a88e6862ef3bb619",
79
79
  "frqtl/objects/schema/index.js": "74ba0b6a6e057cfd40edf2ce41fcce7206c0204e90eeee4a8db3b711f10ffd33",
80
- "frqtl/objects/schema/scopes.js": "3b9c2d4f20604d6384ec625ab5e4a38085fa9696c5e443ff66b45a8f2330c5f6",
80
+ "frqtl/objects/schema/scopes.js": "11c17ea958fd1cc1107d83284148fa45faa803af4b239440b56c0705f700569e",
81
81
  "frqtl/objects/schema/validate-descriptor.js": "32572a7c7f5262a46d13bcd05424555151287c4438e3e081ab2f3884fd5a2f10",
82
82
  "frqtl/objects/schema/valueNormalizer.js": "00dc4eb188f23964336d45de021846b63a3603c423b5444f132bf470c73c4354",
83
83
  "frqtl/objects/setup/_collisionMatrixLanes.js": "e5184a9e690e677bc941cce113f2d3d5c51de41d8322515fc707f5414c7b81be",
84
84
  "frqtl/objects/setup/_setupOptions.js": "bc9bff3c647418db452976b54e9f91474c59abf5acbde1d62747a11a9501cca0",
85
- "frqtl/objects/setup/_worldInit.js": "fb9b3716f93415100581e1bd12c8170d28c1d1cbda2e5236530598b197d7fdb3",
86
- "frqtl/objects/setup/setupBlackbodySubstrate.js": "eb69b5bd1e19a970b433beed3e68ce47fffe63c17bf6045b49ce776045e20fe3",
85
+ "frqtl/objects/setup/_worldInit.js": "636eb9610f0d446d7c8d660c322d31cdaaae2a35546549f92572751414ad604b",
86
+ "frqtl/objects/setup/setupBlackbodySubstrate.js": "c23b397dca46e0c30dfb50148f545a3d634e43452e3aa4d29188327d3d730705",
87
87
  "frqtl/objects/setup/setupCircuitBasic.js": "8204f7d42f8dd888e6a4e1175b16a6e67b69fb2d943af6c2b40c900b905dd453",
88
88
  "frqtl/objects/setup/setupCollisionMatrix.js": "5df3b6c93a5b1fc5f8c0a443c1d3e0003ef170bb39b6101e60b4f3017ec26f60",
89
89
  "frqtl/objects/setup/setupConeEmitter3D.js": "284d5353857817e5821d6c3897ba15b22f32388971ae149094e1353f15f0a4d6",
@@ -105,49 +105,49 @@
105
105
  "frqtl/objects/setup/setupWaveInterference.js": "b74e1406580a0bd2749686f87f9eec929e3e33c2fe6a7648cdaa2a26449e4fc1",
106
106
  "frqtl/objects/v1-replacements.js": "7be6910430fcfbbe39db2a60b991b9c0b3ded9a8c05295060107042cee6bc201",
107
107
  "frqtl/package-core.js": "4e645a91edf27f9631dd97aeafc72b11c06a7fbfc0f435d194f4635da872f6d7",
108
- "frqtl/parts/CameraControls.js": "22438f83b02004772586dc99009fb025cdf2680b7c23e9023207f58e4fafca13",
108
+ "frqtl/parts/CameraControls.js": "c31a42296256703c5d06098b1dfb548d2ad5b39de0485fb9cff71ea777a5cc7f",
109
109
  "frqtl/parts/CameraPath.js": "bf5d620b2789c76b5a79c092ae0a3dc802fa6ef28a05df2ed1935481d4bba636",
110
110
  "frqtl/parts/CollisionActions.js": "c14c7257fa8bf2add3784dfff0e78a4098640a5a8cec4b40c7cb60ba3197f3a2",
111
111
  "frqtl/parts/CollisionTypes.js": "3290b8caf557c2801d3e0a8400d7cfd0cc9cbd14ae4247707747dc109a658789",
112
- "frqtl/parts/DetectorWall.js": "49d9d9526b5e36180122617dd84b16e44624eee76fb2d547868e8cd41eeacbe0",
112
+ "frqtl/parts/DetectorWall.js": "d39ab88056fa28c322863430f8bad9704879e5d8149f1ac65adf1add057996f5",
113
113
  "frqtl/parts/FrqtlControlOverlay.js": "f862b1529265224aa96878b56b0c1c6e65683ba3fd6b517df86e17e92147f9c4",
114
114
  "frqtl/parts/FrqtlControlsPanel.js": "792d03dea218bdc335ba7e04362be620edbfa331bed9de087d61942299728cc1",
115
115
  "frqtl/parts/FrqtlVision.js": "118d0874249fa55783b196fd01297b3347951267a4add93381433a72c46e8622",
116
- "frqtl/parts/GraphingDetectorWall.js": "6bff06f951459a3cd327c2eb235d159520933762be0343e1925d153fc2fe6423",
117
- "frqtl/parts/LargeObject.js": "637ea4c4b5052b916dace520cbb6772f1f8f2e367764ea399dab2a74fff4ed65",
116
+ "frqtl/parts/GraphingDetectorWall.js": "83aba36a6a6c15f92c99bbe5d7e63b12b38e07be65e02e89020c065514ef5b3d",
117
+ "frqtl/parts/LargeObject.js": "d6cae738b30965f3eba4be4399fb4410f17afc3267b51e3ad9e1ba7423e17922",
118
118
  "frqtl/parts/LightColor.js": "8637e5a09bbad3a4fdd2034ccb44dfc1fda743e29b12b4c685a64b9e1df28daa",
119
- "frqtl/parts/LiveChart.js": "16fc591c02064dc2a9ea99737acbacac1e3b6c8d90079bf260d58af3016ded02",
120
- "frqtl/parts/LogicGate.js": "e21a6f030908bbcfacc9bb27e4d20cdbbb54c712034121981bdc97c6266c1d0e",
121
- "frqtl/parts/OvenBox.js": "c72f4dad019e60a300c9c96f64caf88b89a0f6dda07b06ad4189edfd3779ca54",
122
- "frqtl/parts/PointSource.js": "a43a6c13ea8ecadc09410ca19067a41de7164aa8a2f58547dc227a1efd4bf0b5",
119
+ "frqtl/parts/LiveChart.js": "8bd0b862d2f7a4e818ae9cfc47e5e0f56eb97ea0a00fb836bba3f2374c12a1ce",
120
+ "frqtl/parts/LogicGate.js": "05716711db1794ce9e29027ea16af083e5a1cc8b0657dce853cb6d2f6ee1fc02",
121
+ "frqtl/parts/OvenBox.js": "7e393dd736c6ae410d85e5fe3edbea8677e5834bd1fe7b19d4e8f46af13764ac",
122
+ "frqtl/parts/PointSource.js": "57b3b8353cba8c5ebfff6653e39948c9f0ee240449b4af08247687d3d9d9f092",
123
123
  "frqtl/parts/Rectangle.js": "8be4cae13135c3cb185d025dfd10d3a03b21d5627bfa92363c2faa021f751571",
124
- "frqtl/parts/SlitLightSource.js": "86472f096a1f1aa19c6e5d39657eed0f99df117f86152c51cdf84a56342903f7",
125
- "frqtl/parts/SlitScreen.js": "147b86b39128b245c51649f3ac66f31afae128a01e1ac30083ef252b569db75d",
126
- "frqtl/parts/SphereEmitter.js": "4163751c331aca9b45643ce67eb7e8912ffdbdb3cbd6944e9ae38f707eb0b5ca",
127
- "frqtl/parts/Trace.js": "63944f420b6538a88609a1f251b5f5d909ac9835f556d82f73525077ba6a6df6",
128
- "frqtl/parts/Tunnel.js": "4f44e901bc1171bf7c2933c794a8be63702594d7a2babc05382e91c22315b363",
129
- "frqtl/parts/Wall.js": "37ab904fdd8fa4d786c27af17d4563f0ccd0eee037d6f7c8b24fd8333058286e",
124
+ "frqtl/parts/SlitLightSource.js": "89a17aaade03e2e961af4181e6c3fd479d31c2c3298c46abc477a13f26d7a07a",
125
+ "frqtl/parts/SlitScreen.js": "bdcaa761d0aa68c415a06ab2c523a8d4553a4c48cee00fe33d5df994adcf599a",
126
+ "frqtl/parts/SphereEmitter.js": "645664f5a20924b777d9b4ad6fef6338e7de251d62c7f8a4c93e6b0f97b47d4a",
127
+ "frqtl/parts/Trace.js": "f9d91bb9435bc5fabfd7bfdbfbf3f3ae34e2338090251d9e9d6c11abc2ed25fb",
128
+ "frqtl/parts/Tunnel.js": "66bfca3d3d88ebf9a8cb7aa248b92cfc7d78a278449830b03e6b2700a21df891",
129
+ "frqtl/parts/Wall.js": "7dcb520daee3facad8698b363bb49557003439dc5841706b105bd1acabc2e0bf",
130
130
  "frqtl/parts/index.js": "70b8e227e09663889f4c7942d385f843d977579765723f829880fd6e9868ac53",
131
131
  "frqtl/scenes/absorbing-wall-3d.js": "722bb433142833f03150052b95039686aba0d9db510a5ff13fad95b5f17e0cf8",
132
132
  "frqtl/scenes/absorbing-wall.js": "0a47ca64e56481841339cd5882cf0e54ec7c14d87a4306d016ead1ff26591197",
133
133
  "frqtl/scenes/atomic-model.js": "1b484ba37d90af9c06d9bf6a114b8867c914d12cc0a0dbeec27dd96230829fac",
134
134
  "frqtl/scenes/big-bang.js": "e0807d81f4bcc6626080f81d472c6ead9c8d8f7d97bd67c6da76a476868b25f4",
135
135
  "frqtl/scenes/blackbody.js": "bdd6ee3c628f0cf1161eeb855a4a582902ab56174da937bf0d5180d930ef8278",
136
- "frqtl/scenes/circuit-sat.js": "953b19d0e5fbda0b36b7e42bda1538930578220c610a5591e0dc1b5e8f2bb06b",
136
+ "frqtl/scenes/circuit-sat.js": "db69468352e955b4ff9c36e8d3cf03cc3e88d368b6d3cc485d664bb5cb085d57",
137
137
  "frqtl/scenes/collision-matrix-3d.js": "8a0c1189d5e2f23092b216515608319643bc010ff837aadffdf84b2078c96793",
138
138
  "frqtl/scenes/counting-wall-3d.js": "1d08e60d58faeed4315400a2d0fbc10460d7869babc72a8dd7f906b5dff6ba54",
139
139
  "frqtl/scenes/counting-wall.js": "35b617a20c154f89c63d4a60a205f5d67ba8bb3342730e269528f884a522f131",
140
140
  "frqtl/scenes/double-slit.js": "d37aff36667783fe5991b8219439803facb730bd0abe9219483f2ef42056e988",
141
- "frqtl/scenes/dse-one-emitter.js": "58cfb0e55fd54d86e1896088d36c65748499c0b94826a1c6b1b6d81b7fa41437",
141
+ "frqtl/scenes/dse-one-emitter.js": "619892663838e0f018b9ade83c9994fb0709b9ed9904c92e41470a7b7fdd396f",
142
142
  "frqtl/scenes/dse-one-slit.js": "7bf299e3cc64dd3d1f8df805eec63d98d36b8592d55e3ef478d46c38bf674812",
143
143
  "frqtl/scenes/dse-photoelectric.js": "e0402c4508a4d97d3d9461f889b10a49da82ef5f232d81455c5e482db8b0bda6",
144
144
  "frqtl/scenes/dse-tunnel-rebuild.js": "c662bff31fb66c1f136b6f35d18943c58e97456b61fbab9f4cdb812e3acb2630",
145
- "frqtl/scenes/dse-two-emitters.js": "193575e850bc49d0db2e01974584b8100020ba466d39f1a9b0f121812f245f08",
145
+ "frqtl/scenes/dse-two-emitters.js": "74cf1d4b226b0ce4e337697a0327de9b95190159b2554f53e629d89525321877",
146
146
  "frqtl/scenes/dse-two-slits.js": "f303a848d9c463a5a9443c380b257795b19127b122bdd2fcb28855841b219939",
147
147
  "frqtl/scenes/empty.js": "f3c2161f7bbc1be2d7fba0f117ac16b9e60966d9448877ead4037e3cb4fee678",
148
148
  "frqtl/scenes/laser-buildup.js": "f4b29b2eeeca730642f5adf2f499f6594b73f6e51ba6aa9a237f4ee643c5cf23",
149
149
  "frqtl/scenes/mirror-3d.js": "79ac794dfbc608037936908a9fe58ca34be93be6263d5940bb38129d55bb7943",
150
- "frqtl/scenes/mirror-route.js": "1206b981a8d4eb3ab75985a4ae119adab5eed66026eebf2ad6036905bedbd746",
150
+ "frqtl/scenes/mirror-route.js": "007af9eb382a1392eb22b6d81f7c3e40bffe7ba6ac53363ce7726ccb62b838c4",
151
151
  "frqtl/scenes/mirror.js": "c7bcd440e9a78e333fd81d906b3788a62342910f46cf98de860098fcc1e0ba91",
152
152
  "frqtl/scenes/omni-3d.js": "d420a7aae9fdfd394b9288ce1f0256416e1b07f70bc570a928a4592c32a47c27",
153
153
  "frqtl/scenes/omni-source.js": "4f9aaa0e0ccbf4d18908d1628688dbeae376b535318f0cf969d61d8ea8f90b83",
@@ -157,65 +157,69 @@
157
157
  "frqtl/scenes/sun.js": "fa06cac429af5a2ad4fe846969a7bf763f2a76d9d9b169328cd1f45bad6bda8f",
158
158
  "frqtl/scenes/two-source.js": "1444a0e503f4a5e349d4364e31e698bc67d723a4b2864f262603e75ba5f9f088",
159
159
  "frqtl/scenes/wave.js": "cabbece84daceca9199bbea22be610281bdf3137c8c5724bc601758e711f111f",
160
- "shim/bundle/index.js": "ea7891e417a929e2b90dc8337750d247a355f84f7f581cf361d4bc8f473d42b5",
160
+ "shim/bundle/index.js": "edc501a039ce47102657604df71fbc17ba3e4760ca087055351231c7469f5c50",
161
161
  "shim/bundle/indexHtml.js": "2c4fbc502bb33fce93596cee19e143a58bb63c18d0b18ea597f81610e3a9a027",
162
162
  "shim/bundle/zip.js": "00f7b5fb5f36ff40a59d86758c503d9d7fb43949c1b5a4f2e7367c43d92786f9",
163
163
  "shim/bus.js": "dac2eeccd8774268c51014be4c46c00b9985fdf49ebb44355aa370e949c8c5bc",
164
- "shim/controls/index.js": "2aaf1f14b104bba8b912d68fe99068a8c544770b9eac43cdf6d992c311ec8f69",
164
+ "shim/controls/index.js": "206f2f9cdb19e122e650517e09ef1e858f962b4ebe555174aee3bea4ae938dff",
165
165
  "shim/controls/registry.js": "3df843d774968d18e012624f2aba2fb09b08ede9e21b6c1f6687d4f3e9b46d3e",
166
- "shim/engine/artifact-shell.js": "b4c1d8bf65403caea9357fecd91172a1689baed8aad89433160d595881f16010",
166
+ "shim/engine/artifact-shell.js": "f23c327500f8174b12d464868f6ec9c1701e7a9a5faa1c43a2ddafc3191dc38c",
167
167
  "shim/engine/boot-phases.js": "c6e12e12824bcf6f1a289f46e41c898a5416c80c131594525145aae9a3eefbfa",
168
168
  "shim/engine/engine-stack-boot.js": "0abf57dcff2ca2bb025c787a17875d49d54d9218ac08c78cb9c678dbb6118d08",
169
- "shim/engine/router.js": "a4ec678ab0e38381f761e40e8fbcb34dfea76d96df31a634f3d9f0b57d743570",
169
+ "shim/engine/router.js": "bd6a6e7b8b670ea146e8789f333c88c8eb62cf40aeab1eec21706d76fbb3e02a",
170
170
  "shim/experiment-frame/index.js": "5a0219aaa225d8f808c405b08623ce85ada37d83fb4f55f983db3303e431e47f",
171
171
  "shim/expr/ast-schema.js": "4f1133b887639bbd86fab976292323bf4a955cdc873ff7ca8e8a8eb3b416923f",
172
172
  "shim/field-descriptor/index.js": "6647d57d1523519114adc0a5cb66335ec5121c39ab294b9c97bdfb9e5d7f61e0",
173
173
  "shim/frame-data/index.js": "df6957b0b4a8e0ee0035bc970647b90089b421ae7f05911cc047d48457164be6",
174
- "shim/index.js": "141c68dbce88643815415645d5f896d55770208866e5b88b07b228d6a7d117e2",
174
+ "shim/host/host-view.js": "e13619d3340118f81cde6d035dcb689fd72d9341c98c3e95afba911e978dda63",
175
+ "shim/host/index.js": "67691951a7ff35b4baf7332987d0128d1eefd0ad185d2989674bea90b17c02f3",
176
+ "shim/index.js": "96165c6161ffddbace0be0cde0b3a83943298531537dd2cc9c6e281b8274ff19",
175
177
  "shim/notebook/canvas-guard.js": "b19d3a86df3835bd617c7130cde997b6f8a8a0c140f95338b733115d5947ed7b",
176
178
  "shim/notebook/catalog.js": "68243a154e12bf36a76598aa554119f6e3b8b5363c8452d157c8a562b9c38dc1",
177
179
  "shim/notebook/format.js": "f8b1da9eb37da3a9609f7721426e2242f1279780ea212ea08d9f3c50bb18b578",
178
180
  "shim/notebook/frqtl-setups-importmap.js": "df86defa90cb85675564e7bb269451684b5cc7679f2c6b1884c07c8272e8ff1c",
179
- "shim/notebook/kernel.js": "65cf7e4ba12b24521143997a38cb0e7d0a8aa63f9f46868494eff7a41a887c7b",
181
+ "shim/notebook/kernel.js": "95b8efe960927d8cda0896eea8995f5df5972a471e0217916c32881913bddfcd",
180
182
  "shim/notebook/knob.js": "f07e9ac9697c7178aa68e4b2f4300145f8e2d2dc41b64aa0afede7e2d68705b1",
181
183
  "shim/notebook/module-resolver.js": "0bcf6ca4954e198dd77ce61b502cebed6d2c118926fd0d2dd0816991b8334b7a",
182
184
  "shim/notebook/notebook-knobs.js": "891cd6a24ed70256ed723844918866ba162dd71f839cd06ff4d8fc92a0a17452",
183
185
  "shim/notebook/produced-bindings.js": "3d46038ec541a9ff896abae4f62d25780633cdc952e4c9d0d90d917298471090",
184
186
  "shim/notebook/realm-registry.js": "ffee52e7c93447c8b82bfc0784b51346686b4373766da298f50a759d3443ab6a",
185
187
  "shim/notebook/realm-transport.js": "5173676a94211f85122e0581a16abba925e9c4b5900b5891911bfaec5ea02daf",
186
- "shim/notebook/setup-builder.js": "abf8a7fed017776634d5ae3b595de7f00b32779590319cd48d95a6d9d0523a96",
188
+ "shim/notebook/setup-builder.js": "60fac546fe7895e68d1b982c377d9ced2558ba0769c4a5560ed92a239a7bce2a",
187
189
  "shim/notebook/store.js": "fe34d31907e7a8f303dfcc35b9c0439faf2c32fbc5c0bb4f899692c25bef9a4d",
188
190
  "shim/notebook/vendor-importmap.js": "0c6578567980225593690e06fb4d32f0b50c47fe87a7467741a03846f6da68ed",
189
191
  "shim/notebook/view-builder.js": "1961962be16ef526934c43193828473447f2ec9ac0144f39bc5108c327d9069a",
190
192
  "shim/notebook/view-ctx.js": "6287aee366104bece827eecccf675540571d6db2b6833bff837be49eb60ce111",
191
193
  "shim/notebook/view-handle.js": "fe0d1530e3311cb96bb22f5cded35b9f25a0a4ef002588f3e47d9eef8089664d",
192
194
  "shim/notebook/warmup.js": "453b9e8b4969bcc704e1fbc636c3ada869ebf692651cfbf950107fd1cb662e25",
193
- "shim/package.json": "609158e6c5fbc237939fa3ddf7faab80ab690bdc0c8d584414a885130103c4e8",
194
- "shim/page-params/index.js": "f372a85af163a492425cee2584513fa631a642cb805fa283ad122d445ebec4b3",
195
- "shim/project/identity.js": "5a0dbd07bfad5c5aa6a529994a604546dbf3e6978b9529ca97ce2c57aa8e563f",
195
+ "shim/package.json": "5937639b55f56f715ea32a010ddd17e631c548c16b8fcba65adbc6d9c802116b",
196
+ "shim/page-params/index.js": "c58732b8127da8c2b4ecfd922bf46a6c9a5e9ab7017f41c095a6ec937011f0fa",
197
+ "shim/project/fork.js": "07555f24c7e6d1bbe723853bc09ad570b9cd36cef248a07e98e7398d41ac70da",
198
+ "shim/project/identity.js": "8d3e0bb9df75eecf7d11a1ea7948ff66c559973a891574d0b208c9e8f8faf504",
196
199
  "shim/project/index.js": "81d1a5d84c8bd5f31de8d9849d385509a73582e2ec6db4f779b018fe1b25404f",
197
- "shim/project/link.js": "1774cde446c3217afb84e19fe44205d620764c863bff89e348a0645aed451ca2",
200
+ "shim/project/link.js": "0e3fc878bc45d9916baacd7cf129687ec6e82efd4f6f5036e4697180b3d0f87a",
198
201
  "shim/project/manifest.js": "442267af07ae1b977ff6aeaca49d98ce82b77f548cfdd1ed0f258b3429d75f31",
199
202
  "shim/project/node-specifier-hook.mjs": "8601edf762bd9cd011632bc681d0589dfc77368cda0e994125d0eb123fea89d0",
200
203
  "shim/project/parts-module.js": "b08e0149f086640692e1b2ff8e0d7ae0379c2bc934a0891418de5c2b8c0e8e60",
201
- "shim/project/parts-writer.js": "c9e9be475299ba24a81190d19260119816b9773135491a5024b55c40dd92f859",
204
+ "shim/project/parts-writer.js": "121fa67261d6f366190c9ac4961fceed2f26ca7f35cf3fbffc767829afc69978",
205
+ "shim/project/read-text.js": "b89bd70e3a271e1f42c8ce9427a20cdd9a4c4c9c31b64c49ff1f56b095620136",
202
206
  "shim/project/record-format.js": "b680c3752f20535c08be832c6808fae000c2d2325f8caee57f98351043d091be",
203
207
  "shim/project/register-node.mjs": "9b408da7dc1b11d16237cd62caca281c823ea80173d386ad35e41ea17c34857f",
204
- "shim/project/specifiers.js": "f73a41a7ffbd16063be314973d67e5261607b56b7ef7ee7927d9eaa0d541f3cc",
208
+ "shim/project/specifiers.js": "6a5ba9f91f97902d7b7911ecf9933dab743a99271b30ec4fb50a5d439d344add",
205
209
  "shim/registry/copy-gate.js": "cfbf52669c849b8837b326f2743458f1ead0720cad51a6c6d409c9bd6c7f9495",
206
- "shim/registry/exhibits.js": "98736b6b0dd82b5c1436da28fe3bf8d2d3ee840af8f5256d00c23e296c3bca9a",
207
- "shim/registry/experiments.js": "1d1484f144ade35ddcb94b23712df539b3b432a45130e159a6f47146de188165",
208
- "shim/registry/index.js": "a3cef8c227d06ccc55735fe2989fbd07b0cf2f323d11b5bed23092fc967e88fc",
209
- "shim/registry/scene-source.js": "0e873f9afa8175a318db14f0761d9379687024b1d49f69f2a0e3a22285d1029b",
210
- "shim/registry/walkthrough.js": "65d74822585d271f4d74f0821fc158698bc39d7427b9bca3a61584c3c6d1a4a5",
211
- "shim/render-state/apply.js": "fd0830ee4bb2668ac5b3254c29180bce9524d2ffb11bf6124e834ab8674a757a",
212
- "shim/render-state/index.js": "9015405ef2ea3d88bf004a0aa3bea04eb6bdb86270d68ef5622538a9bae5fa6d",
210
+ "shim/registry/exhibits.js": "7ee132589bb4c003a06815f78d9e917ba81fd806111d1cee538345b7e5cc6345",
211
+ "shim/registry/index.js": "f59357c81c4045c41bfd266a74931e5c21b2c6650ad60b80e8e21bc23699ca34",
212
+ "shim/registry/scene-roster.js": "318fe373f71b1c58d05425693f2fad4bd5368f6095b65817c6d637430a0bfb73",
213
+ "shim/registry/scene-source.js": "c9c4b48c24d4b1ebee1549a7891a1ba708909b94b9403ce28eefbd902cacf49f",
214
+ "shim/registry/walkthrough.js": "8f8b6f59e9e81c67c9c62f8fb271eee2e4d6e1fba6e116b227a2f1e3f9930230",
215
+ "shim/render-state/apply.js": "94a9e60cb1722c9a82aa00f2f161fd65e6f438147333856a786e42a4ad5b7064",
216
+ "shim/render-state/index.js": "72a6a3dcd8037893cb8fbd7ef32b126770e7efaec70847f8e4f2915ddb690b43",
213
217
  "shim/render/capture-envelope.js": "2667a355169bb124fd8117e9cbf1d630085257b9f6fa537362f12d0aa649da2d",
214
218
  "shim/render/heat-colormap.js": "0eadc758179024734c45eaeffd8f5b44e7c4102b7042767a4a5b66541b3bbd7c",
215
219
  "shim/render/render-stages.js": "baf674c205df7638af53e51ac77152a448fe6bf6d4ea51d58ac565556cd38da7",
216
220
  "shim/render/sun-look.js": "f8f23f0853a9c22459fff866ccf59ab00332697d48fd529fca5c2e8554a2d83d",
217
221
  "shim/rpc/index.js": "56af3afeed22e8d718cd2f7a8ad70db8745f54dbc139af9d71f1d73e2ca37698",
218
- "shim/runtime/index.js": "cd728294c4693de3059f30f272f267b88b39c19a451edd30c75012e1bab755f5",
222
+ "shim/runtime/index.js": "92bb4d8b5f203f949e441781b864efe5c6748df14a3a8f306e4c0bc11c7f6d35",
219
223
  "shim/storage/boot.js": "689504e15dc075e32d08abf61c75a45b1d565c09f086b42400dae40d8186c411",
220
224
  "shim/storage/codec-chains.js": "6eab30c3ab7d8bd26059f386f91f9e43a87a6a20980d36bf7271eb72b6d109c0",
221
225
  "shim/storage/folders.js": "9d69b6fcbdc8ae6da561acd42946933ac2d453d5d0659fcaf1cfba410a47a45a",
@@ -1,12 +1,4 @@
1
1
  {
2
- "name": "egpt_wasm",
3
- "description": "EGPT FRQTL VM WASM bindings",
4
- "version": "0.1.0",
5
- "files": [
6
- "egpt_wasm_bg.wasm",
7
- "egpt_wasm.js",
8
- "egpt_wasm.d.ts"
9
- ],
10
- "main": "egpt_wasm.js",
11
- "types": "egpt_wasm.d.ts"
2
+ "private": true,
3
+ "license": "SEE LICENSE IN LICENSE.md"
12
4
  }
@@ -743,8 +743,7 @@ import { Rectangle } from '../../parts/Rectangle.js';
743
743
  // can parent — density clustering). ENGINE TRUTH, ASKED ON EVERY READ: init() ferries the
744
744
  // mode in the CONFIG BAG (`frame_gen_mode`), the ENGINE holds it, and this getter asks the
745
745
  // running universe what it actually HOLDS. A JS copy would go stale the moment a re-init
746
- // changed the mode — which is exactly how STUDIO's codegen came to print a mode the run
747
- // was not using.
746
+ // changed the mode — and a writer that read it would write a mode the run was not using.
748
747
  //
749
748
  // `_frameGenMode` survives for exactly ONE read: the window between create() and init(),
750
749
  // when there is no engine to ask. It is NOT an input to init() — init() takes its own
@@ -1007,8 +1006,8 @@ import { Rectangle } from '../../parts/Rectangle.js';
1007
1006
  }
1008
1007
  // READ-BACK of the RESOLVED axes (what this run actually uses, including the
1009
1008
  // engine's serde default when the sketch omitted them). Truth-in-labeling: any
1010
- // consumer that must re-declare this world (STUDIO codegen re-emitting the
1011
- // sketch's world step) DERIVES it from here rather than guessing.
1009
+ // consumer that must re-declare this world (a host re-stating the sketch's world step)
1010
+ // DERIVES it from here rather than guessing.
1012
1011
  this.activeAxes = config.active_axes
1013
1012
  ? { x: config.active_axes.x, y: config.active_axes.y, z: config.active_axes.z }
1014
1013
  : { x: true, y: true, z: false };
@@ -803,7 +803,7 @@ import * as RendererProviderContract from '../renderer-provider-contract.js';
803
803
  setPreset: function (name) {
804
804
  // A preset is a FULL framing reset — the reliable way back. A name this
805
805
  // camera does not offer THROWS (a silent no-op would leave a saved or
806
- // codegen'd preset doing nothing with no signal).
806
+ // written preset doing nothing with no signal).
807
807
  var all = _presets(), p = all[name];
808
808
  if (!p) {
809
809
  throw new Error('[p5-provider camera] setPreset("' + name + '"): this camera offers ' +
@@ -248,7 +248,7 @@ import { paintBootFailure } from '../experiments/_shared/boot-failure.js';
248
248
  // experiment pages). When true (STUDIO authoring), the renderer DRAWS the
249
249
  // Design-only markers (a manipulable emitter's visual circle, `lo._designMarker`).
250
250
  // A render toggle at the output boundary (zero physics): it filters ONLY the
251
- // renderTick view; the pick, the aim, Layers and codegen read the census and the
251
+ // renderTick view; the pick, the aim, Layers and the parts writer read the census and the
252
252
  // declared registry directly, so an emitter stays selectable even when its marker
253
253
  // circle is suppressed.
254
254
  this._designMode = false;
@@ -814,7 +814,7 @@ import { paintBootFailure } from '../experiments/_shared/boot-failure.js';
814
814
  // is manipulable, so only what the user proactively declares is registered.
815
815
  //
816
816
  // `declared` is the ordered list of the handles the user's DECLARING calls produced
817
- // (`exp.addObject`, a palette drop, a codegen replay — all three funnel through
817
+ // (`exp.addObject`, a palette drop, a parts entry replayed — all three funnel through
818
818
  // `ObjectFactory.create`, the registry's ONE writer). It is a different fact from the world
819
819
  // census (`largeObjects` — everything the world draws and collides): a part's composition is
820
820
  // in the census but never declared. "Which declared object does this drawn thing belong to"
@@ -990,7 +990,7 @@ import { paintBootFailure } from '../experiments/_shared/boot-failure.js';
990
990
  * undeclaredTickFunctions() → the host tick-functions running in the world that NO declared
991
991
  * object owns: a setup factory's emitter, a page's own regulation fn, a sketch's
992
992
  * exp.addTickFunction. They are behaviour the registry cannot write down, so whatever writes the
993
- * world as declarations (codegen) refuses while any exists.
993
+ * world as declarations refuses while any exists.
994
994
  * @returns {Function[]}
995
995
  */
996
996
  FrqtlApp.prototype.undeclaredTickFunctions = function () {
@@ -1056,7 +1056,7 @@ import { paintBootFailure } from '../experiments/_shared/boot-failure.js';
1056
1056
  * getObjectByName(name, predicate?) → the DECLARED object of that name (passing `predicate` when
1057
1057
  * given), else null — the lazy by-name reference every cross-object link that must survive a
1058
1058
  * Restart uses (an emitter's gateCounter, a LiveChart source). Handles are fresh at registration
1059
- * and never survive codegen, so the reference is a NAME resolved against the registry at use
1059
+ * and never survive a re-link, so the reference is a NAME resolved against the registry at use
1060
1060
  * time. The CALLER decides whether null is FAIL-LOUD (the emission gate throws; a LiveChart
1061
1061
  * retries next scan).
1062
1062
  * @param {string} name @param {Function} [predicate] @returns {Object|null}
@@ -2393,7 +2393,7 @@ import { paintBootFailure } from '../experiments/_shared/boot-failure.js';
2393
2393
  var msg = 'FrqtlApp: the DISPLAY SLOT is empty (FrqtlDisplay.get() === null).\n\n' +
2394
2394
  'The boot module (lib/frqtl/experiments/_shared/boot.js) must select a renderer\n' +
2395
2395
  'BEFORE the draw loop fires. This is a page configuration error.\n\n' +
2396
- 'P5Renderer has been removed (WS-RENDERER Phase 1). All experiment pages\n' +
2396
+ 'P5Renderer has been removed. All experiment pages\n' +
2397
2397
  'boot the canonical RendererProvider stack through bootPage().';
2398
2398
  if (typeof document === 'undefined') {
2399
2399
  // No DOM to paint the overlay into — the message is still LOUD, on the console
@@ -74,7 +74,10 @@ import { ObjectSchema } from './schema/index.js';
74
74
  import { kindOf } from './kinds.js';
75
75
  import { linkProject } from '../../shim/project/link.js';
76
76
  import { patchParts, PARTS_EXPORT, entryKeys, entryLiteral } from '../../shim/project/parts-writer.js';
77
- import { moduleOfKind } from '../../shim/project/parts-module.js';
77
+ import { moduleOfKind, PARTS_SPECIFIER } from '../../shim/project/parts-module.js';
78
+ import { forkPartText, FORK_REFUSED } from '../../shim/project/fork.js';
79
+ import { readText } from '../../shim/project/read-text.js';
80
+ import { packageRoot } from '../compat/package-root.js';
78
81
  import { MANIFEST_FILE } from '../../shim/project/manifest.js';
79
82
  import { Record, openRecordOf } from './record/Record.js';
80
83
 
@@ -463,6 +466,7 @@ import { Record, openRecordOf } from './record/Record.js';
463
466
  _requireWorld(this);
464
467
  _requireHeld(this, 'toSketch');
465
468
  var by = this._record ? Record.requireBy(opts && opts.by, 'RecipeContext.toSketch') : null;
469
+ if (this._record) { this._record._admit('RecipeContext.toSketch'); }
466
470
  var self = this;
467
471
  var runner = this._runner;
468
472
  var declared = runner.declared;
@@ -654,6 +658,7 @@ import { Record, openRecordOf } from './record/Record.js';
654
658
  _requireWorld(this);
655
659
  _requireHeld(this, 'setDeclared');
656
660
  var by = this._record ? Record.requireBy(opts && opts.by, 'RecipeContext.setDeclared') : null;
661
+ if (this._record) { this._record._admit('RecipeContext.setDeclared'); }
657
662
  var runner = this._runner;
658
663
  var obj = null;
659
664
  this._parts.forEach(function (row, o) { if (row.key === name) { obj = o; } });
@@ -724,6 +729,106 @@ import { Record, openRecordOf } from './record/Record.js';
724
729
  return { set: name, from: from, to: to, tick: 0, kept: kept, files: Object.assign({}, files) };
725
730
  };
726
731
 
732
+ /**
733
+ * exp.fork(name, NewKind[, { by }]) → Promise<{ fork, file, from, files }> — copy the part file of `inParts` object
734
+ * `name`'s kind into the project as `parts/<NewKind>.js` (lib/shim/project/fork.js forkPartText: the class renamed,
735
+ * its imports rewritten to package specifiers, every other byte the source's), point the entry at the fork (the
736
+ * parts writer's `kind` edit: the Kind identifier and one import line), and re-run the scene IN THIS DOCUMENT
737
+ * through the one restart door, as setDeclared does: the seed and the camera pose are kept, the loop's run state
738
+ * is kept. The source text is the exact bytes the kind's `from` names: a package part's file (read through
739
+ * read-text.js readText), or a project fork's held file. The held project is updated BEFORE the re-run, so an open
740
+ * Record stays open; with one open, `by` is required and its `fork` row ({ from: <kind>, to: { kind, file } }) is
741
+ * written after the re-run. REFUSES (throws, the held text unchanged): a name that is not an `inParts` object, a
742
+ * hand made since the last toSketch that is unwritten, a kind with no file a fork can copy, every forkPartText
743
+ * refusal, a writer refusal, and a re-run whose entry is not the fork.
744
+ */
745
+ /**
746
+ * The fork's plan for `inParts` object `name`, before any read: { obj, from, row, module }. THROWS the refusal
747
+ * fork() and forkRefusal() both name: not an `inParts` object, an unwritten hand, a kind FORK_REFUSED names
748
+ * (lib/shim/project/fork.js, the census reason), a kind with no part file a fork can copy.
749
+ */
750
+ function _forkPlan(self, name) {
751
+ var runner = self._runner;
752
+ var obj = null;
753
+ self._parts.forEach(function (row, o) { if (row.key === name) { obj = o; } });
754
+ if (!obj || runner.declared.indexOf(obj) === -1) {
755
+ throw new Error('[RecipeContext.fork] "' + name + '" is not an object of this sketch\'s `parts` block' +
756
+ (self._code.size ? ' (code declarations: ' + Array.from(self._code.keys()).map(function (o) { return o.name; }).join(', ') +
757
+ ' — ' + OUTSIDE_PARTS + ')' : '') + '. (FAIL-LOUD.)');
758
+ }
759
+ var unwritten = _unwrittenHands(self);
760
+ if (unwritten.length) {
761
+ throw new Error('[RecipeContext.fork] "' + unwritten.join('", "') + '" carries a hand the sketch text does ' +
762
+ 'not hold yet — write the hand first: await exp.toSketch(). (FAIL-LOUD.)');
763
+ }
764
+ var from = runner.kindOf(obj);
765
+ if (Object.prototype.hasOwnProperty.call(FORK_REFUSED, from)) {
766
+ throw new Error('[RecipeContext.fork] ' + from + ' (the kind of "' + name + '") is not forkable — ' + FORK_REFUSED[from] + '. (FAIL-LOUD.)');
767
+ }
768
+ var row = kindOf(from);
769
+ var module = row ? moduleOfKind(row.from, self._urls) : null;
770
+ if (module !== PARTS_SPECIFIER && !(module && Object.prototype.hasOwnProperty.call(self._project.files, module))) {
771
+ throw new Error('[RecipeContext.fork] ' + from + ' (the kind of "' + name + '") has no part file a fork can copy — a fork ' +
772
+ 'copies a part of @descix/frqtl-web/parts or a part file of this project. (FAIL-LOUD.)');
773
+ }
774
+ return { obj: obj, from: from, row: row, module: module };
775
+ }
776
+
777
+ /**
778
+ * exp.forkRefusal(name) → null when exp.fork(name, …) may run, else the refusal it would throw (one sentence). A
779
+ * host's "Fork into project" control reads it for its disabled state and title; fork() runs the same plan.
780
+ */
781
+ RecipeContext.prototype.forkRefusal = function (name) {
782
+ _requireWorld(this);
783
+ _requireHeld(this, 'forkRefusal');
784
+ try { _forkPlan(this, name); return null; }
785
+ catch (err) { return String(err && err.message).replace(/^\[RecipeContext\.fork\] /, '').replace(/ \(FAIL-LOUD\.\)$/, ''); }
786
+ };
787
+
788
+ RecipeContext.prototype.fork = async function (name, NewKind, opts) {
789
+ _requireWorld(this);
790
+ _requireHeld(this, 'fork');
791
+ var by = this._record ? Record.requireBy(opts && opts.by, 'RecipeContext.fork') : null;
792
+ if (this._record) { this._record._admit('RecipeContext.fork'); }
793
+ var runner = this._runner;
794
+ var plan = _forkPlan(this, name);
795
+ var from = plan.from, row = plan.row, module = plan.module;
796
+ var text, libPath;
797
+ if (module === PARTS_SPECIFIER) {
798
+ libPath = row.from.slice(packageRoot().length);
799
+ try { text = await readText(row.from); }
800
+ catch (err) { throw new Error('[RecipeContext.fork] the part file of ' + from + ': ' + ((err && err.message) || err) + '. (FAIL-LOUD.)'); }
801
+ } else {
802
+ libPath = module;
803
+ text = this._project.files[module];
804
+ }
805
+ var forked = forkPartText(text, { from: from, to: NewKind, libPath: libPath, files: this._project.files });
806
+ var file = 'parts/' + NewKind + '.js';
807
+ var entry = this._project.entry;
808
+ var r = patchParts(this._project.files[entry], [{ op: 'kind', name: name, Kind: NewKind, module: file }], { entry: entry });
809
+ if (r.refused.length) {
810
+ throw new Error('[RecipeContext.fork] the sketch text refused the fork: ' +
811
+ r.refused.map(function (x) { return x.reason; }).join('; ') + ' (FAIL-LOUD.)');
812
+ }
813
+ var files = Object.assign({}, this._project.files);
814
+ files[file] = forked.text;
815
+ files[entry] = r.text;
816
+ this._project = Object.assign({}, this._project, { files: files });
817
+ var pose = _cameraPose(runner);
818
+ var wasRunning = !!runner._isLooping;
819
+ await runner.restart();
820
+ if (!wasRunning) { runner.stop(); }
821
+ if (pose && runner.cameraControl && typeof runner.cameraControl.setOrbit === 'function') { runner.cameraControl.setOrbit(pose); }
822
+ var rebuilt = null;
823
+ this._parts.forEach(function (row2, o) { if (row2.key === name) { rebuilt = o; } });
824
+ if (!rebuilt || runner.kindOf(rebuilt) !== NewKind) {
825
+ throw new Error('[RecipeContext.fork] the re-run declared "' + name + '" as ' + (rebuilt ? runner.kindOf(rebuilt) : 'nothing') +
826
+ ', not the fork ' + NewKind + '. (FAIL-LOUD.)');
827
+ }
828
+ if (this._record) { this._record._row({ name: name, op: 'fork', by: by, from: from, to: { kind: NewKind, file: file } }); }
829
+ return { fork: NewKind, file: file, from: from, files: Object.assign({}, files) };
830
+ };
831
+
727
832
  RecipeContext.prototype.addTickFunction = function (fn) {
728
833
  _requireWorld(this);
729
834
  var fns = this._runner.universe.experimentTickFunctions;
@@ -128,7 +128,7 @@ import { compileWallV2 } from '../objects/actionCompiler.js';
128
128
  }
129
129
 
130
130
  // ── Presets (B6) — pure CONSTRUCTION sugar expanding to the v2 descriptor fields.
131
- // The recipe/codegen round-trips the EXPANDED fields (never the preset name).
131
+ // The parts writer captures the EXPANDED fields (never the preset name).
132
132
  //
133
133
  // THE NAMING RULE: a preset's NAME MUST ASSERT ITS BEHAVIOR.
134
134
  // `collisionBehavior:'nothing'` (pass-through) belongs ONLY on a preset whose name SAYS
@@ -71,29 +71,6 @@ import { loadedWasmSha256 } from '../../compat/providers/wasm-load-browser.js';
71
71
  import * as FrqtlDisplay from '../../compat/renderer/display-slot.js';
72
72
 
73
73
 
74
- /**
75
- * The experiment identity the page ALREADY carries, ferried — not a second authority.
76
- *
77
- * The experiments registry DEFINES an experiment id as "the directory name under
78
- * experiments/" (`experimentById`), and a canonical page is served from
79
- * `…/experiments/<id>/index.html`. So the path segment IS the registry id, and reading it
80
- * ferries the existing identity rather than minting a parallel one. The registry module
81
- * is a registry, not a page fact, which is why the id is taken from the URL the registry's
82
- * own ids are defined by.
83
- *
84
- * Fails SOFT to null (no DOM, a notebook realm, an ad-hoc page): `sourceRef: null` is the
85
- * honest "this scene has no authored identity" value, and the corpus row then carries the
86
- * code itself. A caller with a better identity overrides via `setSourceRef()`.
87
- * @private
88
- */
89
- function _defaultSourceRef() {
90
- try {
91
- if (typeof location === 'undefined' || !location) { return null; }
92
- var m = String(location.pathname).match(/\/experiments\/([^/]+)\//);
93
- return (m && m[1]) ? m[1] : null;
94
- } catch (e) { return null; }
95
- }
96
-
97
74
  /**
98
75
  * The RASTER PATH pin — which GL backend this browser actually rasters with.
99
76
  *
@@ -207,7 +184,7 @@ import * as FrqtlDisplay from '../../compat/renderer/display-slot.js';
207
184
  // harness via setSourceRef(). null is HONEST (an ad-hoc universe); the corpus row then
208
185
  // carries the code itself. Never per-capture caller-supplied provenance.
209
186
  this._sourceRef = (identity.sourceRef === undefined || identity.sourceRef === null)
210
- ? _defaultSourceRef() : String(identity.sourceRef);
187
+ ? null : String(identity.sourceRef);
211
188
  // The code identity (setSourceSha256) — null until a door that linked a project registers it.
212
189
  this._sourceSha256 = null;
213
190
  // Memo for the content-addressed SceneRecord — see sceneRecord().