@fundamental-engine/core 0.8.0 → 0.9.1

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 (53) hide show
  1. package/dist/agents/event-agent.d.ts +4 -2
  2. package/dist/agents/event-agent.d.ts.map +1 -1
  3. package/dist/agents/event-agent.js +15 -6
  4. package/dist/agents/event-agent.js.map +1 -1
  5. package/dist/core/currents.d.ts +12 -0
  6. package/dist/core/currents.d.ts.map +1 -1
  7. package/dist/core/currents.js +23 -0
  8. package/dist/core/currents.js.map +1 -1
  9. package/dist/core/events.d.ts +22 -0
  10. package/dist/core/events.d.ts.map +1 -1
  11. package/dist/core/events.js +52 -0
  12. package/dist/core/events.js.map +1 -1
  13. package/dist/core/field.d.ts.map +1 -1
  14. package/dist/core/field.js +537 -78
  15. package/dist/core/field.js.map +1 -1
  16. package/dist/core/frame-harness.d.ts +109 -0
  17. package/dist/core/frame-harness.d.ts.map +1 -0
  18. package/dist/core/frame-harness.js +300 -0
  19. package/dist/core/frame-harness.js.map +1 -0
  20. package/dist/core/host-headless.d.ts +35 -0
  21. package/dist/core/host-headless.d.ts.map +1 -0
  22. package/dist/core/host-headless.js +47 -0
  23. package/dist/core/host-headless.js.map +1 -0
  24. package/dist/core/integrator.d.ts +6 -0
  25. package/dist/core/integrator.d.ts.map +1 -1
  26. package/dist/core/integrator.js +62 -12
  27. package/dist/core/integrator.js.map +1 -1
  28. package/dist/core/streamlines.d.ts.map +1 -1
  29. package/dist/core/streamlines.js +18 -2
  30. package/dist/core/streamlines.js.map +1 -1
  31. package/dist/core/types.d.ts +88 -0
  32. package/dist/core/types.d.ts.map +1 -1
  33. package/dist/core/types.js +10 -1
  34. package/dist/core/types.js.map +1 -1
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/record/index.d.ts +13 -0
  40. package/dist/record/index.d.ts.map +1 -0
  41. package/dist/record/index.js +13 -0
  42. package/dist/record/index.js.map +1 -0
  43. package/dist/record/record.d.ts +87 -0
  44. package/dist/record/record.d.ts.map +1 -0
  45. package/dist/record/record.js +172 -0
  46. package/dist/record/record.js.map +1 -0
  47. package/dist/record/rng.d.ts +15 -0
  48. package/dist/record/rng.d.ts.map +1 -0
  49. package/dist/record/rng.js +25 -0
  50. package/dist/record/rng.js.map +1 -0
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +1 -1
  53. package/package.json +1 -1
