@vibecook/ice 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/{chunk-5OU3OWDH.js → chunk-3SUDKHUF.js} +3 -3
  2. package/dist/{chunk-LATXYFMO.js → chunk-BE4F4X3Q.js} +148 -37
  3. package/dist/{chunk-LATXYFMO.js.map → chunk-BE4F4X3Q.js.map} +1 -1
  4. package/dist/{chunk-55QCOE74.js → chunk-CBCSIEXW.js} +2 -2
  5. package/dist/devtools.js +1 -1
  6. package/dist/dom.js +2 -2
  7. package/dist/ground.js +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/r3f.js +3 -3
  10. package/dist/react.js +3 -3
  11. package/dist/types/packages/core/src/facade/create-canvas-engine.d.ts +28 -6
  12. package/dist/types/packages/core/src/index.d.ts +1 -1
  13. package/dist/types/packages/core/src/interaction/install.d.ts +1 -1
  14. package/dist/types/packages/core/src/nav/nested-canvas.d.ts +1 -1
  15. package/dist/types/packages/core/src/ops/point-pick.d.ts +1 -1
  16. package/dist/types/packages/core/src/ops/port-geometry.d.ts +1 -1
  17. package/dist/types/packages/core/src/presence/presence-kit.d.ts +11 -0
  18. package/dist/types/packages/core/src/presence/remote-cursors.d.ts +10 -7
  19. package/dist/types/packages/core/src/systems/l1-pick.d.ts +1 -1
  20. package/dist/types/packages/core/src/systems/l1-wires.d.ts +1 -1
  21. package/dist/types/packages/core/src/systems/l3-connect.d.ts +1 -1
  22. package/dist/types/packages/core/src/systems/l3-drop.d.ts +1 -1
  23. package/dist/types/packages/core/src/systems/l3-marquee.d.ts +1 -1
  24. package/dist/types/packages/core/src/systems/l3-ports.d.ts +1 -1
  25. package/dist/types/packages/core/src/systems/l3-snap.d.ts +1 -1
  26. package/dist/types/packages/core/src/systems/nav-flight.d.ts +1 -1
  27. package/dist/types/packages/devtools/src/attach.d.ts +1 -1
  28. package/dist/types/packages/dom/src/loop.d.ts +1 -1
  29. package/dist/types/packages/dom/src/measure-adapter.d.ts +1 -1
  30. package/dist/types/packages/dom/src/measure-wiring.d.ts +1 -1
  31. package/dist/types/packages/dom/src/pointer-adapter.d.ts +1 -1
  32. package/dist/types/packages/dom/src/reflectors/chrome.d.ts +1 -1
  33. package/dist/types/packages/dom/src/reflectors/cursor.d.ts +1 -1
  34. package/dist/types/packages/dom/src/reflectors/dom-widgets.d.ts +1 -1
  35. package/dist/types/packages/dom/src/reflectors/graybox.d.ts +1 -1
  36. package/dist/types/packages/dom/src/reflectors/plane-transform.d.ts +1 -1
  37. package/dist/types/packages/dom/src/reflectors/remote-cursors.d.ts +1 -1
  38. package/dist/types/packages/dom/src/widget-focus.d.ts +1 -1
  39. package/dist/types/packages/ground/src/index.d.ts +2 -2
  40. package/dist/types/packages/ground/src/layer.d.ts +1 -1
  41. package/dist/types/packages/ground/src/pass.d.ts +1 -1
  42. package/dist/types/packages/ground/src/passes/grid.d.ts +1 -1
  43. package/dist/types/packages/ground/src/passes/guides-collect.d.ts +1 -1
  44. package/dist/types/packages/ground/src/passes/guides.d.ts +1 -1
  45. package/dist/types/packages/ground/src/passes/wires-collect.d.ts +1 -1
  46. package/dist/types/packages/ground/src/passes/wires.d.ts +1 -1
  47. package/dist/types/packages/r3f/src/bridge.d.ts +1 -1
  48. package/dist/types/packages/r3f/src/compositor-pass.d.ts +1 -1
  49. package/dist/types/packages/r3f/src/dev-write-trap.d.ts +1 -1
  50. package/dist/types/packages/r3f/src/gl-root.d.ts +1 -1
  51. package/dist/types/packages/r3f/src/gl-router.d.ts +2 -2
  52. package/dist/types/packages/r3f/src/island-state.d.ts +1 -1
  53. package/dist/types/packages/r3f/src/island.d.ts +1 -1
  54. package/dist/types/packages/r3f/src/use-island-frame.d.ts +1 -1
  55. package/dist/types/packages/react/src/engine-context.d.ts +1 -1
  56. package/dist/types/packages/react/src/hooks.d.ts +1 -1
  57. package/dist/types/packages/react/src/infinite-canvas.d.ts +2 -2
  58. package/dist/types/packages/react/src/keymap.d.ts +1 -1
  59. package/dist/types/packages/react/src/use-commit.d.ts +1 -1
  60. package/dist/types/packages/react/src/use-presence.d.ts +1 -1
  61. package/dist/types/packages/react/src/widget-root.d.ts +1 -1
  62. package/package.json +2 -2
  63. /package/dist/{chunk-5OU3OWDH.js.map → chunk-3SUDKHUF.js.map} +0 -0
  64. /package/dist/{chunk-55QCOE74.js.map → chunk-CBCSIEXW.js.map} +0 -0
