The engine-neutral API a Holostep configurator page uses through @holostep-configurators/runtime-client: boot a session, change the scene model, restyle parts, move the camera, drag, assemble, capture and export. The package wins over any note.
Contract 2.0.0 · package sha256 a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e · generated by services/onsite-scripter/scripts/build-contract-docs.mjs; do not edit.
"Spec section N" and the short ids in parentheses (O6, R4, ID8, K47, …) in these pages and in the runtime's messages name the design record a rule comes from. The record is not shipped, and the package is complete without it: read them as provenance, never as something to look up.
llms.txt: the one file to give an AI agent: the one obvious way, the ten likeliest mistakes, imports, boot and every call path. Each page here is also served as Markdown: swap .html for .md.
index.json: the machine-readable index: the page layout, every code and every member's call path.
JsonValue: Any JSON value: what state(), the commit feed, meta and checkpoints hold.
Easing: The time curve of a tween (pose, camera): the CSS Easing Functions Level 1 curves.
DeepReadonly: A value you may read and must not change: every property and array is readonly, at every depth.
PoseInput: A pose to write, with at most one rotation: rotationDeg or quaternion, never both (a type error; an untyped call with both rejects HoloInputError…
ShapeRef: How reads return a mesh shape: JSON, as an ImageRef is for an image, so state(), the feed's patch and inverse, undo steps and event payloads carry…
LinesSpec: A lines item: a polyline in item-local metres.
LabelSpec: A label drawn in the scene (text or image on a quad facing the camera).
LightSpec: Light intensity: KHR_lights_punctual units ×1, relative and not photometric (a sun of 3 lights white to about 1).
ShadowSpec: The runtime owns the shadow map and its filter per quality tier (info().renderer.tier): high 2048 px, medium 1024 px, low 1024 px with a tighter filter…
Connection: Stored top-level in IConfigurator.connections.
Connector: Authored facts plus derived world positions (computed on read).
AttachOptions: The member options of assembly.attach.
AttachReport: attached: false comes with outcome: 'refused' and a reason of 'no-candidate', 'occupied', 'rejected' or 'not-loaded': the first that applies, in the…
Assembly: Connectors and connections between placed models (spec section 6.12).
PlayOptions: The member options of animations.play.
Animations: Clip writes are look-only and not in the write queue: outside a transaction each starts at once, so plays called in the same task start in the same frame.
TryOnKind: The kind of try-on a product's rig is for: 'face' (glasses), 'foot' (shoes), 'wrist' (watches and bracelets), 'finger' (rings), 'ear' (earrings), 'head' (hats).
TryOnMode: Where try-on runs: 'here' in this page, 'handoff' on another device, a phone that opens the hand-off's link (TryOnReport.handoffUrl).
TryOnUnavailable: Why try-on isn't available: 'not-enabled' (the account offers no try-on of this kind, or has not set its consent mode, which every kind needs; a page document…
TryOnAvailability: canTryOn()'s answer for the product on screen, now.
ShadingOutputs: The camelCased gltf_pbr inputs; omitted ones keep the material's.
ShadingValue: What Shading.set takes for a uniform of type T: a number for 'float', a Point2 for 'vector2', a Point3 for 'vector3', a ColorValue or linear…
Shading: A shading graph, worn through MaterialSpec.labs.shading.
Labs: Members that serve one app or wrap an engine-shaped capability.
21. Stored data (vendored; replaces @holo/interfaces) ​
IPrice: A stored price of a MaterialNode (the product envelope; the runtime never prices).
normalizeNodeIds: Repairs old saves: mints missing ids, re-mints duplicates, remaps defaultNodeId, preset node ids, globalMaterialList[].globalMaterial and connections, and…
connectionsBasis: The basis fingerprint to store beside connections, as IConfigurator.connectionsBasis: sha256 (hex) of the canonical JSON (RFC 8785) of nodeId, glbUrl…
cameraViewFromStored: A stored defaultView (IConfigurator.defaultView, SceneModel.defaultView: degrees, named azimuth, polar, radius) as the CameraViewcamera.set…
math.projection: Projection through a camera you describe, not the live one (camera.project projects through camera.state only): where points land in a capture before you…
testing.TraceEntry: One step of an operation through the states of spec section 6.2.
testing.FakeSession: A Session that runs in Node with fake timers, plus controls for tests.
testing.createFakeSession: A fake session: the runtime's own implementation of the spec's section 6 tables, without a renderer.
testing.fakeModelFromGlb: A FakeModel read from a GLB with no browser, so a test drives the fake with the product it ships instead of a hand-written tree: nodes in the scene's…
testing.manifestFromGlb: A GLB's manifest, read with no browser and no engine (Node 20 or later, or a page), for an author with a file and no human: its parts, slots, connector…
target-unmatched: A query matched nothing, or a placed model's globalMaterialListmeshName matches none of its meshes but is close to one (a typo; once, at the commit that places the model); …
target-ambiguous: A single-part member (follow target, attachTo) matched several parts; nothing applied.
asset-failed: A GLB, texture or HDR failed in a declarative write; the write committed without it.
asset-degraded: A preferred asset failed to fetch, decrypt or parse and a fallback was drawn instead: a .holo's plain twin (url the .holo, spec section 8.5), or glbUrl after optGlbUrl…
ready-timeout: Readiness expired: the commit shows with stand-ins or old looks until assets decode.
transaction-timeout: A transaction made no progress for timeoutMs, or hit the hold cap; it rolled back.
write-after-close: A write through a closed tx or its handles (HoloTransactionClosedError).
beforeCommit-threw: A beforeCommit function threw, or was pending after 10 s; its writes were undone.
beforeCommit-slow: A beforeCommit function averaged over about 5 ms across its last 10 commits; recorded at most once per function per 10 s, with the count and the mean in message.
connection-stale: A connection's planes no longer meet (0.5 mm, 0.5°); it was dropped.
handle-disposed: A disposed handle or removed part was used; nothing happened.
owner-disposed: Undo or redo skipped a change made by an owner that is disposed: listed in that undo's or redo's problems, path the owner's address (/look/collections/{name} for a…
unsupported-spec: A value this runtime or device can't apply (a UV channel, sizeM without uvMetres, a shading node, a linked light past the limit, a material ref no apply() defines), or an…
not-storable: Reserved: a value the stored format can't hold is an Issue of validate and an unstorable entry of materialNodeFromSpec (IssueCode 'not-storable'), never a Problem in…
space-not-storable: Reserved: space: 'parent' in a document meant to be saved is an Issue of validate('configurator') (IssueCode 'space-not-storable'), never a Problem in 2.0.0.
frame-needs-compile: A Frame.material value needs a new shader; it was skipped.
frame-budget: Frame hooks together averaged over 3 ms per frame across the last 60 drawn frames, or a constrain over 1 ms across its last 60 calls; recorded at most once per 10 s for each,…
handler-threw: An event handler or frame hook threw (a hook that throws 3 frames in a row is removed: 'hook-removed').
hook-removed: A frame hook threw on 3 frames in a row and the runtime removed it: recorded once, right after that third 'handler-threw', with path 'onFrame' and the function's name, when…
handler-async: An event handler returned a Promise (an untyped call); it was not awaited.
engine-conflict: Another 3D engine instance on the page conflicts with the runtime's (info().renderer.engineConflict).
tenant-document-absent: No stored viewer-document layer for configuratorId (a 404; info().document.layers 'tenant'): the layers below apply.
tenant-document-unavailable: The stored viewer-document layer couldn't be fetched (any failure but a 404); the session runs with the layers below.
defaults-unavailable: The platform or account defaults couldn't be fetched; built-in defaults apply.
document-error: A document layer has an invalid or version-1 key; didYouMean names its 2.0 home.
apply-failed: The runtime failed while applying a document layer, not for a bad key ('document-error'): one entry with layer and no path in ApplyReport.problems (applyDocument, …
sync-failed: An internal failure while the runtime applied a state write, recorded or look-only (setSceneModel, undo, Collection.set, stage.set, attach, a rule), through session…
host-disconnected: el left the document after boot, which freed the renderer for good (spec section 6.5).
render-lost: The view stopped drawing: the graphics context was lost and came back neither on its own nor on a fresh canvas.
host-unsized: el has no size to draw at: under 64 CSS px on a side, or not rendered (display: none on it or an ancestor), at the first drawn frame or a resize; once until it has a size again.
unknown-boot-option: boot got an option this contract doesn't have; it was ignored.
unknown-event: on() got an event name that doesn't exist; it subscribed to nothing.
invalid-input: A call rejected or threw HoloInputError; recorded so an unawaited one is never silent.
hotspot-id-taken: Two hotspot badges share an id; the later one is skipped.
deprecated: Reserved for a labs member or value that will change; the strict fake throws on it.
not-permitted: A gated capability this account may not use (permits() is false).
unknown-capability: supports() got an id not in this runtime's KnownCapability, once per id per session; didYouMean names a 1.4 id's 2.0 id (none when the member is always present), else close…
connections-outdated: Stored connections whose connectionsBasis no longer matches their nodes: none restored.
read-while-queued: Strict fake only: code read a target that still had a write queued behind a transaction.
invalid-input: A value or combination the member refuses, e.g. a zero PoseInput.scale component.
missing-node-id: A node without a nodeId (spec section 6.9, ID9).
duplicate-node-id: Two nodes share a nodeId (ID9); normalizeNodeIds repairs an old save.
rotation-twice: An untyped pose or patch with both rotations, rotationDeg and quaternion.
unknown-field: A field the spec or schema of the page's declared contract doesn't have, or an applyPatch node field path whose field the stored node format doesn't have and the node doesn't…
unknown-id: An id that names nothing the member takes, e.g. a select group that is no global-material GroupNode, a view not in camera.views, an ImageRef or ShapeRef that is not live,…
option-in-transaction: A commit option passed through a tx by an untyped call; always thrown at the call.