@descix/frqtl-node 0.6.0-p4.1 → 0.6.1-p1.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 (66) hide show
  1. package/CLAUDE.md +2 -2
  2. package/LICENSE.md +79 -63
  3. package/README.md +6 -3
  4. package/dist/dist-manifest.json +60 -54
  5. package/dist/fat/pkg-node/package.json +2 -10
  6. package/dist/frqtl/compat/providers/wasm-engine.js +3 -4
  7. package/dist/frqtl/compat/renderer/providers/p5-provider.js +1 -1
  8. package/dist/frqtl/objects/FrqtlApp.js +5 -5
  9. package/dist/frqtl/objects/RecipeContext.js +106 -1
  10. package/dist/frqtl/objects/constants/WallBehaviors.js +1 -1
  11. package/dist/frqtl/objects/instruments/capture.js +1 -24
  12. package/dist/frqtl/objects/instruments/hosted-eyes.js +17 -1
  13. package/dist/frqtl/objects/objects/makeControlsForObject.js +5 -5
  14. package/dist/frqtl/objects/record/Record.js +25 -5
  15. package/dist/frqtl/objects/schema/engine-scopes.js +2 -2
  16. package/dist/frqtl/objects/schema/scopes.js +2 -2
  17. package/dist/frqtl/objects/setup/_worldInit.js +1 -2
  18. package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +1 -2
  19. package/dist/frqtl/parts/CameraControls.js +8 -0
  20. package/dist/frqtl/parts/DetectorWall.js +1 -1
  21. package/dist/frqtl/parts/GraphingDetectorWall.js +7 -7
  22. package/dist/frqtl/parts/LargeObject.js +2 -2
  23. package/dist/frqtl/parts/LiveChart.js +2 -2
  24. package/dist/frqtl/parts/LogicGate.js +3 -3
  25. package/dist/frqtl/parts/OvenBox.js +1 -1
  26. package/dist/frqtl/parts/PointSource.js +1 -1
  27. package/dist/frqtl/parts/SlitLightSource.js +1 -1
  28. package/dist/frqtl/parts/SlitScreen.js +1 -1
  29. package/dist/frqtl/parts/SphereEmitter.js +12 -12
  30. package/dist/frqtl/parts/Trace.js +1 -1
  31. package/dist/frqtl/parts/Tunnel.js +11 -11
  32. package/dist/frqtl/parts/Wall.js +20 -10
  33. package/dist/frqtl/scenes/circuit-sat.js +1 -0
  34. package/dist/frqtl/scenes/dse-one-emitter.js +32 -34
  35. package/dist/frqtl/scenes/dse-two-emitters.js +33 -34
  36. package/dist/frqtl/scenes/mirror-route.js +96 -79
  37. package/dist/shim/bundle/index.js +6 -0
  38. package/dist/shim/controls/index.js +1 -1
  39. package/dist/shim/engine/artifact-shell.js +1 -1
  40. package/dist/shim/engine/router.js +10 -17
  41. package/dist/shim/engine/site-graph.js +36 -0
  42. package/dist/shim/host/host-view.js +232 -0
  43. package/dist/shim/host/index.js +18 -0
  44. package/dist/shim/index.js +2 -4
  45. package/dist/shim/notebook/kernel.js +1 -1
  46. package/dist/shim/notebook/setup-builder.js +2 -2
  47. package/dist/shim/package.json +1 -0
  48. package/dist/shim/page-params/index.js +2 -30
  49. package/dist/shim/project/fork.js +293 -0
  50. package/dist/shim/project/identity.js +3 -1
  51. package/dist/shim/project/link.js +43 -3
  52. package/dist/shim/project/parts-writer.js +62 -5
  53. package/dist/shim/project/read-text.js +43 -0
  54. package/dist/shim/project/specifiers.js +107 -16
  55. package/dist/shim/registry/exhibits.js +16 -35
  56. package/dist/shim/registry/index.js +5 -2
  57. package/dist/shim/registry/scene-roster.js +35 -0
  58. package/dist/shim/registry/scene-source.js +6 -36
  59. package/dist/shim/registry/showcase-link.js +61 -0
  60. package/dist/shim/registry/walkthrough.js +2 -3
  61. package/dist/shim/render-state/apply.js +66 -31
  62. package/dist/shim/render-state/index.js +6 -2
  63. package/dist/shim/runtime/index.js +4 -4
  64. package/llms.txt +4 -3
  65. package/package.json +21 -2
  66. package/dist/shim/registry/experiments.js +0 -215
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@descix/frqtl-node",
3
- "version": "0.6.0-p4.1",
3
+ "version": "0.6.1-p1.2",
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,71 @@
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": "e0563d9b6cc9da08fe915b1d0218faf446a827ff9196038c9f85622f7d1c0fcd",
170
+ "shim/engine/site-graph.js": "55276c1aa1a4d64f2939610993b00b6bf9d10b331361ac2c4997b949303b7fd4",
170
171
  "shim/experiment-frame/index.js": "5a0219aaa225d8f808c405b08623ce85ada37d83fb4f55f983db3303e431e47f",
