@llui/dom 0.0.40 → 0.2.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 (68) hide show
  1. package/README.md +22 -21
  2. package/dist/binding.d.ts +5 -0
  3. package/dist/binding.d.ts.map +1 -1
  4. package/dist/binding.js +1 -0
  5. package/dist/binding.js.map +1 -1
  6. package/dist/combine.d.ts +67 -0
  7. package/dist/combine.d.ts.map +1 -0
  8. package/dist/combine.js +76 -0
  9. package/dist/combine.js.map +1 -0
  10. package/dist/compose.d.ts +27 -21
  11. package/dist/compose.d.ts.map +1 -1
  12. package/dist/compose.js +19 -13
  13. package/dist/compose.js.map +1 -1
  14. package/dist/devtools.d.ts.map +1 -1
  15. package/dist/devtools.js +15 -5
  16. package/dist/devtools.js.map +1 -1
  17. package/dist/el-split.d.ts +1 -1
  18. package/dist/el-split.d.ts.map +1 -1
  19. package/dist/el-split.js +20 -2
  20. package/dist/el-split.js.map +1 -1
  21. package/dist/el-template.d.ts +8 -2
  22. package/dist/el-template.d.ts.map +1 -1
  23. package/dist/el-template.js +2 -1
  24. package/dist/el-template.js.map +1 -1
  25. package/dist/escape-hatch.d.ts +47 -0
  26. package/dist/escape-hatch.d.ts.map +1 -0
  27. package/dist/escape-hatch.js +63 -0
  28. package/dist/escape-hatch.js.map +1 -0
  29. package/dist/hmr.d.ts +2 -1
  30. package/dist/hmr.d.ts.map +1 -1
  31. package/dist/hmr.js +3 -2
  32. package/dist/hmr.js.map +1 -1
  33. package/dist/index.d.ts +3 -4
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/primitives/branch.d.ts.map +1 -1
  38. package/dist/primitives/branch.js +1 -0
  39. package/dist/primitives/branch.js.map +1 -1
  40. package/dist/primitives/each.d.ts.map +1 -1
  41. package/dist/primitives/each.js +1 -0
  42. package/dist/primitives/each.js.map +1 -1
  43. package/dist/primitives/memo.d.ts +2 -2
  44. package/dist/primitives/memo.d.ts.map +1 -1
  45. package/dist/primitives/memo.js +13 -5
  46. package/dist/primitives/memo.js.map +1 -1
  47. package/dist/primitives/sample.d.ts +2 -2
  48. package/dist/primitives/sample.js +2 -2
  49. package/dist/primitives/sample.js.map +1 -1
  50. package/dist/primitives/unsafe-html.d.ts.map +1 -1
  51. package/dist/primitives/unsafe-html.js +1 -0
  52. package/dist/primitives/unsafe-html.js.map +1 -1
  53. package/dist/primitives/virtual-each.d.ts.map +1 -1
  54. package/dist/primitives/virtual-each.js +7 -4
  55. package/dist/primitives/virtual-each.js.map +1 -1
  56. package/dist/render-context.js +1 -1
  57. package/dist/render-context.js.map +1 -1
  58. package/dist/structural.d.ts +8 -4
  59. package/dist/structural.d.ts.map +1 -1
  60. package/dist/structural.js.map +1 -1
  61. package/dist/types.d.ts +27 -23
  62. package/dist/types.d.ts.map +1 -1
  63. package/dist/types.js.map +1 -1
  64. package/dist/update-loop.d.ts +14 -6
  65. package/dist/update-loop.d.ts.map +1 -1
  66. package/dist/update-loop.js +130 -34
  67. package/dist/update-loop.js.map +1 -1
  68. package/package.json +5 -1
@@ -13,12 +13,65 @@ import { applyBinding } from './binding.js';
13
13
  import { setCurrentDirtyMask } from './primitives/memo.js';
14
14
  import { enterAccessor, exitAccessor } from './render-context.js';
15
15
  export const FULL_MASK = 0xffffffff | 0;