@@ -16,7 +16,7 @@ import {
16
16
  createSiblingOrderIndex,
17
17
  defineQuery,
18
18
  widgets
19
- } from "./chunk-LATXYFMO.js";
19
+ } from "./chunk-BE4F4X3Q.js";
20
20
  import {
21
21
  planeCssTransform,
22
22
  worldToScreen
@@ -1160,4 +1160,4 @@ export {
1160
1160
  wireMeasurement,
1161
1161
  DOM_VERSION
1162
1162
  };
1163
- //# sourceMappingURL=chunk-55QCOE74.js.map
1163
+ //# sourceMappingURL=chunk-CBCSIEXW.js.map
package/dist/devtools.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  WheelPan,
15
15
  WheelZoom,
16
16
  Wire
17
- } from "./chunk-LATXYFMO.js";
17
+ } from "./chunk-BE4F4X3Q.js";
18
18
  import "./chunk-OR5FNVUE.js";
19
19
 
20
20
  // ../devtools/src/attach.ts
package/dist/dom.js CHANGED
@@ -19,8 +19,8 @@ import {
19
19
  startRafLoop,
20
20
  wheelCede,
21
21
  wireMeasurement
22
- } from "./chunk-55QCOE74.js";
23
- import "./chunk-LATXYFMO.js";
22
+ } from "./chunk-CBCSIEXW.js";
23
+ import "./chunk-BE4F4X3Q.js";
24
24
  import "./chunk-OR5FNVUE.js";
25
25
  export {
26
26
  CLAIM_OWNS_ESCAPE,
package/dist/ground.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  defineQuery,
24
24
  portSlots,
25
25
  widgets
26
- } from "./chunk-LATXYFMO.js";
26
+ } from "./chunk-BE4F4X3Q.js";
27
27
  import {
28
28
  portAnchor,
29
29
  tessellateCubic,
package/dist/index.js CHANGED
@@ -280,7 +280,7 @@ import {
280
280
  widgetSpawnInits,
281
281
  widgets,
282
282
  writeRuntimeResource
283
- } from "./chunk-LATXYFMO.js";
283
+ } from "./chunk-BE4F4X3Q.js";
284
284
  import "./chunk-OR5FNVUE.js";
285
285
  export {
286
286
  Accepts,
package/dist/r3f.js CHANGED
@@ -2,8 +2,8 @@ import {
2
2
  EngineProvider,
3
3
  hasPreviewSnapshot,
4
4
  setPreviewSnapshot
5
- } from "./chunk-5OU3OWDH.js";
6
- import "./chunk-55QCOE74.js";
5
+ } from "./chunk-3SUDKHUF.js";
6
+ import "./chunk-CBCSIEXW.js";
7
7
  import {
8
8
  Active,
9
9
  Camera,
@@ -26,7 +26,7 @@ import {
26
26
  navFlightActive,
27
27
  pickTopAt,
28
28
  widgets
29
- } from "./chunk-LATXYFMO.js";
29
+ } from "./chunk-BE4F4X3Q.js";
30
30
  import {
31
31
  compositeCameraFrustum,
32
32
  computeIslandPhase,
package/dist/react.js CHANGED
@@ -25,9 +25,9 @@ import {
25
25
  useWidgetProps,
26
26
  useWorld,
27
27
  useWorldComponent
28
- } from "./chunk-5OU3OWDH.js";
29
- import "./chunk-55QCOE74.js";
30
- import "./chunk-LATXYFMO.js";
28
+ } from "./chunk-3SUDKHUF.js";
29
+ import "./chunk-CBCSIEXW.js";
30
+ import "./chunk-BE4F4X3Q.js";
31
31
  import "./chunk-OR5FNVUE.js";