171
172
  "shim/expr/ast-schema.js": "4f1133b887639bbd86fab976292323bf4a955cdc873ff7ca8e8a8eb3b416923f",
172
173
  "shim/field-descriptor/index.js": "6647d57d1523519114adc0a5cb66335ec5121c39ab294b9c97bdfb9e5d7f61e0",
173
174
  "shim/frame-data/index.js": "df6957b0b4a8e0ee0035bc970647b90089b421ae7f05911cc047d48457164be6",
174
- "shim/index.js": "141c68dbce88643815415645d5f896d55770208866e5b88b07b228d6a7d117e2",
175
+ "shim/host/host-view.js": "38aa2ae18c89dd5a80dd35fa5a1a6d9597d33fa2c8596a93bdb86149dbcf52dc",
176
+ "shim/host/index.js": "67691951a7ff35b4baf7332987d0128d1eefd0ad185d2989674bea90b17c02f3",
177
+ "shim/index.js": "96165c6161ffddbace0be0cde0b3a83943298531537dd2cc9c6e281b8274ff19",
175
178
  "shim/notebook/canvas-guard.js": "b19d3a86df3835bd617c7130cde997b6f8a8a0c140f95338b733115d5947ed7b",
176
179
  "shim/notebook/catalog.js": "68243a154e12bf36a76598aa554119f6e3b8b5363c8452d157c8a562b9c38dc1",
177
180
  "shim/notebook/format.js": "f8b1da9eb37da3a9609f7721426e2242f1279780ea212ea08d9f3c50bb18b578",
178
181
  "shim/notebook/frqtl-setups-importmap.js": "df86defa90cb85675564e7bb269451684b5cc7679f2c6b1884c07c8272e8ff1c",
179
- "shim/notebook/kernel.js": "65cf7e4ba12b24521143997a38cb0e7d0a8aa63f9f46868494eff7a41a887c7b",
182
+ "shim/notebook/kernel.js": "95b8efe960927d8cda0896eea8995f5df5972a471e0217916c32881913bddfcd",
180
183
  "shim/notebook/knob.js": "f07e9ac9697c7178aa68e4b2f4300145f8e2d2dc41b64aa0afede7e2d68705b1",
181
184
  "shim/notebook/module-resolver.js": "0bcf6ca4954e198dd77ce61b502cebed6d2c118926fd0d2dd0816991b8334b7a",
182
185
  "shim/notebook/notebook-knobs.js": "891cd6a24ed70256ed723844918866ba162dd71f839cd06ff4d8fc92a0a17452",
183
186
  "shim/notebook/produced-bindings.js": "3d46038ec541a9ff896abae4f62d25780633cdc952e4c9d0d90d917298471090",
