@descix/frqtl-node 0.6.0-p0.1 → 0.6.0-p0.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.
- package/CLAUDE.md +1 -1
- package/LICENSE.md +664 -0
- package/README.md +1 -1
- package/dist/dist-manifest.json +125 -125
- package/dist/fat/pkg-node/egpt_wasm.js +7 -7
- package/dist/fat/pkg-node/egpt_wasm_bg.wasm +0 -0
- package/dist/fat/pkg-node/package.json +1 -1
- package/dist/frqtl/compat/providers/wasm-engine.js +29 -31
- package/dist/frqtl/compat/providers/wasm-load-browser.js +2 -2
- package/dist/frqtl/compat/renderer/RenderFamily.js +1 -2
- package/dist/frqtl/compat/renderer/RenderMesh.js +2 -3
- package/dist/frqtl/compat/renderer/RenderShape.js +1 -1
- package/dist/frqtl/compat/renderer/captureStill-common.js +1 -2
- package/dist/frqtl/compat/renderer/display-slot.js +1 -1
- package/dist/frqtl/compat/renderer/providers/p5-provider.js +5 -5
- package/dist/frqtl/compat/renderer/providers/three-camera-contract.js +1 -1
- package/dist/frqtl/compat/renderer/providers/three-camera-geometry.js +4 -4
- package/dist/frqtl/compat/renderer/providers/three-provider.js +23 -27
- package/dist/frqtl/compat/renderer/renderCapabilities-common.js +2 -2
- package/dist/frqtl/compat/renderer/renderer-provider-contract.js +1 -1
- package/dist/frqtl/compat/vendor.js +2 -2
- package/dist/frqtl/objects/FrqtlApp.js +22 -24
- package/dist/frqtl/objects/ObjectFactory.js +1 -2
- package/dist/frqtl/objects/constants/WallBehaviors.js +5 -5
- package/dist/frqtl/objects/geometry/SlabFace.js +6 -6
- package/dist/frqtl/objects/instruments/capture-host.js +2 -2
- package/dist/frqtl/objects/instruments/capture.js +4 -5
- package/dist/frqtl/objects/instruments/hosted-eyes.js +3 -4
- package/dist/frqtl/objects/objects/DirectedTunnel.js +10 -11
- package/dist/frqtl/objects/objects/LightSource.js +22 -25
- package/dist/frqtl/objects/objects/QuantumEmitter.js +14 -14
- package/dist/frqtl/objects/objects/Tube.js +14 -14
- package/dist/frqtl/objects/objects/absorbRadiation.js +12 -13
- package/dist/frqtl/objects/objects/actionCompiler.js +52 -52
- package/dist/frqtl/objects/objects/controlAction.js +2 -2
- package/dist/frqtl/objects/objects/controlBind.js +2 -2
- package/dist/frqtl/objects/objects/directedRedirectProgram.js +3 -3
- package/dist/frqtl/objects/objects/emitterProgram.js +9 -9
- package/dist/frqtl/objects/objects/frqtl-control-slider.js +3 -3
- package/dist/frqtl/objects/objects/frqtl-control-sync.js +9 -9
- package/dist/frqtl/objects/objects/frqtl-control-widgets.js +2 -2
- package/dist/frqtl/objects/objects/frqtl-control-write-queue.js +2 -2
- package/dist/frqtl/objects/objects/makeControlsForObject.js +25 -29
- package/dist/frqtl/objects/objects/makeControlsForRenderSurface.js +2 -2
- package/dist/frqtl/objects/objects/slitLinerScatter.js +8 -10
- package/dist/frqtl/objects/objects/sustainedSource.js +15 -16
- package/dist/frqtl/objects/objects/tagger.js +2 -2
- package/dist/frqtl/objects/schema/engine-scopes.js +11 -12
- package/dist/frqtl/objects/schema/index.js +6 -6
- package/dist/frqtl/objects/schema/scopes.js +10 -10
- package/dist/frqtl/objects/setup/_collisionMatrixLanes.js +1 -1
- package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +1 -1
- package/dist/frqtl/objects/setup/setupCollisionMatrix.js +3 -3
- package/dist/frqtl/objects/setup/setupConeEmitter3D.js +7 -8
- package/dist/frqtl/objects/setup/setupDoubleSlit.js +20 -21
- package/dist/frqtl/objects/setup/setupFxSmoke.js +1 -1
- package/dist/frqtl/objects/setup/setupLightSourceLab.js +23 -26
- package/dist/frqtl/objects/setup/setupSphereEmitter3D.js +39 -40
- package/dist/frqtl/objects/setup/setupTunnelLab.js +17 -19
- package/dist/frqtl/objects/setup/setupTunnelPointExit.js +1 -1
- package/dist/frqtl/objects/setup/setupWaveInterference.js +4 -5
- package/dist/frqtl/objects/v1-replacements.js +0 -1
- package/dist/frqtl/parts/CameraControls.js +5 -5
- package/dist/frqtl/parts/CameraPath.js +1 -1
- package/dist/frqtl/parts/CollisionActions.js +2 -3
- package/dist/frqtl/parts/CollisionTypes.js +1 -2
- package/dist/frqtl/parts/DetectorWall.js +10 -10
- package/dist/frqtl/parts/FrqtlControlsPanel.js +11 -11
- package/dist/frqtl/parts/FrqtlVision.js +1 -1
- package/dist/frqtl/parts/GraphingDetectorWall.js +3 -4
- package/dist/frqtl/parts/LargeObject.js +7 -8
- package/dist/frqtl/parts/LightColor.js +2 -2
- package/dist/frqtl/parts/LiveChart.js +1 -1
- package/dist/frqtl/parts/LogicGate.js +4 -7
- package/dist/frqtl/parts/OvenBox.js +1 -2
- package/dist/frqtl/parts/PointSource.js +10 -11
- package/dist/frqtl/parts/SlitLightSource.js +6 -6
- package/dist/frqtl/parts/SlitScreen.js +14 -14
- package/dist/frqtl/parts/SphereEmitter.js +24 -24
- package/dist/frqtl/parts/Tunnel.js +17 -17
- package/dist/frqtl/parts/Wall.js +17 -17
- package/dist/frqtl/scenes/dse-one-emitter.js +1 -1
- package/dist/frqtl/scenes/dse-one-slit.js +2 -2
- package/dist/frqtl/scenes/dse-photoelectric.js +3 -3
- package/dist/frqtl/scenes/dse-tunnel-rebuild.js +5 -6
- package/dist/frqtl/scenes/dse-two-emitters.js +1 -1
- package/dist/frqtl/scenes/dse-two-slits.js +2 -2
- package/dist/frqtl/scenes/laser-buildup.js +1 -1
- package/dist/frqtl/scenes/mirror-3d.js +4 -4
- package/dist/frqtl/scenes/mirror-route.js +9 -9
- package/dist/frqtl/scenes/mirror.js +1 -1
- package/dist/frqtl/scenes/self-interference.js +1 -1
- package/dist/frqtl/scenes/smoking-gun.js +1 -1
- package/dist/frqtl/scenes/sun.js +2 -2
- package/dist/shim/bundle/frqnb.js +3 -3
- package/dist/shim/bundle/index.js +1 -1
- package/dist/shim/bundle/manifest.js +2 -2
- package/dist/shim/bundle/zip.js +1 -1
- package/dist/shim/controls/index.js +14 -14
- package/dist/shim/controls/registry.js +3 -3
- package/dist/shim/engine/artifact-shell.js +1 -2
- package/dist/shim/engine/router.js +15 -17
- package/dist/shim/expr/ast-schema.js +5 -5
- package/dist/shim/field-descriptor/index.js +7 -8
- package/dist/shim/frame-data/index.js +3 -3
- package/dist/shim/index.js +4 -4
- package/dist/shim/notebook/canvas-guard.js +1 -1
- package/dist/shim/notebook/catalog.js +2 -2
- package/dist/shim/notebook/format.js +26 -26
- package/dist/shim/notebook/kernel.js +3 -4
- package/dist/shim/notebook/knob.js +0 -1
- package/dist/shim/notebook/module-resolver.js +6 -6
- package/dist/shim/notebook/produced-bindings.js +1 -1
- package/dist/shim/notebook/setup-builder.js +9 -12
- package/dist/shim/notebook/vendor-importmap.js +1 -1
- package/dist/shim/notebook/view-builder.js +1 -1
- package/dist/shim/notebook/view-ctx.js +1 -1
- package/dist/shim/notebook/warmup.js +2 -2
- package/dist/shim/page-params/index.js +8 -9
- package/dist/shim/registry/copy-gate.js +1 -1
- package/dist/shim/registry/exhibits.js +4 -4
- package/dist/shim/registry/experiments.js +3 -3
- package/dist/shim/registry/walkthrough.js +21 -24
- package/dist/shim/render/render-stages.js +2 -2
- package/dist/shim/render/sun-look.js +2 -2
- package/dist/shim/rpc/index.js +2 -2
- package/dist/shim/runtime/index.js +12 -12
- package/dist/shim/storage/modules.js +8 -8
- package/llms.txt +2 -2
- package/package.json +4 -3
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* (rung cl1d-mirror-route).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// A CLOSED {10/3} STAR BILLIARD
|
|
13
|
+
// A CLOSED {10/3} STAR BILLIARD: a 2-particle-wide laser loops
|
|
14
14
|
// m1→m2→…→m10→m1 FOREVER. Ten mirrors at the vertices of a regular decagon; each tilt solved
|
|
15
15
|
// from its in/out chords so the reflected centre-line hits the next mirror, and the star's
|
|
16
16
|
// symmetry closes the tenth leg back into the first. Each mirror tags the beam with its own
|
|
@@ -42,17 +42,17 @@ export default function buildExperiment(exp) {
|
|
|
42
42
|
var IS3D = FrqtlDisplay.name() === 'three';
|
|
43
43
|
var W = 600, H = 400, WORLD_D = 600; // THE WORLD this scene states (its co-init call below)
|
|
44
44
|
var f = Math.min(W, H) / 600;
|
|
45
|
-
// R 225·f
|
|
45
|
+
// R 225·f: adjacent decagon vertices sit 2R·sin18° ≈ 0.618R apart vs slab
|
|
46
46
|
// height ~110·f, so the mirrors separate with clear gaps. Fit: R + rotated-slab half-diagonal
|
|
47
47
|
// (≈55·f) stays inside min(W,H)/2 with margin.
|
|
48
48
|
var CX = Math.round(W / 2), CY = Math.round(H / 2), R = Math.round(225 * f), HOP = 3, ROT = 12;
|
|
49
|
-
// CAP 6400 / burst 8 (
|
|
49
|
+
// CAP 6400 / burst 8 (brightness retune): a VERY BRIGHT braid. The cap is
|
|
50
50
|
// LIVE-controllable off the population counter (select 'population' in Layers → Inspector
|
|
51
51
|
// 'Population Gate').
|
|
52
52
|
var SW = Math.max(10, Math.round(14 * f)), SH = Math.max(70, Math.round(110 * f)), CAP = 6400;
|
|
53
53
|
// SD — the 3D slab z-depth: a 2:1 tile (twice the slab height, z-centred on the beam plane).
|
|
54
54
|
// The scene z-collimator clamps ALL quanta to this band, so every mirror provably faces every
|
|
55
|
-
// alive quantum
|
|
55
|
+
// alive quantum.
|
|
56
56
|
var SD = 2 * SH;
|
|
57
57
|
// Each mirror a DIFFERENT colour = its identity (a red→magenta rainbow); the recolor hook
|
|
58
58
|
// stamps that colour onto every particle it reflects (string_map['render.color']).
|
|
@@ -76,7 +76,7 @@ export default function buildExperiment(exp) {
|
|
|
76
76
|
if (Math.abs(((op - outA + 540) % 360) - 180) > 0.5) { o = (o + 90) % 360; }
|
|
77
77
|
ORI.push(o);
|
|
78
78
|
}
|
|
79
|
-
// The NARROW STRAIGHT-WALK laser (
|
|
79
|
+
// The NARROW STRAIGHT-WALK laser (the exemplar): the SAME emitter as Rung 1
|
|
80
80
|
// (Straight Walk) — preset 'particle-walk', every walk-character field INHERITED from the same
|
|
81
81
|
// factory defaults (chargeMode 'positive', dim 0 = 'light' P=1, fundamentalWaveLength 64 → the
|
|
82
82
|
// λ16 braided transverse ripple) — with ONLY the deliberate loop deltas: (a) a 2px source line
|
|
@@ -86,7 +86,7 @@ export default function buildExperiment(exp) {
|
|
|
86
86
|
var pS = pos[9], p0 = pos[0];
|
|
87
87
|
var dx = p0[0] - pS[0], dy = p0[1] - pS[1], L = Math.hypot(dx, dy), ux = dx / L, uy = dy / L;
|
|
88
88
|
var emit = [Math.round(pS[0] + 70 * f * ux), Math.round(pS[1] + 70 * f * uy)];
|
|
89
|
-
// EMISSION-CAP GATE as DECLARED DATA (
|
|
89
|
+
// EMISSION-CAP GATE as DECLARED DATA (the blackbody-thermostat pattern):
|
|
90
90
|
// emissionCap + gateCounter compile at CONSTRUCTION into a host tick-fn reading
|
|
91
91
|
// Wall.getLiveCount on the background counter named 'population' (placed below — the by-name
|
|
92
92
|
// reference resolves lazily on the first tick). The closed loop has NO sink, so the gate pauses
|
|
@@ -113,8 +113,8 @@ export default function buildExperiment(exp) {
|
|
|
113
113
|
name: 'm' + (i + 1), color: PAL[i], hooks: ['recolor'] }));
|
|
114
114
|
}
|
|
115
115
|
if (IS3D) {
|
|
116
|
-
// SCENE Z-COLLIMATOR (
|
|
117
|
-
//
|
|
116
|
+
// SCENE Z-COLLIMATOR (without it the z lets things pass through instead of
|
|
117
|
+
// reflecting): the legs' z-braid diffuses lap over lap; any quantum beyond the mirrors'
|
|
118
118
|
// z-band would sail BESIDE a plate on the leg line — reading as a beam passing THROUGH the
|
|
119
119
|
// mirror. Two INVISIBLE full-canvas destroy boundaries flush with the slab z-band clamp the
|
|
120
120
|
// scene to the mirror faces (the universe z-edge moved inward — the sanctioned
|
|
@@ -124,7 +124,7 @@ export default function buildExperiment(exp) {
|
|
|
124
124
|
exp.addObject('Wall', { rect: [0, 0, W, H], z: -Math.round(SD / 2) - 40, depth: 40,
|
|
125
125
|
collisionBehavior: 'destroy', name: 'zClipNear', visible: false });
|
|
126
126
|
}
|
|
127
|
-
// BACKGROUND POPULATION COUNTER (
|
|
127
|
+
// BACKGROUND POPULATION COUNTER (the canonical objects approach): an INVISIBLE
|
|
128
128
|
// full-canvas Wall with collisionBehavior 'nothing' + the count hook. Every live leaf inside its
|
|
129
129
|
// rect collides every tick, so its per-tick collided-frame count (Wall.getLiveCount, bench LO7
|
|
130
130
|
// mechanics) IS the live population — the ONE 'how many live' authority. In 3D it must contain
|
|
@@ -14,7 +14,7 @@ import { SphereEmitter } from '@descix/frqtl-web/parts';
|
|
|
14
14
|
|
|
15
15
|
export default function buildExperiment(exp) {
|
|
16
16
|
// Collision Lab 1A (Mirror) — a collimated LASER aimed at a rotatable Bounce/Reflect
|
|
17
|
-
// Wall. LASER TUNING
|
|
17
|
+
// Wall. LASER TUNING: particle-walk pins PURE +x momentum (the
|
|
18
18
|
// tightest constrained-angle the emitter supports — zero angular spread); a SINGLE
|
|
19
19
|
// (positive) charge removes the random transverse braiding; wavelength 1 → the
|
|
20
20
|
// minimal transverse wiggle; fundamentalWaveLength 4 → wavelengthScale 1 (the
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// ── Shared physics recipe SOURCES (ONE authority per physics setup) ──────────
|
|
14
14
|
// The render-variant rungs REFERENCE these consts (never copy-paste) and express
|
|
15
15
|
// ONLY a renderState delta — so a future change to a base tuple flows to its
|
|
16
|
-
// variants automatically (no config mirror).
|
|
16
|
+
// variants automatically (no config mirror).
|
|
17
17
|
// The classic self-interference field (Rung 4). Reused VERBATIM by Rung 5
|
|
18
18
|
// (Fountain Pool) with only a water renderState delta.
|
|
19
19
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* Order (it seeds the run): world → brownian/collision flags → the smoke ladder → the muzzle →
|
|
19
19
|
* the wind-down tick-fn → the bullet → its flight tick-fn → the gun body.
|
|
20
20
|
*
|
|
21
|
-
* Card text (
|
|
21
|
+
* Card text (this scene's what / why / how, verbatim; the scene is not on the
|
|
22
22
|
* showcase roster, lib/shim/registry/exhibits.js, so no front-page tile or GYM card shows it):
|
|
23
23
|
* What you are seeing:
|
|
24
24
|
* Explore how you can create CGI-like effects out of emergent physics - if you are a ThreeJS
|
package/dist/frqtl/scenes/sun.js
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* (rung r8-sun).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// The sun — the 3D omni POINT source at the sun.png panel-visible regime
|
|
14
|
-
//
|
|
13
|
+
// The sun — the 3D omni POINT source at the sun.png panel-visible regime
|
|
14
|
+
// (supersedes the bare r-code-a-sun reuse for THIS rung). Panel knobs:
|
|
15
15
|
// dim 2, virtual mass 16 (mass/cap 16/16, fullness 1 — the density driver, ~25012
|
|
16
16
|
// activeQuanta) via wavelength arg 1 (mass = max(1, capacity 16 / 1) = 16, verified
|
|
17
17
|
// vs the factory clamp); λ scale (wavelengthScale) 16 via fundamentalWaveLength 64
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* lib/shim/bundle/frqnb.js — the `.frqnb` teaching/gallery projection of a
|
|
5
|
-
* recipe bundle
|
|
5
|
+
* recipe bundle.
|
|
6
6
|
*
|
|
7
7
|
* Builds a notebook OBJECT (never hand-emitted `<cell>` markup) and serializes
|
|
8
8
|
* it THROUGH `lib/shim/notebook/format.js` `serialize` — the ONE notebook
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* normalized renderState bag.
|
|
16
16
|
*
|
|
17
17
|
* Because it serializes through format.js, ANY new CELL_ATTR added there flows
|
|
18
|
-
* through this projection automatically — the
|
|
18
|
+
* through this projection automatically — the conformance gate asserts it.
|
|
19
19
|
*
|
|
20
20
|
* The canvas cell carries `shape="recipe"` (the CELL_ATTRS discriminator owned by format.js):
|
|
21
21
|
* the module's default export is a RecipeContext recipe (its co-init call + `exp.addObject`), and
|
|
@@ -83,7 +83,7 @@ export function buildFrqnb(args) {
|
|
|
83
83
|
type: 'canvas',
|
|
84
84
|
id: CANVAS_ID,
|
|
85
85
|
setup: MODULE_NAME,
|
|
86
|
-
//
|
|
86
|
+
// The module's DEFAULT export is a `buildExperiment(exp)` RECIPE (RecipeContext
|
|
87
87
|
// form), NOT a `(frqtl,universe,options)` setup factory — declare it so the
|
|
88
88
|
// shim synthesizes the RecipeContext path (a recipe canvas names no export).
|
|
89
89
|
shape: 'recipe',
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* lib/shim/bundle/index.js — the recipe-bundle assembler + importer
|
|
5
|
-
*
|
|
5
|
+
* The canonical owner of the bundle format
|
|
6
6
|
* (design §2): a folder that zips for download —
|
|
7
7
|
*
|
|
8
8
|
* experiment.js ← THE source of truth (the buildExperiment(exp) recipe)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* lib/shim/bundle/manifest.js — the bundle manifest as an ENVELOPE FERRY
|
|
5
|
-
* (
|
|
5
|
+
* (E1).
|
|
6
6
|
*
|
|
7
7
|
* ── The rule (E1): manifest = the Module envelope minus `source` ─────────────
|
|
8
8
|
*
|
|
@@ -44,7 +44,7 @@ export var BUNDLE_ONLY_KEYS = ['sdkVersion', 'preview', 'descix'];
|
|
|
44
44
|
* @param {object} envelope — a `lib/shim/storage/modules.js` Module envelope
|
|
45
45
|
* (MUST carry `source`; every other field is ferried verbatim).
|
|
46
46
|
* @param {object} opts
|
|
47
|
-
* @param {string} opts.sdkVersion — REQUIRED; the CDN pin (e.g. '0.6.0-p0.
|
|
47
|
+
* @param {string} opts.sdkVersion — REQUIRED; the CDN pin (e.g. '0.6.0-p0.2').
|
|
48
48
|
* @param {string|null} [opts.preview] — preview filename ref, or null/omitted.
|
|
49
49
|
* @returns {object} the manifest (JSON-serializable).
|
|
50
50
|
*/
|
package/dist/shim/bundle/zip.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* lib/shim/controls — The control-descriptor schema contract.
|
|
5
5
|
*
|
|
6
|
-
* Single authority for "what shape is a live control knob" (
|
|
7
|
-
*
|
|
6
|
+
* Single authority for "what shape is a live control knob" (gym-controls-as-sugar
|
|
7
|
+
* ratified decisions).
|
|
8
8
|
* Peer of `lib/shim/frame-data` (the data-bubble schema) and `lib/shim/expr/ast-schema`
|
|
9
9
|
* (the op-program AST schema) — same file/export layout convention (a closed vocabulary
|
|
10
10
|
* + a throw-or-apply `normalize`, named ES-module exports).
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
* of every consumer re-deriving "does this look like a camera control?" by hand
|
|
30
30
|
* (the schema-mirror-drift anti-pattern root `CLAUDE.md` calls out).
|
|
31
31
|
*
|
|
32
|
-
* ── Scope (
|
|
32
|
+
* ── Scope (contract only) ────────────────────────────────────────────────────
|
|
33
33
|
*
|
|
34
34
|
* This module ships the SCHEMA + normalize. It does NOT:
|
|
35
|
-
* - render any UI panel (that is
|
|
36
|
-
* - touch the GYM/CompareView.jsx (
|
|
37
|
-
* ad hoc; migrating it to `normalizeControlDescriptor` is
|
|
35
|
+
* - render any UI panel (that is the `frqtl-control-*.js` family),
|
|
36
|
+
* - touch the GYM/CompareView.jsx (it still duck-types these capabilities
|
|
37
|
+
* ad hoc; migrating it to `normalizeControlDescriptor` is later work),
|
|
38
38
|
* - migrate any existing experiment page's `CONTROLS = [...]` literal onto this
|
|
39
39
|
* module (byte-identical arrays remain valid input to `normalizeControlDescriptor`
|
|
40
40
|
* — normalizing is OPT-IN for a new consumer, not a retrofit requirement).
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
// loop — a periodic runner.setup() re-run control. THE PROVEN fx-experiment.js
|
|
68
68
|
// _buildLoopControl() shape: {enabled,ticks,setEnabled,setTicks}.
|
|
69
69
|
//
|
|
70
|
-
// The three kinds below are NEW (
|
|
71
|
-
// gap-census #1,#4,#6,#10 —
|
|
70
|
+
// The three kinds below are NEW (Studio Controls Realignment S1, design §2.2 /
|
|
71
|
+
// gap-census #1,#4,#6,#10 — ratified: "only these three are genuinely new
|
|
72
72
|
// value-shapes"):
|
|
73
73
|
//
|
|
74
74
|
// enum — select-one from a closed candidate set. Covers Studio's
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
// an array the SAME LENGTH as `value` (a per-component bound, e.g. a
|
|
92
92
|
// rect's `w`/`h` needing a different range than `left`/`top`).
|
|
93
93
|
//
|
|
94
|
-
// The two kinds below are NEW (presentation pass Item 2,
|
|
94
|
+
// The two kinds below are NEW (presentation pass Item 2, E-P2a) —
|
|
95
95
|
// the two value shapes no existing kind holds:
|
|
96
96
|
//
|
|
97
97
|
// text — a STRING-valued control: {id,label,value,fmt,onChange} (+ optional
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
// deliberately NOT expressed as a `bind` — a bind is a property
|
|
106
106
|
// read/write pair, and `get()` of "restart" is meaningless.
|
|
107
107
|
//
|
|
108
|
-
// Deliberately NOT separate kinds (
|
|
108
|
+
// Deliberately NOT separate kinds (closed-union discipline —
|
|
109
109
|
// do not propose adding these):
|
|
110
110
|
// - `bool`/`toggle` — a toggle IS a `scalar` with min:0,max:1,step:1 (matches
|
|
111
111
|
// the pre-existing scalar-toggle convention above; no shape distinction).
|
|
@@ -144,7 +144,7 @@ var DEFAULT_PLACE_ANCHOR = 'top-left';
|
|
|
144
144
|
|
|
145
145
|
// ── Widget seam (optional, kind-ORTHOGONAL) ────────────────────────────────────
|
|
146
146
|
//
|
|
147
|
-
// The schema's
|
|
147
|
+
// The schema's rule above ("a toggle IS a scalar 0/1"; "a color IS a
|
|
148
148
|
// vector-3") requires a place to say WHICH widget renders a given descriptor
|
|
149
149
|
// without inventing a kind for it. `widget` is that seam: a closed name list,
|
|
150
150
|
// validated here, resolved to an actual renderer by the ONE widget table
|
|
@@ -267,7 +267,7 @@ var REQUIRED_KEYS_BY_KIND = Object.freeze({
|
|
|
267
267
|
|
|
268
268
|
/**
|
|
269
269
|
* BIND_KEYS — required keys on a scalar/enum/flags/vector descriptor's optional
|
|
270
|
-
* `bind` object (
|
|
270
|
+
* `bind` object (gym-controls-as-sugar binds+ControlSync FINAL design,
|
|
271
271
|
* converged 2026-07-04: "Declarative binds + triggered sync"; extended to
|
|
272
272
|
* enum/flags/vector by S1 — bind's DATA SHAPE is the SAME `{object, prop}` pair regardless
|
|
273
273
|
* of kind, e.g. a `vector` bind on a LargeObject's `rect` writes the WHOLE
|
|
@@ -279,12 +279,12 @@ var REQUIRED_KEYS_BY_KIND = Object.freeze({
|
|
|
279
279
|
* handle-kind dispatch) is OBJECTS-SIDE — it lives with the sugar that
|
|
280
280
|
* already has the registry/accessor references
|
|
281
281
|
* (`lib/frqtl/parts/FrqtlControlsPanel.js`, `controlBind.js`, and
|
|
282
|
-
* `frqtl-control-sync.js`), never here (arrow
|
|
282
|
+
* `frqtl-control-sync.js`), never here (arrow rule: shim owns the DATA
|
|
283
283
|
* shape only). Bind's DATA SHAPE is uniform across channels AND kinds —
|
|
284
284
|
* `channel` is a SIBLING field on the descriptor, already validated above; a
|
|
285
285
|
* render-channel bind still carries `{object, prop}` here, even though the
|
|
286
286
|
* render channel has no read-back (objects-side execution detail, not a shape
|
|
287
|
-
* distinction — see the runtime doc's "non-uniform get()"
|
|
287
|
+
* distinction — see the runtime doc's "non-uniform get()" rule).
|
|
288
288
|
*/
|
|
289
289
|
var BIND_KEYS = Object.freeze(['object', 'prop']);
|
|
290
290
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* lib/shim/controls/registry — the runtime-registerable instance registry
|
|
5
|
-
* (
|
|
5
|
+
* ("Instance addressing").
|
|
6
6
|
*
|
|
7
7
|
* Sugar objects (`SphereEmitter`, `Tube`, a future `*Layer` class, …) and their
|
|
8
8
|
* declared control descriptors (`lib/shim/controls/index.js` shapes) need a
|
|
@@ -119,7 +119,7 @@ import * as ControlsSchema from './index.js';
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
|
-
* Resolve a registered object's `kind` label (
|
|
122
|
+
* Resolve a registered object's `kind` label (gym-controls-as-sugar
|
|
123
123
|
* binds+ControlSync FINAL design — objects-side bind execution needs BOTH
|
|
124
124
|
* the instance (`getObject`, unchanged) AND its kind, to route a scalar
|
|
125
125
|
* descriptor's `bind.object` to the correct property-accessor family
|
|
@@ -242,7 +242,7 @@ import * as ControlsSchema from './index.js';
|
|
|
242
242
|
/**
|
|
243
243
|
* allControls() — a snapshot map `{ name: descriptor[] }` of every
|
|
244
244
|
* registered controls array (for a future host that enumerates
|
|
245
|
-
* everything without knowing names ahead of time — e.g.
|
|
245
|
+
* everything without knowing names ahead of time — e.g. the
|
|
246
246
|
* control panel).
|
|
247
247
|
* @returns {Object<string, object[]>}
|
|
248
248
|
*/
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/* Copyright 2023-2026 by Essam Abadir */
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* artifact-shell.js — pure generator for the claude.ai Artifact host shell
|
|
5
|
-
* (ws-artifact-showcase Bite A2, docs/design/frqtl-artifact-showcase-scoping-2026-07-10.md).
|
|
4
|
+
* artifact-shell.js — pure generator for the claude.ai Artifact host shell.
|
|
6
5
|
*
|
|
7
6
|
* The "artifact host shell" is a SINGLE self-contained HTML file a user pastes
|
|
8
7
|
* into a claude.ai chat as an Artifact. It has no server, no build step, no
|
|
@@ -11,9 +11,8 @@
|
|
|
11
11
|
* baked into the dist pages at build time by `sdk/frqtl-web/build.js`).
|
|
12
12
|
* - `CDN_PROFILE` — the SAME dist layout, resolved to ABSOLUTE jsdelivr URLs
|
|
13
13
|
* (`https://cdn.jsdelivr.net/npm/@descix/frqtl-web@<ver>/dist/...`) for static hosting
|
|
14
|
-
* with no server process at all
|
|
15
|
-
* a DISTINCT profile object, not a DIST_PROFILE parameterization
|
|
16
|
-
* docs/design/frqtl-artifact-showcase-scoping-2026-07-10.md §5.2): DIST_PROFILE's
|
|
14
|
+
* with no server process at all. CDN_PROFILE is
|
|
15
|
+
* a DISTINCT profile object, not a DIST_PROFILE parameterization: DIST_PROFILE's
|
|
17
16
|
* relative bases are meaningless outside the exact dist/experiments/{id}/ page
|
|
18
17
|
* context they were computed for, whereas CDN_PROFILE's
|
|
19
18
|
* absolute bases resolve correctly from ANY host page (a claude.ai Artifact iframe has
|
|
@@ -90,7 +89,7 @@ var DEV_CORE_PROFILE = {
|
|
|
90
89
|
// presets.js hardcoding a '/notebooks/' literal (dev-only, 404s in dist).
|
|
91
90
|
'__notebookBase': '/notebooks',
|
|
92
91
|
// Placed vendor libs (lib/frqtl/assets/vendor/, gitignored artifacts) — the
|
|
93
|
-
// STABLE root-level /vendor alias mounts.js exposes (
|
|
92
|
+
// STABLE root-level /vendor alias mounts.js exposes (§2a.1).
|
|
94
93
|
// A realm cell's bare-specifier import (`import * as d3 from 'd3'`) resolves via
|
|
95
94
|
// a manifest-generated import-map whose base is THIS value (vendor-importmap.js).
|
|
96
95
|
// Single path authority for the vendor URL space — surfaces NEVER derive '/vendor'
|
|
@@ -141,16 +140,15 @@ function buildDistProfile(base) {
|
|
|
141
140
|
|
|
142
141
|
var DIST_PROFILE = buildDistProfile('../..');
|
|
143
142
|
|
|
144
|
-
// ── CDN_PROFILE (jsdelivr static hosting
|
|
143
|
+
// ── CDN_PROFILE (jsdelivr static hosting) ───────────────────────────────────────
|
|
145
144
|
//
|
|
146
145
|
// Pinned-version constants — the "one constant" the packet's absolute jsdelivr
|
|
147
|
-
// bases resolve from (
|
|
148
|
-
// §3b). These are hardcoded (not read from package.json — this module runs in
|
|
146
|
+
// bases resolve from. These are hardcoded (not read from package.json — this module runs in
|
|
149
147
|
// the browser, no fs access) and MUST be bumped alongside each npm publish;
|
|
150
148
|
// lib/shim/engine/test/router.test.mjs asserts them against the two
|
|
151
149
|
// package.json#version fields so a forgotten bump fails `make verify`, not a
|
|
152
150
|
// silent stale-CDN-URL bug.
|
|
153
|
-
var CDN_SDK_VERSION = '0.6.0-p0.
|
|
151
|
+
var CDN_SDK_VERSION = '0.6.0-p0.2'; // sdk/frqtl-web/package.json#version (the ONE version owner) — bound by router.test.mjs
|
|
154
152
|
var CDN_MATH_SDK_VERSION = '0.3.2'; // sdk/egpt-math-sdk/package.json#version — bound by router.test.mjs; bumped with each npm publish
|
|
155
153
|
|
|
156
154
|
/**
|
|
@@ -182,8 +180,8 @@ var CDN_MATH_BASE = 'https://cdn.jsdelivr.net/npm/@descix/egpt-math-sdk@' + CDN_
|
|
|
182
180
|
// different published package.
|
|
183
181
|
//
|
|
184
182
|
// `base` anchors the dist layout at an absolute dist root. With no base it is CDN_BASE (the
|
|
185
|
-
// published jsdelivr copy). With one, it is the SELF-HOSTED form
|
|
186
|
-
//
|
|
183
|
+
// published jsdelivr copy). With one, it is the SELF-HOSTED form: any URL serving an
|
|
184
|
+
// UNMODIFIED copy of the package's dist/ tree —
|
|
187
185
|
// every file dist/dist-manifest.json lists, byte for byte, at its relative path. A hand-picked
|
|
188
186
|
// subset is not supported: the profile below addresses every subtree of the dist, and which files
|
|
189
187
|
// a scene reaches is the game layer's business, not the host's. Callers: bootScene/bootRecipe
|
|
@@ -241,7 +239,7 @@ function buildCdnProfile(base) {
|
|
|
241
239
|
// build.js's imports) gets a byte-identical object to before this refactor.
|
|
242
240
|
var CDN_PROFILE = buildCdnProfile(CDN_BASE);
|
|
243
241
|
|
|
244
|
-
// ── The static site profile (self-contained same-origin static host
|
|
242
|
+
// ── The static site profile (self-contained same-origin static host) ──────────────────────────────
|
|
245
243
|
//
|
|
246
244
|
// The React FraqtlIde deployed as a dumb-static, no-backend, WASM-only site (DeSciX
|
|
247
245
|
// CodeSite / any GCS-backed host — no fraqtlServe, no lib/server/server.js). The host serves the
|
|
@@ -265,7 +263,7 @@ var CDN_PROFILE = buildCdnProfile(CDN_BASE);
|
|
|
265
263
|
// DOCUMENT-RELATIVE values, for a BUILD-TIME consumer whose output the document resolves
|
|
266
264
|
// (the import map baked into index.html).
|
|
267
265
|
//
|
|
268
|
-
// THE DELIBERATE DIVERGENCE FROM CDN_PROFILE (
|
|
266
|
+
// THE DELIBERATE DIVERGENCE FROM CDN_PROFILE (design §A.3 / §E flag 4):
|
|
269
267
|
// CDN_PROFILE's math + notebook bases are hardwired CROSS-ORIGIN at CDN_MATH_BASE; the
|
|
270
268
|
// static-site semantic is "everything self-contained under ONE origin prefix": the math SDK
|
|
271
269
|
// is co-served at graphBase + '/egpt-math-sdk/...' and the curated notebooks ride the
|
|
@@ -296,7 +294,7 @@ function buildStaticProfile(graphBase, entryBase) {
|
|
|
296
294
|
'__mathWasmModuleUrl': graphBase + '/egpt-math-sdk/wasm/egpt_math_sdk_wasm.js',
|
|
297
295
|
'__mathBackend': 'wasm-math',
|
|
298
296
|
// Notebooks come from the frqtl-web dist's OWN copy (build.js copyDir
|
|
299
|
-
// lib/notebooks → dist/notebooks) — NOT under egpt-math-sdk (
|
|
297
|
+
// lib/notebooks → dist/notebooks) — NOT under egpt-math-sdk (design §A.3/§B.1).
|
|
300
298
|
'__notebookBase': graphBase + '/notebooks',
|
|
301
299
|
// Vendor import-map root — frqtl-web's OWN dist/vendor/ (same as CDN, self-
|
|
302
300
|
// sufficient), just same-origin instead of jsdelivr.
|
|
@@ -416,7 +414,7 @@ var _assertProfileParity = (function () {
|
|
|
416
414
|
// The vendor base (__vendorBase) is a PRIVATE key but it MUST exist in ALL
|
|
417
415
|
// FOUR profiles (the single path authority for the /vendor URL space — every
|
|
418
416
|
// host resolves a realm import-map base through it). Assert it explicitly so a
|
|
419
|
-
// profile can never half-define it (
|
|
417
|
+
// profile can never half-define it (§2a.4).
|
|
420
418
|
if (!DEV_CORE_PROFILE.__vendorBase || !DIST_PROFILE.__vendorBase ||
|
|
421
419
|
!CDN_PROFILE.__vendorBase || !STATIC_SAMPLE.__vendorBase) {
|
|
422
420
|
throw new Error('[engineRouter] Profile parity FAIL: __vendorBase must be defined in ALL FOUR profiles.');
|
|
@@ -451,7 +449,7 @@ var _assertProfileParity = (function () {
|
|
|
451
449
|
* `'dev-core'` uses the `lib/server` plugin mounts (`/frqtl`, `/fat`).
|
|
452
450
|
* `'dist'` uses the flat `sdk/frqtl-web/dist` layout, same-origin RELATIVE paths.
|
|
453
451
|
* `'cdn'` uses the SAME dist layout resolved to ABSOLUTE jsdelivr URLs (static
|
|
454
|
-
* hosting with no server
|
|
452
|
+
* hosting with no server).
|
|
455
453
|
* `'static'` uses the SAME dist layout resolved to ABSOLUTE URLs under the site's
|
|
456
454
|
* build-stamped `./pub/<build>` directory (experiment entries at `./pub/experiments/`),
|
|
457
455
|
* anchored at the document (`opts.documentBaseURI`, default `document.baseURI`), with the
|
|
@@ -509,7 +507,7 @@ var _assertProfileParity = (function () {
|
|
|
509
507
|
* // CDN mode (static hosting — the artifact host shell has no server, no page anchor):
|
|
510
508
|
* const cdnRouter = engineRouter({ mode: 'cdn', engine: 'wasm' });
|
|
511
509
|
* console.log(cdnRouter.resolve('compat/engine.js'));
|
|
512
|
-
* // 'https://cdn.jsdelivr.net/npm/@descix/frqtl-web@0.6.0-p0.
|
|
510
|
+
* // 'https://cdn.jsdelivr.net/npm/@descix/frqtl-web@0.6.0-p0.2/dist/frqtl/compat/engine.js'
|
|
513
511
|
*
|
|
514
512
|
* // CDN mode, self-hosted: a copy of dist/ served from the consumer's own origin:
|
|
515
513
|
* const selfHosted = engineRouter({ mode: 'cdn', engine: 'wasm', base: 'https://example.org/vendor/frqtl-web/dist' });
|
|
@@ -573,7 +571,7 @@ export function engineRouter(opts) {
|
|
|
573
571
|
var mode = opts.mode || 'dev-core';
|
|
574
572
|
var engine = opts.engine || 'wasm';
|
|
575
573
|
// FRQTL physics is WASM-only. An explicit 'js' request FAILS LOUD — the JS
|
|
576
|
-
// reference engine is archived
|
|
574
|
+
// reference engine is archived, not a runtime backend.
|
|
577
575
|
if (engine === 'js') {
|
|
578
576
|
throw new Error('[engineRouter] JS reference engine archived — FRQTL is WASM-only. ' +
|
|
579
577
|
'Remove engine:"js"; the only FRQTL physics engine is the compiled Rust/WASM engine.');
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* and by the dual-native evaluators in the JS reference and Rust engines.
|
|
14
14
|
* Arrow-legality: lib/frqtl/objects imports lib/shim (downward — legal).
|
|
15
15
|
*
|
|
16
|
-
* Gate-2
|
|
16
|
+
* Gate-2 binding (slice 3):
|
|
17
17
|
* • Rust NEVER parses — AST-only payload; this schema is the data shape.
|
|
18
18
|
* • NODE_KINDS and vocab lists are the conformance iteration surface
|
|
19
19
|
* (binding item 3 — conformance iterates these lists).
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
* whose target is `<handle>.data.<key>` (a string-map write).
|
|
58
58
|
* MUST throw (JS) / panic (Rust) if used as a child of Bin, Cmp,
|
|
59
59
|
* Fn, or Cond.test — eval_expr stays numeric-pure (INTEGER-FIRST
|
|
60
|
-
*
|
|
60
|
+
* rule; Gate-2 item 2). The op-apply layer
|
|
61
61
|
* (_runOpProgram / apply_set_op) detects StrLit before calling
|
|
62
62
|
* eval_expr and routes it to the string-map writer.
|
|
63
63
|
*
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
* NOTE on StrLit (item 7): StrLit is ONLY valid as the `to` value of a `set`
|
|
127
127
|
* op targeting `<handle>.data.<key>` (a string-map write). Using StrLit as a
|
|
128
128
|
* child of Bin, Cmp, Fn, or Cond.test MUST throw/panic — eval_expr is
|
|
129
|
-
* numeric-pure (INTEGER-FIRST
|
|
129
|
+
* numeric-pure (INTEGER-FIRST rule, Gate-2 item 2).
|
|
130
130
|
*
|
|
131
131
|
* @type {string[]}
|
|
132
132
|
*/
|
|
@@ -154,7 +154,7 @@ var NODE_KINDS = Object.freeze([
|
|
|
154
154
|
* - Frame removal → set 0.is_alive=0 + dead-parent GC
|
|
155
155
|
* - Dimension alloc → universe.addDimension(n) / add_dimension engine method
|
|
156
156
|
*
|
|
157
|
-
* Gate-2
|
|
157
|
+
* Gate-2 binding (§10.8 B3):
|
|
158
158
|
* • B3.2 — 'collect' is NOT a 2nd op. It compiles to:
|
|
159
159
|
* { kind:'set', set:'1.count', to: Bin('+', Ref(HANDLE_SELF,'count'), Lit(1)) }
|
|
160
160
|
* i.e. a plain 'set' op on the LO's 'count' property. No special sink.
|
|
@@ -220,7 +220,7 @@ var CMP_OPS = Object.freeze(['<', '>', '==']);
|
|
|
220
220
|
*
|
|
221
221
|
* This is the canonical overlap test for op-programs (replaces the native
|
|
222
222
|
* overlaps/past_wall gate that was deleted from process_large_object_collisions in
|
|
223
|
-
* G2b). The JS reference
|
|
223
|
+
* G2b). The JS reference engine is FROZEN — intersects is a WASM-canonical
|
|
224
224
|
* addition only (JS reference keeps the old native gate).
|
|
225
225
|
*
|
|
226
226
|
* Draw discipline: intersects draws ZERO RNG values (deterministic geometry).
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* lib/shim/field-descriptor — the shared FIELD-SHAPE vocabulary contract.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* escalation was that a single FIELD shape — `{name, type, constraint, unit,
|
|
6
|
+
* Studio Controls Realignment §7 r2, C1: a single FIELD shape — `{name, type, constraint, unit,
|
|
8
7
|
* description, engineVisible, widgetHint, widgetConfig, default}` — and its
|
|
9
8
|
* closed TYPE vocabulary were about to be re-derived THREE times (physics
|
|
10
9
|
* object schema, the new render-capability descriptors, and a future Rosetta
|
|
@@ -175,13 +174,13 @@ function normalizeFieldDescriptor(partial) {
|
|
|
175
174
|
return bag;
|
|
176
175
|
}
|
|
177
176
|
|
|
178
|
-
// ── UX presentation vocabulary
|
|
177
|
+
// ── UX presentation vocabulary ──────────────────────────────────────────────
|
|
179
178
|
//
|
|
180
179
|
// A per-KIND `ux:{}` block rides ON the ObjectSchema descriptor (peer of `fields`
|
|
181
|
-
// — a presentation contract, NOT a parallel `UxSchema`;
|
|
180
|
+
// — a presentation contract, NOT a parallel `UxSchema`; Q-A0). Its
|
|
182
181
|
// closed value vocabularies live HERE, the PEER of FIELD_TYPES, so STUDIO's
|
|
183
182
|
// overlay AND a headless game consume ONE list (the SAME hooks a game uses
|
|
184
|
-
// programmatically
|
|
183
|
+
// programmatically). The vocab is READ DOWNWARD ONLY (shim → objects/
|
|
185
184
|
// features); no lib/frqtl/objects file re-lists these strings, and
|
|
186
185
|
// author-bbox-overlay.js (lib/features) FERRIES `UX_HANDLE_ZONES` (asserting its
|
|
187
186
|
// own returned zone names are members) instead of being a second owner.
|
|
@@ -204,10 +203,10 @@ var UX_HANDLE_ZONES = Object.freeze([
|
|
|
204
203
|
// (reposition is the aim + SPACE carry), so there is no per-object 3D knob to declare.
|
|
205
204
|
var UX_DRAGGABLE_MODES = Object.freeze(['2d']);
|
|
206
205
|
|
|
207
|
-
// When a manipulable object's visual shell renders (generalizes the
|
|
206
|
+
// When a manipulable object's visual shell renders (generalizes the
|
|
208
207
|
// `_designMarker` boolean at the ONE _visibleLargeObjects authority):
|
|
209
|
-
// design — only while authoring (Design mode). The
|
|
210
|
-
// run — always visible (the
|
|
208
|
+
// design — only while authoring (Design mode). The marker default.
|
|
209
|
+
// run — always visible (the "red light bulb" opt-in).
|
|
211
210
|
// never — never drawn.
|
|
212
211
|
var UX_SHELL_RENDER = Object.freeze(['design', 'run', 'never']);
|
|
213
212
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* lib/shim/frame-data — The data-bubble schema contract.
|
|
5
5
|
*
|
|
6
6
|
* Single authority for the FrameData.data bag shape (§6 of
|
|
7
|
-
*
|
|
7
|
+
* the engine contract). The bubble is GENERIC and engine-opaque:
|
|
8
8
|
* SECTION_KEYS = ['detection', 'string_map']. The engine interprets NOTHING in
|
|
9
9
|
* string_map — it ferries every key verbatim across the JS↔WASM boundary.
|
|
10
10
|
*
|
|
@@ -133,10 +133,10 @@ function normalizeDetection(partial) {
|
|
|
133
133
|
* local override of the experiment-wide setRenderOption('meshScale',…)). OPEN-ID.
|
|
134
134
|
* render.meshRotation— per-frame euler rotation for the frame's render.mesh clone, a CSV of THREE radians
|
|
135
135
|
* 'rx,ry,rz' (same unit as a LargeObject's lo.meshRotation → clone.rotation.set). OPEN-ID.
|
|
136
|
-
* (
|
|
136
|
+
* (R3-3: previously written ad-hoc but undeclared + unread; declared
|
|
137
137
|
* here at the owner and read per-clone in three-provider's _layoutMeshClones.)
|
|
138
138
|
*
|
|
139
|
-
* Two contract shapes
|
|
139
|
+
* Two contract shapes:
|
|
140
140
|
* ENUM key — has a RENDER_INTENT_VALUES[] array; decoders ferry the array (no re-listing); conformance-validated.
|
|
141
141
|
* OPEN-ID key — has NO RENDER_INTENT_VALUES entry → assertRenderIntentConformance accepts any string; the
|
|
142
142
|
* decoder/resolver owns load-time validation and fails loud. Covers render.color and render.mesh.
|
package/dist/shim/index.js
CHANGED
|
@@ -37,20 +37,20 @@ export { engineRouter, DEV_CORE_PROFILE, DIST_PROFILE } from './engine/router.js
|
|
|
37
37
|
// canonical URL — there is only one MathBackendRegistry instance. The registry
|
|
38
38
|
// module has zero imports; the JS reference core never enters this graph.
|
|
39
39
|
export { MathBackendRegistry, MathBackendNotAvailableError } from '../egpt/js/model/backend/MathBackendRegistry.js';
|
|
40
|
-
// Notebook spine
|
|
40
|
+
// Notebook spine: the native format parser/serializer and the
|
|
41
41
|
// per-notebook kernel. The kernel calls Runtime.runCell directly (no Bus
|
|
42
42
|
// executor). Consumers (the A2 notebook pane) import these from the barrel.
|
|
43
43
|
export { parse, serialize, normalize } from './notebook/format.js';
|
|
44
44
|
export { NotebookKernel, NOTEBOOK_CELL_STATUS } from './notebook/kernel.js';
|
|
45
|
-
// Cell-as-module resolver (
|
|
45
|
+
// Cell-as-module resolver (B2) — the host-neutral in-memory
|
|
46
46
|
// blob closure logic. Re-exported so tests + any host can build the closure
|
|
47
47
|
// (Runtime injects the browser blob minter; the resolver itself is DOM-free and
|
|
48
|
-
// must NOT assume a pane exists — model-gate
|
|
48
|
+
// must NOT assume a pane exists — model-gate rule 6).
|
|
49
49
|
export {
|
|
50
50
|
canonKey, resolveRelativeKey, hasImport, splitImportsAndBody,
|
|
51
51
|
rewriteRelativeToSiblingBlobs, buildModuleClosure, compileEntryModuleSource
|
|
52
52
|
} from './notebook/module-resolver.js';
|
|
53
|
-
// Notebook webview-realm model
|
|
53
|
+
// Notebook webview-realm model: the FOURTH BYO pluggable
|
|
54
54
|
// surface. ONE registry authority + the frozen view-handle contract + the in-app
|
|
55
55
|
// transport (same-origin direct fast path). A realm pre-load
|
|
56
56
|
// is an above-the-shim renderer env; the frqtl pre-load co-locates the engine.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* canvas-guard — the SOLE C8 migration-guard authority for a DECLARED canvas cell
|
|
5
|
-
*
|
|
5
|
+
* PURE module — NO DOM / engine / Runtime / Bus
|
|
6
6
|
* import. The notebook-pane's `_resolveDeclaredCanvas` imports this one helper so no
|
|
7
7
|
* host re-derives the legality test (DRY — one guard).
|
|
8
8
|
*
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* firstContactNotebook — the ONE reader of the notebook catalog's first-contact default.
|
|
5
5
|
*
|
|
6
6
|
* The catalog (lib/notebooks/notebooks.json) owns the notebook roster AND, beside it, the
|
|
7
|
-
* `firstContact` id: the notebook FAT opens on when no `?notebook=` is named (
|
|
8
|
-
*
|
|
7
|
+
* `firstContact` id: the notebook FAT opens on when no `?notebook=` is named (the
|
|
8
|
+
* Entropy-Log Bijection). Declared beside the roster, as the walkthrough registry
|
|
9
9
|
* declares FIRST_CONTACT_WALKTHROUGH_ID beside its rungs. A deep link naming a notebook wins;
|
|
10
10
|
* that branch never reaches this reader.
|
|
11
11
|
*
|