@solidjs/signals 2.0.0-rc.13 → 2.0.0-rc.15

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 (121) hide show
  1. package/dist/dev-shared.js +2059 -3768
  2. package/dist/dev.attribution.js +237 -101
  3. package/dist/dev.js +7466 -8497
  4. package/dist/observe/affects.js +128 -104
  5. package/dist/observe/boundaries.js +492 -665
  6. package/dist/observe/core/action.js +63 -66
  7. package/dist/observe/core/async.js +243 -379
  8. package/dist/observe/core/attribution-queries.js +1 -1
  9. package/dist/observe/core/attribution.js +394 -253
  10. package/dist/observe/core/constants.js +120 -187
  11. package/dist/observe/core/context.js +3 -3
  12. package/dist/observe/core/core.js +874 -1440
  13. package/dist/observe/core/dev.js +3 -3
  14. package/dist/observe/core/effect.js +73 -84
  15. package/dist/observe/core/external.js +5 -5
  16. package/dist/observe/core/graph.js +62 -71
  17. package/dist/observe/core/heap.js +75 -98
  18. package/dist/observe/core/invariants.js +1 -34
  19. package/dist/observe/core/lanes.js +750 -181
  20. package/dist/observe/core/owner.js +80 -101
  21. package/dist/observe/core/scheduler.js +719 -1356
  22. package/dist/observe/core/verdict.js +314 -621
  23. package/dist/observe/flatten.js +79 -0
  24. package/dist/observe/index.js +15 -13
  25. package/dist/observe/map.js +232 -235
  26. package/dist/observe/reveal.js +212 -0
  27. package/dist/observe/signals.js +144 -216
  28. package/dist/observe/store/affects.js +142 -0
  29. package/dist/observe/store/hooks.js +13 -0
  30. package/dist/observe/store/index.js +27 -24
  31. package/dist/observe/store/optimistic.js +571 -0
  32. package/dist/observe/store/projection.js +308 -0
  33. package/dist/observe/store/reconcile.js +259 -0
  34. package/dist/observe/store/store.js +1988 -277
  35. package/dist/observe/store/storePath.js +1 -1
  36. package/dist/{prod/store/next → observe/store}/target.js +17 -18
  37. package/dist/observe/store/types.js +73 -0
  38. package/dist/observe/store/utils.js +1 -13
  39. package/dist/prod/affects.js +130 -106
  40. package/dist/prod/boundaries.js +476 -654
  41. package/dist/prod/core/action.js +71 -74
  42. package/dist/prod/core/async.js +306 -444
  43. package/dist/prod/core/constants.js +117 -186
  44. package/dist/prod/core/context.js +3 -3
  45. package/dist/prod/core/core.js +888 -1462
  46. package/dist/prod/core/effect.js +88 -99
  47. package/dist/prod/core/external.js +5 -5
  48. package/dist/prod/core/graph.js +62 -71
  49. package/dist/prod/core/heap.js +75 -98
  50. package/dist/prod/core/invariants.js +1 -32
  51. package/dist/prod/core/lanes.js +712 -181
  52. package/dist/prod/core/owner.js +75 -96
  53. package/dist/prod/core/scheduler.js +686 -1335
  54. package/dist/prod/core/verdict.js +309 -621
  55. package/dist/prod/flatten.js +77 -0
  56. package/dist/prod/index.js +15 -13
  57. package/dist/prod/map.js +142 -145
  58. package/dist/prod/reveal.js +212 -0
  59. package/dist/prod/signals.js +155 -227
  60. package/dist/prod/store/affects.js +142 -0
  61. package/dist/prod/store/hooks.js +13 -0
  62. package/dist/prod/store/index.js +26 -19
  63. package/dist/prod/store/optimistic.js +566 -0
  64. package/dist/prod/store/projection.js +301 -0
  65. package/dist/prod/store/reconcile.js +259 -0
  66. package/dist/prod/store/store.js +1883 -272
  67. package/dist/prod/store/storePath.js +1 -1
  68. package/dist/{observe/store/next → prod/store}/target.js +13 -17
  69. package/dist/prod/store/types.js +73 -0
  70. package/dist/prod/store/utils.js +1 -11
  71. package/dist/types/affects.d.ts +11 -30
  72. package/dist/types/boundaries.d.ts +66 -176
  73. package/dist/types/carved.d.ts +1 -0
  74. package/dist/types/core/action.d.ts +5 -6
  75. package/dist/types/core/async.d.ts +10 -5
  76. package/dist/types/core/attribution-hooks.d.ts +20 -1
  77. package/dist/types/core/attribution.d.ts +26 -11
  78. package/dist/types/core/constants.d.ts +130 -180
  79. package/dist/types/core/core.d.ts +134 -264
  80. package/dist/types/core/dev.d.ts +2 -2
  81. package/dist/types/core/effect.d.ts +0 -7
  82. package/dist/types/core/graph.d.ts +7 -1
  83. package/dist/types/core/heap.d.ts +5 -7
  84. package/dist/types/core/index.d.ts +5 -5
  85. package/dist/types/core/invariants.d.ts +0 -29
  86. package/dist/types/core/lanes.d.ts +74 -86
  87. package/dist/types/core/owner.d.ts +3 -3
  88. package/dist/types/core/scheduler.d.ts +255 -331
  89. package/dist/types/core/types.d.ts +45 -85
  90. package/dist/types/core/verdict.d.ts +3 -0
  91. package/dist/types/flatten.d.ts +8 -0
  92. package/dist/types/index.d.ts +6 -4
  93. package/dist/types/reveal.d.ts +19 -0
  94. package/dist/types/signals.d.ts +35 -91
  95. package/dist/types/store/affects.d.ts +12 -0
  96. package/dist/types/store/hooks.d.ts +48 -0
  97. package/dist/types/store/index.d.ts +34 -15
  98. package/dist/types/store/optimistic.d.ts +23 -0
  99. package/dist/types/store/projection.d.ts +18 -0
  100. package/dist/types/store/reconcile.d.ts +3 -0
  101. package/dist/types/store/store.d.ts +132 -145
  102. package/dist/types/store/storePath.d.ts +1 -1
  103. package/dist/types/store/target.d.ts +151 -0
  104. package/dist/types/store/types.d.ts +84 -0
  105. package/package.json +1 -1
  106. package/dist/observe/core/optimistic.js +0 -669
  107. package/dist/observe/store/next/optimistic.js +0 -717
  108. package/dist/observe/store/next/projection.js +0 -266
  109. package/dist/observe/store/next/reconcile.js +0 -375
  110. package/dist/observe/store/next/store.js +0 -2608
  111. package/dist/prod/core/optimistic.js +0 -658
  112. package/dist/prod/store/next/optimistic.js +0 -710
  113. package/dist/prod/store/next/projection.js +0 -257
  114. package/dist/prod/store/next/reconcile.js +0 -373
  115. package/dist/prod/store/next/store.js +0 -2484
  116. package/dist/types/core/optimistic.d.ts +0 -6
  117. package/dist/types/store/next/optimistic.d.ts +0 -25
  118. package/dist/types/store/next/projection.d.ts +0 -27
  119. package/dist/types/store/next/reconcile.d.ts +0 -10
  120. package/dist/types/store/next/store.d.ts +0 -145
  121. package/dist/types/store/next/target.d.ts +0 -196