184
187
  "shim/notebook/realm-registry.js": "ffee52e7c93447c8b82bfc0784b51346686b4373766da298f50a759d3443ab6a",
185
188
  "shim/notebook/realm-transport.js": "5173676a94211f85122e0581a16abba925e9c4b5900b5891911bfaec5ea02daf",
186
- "shim/notebook/setup-builder.js": "abf8a7fed017776634d5ae3b595de7f00b32779590319cd48d95a6d9d0523a96",
189
+ "shim/notebook/setup-builder.js": "60fac546fe7895e68d1b982c377d9ced2558ba0769c4a5560ed92a239a7bce2a",
187
190
  "shim/notebook/store.js": "fe34d31907e7a8f303dfcc35b9c0439faf2c32fbc5c0bb4f899692c25bef9a4d",
188
191
  "shim/notebook/vendor-importmap.js": "0c6578567980225593690e06fb4d32f0b50c47fe87a7467741a03846f6da68ed",
189
192
  "shim/notebook/view-builder.js": "1961962be16ef526934c43193828473447f2ec9ac0144f39bc5108c327d9069a",
190
193
  "shim/notebook/view-ctx.js": "6287aee366104bece827eecccf675540571d6db2b6833bff837be49eb60ce111",
191
194
  "shim/notebook/view-handle.js": "fe0d1530e3311cb96bb22f5cded35b9f25a0a4ef002588f3e47d9eef8089664d",
192
195
  "shim/notebook/warmup.js": "453b9e8b4969bcc704e1fbc636c3ada869ebf692651cfbf950107fd1cb662e25",
193
- "shim/package.json": "609158e6c5fbc237939fa3ddf7faab80ab690bdc0c8d584414a885130103c4e8",
194
- "shim/page-params/index.js": "f372a85af163a492425cee2584513fa631a642cb805fa283ad122d445ebec4b3",
195
- "shim/project/identity.js": "5a0dbd07bfad5c5aa6a529994a604546dbf3e6978b9529ca97ce2c57aa8e563f",
196
+ "shim/package.json": "5937639b55f56f715ea32a010ddd17e631c548c16b8fcba65adbc6d9c802116b",
197
+ "shim/page-params/index.js": "c58732b8127da8c2b4ecfd922bf46a6c9a5e9ab7017f41c095a6ec937011f0fa",
198
+ "shim/project/fork.js": "07555f24c7e6d1bbe723853bc09ad570b9cd36cef248a07e98e7398d41ac70da",
199
+ "shim/project/identity.js": "8d3e0bb9df75eecf7d11a1ea7948ff66c559973a891574d0b208c9e8f8faf504",
196
200
  "shim/project/index.js": "81d1a5d84c8bd5f31de8d9849d385509a73582e2ec6db4f779b018fe1b25404f",
197
- "shim/project/link.js": "1774cde446c3217afb84e19fe44205d620764c863bff89e348a0645aed451ca2",
201
+ "shim/project/link.js": "0e3fc878bc45d9916baacd7cf129687ec6e82efd4f6f5036e4697180b3d0f87a",
198
202
  "shim/project/manifest.js": "442267af07ae1b977ff6aeaca49d98ce82b77f548cfdd1ed0f258b3429d75f31",
199
203
  "shim/project/node-specifier-hook.mjs": "8601edf762bd9cd011632bc681d0589dfc77368cda0e994125d0eb123fea89d0",
200
204
  "shim/project/parts-module.js": "b08e0149f086640692e1b2ff8e0d7ae0379c2bc934a0891418de5c2b8c0e8e60",
201
- "shim/project/parts-writer.js": "c9e9be475299ba24a81190d19260119816b9773135491a5024b55c40dd92f859",
205
+ "shim/project/parts-writer.js": "121fa67261d6f366190c9ac4961fceed2f26ca7f35cf3fbffc767829afc69978",
206
+ "shim/project/read-text.js": "b89bd70e3a271e1f42c8ce9427a20cdd9a4c4c9c31b64c49ff1f56b095620136",
202
207
  "shim/project/record-format.js": "b680c3752f20535c08be832c6808fae000c2d2325f8caee57f98351043d091be",