16
- // Addressed effect dispatcher — set by addressed.ts when imported
17
- let addressedDispatcher = null;
18
- export function setAddressedDispatcher(fn) {
19
- addressedDispatcher = fn;
16
+ /**
17
+ * Path-keyed dirty mask computation. Walks the prefix table; each entry
18
+ * whose `prefix(prev) !== prefix(next)` contributes its bit to the dirty
19
+ * mask. Bit position = table position (single-word, ≤31 entries) — for
20
+ * overflow (>31 entries), bits 31..61 land in the high half of a
21
+ * `[number, number]` pair, matching `__dirty`'s overflow shape.
22
+ *
23
+ * The runtime is correct under structural-sharing reducers (immutable
24
+ * splice): a sub-tree that wasn't touched stays reference-equal across
25
+ * `prev`/`next`, so every accessor reading into that sub-tree skips.
26
+ *
27
+ * @internal
28
+ */
29
+ export function computeDirtyFromPrefixes(prefixes, prev, next) {
30
+ if (prefixes.length <= 31) {
31
+ let dirty = 0;
32
+ for (let i = 0; i < prefixes.length; i++) {
33
+ if (prefixes[i](prev) !== prefixes[i](next))
34
+ dirty |= 1 << i;
35
+ }
36
+ return dirty;
37
+ }
38
+ // Overflow: two words, 31 bits each (avoid sign bit for ergonomic
39
+ // bitwise ops). Bit i % 31 of word ⌊i / 31⌋.
40
+ let lo = 0;
41
+ let hi = 0;
42
+ const len = prefixes.length;
43
+ for (let i = 0; i < len && i < 31; i++) {
44
+ if (prefixes[i](prev) !== prefixes[i](next))
45
+ lo |= 1 << i;
46
+ }
47
+ for (let i = 31; i < len && i < 62; i++) {
48
+ if (prefixes[i](prev) !== prefixes[i](next))
49
+ hi |= 1 << (i - 31);
50
+ }
51
+ // Anything past 62 forces FULL_MASK in the high word — the unified
52
+ // model's compiler-emitted prefix counts shouldn't hit this in
53
+ // realistic apps, but degrade gracefully if they do.
54
+ if (len > 62)
55
+ hi = FULL_MASK;
56
+ return [lo, hi];
20
57
  }
21
58
  export function createComponentInstance(def, data, parentLifetime = null, dom) {
59
+ // Hand-authored `__dirty` is no longer supported — the path-keyed
60
+ // `__prefixes` emission supersedes it (62-prefix capacity, precise
61
+ // per-prefix gating). Compiler-emitted `__dirty` was removed in
62
+ // 2026-05 alongside this throw; any `__dirty` field at runtime must
63
+ // be user code, and silently ignoring it would hide a stale pattern.
64
+ // Migrate by deleting the `__dirty` field — the compiler emits
65
+ // `__prefixes` automatically from accessor analysis, and uncompiled
66
+ // components correctly fall back to FULL_MASK.
67
+ if (def.__dirty !== undefined) {
68
+ throw new Error(`[llui] Component "${def.name}" defines \`__dirty\` directly. ` +
69
+ `This field is no longer accepted — the compiler emits \`__prefixes\` ` +
70
+ `(path-keyed reactivity) automatically. Remove \`__dirty\` from the ` +
71
+ `ComponentDef; either the compiler will regenerate the correct ` +
72
+ `prefix table, or uncompiled components will fall back to FULL_MASK. ` +
73
+ `See docs/proposals/unified-composition-model.md.`);
74
+ }
22
75
  const [initialState, initialEffects] = def.init(data);
23
76
  const controller = new AbortController();
24
77
  const inst = {
@@ -82,7 +135,7 @@ export function _forceState(inst, newState) {
82
135
  const snapshot = inst.structuralBlocks.slice();
83
136
  for (const block of snapshot) {
84
137
  try {
85
- block.reconcile(newState, FULL_MASK);
138
+ block.reconcile(newState, FULL_MASK, FULL_MASK);
86
139
  }
87
140
  catch (e) {
88
141
  reportReconcileError(inst, e);
@@ -229,21 +282,40 @@ function processMessages(inst) {
229
282
  return;
230
283
  }
231
284
  }
232
- // Generic pipeline — drain queue, accumulate dirty bits
285
+ // Generic pipeline — drain queue, accumulate dirty bits (two words:
286
+ // bits 0..30 in `combinedDirty`, bits 31..61 in `combinedDirtyHi`).
233
287
  let state = inst.state;
234
288
  let combinedDirty = 0;
289
+ let combinedDirtyHi = 0;
235
290
  const allEffects = [];
236
291
  const defUpdate = inst.def.update;
237
- const dirtyFn = inst.def.__dirty;
292
+ // Path-keyed reactivity: when the compiler emits `__prefixes`, dirty
293
+ // bits correspond to entries in the prefix table (one bit per minimal
294
+ // reference-stable prefix read across the component's accessors). The
295
+ // runtime computes the dirty mask by reference-comparing `prefix(prev)
296
+ // !== prefix(next)` for each table entry — precise per-prefix and
297
+ // supports two-word emission for up to 62 prefixes. Components compiled
298
+ // without `__llui/vite-plugin` (or with no reactive accessors) have no
299
+ // `__prefixes` table; they fall back to `FULL_MASK` and pay the cost
300
+ // of re-evaluating every binding every cycle. User-authored `__dirty`
301
+ // is no longer accepted — see types.ts for the rationale.
302
+ const prefixes = inst.def.__prefixes;
238
303
  for (let qi = 0; qi < queue.length; qi++) {
239
304
  const msg = queue[qi];
240
305
  const [newState, effects] = defUpdate(state, msg);
241
- const dirty = dirtyFn ? dirtyFn(state, newState) : FULL_MASK;
306
+ let dirty;
307
+ if (prefixes !== undefined) {
308
+ dirty = computeDirtyFromPrefixes(prefixes, state, newState);
309
+ }
310
+ else {
311
+ dirty = FULL_MASK;
312
+ }
242
313
  if (typeof dirty === 'number') {
243
314
  combinedDirty |= dirty;
244
315
  }
245
316
  else {
246
- combinedDirty |= dirty[0] | dirty[1];
317
+ combinedDirty |= dirty[0];
318
+ combinedDirtyHi |= dirty[1];
247
319
  }
248
320
  state = newState;
249
321
  // Avoid spread — allocates an iterator per call. For typical effect
@@ -266,21 +338,26 @@ function processMessages(inst) {
266
338
  const bindingsBeforePhase1 = bindings.length;
267
339
  // Set current dirty mask BEFORE Phase 1 so memo() accessors used in
268
340
  // structural primitives (e.g. each.items) can use the bitmask fast path.
269
- setCurrentDirtyMask(combinedDirty);
341
+ setCurrentDirtyMask(combinedDirty, combinedDirtyHi);
270
342
  if (inst.def.__update) {
271
- // Compiler-generated fast path — replaces generic Phase 1 + Phase 2
272
- inst.def.__update(state, combinedDirty, bindings, inst.structuralBlocks, bindingsBeforePhase1);
343
+ // Compiler-generated fast path — replaces generic Phase 1 + Phase 2.
344
+ // `combinedDirtyHi` is passed as the trailing positional arg so
345
+ // stale 5-param compiled bundles continue to gate correctly: they
346
+ // ignore the extra arg, and for ≤31-prefix components `dirtyHi`
347
+ // is always 0 anyway. Fresh compiled bundles use the 6th param
348
+ // for precise two-word Phase 1 gating on 32..61-prefix components.
349
+ inst.def.__update(state, combinedDirty, bindings, inst.structuralBlocks, bindingsBeforePhase1, combinedDirtyHi);
273
350
  }
274
351
  else {
275
352
  // Generic Phase 1 + Phase 2 fallback (uncompiled components)
276
- genericUpdate(inst, state, combinedDirty, bindings, bindingsBeforePhase1);
353
+ genericUpdate(inst, state, combinedDirty, combinedDirtyHi, bindings, bindingsBeforePhase1);
277
354
  }
278
355
  // Dispatch effects after DOM updates
279
356
  for (let i = 0; i < allEffects.length; i++) {
280
357
  dispatchEffect(inst, allEffects[i]);
281
358
  }
282
359
  }
283
- function genericUpdate(inst, state, combinedDirty, bindings, bindingsBeforePhase1) {
360
+ function genericUpdate(inst, state, combinedDirty, combinedDirtyHi, bindings, bindingsBeforePhase1) {
284
361
  // Phase 1 — structural reconciliation. Structural primitives register
285
362
  // their blocks BEFORE running builders, so parents precede their nested
286
363
  // children in this array. That ordering matters: a parent's reconcile
@@ -291,17 +368,22 @@ function genericUpdate(inst, state, combinedDirty, bindings, bindingsBeforePhase
291
368
  const blocks = inst.structuralBlocks;
292
369
  for (let bi = 0; bi < blocks.length; bi++) {
293
370
  const block = blocks[bi];
294
- if (!block || (block.mask & combinedDirty) === 0)
371
+ if (!block)
372
+ continue;
373
+ // Two-word gate: skip when neither low nor high masks intersect.
374
+ // `block.maskHi` is 0 for ≤31-prefix blocks, so `0 & dirtyHi === 0`
375
+ // collapses the gate to the single-word check at runtime.
376
+ if (!((block.mask & combinedDirty) | (block.maskHi & combinedDirtyHi)))
295
377
  continue;
296
378
  try {
297
- block.reconcile(state, combinedDirty);
379
+ block.reconcile(state, combinedDirty, combinedDirtyHi);
298
380
  }
299
381
  catch (e) {
300
382
  reportReconcileError(inst, e);
301
383
  }
302
384
  }
303
385
  // Phase 2 — compact + update bindings
304
- _runPhase2(state, combinedDirty, bindings, bindingsBeforePhase1, inst.def.name, inst._onBindingError);
386
+ _runPhase2(state, combinedDirty, combinedDirtyHi, bindings, bindingsBeforePhase1, inst.def.name, inst._onBindingError);
305
387
  }
306
388
  /**
307
389
  * Run a handler for a single message: call update(), reconcile blocks
@@ -310,8 +392,14 @@ function genericUpdate(inst, state, combinedDirty, bindings, bindingsBeforePhase
310
392
  *
311
393
  * @param method 0=reconcile, 1=reconcileItems, 2=reconcileClear, 3=reconcileRemove, -1=skip blocks
312
394
  * @public — used by compiler-generated `__handlers`
395
+ *
396
+ * Backward-compat: pre-multi-word compiled bundles call this with 4
397
+ * args (no `dirtyHi`). The default `dirtyHi = 0` keeps those calls
398
+ * correct for ≤31-prefix components — the high gate always evaluates
399
+ * to 0 so the runtime falls back to the single-word check. Components
400
+ * with >31 prefixes need a fresh compile to start passing `dirtyHi`.
313
401
  */
314
- export function _handleMsg(inst, msg, dirty, method) {
402
+ export function _handleMsg(inst, msg, dirty, method, dirtyHi = 0) {
315
403
  const [s, e] = inst.def.update(inst.state, msg);
316
404
  inst.state = s;
317
405
  inst._onCommit?.(s);
@@ -322,12 +410,14 @@ export function _handleMsg(inst, msg, dirty, method) {
322
410
  // memo short-circuits with the stale value left over from the
323
411
  // previous cycle and structural blocks reconcile against a frozen
324
412
  // input.
325
- setCurrentDirtyMask(dirty);
413
+ setCurrentDirtyMask(dirty, dirtyHi);
326
414
  if (method >= 0) {
327
415
  const bl = inst.structuralBlocks;
328
416
  for (let i = 0; i < bl.length; i++) {
329
417
  const block = bl[i];
330
- if (!block || !(block.mask & dirty))
418
+ if (!block)
419
+ continue;
420
+ if (!((block.mask & dirty) | (block.maskHi & dirtyHi)))
331
421
  continue;
332
422
  try {
333
423
  // Specialized methods (`reconcileItems`, `reconcileClear`,
@@ -343,25 +433,25 @@ export function _handleMsg(inst, msg, dirty, method) {
343
433
  // methods, so they keep their fast path.
344
434
  switch (method) {
345
435
  case 0:
346
- block.reconcile(s, dirty);
436
+ block.reconcile(s, dirty, dirtyHi);
347
437
  break;
348
438
  case 1:
349
439
  if (block.reconcileItems)
350
440
  block.reconcileItems(s);
351
441
  else
352
- block.reconcile(s, dirty);
442
+ block.reconcile(s, dirty, dirtyHi);
353
443
  break;
354
444
  case 2:
355
445
  if (block.reconcileClear)
356
446
  block.reconcileClear();
357
447
  else
358
- block.reconcile(s, dirty);
448
+ block.reconcile(s, dirty, dirtyHi);
359
449
  break;
360
450
  case 3:
361
451
  if (block.reconcileRemove)
362
452
  block.reconcileRemove(s);
363
453
  else
364
- block.reconcile(s, dirty);
454
+ block.reconcile(s, dirty, dirtyHi);
365
455
  break;
366
456
  default:
367
457
  // method >= 10: reconcileChanged with stride = method - 10
@@ -369,7 +459,7 @@ export function _handleMsg(inst, msg, dirty, method) {
369
459
  if (block.reconcileChanged)
370
460
  block.reconcileChanged(s, method - 10);
371
461
  else
372
- block.reconcile(s, dirty);
462
+ block.reconcile(s, dirty, dirtyHi);
373
463
  }
374
464
  break;
375
465
  }
@@ -381,15 +471,21 @@ export function _handleMsg(inst, msg, dirty, method) {
381
471
  }
382
472
  }
383
473
  const b = inst.allBindings;
384
- _runPhase2(s, dirty, b, b.length, inst.def.name, inst._onBindingError);
474
+ _runPhase2(s, dirty, dirtyHi, b, b.length, inst.def.name, inst._onBindingError);
385
475
  return [s, e];
386
476
  }
387
477
  /**
388
478
  * Phase 2: compact dead bindings + update live bindings.
389
479
  * Shared between genericUpdate and compiler-generated __update.
390
480
  * @public — used by compiler-generated `__update` functions
481
+ *
482
+ * `dirtyHi` defaults to 0 for backward-compat with pre-multi-word
483
+ * compiled bundles that pass only the single-word `dirty`. Bindings
484
+ * read paths 0..30 in `binding.mask` and paths 31..61 in
485
+ * `binding.maskHi`; the gate ORs both AND results so the high word is
486
+ * a no-op for ≤31-prefix components.
391
487
  */
392
- export function _runPhase2(state, dirty, bindings, bindingsBeforePhase1, componentName,
488
+ export function _runPhase2(state, dirty, dirtyHi, bindings, bindingsBeforePhase1, componentName,
393
489
  // Optional `_onBindingError` hook. Type is duplicated here rather
394
490
  // than referenced as `ComponentInstance['_onBindingError']` because
395
491
  // the underlying field is `@internal` — stripped from the generated
@@ -406,7 +502,7 @@ onBindingError) {
406
502
  bindings.length = w;
407
503
  phase2Len = Math.min(w, bindingsBeforePhase1);
408
504
  }
409
- if (dirty !== 0) {
505
+ if (dirty !== 0 || dirtyHi !== 0) {
410
506
  // Always catch+continue: a single accessor throw shouldn't abort
411
507
  // the rest of the bindings on the same commit. The user-visible
412
508
  // effect: a broken cell shows its previous value; sibling cells
@@ -427,7 +523,12 @@ onBindingError) {
427
523
  try {
428
524
  for (let i = 0, len = phase2Len; i < len; i++) {
429
525
  const binding = bindings[i];
430
- if (binding.dead || (binding.mask & dirty) === 0)
526
+ if (binding.dead)
527
+ continue;
528
+ // Two-word gate. `maskHi` is 0 for ≤31-prefix bindings; the
529
+ // `0 & dirtyHi === 0` branch collapses to a no-op under V8's
530
+ // inline cache.
531
+ if (!((binding.mask & dirty) | (binding.maskHi & dirtyHi)))
431
532
  continue;
432
533
  if (binding.kind === 'effect') {
433
534
  try {
@@ -539,11 +640,6 @@ function enhanceBindingError(err, binding, componentName) {
539
640
  }
540
641
  function dispatchEffect(inst, effect) {
541
642
  const eff = effect;
542
- // Addressed effects — dispatch to target component
543
- if (eff.__addressed === true && typeof eff.__targetKey !== 'undefined') {
544
- addressedDispatcher?.(eff);
545
- return;
546
- }
547
643
  // Built-in: delay
548
644
  if (eff.type === 'delay') {
549
645
  const ms = eff.ms;
@@ -1 +1 @@
1
- {"version":3,"file":"update-loop.js","sourceRoot":"","sources":["../src/update-loop.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentDef, Lifetime, Binding } from './types.js'\nimport type { StructuralBlock } from './structural.js'\nimport type { RingBuffer, EachDiff } from './tracking/each-diff.js'\nimport type { DisposerEvent } from './tracking/disposer-log.js'\nimport type { CoverageTracker } from './tracking/coverage.js'\nimport { type DomEnv, browserEnv } from './dom-env.js'\n\n// Single lazily-constructed browser env shared by every client-side\n// component instance. Falls through to globalThis at call time — safe\n// to construct on a server process (the lookups never fire there).\nlet _fallbackEnv: DomEnv | null = null\nfunction fallbackBrowserEnv(): DomEnv {\n if (_fallbackEnv === null) _fallbackEnv = browserEnv()\n return _fallbackEnv\n}\nimport type {\n EffectTimelineEntry,\n PendingEffectsList,\n MockRegistry,\n} from './tracking/effect-timeline.js'\nimport { createLifetime } from './lifetime.js'\nimport { applyBinding } from './binding.js'\nimport { setCurrentDirtyMask } from './primitives/memo.js'\nimport { enterAccessor, exitAccessor } from './render-context.js'\n\nexport const FULL_MASK = 0xffffffff | 0\n\n// Addressed effect dispatcher — set by addressed.ts when imported\nlet addressedDispatcher: ((eff: { __targetKey: string | number; __msg: unknown }) => void) | null =\n null\n\nexport function setAddressedDispatcher(\n fn: (eff: { __targetKey: string | number; __msg: unknown }) => void,\n): void {\n addressedDispatcher = fn\n}\n\nexport interface ComponentInstance<S = unknown, M = unknown, E = unknown> {\n def: ComponentDef<S, M, E>\n state: S\n initialEffects: E[]\n rootLifetime: Lifetime\n dom: DomEnv\n allBindings: Binding[]\n structuralBlocks: StructuralBlock[]\n queue: M[]\n microtaskScheduled: boolean\n lastDirtyMask: number\n lastEffects: E[]\n send: (msg: M) => void\n signal: AbortSignal\n abortController: AbortController\n /** @internal dev-only — populated when `installDevTools` ran. Ring-buffered\n * per-each-site reconciliation diffs for MCP introspection tools. */\n _eachDiffLog?: RingBuffer<EachDiff>\n /** @internal dev-only — monotonically incremented by the devtools-intercepted\n * `update` before each history push. Read by `each.ts` to stamp diffs with\n * the `updateIndex` of the message that caused the reconciliation. */\n _updateCounter?: number\n /** @internal dev-only — populated when `installDevTools` ran. Ring-buffered\n * log of `disposeLifetime` firings (scope id + cause). Consumed by the\n * `llui_disposer_log` MCP tool to diagnose leaks on structural transitions. */\n _disposerLog?: RingBuffer<DisposerEvent>\n /** @internal dev-only — populated when `installDevTools` ran. Per-variant\n * Msg counter keyed by discriminant. Consumed by the `llui_coverage` MCP\n * tool to surface Msg variants that have never fired this session. */\n _coverage?: CoverageTracker\n /** @internal dev-only — populated when `installDevTools` ran. Ring-buffered\n * effect dispatch phase log (dispatched → resolved/cancelled) for USER\n * effects emitted from `update()`. Consumed by the `llui_effect_timeline`\n * MCP tool. Built-in plumbing effects (`delay`, `log`, addressed) are NOT\n * recorded here by design — they short-circuit in `dispatchEffect` before\n * `dispatchEffectDev` runs. They're runtime plumbing, not user intent,\n * and surface via other channels (message queue for `delay`, browser\n * console for `log`, addressed-target routing for addressed effects). */\n _effectTimeline?: RingBuffer<EffectTimelineEntry>\n /** @internal dev-only — populated when `installDevTools` ran. List of\n * currently-pending effects addressable by id, consumed by the\n * `llui_pending_effects` MCP tool. */\n _pendingEffects?: PendingEffectsList\n /** @internal dev-only — populated when `installDevTools` ran. Mock\n * registry consulted by the effect-dispatch wrapper to short-circuit\n * matching effects. Consumed by the `llui_mock_effect` MCP tool. */\n _effectMocks?: MockRegistry\n /**\n * @internal — set by mountApp/mountAtAnchor/hydrateApp/hydrateAtAnchor\n * to fire AppHandle.subscribe listeners after every update cycle.\n * Undefined until the first subscriber registers.\n */\n _onCommit?: (state: unknown) => void\n /**\n * @internal — optional hook invoked when a binding's accessor throws\n * during Phase 2. The runtime catches the throw, leaves the binding's\n * `lastValue` unchanged (so the rendered DOM stays at its previous\n * value rather than going blank), and notifies this hook. The agent\n * factory wires it to drain.errors so the LLM sees that some bindings\n * failed; non-agent hosts can leave it undefined for the default\n * console-warn behavior.\n *\n * Why catch + continue instead of letting the throw propagate?\n * One bad binding shouldn't abort the entire update loop — sibling\n * bindings on the same commit are independent and have no business\n * going stale because a different binding crashed. The user-visible\n * effect: when one cell's accessor throws (e.g. scoring fails on a\n * malformed criterion), every other cell still renders correctly;\n * only the broken binding shows its previous value.\n */\n _onBindingError?: (info: { kind: string; key?: string; message: string; stack?: string }) => void\n /**\n * @internal — live registry of currently-mounted Msg variants\n * dispatchable from rendered UI. Lazily allocated when the first\n * compiler-tagged event handler binds. Read by the agent layer (via\n * `AppHandle.getBindingDescriptors()`) to surface live affordances\n * to the LLM. See `binding-descriptors.ts` for the registration\n * protocol and `@llui/vite-plugin`'s tagger pass for the tag emission.\n */\n _bindingDescriptors?: import('./binding-descriptors.js').BindingDescriptorRegistry\n}\n\nexport function createComponentInstance<S, M, E, D = void>(\n def: ComponentDef<S, M, E, D>,\n data?: D,\n parentLifetime: Lifetime | null = null,\n dom?: DomEnv,\n): ComponentInstance<S, M, E> {\n const [initialState, initialEffects] = def.init(data as D)\n\n const controller = new AbortController()\n\n const inst: ComponentInstance<S, M, E> = {\n // `def` carries an arbitrary `D` for typed init data, but after init\n // has run the runtime never touches `def.init` again — update/view/\n // onEffect and HMR replacement don't depend on D. Cast to the\n // D=void instance storage shape here.\n def: def as ComponentDef<S, M, E>,\n state: initialState,\n initialEffects,\n // Caller-supplied DOM env. `mountApp` defaults this to `browserEnv()`;\n // `renderToString` passes the user's jsdom/linkedom env. Never null —\n // every primitive reads from inst.dom.\n dom: dom ?? fallbackBrowserEnv(),\n // When `parentLifetime` is provided the instance's rootLifetime becomes a\n // child of that scope. This is how persistent layouts wire pages\n // into the layout's scope tree: the page's rootLifetime is parented at\n // the layout's pageSlot() point so `useContext` lookups flow layout\n // → page, and scope disposal cascades correctly. Mount paths that\n // don't pass parentLifetime get the classic detached root.\n rootLifetime: createLifetime(parentLifetime),\n allBindings: [],\n structuralBlocks: [],\n queue: [],\n microtaskScheduled: false,\n lastDirtyMask: 0,\n lastEffects: [],\n signal: controller.signal,\n abortController: controller,\n\n send(msg: M) {\n inst.queue.push(msg)\n if (!inst.microtaskScheduled) {\n inst.microtaskScheduled = true\n queueMicrotask(() => {\n inst.microtaskScheduled = false\n processMessages(inst)\n })\n }\n },\n }\n\n inst.rootLifetime._kind = 'root'\n\n return inst\n}\n\nexport function flushInstance<S, M, E>(inst: ComponentInstance<S, M, E>): void {\n if (inst.queue.length === 0) return\n inst.microtaskScheduled = false\n processMessages(inst)\n}\n\n/**\n * Dev-only: overwrite instance state and re-run both phases with FULL_MASK\n * so every binding re-evaluates. Bypasses update() — use for devtools\n * snapshot/restore, not in app code.\n */\nexport function _forceState<S, M, E>(inst: ComponentInstance<S, M, E>, newState: S): void {\n inst.state = newState\n inst.lastDirtyMask = FULL_MASK\n\n const bindings = inst.allBindings\n const bindingsBeforePhase1 = bindings.length\n\n setCurrentDirtyMask(FULL_MASK)\n\n const snapshot = inst.structuralBlocks.slice()\n for (const block of snapshot) {\n try {\n block.reconcile(newState, FULL_MASK)\n } catch (e) {\n reportReconcileError(inst, e)\n }\n }\n\n let phase2Len = bindingsBeforePhase1\n if (bindings.length > bindingsBeforePhase1 || (phase2Len > 0 && bindings[0]!.dead)) {\n let w = 0\n for (let r = 0; r < bindings.length; r++) {\n if (!bindings[r]!.dead) bindings[w++] = bindings[r]!\n }\n bindings.length = w\n phase2Len = Math.min(w, bindingsBeforePhase1)\n }\n\n const state = inst.state\n enterAccessor('a binding accessor')\n try {\n for (let i = 0, len = phase2Len; i < len; i++) {\n const binding = bindings[i]!\n if (binding.dead) continue\n if (binding.kind === 'effect') {\n try {\n binding.accessor(state)\n } catch (e) {\n reportBindingError(inst, binding, e)\n }\n continue\n }\n let newValue: unknown\n try {\n newValue = binding.accessor(state)\n } catch (e) {\n // Accessor threw — leave the binding's `lastValue` unchanged so\n // the rendered DOM stays at its previous value rather than going\n // blank. Sibling bindings on the same commit continue to\n // evaluate. The error surfaces via the optional hook (or\n // console.warn as a fallback) so it isn't silently swallowed.\n reportBindingError(inst, binding, e)\n continue\n }\n if (Object.is(newValue, binding.lastValue)) continue\n binding.lastValue = newValue\n try {\n applyBinding(binding, newValue)\n } catch (e) {\n // applyBinding writes the value to the DOM (textContent,\n // setAttribute, etc.). Throws here are usually environmental\n // (a node was removed mid-flight by a sibling binding). Same\n // contract: report and continue.\n reportBindingError(inst, binding, e)\n }\n }\n } finally {\n exitAccessor()\n }\n}\n\nfunction reportBindingError<S, M, E>(\n inst: ComponentInstance<S, M, E>,\n binding: Binding,\n e: unknown,\n): void {\n const err = e instanceof Error ? e : new Error(String(e))\n const stack = err.stack ? err.stack.split('\\n').slice(0, 8).join('\\n') : undefined\n const info =\n stack !== undefined\n ? {\n kind: String(binding.kind),\n key: binding.key,\n message: `${err.name}: ${err.message}`,\n stack,\n }\n : { kind: String(binding.kind), key: binding.key, message: `${err.name}: ${err.message}` }\n if (inst._onBindingError !== undefined) {\n try {\n inst._onBindingError(info)\n } catch {\n // The hook itself threw — nothing to do; we're in a recovery\n // path already. Fall through to the console fallback.\n }\n } else if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n console.warn(\n `[llui] binding accessor threw (kind=${info.kind}${info.key ? `, key=${info.key}` : ''}): ${info.message}`,\n )\n }\n}\n\n/**\n * Phase 1 (structural reconcile) parallel of `reportBindingError`. A\n * `block.reconcile` throw — most often a misuse like `sample()` inside an\n * `each().key` accessor — would otherwise escape the update loop, kill the\n * remaining structural blocks AND the entire Phase 2 binding pass on this\n * commit, and (in real apps) surface as an unhandled microtask rejection\n * the developer never sees. Routing it through the same `_onBindingError`\n * channel that Phase 2 uses gives parity: the error is named, surfaced\n * once, and the rest of the update continues.\n *\n * Note: a partial DOM mutation on the failing block is NOT rolled back.\n * The block's reconcile is responsible for keeping the DOM in a consistent\n * state on its own happy path; if it throws mid-mutation, the visible\n * result may be an inconsistent block, but sibling blocks and bindings\n * still update correctly.\n */\nfunction reportReconcileError<S, M, E>(inst: ComponentInstance<S, M, E>, e: unknown): void {\n const err = e instanceof Error ? e : new Error(String(e))\n const stack = err.stack ? err.stack.split('\\n').slice(0, 8).join('\\n') : undefined\n const info =\n stack !== undefined\n ? { kind: 'reconcile', message: `${err.name}: ${err.message}`, stack }\n : { kind: 'reconcile', message: `${err.name}: ${err.message}` }\n if (inst._onBindingError !== undefined) {\n try {\n inst._onBindingError(info)\n } catch {\n // hook itself threw; fall through to console\n }\n } else if (typeof console !== 'undefined' && typeof console.error === 'function') {\n // Reconcile errors are programmer errors (almost always: sample-in-\n // accessor or a thrown structural primitive). Surface as `error` not\n // `warn` so they're not lost in noisy dev consoles.\n console.error(`[llui] structural reconcile threw: ${info.message}`)\n }\n}\n\nfunction processMessages<S, M, E>(inst: ComponentInstance<S, M, E>): void {\n const queue = inst.queue\n\n // Single-message fast path: dispatch directly to per-message-type handler\n // if available. Skips dirty computation, Phase 1/2 entirely.\n if (queue.length === 1 && inst.def.__handlers) {\n const msg = queue[0]!\n const handler = inst.def.__handlers[(msg as Record<string, unknown>).type as string] as\n | ((inst: ComponentInstance, msg: unknown) => [S, E[]])\n | undefined\n if (handler) {\n queue.length = 0\n const [newState, effects] = handler(inst as ComponentInstance, msg)\n inst.state = newState\n inst._onCommit?.(newState as unknown)\n if (import.meta.env?.DEV) {\n inst.lastDirtyMask = FULL_MASK\n inst.lastEffects = effects\n }\n for (let i = 0; i < effects.length; i++) {\n dispatchEffect(inst, effects[i]!)\n }\n return\n }\n }\n\n // Generic pipeline — drain queue, accumulate dirty bits\n let state = inst.state\n let combinedDirty = 0\n const allEffects: E[] = []\n\n const defUpdate = inst.def.update\n const dirtyFn = inst.def.__dirty\n for (let qi = 0; qi < queue.length; qi++) {\n const msg = queue[qi]!\n const [newState, effects] = defUpdate(state, msg)\n const dirty = dirtyFn ? dirtyFn(state, newState) : FULL_MASK\n if (typeof dirty === 'number') {\n combinedDirty |= dirty\n } else {\n combinedDirty |= dirty[0] | dirty[1]\n }\n state = newState\n // Avoid spread — allocates an iterator per call. For typical effect\n // arrays (0-2 elements) this is a minor saving; for bursts it matters.\n for (let ei = 0; ei < effects.length; ei++) allEffects.push(effects[ei]!)\n }\n queue.length = 0\n\n inst.state = state\n inst._onCommit?.(state as unknown)\n // Dev-only bookkeeping — tests read lastDirtyMask/lastEffects, prod\n // doesn't. Gating here keeps two writes out of the prod hot path.\n if (import.meta.env?.DEV) {\n inst.lastDirtyMask = combinedDirty\n inst.lastEffects = allEffects\n }\n\n // Snapshot binding count before Phase 1 — bindings added during\n // Phase 1 already have correct initial values and skip Phase 2.\n const bindings = inst.allBindings\n const bindingsBeforePhase1 = bindings.length\n\n // Set current dirty mask BEFORE Phase 1 so memo() accessors used in\n // structural primitives (e.g. each.items) can use the bitmask fast path.\n setCurrentDirtyMask(combinedDirty)\n\n if (inst.def.__update) {\n // Compiler-generated fast path — replaces generic Phase 1 + Phase 2\n inst.def.__update(state, combinedDirty, bindings, inst.structuralBlocks, bindingsBeforePhase1)\n } else {\n // Generic Phase 1 + Phase 2 fallback (uncompiled components)\n genericUpdate(inst, state, combinedDirty, bindings, bindingsBeforePhase1)\n }\n\n // Dispatch effects after DOM updates\n for (let i = 0; i < allEffects.length; i++) {\n dispatchEffect(inst, allEffects[i]!)\n }\n}\n\nfunction genericUpdate<S, M, E>(\n inst: ComponentInstance<S, M, E>,\n state: S,\n combinedDirty: number,\n bindings: Binding[],\n bindingsBeforePhase1: number,\n): void {\n // Phase 1 — structural reconciliation. Structural primitives register\n // their blocks BEFORE running builders, so parents precede their nested\n // children in this array. That ordering matters: a parent's reconcile\n // may dispose the old arm, whose disposers splice nested child blocks\n // out of this shared array. Because children are always to the right\n // of their parent, the splice shifts entries left — which is safe for\n // a forward iterator that re-reads length each step.\n const blocks = inst.structuralBlocks\n for (let bi = 0; bi < blocks.length; bi++) {\n const block = blocks[bi]\n if (!block || (block.mask & combinedDirty) === 0) continue\n try {\n block.reconcile(state, combinedDirty)\n } catch (e) {\n reportReconcileError(inst, e)\n }\n }\n\n // Phase 2 — compact + update bindings\n _runPhase2(\n state,\n combinedDirty,\n bindings,\n bindingsBeforePhase1,\n inst.def.name,\n inst._onBindingError,\n )\n}\n\n/**\n * Run a handler for a single message: call update(), reconcile blocks\n * with the given method, run Phase 2. Used by compiler-generated __handlers\n * to avoid duplicating boilerplate per message type.\n *\n * @param method 0=reconcile, 1=reconcileItems, 2=reconcileClear, 3=reconcileRemove, -1=skip blocks\n * @public — used by compiler-generated `__handlers`\n */\nexport function _handleMsg(\n inst: ComponentInstance,\n msg: unknown,\n dirty: number,\n method: number,\n): [unknown, unknown[]] {\n const [s, e] = (inst.def.update as (s: unknown, m: unknown) => [unknown, unknown[]])(\n inst.state,\n msg,\n )\n inst.state = s\n inst._onCommit?.(s)\n\n // memo()-wrapped accessors (auto-generated by the compiler for\n // multi-field structural accessors like each.items / branch.on /\n // show.when) gate on `currentDirtyMask`. The generic pipeline sets\n // it before Phase 1; the single-message fast path must as well, or\n // memo short-circuits with the stale value left over from the\n // previous cycle and structural blocks reconcile against a frozen\n // input.\n setCurrentDirtyMask(dirty)\n\n if (method >= 0) {\n const bl = inst.structuralBlocks\n for (let i = 0; i < bl.length; i++) {\n const block = bl[i]\n if (!block || !(block.mask & dirty)) continue\n try {\n // Specialized methods (`reconcileItems`, `reconcileClear`,\n // `reconcileRemove`, `reconcileChanged`) only exist on `each`\n // blocks. Non-each blocks (`show`, `branch`, `scope`) leave\n // them undefined. The compiler-side fix in `detectArrayOp`\n // already restricts these methods to single-field cases, but\n // a show()/branch() block whose mask intersects the cleared\n // field would still be silently skipped without this fallback.\n // When the specialized method is missing, run the general\n // `reconcile` path so the block's `when`/`on` accessor still\n // re-evaluates. each blocks always have the specialized\n // methods, so they keep their fast path.\n switch (method) {\n case 0:\n block.reconcile(s, dirty)\n break\n case 1:\n if (block.reconcileItems) block.reconcileItems(s)\n else block.reconcile(s, dirty)\n break\n case 2:\n if (block.reconcileClear) block.reconcileClear()\n else block.reconcile(s, dirty)\n break\n case 3:\n if (block.reconcileRemove) block.reconcileRemove(s)\n else block.reconcile(s, dirty)\n break\n default:\n // method >= 10: reconcileChanged with stride = method - 10\n if (method >= 10) {\n if (block.reconcileChanged) block.reconcileChanged(s, method - 10)\n else block.reconcile(s, dirty)\n }\n break\n }\n } catch (err) {\n reportReconcileError(inst, err)\n // continue to next block — see reportReconcileError docstring\n }\n }\n }\n\n const b = inst.allBindings\n _runPhase2(s, dirty, b, b.length, inst.def.name, inst._onBindingError)\n return [s, e]\n}\n\n/**\n * Phase 2: compact dead bindings + update live bindings.\n * Shared between genericUpdate and compiler-generated __update.\n * @public — used by compiler-generated `__update` functions\n */\nexport function _runPhase2(\n state: unknown,\n dirty: number,\n bindings: Binding[],\n bindingsBeforePhase1: number,\n componentName?: string,\n // Optional `_onBindingError` hook. Type is duplicated here rather\n // than referenced as `ComponentInstance['_onBindingError']` because\n // the underlying field is `@internal` — stripped from the generated\n // `.d.ts` — and a public-export signature can't depend on a stripped\n // type without breaking dependent packages' typecheck.\n onBindingError?: (info: { kind: string; key?: string; message: string; stack?: string }) => void,\n): void {\n let phase2Len = bindingsBeforePhase1\n if (bindings.length > bindingsBeforePhase1 || (phase2Len > 0 && bindings[0]!.dead)) {\n let w = 0\n for (let r = 0; r < bindings.length; r++) {\n if (!bindings[r]!.dead) bindings[w++] = bindings[r]!\n }\n bindings.length = w\n phase2Len = Math.min(w, bindingsBeforePhase1)\n }\n\n if (dirty !== 0) {\n // Always catch+continue: a single accessor throw shouldn't abort\n // the rest of the bindings on the same commit. The user-visible\n // effect: a broken cell shows its previous value; sibling cells\n // stay current. In dev mode, the wrapped error (with component\n // name, kind, node descriptor, accessor source) is forwarded via\n // the `_onBindingError` hook (agent integration) or to\n // `console.error` (dev harness without an agent). The prior\n // behavior of rethrowing from `flush()` made one bad binding\n // visually break the entire view — the worst-case UX.\n const isDev = import.meta.env?.DEV && componentName\n // Single accessor label for the entire Phase 2 loop. The binding kind is\n // already part of the error message that handleBindingThrow surfaces; the\n // accessor label here serves the more specific purpose of catching\n // sample() calls reaching for a render context that isn't set during\n // the update phase. A `binding accessor` label is generic enough to apply\n // to text/attr/class/effect bindings without per-kind branching.\n enterAccessor('a binding accessor')\n try {\n for (let i = 0, len = phase2Len; i < len; i++) {\n const binding = bindings[i]!\n if (binding.dead || (binding.mask & dirty) === 0) continue\n if (binding.kind === 'effect') {\n try {\n binding.accessor(state)\n } catch (e) {\n handleBindingThrow(onBindingError, binding, e, isDev ? componentName : null)\n }\n continue\n }\n let newValue: unknown\n try {\n newValue = binding.accessor(state)\n } catch (e) {\n handleBindingThrow(onBindingError, binding, e, isDev ? componentName : null)\n continue\n }\n const last = binding.lastValue\n if (newValue === last || (newValue !== newValue && last !== last)) continue\n binding.lastValue = newValue\n try {\n applyBinding(binding, newValue)\n } catch (e) {\n handleBindingThrow(onBindingError, binding, e, isDev ? componentName : null)\n }\n }\n } finally {\n exitAccessor()\n }\n }\n}\n\nfunction handleBindingThrow(\n onBindingError: ComponentInstance['_onBindingError'] | undefined,\n binding: Binding,\n e: unknown,\n componentName: string | null,\n): void {\n // Dev mode: build the rich wrapped error (with accessor source,\n // node descriptor, undefined-hint detection). Prod skips the\n // bookkeeping. Either way the report flows through `_onBindingError`\n // when wired (agent setups), else falls back to console.error so\n // operators see the cause.\n const wrapped =\n componentName !== null && e instanceof Error\n ? enhanceBindingError(e, binding, componentName)\n : null\n const err = wrapped ?? (e instanceof Error ? e : new Error(String(e)))\n const stack = err.stack ? err.stack.split('\\n').slice(0, 8).join('\\n') : undefined\n const info =\n stack !== undefined\n ? { kind: String(binding.kind), key: binding.key, message: err.message, stack }\n : { kind: String(binding.kind), key: binding.key, message: err.message }\n\n if (onBindingError !== undefined) {\n try {\n onBindingError(info)\n } catch {\n // hook itself threw; fall through to console\n }\n } else if (typeof console !== 'undefined') {\n // Dev mode shows the wrapped (richer) message. Prod shows a brief\n // line — operators still see something but without the full source\n // hint that's only useful at development time.\n if (componentName !== null) {\n console.error(err)\n } else if (typeof console.warn === 'function') {\n console.warn(\n `[llui] binding accessor threw (kind=${info.kind}${info.key ? `, key=${info.key}` : ''}): ${info.message}`,\n )\n }\n }\n}\n\nfunction enhanceBindingError(err: unknown, binding: Binding, componentName: string): Error {\n // For text bindings, binding.node is the Text node — use its parent element.\n const node = binding.node\n const target = node.nodeType === 1 ? (node as Element) : (node.parentElement ?? null)\n let nodeDesc = '?'\n if (target) {\n const id = target.id ? `#${target.id}` : ''\n const cls =\n target.className && typeof target.className === 'string'\n ? `.${target.className.split(' ').filter(Boolean).slice(0, 2).join('.')}`\n : ''\n nodeDesc = `<${target.tagName.toLowerCase()}${id}${cls}>`\n if (node.nodeType === 3) nodeDesc += ' text-child'\n else if (node.nodeType === 8) nodeDesc += ' comment-child'\n }\n const keyPart = binding.key ? ` .${binding.key}` : ''\n const errMsg = err instanceof Error ? err.message : String(err)\n\n // Build accessor source hint if available\n let accessorHint = ''\n try {\n const src = binding.accessor.toString().slice(0, 80)\n accessorHint = `\\n accessor: ${src}${binding.accessor.toString().length > 80 ? '...' : ''}`\n } catch {\n // toString() may throw on revoked proxies, etc.\n }\n\n // Detect common undefined/null access pattern and add a helpful hint\n let undefinedHint = ''\n if (err instanceof TypeError && /Cannot read propert(ies|y).*of (undefined|null)/.test(errMsg)) {\n undefinedHint =\n '\\n hint: Check that your accessor handles undefined state fields (e.g., use optional chaining: s.user?.name)'\n }\n\n const wrapped = new Error(\n `[LLui] ${binding.kind}${keyPart} binding on ${nodeDesc} — accessor threw in <${componentName}>\\n` +\n ` ↳ ${errMsg}` +\n undefinedHint +\n accessorHint,\n err instanceof Error ? { cause: err } : undefined,\n )\n wrapped.stack = (err instanceof Error && err.stack) || wrapped.stack\n return wrapped\n}\n\nfunction dispatchEffect<S, M, E>(inst: ComponentInstance<S, M, E>, effect: E): void {\n const eff = effect as Record<string, unknown>\n\n // Addressed effects — dispatch to target component\n if (eff.__addressed === true && typeof eff.__targetKey !== 'undefined') {\n addressedDispatcher?.(eff as { __targetKey: string | number; __msg: unknown })\n return\n }\n\n // Built-in: delay\n if (eff.type === 'delay') {\n const ms = eff.ms as number\n const onDone = eff.onDone as M\n setTimeout(() => inst.send(onDone), ms)\n return\n }\n\n // Built-in: log\n if (eff.type === 'log') {\n console.log(eff.message)\n return\n }\n\n // Dev-only: record on the timeline / consult the mock registry.\n // Short-circuits real dispatch when a mock matches. Zero cost in\n // production — the guard on `_effectTimeline` is undefined unless\n // `installDevTools` populated the trackers.\n if (inst._effectTimeline !== undefined && dispatchEffectDev(inst, effect)) return\n\n // User onEffect handler\n if (inst.def.onEffect) {\n inst.def.onEffect({ effect, send: inst.send, signal: inst.signal })\n }\n}\n\n/**\n * Dev-only effect dispatch wrapper. Records the `dispatched` phase and,\n * when a mock matches, auto-delivers the mocked response through the\n * effect's own `onSuccess` callback on a microtask (same timing contract\n * as a real async resolve). Non-matched effects are tracked as pending\n * so `llui_pending_effects` / `llui_resolve_effect` can observe them.\n *\n * @returns `true` when a mock matched (caller should skip the real\n * dispatch) or `false` to proceed with the user-provided onEffect.\n */\nfunction dispatchEffectDev<S, M, E>(inst: ComponentInstance<S, M, E>, effect: E): boolean {\n const timeline = inst._effectTimeline\n if (timeline === undefined) return false\n\n const eff = effect as Record<string, unknown>\n const id = newEffectId()\n const type = typeof eff.type === 'string' ? eff.type : '<unknown>'\n const dispatchedAt = Date.now()\n\n const mock = inst._effectMocks?.match(effect)\n if (mock) {\n timeline.push({ effectId: id, type, phase: 'dispatched', timestamp: dispatchedAt })\n // Auto-deliver the mocked response via the effect's onSuccess callback (if any).\n // This mirrors what the real dispatch would do, so the component receives a Msg\n // from the mocked effect without any network/IO happening.\n const payload = effect as Record<string, unknown>\n if (typeof payload.onSuccess === 'function') {\n const msg = (payload.onSuccess as (d: unknown) => unknown)(mock.response)\n // Schedule delivery as a microtask so it runs after the current update\n // cycle completes (same timing contract as a real async effect resolve).\n Promise.resolve().then(() => inst.send(msg as never))\n }\n timeline.push({\n effectId: id,\n type,\n phase: 'resolved-mocked',\n timestamp: dispatchedAt,\n durationMs: 0,\n })\n return true\n }\n\n timeline.push({ effectId: id, type, phase: 'dispatched', timestamp: dispatchedAt })\n inst._pendingEffects?.push({ id, type, dispatchedAt, status: 'queued', payload: effect })\n return false\n}\n\nfunction newEffectId(): string {\n const cryptoObj = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\n if (cryptoObj?.randomUUID) return cryptoObj.randomUUID()\n return `eff-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`\n}\n"]}
1
+ {"version":3,"file":"update-loop.js","sourceRoot":"","sources":["../src/update-loop.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentDef, Lifetime, Binding } from './types.js'\nimport type { StructuralBlock } from './structural.js'\nimport type { RingBuffer, EachDiff } from './tracking/each-diff.js'\nimport type { DisposerEvent } from './tracking/disposer-log.js'\nimport type { CoverageTracker } from './tracking/coverage.js'\nimport { type DomEnv, browserEnv } from './dom-env.js'\n\n// Single lazily-constructed browser env shared by every client-side\n// component instance. Falls through to globalThis at call time — safe\n// to construct on a server process (the lookups never fire there).\nlet _fallbackEnv: DomEnv | null = null\nfunction fallbackBrowserEnv(): DomEnv {\n if (_fallbackEnv === null) _fallbackEnv = browserEnv()\n return _fallbackEnv\n}\nimport type {\n EffectTimelineEntry,\n PendingEffectsList,\n MockRegistry,\n} from './tracking/effect-timeline.js'\nimport { createLifetime } from './lifetime.js'\nimport { applyBinding } from './binding.js'\nimport { setCurrentDirtyMask } from './primitives/memo.js'\nimport { enterAccessor, exitAccessor } from './render-context.js'\n\nexport const FULL_MASK = 0xffffffff | 0\n\n/**\n * Path-keyed dirty mask computation. Walks the prefix table; each entry\n * whose `prefix(prev) !== prefix(next)` contributes its bit to the dirty\n * mask. Bit position = table position (single-word, ≤31 entries) — for\n * overflow (>31 entries), bits 31..61 land in the high half of a\n * `[number, number]` pair, matching `__dirty`'s overflow shape.\n *\n * The runtime is correct under structural-sharing reducers (immutable\n * splice): a sub-tree that wasn't touched stays reference-equal across\n * `prev`/`next`, so every accessor reading into that sub-tree skips.\n *\n * @internal\n */\nexport function computeDirtyFromPrefixes(\n prefixes: ReadonlyArray<(state: unknown) => unknown>,\n prev: unknown,\n next: unknown,\n): number | [number, number] {\n if (prefixes.length <= 31) {\n let dirty = 0\n for (let i = 0; i < prefixes.length; i++) {\n if (prefixes[i]!(prev) !== prefixes[i]!(next)) dirty |= 1 << i\n }\n return dirty\n }\n // Overflow: two words, 31 bits each (avoid sign bit for ergonomic\n // bitwise ops). Bit i % 31 of word ⌊i / 31⌋.\n let lo = 0\n let hi = 0\n const len = prefixes.length\n for (let i = 0; i < len && i < 31; i++) {\n if (prefixes[i]!(prev) !== prefixes[i]!(next)) lo |= 1 << i\n }\n for (let i = 31; i < len && i < 62; i++) {\n if (prefixes[i]!(prev) !== prefixes[i]!(next)) hi |= 1 << (i - 31)\n }\n // Anything past 62 forces FULL_MASK in the high word — the unified\n // model's compiler-emitted prefix counts shouldn't hit this in\n // realistic apps, but degrade gracefully if they do.\n if (len > 62) hi = FULL_MASK\n return [lo, hi]\n}\n\nexport interface ComponentInstance<S = unknown, M = unknown, E = unknown> {\n def: ComponentDef<S, M, E>\n state: S\n initialEffects: E[]\n rootLifetime: Lifetime\n dom: DomEnv\n allBindings: Binding[]\n structuralBlocks: StructuralBlock[]\n queue: M[]\n microtaskScheduled: boolean\n lastDirtyMask: number\n lastEffects: E[]\n send: (msg: M) => void\n signal: AbortSignal\n abortController: AbortController\n /** @internal dev-only — populated when `installDevTools` ran. Ring-buffered\n * per-each-site reconciliation diffs for MCP introspection tools. */\n _eachDiffLog?: RingBuffer<EachDiff>\n /** @internal dev-only — monotonically incremented by the devtools-intercepted\n * `update` before each history push. Read by `each.ts` to stamp diffs with\n * the `updateIndex` of the message that caused the reconciliation. */\n _updateCounter?: number\n /** @internal dev-only — populated when `installDevTools` ran. Ring-buffered\n * log of `disposeLifetime` firings (scope id + cause). Consumed by the\n * `llui_disposer_log` MCP tool to diagnose leaks on structural transitions. */\n _disposerLog?: RingBuffer<DisposerEvent>\n /** @internal dev-only — populated when `installDevTools` ran. Per-variant\n * Msg counter keyed by discriminant. Consumed by the `llui_coverage` MCP\n * tool to surface Msg variants that have never fired this session. */\n _coverage?: CoverageTracker\n /** @internal dev-only — populated when `installDevTools` ran. Ring-buffered\n * effect dispatch phase log (dispatched → resolved/cancelled) for USER\n * effects emitted from `update()`. Consumed by the `llui_effect_timeline`\n * MCP tool. Built-in plumbing effects (`delay`, `log`) are NOT recorded\n * here by design — they short-circuit in `dispatchEffect` before\n * `dispatchEffectDev` runs. They're runtime plumbing, not user intent,\n * and surface via other channels (message queue for `delay`, browser\n * console for `log`). */\n _effectTimeline?: RingBuffer<EffectTimelineEntry>\n /** @internal dev-only — populated when `installDevTools` ran. List of\n * currently-pending effects addressable by id, consumed by the\n * `llui_pending_effects` MCP tool. */\n _pendingEffects?: PendingEffectsList\n /** @internal dev-only — populated when `installDevTools` ran. Mock\n * registry consulted by the effect-dispatch wrapper to short-circuit\n * matching effects. Consumed by the `llui_mock_effect` MCP tool. */\n _effectMocks?: MockRegistry\n /**\n * @internal — set by mountApp/mountAtAnchor/hydrateApp/hydrateAtAnchor\n * to fire AppHandle.subscribe listeners after every update cycle.\n * Undefined until the first subscriber registers.\n */\n _onCommit?: (state: unknown) => void\n /**\n * @internal — optional hook invoked when a binding's accessor throws\n * during Phase 2. The runtime catches the throw, leaves the binding's\n * `lastValue` unchanged (so the rendered DOM stays at its previous\n * value rather than going blank), and notifies this hook. The agent\n * factory wires it to drain.errors so the LLM sees that some bindings\n * failed; non-agent hosts can leave it undefined for the default\n * console-warn behavior.\n *\n * Why catch + continue instead of letting the throw propagate?\n * One bad binding shouldn't abort the entire update loop — sibling\n * bindings on the same commit are independent and have no business\n * going stale because a different binding crashed. The user-visible\n * effect: when one cell's accessor throws (e.g. scoring fails on a\n * malformed criterion), every other cell still renders correctly;\n * only the broken binding shows its previous value.\n */\n _onBindingError?: (info: { kind: string; key?: string; message: string; stack?: string }) => void\n /**\n * @internal — live registry of currently-mounted Msg variants\n * dispatchable from rendered UI. Lazily allocated when the first\n * compiler-tagged event handler binds. Read by the agent layer (via\n * `AppHandle.getBindingDescriptors()`) to surface live affordances\n * to the LLM. See `binding-descriptors.ts` for the registration\n * protocol and `@llui/vite-plugin`'s tagger pass for the tag emission.\n */\n _bindingDescriptors?: import('./binding-descriptors.js').BindingDescriptorRegistry\n}\n\nexport function createComponentInstance<S, M, E, D = void>(\n def: ComponentDef<S, M, E, D>,\n data?: D,\n parentLifetime: Lifetime | null = null,\n dom?: DomEnv,\n): ComponentInstance<S, M, E> {\n // Hand-authored `__dirty` is no longer supported — the path-keyed\n // `__prefixes` emission supersedes it (62-prefix capacity, precise\n // per-prefix gating). Compiler-emitted `__dirty` was removed in\n // 2026-05 alongside this throw; any `__dirty` field at runtime must\n // be user code, and silently ignoring it would hide a stale pattern.\n // Migrate by deleting the `__dirty` field — the compiler emits\n // `__prefixes` automatically from accessor analysis, and uncompiled\n // components correctly fall back to FULL_MASK.\n if ((def as { __dirty?: unknown }).__dirty !== undefined) {\n throw new Error(\n `[llui] Component \"${def.name}\" defines \\`__dirty\\` directly. ` +\n `This field is no longer accepted — the compiler emits \\`__prefixes\\` ` +\n `(path-keyed reactivity) automatically. Remove \\`__dirty\\` from the ` +\n `ComponentDef; either the compiler will regenerate the correct ` +\n `prefix table, or uncompiled components will fall back to FULL_MASK. ` +\n `See docs/proposals/unified-composition-model.md.`,\n )\n }\n const [initialState, initialEffects] = def.init(data as D)\n\n const controller = new AbortController()\n\n const inst: ComponentInstance<S, M, E> = {\n // `def` carries an arbitrary `D` for typed init data, but after init\n // has run the runtime never touches `def.init` again — update/view/\n // onEffect and HMR replacement don't depend on D. Cast to the\n // D=void instance storage shape here.\n def: def as ComponentDef<S, M, E>,\n state: initialState,\n initialEffects,\n // Caller-supplied DOM env. `mountApp` defaults this to `browserEnv()`;\n // `renderToString` passes the user's jsdom/linkedom env. Never null —\n // every primitive reads from inst.dom.\n dom: dom ?? fallbackBrowserEnv(),\n // When `parentLifetime` is provided the instance's rootLifetime becomes a\n // child of that scope. This is how persistent layouts wire pages\n // into the layout's scope tree: the page's rootLifetime is parented at\n // the layout's pageSlot() point so `useContext` lookups flow layout\n // → page, and scope disposal cascades correctly. Mount paths that\n // don't pass parentLifetime get the classic detached root.\n rootLifetime: createLifetime(parentLifetime),\n allBindings: [],\n structuralBlocks: [],\n queue: [],\n microtaskScheduled: false,\n lastDirtyMask: 0,\n lastEffects: [],\n signal: controller.signal,\n abortController: controller,\n\n send(msg: M) {\n inst.queue.push(msg)\n if (!inst.microtaskScheduled) {\n inst.microtaskScheduled = true\n queueMicrotask(() => {\n inst.microtaskScheduled = false\n processMessages(inst)\n })\n }\n },\n }\n\n inst.rootLifetime._kind = 'root'\n\n return inst\n}\n\nexport function flushInstance<S, M, E>(inst: ComponentInstance<S, M, E>): void {\n if (inst.queue.length === 0) return\n inst.microtaskScheduled = false\n processMessages(inst)\n}\n\n/**\n * Dev-only: overwrite instance state and re-run both phases with FULL_MASK\n * so every binding re-evaluates. Bypasses update() — use for devtools\n * snapshot/restore, not in app code.\n */\nexport function _forceState<S, M, E>(inst: ComponentInstance<S, M, E>, newState: S): void {\n inst.state = newState\n inst.lastDirtyMask = FULL_MASK\n\n const bindings = inst.allBindings\n const bindingsBeforePhase1 = bindings.length\n\n setCurrentDirtyMask(FULL_MASK)\n\n const snapshot = inst.structuralBlocks.slice()\n for (const block of snapshot) {\n try {\n block.reconcile(newState, FULL_MASK, FULL_MASK)\n } catch (e) {\n reportReconcileError(inst, e)\n }\n }\n\n let phase2Len = bindingsBeforePhase1\n if (bindings.length > bindingsBeforePhase1 || (phase2Len > 0 && bindings[0]!.dead)) {\n let w = 0\n for (let r = 0; r < bindings.length; r++) {\n if (!bindings[r]!.dead) bindings[w++] = bindings[r]!\n }\n bindings.length = w\n phase2Len = Math.min(w, bindingsBeforePhase1)\n }\n\n const state = inst.state\n enterAccessor('a binding accessor')\n try {\n for (let i = 0, len = phase2Len; i < len; i++) {\n const binding = bindings[i]!\n if (binding.dead) continue\n if (binding.kind === 'effect') {\n try {\n binding.accessor(state)\n } catch (e) {\n reportBindingError(inst, binding, e)\n }\n continue\n }\n let newValue: unknown\n try {\n newValue = binding.accessor(state)\n } catch (e) {\n // Accessor threw — leave the binding's `lastValue` unchanged so\n // the rendered DOM stays at its previous value rather than going\n // blank. Sibling bindings on the same commit continue to\n // evaluate. The error surfaces via the optional hook (or\n // console.warn as a fallback) so it isn't silently swallowed.\n reportBindingError(inst, binding, e)\n continue\n }\n if (Object.is(newValue, binding.lastValue)) continue\n binding.lastValue = newValue\n try {\n applyBinding(binding, newValue)\n } catch (e) {\n // applyBinding writes the value to the DOM (textContent,\n // setAttribute, etc.). Throws here are usually environmental\n // (a node was removed mid-flight by a sibling binding). Same\n // contract: report and continue.\n reportBindingError(inst, binding, e)\n }\n }\n } finally {\n exitAccessor()\n }\n}\n\nfunction reportBindingError<S, M, E>(\n inst: ComponentInstance<S, M, E>,\n binding: Binding,\n e: unknown,\n): void {\n const err = e instanceof Error ? e : new Error(String(e))\n const stack = err.stack ? err.stack.split('\\n').slice(0, 8).join('\\n') : undefined\n const info =\n stack !== undefined\n ? {\n kind: String(binding.kind),\n key: binding.key,\n message: `${err.name}: ${err.message}`,\n stack,\n }\n : { kind: String(binding.kind), key: binding.key, message: `${err.name}: ${err.message}` }\n if (inst._onBindingError !== undefined) {\n try {\n inst._onBindingError(info)\n } catch {\n // The hook itself threw — nothing to do; we're in a recovery\n // path already. Fall through to the console fallback.\n }\n } else if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n console.warn(\n `[llui] binding accessor threw (kind=${info.kind}${info.key ? `, key=${info.key}` : ''}): ${info.message}`,\n )\n }\n}\n\n/**\n * Phase 1 (structural reconcile) parallel of `reportBindingError`. A\n * `block.reconcile` throw — most often a misuse like `sample()` inside an\n * `each().key` accessor — would otherwise escape the update loop, kill the\n * remaining structural blocks AND the entire Phase 2 binding pass on this\n * commit, and (in real apps) surface as an unhandled microtask rejection\n * the developer never sees. Routing it through the same `_onBindingError`\n * channel that Phase 2 uses gives parity: the error is named, surfaced\n * once, and the rest of the update continues.\n *\n * Note: a partial DOM mutation on the failing block is NOT rolled back.\n * The block's reconcile is responsible for keeping the DOM in a consistent\n * state on its own happy path; if it throws mid-mutation, the visible\n * result may be an inconsistent block, but sibling blocks and bindings\n * still update correctly.\n */\nfunction reportReconcileError<S, M, E>(inst: ComponentInstance<S, M, E>, e: unknown): void {\n const err = e instanceof Error ? e : new Error(String(e))\n const stack = err.stack ? err.stack.split('\\n').slice(0, 8).join('\\n') : undefined\n const info =\n stack !== undefined\n ? { kind: 'reconcile', message: `${err.name}: ${err.message}`, stack }\n : { kind: 'reconcile', message: `${err.name}: ${err.message}` }\n if (inst._onBindingError !== undefined) {\n try {\n inst._onBindingError(info)\n } catch {\n // hook itself threw; fall through to console\n }\n } else if (typeof console !== 'undefined' && typeof console.error === 'function') {\n // Reconcile errors are programmer errors (almost always: sample-in-\n // accessor or a thrown structural primitive). Surface as `error` not\n // `warn` so they're not lost in noisy dev consoles.\n console.error(`[llui] structural reconcile threw: ${info.message}`)\n }\n}\n\nfunction processMessages<S, M, E>(inst: ComponentInstance<S, M, E>): void {\n const queue = inst.queue\n\n // Single-message fast path: dispatch directly to per-message-type handler\n // if available. Skips dirty computation, Phase 1/2 entirely.\n if (queue.length === 1 && inst.def.__handlers) {\n const msg = queue[0]!\n const handler = inst.def.__handlers[(msg as Record<string, unknown>).type as string] as\n | ((inst: ComponentInstance, msg: unknown) => [S, E[]])\n | undefined\n if (handler) {\n queue.length = 0\n const [newState, effects] = handler(inst as ComponentInstance, msg)\n inst.state = newState\n inst._onCommit?.(newState as unknown)\n if (import.meta.env?.DEV) {\n inst.lastDirtyMask = FULL_MASK\n inst.lastEffects = effects\n }\n for (let i = 0; i < effects.length; i++) {\n dispatchEffect(inst, effects[i]!)\n }\n return\n }\n }\n\n // Generic pipeline — drain queue, accumulate dirty bits (two words:\n // bits 0..30 in `combinedDirty`, bits 31..61 in `combinedDirtyHi`).\n let state = inst.state\n let combinedDirty = 0\n let combinedDirtyHi = 0\n const allEffects: E[] = []\n\n const defUpdate = inst.def.update\n // Path-keyed reactivity: when the compiler emits `__prefixes`, dirty\n // bits correspond to entries in the prefix table (one bit per minimal\n // reference-stable prefix read across the component's accessors). The\n // runtime computes the dirty mask by reference-comparing `prefix(prev)\n // !== prefix(next)` for each table entry — precise per-prefix and\n // supports two-word emission for up to 62 prefixes. Components compiled\n // without `__llui/vite-plugin` (or with no reactive accessors) have no\n // `__prefixes` table; they fall back to `FULL_MASK` and pay the cost\n // of re-evaluating every binding every cycle. User-authored `__dirty`\n // is no longer accepted — see types.ts for the rationale.\n const prefixes = inst.def.__prefixes as ReadonlyArray<(s: unknown) => unknown> | undefined\n for (let qi = 0; qi < queue.length; qi++) {\n const msg = queue[qi]!\n const [newState, effects] = defUpdate(state, msg)\n let dirty: number | [number, number]\n if (prefixes !== undefined) {\n dirty = computeDirtyFromPrefixes(prefixes, state, newState)\n } else {\n dirty = FULL_MASK\n }\n if (typeof dirty === 'number') {\n combinedDirty |= dirty\n } else {\n combinedDirty |= dirty[0]\n combinedDirtyHi |= dirty[1]\n }\n state = newState\n // Avoid spread — allocates an iterator per call. For typical effect\n // arrays (0-2 elements) this is a minor saving; for bursts it matters.\n for (let ei = 0; ei < effects.length; ei++) allEffects.push(effects[ei]!)\n }\n queue.length = 0\n\n inst.state = state\n inst._onCommit?.(state as unknown)\n // Dev-only bookkeeping — tests read lastDirtyMask/lastEffects, prod\n // doesn't. Gating here keeps two writes out of the prod hot path.\n if (import.meta.env?.DEV) {\n inst.lastDirtyMask = combinedDirty\n inst.lastEffects = allEffects\n }\n\n // Snapshot binding count before Phase 1 — bindings added during\n // Phase 1 already have correct initial values and skip Phase 2.\n const bindings = inst.allBindings\n const bindingsBeforePhase1 = bindings.length\n\n // Set current dirty mask BEFORE Phase 1 so memo() accessors used in\n // structural primitives (e.g. each.items) can use the bitmask fast path.\n setCurrentDirtyMask(combinedDirty, combinedDirtyHi)\n\n if (inst.def.__update) {\n // Compiler-generated fast path — replaces generic Phase 1 + Phase 2.\n // `combinedDirtyHi` is passed as the trailing positional arg so\n // stale 5-param compiled bundles continue to gate correctly: they\n // ignore the extra arg, and for ≤31-prefix components `dirtyHi`\n // is always 0 anyway. Fresh compiled bundles use the 6th param\n // for precise two-word Phase 1 gating on 32..61-prefix components.\n inst.def.__update(\n state,\n combinedDirty,\n bindings,\n inst.structuralBlocks,\n bindingsBeforePhase1,\n combinedDirtyHi,\n )\n } else {\n // Generic Phase 1 + Phase 2 fallback (uncompiled components)\n genericUpdate(inst, state, combinedDirty, combinedDirtyHi, bindings, bindingsBeforePhase1)\n }\n\n // Dispatch effects after DOM updates\n for (let i = 0; i < allEffects.length; i++) {\n dispatchEffect(inst, allEffects[i]!)\n }\n}\n\nfunction genericUpdate<S, M, E>(\n inst: ComponentInstance<S, M, E>,\n state: S,\n combinedDirty: number,\n combinedDirtyHi: number,\n bindings: Binding[],\n bindingsBeforePhase1: number,\n): void {\n // Phase 1 — structural reconciliation. Structural primitives register\n // their blocks BEFORE running builders, so parents precede their nested\n // children in this array. That ordering matters: a parent's reconcile\n // may dispose the old arm, whose disposers splice nested child blocks\n // out of this shared array. Because children are always to the right\n // of their parent, the splice shifts entries left — which is safe for\n // a forward iterator that re-reads length each step.\n const blocks = inst.structuralBlocks\n for (let bi = 0; bi < blocks.length; bi++) {\n const block = blocks[bi]\n if (!block) continue\n // Two-word gate: skip when neither low nor high masks intersect.\n // `block.maskHi` is 0 for ≤31-prefix blocks, so `0 & dirtyHi === 0`\n // collapses the gate to the single-word check at runtime.\n if (!((block.mask & combinedDirty) | (block.maskHi & combinedDirtyHi))) continue\n try {\n block.reconcile(state, combinedDirty, combinedDirtyHi)\n } catch (e) {\n reportReconcileError(inst, e)\n }\n }\n\n // Phase 2 — compact + update bindings\n _runPhase2(\n state,\n combinedDirty,\n combinedDirtyHi,\n bindings,\n bindingsBeforePhase1,\n inst.def.name,\n inst._onBindingError,\n )\n}\n\n/**\n * Run a handler for a single message: call update(), reconcile blocks\n * with the given method, run Phase 2. Used by compiler-generated __handlers\n * to avoid duplicating boilerplate per message type.\n *\n * @param method 0=reconcile, 1=reconcileItems, 2=reconcileClear, 3=reconcileRemove, -1=skip blocks\n * @public — used by compiler-generated `__handlers`\n *\n * Backward-compat: pre-multi-word compiled bundles call this with 4\n * args (no `dirtyHi`). The default `dirtyHi = 0` keeps those calls\n * correct for ≤31-prefix components — the high gate always evaluates\n * to 0 so the runtime falls back to the single-word check. Components\n * with >31 prefixes need a fresh compile to start passing `dirtyHi`.\n */\nexport function _handleMsg(\n inst: ComponentInstance,\n msg: unknown,\n dirty: number,\n method: number,\n dirtyHi: number = 0,\n): [unknown, unknown[]] {\n const [s, e] = (inst.def.update as (s: unknown, m: unknown) => [unknown, unknown[]])(\n inst.state,\n msg,\n )\n inst.state = s\n inst._onCommit?.(s)\n\n // memo()-wrapped accessors (auto-generated by the compiler for\n // multi-field structural accessors like each.items / branch.on /\n // show.when) gate on `currentDirtyMask`. The generic pipeline sets\n // it before Phase 1; the single-message fast path must as well, or\n // memo short-circuits with the stale value left over from the\n // previous cycle and structural blocks reconcile against a frozen\n // input.\n setCurrentDirtyMask(dirty, dirtyHi)\n\n if (method >= 0) {\n const bl = inst.structuralBlocks\n for (let i = 0; i < bl.length; i++) {\n const block = bl[i]\n if (!block) continue\n if (!((block.mask & dirty) | (block.maskHi & dirtyHi))) continue\n try {\n // Specialized methods (`reconcileItems`, `reconcileClear`,\n // `reconcileRemove`, `reconcileChanged`) only exist on `each`\n // blocks. Non-each blocks (`show`, `branch`, `scope`) leave\n // them undefined. The compiler-side fix in `detectArrayOp`\n // already restricts these methods to single-field cases, but\n // a show()/branch() block whose mask intersects the cleared\n // field would still be silently skipped without this fallback.\n // When the specialized method is missing, run the general\n // `reconcile` path so the block's `when`/`on` accessor still\n // re-evaluates. each blocks always have the specialized\n // methods, so they keep their fast path.\n switch (method) {\n case 0:\n block.reconcile(s, dirty, dirtyHi)\n break\n case 1:\n if (block.reconcileItems) block.reconcileItems(s)\n else block.reconcile(s, dirty, dirtyHi)\n break\n case 2:\n if (block.reconcileClear) block.reconcileClear()\n else block.reconcile(s, dirty, dirtyHi)\n break\n case 3:\n if (block.reconcileRemove) block.reconcileRemove(s)\n else block.reconcile(s, dirty, dirtyHi)\n break\n default:\n // method >= 10: reconcileChanged with stride = method - 10\n if (method >= 10) {\n if (block.reconcileChanged) block.reconcileChanged(s, method - 10)\n else block.reconcile(s, dirty, dirtyHi)\n }\n break\n }\n } catch (err) {\n reportReconcileError(inst, err)\n // continue to next block — see reportReconcileError docstring\n }\n }\n }\n\n const b = inst.allBindings\n _runPhase2(s, dirty, dirtyHi, b, b.length, inst.def.name, inst._onBindingError)\n return [s, e]\n}\n\n/**\n * Phase 2: compact dead bindings + update live bindings.\n * Shared between genericUpdate and compiler-generated __update.\n * @public — used by compiler-generated `__update` functions\n *\n * `dirtyHi` defaults to 0 for backward-compat with pre-multi-word\n * compiled bundles that pass only the single-word `dirty`. Bindings\n * read paths 0..30 in `binding.mask` and paths 31..61 in\n * `binding.maskHi`; the gate ORs both AND results so the high word is\n * a no-op for ≤31-prefix components.\n */\nexport function _runPhase2(\n state: unknown,\n dirty: number,\n dirtyHi: number,\n bindings: Binding[],\n bindingsBeforePhase1: number,\n componentName?: string,\n // Optional `_onBindingError` hook. Type is duplicated here rather\n // than referenced as `ComponentInstance['_onBindingError']` because\n // the underlying field is `@internal` — stripped from the generated\n // `.d.ts` — and a public-export signature can't depend on a stripped\n // type without breaking dependent packages' typecheck.\n onBindingError?: (info: { kind: string; key?: string; message: string; stack?: string }) => void,\n): void {\n let phase2Len = bindingsBeforePhase1\n if (bindings.length > bindingsBeforePhase1 || (phase2Len > 0 && bindings[0]!.dead)) {\n let w = 0\n for (let r = 0; r < bindings.length; r++) {\n if (!bindings[r]!.dead) bindings[w++] = bindings[r]!\n }\n bindings.length = w\n phase2Len = Math.min(w, bindingsBeforePhase1)\n }\n\n if (dirty !== 0 || dirtyHi !== 0) {\n // Always catch+continue: a single accessor throw shouldn't abort\n // the rest of the bindings on the same commit. The user-visible\n // effect: a broken cell shows its previous value; sibling cells\n // stay current. In dev mode, the wrapped error (with component\n // name, kind, node descriptor, accessor source) is forwarded via\n // the `_onBindingError` hook (agent integration) or to\n // `console.error` (dev harness without an agent). The prior\n // behavior of rethrowing from `flush()` made one bad binding\n // visually break the entire view — the worst-case UX.\n const isDev = import.meta.env?.DEV && componentName\n // Single accessor label for the entire Phase 2 loop. The binding kind is\n // already part of the error message that handleBindingThrow surfaces; the\n // accessor label here serves the more specific purpose of catching\n // sample() calls reaching for a render context that isn't set during\n // the update phase. A `binding accessor` label is generic enough to apply\n // to text/attr/class/effect bindings without per-kind branching.\n enterAccessor('a binding accessor')\n try {\n for (let i = 0, len = phase2Len; i < len; i++) {\n const binding = bindings[i]!\n if (binding.dead) continue\n // Two-word gate. `maskHi` is 0 for ≤31-prefix bindings; the\n // `0 & dirtyHi === 0` branch collapses to a no-op under V8's\n // inline cache.\n if (!((binding.mask & dirty) | (binding.maskHi & dirtyHi))) continue\n if (binding.kind === 'effect') {\n try {\n binding.accessor(state)\n } catch (e) {\n handleBindingThrow(onBindingError, binding, e, isDev ? componentName : null)\n }\n continue\n }\n let newValue: unknown\n try {\n newValue = binding.accessor(state)\n } catch (e) {\n handleBindingThrow(onBindingError, binding, e, isDev ? componentName : null)\n continue\n }\n const last = binding.lastValue\n if (newValue === last || (newValue !== newValue && last !== last)) continue\n binding.lastValue = newValue\n try {\n applyBinding(binding, newValue)\n } catch (e) {\n handleBindingThrow(onBindingError, binding, e, isDev ? componentName : null)\n }\n }\n } finally {\n exitAccessor()\n }\n }\n}\n\nfunction handleBindingThrow(\n onBindingError: ComponentInstance['_onBindingError'] | undefined,\n binding: Binding,\n e: unknown,\n componentName: string | null,\n): void {\n // Dev mode: build the rich wrapped error (with accessor source,\n // node descriptor, undefined-hint detection). Prod skips the\n // bookkeeping. Either way the report flows through `_onBindingError`\n // when wired (agent setups), else falls back to console.error so\n // operators see the cause.\n const wrapped =\n componentName !== null && e instanceof Error\n ? enhanceBindingError(e, binding, componentName)\n : null\n const err = wrapped ?? (e instanceof Error ? e : new Error(String(e)))\n const stack = err.stack ? err.stack.split('\\n').slice(0, 8).join('\\n') : undefined\n const info =\n stack !== undefined\n ? { kind: String(binding.kind), key: binding.key, message: err.message, stack }\n : { kind: String(binding.kind), key: binding.key, message: err.message }\n\n if (onBindingError !== undefined) {\n try {\n onBindingError(info)\n } catch {\n // hook itself threw; fall through to console\n }\n } else if (typeof console !== 'undefined') {\n // Dev mode shows the wrapped (richer) message. Prod shows a brief\n // line — operators still see something but without the full source\n // hint that's only useful at development time.\n if (componentName !== null) {\n console.error(err)\n } else if (typeof console.warn === 'function') {\n console.warn(\n `[llui] binding accessor threw (kind=${info.kind}${info.key ? `, key=${info.key}` : ''}): ${info.message}`,\n )\n }\n }\n}\n\nfunction enhanceBindingError(err: unknown, binding: Binding, componentName: string): Error {\n // For text bindings, binding.node is the Text node — use its parent element.\n const node = binding.node\n const target = node.nodeType === 1 ? (node as Element) : (node.parentElement ?? null)\n let nodeDesc = '?'\n if (target) {\n const id = target.id ? `#${target.id}` : ''\n const cls =\n target.className && typeof target.className === 'string'\n ? `.${target.className.split(' ').filter(Boolean).slice(0, 2).join('.')}`\n : ''\n nodeDesc = `<${target.tagName.toLowerCase()}${id}${cls}>`\n if (node.nodeType === 3) nodeDesc += ' text-child'\n else if (node.nodeType === 8) nodeDesc += ' comment-child'\n }\n const keyPart = binding.key ? ` .${binding.key}` : ''\n const errMsg = err instanceof Error ? err.message : String(err)\n\n // Build accessor source hint if available\n let accessorHint = ''\n try {\n const src = binding.accessor.toString().slice(0, 80)\n accessorHint = `\\n accessor: ${src}${binding.accessor.toString().length > 80 ? '...' : ''}`\n } catch {\n // toString() may throw on revoked proxies, etc.\n }\n\n // Detect common undefined/null access pattern and add a helpful hint\n let undefinedHint = ''\n if (err instanceof TypeError && /Cannot read propert(ies|y).*of (undefined|null)/.test(errMsg)) {\n undefinedHint =\n '\\n hint: Check that your accessor handles undefined state fields (e.g., use optional chaining: s.user?.name)'\n }\n\n const wrapped = new Error(\n `[LLui] ${binding.kind}${keyPart} binding on ${nodeDesc} — accessor threw in <${componentName}>\\n` +\n ` ↳ ${errMsg}` +\n undefinedHint +\n accessorHint,\n err instanceof Error ? { cause: err } : undefined,\n )\n wrapped.stack = (err instanceof Error && err.stack) || wrapped.stack\n return wrapped\n}\n\nfunction dispatchEffect<S, M, E>(inst: ComponentInstance<S, M, E>, effect: E): void {\n const eff = effect as Record<string, unknown>\n\n // Built-in: delay\n if (eff.type === 'delay') {\n const ms = eff.ms as number\n const onDone = eff.onDone as M\n setTimeout(() => inst.send(onDone), ms)\n return\n }\n\n // Built-in: log\n if (eff.type === 'log') {\n console.log(eff.message)\n return\n }\n\n // Dev-only: record on the timeline / consult the mock registry.\n // Short-circuits real dispatch when a mock matches. Zero cost in\n // production — the guard on `_effectTimeline` is undefined unless\n // `installDevTools` populated the trackers.\n if (inst._effectTimeline !== undefined && dispatchEffectDev(inst, effect)) return\n\n // User onEffect handler\n if (inst.def.onEffect) {\n inst.def.onEffect({ effect, send: inst.send, signal: inst.signal })\n }\n}\n\n/**\n * Dev-only effect dispatch wrapper. Records the `dispatched` phase and,\n * when a mock matches, auto-delivers the mocked response through the\n * effect's own `onSuccess` callback on a microtask (same timing contract\n * as a real async resolve). Non-matched effects are tracked as pending\n * so `llui_pending_effects` / `llui_resolve_effect` can observe them.\n *\n * @returns `true` when a mock matched (caller should skip the real\n * dispatch) or `false` to proceed with the user-provided onEffect.\n */\nfunction dispatchEffectDev<S, M, E>(inst: ComponentInstance<S, M, E>, effect: E): boolean {\n const timeline = inst._effectTimeline\n if (timeline === undefined) return false\n\n const eff = effect as Record<string, unknown>\n const id = newEffectId()\n const type = typeof eff.type === 'string' ? eff.type : '<unknown>'\n const dispatchedAt = Date.now()\n\n const mock = inst._effectMocks?.match(effect)\n if (mock) {\n timeline.push({ effectId: id, type, phase: 'dispatched', timestamp: dispatchedAt })\n // Auto-deliver the mocked response via the effect's onSuccess callback (if any).\n // This mirrors what the real dispatch would do, so the component receives a Msg\n // from the mocked effect without any network/IO happening.\n const payload = effect as Record<string, unknown>\n if (typeof payload.onSuccess === 'function') {\n const msg = (payload.onSuccess as (d: unknown) => unknown)(mock.response)\n // Schedule delivery as a microtask so it runs after the current update\n // cycle completes (same timing contract as a real async effect resolve).\n Promise.resolve().then(() => inst.send(msg as never))\n }\n timeline.push({\n effectId: id,\n type,\n phase: 'resolved-mocked',\n timestamp: dispatchedAt,\n durationMs: 0,\n })\n return true\n }\n\n timeline.push({ effectId: id, type, phase: 'dispatched', timestamp: dispatchedAt })\n inst._pendingEffects?.push({ id, type, dispatchedAt, status: 'queued', payload: effect })\n return false\n}\n\nfunction newEffectId(): string {\n const cryptoObj = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto\n if (cryptoObj?.randomUUID) return cryptoObj.randomUUID()\n return `eff-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llui/dom",
3
- "version": "0.0.40",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -32,6 +32,10 @@
32
32
  "types": "./dist/hmr.d.ts",
33
33
  "import": "./dist/hmr.js"
34
34
  },
35
+ "./escape-hatch": {
36
+ "types": "./dist/escape-hatch.d.ts",
37
+ "import": "./dist/escape-hatch.js"
38
+ },
35
39
  "./internal": {
36
40
  "types": "./dist/internal.d.ts",
37
41
  "import": "./dist/internal.js"