32
32
  export {
33
33
  EngineProvider,
@@ -34,7 +34,7 @@ import { type DocSession, type DocSessionOpts, type OpenDocResult } from "../doc
34
34
  import { type JoinDocOpts, type JoinResult } from "../doc/bootstrap";
35
35
  import type { ByteChannel } from "../doc/channels";
36
36
  import { type Autosave, type AutosaveOpts, type AutosaveStorageWrite } from "../doc/autosave";
37
- import { type PresenceSession } from "../presence/presence-kit";
37
+ import { type PresenceOpts, type PresenceSession } from "../presence/presence-kit";
38
38
  import type { MeasureQueue } from "../input/measure-queue";
39
39
  import { GESTURE_DEFAULTS, POINTER_DEFAULTS } from "../settings/defaults";
40
40
  export interface CanvasEngineOpts {
@@ -156,11 +156,33 @@ export interface CanvasDocs {
156
156
  }): Promise<JoinResult>;
157
157
  current(): DocSession | undefined;
158
158
  /**
159
- * The live presence session (the `join({presence})` sugar's attachment), or
160
- * undefined when doc-less / presence-less. An INSPECTION seam — the devtools
161
- * dock's ephemeral tab reads `presence().eph` (DevtoolsOpts.presence) —
162
- * never a sync path; same contract as `DocSession.attachment`. Swaps with
163
- * the doc lifecycle exactly like `current()`: set by join, cleared by close.
159
+ * Attach facade presence to an ALREADY-live document (petition I18) — for
160
+ * hosts that own their document lifecycle (`create()`/`open()` + their own
161
+ * transport) and therefore never call `join({presence})`. Creates the
162
+ * session with the public `attachPresence(world, opts)`, installs the
163
+ * presence publish + remote-cursor systems, and exposes it through
164
+ * `docs.presence()` — which is also the seam the behavior runtime reads, so
165
+ * a registered ephemeral behavior leaves dormancy on the next publish step.
166
+ * The caller wires the transport itself: `presence().wire.apply(bytes)`
167
+ * inbound, `presence().onOutbound(send)` outbound (transport-free core —
168
+ * the standing `PresenceSession` contract). Refuses without a live document
169
+ * and refuses while a presence session is already live (either sugar's).
170
+ * Returns an idempotent, IDENTITY-BOUND inverse: it detaches THIS
171
+ * attachment — leave tombstones flush through still-subscribed outbound
172
+ * before wiring tears down (best-effort per subscriber: one that THROWS,
173
+ * e.g. `ws.send` on a closing socket, forfeits its own delivery and those
174
+ * peers fall back to TTL expiry; route `PresenceOpts.onFault` to observe) —
175
+ * and cannot touch a replacement; `docs.close()` and engine disposal run
176
+ * the same teardown automatically.
177
+ */
178
+ attachPresence(opts: PresenceOpts): () => void;
179
+ /**
180
+ * The live presence session (the `join({presence})` sugar's or
181
+ * `attachPresence`'s), or undefined when doc-less / presence-less. An
182
+ * INSPECTION seam — the devtools dock's ephemeral tab reads
183
+ * `presence().eph` (DevtoolsOpts.presence) — never a sync path; same
184
+ * contract as `DocSession.attachment`. Swaps with the doc lifecycle exactly
185
+ * like `current()`: set by join/attach, cleared by close.
164
186
  */
165
187
  presence(): PresenceSession | undefined;
166
188
  close(): void;
@@ -3,7 +3,7 @@
3
3
  * scene systems · doc kit · publish step · engine facade · reflector registry.
4
4
  * Import wall: strata-ecs + @ice/kernel ONLY — never react/dom/three (enforced).
5
5
  */
6
- export declare const CORE_VERSION = "0.7.0";
6
+ export declare const CORE_VERSION = "0.8.0";
7
7
  export { defineSchemaOnce, hmrInvalidateOnSchemaChange } from "./boot/hmr";
8
8
  export { All, Any, Not, Related, createWorld, defineQuery, defineSystem, defineTickSystem, enumOf, field, Local, } from "@vibecook/strata-ecs";
9
9
  export type { Batch, Component, Condition, Entity, OrderPlace, Pipeline, Query, Relation, Resource, System, SystemCtx, Tag, TickSystem, World, } from "@vibecook/strata-ecs";
@@ -13,7 +13,7 @@
13
13
  * always resolves to SOMETHING; L0 ingest schedules on it).
14
14
  */
15
15
  import type { Entity, World } from "@vibecook/strata-ecs";
16
- import { SpatialIndex } from "@ice/kernel";
16
+ import { SpatialIndex } from "../../../kernel/src/index";
17
17
  import { type CommitSink } from "../engine/commit-sink";
18
18
  import type { Engine } from "../engine/engine";
19
19
  import type { InputQueue } from "../input/queue";
@@ -54,7 +54,7 @@
54
54
  * calls snap, preserving the pre-T1 behavior exactly.
55
55
  */
56
56
  import type { Entity, TickSystem, World } from "@vibecook/strata-ecs";
57
- import type { SpatialIndex } from "@ice/kernel";
57
+ import type { SpatialIndex } from "../../../kernel/src/index";
58
58
  /** Deepest live nav entry, or undefined at root. */
59
59
  export declare function currentNavEntry(world: World): Entity | undefined;
60
60
  /** The container the user is inside, or undefined at root. */