@@ -1,29 +1,22 @@
1
- import { type OptimisticLane } from "./lanes.js";
2
- import type { Transition } from "./scheduler.js";
3
- import type { Computed, FirewallSignal, NodeExtension, NodeOptions, Owner, Signal } from "./types.js";
1
+ import type { Transaction } from "./scheduler.js";
2
+ import type { Computed, NodeExtension, NodeOptions, Owner, Signal } from "./types.js";
4
3
  export declare const PRIMITIVE_IN_FORBIDDEN_SCOPE_MESSAGE = "[PRIMITIVE_IN_FORBIDDEN_SCOPE] Cannot create reactive primitives inside createTrackedEffect or owner-backed onSettled";
4
+ export declare const PRIMITIVE_IN_EFFECT_CALLBACK_MESSAGE: string;
5
+ /** Dev: the effect phase (render and user effects, their cleanups) runs with
6
+ * no ambient owner, and a computation created there with none is outside
7
+ * every owner and every hold (maintainer, 2026-10-01: ownerless only —
8
+ * `runWithOwner` in a callback is deliberate, Portal and createReaction do
9
+ * it; a bare createRoot is the mistake). Computeds and roots; a signal
10
+ * created there is inert and harmless. Tracked effects and onSettled are
11
+ * children-forbidden and refuse through PRIMITIVE_IN_FORBIDDEN_SCOPE. */
12
+ export declare function assertNotInEffectCallback(): void;
5
13
  export declare const REACTIVE_WRITE_IN_OWNED_SCOPE_SIGNAL_MESSAGE: string;
6
14
  export declare const REACTIVE_WRITE_IN_OWNED_SCOPE_REFRESH_MESSAGE: string;
7
- export declare const ASYNC_STORE_SETTER_MESSAGE: string;
8
15
  export declare let tracking: boolean;
9
16
  /** @internal verdict-module glue */
10
- export declare function setPendingCheckActive(v: boolean): void;
11
- /** @internal verdict-module glue */
12
- export declare function setLatestReadActive(v: boolean): void;
13
- /** @internal verdict-module glue */
14
17
  export declare function setContextInternal(v: Owner | null): void;
15
18
  export declare let stale: boolean;
16
- export declare let pendingCheckActive: boolean;
17
- export declare let latestReadActive: boolean;
18
19
  export declare let context: Owner | null;
19
- export declare let currentOptimisticLane: OptimisticLane | null;
20
- /** Notify `node`'s subscribers on `lane`'s channel: they recompute as the
21
- * lane's passes — a memo publishes a derived override (lanes stage, #3479),
22
- * an effect runs from the lane's queue, at the park, ahead of the
23
- * transaction — the display-ahead view. The write itself is already staged
24
- * (setSignal) and commits with the frame; this walk shows it now. Used by a
25
- * boundary re-armed from a lane pass (boundaries.ts `_swap`, #3540). */
26
- export declare function notifyOnLane(node: Signal<any>, lane: OptimisticLane): void;
27
20
  export declare let snapshotCaptureActive: boolean;
28
21
  export declare let snapshotSources: Set<any> | null;
29
22
  export declare function setSnapshotCapture(active: boolean): void;