@@ -36,8 +36,10 @@ export interface FieldEventName {
36
36
  /**
37
37
  * The named field-event catalog (system-contracts §9, shadow-dom §22, interaction §12). These are
38
38
  * the thresholded, debounced events the engine may dispatch — never per-frame by default.
39
- * `field:lit`/`dim` and the `*-body` lifecycle events are dispatched today; the rest are the agreed
40
- * names for agent/threshold events as they wire up.
39
+ * `field:lit`/`dim`, the `*-body` lifecycle events, capture/release/relocate, and (as of #686) the
40
+ * agent-threshold events below are all dispatched today. Each threshold event is hysteretic and
41
+ * debounced (see `updateThresholdEvents` in core/field.ts) and pairs a rising edge with a falling
42
+ * edge so a consumer can react both ways.
41
43
  */
42
44
  export declare const FIELD_EVENTS: Readonly<Record<string, FieldEventName>>;
43
45
  /** Map a metric to its conventional `field:*` event name for an edge. */
@@ -1 +1 @@
1
- {"version":3,"file":"event-agent.d.ts","sourceRoot":"","sources":["../../src/agents/event-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;gBAC1B,GAAG,EAAE,eAAe;IAIhC,2FAA2F;IAC3F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;IAenD,sDAAsD;IACtD,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,iDAAiD;IACjD,KAAK,IAAI,IAAI;CAId;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAsBjE,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAWnG"}
1
+ {"version":3,"file":"event-agent.d.ts","sourceRoot":"","sources":["../../src/agents/event-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;gBAC1B,GAAG,EAAE,eAAe;IAIhC,2FAA2F;IAC3F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;IAenD,sDAAsD;IACtD,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,iDAAiD;IACjD,KAAK,IAAI,IAAI;CAId;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA6BjE,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAWnG"}
@@ -41,11 +41,13 @@ export class Thresholder {
41
41
  /**
42
42
  * The named field-event catalog (system-contracts §9, shadow-dom §22, interaction §12). These are
43
43
  * the thresholded, debounced events the engine may dispatch — never per-frame by default.
44
- * `field:lit`/`dim` and the `*-body` lifecycle events are dispatched today; the rest are the agreed
45
- * names for agent/threshold events as they wire up.
44
+ * `field:lit`/`dim`, the `*-body` lifecycle events, capture/release/relocate, and (as of #686) the
45
+ * agent-threshold events below are all dispatched today. Each threshold event is hysteretic and
46
+ * debounced (see `updateThresholdEvents` in core/field.ts) and pairs a rising edge with a falling
47
+ * edge so a consumer can react both ways.
46
48
  */
47
49
  export const FIELD_EVENTS = {
48
- // --- dispatched today (shipped) ---
50
+ // --- lifecycle (shipped) ---
49
51
  registerBody: { field: 'field:register-body' },
50
52
  unregisterBody: { field: 'field:unregister-body' },
51
53
  updateBody: { field: 'field:update-body' },
@@ -57,15 +59,22 @@ export const FIELD_EVENTS = {
57
59
  released: { field: 'field:released' },
58
60
  // relocate (§22.3): a [data-warp] element teleports its transform to its paired throat.
59
61
  relocated: { field: 'field:relocated' },
60
- // --- names reserved; NOT yet dispatched by the engine (planned agent-threshold events).
61
- // See docs/canonical/agent-consumption-model.md (Events). ---
62
+ // --- agent-threshold events (#686): hysteretic + debounced, dispatched by updateThresholdEvents.
63
+ // Rising edge then a paired falling edge. See docs/canonical/agent-consumption-model.md. ---
62
64
  entered: { field: 'field:entered', metric: 'density' },
63
65
  exited: { field: 'field:exited', metric: 'density' },
66
+ // saturation is a discrete transition fired from the supernova callback; field:released is its
67
+ // paired down-edge (see core/field.ts), so there is no separate "unsaturated" event.
64
68
  saturated: { field: 'field:saturated', metric: 'accreted' },
65
69
  attentionShifted: { field: 'field:attention-shifted', metric: 'attention' },
66
- relationshipStrengthened: { field: 'field:relationship-strengthened', metric: 'strength' },
70
+ attentionSettled: { field: 'field:attention-settled', metric: 'attention' },
67
71
  memoryThreshold: { field: 'field:memory-threshold', metric: 'memory' },
72
+ memoryFaded: { field: 'field:memory-faded', metric: 'memory' },
68
73
  entropyWarning: { field: 'field:entropy-warning', metric: 'entropy' },
74
+ entropyCleared: { field: 'field:entropy-cleared', metric: 'entropy' },
75
+ // reserved (not yet dispatched): relationship-strength crossing — addEdge tracks strength but the
76
+ // designed dynamics rarely cross a fixed level cleanly; left reserved until a use case lands.
77
+ relationshipStrengthened: { field: 'field:relationship-strengthened', metric: 'strength' },
69
78
  };
70
79
  /** Map a metric to its conventional `field:*` event name for an edge. */
71
80
  export function eventNamesFor(metric, edge) {
@@ -1 +1 @@
1
- {"version":3,"file":"event-agent.js","sourceRoot":"","sources":["../../src/agents/event-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-agent.js","sourceRoot":"","sources":["../../src/agents/event-agent.ts"],"names":[],"mappings":"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"}
@@ -50,4 +50,16 @@ export interface WavePull {
50
50
  export declare function waveYat(w: Wave, x: number, time: number, H: number, waveSpeed?: number, amplitude?: number, pull?: WavePull): number;
51
51
  /** The wave's slope at `x` — the derivative the free particles drift along. */
52
52
  export declare function waveSlope(w: Wave, x: number, time: number, waveSpeed?: number, amplitude?: number): number;
53
+ /** The circular wave's undulating radius at angle `theta` (radians) and `time` seconds. */
54
+ export declare function waveRAt(w: Wave, theta: number, time: number, maxRadius: number, waveSpeed?: number, amplitude?: number): number;
55
+ /** Calculate shortest distance and coordinates from a particle (px, py) to a wave. */
56
+ export declare function waveDistance(w: Wave, px: number, py: number, time: number, W: number, H: number, style: 'linear' | 'circular', center: {
57
+ x: number;
58
+ y: number;
59
+ }, waveSpeed?: number, amplitude?: number, pull?: WavePull): {
60
+ dist: number;
61
+ rWave: number;
62
+ r: number;
63
+ theta: number;
64
+ };
53
65
  //# sourceMappingURL=currents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"currents.d.ts","sourceRoot":"","sources":["../../src/core/currents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,WAAW,IAAI;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAgB1D;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,GAAG,aAAa,EAAE,CAgBlG;AAED,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,4DAA4D;IAC5D,CAAC,EAAE,MAAM,CAAC;CACX;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CACrB,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,SAAS,SAAI,EACb,SAAS,SAAI,EACb,IAAI,CAAC,EAAE,QAAQ,GACd,MAAM,CAaR;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,SAAS,SAAI,GAAG,MAAM,CAIhG"}
1
+ {"version":3,"file":"currents.d.ts","sourceRoot":"","sources":["../../src/core/currents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,WAAW,IAAI;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAgB1D;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,GAAG,aAAa,EAAE,CAgBlG;AAED,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,4DAA4D;IAC5D,CAAC,EAAE,MAAM,CAAC;CACX;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CACrB,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,SAAS,SAAI,EACb,SAAS,SAAI,EACb,IAAI,CAAC,EAAE,QAAQ,GACd,MAAM,CAaR;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,SAAS,SAAI,GAAG,MAAM,CAIhG;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CACrB,CAAC,EAAE,IAAI,EACP,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,SAAI,EACb,SAAS,SAAI,GACZ,MAAM,CAKR;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAC1B,CAAC,EAAE,IAAI,EACP,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,QAAQ,GAAG,UAAU,EAC5B,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAChC,SAAS,SAAI,EACb,SAAS,SAAI,EACb,IAAI,CAAC,EAAE,QAAQ,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAa3D"}
@@ -62,4 +62,27 @@ export function waveYat(w, x, time, H, waveSpeed = 1, amplitude = 1, pull) {
62
62
  export function waveSlope(w, x, time, waveSpeed = 1, amplitude = 1) {
63
63
  return (Math.cos(x * w.freq + w.phase + time * w.speed * 1000 * waveSpeed) * w.amp * w.freq * amplitude);
64
64
  }
65
+ /** The circular wave's undulating radius at angle `theta` (radians) and `time` seconds. */
66
+ export function waveRAt(w, theta, time, maxRadius, waveSpeed = 1, amplitude = 1) {
67
+ const baseR = w.baseFrac * maxRadius + w.offsetY;
68
+ // Ensure an integer number of ripples so the circular path is closed (seamless)
69
+ const N = Math.max(1, Math.round(w.freq * 2500));
70
+ return baseR + Math.sin(N * theta + w.phase + time * w.speed * 1000 * waveSpeed) * w.amp * amplitude;
71
+ }
72
+ /** Calculate shortest distance and coordinates from a particle (px, py) to a wave. */
73
+ export function waveDistance(w, px, py, time, W, H, style, center, waveSpeed = 1, amplitude = 1, pull) {
74
+ if (style === 'circular') {
75
+ const dx = px - center.x;
76
+ const dy = py - center.y;
77
+ const r = Math.sqrt(dx * dx + dy * dy) || 1e-3;
78
+ const theta = Math.atan2(dy, dx);
79
+ const maxRadius = Math.min(W, H) * 0.48;
80
+ const rWave = waveRAt(w, theta, time, maxRadius, waveSpeed, amplitude);
81
+ return { dist: Math.abs(r - rWave), rWave, r, theta };
82
+ }
83
+ else {
84
+ const yWave = waveYat(w, px, time, H, waveSpeed, amplitude, pull);
85
+ return { dist: Math.abs(py - yWave), rWave: yWave, r: py, theta: 0 };
86
+ }
87
+ }
65
88
  //# sourceMappingURL=currents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"currents.js","sourceRoot":"","sources":["../../src/core/currents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"currents.js","sourceRoot":"","sources":["../../src/core/currents.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,28 @@ export interface FieldEventMap {
34
34
  };
35
35
  }
36
36
  export type FieldEventType = keyof FieldEventMap;
37
+ /**
38
+ * Per-frame coalescing buffer for the discrete event bus (#684, shadow-dom §31). A force/condition can
39
+ * cross the same edge more than once within a single frame (multiple detection passes, a same-frame
40
+ * fill+release); without batching the bus would deliver duplicates per tick. `record` buffers an
41
+ * occurrence keyed by (type, source identity); `flush` delivers at most ONE event per (source, type)
42
+ * for the frame — last write wins, so a consumer sees the final payload for that frame. State events
43
+ * (absorb/release) key on the single source body; relational events (enter/exit/met) key on the body
44
+ * *pair* so distinct counterparties in one frame stay distinct while a genuine duplicate collapses.
45
+ * Identity uses object reference (the body, falling back from its element), via a per-source numeric id.
46
+ */
47
+ export declare class FieldEventCoalescer {
48
+ private readonly pending;
49
+ private readonly ids;
50
+ private seq;
51
+ private idOf;
52
+ /** Coalescing key for an occurrence — "per (element, type)" for state events, per-pair for relational. */
53
+ keyOf<K extends FieldEventType>(type: K, payload: FieldEventMap[K]): string;
54
+ /** Buffer an occurrence for this frame. Repeated calls for the same (type, source) keep the last payload. */
55
+ record<K extends FieldEventType>(type: K, payload: FieldEventMap[K]): void;
56
+ /** Deliver the frame's coalesced occurrences — one per (source, type) — then clear the buffer. */
57
+ flush(deliver: <K extends FieldEventType>(type: K, payload: FieldEventMap[K]) => void): void;
58
+ }
37
59
  export interface EventBinding {
38
60
  trigger: string;
39
61
  event: string;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,mFAAmF;IACnF,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,oGAAoG;IACpG,KAAK,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IACnC,8DAA8D;IAC9D,IAAI,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IAClC,qGAAqG;IACrG,GAAG,EAAE;QAAE,CAAC,EAAE,IAAI,CAAC;QAAC,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;CAC3B;AACD,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAU/D;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAavE"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,mFAAmF;IACnF,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,oGAAoG;IACpG,KAAK,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IACnC,8DAA8D;IAC9D,IAAI,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IAClC,qGAAqG;IACrG,GAAG,EAAE;QAAE,CAAC,EAAE,IAAI,CAAC;QAAC,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;CAC3B;AACD,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyE;IACjG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IACrD,OAAO,CAAC,GAAG,CAAK;IAEhB,OAAO,CAAC,IAAI;IAMZ,0GAA0G;IAC1G,KAAK,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM;IAc3E,6GAA6G;IAC7G,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAM1E,kGAAkG;IAClG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;CAO7F;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAU/D;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAavE"}
@@ -4,6 +4,58 @@
4
4
  * Declared with `data-on="dense:field:lit, captured:field:dock"` (trigger:event,
5
5
  * comma-separated). Rising-edge debounced: fires once on cross, re-arms on reset.
6
6
  */
7
+ /**
8
+ * Per-frame coalescing buffer for the discrete event bus (#684, shadow-dom §31). A force/condition can
9
+ * cross the same edge more than once within a single frame (multiple detection passes, a same-frame
10
+ * fill+release); without batching the bus would deliver duplicates per tick. `record` buffers an
11
+ * occurrence keyed by (type, source identity); `flush` delivers at most ONE event per (source, type)
12
+ * for the frame — last write wins, so a consumer sees the final payload for that frame. State events
13
+ * (absorb/release) key on the single source body; relational events (enter/exit/met) key on the body
14
+ * *pair* so distinct counterparties in one frame stay distinct while a genuine duplicate collapses.
15
+ * Identity uses object reference (the body, falling back from its element), via a per-source numeric id.
16
+ */
17
+ export class FieldEventCoalescer {
18
+ pending = new Map();
19
+ ids = new WeakMap();
20
+ seq = 0;
21
+ idOf(o) {
22
+ let id = this.ids.get(o);
23
+ if (id === undefined)
24
+ this.ids.set(o, (id = ++this.seq));
25
+ return id;
26
+ }
27
+ /** Coalescing key for an occurrence — "per (element, type)" for state events, per-pair for relational. */
28
+ keyOf(type, payload) {
29
+ if (type === 'met') {
30
+ const p = payload;
31
+ const [x, y] = [this.idOf(p.a.el ?? p.a), this.idOf(p.b.el ?? p.b)].sort((m, n) => m - n);
32
+ return `${x}:${y}`; // unordered pair
33
+ }
34
+ if (type === 'enter' || type === 'exit') {
35
+ const p = payload;
36
+ return `${this.idOf(p.body.el ?? p.body)}:${this.idOf(p.other.el ?? p.other)}`; // directed
37
+ }
38
+ const p = payload;
39
+ return String(this.idOf(p.body.el ?? p.body)); // single source: per (element, type)
40
+ }
41
+ /** Buffer an occurrence for this frame. Repeated calls for the same (type, source) keep the last payload. */
42
+ record(type, payload) {
43
+ let perType = this.pending.get(type);
44
+ if (!perType)
45
+ this.pending.set(type, (perType = new Map()));
46
+ perType.set(this.keyOf(type, payload), payload); // last-wins within the frame
47
+ }
48
+ /** Deliver the frame's coalesced occurrences — one per (source, type) — then clear the buffer. */
49
+ flush(deliver) {
50
+ if (this.pending.size === 0)
51
+ return;
52
+ for (const [type, perKey] of this.pending) {
53
+ for (const payload of perKey.values())
54
+ deliver(type, payload);
55
+ }
56
+ this.pending.clear();
57
+ }
58
+ }
7
59
  /** Parse a `data-on` string into trigger→event bindings (event names may contain ':'). */
8
60
  export function parseEventBindings(spec) {
9
61
  return spec
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,0FAA0F;AAC1F,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AASD,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,CAAe;IAC5D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/core/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA4C,WAAW,EAAE,YAAY,EAAkD,MAAM,YAAY,CAAC;AA2DtJ,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CA2oE3F"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/core/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAwD,WAAW,EAAE,YAAY,EAAkD,MAAM,YAAY,CAAC;AA8DlK,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CAukF3F"}