203
208
  "shim/project/register-node.mjs": "9b408da7dc1b11d16237cd62caca281c823ea80173d386ad35e41ea17c34857f",
204
- "shim/project/specifiers.js": "f73a41a7ffbd16063be314973d67e5261607b56b7ef7ee7927d9eaa0d541f3cc",
209
+ "shim/project/specifiers.js": "c8bbff6bfbbdf00d09a39500daf54a952e1447522ecebb808a3838c9d534387e",
205
210
  "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",
211
+ "shim/registry/exhibits.js": "e137951429929dae6c38e996546b66dd19b575ee4f0aafbddf28096c847a27fc",
212
+ "shim/registry/index.js": "eb805ee170ee8be71c179577fcb48b9845012ba63674316fbf9b5d7664f86f1f",
213
+ "shim/registry/scene-roster.js": "318fe373f71b1c58d05425693f2fad4bd5368f6095b65817c6d637430a0bfb73",
214
+ "shim/registry/scene-source.js": "c9c4b48c24d4b1ebee1549a7891a1ba708909b94b9403ce28eefbd902cacf49f",
215
+ "shim/registry/showcase-link.js": "daf5c1426aeb3c578bace5e0edea9ba2538cd82336d2cdc944e5fed6decd7551",
216
+ "shim/registry/walkthrough.js": "8f8b6f59e9e81c67c9c62f8fb271eee2e4d6e1fba6e116b227a2f1e3f9930230",
217
+ "shim/render-state/apply.js": "94a9e60cb1722c9a82aa00f2f161fd65e6f438147333856a786e42a4ad5b7064",
218
+ "shim/render-state/index.js": "72a6a3dcd8037893cb8fbd7ef32b126770e7efaec70847f8e4f2915ddb690b43",
213
219
  "shim/render/capture-envelope.js": "2667a355169bb124fd8117e9cbf1d630085257b9f6fa537362f12d0aa649da2d",
214
220
  "shim/render/heat-colormap.js": "0eadc758179024734c45eaeffd8f5b44e7c4102b7042767a4a5b66541b3bbd7c",
215
221
  "shim/render/render-stages.js": "baf674c205df7638af53e51ac77152a448fe6bf6d4ea51d58ac565556cd38da7",
216
222
  "shim/render/sun-look.js": "f8f23f0853a9c22459fff866ccf59ab00332697d48fd529fca5c2e8554a2d83d",
217
223
  "shim/rpc/index.js": "56af3afeed22e8d718cd2f7a8ad70db8745f54dbc139af9d71f1d73e2ca37698",
218
- "shim/runtime/index.js": "cd728294c4693de3059f30f272f267b88b39c19a451edd30c75012e1bab755f5",
224
+ "shim/runtime/index.js": "92bb4d8b5f203f949e441781b864efe5c6748df14a3a8f306e4c0bc11c7f6d35",
219
225
  "shim/storage/boot.js": "689504e15dc075e32d08abf61c75a45b1d565c09f086b42400dae40d8186c411",
220
226
  "shim/storage/codec-chains.js": "6eab30c3ab7d8bd26059f386f91f9e43a87a6a20980d36bf7271eb72b6d109c0",
221
227
  "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().
@@ -662,12 +662,21 @@ import { libPathOf } from '../../../shim/project/specifiers.js';
662
662
  return { files: files, record: out.record, clips: out.clips };
663
663
  };
664
664
 