@@ -40,6 +33,24 @@ export declare function computed<T>(fn: (prev: T) => T | PromiseLike<T> | AsyncI
40
33
  export declare function ext(el: {
41
34
  _x: NodeExtension | null;
42
35
  }): NodeExtension;
36
+ /** A tracked read of a held node (the reader derives from its transaction's
37
+ * world): the reading pass is marked as having read it (born-held decision
38
+ * in `recompute`), and the flush joins the node's transaction — unless the
39
+ * reader is a render effect. A render effect is the frame, not a derivation
40
+ * (rule 3): in that transaction's own flush, or born into it (uninitialized,
41
+ * A29), it reads the staged value and holds nothing of its own; otherwise it
42
+ * reads the committed value instead (`frameRead`). A node born into the
43
+ * future has no committed value: every reader joins it. A first pass is
44
+ * something not ready under a loading boundary that has not shown content:
45
+ * the boundary collects it and shows its fallback, and the pass is the
46
+ * boundary's, not the tick's (A29's boundary exemption, #3540). */
47
+ export declare function joinPass(c: Computed<any>, el: Signal<any> | Computed<any>): void;
48
+ /** A node born into transaction `t`: held by it and never committed (A29,
49
+ * ruling A) — uninitialized (born held), or a member of the frame one of its
50
+ * held passes built (CONFIG_HELD_FRAME). Its branch exists only in `t`: it
51
+ * has no screen to read, so it reads `t`'s values, whichever flush runs it,
52
+ * and keeps staging (#4010). */
53
+ export declare function bornInto(c: Computed<any>, t: Transaction): unknown;
43
54
  /**
44
55
  * Build an Effect node with all effect-specific fields baked into a single object literal,
45
56
  * so V8 sees the full hidden class shape at construction time. Effects always run in lazy
@@ -50,41 +61,39 @@ export declare function createEffectNode<T>(fn: (prev?: T) => T, effectFn: (val:
50
61
  /**
51
62
  * The shared status notifier for effect nodes, installed once by effect.ts
52
63
  * at module evaluation (`this`-dispatched — one function serves every
53
- * effect, so nodes never store it). Boundary computeds keep their own
54
- * per-node channel on `_x._notifyStatus`, which takes precedence.
64
+ * effect, so nodes never store it). CARVE 4: the boundaries' per-node
65
+ * channel (`_x._notifyStatus`) went with them; effects are the only
66
+ * display consumers.
55
67
  */
56
68
  export declare let effectStatusNotify: ((this: any, status?: number, error?: any) => void) | null;
57
69
  export declare function setEffectStatusNotify(fn: NonNullable<typeof effectStatusNotify>): void;
58
- /** Resolve a node's status notifier: an own `_x` channel (boundaries) wins;
59
- * effect nodes (`_type` — EFFECT_PURE is 0, and only effect literals carry
60
- * the field) fall back to the shared notifier. Presence doubles as the
61
- * "display consumer" membership test in the status walks, exactly as the
62
- * per-node field did when every effect carried one. */
70
+ /** Resolve a node's status notifier: effect nodes (`_type` — EFFECT_PURE is
71
+ * 0, and only effect literals carry the field) get the shared notifier.
72
+ * Presence doubles as the "display consumer" membership test in the status
73
+ * walks, exactly as the per-node field did when every effect carried one. */
63
74
  export declare function statusNotifierOf(el: any): ((this: any, status?: number, error?: any) => void) | undefined;
64
75
  export declare function signal<T>(v: T, options?: NodeOptions<T>): Signal<T>;
65
- export declare function signal<T>(v: T, options?: NodeOptions<T>, firewall?: Computed<any>): FirewallSignal<T>;
66
- /** The shared slot-node unobserved handler — a live binding read directly by
67
- * the sweep sites (no wrapper frame, no null check: a CONFIG_SLOT_NODE node
68
- * existing implies the store module loaded and registered the hook). */
69
- export declare let slotUnobservedHook: (node: Signal<any>) => void;
70
- /** Install the shared slot-node unobserved handler (store module, once). */
71
- export declare function setSlotUnobserved(fn: (node: Signal<any>) => void): void;
72
- /** Release a firewall child the store no longer addresses (unobserved sweep
73
- * dropped it from its target's cache): unlink it from the chain so the
74
- * projection stops retaining it and its last value. The node keeps its own
75
- * `_nextChild` so a walk that is mid-chain on it still terminates. It also
76
- * leaves `_companionChildren` (#3503): the companions themselves are
77
- * permanent on the node, but the node is unreachable through the store, so
78
- * the set would only retain it and its last value. */
79
- export declare function unlinkFirewallChild(node: Signal<any>): void;
80
- export declare function slotSignal<T>(v: T, equals: (a: T, b: T) => boolean, host: object, key: PropertyKey, acc: boolean, firewall?: Computed<unknown> | null): Signal<T>;
81
- export declare function optimisticSignal<T>(v: T, options?: NodeOptions<T>): Signal<T>;
82
- export declare function optimisticComputed<T>(fn: (prev?: T) => T | PromiseLike<T> | AsyncIterable<T>, options?: NodeOptions<T>): Computed<T>;
83
76
  export declare function isEqual<T>(a: T, b: T): boolean;
77
+ /** A store slot node (CONFIG_SLOT_NODE): the whole node in ONE literal — the
78
+ * target and key as back-refs in place of closures (`equals` is a method
79
+ * call, `this` the node; the unobserved sweep dispatches to one shared hook,
80
+ * graph.ts), the store's wrap cache (`px`/`pxv`: the proxy last served for
81
+ * this key and the raw it wrapped — one pointer compare replaces a WeakMap
82
+ * lookup per read) and the accessor verdict (`acc`) pre-shaped. No options
83
+ * object, no NodeExtension, no post-construction expandos. `ownedWrite` is
84
+ * baked in: the setter carries the owned-scope guard; node-level writes are
85
+ * the store's notification machinery. The observe literal adds the label
86
+ * slot (the store relabels it `store.<key>` when the engine is installed). */
87
+ export declare function slotSignal<T>(v: T, equals: (a: T, b: T) => boolean, host: object, key: PropertyKey, acc: boolean): Signal<T>;
84
88
  /**
85
89
  * When set to a component name string, any reactive read that is not inside a nested tracking
86
90
  * scope will log a dev-mode warning. Managed automatically by `untrack(fn, strictReadLabel)`.
87
91
  */
92
+ /** The verdict windows' read (verdict.ts), installed while a `latest` or
93
+ * `isPending` window is open and null otherwise: `read` dispatches to it
94
+ * then, and a program that never imports them never has one. */
95
+ export declare let verdict: ((el: Signal<any> | Computed<any>, c: Computed<any> | null) => unknown) | null;
96
+ export declare function setVerdict(fn: typeof verdict): void;
88
97
  export declare let strictRead: string | false;
89
98
  /** Dev-only: explicit untrack() nesting, so deliberate post-await reads stay quiet. */
90
99
  export declare let untrackDepth: number;
@@ -154,249 +163,110 @@ export declare let spectating: boolean;
154
163
  export declare function spectate<T>(fn: () => T): T;
155
164
  /**
156
165
  * Bring a computed to a readable state: lazy/disposed nodes are (re)computed;
157
- * an isPending() probe (`refresh`) additionally pulls the node fully up to
158
- * date so its status flags reflect the current graph.
166
+ * `refresh` additionally pulls the node fully up to date so its status flags
167
+ * reflect the current graph.
159
168
  */
160
169
  export declare function prepareComputed(comp: Computed<unknown>, refresh: boolean): void;
161
170
  /**
162
- * Sentinel returned by readNodeFast when the plain-signal fast path does not
163
- * apply and the caller must fall back to the full read().
164
- */
165
- export declare const READ_SLOW: unique symbol;
166
- /**
167
- * read()'s plain-signal fast path as a standalone entry for hot callers
168
- * (store traps). Safe to substitute for read() only because the bail
169
- * conditions mirror read()'s prelude and fast-path guard exactly: the
170
- * latestRead and pendingCheck windows run side-effectful hooks before the
171
- * fast path, `_fn` nodes need prepareComputed, and firewall / override /
172
- * snapshot / transition / lane / dev-strictRead state all take the full
173
- * resolution. Anything slow returns READ_SLOW; the caller then calls read().
174
- */
175
- /**
176
- * Wake only authoritative-view readers (until() predicates) subscribed to `el`.
177
- * The A17-silent ack paths — an authoritative arrival equal to the active
178
- * override — use this so the predicate re-evaluates without re-firing
179
- * ordinary subscribers whose visible (override) value did not change.
180
- * Pay-for-use: reached through GlobalQueue._notifyAuthoritativeObservers,
181
- * installed at first until() call — apps that never use until() shake it.
182
- */
183
- export declare function notifyAuthoritativeObservers(el: Signal<any> | Computed<any>): void;
184
- /** Installs the authoritative-reader wakeup hook. Idempotent; called by every
185
- * creator of a CONFIG_AUTHORITATIVE_READ computation — until() and refresh() —
186
- * before its first read (same late-binding contract as the optimistic engine;
187
- * the gating bit is only ever set by such a read, so the `!` call sites are
188
- * safe once every setter installs, #3303). */
189
- export declare function installAuthoritativeRead(): void;
190
- /**
191
- * Stale-reader term of the value selections below: a render effect reading a
192
- * node some OTHER live transaction has staged sees the committed value. The
193
- * commit is silent — the staging walk was the notification — so a reader
194
- * that linked AFTER that walk (an effect created during the hold, a store
195
- * key first read under it) would show the old value past the reveal: record
196
- * it for the transaction's commit replay (the `_gatedSubs` contract lanes
197
- * already use). An effect the transaction itself computed re-derives at its
198
- * commit on its own (parked run, or the contested re-derive, #3322) and is
199
- * not recorded — replaying it too would publish the frame twice.
200
- *
201
- * Flight twin (the pending-branch carve-out): the reader is served the
202
- * node's committed, pre-flight value and now observes that flight — A15:
203
- * async work observed by a reader settles as one unit with the writes that
204
- * asked it — so it joins the transaction's reporters for the node. The
205
- * reporter the transaction recorded when the flight started may be gone (a
206
- * keyed remount disposed it, #3374); a completion check that found no live
207
- * reporter committed the writes ahead of the answer, tearing the new
208
- * reader's frame (`Count: 1` beside `Details: 0`). Joins an entry the
209
- * transaction already holds; a flight nobody had observed yet has none (the
210
- * reader is its first observer — a conditional that just revealed it, #3458)
211
- * and is notified up the reader's own queue chain under that transaction,
212
- * the one sanctioned registration site (INV-3): a collecting boundary above
213
- * the reader consumes it as it would any pending, an unboundaried reader
214
- * opens the entry — and the transaction, judged complete on its other
215
- * flights, revealed the inputs beside the reader's pre-flight value
216
- * otherwise (`Count: 1 | A: 1` beside `B: 0`). A staged signal or a settled
217
- * node registers nothing. Every reporter dies with its reader
218
- * (reporterBlocksSource: the read linked it as a dep). The node's own entry
219
- * is the only one that can matter: a chain's intermediate memo is re-pulled
220
- * by the read (updateIfNecessary's retry) and enters the transaction, so the
221
- * reader holds through the normal path; a node with its own flight that is
222
- * also pending on an upstream re-ask blocks through that flight until it
223
- * lands, and its landing re-runs the reader into the normal path.
224
- */
225
- /** The replay half of the stale-of-foreign clause (A15 / A26): a stale reader
226
- * served the committed value because `txn` holds what it read re-runs at
227
- * txn's commit, when the value it was denied becomes the frame — unless its
228
- * own last value already came from that transaction. One registration for
229
- * the node path (heldFromStale) and the store's backing paths, which have
230
- * no node to carry the hold (heldFromReader, the adoption hold view). */
231
- export declare function recordStaleReplay(txn: Transition, c: Computed<any>): void;
232
- /**
233
- * The ownership relation (DESIGN-CONSOLIDATION §6, ruled 2026-09-17): is
234
- * `hold` part of the running pass's world? A plain reader's world is the
235
- * transaction it runs under, through merges. A lane reader's world is its
236
- * lane AND the transition that owns the lane — the one asymmetry between a
237
- * lane and a separate transaction (a lane sees what lands from its parent as
238
- * its own; a separate transaction would wait for the parent to settle) —
239
- * see `ownsLane` in lanes.ts, built on this. One relation for the
240
- * stale-of-foreign clause (heldFromStale), the lane arm (readsHeldCommitted)
241
- * and the store's backing holds (foreignHold); `serve` has no lane arm of
242
- * its own, the lane's extra visibility lives here.
243
- */
244
- export declare function ownsHold(hold: Transition): boolean;
245
- export declare function enterStagedRead(el: Signal<any> | Computed<any> | null, t?: Transition | null | undefined): void;
246
- /**
247
- * Rule 1 (value selection), the full arm: does this reader see a STAGED
248
- * node's COMMITTED value? One implementation of the rule the fast paths
249
- * (readNodeFast, read's fast block) carry as their trivial ternary and that
250
- * every slow site — read's tail, the store's backing selection, the lane and
251
- * verdict arms — used to restate by hand (docs/DESIGN-CONSOLIDATION.md, move 3b). In order:
171
+ * Rule 1 (value selection): does this reader see a STAGED node's COMMITTED
172
+ * value? One implementation of the rule the fast paths (read's fast block)
173
+ * carry as their trivial ternary. In order:
252
174
  * - no reader at all (an untracked read) — the committed frame;
253
- * - a reader under an optimistic lane the engine says reads committed
254
- * (laneReadsCommitted: another lane's hold, #3460);
255
175
  * - nothing staged;
256
176
  * - a children-forbidden reader (createTrackedEffect / onSettled: the frame,
257
- * never the graph — A32);
258
- * - a stale reader (render effect) of a FOREIGN transaction's staged write —
259
- * committed, no entanglement (heldFromStale registers the replay; a node
260
- * born held has no committed frame to fall back to, `noCommitted`);
261
- * - HELD truth (#3164, CONFIG_HELD_TRUTH) read by a LANE pass: staged
262
- * confirming truth — fold-staged onto an armed family, or entangle-stolen
263
- * by an awaited until() — is masked from lane passes only, owning
264
- * transaction or not. A lane applies its frame display-ahead at the park,
265
- * so a lane pass served the truth would paint the confirmation beside the
266
- * optimism it confirms (`saving=true` beside the saved row — the #3164
267
- * tear); it keeps committed and is re-run by the reveal's post-revert
268
- * wake. Every other deriving reader falls through to A29 below: the truth
269
- * is a staged value like any other, and the pass that derives from it is
270
- * held with it — including the retaining transaction's own passes, which
271
- * a superseded override already hands the truth (#3568: masking them
272
- * composed the landed `length` with rows still masked to committed).
273
- * latest() and authoritative readers (until()'s predicate) tunnel
274
- * through — the tunnel that keeps the hold deadlock-free.
275
- * False means the reader derives from the staged value and enters its
276
- * transaction (enterStagedRead, A29).
177
+ * never the graph — A32).
178
+ * False means the reader derives from the staged value.
277
179
  */
278
- export declare function readerSeesCommitted(el: Signal<any> | Computed<any>, c: Computed<any> | null, owner: Signal<any> | Computed<any>, noCommitted: boolean): boolean;
279
- /** A28 — set when a node is staged (queuePendingNode) or a held node rewritten
280
- * (stashHeldRewrite) OUTSIDE a flush; cleared when the next flush begins. The
281
- * read sites test this one module boolean instead of `globalQueue._running`:
282
- * inside a flush it is false and the A28 arm costs nothing; outside, only a
283
- * tick with unflushed writes pays the staged-node check. */
180
+ export declare function readerSeesCommitted(el: Signal<any> | Computed<any>, c: Computed<any> | null): boolean;
181
+ /** A28 — set when a node is staged (queuePendingNode) OUTSIDE a flush;
182
+ * cleared when the next flush begins. The read sites test this one module
183
+ * boolean instead of `globalQueue._running`: inside a flush it is false and
184
+ * the A28 arm costs nothing; outside, only a tick with unflushed writes pays
185
+ * the staged-node check. */
284
186
  export declare let unflushedStaged: boolean;
285
187
  export declare function markUnflushedStaged(): void;
286
- /** A28 — a write becomes visible at flush. Outside a flush, a node holding an
287
- * AMBIENT staged value (no transaction stamp) was written since the last
288
- * flush: ambient staging commits at flush end, so nothing else leaves a node
289
- * in this state; a stamped value is the flushed held world, which A28 says
290
- * latest() serves. Inside a flush the rule does not apply (A28 (4): promoted
291
- * within the round). Structural — no marker on the write path. */
292
- export declare function unflushed(el: Signal<any> | Computed<any>): boolean;
293
- /** The value an unflushed node serves — the committed value for an ambient
294
- * write, the flushed staged value for a rewrite of a held node — or
295
- * NOT_PENDING when nothing is unflushed. Exempt: owned-write nodes (A28 (4):
296
- * a write issued inside a recompute is promoted at that recompute's end —
297
- * boundary and loading machinery, until()'s internals, signals declared for
298
- * in-computation writes) and engine companions (the isPending() verdict
299
- * signal, the latest() shadow: the system's own writes, made at the source's
300
- * write to mirror it, installing eagerly — A28, A8). */
301
- export declare function unflushedValue(el: Signal<any> | Computed<any>, committed?: any): unknown;
302
- /** A28 (5): an optimistic write becomes the ACTIVE override at the flush that
303
- * carries it. `_overrideTime` is stamped with `clock` at the write and `clock`
304
- * advances after every flush, so "this tick, outside a flush" is unflushed. */
305
- export declare function unflushedOverride(el: Signal<any> | Computed<any>): boolean;
306
- /** Active optimistic override on an armed node (an armed slot idles at
307
- * NOT_PENDING; undefined = unarmed plain node). The writer's own channels —
308
- * the draft, `in`/keys inside the setter — compose on this regardless of
309
- * flush state. */
310
- export declare function hasActiveOverride(el: Signal<any> | Computed<any>): boolean;
311
- /** The override a READER sees: installed, and carried by a flush (A28 (5) —
312
- * an optimistic write is a write; until its flush no reader sees it). One
313
- * implementation for read()'s override arm, the verdict channels
314
- * (latestRead, computePendingState) and the store's selection
315
- * (docs/DESIGN-CONSOLIDATION.md, move 3b). */
316
- export declare function visibleOverride(el: Signal<any> | Computed<any>): boolean;
188
+ /** A28 — a write becomes visible at flush. Outside a flush, a node holding a
189
+ * staged value was written since the last flush: staging commits at flush
190
+ * end, so nothing else leaves a node in this state. Inside a flush the rule
191
+ * does not apply (A28 (4): promoted within the round). The value an
192
+ * unflushed node serves is its committed value, or NOT_PENDING when nothing
193
+ * is unflushed. Exempt: promoted writes (A28 (4): a write issued inside a
194
+ * recompute is promoted at that recompute's end — boundary and loading
195
+ * machinery, signals declared for in-computation writes). */
196
+ export declare function unflushedValue(el: Signal<any> | Computed<any>): unknown;
197
+ /** A28: a held node rewritten outside a flush keeps the staging the last
198
+ * flush left (`_flushed`) until the flush that carries the rewrite — the
199
+ * stash is stamped with the clock, which that flush advances. */
200
+ export declare function stashFlushed(el: Signal<any> | Computed<any>): void;
317
201
  /** A derivation served the committed value because of an unflushed write
318
202
  * (A28) must run again in the flush that carries it — the late-linker case
319
203
  * (#3337's reason to defer the walk): it linked after the write walked. */
320
204
  export declare function markLateLinker(c: Computed<any>): true;
321
- /** Companion-bearing nodes written outside a flush (setSignal); the flush
322
- * that carries their writes re-syncs their companions (A28). */
323
- export declare const unflushedCompanions: Array<Signal<any> | Computed<any>>;
324
205
  export declare function resyncUnflushedCompanions(): void;
325
- export declare function readNodeFast<T>(el: Signal<T>): T | typeof READ_SLOW;
206
+ /** A tracked read's pull of a computed: bring it current when the flush has
207
+ * reached its height (or the reader is a fresh-pull waiter), and sit the
208
+ * reader above it. */
209
+ export declare function pullComputed(owner: Computed<any>, c: Computed<any>): void;
326
210
  export declare function read<T>(el: Signal<T> | Computed<T>): T;
327
211
  /**
328
212
  * Rule 1, the one slow implementation (DESIGN-CONSOLIDATION move 3b, step
329
213
  * 6c): the value a reader `c` (null = untracked, no pass) is served from
330
- * `el`, whose committed value is `committed` — the node's own `_value` for
331
- * a signal or memo, the BACKING for a store property node (single-home rule,
332
- * O6: committed truth lives in the backing and a node's `_value` is never
333
- * served for one). Called by read()'s slow tail and by the store's untracked
334
- * node path (nodeValue); the fast paths (readNodeFast, read's fast block)
335
- * keep their trivial ternary by design (perf, see the doc). Arms, in order:
336
- * - the override (A17), routed through the engine for a tracked reader under
337
- * a lane or a supersession (A18), an authoritative reader marked instead;
338
- * - the lane entanglement gate (committed, recorded for replay);
339
- * - a node born held has nothing for an untracked reader (A19 exception 1);
214
+ * `el`. Called by read()'s slow tail; the fast path (read's fast block) keeps
215
+ * its trivial ternary by design (perf, see the doc). Arms, in order:
216
+ * - a node born staged has nothing for an untracked reader (A19 exception 1);
340
217
  * - an unflushed write serves committed and re-runs the reader in the
341
218
  * carrying flush (A28);
342
- * - readerSeesCommitted, else the staged value and the transaction (A29).
343
- */
344
- export declare function serve(el: Signal<any> | Computed<any>, c: Computed<any> | null, owner: Signal<any> | Computed<any>, committed: unknown): unknown;
345
- /**
346
- * Store-rewrite setter guard: the rewrite parks writes in a pending backing
347
- * (no setSignal at write time), so the owned-scope write protection must
348
- * fire at the setter entry instead. Exactly setSignal's guard condition
349
- * minus the node-specific exemptions (ownedWrite/firewall), which don't
350
- * apply to plain store setters. Roots are NOT exempt (#3500): a root body is
351
- * tree construction — every dev component body, every context Provider, the
352
- * top of `render()`, and the whole SSR pass run directly under one — and a
353
- * write there re-runs what already read the old value (or on the server,
354
- * can't). Same rule as setSignal, which never exempted roots.
219
+ * - readerSeesCommitted, else the staged value.
355
220
  */
356
- export declare function devGuardStoreSetterWrite(): void;
357
- /**
358
- * Store setter result guard: the callback's return has one meaning — a
359
- * replacement root to adopt — and a thenable can never be that. It is the
360
- * signature of `setStore(async d => …)` (or a sync arrow whose helper is
361
- * async): only the writes before the first `await` were in the transaction;
362
- * the rest land on a closed draft and vanish. Setters are synchronous
363
- * transactions; async orchestration is `action()`'s job. Store-specific —
364
- * a signal may legitimately hold a promise, so its setter has no such rule.
365
- */
366
- export declare function devGuardStoreSetterResult(result: unknown): void;
221
+ export declare function serve(el: Signal<any> | Computed<any>, c: Computed<any> | null): unknown;
222
+ /** A pass read a staging of this flush: it derives from what the flush may
223
+ * yet hold (REACTIVE_STAGED_READ — the seam decides). Lane work too (plan sec. 28, a
224
+ * lane sees the screen plus its own guesses): the staging is the screen if
225
+ * the frame commits — one pass, the common case — and a held write if it
226
+ * parks, which the seam repairs (`stagedReaders`): the pass re-derives on
227
+ * the committed world and its lane's runs wait that round, so the held
228
+ * write never shows through the lane. A verdict lane's work likewise: the
229
+ * lane holds verdicts, not the frame's other stagings (#3851) — except a
230
+ * verdict reader, which answered for itself (the lane seam, lanes.ts). Not
231
+ * a read of a node born staged at all: it has no committed value to
232
+ * re-derive on, and a re-run would read the same staging and re-queue every
233
+ * round (#3969: nor does it make a later lane read a re-derive, `enterLane`). */
234
+ export declare function stagedRead(c: Computed<any>, el?: Signal<any> | Computed<any>): void;
235
+ /** A10 for a staged node: a verdict reader (the pass entered a window) that
236
+ * also reads a frame's proposal plainly sees the screen — `[latest(q), q()]`
237
+ * is `[b, a]` — once the frame has a transaction, and re-derives when it
238
+ * lands: at this very seam if nothing holds it (the stale run is void,
239
+ * #3322 — one run, on the committed world), or with the hold. Before any
240
+ * transaction the answer is the seam's and the reader watches it
241
+ * (verdict.ts). A node born into the future has no screen: its staging is
242
+ * its only value (A29). Nor has a reader born into the flush's transaction
243
+ * (`bornInto`, #4010): its branch exists only there. */
244
+ export declare function stagedScreen(c: Computed<any>): boolean;
245
+ export declare function ownedScopeWriteMessage(owner: Owner): string;
246
+ /** A28 (4) — written inside a recompute that runs OUTSIDE a flush (a
247
+ * creation-time compute): promoted at that pass's end, visible to the rest of
248
+ * the block. Cold: only contextual writes reach here. */
249
+ export declare function notePromotedWrite(el: Signal<any> | Computed<any>): void;
250
+ /** Cold half of setSignal's snapshot arm (see there), shared with a store
251
+ * container's structural notify: first write during capture to a plain
252
+ * signal without a live snapshot records the pre-write value. Only plain
253
+ * user signals qualify. Computeds reach setSignal from an
254
+ * async landing (asyncWrite), and a value arriving from async during the pass
255
+ * REVEALS — the creation-time arm skips pending computeds for the same
256
+ * reason. Firewall leaves belong to a projection whose compute is the tree's
257
+ * own work, captured (or deliberately not) at creation. */
258
+ export declare function captureWriteSnapshot<T>(el: Signal<T> | Computed<T>, current: T): void;
367
259
  export declare function setSignal<T>(el: Signal<T> | Computed<T>, v: T | ((prev: T) => T)): T;
368
260
  /**
369
- * Suppresses automatic recomputation of `el` until the scheduler drains. Used
370
- * when a manual write should win over dependency changes queued in the same
371
- * tick. The MANUAL_WRITE flag is cleared by the pending-node drain; projection
372
- * computeds don't commit values, but they still need the same end-of-tick
373
- * cleanup point.
374
- */
375
- export declare function suppressComputedRecompute(el: Computed<unknown>): void;
376
- /** A34 amendment (#3612) — is `el`'s staging a DERIVATION another transaction
377
- * holds: stamped by a transaction that is not the writer's, and not a manual
378
- * proposal (the mask, on the node or — a store leaf — its firewall)? #2692's
379
- * "manual write wins" is a rule for one synchronous frame; across a hold the
380
- * held pass result is nobody's proposal, and a user setter reaching it
381
- * composes on the committed frame it was written against and becomes `prev`
382
- * for the transaction's re-derivation (rederiveHeld) instead of replacing it.
383
- * Writes made under the holding transaction masked the node and keep
384
- * A34(1)'s last-write-wins. Only the user setters ask; an async landing or a
385
- * companion writing a stamped node is the transaction's own work. */
386
- export declare function heldDerivation(el: Signal<any> | Computed<any>): boolean;
387
- /** The held-derivation write's second half: the node re-derives under its
388
- * hold with the written staging as the pass's `prev`. Nothing is masked. The
389
- * write took the A34 join (setSignal), which scheduled the flush that drains
390
- * this; recompute re-enters the stamp. */
391
- export declare function rederiveHeld(el: Computed<unknown>): void;
392
- /**
393
- * User-facing setter for the memo form of `createSignal(fn)`. Behaves like
394
- * `setSignal`, but also cancels any pending recompute of the memo so the
395
- * manual value wins over a value that would otherwise be produced by an
396
- * upstream change in the same tick. Across a hold the write is not a
397
- * proposal: a memo another transaction holds as a pass result composes on the
398
- * committed value and re-derives under the hold with the write as `prev`
399
- * (A34 amendment, #3612; heldDerivation).
261
+ * User-facing setter for the memo form of `createSignal(fn)`. A write applies
262
+ * first, then derivations re-run (A34 as amended 2026-10-01, rule B; core
263
+ * R31): the write stages like any other, and a source change — in this flush
264
+ * or a later one, under a hold or on mainline — re-derives with the staged
265
+ * write as `prev`. The write never refuses the re-run (the frame-scoped mask
266
+ * of #3733/#3740 and #2692's "write wins the tick" before it are gone; call
267
+ * order inside a flush was never observable) and on its own never causes one.
268
+ * REACTIVE_MANUAL_WRITE only marks the staging as a user proposal — the A34
269
+ * (1)/(3) discriminator — until a pass re-derives it or the commit lands it.
400
270
  */
401
271
  export declare function setMemo<T>(el: Computed<T>, v: T | ((prev: T) => T)): T;
402
272
  /**
@@ -425,6 +295,6 @@ export declare function staleValues<T>(fn: () => T, set?: boolean): T;
425
295
  * it validates the target, marks through here, then builds the quiescence
426
296
  * promise on the resolve()/until() effect machinery). Flags the node's next
427
297
  * recompute as a quiet re-ask and schedules it; no-ops for non-derived or
428
- * disposed targets and for same-tick manual writes.
298
+ * disposed targets.
429
299
  */
430
300
  export declare function markRefresh(node: Computed<any>): void;
@@ -14,7 +14,7 @@ export interface DevHooks {
14
14
  * `warn`/`error` as failures unless they opt in to `info`.
15
15
  */
16
16
  export type DiagnosticSeverity = "info" | "warn" | "error";
17
- export type DiagnosticCode = "STRICT_READ_UNTRACKED" | "PENDING_ASYNC_UNTRACKED_READ" | "PENDING_ASYNC_FORBIDDEN_SCOPE" | "REACTIVE_WRITE_IN_OWNED_SCOPE" | "ASYNC_STORE_SETTER" | "ACTION_CALLED_IN_OWNED_SCOPE" | "RUN_WITH_DISPOSED_OWNER" | "NO_OWNER_CLEANUP" | "CLEANUP_IN_FORBIDDEN_SCOPE" | "SETTLED_CLEANUP_UNOWNED" | "SETTLE_WALK_UNINITIALIZED_SOURCE" | "FLUSH_IN_EFFECT_CALLBACK" | "PRIMITIVE_IN_FORBIDDEN_SCOPE" | "NO_OWNER_EFFECT" | "NO_OWNER_BOUNDARY" | "ASYNC_OUTSIDE_LOADING_BOUNDARY" | "LOADING_ON_OUTSIDE_HOLD" | "INVALID_REFRESH_TARGET" | "INVALID_AFFECTS_TARGET" | "MISSING_EFFECT_FN" | "SYNC_NODE_RECEIVED_ASYNC" | "UNTRACKED_READ_AFTER_AWAIT" | "REACTIVITY_HALTED" | "INVARIANT_VIOLATION" | "HUGE_FAN_OUT" | "HUGE_FAN_IN" | "GRAPH_GROWTH" | "HOT_SCOPE_RERUNS" | "HOT_SCOPE_TIME" | "WIDE_SCOPE_DEPS" | "UNSTABLE_MEMO_OUTPUT" | "WASTED_RECOMPUTE" | "ASYNC_WATERFALL" | "HOT_SCOPE_FANOUT" | "SILENT_HOLD" | "LONG_HOLD" | "UNTRACKED_ASYNC_HANDLER" | "ABANDONED_FLIGHTS" | "FALLBACK_FLASH" | "STACKED_HOLDS" | "OPTIMISTIC_REVERTED" | "EFFECT_WRITES_OWN_SOURCE" | "EFFECT_RELAY_TEAR" | "IMMUTABLE_UPDATE_IN_STORE" | "UNSTABLE_LIST_IDENTITY" | "SSR_RENDER_ERROR_CONTAINED" | "SSR_SUBTREE_ABANDONED" | "SSR_STREAM_ABANDONED" | "SSR_CLIENT_CONTENT_MASKED" | "LATE_HEADER_WRITE" | "SERVER_ERROR_SANITIZED" | "SSR_BOUNDARY_WATERFALL" | "SSR_UNDECLARED_LIVE_SOURCE" | "SERVER_WRITE" | "REVEAL_IN_RENDER_TO_STRING" | "LAZY_ASSET_UNMAPPED" | "PRELOAD_DESCRIPTOR_INVALID" | "HEAD_TAG_INVALID" | "UNRECOGNIZED_INSERT_VALUE" | "UNSCOPED_HOLE_ALLOCATED_IDS" | "ATTRIBUTE_SLOT_POSITION" | "FRAME_MARKER_CORRUPTED" | "DYNAMIC_ASYNC_COMPONENT";
17
+ export type DiagnosticCode = "STRICT_READ_UNTRACKED" | "PENDING_ASYNC_UNTRACKED_READ" | "PENDING_ASYNC_FORBIDDEN_SCOPE" | "REACTIVE_WRITE_IN_OWNED_SCOPE" | "ASYNC_STORE_SETTER" | "ACTION_CALLED_IN_OWNED_SCOPE" | "RUN_WITH_DISPOSED_OWNER" | "NO_OWNER_CLEANUP" | "CLEANUP_IN_FORBIDDEN_SCOPE" | "SETTLED_CLEANUP_UNOWNED" | "SETTLE_WALK_UNINITIALIZED_SOURCE" | "FLUSH_IN_EFFECT_CALLBACK" | "PRIMITIVE_IN_FORBIDDEN_SCOPE" | "PRIMITIVE_IN_EFFECT_CALLBACK" | "NO_OWNER_EFFECT" | "NO_OWNER_BOUNDARY" | "ASYNC_OUTSIDE_LOADING_BOUNDARY" | "LOADING_ON_OUTSIDE_HOLD" | "INVALID_REFRESH_TARGET" | "INVALID_AFFECTS_TARGET" | "MISSING_EFFECT_FN" | "SYNC_NODE_RECEIVED_ASYNC" | "UNTRACKED_READ_AFTER_AWAIT" | "REACTIVITY_HALTED" | "INVARIANT_VIOLATION" | "HUGE_FAN_OUT" | "HUGE_FAN_IN" | "GRAPH_GROWTH" | "HOT_SCOPE_RERUNS" | "HOT_SCOPE_TIME" | "WIDE_SCOPE_DEPS" | "UNSTABLE_MEMO_OUTPUT" | "WASTED_RECOMPUTE" | "ASYNC_WATERFALL" | "HOT_SCOPE_FANOUT" | "SILENT_HOLD" | "LONG_HOLD" | "UNTRACKED_ASYNC_HANDLER" | "ABANDONED_FLIGHTS" | "FALLBACK_FLASH" | "STACKED_HOLDS" | "OPTIMISTIC_REVERTED" | "EFFECT_WRITES_OWN_SOURCE" | "EFFECT_RELAY_TEAR" | "IMMUTABLE_UPDATE_IN_STORE" | "UNSTABLE_LIST_IDENTITY" | "SSR_RENDER_ERROR_CONTAINED" | "SSR_SUBTREE_ABANDONED" | "SSR_STREAM_ABANDONED" | "SSR_CLIENT_CONTENT_MASKED" | "LATE_HEADER_WRITE" | "SERVER_ERROR_SANITIZED" | "SSR_BOUNDARY_WATERFALL" | "SSR_UNDECLARED_LIVE_SOURCE" | "SERVER_WRITE" | "REVEAL_IN_RENDER_TO_STRING" | "LAZY_ASSET_UNMAPPED" | "PRELOAD_DESCRIPTOR_INVALID" | "HEAD_TAG_INVALID" | "UNRECOGNIZED_INSERT_VALUE" | "UNSCOPED_HOLE_ALLOCATED_IDS" | "LOWERCASE_EVENT_ATTRIBUTE" | "BINDING_SLOT_POSITION" | "FRAME_MARKER_CORRUPTED" | "DYNAMIC_ASYNC_COMPONENT";
18
18
  export type DiagnosticKind = "strict-read" | "async" | "write" | "lifecycle" | "owner" | "error" | "perf" | "graph"
19
19
  /** Perceived responsiveness: the runtime behaved correctly but the user saw no feedback. */
20
20
  | "responsiveness"
@@ -22,7 +22,7 @@ export type DiagnosticKind = "strict-read" | "async" | "write" | "lifecycle" | "
22
22
  | "ssr"
23
23
  /** The response head: `<head>` tags, preload descriptors, HTTP headers. */
24
24
  | "head"
25
- /** The renderer's insert positions, on either platform: a value it has no rendering for. */
25
+ /** The renderer's insert and attribute positions: a value it has no rendering for, or one it renders other than intended. */
26
26
  | "render";
27
27
  /** First warning when a change reaches (or a pass tracks) this many edges. */
28
28
  export declare const GRAPH_SIZE_WARN_AT = 2000;
@@ -1,4 +1,3 @@
1
- import { type Transition } from "./scheduler.js";
2
1
  import type { Computed, NodeOptions, Owner } from "./types.js";
3
2
  export interface Effect<T> extends Computed<T>, Owner {
4
3
  _effectFn: (val: T, prev: T | undefined) => void | (() => void);
@@ -7,12 +6,6 @@ export interface Effect<T> extends Computed<T>, Owner {
7
6
  _prevValue: T | undefined;
8
7
  _type: number;
9
8
  _boundRunEffect?: (type: number) => void;
10
- /** The transaction whose staged view produced `_value` (null = committed
11
- * view). Effects have one value slot and do not entangle transactions, so
12
- * a second transaction recomputing the same effect overwrites a value the
13
- * first one still owes a run for; see the contested-effect arm of recompute
14
- * (#3322). */
15
- _valueTransition: Transition | null;
16
9
  }
17
10
  /**
18
11
  * Effects are the leaf nodes of our reactive graph. When their sources change, they are
@@ -1,4 +1,10 @@
1
1
  import type { Computed, Link, Signal } from "./types.js";
2
+ /** The store's shared slot-node release handler (store/store.ts installs it
3
+ * once) — a live binding read directly by the sweep site: no wrapper frame,
4
+ * no null check (a CONFIG_SLOT_NODE node existing implies the store module
5
+ * loaded and registered it). */
6
+ export declare let slotUnobservedHook: (node: Signal<any>) => void;
7
+ export declare function setSlotUnobserved(fn: (node: Signal<any>) => void): void;
2
8
  export declare function unlinkSubs(link: Link): Link | null;
3
9
  export declare function trimStaleDeps(el: Computed<any>): void;
4
10
  export declare function clearDeps(el: Computed<unknown>): void;
@@ -25,4 +31,4 @@ export declare function unobserved(el: Computed<unknown>): void;
25
31
  */
26
32
  export declare const dormantNodes: Set<Computed<unknown>>;
27
33
  export declare function sweepDormant(): void;
28
- export declare function link(dep: Signal<any> | Computed<any>, sub: Computed<any>, pendingObserver?: boolean): void;
34
+ export declare function link(dep: Signal<any> | Computed<any>, sub: Computed<any>): void;
@@ -1,12 +1,10 @@
1
1
  import type { Computed } from "./types.js";
2
- /** The queue a node belongs to, picked from its own zombie flag. */
3
- export declare function queueFor(n: Computed<any>): Heap;
4
2
  /**
5
- * Schedule one subscriber to re-run on the next flush: inserted into its own
6
- * (zombie-flag-routed) heap with the `_min` cursor pulled down. Tracked
7
- * effects ride the heap too — the heap visit is their (empty) compute phase,
8
- * which hands the callback to the user queue once the pass has committed
9
- * (see GlobalQueue._update, #3291).
3
+ * Schedule one subscriber to re-run on the next flush: inserted into the
4
+ * dirty heap with the `_min` cursor pulled down. Tracked effects ride the
5
+ * heap too — the heap visit is their (empty) compute phase, which hands the
6
+ * callback to the user queue once the pass has committed (see
7
+ * GlobalQueue._update, #3291).
10
8
  */
11
9
  export declare function enqueueSub(node: Computed<any>): void;
12
10
  export interface Heap {
@@ -1,14 +1,14 @@
1
1
  export { ContextNotFoundError, NoOwnerError, NotReadyError, TimeoutError } from "./error.js";
2
- export { isEqual, untrack, runWithOwner, computed, signal, read, setSignal, setMemo, optimisticSignal, optimisticComputed, installAuthoritativeRead, markRefresh, staleValues, setSnapshotCapture, markSnapshotScope, releaseSnapshotScope, clearSnapshots } from "./core.js";
2
+ export { isPending, latest } from "./verdict.js";
3
+ export { action } from "./action.js";
4
+ export { isEqual, untrack, runWithOwner, computed, signal, read, setSignal, setMemo, markRefresh, staleValues, setSnapshotCapture, markSnapshotScope, releaseSnapshotScope, clearSnapshots } from "./core.js";
3
5
  export { enableExternalSource, _resetExternalSourceConfig, type ExternalSourceFactory, type ExternalSource, type ExternalSourceConfig } from "./external.js";
4
6
  export { createOwner, createRoot, dispose, getNextChildId, getObserver, getOwner, isDisposed, cleanup, peekNextChildId } from "./owner.js";
5
7
  export { createContext, getContext, setContext, type Context, type ContextRecord } from "./context.js";
6
8
  export { handleAsync } from "./async.js";
7
- export { isPending, latest } from "./verdict.js";
8
- export type { Computed, Disposable, FirewallSignal, Link, Owner, Root, Signal, NodeOptions } from "./types.js";
9
+ export type { Computed, Disposable, Link, Owner, Root, Signal, NodeOptions } from "./types.js";
9
10
  export { effect, trackedEffect, type Effect, type TrackedEffect } from "./effect.js";
10
- export { action } from "./action.js";
11
- export { flush, Queue, GlobalQueue, enforceLoadingBoundary, resetErrorHalt, type IQueue, type QueueCallback } from "./scheduler.js";
11
+ export { flush, GlobalQueue, enforceLoadingBoundary, resetErrorHalt, type IQueue, type QueueCallback } from "./scheduler.js";
12
12
  export type { InteractionRef, NavigationRef } from "./attribution-hooks.js";
13
13
  export { ROOT_ERROR_HOOK } from "./scheduler.js";
14
14
  export { configureClientErrors, type ClientErrorContext, type ClientErrorHook, type ClientErrorsConfig } from "./error-hooks.js";