@@ -15,7 +15,7 @@
15
15
  * mixed-overlap consequence and accepts it; do not "fix" it here.
16
16
  */
17
17
  import type { Component, Entity } from "@vibecook/strata-ecs";
18
- import type { Cubic, SpatialIndex } from "@ice/kernel";
18
+ import type { Cubic, SpatialIndex } from "../../../kernel/src/index";
19
19
  /** Structural reads both `World` and `SystemCtx` provide. */
20
20
  export interface PickReader {
21
21
  isAlive(e: Entity): boolean;
@@ -9,7 +9,7 @@
9
9
  * numbered by their declared `index` when given, else by declaration order; the
10
10
  * side's `count` drives the even spacing.
11
11
  */
12
- import type { PortSlot } from "@ice/kernel";
12
+ import type { PortSlot } from "../../../kernel/src/index";
13
13
  import type { WidgetPortDecl } from "../widget/define-widget";
14
14
  /** Map every declared port id → its `PortSlot` (side/index/count for even spacing). */
15
15
  export declare function portSlots(decls: readonly WidgetPortDecl[]): Map<string, PortSlot>;
@@ -11,6 +11,17 @@ export interface PresenceOpts {
11
11
  readonly color: string;
12
12
  /** Per-entry TTL (design §15.3), default {@link DEFAULT_PRESENCE_TTL_MS}. */
13
13
  readonly ttlMs?: number;
14
+ /**
15
+ * Contained presence faults, host-routable (0.8.0 review): `"outbound"` — a
16
+ * subscriber (canonically `ws.send` on a closing socket) threw and its bytes
17
+ * were dropped for that subscriber; `"leave"` — the leave flush failed
18
+ * during detach and remote peers will drop this peer at TTL instead of
19
+ * immediately; `"heal"` — the reset-heal's leave failed and stale keys age
20
+ * out at TTL. Every fault is contained either way — this is observability
21
+ * (telemetry, a "presence degraded" UI state), never control flow. Default:
22
+ * `console.error`.
23
+ */
24
+ readonly onFault?: (where: "outbound" | "leave" | "heal", error: unknown) => void;
14
25
  }
15
26
  export interface PresenceSession {
16
27
  /** This session's peer id (the ephemeral partition prefix). */
@@ -3,16 +3,19 @@ import type { Engine } from "../engine/engine";
3
3
  import { type PresencePublishOpts } from "./publish";
4
4
  import type { PresenceSession } from "./presence-kit";
5
5
  /**
6
- * The derive tick system that pools + reaps remote cursor entities. `world` is
7
- * unused directly (iteration goes through `ctx`), kept for factory symmetry with
8
- * the other `create*System(world)` builders.
6
+ * The tick system that pools + reaps remote cursor entities — standalone
7
+ * export for imperative rigs, which choose their own phase (`installPresence`
8
+ * registers its own copy in `present`, and builds it through a rig so its
9
+ * uninstall can reap the pool too).
9
10
  */
10
- export declare function createRemoteCursorsSystem(_world: World): TickSystem;
11
+ export declare function createRemoteCursorsSystem(world: World): TickSystem;
11
12
  export type InstallPresenceOpts = PresencePublishOpts;
12
13
  /**
13
14
  * Wire a presence session into an engine: the publish hook (outbound facet
14
- * derivation) + the remote-cursor derive system. Returns an uninstall that
15
- * removes both. Does NOT own the session's lifecycle — call `session.detach()`
16
- * separately.
15
+ * derivation) + the remote-cursor system (`present` phase). Returns an
16
+ * uninstall that removes both AND destroys the system's pooled cursor
17
+ * entities — uninstalling on a live document must not leave ghost cursors
18
+ * (a between-frames call, like every teardown here). Does NOT own the
19
+ * session's lifecycle — call `session.detach()` separately.
17
20
  */
18
21
  export declare function installPresence(engine: Engine, session: PresenceSession, opts?: InstallPresenceOpts): () => void;
@@ -44,7 +44,7 @@
44
44
  * change-only (design-002 §4 hygiene). Wires/ports are M8 — skipped.
45
45
  */
46
46
  import type { Entity, System, TickSystem, World } from "@vibecook/strata-ecs";
47
- import { SpatialIndex } from "@ice/kernel";
47
+ import { SpatialIndex } from "../../../kernel/src/index";
48
48
  import { type WirePickSource } from "../ops/point-pick";
49
49
  export interface PickingSystems {
50
50
  spatialSync: TickSystem;
@@ -20,7 +20,7 @@
20
20
  * screen-constant pick slop as `slopWorld = wirePickSlopPx / zoom`.
21
21
  */
22
22
  import type { Entity, TickSystem, World } from "@vibecook/strata-ecs";
23
- import { type SpatialIndex } from "@ice/kernel";
23
+ import { type SpatialIndex } from "../../../kernel/src/index";
24
24
  import type { WirePickSource } from "../ops/point-pick";
25
25
  export interface WireSyncSystem {
26
26
  wireSync: TickSystem;
@@ -25,7 +25,7 @@
25
25
  * is polish deferred; the one-frame gap is invisible in practice.
26
26
  */
27
27
  import type { Entity, System, TickSystem, World } from "@vibecook/strata-ecs";
28
- import { type SpatialIndex } from "@ice/kernel";
28
+ import { type SpatialIndex } from "../../../kernel/src/index";
29
29
  import type { CommitSink } from "../engine/commit-sink";
30
30
  import type { WirePickSource } from "../ops/point-pick";
31
31
  /**
@@ -19,5 +19,5 @@
19
19
  * behavior clears them on every terminal path.
20
20
  */
21
21
  import type { Entity, System, World } from "@vibecook/strata-ecs";
22
- import type { SpatialIndex } from "@ice/kernel";
22
+ import type { SpatialIndex } from "../../../kernel/src/index";
23
23
  export declare function createDropSystem(world: World, index: SpatialIndex<Entity>): System;
@@ -19,7 +19,7 @@
19
19
  * marquee camera move re-projects the rect (accepted — design-002 §2).
20
20
  */
21
21
  import type { Entity, TickSystem, World } from "@vibecook/strata-ecs";
22
- import { type SpatialIndex } from "@ice/kernel";
22
+ import { type SpatialIndex } from "../../../kernel/src/index";
23
23
  /** The out-of-ECS marquee preview (design-003 §5.7): rect + hit set, recomputed each frame. */
24
24
  export interface MarqueeBuffer {
25
25
  rect: {
@@ -26,5 +26,5 @@
26
26
  * churns nothing). `SpatialVersion` bumps only on a real index change.
27
27
  */
28
28
  import type { Entity, TickSystem, World } from "@vibecook/strata-ecs";
29
- import { type SpatialIndex } from "@ice/kernel";
29
+ import { type SpatialIndex } from "../../../kernel/src/index";
30
30
  export declare function createPortMaterialize(world: World, index: SpatialIndex<Entity>): TickSystem;
@@ -33,5 +33,5 @@
33
33
  * MAX_GUIDES=16 truncation is banned).
34
34
  */
35
35
  import type { Entity, TickSystem, World } from "@vibecook/strata-ecs";
36
- import { type SpatialIndex } from "@ice/kernel";
36
+ import { type SpatialIndex } from "../../../kernel/src/index";
37
37
  export declare function createSnapSystem(world: World, index: SpatialIndex<Entity>): TickSystem;
@@ -25,7 +25,7 @@
25
25
  * math only needs c0/c1.
26
26
  */
27
27
  import type { TickSystem, World } from "@vibecook/strata-ecs";
28
- import type { CameraState, PortalAffine } from "@ice/kernel";
28
+ import type { CameraState, PortalAffine } from "../../../kernel/src/index";
29
29
  /** The one in-flight nav transition (design-006 §3.1). Inactive = at rest. */
30
30
  export declare const NavTransition: import("@vibecook/strata-ecs").Resource<import("@vibecook/strata-ecs").ValueOf<{
31
31
  readonly active: import("@vibecook/strata-ecs").FieldSpec<"bool", true>;
@@ -31,7 +31,7 @@ import type { Entity, World } from "@vibecook/strata-ecs";
31
31
  import { type DescribeFn, type EntityDescription, type ObserverHandle, type ObserverOptions, type ProfilerHandle, type ProfilerOptions } from "@vibecook/strata-ecs/tools";
32
32
  import { type DockOptions } from "./dock";
33
33
  import { type GlPanelOptions, type GlPanelStats } from "./gl-panel";
34
- import { type CanvasEngine, type Engine, type PresenceSession } from "@ice/core";
34
+ import { type CanvasEngine, type Engine, type PresenceSession } from "../../core/src/index";
35
35
  export interface DevtoolsOpts {
36
36
  /** Where the dock (or, with `dock: false`, each panel) mounts (default: document.body). */
37
37
  readonly container?: HTMLElement;
@@ -27,5 +27,5 @@
27
27
  * scheduled in a `finally`, so a faulting frame is loud but survivable — the
28
28
  * throw still reaches the browser's error handler; only the death is gone.
29
29
  */
30
- import type { Engine } from "@ice/core";
30
+ import type { Engine } from "../../core/src/index";
31
31
  export declare function startRafLoop(engine: Engine): () => void;
@@ -19,7 +19,7 @@
19
19
  * identical semantics to one-per-element); `element → entity` maps a callback
20
20
  * entry back to its widget.
21
21
  */
22
- import type { Entity, MeasureQueue } from "@ice/core";
22
+ import type { Entity, MeasureQueue } from "../../core/src/index";
23
23
  export interface MeasureAdapter {
24
24
  /** Begin observing the entity's content element (no-op if `hostFor` yields none). */
25
25
  observe(entity: Entity): void;
@@ -26,7 +26,7 @@
26
26
  * Law 2 holds: everything here only enqueues (through the adapter or the forced
27
27
  * sample) — no world writes, no ECS reads.
28
28
  */
29
- import type { Entity, MeasureQueue, WidgetMountStore } from "@ice/core";
29
+ import type { Entity, MeasureQueue, WidgetMountStore } from "../../core/src/index";
30
30
  /** The element source (the `domWidgets` reflector supplies this via `hostFor`). */
31
31
  export interface MeasureWiringHosts {
32
32
  hostFor(entity: Entity): HTMLElement | undefined;
@@ -51,7 +51,7 @@
51
51
  * `overInteractive` reads false mid-gesture — correct: the gesture owns the
52
52
  * pointer, not the widget under it.
53
53
  */
54
- import { type InputQueue } from "@ice/core";
54
+ import { type InputQueue } from "../../core/src/index";
55
55
  import type { CanvasHost } from "./host";
56
56
  /**
57
57
  * The router GL path's adapter seam (design-004 §4). The GL plane is
@@ -25,7 +25,7 @@
25
25
  * Law 10: reflectors write output only, never read layout or write ECS — this
26
26
  * flush touches only the overlay plane's node styles.
27
27
  */
28
- import { type MarqueeBuffer, type ReflectorDef, type World } from "@ice/core";
28
+ import { type MarqueeBuffer, type ReflectorDef, type World } from "../../../core/src/index";
29
29
  import type { CanvasHost } from "../host";
30
30
  export declare function createChromeReflector(host: CanvasHost, _world: World, marqueeBuffer: MarqueeBuffer): ReflectorDef & {
31
31
  writes(): number;
@@ -14,7 +14,7 @@
14
14
  * Law 10: reflectors run post-notify, write output only, never read layout
15
15
  * or write ECS — this flush touches only `host.container.style`.
16
16
  */
17
- import type { ReflectorDef } from "@ice/core";
17
+ import type { ReflectorDef } from "../../../core/src/index";
18
18
  import type { CanvasHost } from "../host";
19
19
  export declare function createCursorReflector(host: CanvasHost, readCursor: () => string): ReflectorDef & {
20
20
  writes(): number;
@@ -40,7 +40,7 @@
40
40
  * Law 10: reflectors run post-notify, write output only, never read layout or
41
41
  * write ECS — this flush touches only host `<div>` style/attributes/parentage.
42
42
  */
43
- import { type Entity, type ReflectorDef, type WidgetMountStore, type World } from "@ice/core";
43
+ import { type Entity, type ReflectorDef, type WidgetMountStore, type World } from "../../../core/src/index";
44
44
  /** The two planes a host can live in (design-004 §1: P1 content, P3 lifted). */
45
45
  export interface DomWidgetsHost {
46
46
  readonly contentPlane: HTMLElement;
@@ -23,7 +23,7 @@
23
23
  * is the live div count. Because the reflector is dirty-driven, a static frame
24
24
  * does not flush at all, so neither counter moves.
25
25
  */
26
- import { type ReflectorDef } from "@ice/core";
26
+ import { type ReflectorDef } from "../../../core/src/index";
27
27
  import type { CanvasHost } from "../host";
28
28
  export declare function createGrayboxReflector(host: CanvasHost): ReflectorDef & {
29
29
  styleWrites(): number;
@@ -24,7 +24,7 @@
24
24
  * Law 10: reflectors run post-notify, write output only, and NEVER read layout
25
25
  * or write ECS — this flush touches only `host.contentPlane.style`.
26
26
  */
27
- import { type ReflectorDef } from "@ice/core";
27
+ import { type ReflectorDef } from "../../../core/src/index";
28
28
  /**
29
29
  * The camera-transformed DOM plane(s). A `CanvasHost` satisfies this
30
30
  * structurally (M3 backward compat); M6 passes `liftedPlane` too so P3 tracks P1.
@@ -10,7 +10,7 @@
10
10
  * cursor dirt only. The plane mounts LAST in the container, above chrome;
11
11
  * `pointer-events: none` throughout — cursors are never hit-testable.
12
12
  */
13
- import { type ReflectorDef, type World } from "@ice/core";
13
+ import { type ReflectorDef, type World } from "../../../core/src/index";
14
14
  import type { CanvasHost } from "../host";
15
15
  export interface RemoteCursorsReflector {
16
16
  readonly reflector: ReflectorDef;
@@ -34,7 +34,7 @@
34
34
  * via node removal, window blur deliberately does NOT force-blur (the browser
35
35
  * restores focus on refocus — adapter's cancelAllInput keeps its hands off).
36
36
  */
37
- import type { Entity } from "@ice/core";
37
+ import type { Entity } from "../../core/src/index";
38
38
  import type { CanvasHost } from "./host";
39
39
  /** The widget-declared focus target (a proxy descendant): `<div data-canvas-focus tabIndex={-1}>`. */
40
40
  export declare const FOCUS_PROXY_ATTR = "data-canvas-focus";
@@ -8,7 +8,7 @@
8
8
  * (Selection chrome moved OFF the ground 2026-07-17: rings live with the
9
9
  * cards, the multi-select union box is P4 dom chrome — always on top.)
10
10
  */
11
- import type { GridConfig, SnapGuidesConfig, WirePreviewBuffer, WiresConfig, World } from "@ice/core";
11
+ import type { GridConfig, SnapGuidesConfig, WirePreviewBuffer, WiresConfig, World } from "../../core/src/index";
12
12
  import { type GroundLayerHost, type GroundReflector } from "./layer";
13
13
  import type { GroundPass } from "./pass";
14
14
  import { type GroundRendererLike } from "./renderer";
@@ -18,7 +18,7 @@ export type { GroundRendererLike } from "./renderer";
18
18
  export { SoupBuilder, parseCssColor, type Rgba, type TriSoup } from "./passes/soup-collect";
19
19
  export { collectGuides } from "./passes/guides-collect";
20
20
  export { collectWires } from "./passes/wires-collect";
21
- export { DEFAULT_GRID_CONFIG, DEFAULT_SNAP_GUIDES_CONFIG, DEFAULT_WIRES_CONFIG, type GridConfig, type SnapGuidesConfig, type WiresConfig, } from "@ice/core";
21
+ export { DEFAULT_GRID_CONFIG, DEFAULT_SNAP_GUIDES_CONFIG, DEFAULT_WIRES_CONFIG, type GridConfig, type SnapGuidesConfig, type WiresConfig, } from "../../core/src/index";
22
22
  export interface GroundContext {
23
23
  readonly host: GroundLayerHost;
24
24
  readonly world: World;
@@ -18,7 +18,7 @@
18
18
  * class as a pan frame under the old grid). WebGPU init is async: flushes
19
19
  * before ready are deferred (flags stay armed), the first ready flush paints.
20
20
  */
21
- import { type ReflectorDef, type World } from "@ice/core";
21
+ import { type ReflectorDef, type World } from "../../core/src/index";
22
22
  import type { GroundPass } from "./pass";
23
23
  import type { GroundRendererLike } from "./renderer";
24
24
  export interface GroundLayerHost {
@@ -10,7 +10,7 @@
10
10
  * sibling `*-collect.ts` modules that import ONLY core/kernel, so collectors
11
11
  * unit-test under happy-dom with no GPU and no three import.
12
12
  */
13
- import type { World } from "@ice/core";
13
+ import type { World } from "../../core/src/index";
14
14
  import type { Object3D } from "three/webgpu";
15
15
  /** Per-flush frame facts every pass collects against. */
16
16
  export interface GroundFrame {
@@ -12,7 +12,7 @@
12
12
  * branching. Everything else (fract-distance dots, 0.5-device-px AA,
13
13
  * max-composited levels) matches term for term.
14
14
  */
15
- import { type GridConfig } from "@ice/core";
15
+ import { type GridConfig } from "../../../core/src/index";
16
16
  import type { GroundPass } from "../pass";
17
17
  export interface GridPass extends GroundPass {
18
18
  /** Live re-tune (the react `grid` prop seam) — partial merge over current values. */
@@ -6,7 +6,7 @@
6
6
  * end ticks. Screen-px output via the kernel `worldToScreen` seam. NO guide
7
7
  * count caps (the pool grows; so does the soup).
8
8
  */
9
- import { type SnapGuidesConfig, type World } from "@ice/core";
9
+ import { type SnapGuidesConfig, type World } from "../../../core/src/index";
10
10
  import type { GroundFrame } from "../pass";
11
11
  import { type TriSoup } from "./soup-collect";
12
12
  export declare const guideQ: import("@vibecook/strata-ecs").Query;
@@ -1,3 +1,3 @@
1
- import { type SnapGuidesConfig } from "@ice/core";
1
+ import { type SnapGuidesConfig } from "../../../core/src/index";
2
2
  import type { GroundPass } from "../pass";
3
3
  export declare function createGuidesPass(initial?: Partial<SnapGuidesConfig>): GroundPass;
@@ -15,7 +15,7 @@
15
15
  * - Materialized port dots: triangle-fan discs, active color while any
16
16
  * connect drag is routed.
17
17
  */
18
- import { type WirePreviewBuffer, type WiresConfig, type World } from "@ice/core";
18
+ import { type WirePreviewBuffer, type WiresConfig, type World } from "../../../core/src/index";
19
19
  import type { GroundFrame } from "../pass";
20
20
  import { type TriSoup } from "./soup-collect";
21
21
  export declare const wireQ: import("@vibecook/strata-ecs").Query;
@@ -5,6 +5,6 @@
5
5
  * `[RoutedConnect, Drag]` value dirt (the buffer updates exactly when the
6
6
  * connect recognizer's Drag advances) instead of a per-frame value diff.
7
7
  */
8
- import { type WirePreviewBuffer, type WiresConfig } from "@ice/core";
8
+ import { type WirePreviewBuffer, type WiresConfig } from "../../../core/src/index";
9
9
  import type { GroundPass } from "../pass";
10
10
  export declare function createWiresPass(initial?: Partial<WiresConfig>, readPreview?: () => WirePreviewBuffer): GroundPass;
@@ -42,7 +42,7 @@
42
42
  * real world and fake scene/camera handles, no GL context.
43
43
  */
44
44
  import type { OrthographicCamera, Scene } from "three";
45
- import { type Engine, type Entity, type SiblingOrderIndex } from "@ice/core";
45
+ import { type Engine, type Entity, type SiblingOrderIndex } from "../../core/src/index";
46
46
  import { type IslandStateStore } from "./island-state";
47
47
  import { type RenderWriteTrap } from "./dev-write-trap";
48
48
  export interface IslandHandle {
@@ -1,4 +1,4 @@
1
- import { type Entity, type World } from "@ice/core";
1
+ import { type Entity, type World } from "../../core/src/index";
2
2
  import type { GLBridge } from "./bridge";
3
3
  export interface TargetLike {
4
4
  /** Opaque texture handle threaded to the quad (three: `.texture`). */
@@ -17,7 +17,7 @@
17
17
  * un-shimmed browser production bundle strata's own DEV flag can evaluate
18
18
  * true, so registration is gated HERE (default off; demos/traces opt in).
19
19
  */
20
- import type { World } from "@ice/core";
20
+ import type { World } from "../../core/src/index";
21
21
  export interface RenderWriteTrap {
22
22
  /** Arm the trap (begin twice without end is a bug — throws). */
23
23
  begin(): void;
@@ -1,6 +1,6 @@
1
1
  import { type ReactElement } from "react";
2
2
  import { type Texture } from "three";
3
- import { type Engine, type WidgetMountStore } from "@ice/core";
3
+ import { type Engine, type WidgetMountStore } from "../../core/src/index";
4
4
  import type { GLBridge } from "./bridge";
5
5
  export interface GLViewsProps {
6
6
  readonly engine: Engine;
@@ -31,8 +31,8 @@
31
31
  * facts land next tick via the queue.
32
32
  */
33
33
  import { type Intersection, type Object3D } from "three";
34
- import type { SpatialIndex } from "@ice/kernel";
35
- import { type Entity, type World } from "@ice/core";
34
+ import type { SpatialIndex } from "../../kernel/src/index";
35
+ import { type Entity, type World } from "../../core/src/index";
36
36
  import type { GLBridge } from "./bridge";
37
37
  /** The synthetic event island handlers receive (R3F-handler-compatible core). */
38
38
  export interface IslandPointerEvent {
@@ -13,7 +13,7 @@
13
13
  * Pure state + counters; no three.js, no ECS, no timing — the GLViews frame
14
14
  * pass reads/writes it synchronously.
15
15
  */
16
- import type { IslandPhase } from "@ice/kernel";
16
+ import type { IslandPhase } from "../../kernel/src/index";
17
17
  /** Resolution + band an island's FBO was last painted at (v1 `paintedAt`). */
18
18
  export interface PaintedAt {
19
19
  readonly w: number;
@@ -1,6 +1,6 @@
1
1
  import { type ReactElement } from "react";
2
2
  import { type Texture } from "three";
3
- import type { Entity, WidgetType, World } from "@ice/core";
3
+ import type { Entity, WidgetType, World } from "../../core/src/index";
4
4
  import type { GLBridge } from "./bridge";
5
5
  export interface IslandProps {
6
6
  readonly bridge: GLBridge;
@@ -1,4 +1,4 @@
1
- import type { Entity } from "@ice/core";
1
+ import type { Entity } from "../../core/src/index";
2
2
  import type { GLBridge, IslandFrameCallback } from "./bridge";
3
3
  export interface IslandContextValue {
4
4
  readonly bridge: GLBridge;
@@ -10,7 +10,7 @@
10
10
  * hatch. `<InfiniteCanvas>` provides this automatically; apps that mount
11
11
  * WidgetRoot themselves wrap it in `<EngineProvider>`.
12
12
  */
13
- import { type CanvasEngine, type CanvasOps, type World } from "@ice/core";
13
+ import { type CanvasEngine, type CanvasOps, type World } from "../../core/src/index";
14
14
  import { type ReactElement, type ReactNode } from "react";
15
15
  export interface EngineProviderProps {
16
16
  readonly engine: CanvasEngine;