665
- /** One act through the page's own doors: toSketch({by}), setDeclared(name, patch, {by}), placeDeclaredAt(name, point). */
665
+ /** rec.changes (the page's own read: a deep-frozen copy per read) as plain JSON. */
666
+ var _IN_PAGE_RECORD_CHANGES = function () {
667
+ var p = window.__frqtlHostedRecord;
668
+ if (!p || !p.rec) { throw new Error('[FrqtlHostedEyes/in-page] no Record is open — eyes.record.start() first.'); }
669
+ return JSON.parse(JSON.stringify(p.rec.changes));
670
+ };
671
+
672
+ /** One act through the page's own doors: toSketch({by}), setDeclared(name, patch, {by}), fork(name, Kind, {by}),
673
+ * placeDeclaredAt(name, point). */
666
674
  var _IN_PAGE_ACT = async function (args) {
667
675
  var exp = window.FrqtlPage.experiment;
668
676
  var r = window.FrqtlPage.runner;
669
677
  if (args.door === 'toSketch') { return exp.toSketch(args.opts); }
670
678
  if (args.door === 'setDeclared') { return exp.setDeclared(args.name, args.patch, args.opts); }
679
+ if (args.door === 'fork') { return exp.fork(args.name, args.Kind, args.opts); }
671
680
  if (args.door === 'placeDeclaredAt') {
672
681
  var d = r.declared.find(function (o) { return o.name === args.name; });
673
682
  if (!d) { throw new Error('[FrqtlHostedEyes/in-page] no declared object is named ' + JSON.stringify(args.name) + '.'); }
@@ -1113,6 +1122,8 @@ import { libPathOf } from '../../../shim/project/specifiers.js';
1113
1122
  * film(opts) rec.film(opts) → its clip spans. Drive the world while it films:
1114
1123
  * `const f = eyes.record.film(o); await eyes.driveToTick(n); await f`
1115
1124
  * stop() rec.stop() → { files: { path: string | Uint8Array }, record, clips } | { empty: true }
1125
+ * changes() rec.changes → the rows so far, plain JSON (the page's own read). REJECTS when no Record is
1126
+ * open (as stop() does). One act's rows: read the length before the act, slice after.
1116
1127
  */
1117
1128
  record: {
1118
1129
  start: function () {
@@ -1125,6 +1136,9 @@ import { libPathOf } from '../../../shim/project/specifiers.js';
1125
1136
  },
1126
1137
  stop: function () {
1127
1138
  return page.evaluate(_IN_PAGE_RECORD_STOP, { modules: modules }).then(_rethrowRefused).then(_folderFromPage);
1139
+ },
1140
+ changes: function () {
1141
+ return page.evaluate(_IN_PAGE_RECORD_CHANGES);
1128
1142
  }
1129
1143
  },
1130
1144
 
@@ -1132,11 +1146,13 @@ import { libPathOf } from '../../../shim/project/specifiers.js';
1132
1146
  * Acts through the page's own doors (the writer's rows come from these, never from node):
1133
1147
  * toSketch({ by }) exp.toSketch
1134
1148
  * setDeclared(name, patch, { by }) exp.setDeclared
1149
+ * fork(name, Kind, { by }) exp.fork → { fork, file, from, files } (the files as text)
1135
1150
  * placeDeclaredAt(name, [x, y, z?]) runner.placeDeclaredAt on the declared object of that name
1136
1151
  */
1137
1152
  act: {
1138
1153
  toSketch: function (opts) { return page.evaluate(_IN_PAGE_ACT, { door: 'toSketch', opts: opts }); },
1139
1154
  setDeclared: function (name, patch, opts) { return page.evaluate(_IN_PAGE_ACT, { door: 'setDeclared', name: name, patch: patch, opts: opts }); },
1155
+ fork: function (name, Kind, opts) { return page.evaluate(_IN_PAGE_ACT, { door: 'fork', name: name, Kind: Kind, opts: opts }); },
1140
1156
  placeDeclaredAt: function (name, point) { return page.evaluate(_IN_PAGE_ACT, { door: 'placeDeclaredAt', name: name, point: point }); }
1141
1157
  },
1142
1158